1883 - Pentesting MQTT (Mosquitto)

htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요!

HackTricks를 지원하는 다른 방법:

WhiteIntel다크 웹을 기반으로 한 검색 엔진으로, 스틸러 악성 소프트웨어에 의해 회사나 고객이 침해당했는지 무료로 확인할 수 있는 기능을 제공합니다.

WhiteIntel의 주요 목표는 정보를 훔치는 악성 소프트웨어로 인한 계정 탈취와 랜섬웨어 공격을 막는 것입니다.

그들의 웹사이트를 방문하여 엔진을 무료로 시험해 볼 수 있습니다:


기본 정보

**MQ Telemetry Transport (MQTT)**는 발행/구독 메시징 프로토콜로, 극도로 간단함과 가벼움으로 눈에 띕니다. 이 프로토콜은 기기가 제한된 기능을 가지고 있고 대역폭이 낮거나 지연이 크거나 신뢰할 수 없는 연결로 특징 지어지는 네트워크에서 작동하는 환경에 특별히 맞춰져 있습니다. MQTT의 핵심 목표는 네트워크 대역폭 사용을 최소화하고 기기 자원에 대한 수요를 줄이는 것입니다. 또한 신뢰할 수 있는 통신을 유지하고 일정 수준의 전달 보증을 제공하는 것을 목표로 합니다. 이러한 목표로 MQTT는 기기 간 통신(M2M)사물 인터넷(IoT) 분야에 매우 적합하며, 효율적으로 다양한 기기를 연결하는 것이 중요한 곳에서 사용됩니다. 또한 대역폭과 배터리 수명을 보존하는 것이 중요한 모바일 애플리케이션에 매우 유용합니다.

기본 포트: 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 펜테스팅

인증은 완전히 선택 사항이며 심지어 인증이 수행 중이더라도 기본적으로 암호화가 사용되지 않습니다(자격 증명은 평문으로 전송됨). 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

발행/구독 패턴

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

  • 발행자(Publisher): 브로커의 하나(또는 여러 개)의 주제에 메시지를 발행합니다.

  • 구독자(Subscriber): 브로커의 하나(또는 여러 개)의 주제를 구독하고 발행자로부터 보낸 모든 메시지를 수신합니다.

  • 브로커(Broker): 발행자로부터 수신한 모든 메시지를 구독자에게 라우팅합니다.

  • 주제(Topic): 슬래시(/)로 구분된 하나 이상의 수준으로 구성됩니다 (예: /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라는 두 값은 예약되어 있으며 사용이 금지되어 있습니다.

Shodan

  • port:1883 MQTT

WhiteIntel다크 웹을 통해 제공되는 검색 엔진으로, 회사 또는 그 고객이 스틸러 악성 소프트웨어에 의해 침해당했는지 확인하는 무료 기능을 제공합니다.

WhiteIntel의 주요 목표는 정보 도난 악성 소프트웨어로 인한 계정 탈취 및 랜섬웨어 공격을 막는 것입니다.

그들의 웹사이트를 방문하여 무료로 엔진을 시도해 볼 수 있습니다:

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로**부터 **히어로**까지 AWS 해킹을 배우세요!

HackTricks를 지원하는 다른 방법:

Last updated