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-ssn

Puerto 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

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:

Syntax
Description

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:

  • cred

  • password

  • users

  • secrets

  • key

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

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 smbexec y atexec.

  • 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 smb

  • la IP o rango de IPs

  • la opción -u para el nombre de usuario

  • la opción -p para la contraseƱa

  • la opción -x para ejecutar comandos CMD

  • la 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:

  1. Verifica el archivo hosts local (C:\Windows\System32\Drivers\etc\hosts)

  2. Consulta el cachƩ local DNS

  3. Consulta un servidor DNS configurado

  4. 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/

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?