
CLI Rust pour le test d'intrusion MQTT : abonnement/publication, empreinte de broker, sondage ACL, énumération de topics, force brute d'identifiants et injection de Last Will via TLS/mTLS.
Un outil de test d'intrusion MQTT en ligne de commande basé sur Rust.
$ nix-shell
$ cargo build --release
Le binaire se trouve dans target/release/mqattack.
Nécessite Rust 1.80+, un compilateur C et les en-têtes de développement OpenSSL.
$ cargo build --release
Un paquet est disponible pour les utilisateurs de Nix ou NixOS. Gardez à l'esprit que les dernières versions peuvent n'être présentes que dans le canal unstable.
$ nix-env -iA nixos.mqattack
Toutes les commandes partagent un ensemble commun d'options de connexion et d'authentification :
Connection options:
-H, --host <HOST> Broker hostname or IP [default: localhost]
-p, --port <PORT> Broker port [default: 1883]
-u, --username <USER> Username
-P, --password <PASS> Password (mutually exclusive with --jwt)
--jwt <TOKEN> JWT token sent as MQTT password
--client-id <ID> MQTT client identifier [default: mqattack]
--keepalive <SECS> Keep-alive interval [default: 60]
TLS options:
--tls Enable TLS with system root CAs
--cafile <PATH> Custom CA certificate in PEM format (implies --tls)
--cert <PATH> Client certificate for mTLS in PEM format (requires --key)
--key <PATH> Client private key for mTLS in PEM format (requires --cert)
--insecure Disable certificate verification — for testing only
$ mqattack subscribe [OPTIONS] -t <TOPIC>...
-t, --topic <TOPIC> Topic filter, repeatable
-q, --qos <QOS> QoS level 0/1/2 [default: 0]
-C, --count <N> Exit after N messages
--hex Print payload as hexadecimal
# Subscribe to all topics
$ mqattack subscribe -t '#'
# Subscribe to multiple filters, exit after 5 messages
$ mqattack subscribe -t 'home/#' -t 'sensors/#' -C 5
# Plaintext with credentials
$ mqattack subscribe -H 192.168.1.10 -u admin -P secret -t '#'
# TLS using system root CAs (default port 8883)
$ mqattack subscribe --tls -H broker.example.com -p 8883 -t '#'
# TLS with a custom CA
$ mqattack subscribe --cafile ca.crt -H broker.example.com -p 8883 -t '#'
# mTLS with client certificate
$ mqattack subscribe --cert client.crt --key client.key --cafile ca.crt \
-H broker.example.com -p 8883 -t '#'
# JWT authentication over TLS
$ mqattack subscribe --tls --jwt 'eyJhbGci...' -H broker.example.com -p 8883 -t '#'
# Self-signed cert — skip verification
$ mqattack subscribe --insecure -H 192.168.1.10 -p 8883 -t '#'
# Collect for 5 seconds, print a grouped summary
$ mqattack sys-info -H 192.168.1.10
# Longer collection window
$ mqattack sys-info -H broker.example.com --tls -p 8883 -w 15
# Stream values live
$ mqattack sys-info -H 192.168.1.10 --live
$ mqattack publish [OPTIONS] -t <TOPIC> -m <MESSAGE>
-t, --topic <TOPIC> Target topic
-m, --message <MSG> Payload; use '-' to read from stdin
-q, --qos <QOS> QoS level 0/1/2 [default: 0]
-r, --retain Set the retain flag
# Publish a simple message
$ mqattack publish -t test/topic -m 'hello'
# Publish with QoS 1 and retain flag
$ mqattack publish -H 192.168.1.10 -t alerts/door -m 'open' -q 1 -r
# Pipe payload from stdin
$ echo '{"cmd":"reboot"}' | mqattack publish -t device/1/cmd -m -
# Publish over TLS with JWT
$ mqattack publish --tls --jwt 'eyJhbGci...' \
-H broker.example.com -p 8883 -t device/1/cmd -m 'reboot'
# mTLS publish
$ mqattack publish --cert client.crt --key client.key --cafile ca.crt \
-H broker.example.com -p 8883 -t test -m 'hello'
Identifier le logiciel et la version du broker en s'abonnant à $SYS/# et en analysant les messages collectés. Aucun paquet au-delà d'un SUBSCRIBE standard n'est envoyé — le broker se révèle à travers ce qu'il publie.
Brokers reconnus et leurs signaux de détection :
| Broker | Signal de détection |
|---|---|
| Mosquitto | La valeur de $SYS/broker/version commence par mosquitto version |
| HiveMQ | La valeur de $SYS/broker/version commence par HiveMQ |
| VerneMQ | La valeur de $SYS/broker/version commence par VerneMQ |
| EMQX | Topics sous $SYS/brokers/ (pluriel) ; nom du nœud extrait du chemin du topic |
| NanoMQ | Topics sous l'espace de noms $SYS/nanomq/ |
| RabbitMQ | La valeur de $SYS/broker/version contient rabbitmq |
La confiance est rapportée comme high lorsqu'une signature connue correspond, low lorsque $SYS/broker/version est présent mais non reconnu, et unknown lorsque $SYS est accessible mais ne fournit aucune information d'identification.
$ mqattack fingerprint [OPTIONS]
-w, --wait <SECS> Collection window in seconds [default: 5]
--verbose Print all collected $SYS messages after the summary
Exemples
# Fingerprint a broker on the default port
$ mqattack fingerprint -H 192.168.1.10
# Longer collection window for slow brokers, then dump everything
$ mqattack fingerprint -H 192.168.1.10 -w 10 --verbose
# Fingerprint over TLS with credentials
$ mqattack fingerprint --cafile ca.crt -H broker.example.com -p 8883 \
-u admin -P secret
Exemple de sortie (Mosquitto) :
[+] Broker Fingerprint
Software: Mosquitto
Version: 2.0.18
Confidence: high
Build info: With OpenSSL 3.0.2 15 Mar 2022
Uptime: 12345 seconds
Clients connected: 3
Clients total: 47
Messages received: 1082
Messages sent: 2341
[*] 47 $SYS message(s) collected (use --verbose to see all)
Sonder les permissions de subscribe et/ou publish pour un topic ou une liste de topics. Chaque test se connecte à nouveau au broker et inspecte le SubAck/PubAck retourné. Les résultats sont rapportés comme ALLOWED, DENIED, INCONCLUSIVE (aucun accusé de réception reçu), ou SKIPPED.
Note : les sondes de publish nécessitent QoS 1 ou 2 (
-q 1ou-q 2) pour obtenir un accusé de réception du broker. QoS 0 donne toujoursINCONCLUSIVEpour le publish.
$ mqattack check-acl [OPTIONS] (-t <TOPIC> | -w <FILE>)
-t, --topic <TOPIC> Single topic to probe (mutually exclusive with --wordlist)
-w, --wordlist <FILE> File with one topic per line (mutually exclusive with --topic)
--no-subscribe Skip subscribe permission tests
--no-publish Skip publish permission tests
--payload <TEXT> Payload used for publish probes [default: mqattack]
-q, --qos <QOS> QoS for publish probes (1 or 2) [default: 1]
--wait <SECS> Seconds to wait for a broker response per test [default: 5]
# Test a single topic (both subscribe and publish)
$ mqattack check-acl -H 192.168.1.10 -u admin -P secret -t 'home/lights/1'
# Test all topics from a wordlist, subscribe only
$ mqattack check-acl -H 192.168.1.10 -w topics.txt --no-publish
# Test publish permissions only with QoS 2
$ mqattack check-acl -H 192.168.1.10 -t 'cmd/device/1' --no-subscribe -q 2