1.7 KiB
Problemas Comuns de Exploração
{{#include ../banners/hacktricks-training.md}}
FDs na Exploração Remota
Ao enviar um exploit para um servidor remoto que chama system('/bin/sh'), por exemplo, isso será executado no processo do servidor, e /bin/sh esperará entrada do stdin (FD: 0) e imprimirá a saída no stdout e stderr (FDs 1 e 2). Assim, o atacante não poderá interagir com o shell.
Uma maneira de corrigir isso é supor que, quando o servidor foi iniciado, ele criou o FD número 3 (para escuta) e que, em seguida, sua conexão estará no FD número 4. Portanto, é possível usar a syscall dup2 para duplicar o stdin (FD 0) e o stdout (FD 1) no FD 4 (o da conexão do atacante), tornando viável contatar o shell uma vez que ele seja executado.
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
Note que o socat já transfere stdin e stdout para o socket. No entanto, o modo pty inclui caracteres DELETE. Portanto, se você enviar um \x7f ( DELETE -) ele deletará o caractere anterior do seu exploit.
Para contornar isso, o caractere de escape \x16 deve ser precedido a qualquer \x7f enviado.
Aqui você pode encontrar um exemplo desse comportamento.
{{#include ../banners/hacktricks-training.md}}