Ret2lib
Podstawowe informacje
Istotą Ret2Libc jest przekierowanie przepływu wykonania podatnego programu do funkcji w bibliotece współdzielonej (np. system, execve, strcpy) zamiast wykonywania kodu shellcode dostarczonego przez atakującego na stosie. Atakujący tworzy ładunek, który modyfikuje adres powrotu na stosie wskazujący na pożądaną funkcję biblioteczną, jednocześnie zapewniając, że wszelkie konieczne argumenty są poprawnie ustawione zgodnie z konwencją wywołania.
Przykładowe kroki (uproszczone)
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 łańcuch polecenia i przepływ wykonania do funkcji
Znajdowanie adresów
Przyjmując, że używana jest biblioteka
libc
z bieżącej maszyny, można 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ą bibliotekę libc, można również znaleźć przesunięcie do funkcji
system
za pomocą:
Znając używaną bibliotekę libc, można również znaleźć przesunięcie do funkcji łańcucha
/bin/sh
za pomocą:
Korzystając z gdb-peda / GEF
Znając używaną bibliotekę libc, można również użyć Peda lub GEF, aby uzyskać adres funkcji system, funkcji exit oraz ciągu znaków /bin/sh
:
Korzystanie z /proc/<PID>/maps
Jeśli proces tworzy dzieci za każdym razem, gdy z nim rozmawiasz (serwer sieciowy), spróbuj odczytać ten plik (prawdopodobnie będziesz musiał być rootem).
Tutaj możesz znaleźć dokładnie, gdzie jest załadowany libc wewnątrz procesu i gdzie będzie załadowany dla każdego dziecka procesu.
W tym przypadku jest załadowany pod adresem 0xb75dc000 (Będzie to adres bazowy libc)
Nieznany libc
Może być możliwe, że nie znasz libc, które jest ładowane przez binarny plik (ponieważ może znajdować się na serwerze, do którego nie masz dostępu). W takim przypadku możesz wykorzystać podatność do wycieku pewnych adresów i znalezienia, który libc jest używany:
Leaking libc address with ROPA szablon pwntools do tego znajdziesz tutaj:
Leaking libc - templateZnany libc z 2 przesunięciami
Sprawdź stronę https://libc.blukat.me/ i użyj kilku adresów funkcji wewnątrz libc, aby dowiedzieć się, która wersja jest używana.
Omijanie ASLR w systemach 32-bitowych
Te ataki brute-force są przydatne tylko dla systemów 32-bitowych.
Jeśli exploit jest lokalny, możesz spróbować przeprowadzić atak brute-force na adres bazowy libc (przydatne dla systemów 32-bitowych):
Jeśli atakujesz zdalny serwer, możesz spróbować przeprowadzić atak siłowy na adres funkcji
usleep
z bibliotekilibc
, przekazując jako argument 10 (na przykład). Jeśli w pewnym momencie serwer zajmuje dodatkowe 10 sekund na odpowiedź, oznacza to, że znalazłeś adres tej funkcji.
One Gadget
Wykonaj powłokę, skacząc tylko do jednego konkretnego adresu w bibliotece libc
:
Przykład kodu x86 Ret2lib
W tym przykładzie atak siłowy ASLR jest zintegrowany w kodzie, a podatny plik binarny znajduje się na zdalnym serwerze:
Przykład kodu x64 Ret2lib
Sprawdź przykład z:
ROP - Return Oriented ProgramingPrzykład ARM64 Ret2lib
W przypadku ARM64 instrukcja ret skacze tam, gdzie wskazuje rejestr x30, a nie tam, gdzie wskazuje rejestr stosu. Jest to nieco bardziej skomplikowane.
Ponadto w ARM64 instrukcja wykonuje to, co ma wykonać (niemożliwe jest skakanie w środek instrukcji i przekształcanie ich w nowe).
Sprawdź przykład z:
Ret2lib + Printf leak - arm64Ret-into-printf (lub puts)
To pozwala na wyciek informacji z procesu poprzez wywołanie printf
/puts
z określonymi danymi umieszczonymi jako argument. Na przykład umieszczenie adresu puts
w GOT podczas wywołania puts
spowoduje wyciek adresu puts
w pamięci.
Ret2printf
Oznacza to w zasadzie nadużycie Ret2lib w celu przekształcenia go w podatność na łańcuchy formatujące printf
poprzez użycie ret2lib
do wywołania printf z wartościami do jej wykorzystania (brzmi bezużytecznie, ale jest to możliwe):
Inne przykłady i odnośniki
Ret2lib, mając wyciek do adresu funkcji w libc, używając jednego gadżetu
64 bity, włączony ASLR, ale brak PIE, pierwszym krokiem jest zapełnienie przepełnienia aż do bajtu 0x00 canary, a następnie wywołanie puts i wyciek. Z canary tworzony jest gadżet ROP do wywołania puts w celu wycieku adresu puts z GOT, a następnie gadżet ROP do wywołania
system('/bin/sh')
64 bity, włączony ASLR, brak canary, przepełnienie stosu w funkcji głównej z funkcji potomnej. Gadżet ROP do wywołania puts w celu wycieku adresu puts z GOT, a następnie wywołanie jednego gadżetu.
64 bity, brak PIE, brak canary, brak relro, nx. Używa funkcji write do wycieku adresu write (libc) i wywołuje jeden gadżet.
Używa łańcucha formatującego do wycieku canary ze stosu i przepełnienia buforu do wywołania systemu (jest w GOT) z adresem
/bin/sh
.32 bity, brak relro, brak canary, nx, pie. Nadużywa złego indeksowania do wycieku adresów libc i sterty ze stosu. Nadużywa przepełnienie buforu do wykonania ret2lib wywołującego
system('/bin/sh')
(adres sterty jest potrzebny do ominięcia sprawdzenia).
Last updated