8.1 KiB
1883 - MQTT (Mosquitto) 펜테스팅
htARTE (HackTricks AWS Red Team Expert)에서 AWS 해킹을 처음부터 전문가까지 배우세요!
HackTricks를 지원하는 다른 방법:
- 회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드하고 싶다면 구독 요금제를 확인하세요!
- 공식 PEASS & HackTricks 스왜그를 구매하세요
- The PEASS Family를 발견하세요, 당사의 독점 NFTs 컬렉션
- 💬 디스코드 그룹 또는 텔레그램 그룹에 가입하거나 트위터 🐦 @carlospolopm를 팔로우하세요.
- HackTricks 및 HackTricks Cloud github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.
기본 정보
**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"
}
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
발행/구독 패턴
발행/구독 모델은 다음으로 구성됩니다:
- 발행자(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
htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅까지 AWS 해킹을 배우세요
HackTricks를 지원하는 다른 방법:
- 회사를 HackTricks에서 광고하거나 PDF로 HackTricks를 다운로드하려면 SUBSCRIPTION PLANS를 확인하세요!
- 공식 PEASS & HackTricks 스왜그를 구입하세요
- The PEASS Family를 발견하세요, 당사의 독점 NFTs 컬렉션
- 💬 디스코드 그룹 또는 텔레그램 그룹에 가입하거나 트위터 🐦 @carlospolopm를 팔로우하세요.
- HackTricks 및 HackTricks Cloud github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.