# SMB (445)

SMB (Server Message Block) es un protocolo diseñado para la compartición de archivos en red, facilitando la interconexión de archivos y periféricos como impresoras y puertos serie entre ordenadores dentro de una red local (LAN).

* SMB utiliza el puerto 445 (TCP). Sin embargo, originalmente, SMB se ejecutaba sobre NetBIOS utilizando puerto 139.
* SAMBA es la implementación Linux de código abierto de SMB, y permite a los sistemas Windows acceder a recursos compartidos y dispositivos Linux acceder a recursos compartidos y dispositivos Linux.

El protocolo SMB utiliza dos niveles de autenticación, a saber:

* **Autenticación de usuario**: los usuarios deben proporcionar un nombre de usuario y una contraseña para autenticarse con el servidor SMB para acceder a un recurso compartido.
* **Autenticación de recurso compartido**: los usuarios deben proporcionar una contraseña para acceder a un recurso compartido restringido.

### **Nmap**

Scripts de `nmap` utiles para este servicio:

* smb-ls
* smb-protocols
* smb-security-mode
* smb-enum-sessions
* smb-enum-shares
* smb-enum-users
* smb-enum-groups
* smb-enum-domains
* smb-enum-services

Sintaxis:

```bash
nmap -p445 --script <script> 192.168.1.10
```

**smbclient**

Es un cliente que nos permite acceder a recursos compartidos en servidores SMB.

```bash
# Realiza una conexión con el usuario elliot
smbclient //192.168.1.10/Public -U elliot

# Conexión utilizando una sesión nula
smbclient //192.168.1.10/Public -N

# Lista recursos compartidos
smbclient -L 192.168.1.10 -N
```

### **smbmap**

SMBMap permite a los usuarios enumerar las unidades compartidas samba en todo un dominio. Enumera las unidades compartidas, los permisos de las unidades, el contenido compartido, la funcionalidad de carga/descarga, la coincidencia de patrones de descarga automática de nombres de archivo e incluso la ejecución de comandos remotos.

```bash
# Utiliza un usuario de invitado (guest) con una contraseña en blanco para 
# autenticarse en el objetivo especificado por 192.168.1.10.
# -d indica el dominio actual.
smbmap -u guest -p "" -d . -H 192.168.1.10

# Autentica con un usuario y contraseña específicos (<USER> y <PASSWORD>) 
# en el objetivo (192.168.1.10).
# -L lista los recursos compartidos disponibles en la máquina.
smbmap -u <USER> -p <PASSWORD> -H 192.168.1.10 -L

# Autentica en el objetivo y muestra la lista de archivos y 
# carpetas en la unidad C$ de forma recursiva.
smbmap -u <USER> -p <PASSWORD> -H 192.168.1.10 -r 'C$'

# Autentica y sube un archivo desde la ubicación local /root/file
# al recurso compartido C$ en el objetivo.
smbmap -H 192.168.1.10 -u <USER> -p <PASSWORD> --upload '/root/file' 'tmp/file'

# Autentica y descarga el archivo 'file' desde el recurso compartido tmp 
# en el objetivo.
smbmap -H 192.168.1.10 -u <USER> -p <PASSWORD> --download 'tmp/file'

# Autentica en el objetivo y ejecuta el comando ipconfig en el sistema remoto 
# usando SMB.
smbmap -u <USER> -p <PASSWORD> -H 192.168.1.10 -x 'ipconfig'
```

### **enum4linux**

Enum4linux es una herramienta utilizada para extraer información de hosts de Windows y Samba. La herramienta está escrita en Perl y envuelta en herramientas de samba `smbclient`, `rpcclient`, `net` y `nslookup`.

```bash
# -o indica que se realizará una enumeración básica.
enum4linux -o 192.168.1.10

# -U indica que se realizará una enumeración de usuarios
enum4linux -U 192.168.1.10

# -G indica que se realizará una enumeración de grupos 
enum4linux -G 192.168.1.10

# -S indica que se realizará una enumeración de los recursos compartidos
enum4linux -S 192.168.1.10

# -i Comprueba si el servidor smb esta configurado para imprimir
enum4linux -i 192.168.1.10

# -r Intentará enumerar usuarios utilizando RID cycling en el sistema remoto.
# -u Especifica el nombre de usuario que se utilizará para la autenticación. 
# -p Especifica la contraseña asociada al usuario proporcionado con la opción -u.
enum4linux -r -u <user> -p <password> 192.168.1.10
```

### **NetExec**

