Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
Last updated
Last updated
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Klasa java.net.URL
implementuje Serializable
, co oznacza, że ta klasa może być serializowana.
Ta klasa ma ciekawą zachowanie. Z dokumentacji: “Dwa hosty są uważane za równoważne, jeśli oba nazwy hostów mogą być rozwiązane na te same adresy IP”.
W związku z tym, za każdym razem, gdy obiekt URL wywołuje jakąkolwiek z funkcji equals
lub hashCode
, żądanie DNS w celu uzyskania adresu IP zostanie wysłane.
Wywołanie funkcji hashCode
z obiektu URL jest dość proste, wystarczy wstawić ten obiekt do HashMap
, która ma być deserializowana. Dzieje się tak, ponieważ na końcu funkcji readObject
z HashMap
ten kod jest wykonywany:
To wykona putVal
z każdą wartością wewnątrz HashMap
. Ale bardziej istotne jest wywołanie hash
z każdą wartością. Oto kod funkcji hash
:
Jak możesz zauważyć, podczas deserializacji HashMap
funkcja hash
będzie wykonywana dla każdego obiektu i podczas wykonania hash
wykona się .hashCode()
obiektu. Dlatego, jeśli deserializujesz HashMap
zawierającą obiekt URL, obiekt URL wykona .hashCode()
.
Teraz przyjrzyjmy się kodowi URLObject.hashCode()
:
Jak widać, gdy URLObject
wykonuje .hashCode()
, wywoływana jest hashCode(this)
. Kontynuując, możesz zobaczyć kod tej funkcji:
Możesz zobaczyć, że getHostAddress
jest wykonywane dla domeny, uruchamiając zapytanie DNS.
Dlatego ta klasa może być wykorzystana w celu uruchomienia zapytania DNS w celu zademonstrowania, że deserializacja jest możliwa, a nawet do ekstrakcji informacji (możesz dodać jako subdomenę wynik wykonania polecenia).
Możesz znaleźć kod ładunku URDNS od ysoserial tutaj. Jednak, aby ułatwić zrozumienie, jak to zakodować, stworzyłem własny PoC (oparty na tym z ysoserial):
W oryginalnym pomyśle ładunek commons collections został zmieniony, aby wykonać zapytanie DNS, było to mniej niezawodne niż zaproponowana metoda, ale oto post: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
Możesz pobrać GadgetProbe z Burp Suite App Store (Extender).
GadgetProbe spróbuje ustalić, czy niektóre klasy Java istnieją na klasie Java serwera, abyś mógł wiedzieć, czy jest vulnerable na jakieś znane exploity.
GadgetProbe użyje tego samego ładunku DNS z poprzedniej sekcji, ale przed uruchomieniem zapytania DNS spróbuje zdeserializować dowolną klasę. Jeśli dowolna klasa istnieje, zapytanie DNS zostanie wysłane, a GadgetProbe odnotuje, że ta klasa istnieje. Jeśli zapytanie DNS nigdy nie zostanie wysłane, oznacza to, że dowolna klasa nie została zdeserializowana pomyślnie, więc albo nie jest obecna, albo nie jest serializowalna/eksploatowalna.
W repozytorium github, GadgetProbe ma kilka list słów z klasami Java do przetestowania.
Ten skaner można pobrać z Burp App Store (Extender). Rozszerzenie ma pasywne i aktywne możliwości.
Domyślnie sprawdza pasywnie wszystkie żądania i odpowiedzi wysyłane w poszukiwaniu magicznych bajtów serializacji Java i przedstawi ostrzeżenie o podatności, jeśli coś zostanie znalezione:
Testowanie ręczne
Możesz wybrać żądanie, kliknąć prawym przyciskiem myszy i Wyślij żądanie do DS - Testowanie ręczne
.
Następnie, w zakładce Skaner deserializacji --> Zakładka testowania ręcznego możesz wybrać punkt wstawienia. I uruchomić test (Wybierz odpowiedni atak w zależności od używanego kodowania).
Nawet jeśli to nazywa się "Testowanie ręczne", jest dość zautomatyzowane. Automatycznie sprawdzi, czy deserializacja jest vulnerable na jakikolwiek ładunek ysoserial, sprawdzając biblioteki obecne na serwerze WWW i podświetli te, które są podatne. Aby sprawdzić podatne biblioteki, możesz wybrać uruchomienie Javas Sleeps, sleeps poprzez zużycie CPU, lub używając DNS, jak wcześniej wspomniano.
Eksploatacja
Gdy zidentyfikujesz podatną bibliotekę, możesz wysłać żądanie do zakładki Eksploatacja. W tej zakładce musisz wybrać punkt wstrzyknięcia ponownie, wpisać podatną bibliotekę, dla której chcesz stworzyć ładunek, oraz komendę. Następnie wystarczy nacisnąć odpowiedni przycisk Atak.
Spraw, aby twój ładunek wykonał coś takiego jak poniżej:
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)