SMB Port (139, 445)
Introduction
Puerto 139
Puerto 139 es el canal que se utiliza en redes LAN para gestionar las sesiones de NetBIOS. Esto significa que, cuando una aplicación (como cliente) necesita comunicarse con otra (que actúa como servidor), lo hace a través de este puerto utilizando TCP. NetBIOS se encarga de que los dispositivos y aplicaciones se encuentren y se identifiquen en la red mediante nombres de hasta 16 caracteres, que pueden no coincidir con el nombre real del equipo.
En otras palabras, el puerto 139 es el punto de entrada para que las aplicaciones establezcan conexiones y compartan datos dentro de la red. Gracias a este protocolo, se facilita la transmisión de información y la localización de recursos, lo que resulta esencial en entornos donde la comunicación entre varios dispositivos es clave. Aunque en algunas configuraciones modernas se opta por otros métodos y puertos por temas de seguridad, el puerto 139 sigue siendo una parte importante en redes tradicionales y en ciertas aplicaciones que aún dependen de NetBIOS para funcionar correctamente.
139/tcp open netbios-ssn Microsoft Windows netbios-ssnPuerto 445
El Puerto 445 se utiliza para implementar SMB (Server Message Blocks), también conocido en la actualidad como CIFS, sobre TCP/IP. Esto quiere decir que este puerto permite que dispositivos en una red compartan archivos, impresoras y otros recursos de manera directa.
A diferencia del Puerto 139, que opera con NetBIOS sobre IP (es decir, SMB a través de la capa adicional de NetBIOS), el Puerto 445 permite que SMB funcione directamente sobre TCP/IP. En entornos Windows, esto facilita la comunicación al eliminar la necesidad de NetBIOS, haciendo que el intercambio de datos sea más directo y eficiente.
Sin embargo, en otros sistemas o configuraciones que aún dependen de NetBIOS, es posible que se utilice el Puerto 139 para manejar SMB a través de esa capa extra. En resumen, el Puerto 445 ofrece una forma más moderna y optimizada de gestionar el intercambio de recursos en red, mientras que el Puerto 139 puede seguir en uso para mantener compatibilidad con sistemas antiguos o configuraciones específicas.
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)SMB
SMB es un protocolo cliente-servidor que facilita el acceso y compartición de recursos en red, como archivos, carpetas e impresoras. Se usa principalmente en entornos Windows, permitiendo la comunicación entre versiones modernas y antiguas, y gracias a Samba, también se implementa en Linux/Unix. Además, usa ACLs para asignar permisos específicos a usuarios o grupos, independientemente de los controles locales.
IPC$ Share
El acceso al recurso compartido IPC$ se puede obtener a través de una sesión nula anónima, permitiendo la interacción con servicios expuestos a través de tuberías con nombre. La utilidad enum4linux es útil para este propósito. Utilizada correctamente, permite la adquisición de:
Información sobre el sistema operativo
Detalles sobre el dominio padre
Una compilación de usuarios y grupos locales
Información sobre los recursos compartidos SMB disponibles
La política de seguridad del sistema efectiva
Esta funcionalidad es crítica para los administradores de red y profesionales de seguridad para evaluar la postura de seguridad de los servicios SMB (Server Message Block) en una red. enum4linux proporciona una vista completa del entorno SMB del sistema objetivo, lo cual es esencial para identificar vulnerabilidades potenciales y asegurar que los servicios SMB estén debidamente protegidos.
Authentication
SMBMap
smbclient
NetExec
Misconfigurations
Anonymous Authentication
Enumerating SMB
Nmap
Verificar vulnerabilidades a través de Nmap.
NetExec
SMB logged on users
SMB active sessions
SMB download file
Dumping Hashes
Dumping SAM
Dumping LSASS
Dumping NTDS.dit
RID Cycling Attack
El RID Cycling Attack se aprovecha del acceso a la compartición IPC$ para comunicarse con el servicio SAM mediante RPC. Esto permite iterar sobre los Relative Identifiers (RIDs) y, de ese modo, enumerar usuarios válidos en el sistema.
Interacting with SMB service
Tools to interact with SMB
smbclient
psexec.py
smbexec.py
Impacket
CrackMapExec
Windows
Hay diferentes maneras de interactuar con una carpeta compartida en Windows, y exploraremos un par de ellas. En la interfaz gráfica de Windows, podemos presionar [WINKEY] + [R] para abrir el cuadro de diálogo.
Ejecutar e introducir la ubicación del recurso compartido, por ejemplo: \\192.168.220.129\Finance\

Supongamos que la carpeta compartida permite la autenticación anónima o que nos autenticamos con un usuario con privilegios sobre ella. En ese caso, no recibiremos ninguna solicitud de autenticación y se mostrará el contenido de la carpeta compartida.

Si no tenemos acceso, recibiremos una solicitud de autenticación.

