Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
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)
Żądanie DNS przy deserializacji
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).
Przykład kodu ładunku URLDNS
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):
Więcej informacji
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/
GadgetProbe
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.
Jak to działa
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.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F600722126-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FJtticLwENZ4i7WwgHiQe%252Fuploads%252Fgit-blob-75ac066e3db39effbb723a0bfc06cc9f3d85f198%252Fintruder4%2520%281%29%2520%281%29.gif%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=16ac8d50&sv=1)
Więcej informacji
Skaner deserializacji Java
Ten skaner można pobrać z Burp App Store (Extender). Rozszerzenie ma pasywne i aktywne możliwości.
Pasywne
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:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F600722126-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FJtticLwENZ4i7WwgHiQe%252Fuploads%252Fgit-blob-dd473120602f042a13ca176063ed9a5497fa5f1b%252Fimage%2520%28765%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=385a1dff&sv=1)
Aktywne
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).
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F600722126-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FJtticLwENZ4i7WwgHiQe%252Fuploads%252Fgit-blob-0b526479acce0fe251f09c7d7104c3bc73040171%252F3-1.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=b6881540&sv=1)
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.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F600722126-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FJtticLwENZ4i7WwgHiQe%252Fuploads%252Fgit-blob-1cb2ee1425024eff539602a8df04038d960a7f1c%252F4.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=897978f9&sv=1)
Informacje o deserializacji Java DNS Exfil
Spraw, aby twój ładunek wykonał coś takiego jak poniżej:
Więcej informacji
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)
Last updated