lunes, 11 de diciembre de 2017

AutoIT, segundo asalto


By @RaulRenales


En artículos anteriores presentamos que es AutoIT y creamos nuestro primer ejemplo para ver como funciona este lenguaje de script que está orientado a administradores de sistemas y que es uno de los lenguajes utilizados en la creación de Malware.


En esta segunda entrega vamos a dar una vuelta por la panorámica del lenguaje realizando algunos ejemplos, el objetivo es coger algo de soltura de cara al tercer artículo en el que realizaremos un script que levante puertos y gestione eventos sobre ellos a modo de HoneyPot.



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.


De la primera entrega aprendimos el uso de los siguientes comandos:


  • Run: usado para lanzar una instancia de algún programa en el equipo.
  • WinWaitActive: para seleccionar la ventana abierta que queremos influenciar con nuestro script.
  • Send: envía pulsaciones de teclado a la ventana que hemos seleccionado.
  • WinClose: usado para cerrar las ventanas.


Primero de todo comentar que el lenguaje AutoIT está muy relacionado con los lenguajes de desarrollo de Microsoft, con lo que si el lector está familiarizado con Visual Studio le será fácil entender los códigos o incorporar mejoras sobre ellos.


Como es complicado que en un solo post veamos la totalidad del lenguaje, dejo aquí algunos enlaces que el lector debería de revisar y realizar sus ejemplos para un rápido aprendizaje.


Para obtener la documentación oficial:


Manual completo v3:


Listado de ejemplos comentados:


Sin más voy a generar algunos ejemplos para ir jugando con el lenguaje y ver lo fácil que puede ser trabajar con él.


Ejemplo 1: Creando un interfaz de usuario GUI


Básicamente con este ejemplo vamos a aprender a crear nuestros propios formularios. El código completo del ejemplo es este:


#include <MsgBoxConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>


;Aqui va un comentario

#Region ### Inicio del Formulario ### Form=
$Form1 = GUICreate("Creando mi primer Form con Autoit - HoneySEC", 435, 338, 192, 132)
$Button1 = GUICtrlCreateButton("Pulsa para ver el mensaje 1", 56, 16, 321, 41)
$Label1 = GUICtrlCreateLabel("Soy una etiqueta", 32, 88, 373, 36)
$Button2 = GUICtrlCreateButton("Pulsa para ver el mensaje 2", 56, 152, 321, 41)

GUISetState(@SW_SHOW)
#EndRegion ### Final del Formulario ###

While 1
$msg = GuiGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop

;pulsar el boton 1
Case $msg=$Button1
MsgBox(4096, "Mensaje 1", "Has pulsado el botón 1", 3)

;pulsar el boton 2
Case $msg=$Button2
MsgBox(4096, "Mensaje 2", "Has pulsado el botón 2", 3)

EndSelect
Wend
Exit
Gráficamente:




Explicación del código:


Lo primero que vemos de este código es la inclusión de varios archivos que nos permitirán utilizar comandos de diseño de formulario, concretamente son:


#include <MsgBoxConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>


Lo más importante en la creación de un formulario es la parte de definición del mismo, para ello creamos una serie de controles y los igualamos a una variable, veamos uno de ellos:


$Form1 = GUICreate("Creando mi primer Form con Autoit - HoneySEC", 435, 338, 192, 132)


Se crea el formulario con GUICreate y se le pasa el titulo de la ventana, su posición y su tamaño. Esto quedaría algo así:


GUICreate("Título", Ancho, Alto, Posición X, Posición Y)


Una vez creado el formulario iremos añadiendo controles con el comando GUICtrlCreateXXX, que dependiendo del control acabara de una manera u otra, aquí algunos ejemplos:


$Button1 = GUICtrlCreateButton("Pulsa para ver el mensaje 1", 56, 16, 321, 41)
$Label1 = GUICtrlCreateLabel("Soy una etiqueta", 32, 88, 373, 36)


Los parámetros de GUICtrlCreateXXX son exactamente los explicados para el Form, osea, Texto a mostrar en el control, Ancho, Alto, Posición X y Posición Y, estas últimas en referencia a la ventana del formulario, donde la esquina superior izquierda es el punto 0,0.


