jueves, 14 de diciembre de 2017

AutoIT, creando un señuelo para los malos


By @RaulRenales


Tras dos artículos previos presentando el lenguaje AutoIt y realizando algunos ejemplos para ver la panorámica del lenguaje llegamos a la tercera entrega en la que crearemos una pequeña aplicación que nos permite crear puertos y permanecer a la espera de si son utilizados, básicamente intentaremos vigilar algunos puertos comunes y permitir crear puertos a medida.



Disclaimer: Este post es meramente didáctico-divulgativo y se utilizará para impartir formación, cualquier mal uso que se de sobre su contenido estará bajo la responsabilidad de la persona que lo mal utilice.


La idea es crear un Gui que nos permita activar puertos, los típicos y otros a medida que podamos necesitar, permanecer a la escucha en estos puertos y guardar en un log los intentos de entrada en dichos puertos. Básicamente el aspecto seria este:





Comencemos con la tarea, lo primero de todo será incluir las librerías necesarias, que en este caso serán un par de ellas, una para crear el formulario gráfico y otra para el tema de la gestión de conexiones y sockets.


#include <GUIConstants.au3>
#include <inet.au3>


Para este ejemplo deberemos crear una serie de variables globales que serán utilizadas en distintos puntos del código, con lo que nos interesan que sean públicas.


;declaramos variables globales
Global $lis[100][100], $list[100], $ip, $sockaddr, $exit = False
$lis[0][1] = 0


Pues bien, viene el turno de generar el formulario del Gui que servirá para activar los puertos y recibir los intentos de acceso que también serán guardado en un archivo log como veremos al final del ejemplo.


;Creamos el formulario para activar los puertos que queremos

$Form1 = GUICreate("DTector - HoneySEC ", 652, 314, 225, 63)
$input1 = GUICtrlCreateInput("Has sido detectado por DTector, tu ip ya está en nuestra lista", 72, 16, 289, 21)

$Label1 = GUICtrlCreateLabel("Mensaje", 8, 16, 46, 17)
$Group1 = GUICtrlCreateGroup("Puertos a la escucha", 8, 56, 353, 105)
$ListView1 = GUICtrlCreateListView("NOMBRE|PUERTO|ESTADO", 16, 72, 329, 81)
GUICtrlCreateGroup("", -99, -99, 1, 1)

$Group2 = GUICtrlCreateGroup("PORTS", 368, 16, 273, 281)
$Checkbox1 = GUICtrlCreateCheckbox("FTP", 384, 48, 97, 17)
$Checkbox2 = GUICtrlCreateCheckbox("TELNET", 384, 80, 97, 17)
$Checkbox3 = GUICtrlCreateCheckbox("SSH", 384, 112, 97, 17)
$Checkbox4 = GUICtrlCreateCheckbox("HTTP", 384, 144, 97, 17)
$Input2 = GUICtrlCreateInput("", 480, 224, 153, 21)
$Label2 = GUICtrlCreateLabel("Otros puertos (139)", 384, 224, 87, 25)
$Button4 = GUICtrlCreateButton("Añadir Puerto", 480, 256, 81, 17, 0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("Arrancar Puertos", 8, 280, 97, 17, 0)
$Button2 = GUICtrlCreateButton("Parar", 112, 280, 89, 17, 0)
$Group3 = GUICtrlCreateGroup("Log", 8, 176, 353, 97)
$ListView2 = GUICtrlCreateListView("fecha  |ip             |nombre        |puerto", 16, 192, 329, 73)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)


Como aprendimos en el artículo anterior, se necesita hacer un bucle WHILE para esperar las pulsaciones o selecciones en el Gui y además debemos crear un SWITCH para contemplar todos los casos de pulsaciones y selecciones en los botones y menús del Gui.


While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Checkbox1
If GUICtrlRead($Checkbox1) = 1 Then
$lis[0][1] = 1
$lis[$lis[0][1]][1] = "ftp"
$lis[$lis[0][1]][0] = 21
$list[0] = $list[0] + 1
$list[1] = GUICtrlCreateListViewItem("ftp|21|stopped!!!", $ListView1)
Else
GUICtrlDelete($list[1])

