# MQTT Pentesting

## 01 - Reconocimiento

> Descubrir broker, versión y exposición.

| ID         | Prueba                                | Comando / Herramienta                                | Resultado esperado                                                            | Sev. |
| ---------- | ------------------------------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------- | :--: |
| `RECON-01` | Escaneo de puertos MQTT (1883 / 8883) | `nmap -sV -p 1883,8883 <target>`                     | Identificar si el servicio está abierto y qué broker/versión corre.           |  🔵  |
| `RECON-02` | Script Nmap de suscripción MQTT       | `nmap --script mqtt-subscribe -p 1883,8883 <target>` | Listar topics observables y mensajes muestreados.                             |  🔵  |
| `RECON-03` | Fingerprint de broker y versión       | `mosquitto_sub -h <target> -t '$SYS/broker/version'` | Obtener versión exacta para cruzar contra CVEs.                               |  🔵  |
| `RECON-04` | Exposición externa (OSINT)            | Shodan → `port:1883 MQTT`                            | Confirmar si el broker es accesible desde internet (solo si está en alcance). |  🔵  |

***

## 02 - Autenticación

> Validar los controles de acceso de entrada.

| ID        | Prueba                                    | Comando / Herramienta                                   | Resultado esperado                                                                                    | Sev. |
| --------- | ----------------------------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | :--: |
| `AUTH-01` | Conexión anónima / sin credenciales       | `mosquitto_sub -h <target> -t '#' -d`                   | El broker **no** debería aceptar conexiones anónimas. Si conecta sin user/pass → mala config crítica. |  🔴  |
| `AUTH-02` | Credenciales por defecto                  | `mosquitto_sub -h <target> -u admin -P admin -t '#' -d` | Probar pares por defecto del broker. No deberían funcionar.                                           |  🟠  |
| `AUTH-03` | Fuerza bruta de credenciales              | `hydra -L users.txt -P pass.txt <target> mqtt`          | El broker debería bloquear/limitar intentos. Credenciales débiles = hallazgo.                         |  🟠  |
| `AUTH-04` | TLS — puerto sin cifrar abierto           | `nmap -p 1883 <target>`                                 | Idealmente solo 8883/TLS. Tráfico en claro en 1883 expone credenciales y datos.                       |  🟠  |
| `AUTH-05` | TLS — exigencia de certificado de cliente | `openssl s_client -connect <target>:8883`               | Verificar versión TLS, validez del cert del servidor y si se exige cert de cliente (mTLS).            |  🟡  |

***

## 03 - Autorización / ACL

> Lo más jugoso: control de acceso a topics.

| ID         | Prueba                                        | Comando / Herramienta                                    | Resultado esperado                                                                          | Sev. |
| ---------- | --------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------- | :--: |
| `AUTHZ-01` | Suscripción a wildcard total `#`              | `mosquitto_sub -h <target> -t '#' -d`                    | Si vuelca **todos** los topics sin restricción → fuga masiva de información.                |  🔴  |
| `AUTHZ-02` | Enumeración de topics de sistema `$SYS/#`     | `mosquitto_sub -h <target> -t '$SYS/#' -d`               | Expone métricas, nº de clientes, versión y uptime. No debería ser público.                  |  🟡  |
| `AUTHZ-03` | Publicar en topic sin autorización            | `mosquitto_pub -h <target> -t casa/luz/comando -m "OFF"` | Si un usuario no autorizado puede publicar, puede inyectar comandos y alterar dispositivos. |  🔴  |
| `AUTHZ-04` | Acceso cruzado a topics de otros dispositivos | `mosquitto_sub -h <target> -t 'devices/+/data' -d`       | Un cliente no debería leer datos de dispositivos ajenos vía wildcards.                      |  🟠  |
| `AUTHZ-05` | Segregación lectura/escritura                 | `mosquitto_pub -u readonly -P *** -t test -m x`          | Un usuario de solo-lectura no debe poder publicar (y viceversa).                            |  🟡  |

***

## 04 - Confidencialidad

> Interceptación y fuga de datos.

| ID        | Prueba                                   | Comando / Herramienta                         | Resultado esperado                                                                   | Sev. |
| --------- | ---------------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------ | :--: |
| `DATA-01` | Captura de mensajes retenidos (retained) | `mosquitto_sub -h <target> -t '#' -d`         | Los retained suelen contener el último estado, tokens o credenciales al suscribirse. |  🟠  |
| `DATA-02` | Análisis de payload sensible             | Inspeccionar contenido de mensajes capturados | Buscar datos en claro: credenciales, tokens, PII, coordenadas GPS, claves API.       |  🟠  |
| `DATA-03` | Sniffing de tráfico en claro             | Wireshark → filtro `mqtt` (puerto 1883)       | Si el tráfico no va cifrado, todo el contenido es legible en la red.                 |  🟠  |

***

## 05 - Integridad / Inyección

> Manipulación de mensajes y topics.