Una vez puestos todos los controles en su sitio debemos lanzar la ventana del formulario utilizando la siguiente orden:


GUISetState(@SW_SHOW)


Si pulsamos en estos momentos el GO del menú de Tools, lo que ocurriría es que se lanzara el formulario rápidamente y desaparece, básicamente el problema esta en que no le hemos dicho que espere a que pulsemos los botones.


Para ello vamos a construir el siguiente bucle While, que básicamente lo que hace es esperar a que se pulsen los botones, lo almacena en la variable $msg y según el botón pulsado lanzara una ventana MSGBOX u otra. Se ha realizado un SELECT CASE para verificar todos los posibles casos de botones en el formulario:


While 1
$msg = GuiGetMsg()
Select Case $msg = $GUI_EVENT_CLOSE
ExitLoop

;pulsar el boton 1
Case $msg=$Button1
MsgBox(4096, "Mensaje 1", "Has pulsado el boton 1", 3)

;pulsar el boton 2
Case $msg=$Button2
MsgBox(4096, "Mensaje 2", "Has pulsado el boton 2", 3)

EndSelect
Wend
Exit



Ejemplo 2: Descarga de un archivo de Internet y colocarlo en una carpeta local


En este ejemplo veremos como descargar un archivo desde Internet y colocarlo en una carpeta en nuestro sistema. El código completo sería este:



#include <InetConstants.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIFiles.au3>

; Descargaremos un archivo.
; Esperaremos a que la descarga se complete y enviaremos un mensaje MSGBox.

Descargar()

Func Descargar()
   ; Descargamos el archivo a la siguiente carpeta
   Local $sFilePath = _WinAPI_GetTempFileName('C:\Users\MrRobot\Desktop\AutoIT')

   ; Descargamos el archivo
   Local $iBytesSize = InetGet("http://repository.root-me.org/Programmation/AutoIt/EN%20-%20Learning%20to%20script%20with%20AutoIt.pdf", "C:\Users\MrRobot\Desktop\AutoIT\aaa.pdf", $INET_LOCALCACHE)

   ; Enviamos el mensaje con la descarga completa
 MsgBox($MB_SYSTEMMODAL, "Descarga Completa", "Total descargado: " & $iBytesSize )

   ; Para borrar un archivo podemos usar este comando
   ;FileDelete($sFilePath)

EndFunc


Explicacion del codigo:


Incluimos las librerías necesarias y en este caso vamos a crear una función llamada Descargar(), para generar funciones en AutoIt se utiliza  Func ... EndFunc, para invocar a una función tan solo tenemos que llamarla escribiendo su nombre en una de las lineas del código.


El secreto de este script es el uso de la función InetGet que permite la Descarga un archivo de Internet utilizando el protocolo HTTP, HTTPS o FTP. Podéis ver su ficha completa en este enlace:


Básicamente lanzamos el InetGet diciéndole la ruta de lo que queremos descargar, el sitio donde lo dejaremos con nombre de archivo final incluido y el modo de descarga y en poco tiempo tendremos el archivo en nuestro equipo. En el ejemplo se le iguala a la variable $iBytesSize dado que la función retorna el número de Bytes descargados.


Ejemplo 3: Realizar capturas de pantalla y subirlas a un FTP


En este ejemplo vamos a realizar algo muy sencillo, queremos realizar 8 capturas de pantalla del escritorio y según las hagamos enviarlas a un FTP.


Nota: he puesto 8 capturas por poner un límite, se podrían estar enviando una cada minuto o la cadencia que el programador quiera.


#include <FTPEx.au3>
#include <ScreenCapture.au3>


$ftpServer = "ftp.servidor.es"
$Usu = "usuario"
$pase = "contra"
$carpetaLocal = "C:\Users\MrRobot\Desktop\AutoIT\Capturas"

; Realiza 8 capturas y las mandamos a un FTP.

For $n = 1 to 8

