hacktricks/network-services-pentesting/1883-pentesting-mqtt-mosquitto.md
2024-02-10 21:30:13 +00:00

8.5 KiB

1883 - MQTT (Mosquitto) 펜테스팅

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

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"
}

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 서비스에 연결을 시도하고 모든 주제를 구독하고 듣을 수 있습니다:

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("#")

def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("mqtt.example.com", 1883, 60)

client.loop_forever()

위의 코드를 실행하면 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

발행/구독 패턴

발행/구독 모델은 다음으로 구성됩니다:

  • 발행자: 브로커의 하나(또는 여러 개)의 주제에 메시지를 발행합니다.
  • 구독자: 브로커의 하나(또는 여러 개)의 주제를 구독하고 발행자로부터 전송된 모든 메시지를 수신합니다.
  • 브로커: 발행자로부터 수신한 모든 메시지를 구독자로 라우팅합니다.
  • 주제: 하나 이상의 수준으로 구성되며 슬래시(/)로 구분됩니다 (예: /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라는 두 값은 예약되어 있으며 사용이 금지되어 있습니다.

Shodan

  • port:1883 MQTT
htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 영웅까지 AWS 해킹 배우기!

HackTricks를 지원하는 다른 방법: