SMB
Server Message Block (SMB) suele descubrirse como un servicio de archivos, pero Windows lo utiliza también como una capa de transporte para named pipes y protocolos de administración. Una conexión a 445/tcp puede conducir a un share de documentos, a IPC$, a una interfaz RPC o a varias de esas superficies con permisos distintos. Reducir todo el servicio a «listar shares» deja fuera buena parte de su modelo de confianza.
La evolución de SMB añadió dialectos, firma, cifrado y capacidades sin eliminar necesariamente los comportamientos anteriores. Cliente y servidor negocian primero qué versión y protecciones utilizarán. Después la identidad obtiene una vista de recursos. Finalmente, cada share, archivo o interfaz aplica su propia autorización. La enumeración conserva esos tres planos para que una null session parcial, un share visible o una sesión sin firma obligatoria no se conviertan en conclusiones sobre todo el host.
Los ejemplos utilizan TARGET_IP, DOMAIN, USERNAME, SHARE, RID y BASENAME como placeholders. La página de Nmap explica las opciones de escaneo reutilizadas aquí.
Orden de trabajo y herramientas
Sección titulada «Orden de trabajo y herramientas»Nmap cubre dialectos, signing, capacidades e información preautenticación. smbclient es la referencia para shares y archivos. rpcclient formula consultas MS-RPC concretas. NetExec construye matrices sobre varios hosts e identidades. enum4linux-ng orquesta las herramientas de Samba y conserva JSON o YAML. Si dos herramientas discrepan, reproduce la operación con smbclient o rpcclient y conserva el código NTSTATUS.
| Pregunta | Herramienta principal | Segunda comprobación |
|---|---|---|
| ¿qué dialecto y signing negocia? | Nmap y NetExec | captura o sesión smbclient |
| ¿qué shares ve una identidad? | smbclient -L |
NetExec --shares |
| ¿qué puede leer o escribir? | smbclient |
ACL, archivo de prueba y limpieza |
| ¿qué expone RPC? | rpcclient |
enum4linux-ng -v y consulta individual |
| ¿qué usuarios y política aparecen? | rpcclient/NetExec |
LDAP o consulta autenticada con la misma identidad |
| ¿cómo comparar muchos hosts? | NetExec | exportar y validar una muestra manualmente |
Transporte y dialectos
Sección titulada «Transporte y dialectos»SMB moderno utiliza directamente 445/tcp. Las implementaciones antiguas podían encapsular SMB sobre NetBIOS, con 137/udp para nombres, 138/udp para datagramas y 139/tcp para sesiones. Encontrar 445 abierto no demuestra que 139 también lo esté ni que NetBIOS intervenga en la sesión.
El cliente y el servidor negocian un dialecto. SMB 1, SMB 2 y SMB 3 no son solo números de versión. Cambian el formato de los mensajes y capacidades como signing, cifrado, leasing o multichannel. La firma aporta integridad y autenticidad a los mensajes. El cifrado de SMB 3 protege además su contenido. En ambos casos hay que registrar si la capacidad existe y si el servidor la exige.
-p 445 limita Nmap al endpoint SMB directo. -sV identifica el servicio. Los scripts smb-protocols, smb2-security-mode y smb2-capabilities consultan dialectos, política de signing y capacidades SMB 2/3:
nmap -sV -p 445 \ --script smb-protocols,smb2-security-mode,smb2-capabilities \ TARGET_IPUn dialecto ofrecido no tiene por qué ser el que utilizará cada cliente. message_signing: enabled but not required significa que el servidor sabe firmar, pero acepta determinadas sesiones sin exigirlo. Conserva el dialecto negociado por el cliente usado durante la validación.
Enumerar shares con smbclient
Sección titulada «Enumerar shares con smbclient»Un share es un nombre lógico publicado por el servidor. Puede apuntar a un directorio, una impresora o un servicio especial como IPC$. Los permisos del share y los del sistema de archivos se combinan. Poder listar un nombre no demuestra acceso a su contenido ni permiso de escritura.
En smbclient, -L solicita la lista de shares y -N evita pedir una contraseña. Los dos separadores iniciales de la ruta UNC deben protegerse de la shell:
smbclient -N -L '//TARGET_IP/'Una respuesta NT_STATUS_ACCESS_DENIED puede indicar que el servidor no permite listar shares sin autenticar. No demuestra que todos los shares sean inaccesibles. Si se conocen credenciales, -U 'DOMAIN/USERNAME' fija la identidad y deja que el cliente solicite la contraseña de forma interactiva:
smbclient -L '//TARGET_IP/' -U 'DOMAIN/USERNAME'Para abrir un share, la ruta incluye su nombre:
smbclient '//TARGET_IP/SHARE' -U 'DOMAIN/USERNAME'Dentro del cliente, empieza por confirmar el contexto y recorrer el contenido de forma controlada:
pwdlscd DIRECTORYallinfo FILEget FILEallinfo muestra atributos y marcas temporales cuando el servidor los expone. get descarga un archivo. recurse ON y prompt OFF permiten recorrer y transferir árboles completos, pero aumentan rápidamente el volumen de datos y de operaciones registradas. Revisa primero nombres y tamaños.
La escritura debe comprobarse con un archivo identificable. put LOCAL_FILE REMOTE_FILE crea o reemplaza el nombre remoto:
put LOCAL_FILE REMOTE_FILElsdel REMOTE_FILERegistra antes y después el nombre, hash, ruta, propietario y timestamps. Que el borrado funcione es una propiedad distinta de poder crear o modificar.
Guest, anonymous y null session
Sección titulada «Guest, anonymous y null session»Estos términos describen situaciones relacionadas, pero no idénticas:
- una sesión guest se asigna a la cuenta invitada configurada por el servidor
- el acceso anonymous no aporta una identidad autenticada útil
- una null session usa credenciales vacías, normalmente contra
IPC$, para acceder a interfaces permitidas
Samba controla este comportamiento con opciones como map to guest, guest account y guest ok. Windows y Samba aplican además políticas de acceso anónimo a named pipes, shares y datos de cuentas. El resultado debe atribuirse al recurso y a la operación comprobados, no al host completo.
Enumerar RPC con rpcclient
Sección titulada «Enumerar RPC con rpcclient»rpcclient permite invocar interfaces MS-RPC sobre SMB. -N usa una contraseña vacía y -U '' envía un nombre de usuario vacío:
rpcclient -N -U '' TARGET_IPSi se abre el prompt, los comandos siguientes responden preguntas diferentes:
| Comando | Información solicitada |
|---|---|
srvinfo |
Plataforma, versión y rol anunciados por el servidor. |
netshareenumall |
Shares publicados mediante la interfaz de servidor. |
querydominfo |
Datos generales del dominio o SAM. |
enumdomusers |
Cuentas y sus RID cuando la política lo permite. |
enumdomgroups |
Grupos de dominio. |
queryuser RID |
Atributos de la cuenta identificada por el RID. |
querygroupmem RID |
Miembros de un grupo. |
enumdomusersqueryuser RIDUn RID es la parte relativa de un SID dentro de un dominio. Consultar secuencialmente posibles RID puede descubrir objetos que no aparecen en una enumeración directa. También genera muchas peticiones y numerosos errores para identificadores inexistentes. Una lista obtenida por RPC sigue sin confirmar que las cuentas estén habilitadas o acepten autenticación de red.
Revisar Samba desde el host
Sección titulada «Revisar Samba desde el host»En Samba, testparm -s carga la configuración y muestra el resultado efectivo sin comentarios. Es preferible a leer solo /etc/samba/smb.conf, porque procesa includes y valores por defecto:
testparm -sPor cada share, relaciona path, read only, write list, valid users, guest ok, máscaras de creación y permisos Unix. smbstatus muestra sesiones, archivos abiertos y bloqueos activos:
smbstatusUna configuración aparentemente escribible puede quedar bloqueada por permisos POSIX, ACL, SELinux o por la identidad Unix a la que Samba mapea la sesión.
Automatización y validación
Sección titulada «Automatización y validación»Herramientas como NetExec y enum4linux-ng combinan negociación, shares, RPC y políticas. Son útiles para obtener una primera matriz, pero cada campo depende de una petición distinta y puede fallar sin invalidar el resto. Guarda el output completo y valida manualmente los resultados que cambien el camino de enumeración.
NetExec utiliza el subcomando smb para seleccionar el protocolo. El siguiente ejemplo envía usuario y contraseña vacíos, y --shares solicita los recursos visibles para esa sesión:
nxc smb TARGET_IP -u '' -p '' --sharesLa línea de cada host resume negociación, identidad y resultado de autenticación antes de listar shares. Un fallo de login no descarta SMB y un share marcado como legible debe confirmarse con smbclient. La variante -u USERNAME -p PASSWORD coloca el secreto en los argumentos. Para credenciales reales, usa los mecanismos de entrada o archivos protegidos que admita la versión instalada y compruébalos con nxc smb --help.
Una cuenta guest y una null session pueden producir resultados distintos:
nxc smb TARGET_IP -u '' -p '' --sharesnxc smb TARGET_IP -u 'guest' -p '' --sharesDespués de confirmar la identidad, selecciona una pregunta. --users, --groups y --pass-pol consultan usuarios, grupos y política de contraseñas. --rid-brute MAX_RID recorre RID hasta el límite indicado:
nxc smb TARGET_IP -u USERNAME -p PASSWORD --usersnxc smb TARGET_IP -u USERNAME -p PASSWORD --groupsnxc smb TARGET_IP -u USERNAME -p PASSWORD --pass-polnxc smb TARGET_IP -u USERNAME -p PASSWORD --rid-brute MAX_RIDCada opción puede requerir interfaces y permisos diferentes. Un fallo en --users no invalida shares, signing ni autenticación. El recorrido de RID genera una petición por cada candidato y debe limitarse a la pregunta actual.
enum4linux-ng coordina nmblookup, net, rpcclient y smbclient. -As ejecuta su enumeración simple corta sin la consulta de nombres NetBIOS. -oA BASENAME conserva el resultado en JSON y YAML. Con -v, el output incluye los comandos Samba subyacentes y permite reproducir una petición concreta:
enum4linux-ng -As TARGET_IP -oA BASENAMEenum4linux-ng -As -v TARGET_IP-A solicita el conjunto amplio de comprobaciones. -As omite fases más lentas y es mejor para una primera correlación. No cambies a -A para ocultar que una pregunta concreta falló. Ejecuta enum4linux-ng -h, identifica la fase necesaria y reproduce con -v. La automatización se ejecuta después del recorrido manual porque agrupa varias decisiones. Si una sección falla, revisa el comando mostrado y repítelo directamente. No sustituyas un resultado parcial por una etiqueta global como “SMB no enumerado”.
| Resultado | Interpretación siguiente |
|---|---|
| 445 abierto, sin dialecto | Confirmar middlebox, proxy, timeout o servicio distinto. |
| Share visible, acceso denegado | Probar el share por nombre con cada identidad disponible. |
| Listado permitido, descarga denegada | Revisar ACL por objeto y permisos del sistema de archivos. |
| RPC parcial | Anotar cada interfaz y operación permitida. No resumirlo como “null session completa”. |
| Signing requerido | Conservarlo como propiedad de la sesión y comprobar el dialecto negociado. |
Mapa NSE y validación manual
Sección titulada «Mapa NSE y validación manual»Los scripts se agrupan por pregunta, no por el prefijo smb-*:
| Pregunta | Scripts representativos | Confirmación |
|---|---|---|
| dialectos y capacidades | smb-protocols, smb2-capabilities |
negociación de smbclient o captura |
| firma y tiempo | smb2-security-mode, smb2-time |
NetExec y política efectiva |
| identidad | smb-os-discovery, smb2-time |
RPC, NTLM y acceso local |
| shares y contenido | smb-enum-shares, smb-ls |
smbclient -L y acceso por share |
| dominio, usuarios y grupos | smb-enum-domains, smb-enum-users/groups |
rpcclient, LDAP o AD con la misma identidad |
| sesiones, procesos, servicios | smb-enum-sessions/processes/services |
privilegios remotos y observación local |
Scripts smb-brute, smb-psexec, smb-print-text, smb-flood, smb-vuln-* y backdoor checks tienen efectos y requisitos distintos. Revisa el código y ejecuta únicamente la condición necesaria.
Permisos efectivos y ramas de impacto
Sección titulada «Permisos efectivos y ramas de impacto»Enumera share ACL y permisos NTFS/Samba por separado. Listar un share no implica leer archivos y crear un archivo no implica sobrescribir, renombrar o borrar. DFS puede redirigir a otro servidor. Named pipes pueden exponer RPC aunque no haya datos de usuario.
La ausencia de firma obligatoria crea una condición relevante para relay, pero no demuestra que exista un origen coercible, credencial aceptada ni destino compatible. SMBv1, guest, null session, credenciales locales, credenciales de dominio y Kerberos producen superficies diferentes. Registra la identidad y el dialecto de cada resultado.
Falsos negativos, telemetría y limpieza
Sección titulada «Falsos negativos, telemetría y limpieza»Restricciones de origen, firewall, SPN, DNS, hora, channel binding, signing, encryption y bloqueo pueden separar resultados entre herramientas. Conserva código NTSTATUS. Windows registra autenticación, share access, object access, servicios y procesos según auditoría. Samba mantiene logs propios.
Para escritura, usa un archivo único, hash conocido y share concreto. Retíralo y confirma la ausencia. No uses la ejecución de un servicio ni una tarea programada para «probar SMB». Esas acciones pertenecen al movimiento lateral y deben registrar servicio, binario, credencial, proceso y limpieza.
Referencias operativas
Sección titulada «Referencias operativas»La página de herramientas y automatización compara smbclient, rpcclient, enum4linux-ng, NetExec, Impacket y NSE. Usa la checklist para cerrar identidad, shares y permisos. La cheatsheet conserva comandos ya explicados.