Equipo rojo local: de estación de trabajo a controlador de dominio con Havoc C2 y Microsoft EDR

¡Bienvenido de nuevo! En esta entrada de blog, nos enfrentaremos a Microsoft Defender For Endpoint EDR una vez más para ver si podemos pasar de un contexto de baja integridad a un administrador de dominio y obtener la ejecución remota de código en un controlador de dominio.
Durante los últimos meses, me he sumergido en diferentes técnicas para ver qué podemos hacer con las herramientas de código abierto contra uno de los EDR más populares que existen.
En este blog, voy a repasar algunos conceptos comunes para acceder a un controlador de dominio pero con diferentes técnicas que he encontrado.
Éstos incluyen:
- Omisión de UAC con un binario personalizado de UACME
- Movimiento lateral con CrackMapExec y SharpWMI.exe
- Sesión pasando a Pacto
- DCSync con Pacto
caos c2
Ya he cubierto cómo hacer que Havoc funcione. Si no está familiarizado con él, puede consultar mi publicación Obtener el sistema en Windows 11 con Havoc C2 .

Con mi C2 arriba, voy a generar un shellcode y ejecutarlo a través de mi propia herramienta de shellcode, Harriet.

Ahora que tengo un binario FUD, puedo transferirlo a la primera estación de trabajo en mi entorno AD.

Según mis publicaciones anteriores, tenemos un entorno AD extremadamente pequeño aquí. A efectos de tiempo y espacio del blog, vamos a empezar con un DA conocido en un contexto medio.
Transfiero mi implante a Win11-Blue.blueteam.local y recupero nuestra baliza inicial.


Revisemos el EDR y veamos si la ejecución inicial se realizó.

¡Todo silencioso! ¡De acuerdo! Podemos seguir adelante. Hacer un simple comando "whoami" nos muestra que Danny está en el grupo DA.

Ejecutar SharpUp nos dice que podemos omitir UAC para obtener privilegios de administrador.

Binario UACME personalizado
En una publicación anterior, utilicé el método ComputerDefaults para obtener el administrador, pero Defender For Endpoint lo detecta actualmente. Queremos obtener DA sin alertas, así que vamos a hacer algo escandaloso: ¡colocar algo en el disco!
En mi máquina de desarrollo con Windows 11, cloné el proyecto UACME.

clon de git https://github.com/hfiref0x/UACME.git
Cargamos el archivo sln y ya tenemos nuestro proyecto cargado.

Cuando se compila, el binario UACME se llama Akagi, por lo que vamos a comenzar a personalizar los archivos que se encuentran en esa sección del explorador de soluciones.

Expandiendo el proyecto, vemos varias secciones para archivos de encabezado, recursos, etc.
Podemos comenzar nuestro proceso haciendo una búsqueda y reemplazo rápidos de las cadenas comunes que se encuentran en el proyecto.

Algunas de las otras cadenas que podemos reemplazar están a continuación:
akagi
UACME
UAC
CARGA ÚTIL
Si intentamos construir la solución ahora, falla.

No puede encontrar el archivo de icono porque no hemos cambiado su nombre. Entonces necesitamos cambiar su nombre en la carpeta Akagi.

Una vez que cambiamos el nombre del ícono, se construye con éxito.

Ahora, si miramos los detalles del binario construido, vemos que hay algunas propiedades reveladoras.

Hacemos una búsqueda rápida de APT 92 en nuestro proyecto, encontramos el archivo Resources.rc con estas descripciones.

Al revisar los archivos de origen, vemos la carpeta de métodos.

Cada uno de estos archivos de método representa diferentes omisiones de UAC que se utilizarán en el binario compilado. Si revisamos cada uno de estos métodos, vemos varios comentarios con los nombres de los métodos. Para superar Defender y otros motores AV, debemos eliminar estos comentarios de cada archivo de método.

Eliminar todos los comentarios de los archivos de métodos puede llevar mucho tiempo, pero solo deberíamos tener que hacerlo una vez antes de tener un binario que no sea detectado por AV.
Y después de eliminar todos los comentarios del archivo y volver a compilar, obtenemos nuestro binario. Al ejecutarlo contra AntiScan.me, vemos que hemos pasado por alto a varios proveedores de antivirus.

Al escanearlo contra Windows Defender, vemos que no se detecta.

Obtener administrador
Volviendo a Havoc, solo necesitamos cargar el binario a nuestro objetivo.

Verifiquemos con EDR de Microsoft para ver si ya nos atraparon.

No lo parece. ¡Procedamos!
Con nuestro binario UACME en el objetivo, debemos ejecutarlo con nuestro método. Los comandos Powershell y Shell podrían atraparnos, así que usemos WMI. Por suerte, SharpWMI nos permite ejecutar los comandos en la memoria.
Pero primero, necesitamos un método para Windows 11.

59 se ve bien. Llamemos a nuestro método con SharpWMI.
dotnet inline-execute /home/user/Desktop/SharpWMI.exe action=exec computername=WIN11-BLUE.blueteam.local command=”C:\Users\danny\Downloads\Acaji.exe 59 C:\Users\danny\Downloads \Inj3c13.exe”
¡Y recuperamos nuestra baliza de administración!

Revisando nuestro EDR, no tenemos detecciones.

