Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
Zapytanie DNS o deserializację
Klasa java.net.URL
implementuje Serializable
, co oznacza, że ta klasa może być zserializowana.
Ta klasa ma dziwne zachowanie. Z dokumentacji: "Dwa hosty są uważane za równoważne, jeśli obie nazwy hostów mogą zostać przekonwertowane na te same adresy IP".
Wtedy, za każdym razem, gdy obiekt URL wywołuje którekolwiek z funkcji equals
lub hashCode
zostanie wysłane zapytanie DNS w celu uzyskania adresu IP.
Wywołanie funkcji hashCode
z obiektu URL jest dość proste, wystarczy wstawić ten obiekt do HashMap
, który zostanie zdeserializowany. Dzieje się tak, ponieważ na końcu funkcji readObject
z HashMap
ten kod jest wykonywany:
To wykona putVal
z każdą wartością w HashMap
. Jednak bardziej istotne jest wywołanie hash
z każdą wartością. Oto kod funkcji hash
:
Jak można zauważyć, podczas deserializacji HashMap
funkcja hash
zostanie wykonana z każdym obiektem i podczas wykonania hash
zostanie wykonane .hashCode()
obiektu. Dlatego jeśli zdeserializujesz HashMap
zawierający obiekt URL, obiekt URL wykona metodę .hashCode()
.
Teraz spójrzmy na kod URLObject.hashCode()
:
Jak widać, gdy obiekt URLObject
wykonuje .hashCode()
, jest wywoływane hashCode(this)
. W kontynuacji możesz zobaczyć kod tej funkcji:
Możesz zobaczyć, że wywoływana jest metoda getHostAddress
dla domeny, uruchamiając zapytanie DNS.
Dlatego ta klasa może być wykorzystana do uruchomienia zapytania DNS w celu demonstracji, że deserializacja jest możliwa, a nawet do wycieku informacji (możesz dołączyć wynik wykonania polecenia jako subdomenę).
Przykładowy kod ładunku URLDNS
Możesz znaleźć kod ładunku URLDNS z ysoserial tutaj. Jednakże, dla ułatwienia zrozumienia, jak to zrobić, stworzyłem własne PoC (oparte na tym z ysoserial):
Więcej informacji
W oryginalnym pomyśle ładunek biblioteki commons collections został zmieniony, aby wykonać zapytanie DNS, co było mniej niezawodne niż proponowana metoda, ale oto post: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
GadgetProbe
Możesz pobrać GadgetProbe ze sklepu aplikacji Burp Suite (Extender).
GadgetProbe spróbuje ustalić, czy niektóre klasy Java istnieją na klasie Java serwera, dzięki czemu możesz dowiedzieć się, czy jest podatny na znane exploity.
Jak to działa
GadgetProbe będzie używał tego samego ładunku DNS z poprzedniej sekcji, ale przed wykonaniem zapytania DNS spróbuje deserializować dowolną klasę. Jeśli dowolna klasa istnieje, zapytanie DNS zostanie wysłane, a GadgetProbe zanotuje, że ta klasa istnieje. Jeśli zapytanie DNS nie zostanie wysłane, oznacza to, że dowolna klasa nie została deserializowana pomyślnie, więc albo nie jest obecna, albo jest nie serializowalna/eksploatowalna.
W repozytorium na githubie, GadgetProbe ma listy słów z klasami Java do testowania.
Więcej informacji
Skaner deserializacji Java
Ten skaner można pobrać ze sklepu aplikacji Burp (Extender). Rozszerzenie ma zdolności pasywne i aktywne.
Pasywne
Domyślnie sprawdza pasywnie wszystkie wysyłane żądania i odpowiedzi w poszukiwaniu magicznych bajtów serializacji Java i wyświetli ostrzeżenie o podatności, jeśli jakiekolwiek zostaną znalezione:
Aktywne
Testowanie ręczne
Możesz wybrać żądanie, kliknąć prawym przyciskiem i Send request to DS - Manual Testing
.
Następnie, w zakładce Deserialization Scanner --> Zakładka testowania ręcznego możesz wybrać punkt wstrzyknięcia. I uruchomić testowanie (Wybierz odpowiedni atak w zależności od użytego kodowania).
Nawet jeśli to jest nazywane "Testowaniem ręcznym", jest dość zautomatyzowane. Automatycznie sprawdzi, czy deserializacja jest podatna na dowolny ładunek ysoserial, sprawdzając biblioteki obecne na serwerze internetowym i podświetli te podatne. Aby sprawdzić podatne biblioteki, możesz wybrać, aby uruchomić Javas Sleeps, sleeps poprzez zużycie CPU lub używając DNS, jak już wcześniej wspomniano.
Eksploatowanie
Po zidentyfikowaniu podatnej biblioteki możesz wysłać żądanie do zakładki Eksploatacja. W tej zakładce ponownie musisz wybrać punkt wstrzyknięcia, wpisać podatną bibliotekę, dla której chcesz utworzyć ładunek, i polecenie. Następnie wystarczy nacisnąć odpowiedni przycisk Atak.
Informacje o eksfiltracji DNS deserializacji Java
Spraw, aby twój ładunek wykonał coś w stylu:
Więcej informacji
Last updated