EndIf

Case $Checkbox2
If GUICtrlRead($Checkbox2) = 1 Then
$lis[0][1] = 2
$lis[$lis[0][1]][1] = "telnet"
$lis[$lis[0][1]][0] = 23
$list[0] = $list[0] + 1
$list[2] = GUICtrlCreateListViewItem("telnet|23|stopped!!!", $ListView1)
Else
GUICtrlDelete($list[2])

EndIf
Case $Checkbox3
If GUICtrlRead($Checkbox3) = 1 Then
$lis[0][1] = 3
$lis[$lis[0][1]][1] = "ssh"
$lis[$lis[0][1]][0] = 22
$list[0] = $list[0] + 1
$list[3] = GUICtrlCreateListViewItem("ssh|22|stopped!!!", $ListView1)
Else
GUICtrlDelete($list[3])

EndIf
Case $Checkbox4
If GUICtrlRead($Checkbox4) = 1 Then
$lis[0][1] = 4
$lis[$lis[0][1]][1] = "http"
$lis[$lis[0][1]][0] = 80
$list[0] = $list[0] + 1
$list[4] = GUICtrlCreateListViewItem("http|80|stopped!!!", $ListView1)
Else
GUICtrlDelete($list[4])

EndIf



Case $Button4
$lis[0][1] = $lis[0][1] + 1
$lis[$lis[0][1]][1] = "user" & GUICtrlRead($Input2)
$lis[$lis[0][1]][0] = GUICtrlRead($Input2)
$list[0] = $list[0] + 1
$list[$list[0]] = GUICtrlCreateListViewItem("user" & GUICtrlRead($Input2) & "|" & GUICtrlRead($Input2) & "|stopped!!!", $ListView1)
Case $Button1
start()
EndSwitch
WEnd


Hasta aquí practicamente el trabajo orientado a la Gui y a que podamos recibir las pulsaciones de los botones, a partir de aquí crearemos 3 funciones que serán las que verdaderamente realicen la carga del trabajo.


Funcion START()


Su misión principal es arrancar el proceso de escucha de los puertos que hemos seleccionado en los menús de la Gui. Su trabajo también está en llenar las cajas tipo LIST que tenemos en la Gui indicando si están activos o no los servicios.


Func start()
TCPStartup()
For $i = 1 To $lis[0][1] + 1

$lis[$i][3] = TCPListen(@IPAddress1, $lis[$i][0])

If $lis[$i][3] < 0 Then
GUICtrlSetData($list[$i], "||cant start")
Else

GUICtrlSetData($list[$i], "||ok")
EndIf


Next
Do
For $i = 1 To $lis[0][1]
$acc = TCPAccept($lis[$i][3])
If $acc >= 0 Then
intruder($i, $acc)
EndIf



Next

$msg = GUIGetMsg()
if  $msg = $Button2 Then
$exit = True
EndIf


Until $exit = true
$exit = false
For $i = 1 To $lis[0][1] + 1

GUICtrlSetData($list[$i], "||stoped!!!")
Next

TCPShutdown()
EndFunc   ;==>start


Funcion INTRUDER()


La función intruder(num, acc) recibe dos parámetros, num para indicar el ítem de la lista que estamos trabajando y acc que le indica la ip y la acción que se ha producido.


Su primera parte se limita a recoger datos como la ip de visitante, el nombre, la hora de la visita y llena una variable $data con la traza del incidente que será guardada en el archivo de log y presentada debidamente en la pantalla de la Gui.


Func intruder($num, $acc)
TCPSend($acc, GUICtrlRead($input1))
$ip = SocketToIP($acc)
$name = _tcpiptoname($ip)
$data = @HOUR & ":" & @MIN & "|" & $ip & "|" & $name & "|" & $lis[$num][0] & " " & $lis[$num][1]
GUICtrlCreateListViewItem($data, $ListView2)
FileWriteLine("DTector" & @hour,$data)
SoundPlay("alarma.wav")
SoundSetWaveVolume(100)
TCPCloseSocket($acc)
EndFunc  

