Ret2lib
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Istotą Ret2Libc jest przekierowanie przepływu wykonania podatnego programu do funkcji w bibliotece współdzielonej (np. system, execve, strcpy) zamiast wykonywania dostarczonego przez atakującego shellcode na stosie. Atakujący tworzy ładunek, który modyfikuje adres powrotu na stosie, aby wskazywał na pożądaną funkcję biblioteki, jednocześnie zapewniając, że wszelkie niezbędne argumenty są poprawnie ustawione zgodnie z konwencją wywołania.
Uzyskaj adres funkcji do wywołania (np. system) i polecenie do wywołania (np. /bin/sh)
Wygeneruj łańcuch ROP, aby przekazać pierwszy argument wskazujący na ciąg polecenia oraz przepływ wykonania do funkcji
Zakładając, że używana libc
to ta z bieżącej maszyny, możesz znaleźć, gdzie zostanie załadowana w pamięci za pomocą:
Jeśli chcesz sprawdzić, czy ASLR zmienia adres libc, możesz to zrobić:
Znając używaną libc, możliwe jest również znalezienie offsetu do funkcji system
za pomocą:
Znając używaną libc, możliwe jest również znalezienie przesunięcia do funkcji łańcucha /bin/sh
za pomocą:
Znając używaną libc, możliwe jest również użycie Peda lub GEF, aby uzyskać adres funkcji system, funkcji exit oraz ciągu /bin/sh
:
Jeśli proces tworzy dzieci za każdym razem, gdy z nim rozmawiasz (serwer sieciowy), spróbuj przeczytać ten plik (prawdopodobnie będziesz musiał być rootem).
Tutaj możesz znaleźć dokładnie, gdzie załadowana jest libc wewnątrz procesu i gdzie będzie załadowana dla każdego dziecka procesu.
W tym przypadku jest załadowana w 0xb75dc000 (To będzie adres bazowy libc)
Może się zdarzyć, że nie znasz libc, którą ładuje binarka (ponieważ może być zlokalizowana na serwerze, do którego nie masz dostępu). W takim przypadku możesz wykorzystać lukę, aby wyciekować niektóre adresy i znaleźć, która biblioteka libc jest używana:
Leaking libc address with ROPA szablon pwntools do tego znajdziesz w:
Leaking libc - templateSprawdź stronę https://libc.blukat.me/ i użyj kilku adresów funkcji wewnątrz libc, aby dowiedzieć się o używanej wersji.
Te ataki brute-force są przydatne tylko dla systemów 32-bitowych.
Jeśli exploit jest lokalny, możesz spróbować brute-force'ować adres bazowy libc (przydatne dla systemów 32-bitowych):
Jeśli atakujesz zdalny serwer, możesz spróbować brute-force'ować adres funkcji usleep
z libc
, przekazując jako argument 10 (na przykład). Jeśli w pewnym momencie serwer odpowiada o 10s dłużej, znalazłeś adres tej funkcji.
Wykonaj powłokę, skacząc do jednego konkretnego adresu w libc:
One GadgetW tym przykładzie brute-force ASLR jest zintegrowany w kodzie, a podatny binarny plik znajduje się na zdalnym serwerze:
Sprawdź przykład z:
ROP - Return Oriented ProgramingW przypadku ARM64 instrukcja ret skacze tam, gdzie wskazuje rejestr x30, a nie tam, gdzie wskazuje rejestr stosu. Więc jest to trochę bardziej skomplikowane.
Również w ARM64 instrukcja robi to, co robi instrukcja (nie można skakać w środku instrukcji i przekształcać ich w nowe).
Sprawdź przykład z:
Ret2lib + Printf leak - arm64To pozwala na wyciek informacji z procesu poprzez wywołanie printf
/puts
z pewnymi specyficznymi danymi umieszczonymi jako argument. Na przykład umieszczenie adresu puts
w GOT w wykonaniu puts
spowoduje wyciek adresu puts
w pamięci.
To zasadniczo oznacza nadużywanie Ret2lib, aby przekształcić go w podatność na formatowanie ciągów printf
poprzez użycie ret2lib
do wywołania printf z wartościami do wykorzystania (brzmi bezużytecznie, ale możliwe):
Ret2lib, pod warunkiem wycieku adresu funkcji w libc, używając jednego gadżetu
64 bity, ASLR włączone, ale bez PIE, pierwszym krokiem jest wypełnienie przepełnienia do bajtu 0x00 kanarka, aby następnie wywołać puts i wyciek. Z kanarkiem tworzony jest gadżet ROP do wywołania puts, aby wyciekł adres puts z GOT, a następnie gadżet ROP do wywołania system('/bin/sh')
64 bity, ASLR włączone, brak kanarka, przepełnienie stosu w main z funkcji podrzędnej. Gadżet ROP do wywołania puts, aby wyciekł adres puts z GOT, a następnie wywołanie jednego gadżetu.
64 bity, brak pie, brak kanarka, brak relro, nx. Używa funkcji write do wycieku adresu write (libc) i wywołuje jeden gadżet.
Używa ciągu formatu do wycieku kanarka ze stosu i przepełnienia bufora, aby wywołać system (jest w GOT) z adresem /bin/sh
.
32 bity, brak relro, brak kanarka, nx, pie. Nadużywa złego indeksowania, aby wyciekać adresy libc i heap ze stosu. Nadużywa przepełnienia bufora, aby wykonać ret2lib wywołując system('/bin/sh')
(adres heap jest potrzebny do ominięcia sprawdzenia).
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)