¡Excelente! Entonces, ahora que hemos determinado que podemos obtener la ejecución del código sin activar el EDR, podemos usar este mismo método para movernos a través del dominio hacia el DC.
NOTA: Por supuesto que no harías esto en una aplicación del mundo real. Tenemos un DA, por lo que podríamos solo DCsync, pero queremos ver si podemos movernos sin alterar el EDR.
Movimiento lateral
Entonces, en WIN11-BLUE teníamos la capacidad de cargar nuestro binario, pero ¿cómo hacemos esto cuando no tenemos una baliza en el DC?
En una publicación anterior, demostré que podíamos hacer esto con Powershell y una tarea programada. En este artículo, utilizaremos un método diferente. Vamos a cargar nuestro binario al objetivo usando CrackMapExec y luego llamarlo con SharpWMI.
Preparándonos para nuestro ataque
Entonces, para este POC, vamos a fingir una vez más que hay un documento de alto secreto en el DC que debemos exfiltrar. Lo primero que debemos hacer es obtener una contraseña o un hash para nuestro usuario Danny.
Como somos administradores, podemos usar varios métodos para obtener hashes, pero el más fácil para mí es pasar la sesión a Covenant y usar su comando DCsync.
Entonces, en Covenant, configuramos nuestro archivo de shellcode y lo descargamos a nuestro sistema local.

Para simplificar, cambiaré el nombre del archivo a grunt.bin y luego lo ejecutaré a través de Harriet. Esto lo encriptará para que podamos pasar el EDR.

Ahora que tenemos un binario, podemos usar Donut para volver a convertirlo en shellcode.

Y la última parte es inyectarlo en el proceso de nuestro ejecutable Havoc.

Con el shellcode inyectado con éxito, vamos a Covenant y tenemos un nuevo gruñido registrándose.

Echemos un vistazo a la EDR.

¡Nada que ver aqui! ¡Podemos avanzar!
Volviendo a Covenant, podemos usar el comando DCsync y obtener el hash de Danny. Y después de unos segundos, Danny y el dominio han sido propiedad.

Está bien, genial. Así que hemos demostrado que podemos obtener el hash de un DA. Pero, ¿qué haces con él una vez que lo tienes? Recuerde, el objetivo de nuestro ejercicio no era obtener el control del dominio, sino obtener el documento secreto en el DC.
Pasando al controlador de dominio
Tenemos un ejecutable FUD que debemos cargar en el DC. Para ello, vamos a utilizar CrackMapExec. Así que aquí está nuestro comando.
crackmapexec smb 192.168.1.9 -u danny -H 83c4be1a3fd33a182dafc8bd3bf53d00 -d blueteam.local — poner-archivo /home/kali/Desktop/Inj3c13.exe \\WINDOWS\\TEMP\\25N0v3.exe
Estamos usando el módulo SMB y tenemos la IP del controlador de dominio. Luego usamos el nombre de usuario de danny e ingresamos su hash NTLM. Tenemos el dominio y luego usamos el comando "-put-file" con la ruta a nuestro ejecutable FUD y luego el directorio en el que queremos colocar el archivo en el DC.
Vamos a intentarlo.

¡Y así, nuestro ejecutable está en el DC! Ahora tenemos que llamarlo. Podemos usar SharpWMI.exe para hacer esto en la memoria tal como lo hicimos con WIN11-BLUE.
¡Y ahora tenemos una baliza en alta integridad en el DC!

¡Encontremos el botín!
Después de una pequeña enumeración, lo encontramos en la carpeta Documentos de Danny.

Vamos a descargarlo.

Antes de echar un vistazo, consultemos con el EDR.

¿Para qué es bueno esto?
¡Y aquí está el botín!

¡Está bien! Entonces, en conclusión de este artículo, hablemos un poco sobre lo que hicimos y cómo lo hicimos.
Comenzamos con una baliza de baja integridad y aumentamos nuestros privilegios mediante la creación de un binario UACME personalizado que superó a Windows Defender y Windows Defender para Endpoint.
Luego llamamos al binario UACME con SharpWMI.exe en la memoria para un enfoque más sigiloso de Powershell o los comandos de shell.
Una vez que se maximizaron nuestros privilegios, hicimos un pase de sesión a Covenant para usar el comando DCsync para obtener el hash NTLM del DA. Luego usamos CrackMapExec para cargar una baliza en el DC y lo llamamos usando SharpWMI.exe.
Entonces, ¿cómo se preparó este entorno para nuestro éxito? WMI no está activado de forma predeterminada para los controladores de dominio, los servidores de Windows o las estaciones de trabajo con Windows 11.
Sin embargo, en un entorno corporativo moderno, la mayoría de estas máquinas tendrán WMI activado para facilitar a los administradores de sistemas la resolución de problemas. También comenzamos nuestro viaje con la cuenta de un fiscal de distrito, pero eso fue solo para hacer las cosas un poco más convenientes para la redacción.
También es importante comprender que no teníamos ningún otro AV instalado en los sistemas. Si recuerda, BitDefender vio nuestro binario UACME como malicioso. Por lo tanto, tenga cuidado al usarlo en un pentest real.
Si disfrutaste este escrito y quieres ver qué más estoy haciendo, sígueme aquí o en Twitter @assume_breach