Función SocketToIp(Socket)


Esta función se utiliza para interactuar con el socket que gestiona los señuelos. Para ello realiza llamadas a las funciones contenidas en la DLL Ws2_32.dll, esta librería contiene la API de Windows Sockets utilizada por la mayoría de las aplicaciones de red e Internet para manejar las conexiones de red.


Func SocketToIP($SHOCKET)
   Local $sockaddr = DLLStructCreate("short;ushort;uint;char[8]")

Local $aRet = DLLCall("Ws2_32.dll","int","getpeername","int",$SHOCKET, _
           "ptr",DLLStructGetPtr($sockaddr),"int*",DLLStructGetSize($sockaddr))
   If Not @error And $aRet[0] = 0 Then
       $aRet = DLLCall("Ws2_32.dll","str","inet_ntoa","int",DLLStructGetData($sockaddr,3))
       If Not @error Then $aRet = $aRet[0]
   Else
       $aRet = 0
   EndIf

   $sockaddr = 0

   Return $aRet
EndFunc


Y con esto tenemos todo el código, que para verlo completo lo dejo aquí:


#include <GUIConstants.au3>
#include <inet.au3>

;declaramos variables globales
Global $lis[100][100], $list[100], $ip, $sockaddr, $exit = False
$lis[0][1] = 0


;Creamos el formulario para activar los puertos que queremos

