hacktricks/network-services-pentesting/1883-pentesting-mqtt-mosquitto.md

9 KiB
Raw Blame History

1883 - Pentesting MQTT (Mosquitto)

ゼロからヒーローまでAWSハッキングを学ぶ htARTEHackTricks AWS Red Team Expert

HackTricksをサポートする他の方法

基本情報

MQ Telemetry Transport (MQTT) は、極めてシンプルで軽量な特性で知られる パブリッシュ/サブスクライブメッセージングプロトコル です。このプロトコルは、デバイスが能力が限られており、低帯域幅、高遅延、または信頼性の低い接続が特徴のネットワーク上で動作する環境に特化しています。MQTTの主な目標は、ネットワーク帯域幅の使用を最小限に抑え、デバイスリソースの需要を削減することです。さらに、信頼性のある通信を維持し、一定レベルの配信保証を提供することを目指しています。これらの目標により、MQTTは 機械間通信M2M および のインターネットIoT の急成長分野に非常に適しており、効率的に多くのデバイスを接続することが不可欠です。さらに、MQTTは、帯域幅とバッテリー寿命を節約することが重要なモバイルアプリケーションにも非常に有益です。

デフォルトポート: 1883

PORT     STATE SERVICE                 REASON
1883/tcp open  mosquitto version 1.4.8 syn-ack

トラフィックの検査

MQTTブローカーがCONNECTパケットを受信すると、CONNACKパケットが返されます。このパケットには接続状態を理解するために重要な戻りコードが含まれています。0x00の戻りコードは、資格情報が受け入れられたことを示し、成功した接続を意味します。一方、0x05の戻りコードは、資格情報が無効であることを示し、したがって接続を防ぎます。

たとえば、ブローカーが無効な資格情報のために接続を拒否する場合、シナリオは次のようになります:

{
"returnCode": "0x05",
"description": "Connection Refused, not authorized"
}

Brute-Force MQTT

MQTTのペンテスト

認証は完全にオプションであり、認証が行われていてもデフォルトでは暗号化されていません資格情報は平文で送信されます。MITM攻撃は依然として実行可能で、パスワードを盗むことができます。

MQTTサービスに接続するには、https://github.com/bapowell/python-mqtt-client-shellを使用し、次のようにすべてのトピックに自分自身をサブスクライブできます:

> 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/#"

あなたはhttps://github.com/akamai-threat-research/mqtt-pwnを使用することもできます。

apt-get install mosquitto mosquitto-clients
mosquitto_sub -t 'test/topic' -v #Subscriribe to 'test/topic'

または、このコードを実行して、認証なしでMQTTサービスに接続し、すべてのトピックにサブスクライブしてリスンすることができます:

#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()

もっと情報

ここから: https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b

パブリッシュ/サブスクライブパターン

パブリッシュ/サブスクライブモデルは以下で構成されています:

  • パブリッシャー: メッセージをブローカー内の1つまたは複数のトピックに公開します。
  • サブスクライバー: ブローカー内の1つまたは複数のトピックに購読し、パブリッシャーから送信されたすべてのメッセージを受信します。
  • ブローカー: パブリッシャーからのすべてのメッセージをサブスクライバーにルーティングします。
  • トピック: 1つ以上のレベルで構成され、スラッシュ例: /smartshouse/livingroom/temperatureで区切られています。

パケット形式

すべてのMQTTパケットには固定ヘッダーが含まれています図02。図02: 固定ヘッダー

https://miro.medium.com/max/838/1*k6RkAHEk0576geQGUcKSTA.png

パケットタイプ

  • CONNECT (1): クライアントがサーバーへの接続を要求するためにイニシエートされます。
  • CONNACK (2): 成功した接続のサーバーの確認。
  • PUBLISH (3): クライアントからサーバー、またはその逆方向にメッセージを送信するために使用されます。
  • PUBACK (4): PUBLISHパケットの確認。
  • PUBREC (5): メッセージが受信されたことを確認するメッセージ配信プロトコルの一部。
  • PUBREL (6): メッセージ配信のさらなる確認で、メッセージリリースを示します。
  • PUBCOMP (7): メッセージ配信プロトコルの最終部分で、完了を示します。
  • SUBSCRIBE (8): クライアントがトピックからのメッセージを聞くためのリクエスト。
  • SUBACK (9): SUBSCRIBEリクエストのサーバーの確認。
  • UNSUBSCRIBE (10): クライアントがトピックからのメッセージの受信を停止するためのリクエスト。
  • UNSUBACK (11): UNSUBSCRIBEリクエストへのサーバーの応答。
  • PINGREQ (12): クライアントが送信するハートビートメッセージ。
  • PINGRESP (13): ハートビートメッセージへのサーバーの応答。
  • DISCONNECT (14): クライアントが接続を終了するためにイニシエートされます。
  • 0と15の2つの値は予約されており、使用が禁止されています。

Shodan

  • port:1883 MQTT
htARTEHackTricks AWS Red Team Expert を使って、ゼロからヒーローまでAWSハッキングを学ぶ

HackTricksをサポートする他の方法: