9.3 KiB
1883 - Pentesting MQTT (Mosquitto)
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
WhiteIntel
WhiteIntel es un motor de búsqueda alimentado por la dark-web que ofrece funcionalidades gratuitas para verificar si una empresa o sus clientes han sido comprometidos por malwares robadores.
Su objetivo principal de WhiteIntel es combatir la toma de cuentas y los ataques de ransomware resultantes de malware que roba información.
Puedes visitar su sitio web y probar su motor de forma gratuita en:
{% embed url="https://whiteintel.io" %}
Información Básica
MQ Telemetry Transport (MQTT) es conocido como un protocolo de mensajería de publicación/suscripción que se destaca por su extrema simplicidad y ligereza. Este protocolo está específicamente diseñado para entornos donde los dispositivos tienen capacidades limitadas y operan sobre redes caracterizadas por un bajo ancho de banda, alta latencia o conexiones poco fiables. Los objetivos principales de MQTT incluyen minimizar el uso del ancho de banda de la red y reducir la demanda sobre los recursos del dispositivo. Además, busca mantener una comunicación fiable y proporcionar un cierto nivel de garantía de entrega. Estos objetivos hacen que MQTT sea excepcionalmente adecuado para el creciente campo de la comunicación máquina a máquina (M2M) y el Internet de las Cosas (IoT), donde es esencial conectar una multitud de dispositivos de manera eficiente. Además, MQTT es muy beneficioso para aplicaciones móviles, donde conservar el ancho de banda y la vida de la batería es crucial.
Puerto por defecto: 1883
PORT STATE SERVICE REASON
1883/tcp open mosquitto version 1.4.8 syn-ack
Inspeccionando el tráfico
Cuando un paquete CONNECT es recibido por los brokers MQTT, se envía de vuelta un paquete CONNACK. Este paquete contiene un código de retorno que es crucial para entender el estado de la conexión. Un código de retorno de 0x00 significa que las credenciales han sido aceptadas, lo que indica una conexión exitosa. Por otro lado, un código de retorno de 0x05 señala que las credenciales son inválidas, impidiendo así la conexión.
Por ejemplo, si el broker rechaza la conexión debido a credenciales inválidas, el escenario se vería algo así:
{
"returnCode": "0x05",
"description": "Connection Refused, not authorized"
}
Fuerza Bruta MQTT
Pentesting MQTT
La autenticación es totalmente opcional y, incluso si se está realizando autenticación, la encriptación no se utiliza por defecto (las credenciales se envían en texto claro). Los ataques MITM aún se pueden ejecutar para robar contraseñas.
Para conectarte a un servicio MQTT, puedes usar: https://github.com/bapowell/python-mqtt-client-shell y suscribirte a todos los temas haciendo:
> connect (NOTICE that you need to indicate before this the params of the connection, by default 127.0.0.1:1883)
> subscribe "#" 1
> subscribe "$SYS/#"
También puedes usar https://github.com/akamai-threat-research/mqtt-pwn
También puedes usar:
apt-get install mosquitto mosquitto-clients
mosquitto_sub -t 'test/topic' -v #Subscribe to 'test/topic'
mosquitto_sub -h <host-ip> -t "#" -v #Subscribe to ALL topics.
O puedes ejecutar este código para intentar conectarte a un servicio MQTT sin autenticación, suscribirte a todos los temas y escucharlos:
#This is a modified version of https://github.com/Warflop/IOT-MQTT-Exploit/blob/master/mqtt.py
import paho.mqtt.client as mqtt
import time
import os
HOST = "127.0.0.1"
PORT = 1883
def on_connect(client, userdata, flags, rc):
client.subscribe('#', qos=1)
client.subscribe('$SYS/#')
def on_message(client, userdata, message):
print('Topic: %s | QOS: %s | Message: %s' % (message.topic, message.qos, message.payload))
def main():
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(HOST, PORT)
client.loop_start()
#time.sleep(10)
#client.loop_stop()
if __name__ == "__main__":
main()
Más información
from here: https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b
El patrón Publicar/Suscribir
El modelo de publicar/suscribir se compone de:
- Publicador: publica un mensaje en uno (o varios) tema(s) en el broker.
- Suscriptor: se suscribe a uno (o varios) tema(s) en el broker y recibe todos los mensajes enviados por el publicador.
- Broker: enruta todos los mensajes de los publicadores a los suscriptores.
- Tema: consiste en uno o más niveles que están separados por una barra diagonal (por ejemplo, /smartshouse/livingroom/temperature).
Formato de Paquete
Cada paquete MQTT contiene un encabezado fijo (Figura 02).Figura 02: Encabezado Fijo
Tipos de Paquete
- CONNECT (1): Iniciado por el cliente para solicitar una conexión al servidor.
- CONNACK (2): El reconocimiento del servidor de una conexión exitosa.
- PUBLISH (3): Utilizado para enviar un mensaje del cliente al servidor o viceversa.
- PUBACK (4): Reconocimiento de un paquete PUBLISH.
- PUBREC (5): Parte de un protocolo de entrega de mensajes que asegura que el mensaje sea recibido.
- PUBREL (6): Aseguramiento adicional en la entrega de mensajes, indicando una liberación de mensaje.
- PUBCOMP (7): Parte final del protocolo de entrega de mensajes, indicando finalización.
- SUBSCRIBE (8): Solicitud de un cliente para escuchar mensajes de un tema.
- SUBACK (9): El reconocimiento del servidor de una solicitud de SUSCRIPCIÓN.
- UNSUBSCRIBE (10): Solicitud de un cliente para dejar de recibir mensajes de un tema.
- UNSUBACK (11): La respuesta del servidor a una solicitud de CANCELACIÓN DE SUSCRIPCIÓN.
- PINGREQ (12): Un mensaje de latido enviado por el cliente.
- PINGRESP (13): Respuesta del servidor al mensaje de latido.
- DISCONNECT (14): Iniciado por el cliente para terminar la conexión.
- Dos valores, 0 y 15, están marcados como reservados y su uso está prohibido.
Shodan
port:1883 MQTT
WhiteIntel
WhiteIntel es un motor de búsqueda alimentado por la dark-web que ofrece funcionalidades gratuitas para verificar si una empresa o sus clientes han sido comprometidos por malware robador.
Su objetivo principal de WhiteIntel es combatir la toma de control de cuentas y ataques de ransomware resultantes de malware que roba información.
Puedes visitar su sitio web y probar su motor de forma gratuita en:
{% embed url="https://whiteintel.io" %}
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.