9.1 KiB
1883 - MQTT(Mosquitto)のペンテスト
**htARTE(HackTricks AWS Red Team Expert)**で**ゼロからヒーローまでAWSハッキングを学ぶ** こちら!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝したい場合やHackTricksをPDFでダウンロードしたい場合は、サブスクリプションプランをチェックしてください!
- 公式PEASS&HackTricksグッズを入手する
- The PEASS Familyを発見し、独占的なNFTのコレクションを見る
- 💬 Discordグループに参加するか、Telegramグループに参加するか、Twitter 🐦 @carlospolopmをフォローする
- HackTricksとHackTricks CloudのGitHubリポジトリにPRを提出して、あなたのハッキングテクニックを共有する
基本情報
**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のPentesting
認証は完全にオプションであり、認証が行われていてもデフォルトでは暗号化されていません(資格情報は平文で送信されます)。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 #Subscribe to 'test/topic'
mosquitto_sub -h <host-ip> -t "#" -v #Subscribe to ALL topics.
または、このコードを実行して、認証なしで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: 固定ヘッダー
パケットタイプ
- 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
ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)!
HackTricksをサポートする他の方法:
- HackTricksで企業を宣伝したい、またはHackTricksをPDFでダウンロードしたい場合は、SUBSCRIPTION PLANSをチェックしてください!
- 公式PEASS&HackTricksスワッグを手に入れる
- The PEASS Familyを発見し、独占的なNFTsコレクションを見つける
- 💬 Discordグループまたはtelegramグループに参加するか、Twitter 🐦 @carlospolopmをフォローする
- HackTricksとHackTricks CloudのgithubリポジトリにPRを提出して、あなたのハッキングトリックを共有してください。