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