Ir al contenido

SMB

Por

Madurezreviewed
Última revisión
Publicado
Última actualización

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

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

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:

Negociar SMB y revisar sus capacidades
nmap -sV -p 445 \
--script smb-protocols,smb2-security-mode,smb2-capabilities \
TARGET_IP

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

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:

Solicitar shares sin credenciales
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:

Listar shares con una identidad conocida
smbclient -L '//TARGET_IP/' -U 'DOMAIN/USERNAME'

Para abrir un share, la ruta incluye su nombre:

Abrir una sesión sobre un share
smbclient '//TARGET_IP/SHARE' -U 'DOMAIN/USERNAME'

Dentro del cliente, empieza por confirmar el contexto y recorrer el contenido de forma controlada:

Comandos dentro de smbclient
pwd
ls
cd DIRECTORY
allinfo FILE
get FILE

allinfo 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:

Validar escritura en el directorio actual
put LOCAL_FILE REMOTE_FILE
ls
del REMOTE_FILE

Registra antes y después el nombre, hash, ruta, propietario y timestamps. Que el borrado funcione es una propiedad distinta de poder crear o modificar.

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.

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:

Probar una null session sobre RPC
rpcclient -N -U '' TARGET_IP

Si 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.
Consultar cuentas y ampliar un RID
enumdomusers
queryuser RID

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

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:

Mostrar la configuración efectiva de Samba
testparm -s

Por 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:

Revisar sesiones y archivos abiertos
smbstatus

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

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:

Construir una matriz de shares con una null session
nxc smb TARGET_IP -u '' -p '' --shares

La 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:

Comparar null session y guest
nxc smb TARGET_IP -u '' -p '' --shares
nxc smb TARGET_IP -u 'guest' -p '' --shares

Despué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:

Consultar identidades y política con NetExec
nxc smb TARGET_IP -u USERNAME -p PASSWORD --users
nxc smb TARGET_IP -u USERNAME -p PASSWORD --groups
nxc smb TARGET_IP -u USERNAME -p PASSWORD --pass-pol
nxc smb TARGET_IP -u USERNAME -p PASSWORD --rid-brute MAX_RID

Cada 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:

Automatizar consultas SMB y conservar resultados estructurados
enum4linux-ng -As TARGET_IP -oA BASENAME
enum4linux-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.

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.

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.

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.

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.