Windows tiene dos consolas de línea de comandos: Command Shell y PowerShell. Cada una es un programa que permite la comunicación directa entre nosotras y el sistema operativo o las aplicaciones, proporcionando un entorno para automatizar tareas administrativas.
Veamos algunos comandos para interactuar con recursos compartidos utilizando Command Shell (CMD) y PowerShell.
Windows CMD
Windows CMD - DIR
El comando dir muestra una lista de los archivos y subdirectorios de un directorio.
Windows CMD - Net Use
El comando net use conecta un equipo a un recurso compartido, lo desconecta o muestra información sobre las conexiones existentes. Podemos conectarnos a un recurso compartido y asignar su contenido a la letra de unidad n con el siguiente comando.
También podemos proporcionar un nombre de usuario y una contraseña para autenticarnos en el recurso compartido.
Windows CMD - DIR
Una vez que la carpeta compartida está montada como la unidad N, podemos ejecutar comandos de Windows como si esta carpeta estuviera en nuestro propio equipo.
Veamos cuántos archivos contiene la carpeta compartida y sus subdirectorios.
Encontramos 29.302 archivos. Analicemos el comando:
dir
Application
n:
Directory or drive to search
/a-d
/a is the attribute and -d means not directories
/s
Displays files in a specified directory and all subdirectories
/b
Uses bare format (no heading information or summary)
El siguiente comando | find /c ":\\" procesa la salida de dir n: /a-d /s /b para contar cuántos archivos existen en el directorio y sus subdirectorios. Puedes usar dir /? para ver la ayuda completa del comando.
Buscar entre 29,302 archivos puede llevar mucho tiempo, por eso usar scripts o herramientas de línea de comandos nos ayuda a agilizar el proceso. Con dir podemos buscar nombres específicos dentro de los archivos, como por ejemplo:
credpassworduserssecretskey
Y también extensiones comunes de código fuente como: .cs, .c, .go, .java, .php, .asp, .aspx, .html.
Windows CMD - Findstr
Si queremos buscar una palabra específica dentro de los archivos de texto, podemos usar el comando findstr.
Podemos encontrar más ejemplos de findstr aquí.
Windows PowerShell
PowerShell fue diseñada para ampliar las capacidades de la consola de comandos tradicional, permitiendo ejecutar comandos propios llamados cmdlets. Los cmdlets son similares a los comandos de Windows, pero ofrecen un lenguaje de scripting mucho más potente y extensible.
En PowerShell podemos ejecutar tanto comandos de Windows como cmdlets, mientras que la consola de comandos (CMD) solo puede ejecutar comandos tradicionales y no puede usar cmdlets de PowerShell.
Ahora vamos a replicar los mismos comandos usando PowerShell.
En lugar de net use, podemos usar New-PSDrive para montar el recurso compartido:
Windows PowerShell - PSCredential Object
Para proporcionar un nombre de usuario y contraseña en PowerShell, necesitamos crear un objeto PSCredential:
Windows PowerShell - GCI
Podemos usar Get-ChildItem (o su alias gci) para buscar archivos de forma recursiva:
Buscar archivos que contengan “cred” en el nombre:
Windows PowerShell - Select-String
El cmdlet Select-String utiliza coincidencias con expresiones regulares para buscar patrones de texto en cadenas de entrada y archivos. Podemos usar Select-String de forma similar a grep en UNIX o findstr.exe en Windows.
La línea de comandos permite automatizar tareas rutinarias como la gestión de cuentas de usuario, copias de seguridad nocturnas o la interacción con muchos archivos. Podemos realizar estas operaciones de forma más eficiente utilizando scripts en lugar de la interfaz gráfica (GUI).
Linux
Linux (UNIX) también puede usarse para explorar y montar recursos compartidos SMB. Esto puede hacerse tanto si el servidor de destino es una máquina Windows como si es un servidor Samba. Aunque algunas distribuciones de Linux tienen interfaz gráfica, aquí nos enfocaremos en el uso de herramientas y utilidades de línea de comandos para interactuar con SMB.
Veamos cómo montar recursos compartidos SMB para interactuar localmente con directorios y archivos.
Linux - Mount
Como alternativa, podemos usar un archivo de credenciales:
El archivo credentialfile debe tener esta estructura:
Nota: necesitamos tener instalado cifs-utils para conectarnos a un recurso compartido SMB. Para instalarlo podemos usar:
Linux - Find and Grep
Una vez montada la carpeta compartida, podemos usar herramientas comunes de Linux como find o grep para interactuar con la estructura de archivos.
Buscar un archivo cuyo nombre contenga la cadena cred:
Brute Force and Password Spraying
Hydra
NetExec
Metasploit Framework
Remote Code Execution
Antes de ver cómo ejecutar comandos en un sistema remoto usando SMB, hablemos de Sysinternals. El sitio web de Windows Sysinternals fue creado en 1996 por Mark Russinovich y Bryce Cogswell, ofreciendo herramientas y recursos técnicos para administrar, diagnosticar, solucionar problemas y monitorear entornos Windows. Microsoft adquirió Sysinternals el 18 de julio de 2006.
Sysinternals incluía varias herramientas gratuitas para administrar sistemas Windows, y una de las más conocidas es PsExec.
PsExec nos permite ejecutar procesos en sistemas remotos sin necesidad de instalar software cliente. Funciona porque lleva un servicio de Windows incorporado dentro de su ejecutable. Este servicio se copia en el recurso compartido admin$ de la máquina remota y se inicia utilizando la API del Service Control Manager a través de DCE/RPC sobre SMB. Luego, se crea una named pipe para enviar los comandos al sistema.
Además de la versión oficial de PsExec, existen implementaciones en Linux, como:
Impacket PsExec – Implementación en Python basada en RemComSvc.
Impacket SMBExec – Similar a PsExec, pero sin usar RemComSvc. Usa un servidor SMB local para recibir salida.
Impacket atexec – Ejecuta comandos usando el Task Scheduler.
CrackMapExec – Incluye implementación de
smbexecyatexec.Metasploit PsExec – Implementación en Ruby del módulo PsExec.
Impacket PsExec
Para usar impacket-psexec, necesitamos proporcionar el dominio/usuario, la contraseña y la dirección IP de la máquina objetivo. Para obtener información más detallada, podemos usar la ayuda de impacket:
Para conectarnos a una máquina remota usando una cuenta de administrador local con impacket-psexec, podemos utilizar el siguiente comando:
Las mismas opciones se aplican a las herramientas impacket-smbexec e impacket-atexec.
CrackMapExec
Otra herramienta que podemos usar para ejecutar comandos CMD o PowerShell es CrackMapExec. Una de sus ventajas es que permite ejecutar comandos en múltiples hosts al mismo tiempo.
Para usarla, debemos especificar:
el protocolo, por ejemplo
smbla IP o rango de IPs
la opción
-upara el nombre de usuariola opción
-ppara la contraseñala opción
-xpara ejecutar comandos CMDla opción
-X(mayúscula) para ejecutar comandos PowerShell
NetExec
Forced Authentication Attacks
También podemos abusar del protocolo SMB creando un servidor SMB falso para capturar los hashes NetNTLM v1/v2 de los usuarios.
La herramienta más común para esto es Responder. Responder es una herramienta de envenenamiento de LLMNR, NBT-NS y MDNS, con varias funcionalidades, entre ellas la posibilidad de levantar servicios falsos, como SMB, para capturar hashes NetNTLM. En su configuración por defecto, escucha tráfico LLMNR y NBT-NS, responde en nombre de los servidores que la víctima busca, y captura los hashes que se generen.
Imaginemos un ejemplo: creamos un servidor SMB falso con Responder usando su configuración por defecto:
Cuando una máquina necesita resolver un nombre (Name Resolution), sigue un flujo como este:
Verifica el archivo
hostslocal (C:\Windows\System32\Drivers\etc\hosts)Consulta el caché local DNS
Consulta un servidor DNS configurado
Si todo falla, lanza una consulta multicast (LLMNR/NBT-NS)
Si un usuario comete un error al escribir el nombre de una carpeta compartida (por ejemplo, \\mysharefoder\ en lugar de \\mysharedfolder\), y ese nombre no existe, se lanza una consulta a toda la red, incluyéndonos a nosotras con el servidor falso. El sistema no valida las respuestas, así que podemos engañarlo fácilmente y capturar credenciales.
Estas credenciales capturadas pueden ser crackeadas con hashcat o retransmitidas a una máquina remota para completar la autenticación e impersonar al usuario.
Todos los hashes capturados se guardan en el directorio de logs de Responder:
/usr/share/responder/logs/
Nota: si ves múltiples hashes para una misma cuenta, es porque NTLMv2 usa un challenge tanto del cliente como del servidor, y ambos son aleatorios en cada interacción. Esto hace que los hashes generados estén salteados con cadenas aleatorias, por lo tanto no coinciden entre sí, aunque representen la misma contraseña.
El hash NTLMv2 fue descifrado. La contraseña es P@ssword. Si no podemos descifrar el hash, podemos potencialmente reenviarlo a otra máquina usando impacket-ntlmrelayx o Responder MultiRelay.py. Veamos un ejemplo usando impacket-ntlmrelayx.
Primero, necesitamos establecer SMB en OFF en nuestro archivo de configuración de responder (/etc/responder/Responder.conf).
Luego ejecutamos impacket-ntlmrelayx con la opción --no-http-server, -smb2support, y la máquina objetivo con la opción -t. Por defecto, impacket-ntlmrelayx volcará la base de datos SAM, pero podemos ejecutar comandos agregando la opción -c.
Podemos crear una reverse shell en PowerShell usando https://www.revshells.com/, configurando la IP de nuestra máquina, el puerto, y seleccionando la opción Powershell #3 (Base64).
Una vez que la víctima se autentica contra nuestro servidor, envenenamos la respuesta y forzamos la ejecución del comando, obteniendo la reverse shell:
Última actualización
¿Te fue útil?