$Form1 = GUICreate("DTector - HoneySEC ", 652, 314, 225, 63)
$input1 = GUICtrlCreateInput("Has sido detectado por DTector, tu ip ya esta en nuestra lista", 72, 16, 289, 21)
$Label1 = GUICtrlCreateLabel("Mensaje", 8, 16, 46, 17)
$Group1 = GUICtrlCreateGroup("Puertos a la escucha", 8, 56, 353, 105)
$ListView1 = GUICtrlCreateListView("NOMBRE|PUERTO|ESTADO", 16, 72, 329, 81)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2 = GUICtrlCreateGroup("PORTS", 368, 16, 273, 281)
$Checkbox1 = GUICtrlCreateCheckbox("FTP", 384, 48, 97, 17)
$Checkbox2 = GUICtrlCreateCheckbox("TELNET", 384, 80, 97, 17)
$Checkbox3 = GUICtrlCreateCheckbox("SSH", 384, 112, 97, 17)
$Checkbox4 = GUICtrlCreateCheckbox("HTTP", 384, 144, 97, 17)
$Input2 = GUICtrlCreateInput("", 480, 224, 153, 21)
$Label2 = GUICtrlCreateLabel("Otros puertos (139)", 384, 224, 87, 25)
$Button4 = GUICtrlCreateButton("Añadir Puerto", 480, 256, 81, 17, 0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Button1 = GUICtrlCreateButton("Arrancar Puertos", 8, 280, 97, 17, 0)
$Button2 = GUICtrlCreateButton("Parar", 112, 280, 89, 17, 0)
$Group3 = GUICtrlCreateGroup("Log", 8, 176, 353, 97)
$ListView2 = GUICtrlCreateListView("fecha  |ip             |nombre        |puerto", 16, 192, 329, 73)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Checkbox1
If GUICtrlRead($Checkbox1) = 1 Then
$lis[0][1] = 1
$lis[$lis[0][1]][1] = "ftp"
$lis[$lis[0][1]][0] = 21
$list[0] = $list[0] + 1
$list[1] = GUICtrlCreateListViewItem("ftp|21|stopped!!!", $ListView1)
Else
GUICtrlDelete($list[1])

EndIf

Case $Checkbox2
If GUICtrlRead($Checkbox2) = 1 Then
$lis[0][1] = 2
$lis[$lis[0][1]][1] = "telnet"
$lis[$lis[0][1]][0] = 23
$list[0] = $list[0] + 1
$list[2] = GUICtrlCreateListViewItem("telnet|23|stopped!!!", $ListView1)
Else
GUICtrlDelete($list[2])

EndIf
Case $Checkbox3
If GUICtrlRead($Checkbox3) = 1 Then
$lis[0][1] = 3
$lis[$lis[0][1]][1] = "ssh"
$lis[$lis[0][1]][0] = 22
$list[0] = $list[0] + 1
$list[3] = GUICtrlCreateListViewItem("ssh|22|stopped!!!", $ListView1)
Else
GUICtrlDelete($list[3])

EndIf
Case $Checkbox4
If GUICtrlRead($Checkbox4) = 1 Then
$lis[0][1] = 4
$lis[$lis[0][1]][1] = "http"
$lis[$lis[0][1]][0] = 80
$list[0] = $list[0] + 1
$list[4] = GUICtrlCreateListViewItem("http|80|stopped!!!", $ListView1)
Else
GUICtrlDelete($list[4])

EndIf



Case $Button4
$lis[0][1] = $lis[0][1] + 1
$lis[$lis[0][1]][1] = "user" & GUICtrlRead($Input2)
$lis[$lis[0][1]][0] = GUICtrlRead($Input2)
$list[0] = $list[0] + 1
$list[$list[0]] = GUICtrlCreateListViewItem("user" & GUICtrlRead($Input2) & "|" & GUICtrlRead($Input2) & "|stopped!!!", $ListView1)
Case $Button1
start()
EndSwitch
WEnd


Func start()
TCPStartup()
For $i = 1 To $lis[0][1] + 1

$lis[$i][3] = TCPListen(@IPAddress1, $lis[$i][0])

If $lis[$i][3] < 0 Then
GUICtrlSetData($list[$i], "||cant start")
Else

GUICtrlSetData($list[$i], "||ok")
EndIf


Next
Do
For $i = 1 To $lis[0][1]
$acc = TCPAccept($lis[$i][3])
If $acc >= 0 Then
intruder($i, $acc)
EndIf



Next

$msg = GUIGetMsg()
if  $msg = $Button2 Then
$exit = True
EndIf


Until $exit = true
$exit = false
For $i = 1 To $lis[0][1] + 1

GUICtrlSetData($list[$i], "||stoped!!!")
Next

TCPShutdown()
EndFunc   ;==>start

Func intruder($num, $acc)
TCPSend($acc, GUICtrlRead($input1))
$ip = SocketToIP($acc)
$name = _tcpiptoname($ip)
$data = @HOUR & ":" & @MIN & "|" & $ip & "|" & $name & "|" & $lis[$num][0] & " " & $lis[$num][1]
GUICtrlCreateListViewItem($data, $ListView2)
FileWriteLine("DTector" & @hour,$data)
SoundPlay("alarma.wav")
SoundSetWaveVolume(100)
TCPCloseSocket($acc)
EndFunc   ;==>intruder

Func SocketToIP($SHOCKET)
   Local $sockaddr = DLLStructCreate("short;ushort;uint;char[8]")

Local $aRet = DLLCall("Ws2_32.dll","int","getpeername","int",$SHOCKET, _
           "ptr",DLLStructGetPtr($sockaddr),"int*",DLLStructGetSize($sockaddr))
   If Not @error And $aRet[0] = 0 Then
       $aRet = DLLCall("Ws2_32.dll","str","inet_ntoa","int",DLLStructGetData($sockaddr,3))
       If Not @error Then $aRet = $aRet[0]
   Else
       $aRet = 0
   EndIf

   $sockaddr = 0

   Return $aRet
EndFunc


Con este ejemplo finalizamos esta trilogía sobre AutoIT, lenguaje del que prometo escribir algo más en el futuro dado que me ha dado muy buenas ideas para hacer y del que hasta hace dos semanas no sabia ni su existencia. La idea ha sido allanar el camino a los chicos/as de HoneySEC que estén interesados en este interesante lenguaje.


Nos vemos pronto. Gracias.


Referencias:

1 comentario:

  1. Me guardo la trilogía que has realizado en "Favoritos". Gran trabajo. Muchas gracias Raúl!!!

    ResponderEliminar