```bash
# Enumerar hosts
nxc smb 192.168.1.10/24

# comprobar null sessions
nxc smb 192.168.1.10 -u '' -p ''

# comprobar guest login
nxc smb 192.168.1.10 -u 'guest' -p ''

# enumerar hosts con firma SMB no requerida
nxc smb 192.168.1.10/24 --gen-relay-list relay_list.txt

# enumerar recursos compartidos usando una null session
nxc smb VICTIM_IPS -u '' -p '' --shares

# enumerar recursos compartidos de lectura/escritura en múltiples IPs con/sin credenciales
nxc smb VICTIM_IPS -u USERNAME -p 'PASSWORD' --shares --filter-shares READ WRITE
```

### **Rpcclient**

Rpcclient es una utilidad que forma parte del conjunto de herramientas Samba. Se utiliza para interactuar con el protocolo Remote Procedure Call (RPC) de Microsoft, que se utiliza para la comunicación entre los sistemas basados en Windows y otros dispositivos. rpcclient se utiliza principalmente para fines de depuración y pruebas, y se puede utilizar para consultar y manipular sistemas remotos.

El protocolo SMB se utiliza principalmente para compartir archivos, impresoras y otros recursos en una red, pero también puede aprovechar RPC para ciertas funcionalidades y operaciones específicas.

Por ejemplo, cuando accedes a recursos compartidos en una red Windows, como carpetas compartidas o impresoras, estás utilizando el protocolo SMB. Sin embargo, para algunas operaciones administrativas y de gestión, como enumerar usuarios y grupos, modificar permisos de archivos o impresoras, o acceder a la configuración del sistema remoto, SMB puede utilizar RPC para realizar estas tareas.

Cuando utilizas herramientas como `rpcclient` para interactuar con un sistema remoto que ejecuta servicios SMB, estás esencialmente aprovechando el protocolo RPC subyacente que forma parte de la implementación de SMB en ese sistema. De esta manera, `rpcclient` puede actuar como una interfaz para realizar consultas y ejecutar comandos a través del protocolo RPC en el contexto de un servidor SMB.

```bash
# obtener información sobre el sistema remoto, como el nombre del servidor, 
# la versión del sistema operativo, el dominio de trabajo, la fecha y la hora del sistema, 
# entre otros detalles.
rpcclient -U "" -N 192.168.1.10 -c "srvinfo"

# enumera los usuarios del dominio
rpcclient -U "" -N 192.168.1.10 -c "enumdomusers"

# enumera los grupos del dominio
rpcclient -U "" -N 192.168.1.10 -c "enumdomgroups"

# obtiene el SID del usuario en base a su nombre
rpcclient -U "" -N 192.168.1.10 -c "lookupnames root"

# Se utiliza para enumerar los SID (Security Identifiers) asignados a los grupos 
# en un servidor remoto. Es útil para obtener información sobre los grupos de 
# seguridad disponibles en un sistema y sus respectivos SID.
rpcclient -U "" -N 192.168.1.10 -c "lsaenumsid"
```

El parámetro `-c` en `rpcclient` se utiliza para especificar un comando o una secuencia de comandos que se ejecutarán en el servidor remoto una vez que se haya establecido la conexión. Esto permite realizar operaciones específicas de forma automática sin necesidad de interactuar manualmente con `rpcclient` después de establecer la conexión.

La sintaxis básica del parámetro `-c` es la siguiente:

```bash
rpcclient -U username //192.168.1.10 -c "command1; command2; command3"
```

### **RID Cycling Attack**

```bash
seq 1 5000 | xargs -P 50 -I{} rpcclient -U "" 30.30.30.4 -N -c "lookupsids S-1-22-1-{}" 2>&1
```

### **SMB desde Windows**

```powershell
# listar recursos compartidos
net share

# borrar el recurso compartido
net use * \delete

# montar el recurso compartido
net use z: \\192.168.1.10\c$ <password> /user:<username>

# /all nos permite ver los recursos compartidos administrativos (que terminan en '$').
# Puede usar IP o nombre de host para especificar el host.
net view \\192.168.1.10 /all
```

Recursos compartidos comunes en Windows:

* `C$` corresponde a C:/
* `ADMIN$` se asigna a C:/Windows
* `IPC$` se utiliza para RPC
* `Print$` aloja controladores para impresoras compartidas
* `SYSVOL` sólo en DCs
* `NETLOGON` sólo en los DC

### **Interactuar con el cliente SMB**

```bash
smb: \> help # muestra la ayuda
smb: \> ls # listar archivos
smb: \> put file.txt # subir un archivo
smb: \> get file.txt # descargar un archivo
```

### **Montar una carpeta compartida**

```bash
mount -t cifs -o "username=user,password=password" //192.168.1.10/shared_folder /mnt/shared_folder
```

### **Fuerza bruta de credenciales**

```bash
nmap --script smb-brute -p 445 192.168.1.10
hydra -l admin -P /usr/share/wordlist/rockyou.txt 192.168.1.10 smb
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://d4redevil.gitbook.io/d4redevil/servicios-comunes/smb-445.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
