8 KiB
1883 - Pentesting MQTT (Mosquitto)
Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si deseas ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén la merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Información Básica
MQ Telemetry Transport (MQTT) es conocido como un protocolo de mensajería de publicación/suscripción que destaca por su extrema simplicidad y ligereza. Este protocolo está específicamente diseñado para entornos donde los dispositivos tienen capacidades limitadas y operan en redes caracterizadas por ancho de banda reducido, alta latencia o conexiones poco confiables. Los objetivos principales de MQTT incluyen minimizar el uso de ancho de banda de red y reducir la demanda de recursos del dispositivo. Además, tiene como objetivo mantener una comunicación confiable y proporcionar un cierto nivel de garantía de entrega. Estos objetivos hacen que MQTT sea excepcionalmente adecuado para el creciente campo de comunicación máquina a máquina (M2M) y el Internet de las cosas (IoT), donde es esencial conectar eficientemente una gran cantidad de dispositivos. Además, MQTT es altamente beneficioso para aplicaciones móviles, donde conservar el ancho de banda y la vida útil de la batería es crucial.
Puerto predeterminado: 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, evitando 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"
}
Ataque de Fuerza Bruta MQTT
Pentesting MQTT
La autenticación es totalmente opcional y aunque se realice la autenticación, por defecto no se utiliza encriptación (las credenciales se envían en texto claro). Los ataques de MITM aún pueden ser ejecutados 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
apt-get install mosquitto mosquitto-clients
mosquitto_sub -t 'test/topic' -v #Subscriribe to 'test/topic'
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
desde aquí: https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b
El Patrón Publicar/Suscribir
El modelo de publicar/suscribir se compone de:
- Editor: 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 editor.
- Broker: enruta todos los mensajes de los editores a los suscriptores.
- Tema: consiste en uno o más niveles que están separados por una barra inclinada (por ejemplo, /casainteligente/sala/temperatura).
Formato del Paquete
Cada paquete MQTT contiene un encabezado fijo (Figura 02).Figura 02: Encabezado Fijo
Tipos de Paquetes
- CONNECT (1): Iniciado por el cliente para solicitar una conexión al servidor.
- CONNACK (2): Confirmación del servidor de una conexión exitosa.
- PUBLISH (3): Se utiliza para enviar un mensaje del cliente al servidor o viceversa.
- PUBACK (4): Confirmación de un paquete PUBLISH.
- PUBREC (5): Parte de un protocolo de entrega de mensajes que garantiza que el mensaje sea recibido.
- PUBREL (6): Garantía adicional en la entrega de mensajes, indicando una liberación de mensaje.
- PUBCOMP (7): Parte final del protocolo de entrega de mensajes, indicando la finalización.
- SUBSCRIBE (8): Solicitud de un cliente para escuchar mensajes de un tema.
- SUBACK (9): Confirmación del servidor de una solicitud de SUBSCRIBE.
- UNSUBSCRIBE (10): Solicitud de un cliente para dejar de recibir mensajes de un tema.
- UNSUBACK (11): Respuesta del servidor a una solicitud de UNSUBSCRIBE.
- 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.
- Se prohíbe el uso de dos valores, 0 y 15, marcados como reservados.
Shodan
port:1883 MQTT
Aprende hacking de AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si deseas ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén el oficial PEASS & HackTricks swag
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.