;Se calcula la fecha para usarla en el nombre de las capturas y tenerlas organizadas
$fecha =  @MDAY & "-" & @MON & "-" & @HOUR & "-" & @MIN & "-" & @SEC

   ; Captura la pantalla completa
   $mi_captura = _ScreenCapture_Capture("")

   ; Guarda la imagen capturada en la carpeta de Mis documentos, el nombre será la fecha-hora de hoy.
   _ScreenCapture_SaveImage($carpetaLocal  & "\" & $fecha & "_Captura.jpg", $mi_captura)


; Envio por FTP de los archivos

; Conecta.
$mi_ftp = _FTP_Open("abrir")
$archivo_local = $carpetaLocal & "\" & $fecha & ".jpg"
$archivo_remoto =  "mis_imagenes/" & $fecha & ".jpg"
$conectar = _FTP_Connect($mi_ftp, $ftpServer, $Usu, $pase)

; Envía.
_FTP_FilePut($conectar, $archivo_local, $archivo_remoto)

_FTP_Close($conectar)
_FTP_Close($mi_ftp)




; Espera 10 segundos para la siguiente captura  y envío.
Sleep(10000)
Next


Gráficamente:




Explicación del código:


Este código es bastante simple gracias a los comandos _ScreenCapture_Capture("") y _ScreenCapture_SaveImage, ya que nos simplifican mucho el trabajo, el primero le llamamos y nos genera la captura, tras eso, llamamos al segundo y la guardamos en donde queramos.


Nótese que en el nombre de los archivos se ha elegido un sistema de fecha para que puedan ordenarse de manera cómoda y que no existan problemas con nombres duplicados, para ello se usaron funciones de fecha.

La parte de FTP también es sencilla, tan solo tener los datos del acceso y la función FTP_ se encarga del resto.


Por último resaltar la función de Sleep que nos permite detenernos durante 10 segundos entre captura y captura de imágenes.


Ejemplo 4: trabajo con coordenadas


Una de las cosas que hacen peligroso a este lenguaje es su capacidad de emular el movimiento del ratón, de tal manera que si tenemos bien controladas las dimensiones de una pantalla podemos simular el trabajo de un usuario, imagínese esto en el pinpad de un banco a la hora de logearnos.


Código de ejemplo:


MouseMove(100,120) ; Coordenadas x,y
MouseMove(200,480,30) ; El tercer número, el 30, es la velocidad del ratón.
MouseMove(500,650,20)
MouseMove(300,650,70)
MouseMove(500,650,10)
$posicion = MouseGetPos()
MsgBox(0, "Posición:", $posicion[0] & ", " & $posicion[1])

Sleep(3000)

MouseClick("right") ; Pulsa con el botón derecho del ratón.


Explicación del código:


Para este ejemplo usamos la función MouseMove, que recibe tres parámetros, el primero es la coordenada x de la pantalla, el segundo la coordenada Y, y el tercero es la velocidad de movimiento del ratón. Una vez ejecutada el puntero del ratón se moverá hasta las coordenadas especificadas a la velocidad que le hayamos dicho.


También usamos la funcion MouseGetPos() que nos retorna las coordenadas del ratón en ese momento.


Tras un Sleep de 3 segundos usamos la función MouseClick, que tiene un único parámetro LEFT / RIGHT, indicandole asi cual sera el boton del mouse pulsado.


Como se puede ver es super interesante de cara a emular la interacción humana.


AutoIT Recorder:


Si lo de picar código no es lo tuyo y quieres algo mas sencillo y que te permita grabar tus interacciones para recibirlas como un script, te recomiendo este video:


Vídeo: https://www.youtube.com/watch?v=J2DWvUj78Uw



Autoit ofuscator:


Tras la publicación del artículo introductorio sobre AutoIT se puso en contacto conmigo @SadFud75 para enviarme un enlace sobre un ofuscador de código AutoIT que es de su cosecha.


OBFAU3 es una interfaz gráfica que permite proteger el software escrito en au3 evitando así su uso fraudulento por terceros.


El proyecto lo podéis ver completo aquí:



Bueno, y con este ultimo aporte cierro esta segunda entrega que a mi gusto se me ha quedado muy larga pero en la que he querido mostrar dos o tres truquillos más a realizar con AutoIT, en breve publicaremos la tercera entrega con un mini honeypot.

Os espero en el siguiente capitulo. Gracias.

1 comentario:

  1. Muy buen artículo, con unos ejemplos muy interesantes. Gracias.

    ResponderEliminar