| ID       | Prueba                              | Comando / Herramienta                                    | Resultado esperado                                                                     | Sev. |
| -------- | ----------------------------------- | -------------------------------------------------------- | -------------------------------------------------------------------------------------- | :--: |
| `INJ-01` | Inyección de comandos en actuadores | `mosquitto_pub -h <target> -t home/lock/cmd -m "UNLOCK"` | Comprobar si se puede manipular el estado físico de un dispositivo (cerradura, relé…). |  🔴  |
| `INJ-02` | Topic hijacking / suplantación      | Publicar en el topic de un dispositivo legítimo          | Suplantar a otro dispositivo. El broker no valida el origen del mensaje.               |  🟠  |
| `INJ-03` | Topic / payload malformado          | `mosquitto_pub -h <target> -t 'a/../#' -m '{"x":'`       | Los topics son strings sin validación: probar caracteres especiales y JSON roto.       |  🟡  |

***

## 06 - Disponibilidad / DoS

> ⚠Solo con autorización explícita — estas pruebas pueden tumbar el servicio.

| ID       | Prueba                             | Comando / Herramienta                                           | Resultado esperado                                                     | Sev. |
| -------- | ---------------------------------- | --------------------------------------------------------------- | ---------------------------------------------------------------------- | :--: |
| `DOS-01` | Flood de conexiones                | Múltiples `CONNECT` en bucle hasta agotar recursos              | Saturar CPU/memoria del broker hasta desconectar a clientes legítimos. |  🟠  |
| `DOS-02` | Flood de publicaciones en un topic | Bucle de `PUBLISH` a alta frecuencia                            | Inundar un topic para degradar el servicio a los suscriptores.         |  🟠  |
| `DOS-03` | Client ID duplicado                | Conectar repetidamente con el `clientId` de un dispositivo real | Forzar la desconexión continua del dispositivo legítimo.               |  🟡  |
| `DOS-04` | Payload sobredimensionado          | `mosquitto_pub -h <target> -t test -f payload_grande.bin`       | Ver si payloads enormes/malformados tumban o degradan el broker.       |  🟡  |

***

## 07 - Vulnerabilidades conocidas

> Cruce con CVEs según la versión del broker.

| ID       | Prueba                             | Comando / Herramienta                                      | Resultado esperado                                                                           | Sev. |
| -------- | ---------------------------------- | ---------------------------------------------------------- | -------------------------------------------------------------------------------------------- | :--: |
| `CVE-01` | Cruzar versión del broker con CVEs | Usar la versión obtenida en `RECON-03`                     | Ej.: CVE-2023-28366 (fuga de memoria con QoS 2), CVE-2020-11976 (buffer overflow → RCE/DoS). |  🟠  |
| `CVE-02` | Mensajes QoS 2 malformados         | Probar secuencias QoS 2 anómalas (si el broker lo soporta) | Verificar manejo de QoS 2 frente a fugas de memoria conocidas.                               |  🟡  |

***

## Si el objetivo es AWS IoT Core

Buena parte de los ataques clásicos **no aplican igual**, porque AWS fuerza mTLS con certificados X.509 y permisos por IoT Policy:

* **No hay acceso anónimo ni brute-force user/pass.** La autenticación es por certificado X.509 (mTLS). El foco pasa a la **gestión de certificados**: ¿se reutilizan entre dispositivos?, ¿la revocación funciona?, ¿hay certs huérfanos activos?
* **El control de acceso son IoT Policies**, no ACLs sueltas. Audita policies demasiado permisivas: `iot:*` o recursos `topic/*`.
* **Test estrella:** verificar que la policy use variables como `${iot:Connection.Thing.ThingName}` para que un dispositivo no pueda publicar/suscribirse en topics de otro.
* `$SYS/#` y el wildcard `#` suelen estar restringidos. Los topics sensibles a vigilar son los reservados `$aws/things/<thing>/shadow/...` (Device Shadow).
* **Límites del broker:** solo soporta **QoS 0 y 1** (no QoS 2) y un payload máximo de **128 KB** (rechazo con `PAYLOAD_LIMIT_EXCEEDED`).

***

### Toolkit

| Herramienta           | Uso                                                         |
| --------------------- | ----------------------------------------------------------- |
| **mosquitto-clients** | `mosquitto_sub` / `mosquitto_pub` — cliente base de pub/sub |
| **nmap**              | Scripts `mqtt-subscribe`, detección de versión y servicio   |
| **MQTT-PWN**          | Brute-force, enumerador de topics y módulos de explotación  |
| **Hydra**             | Fuerza bruta de credenciales sobre el broker                |
| **Wireshark**         | Sniffing de tráfico en claro (puerto 1883)                  |
| **Shodan**            | Recon externo de brokers expuestos: `port:1883 MQTT`        |


---

# 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://eldeim.gitbook.io/brain_fuck/notes/pentesting-methodology/mqtt-pentesting.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.
