2024-02-10 21:30:13 +00:00
# 1883 - MQTT (Mosquitto) 펜테스팅
2022-04-28 16:01:33 +00:00
< details >
2024-02-10 21:30:13 +00:00
< summary > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > 를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요< strong > !< / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-02-10 21:30:13 +00:00
HackTricks를 지원하는 다른 방법:
2022-04-28 16:01:33 +00:00
2024-02-10 21:30:13 +00:00
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS** ](https://github.com/sponsors/carlospolop )를 확인하세요!
* [**공식 PEASS & HackTricks 스웨그** ](https://peass.creator-spring.com )를 얻으세요.
* [**The PEASS Family** ](https://opensea.io/collection/the-peass-family )를 발견하세요. 독점적인 [**NFTs** ](https://opensea.io/collection/the-peass-family ) 컬렉션입니다.
* 💬 [**Discord 그룹** ](https://discord.gg/hRep4RUj7f ) 또는 [**텔레그램 그룹** ](https://t.me/peass )에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm** ](https://twitter.com/hacktricks_live )**를** **팔로우**하세요.
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
2022-04-28 16:01:33 +00:00
< / details >
2024-02-10 21:30:13 +00:00
## 기본 정보
2020-07-15 15:43:14 +00:00
2024-02-10 21:30:13 +00:00
**MQ Telemetry Transport (MQTT)**는 **게시/구독 메시징 프로토콜**로 알려져 있으며 극도로 간단하고 가벼움이 특징입니다. 이 프로토콜은 기기의 능력이 제한되어 있고 대역폭이 낮거나 지연이 크거나 신뢰할 수 없는 연결로 특징 지어지는 환경에 특화되어 있습니다. MQTT의 핵심 목표는 네트워크 대역폭 사용을 최소화하고 기기 자원에 대한 수요를 줄이는 것입니다. 또한 신뢰할 수 있는 통신을 유지하고 일정한 수준의 전달 보장을 제공하는 것을 목표로 합니다. 이러한 목표로 인해 MQTT는 **기계 간 통신 (M2M) 및 사물 인터넷 (IoT)** 분야에 특히 적합하며, 다양한 기기를 효율적으로 연결하는 것이 필수적입니다. 또한 MQTT는 대역폭과 배터리 수명을 절약하는 것이 중요한 모바일 애플리케이션에 매우 유용합니다.
2020-07-15 15:43:14 +00:00
2024-02-10 21:30:13 +00:00
**기본 포트:** 1883
2021-10-18 11:21:18 +00:00
```
2020-09-24 18:58:31 +00:00
PORT STATE SERVICE REASON
1883/tcp open mosquitto version 1.4.8 syn-ack
```
2024-02-10 21:30:13 +00:00
## 트래픽 검사
2020-09-24 18:58:31 +00:00
2024-02-10 21:30:13 +00:00
MQTT 브로커가 **CONNECT** 패킷을 받으면, **CONNACK** 패킷이 반환됩니다. 이 패킷에는 연결 상태를 이해하는 데 중요한 반환 코드가 포함되어 있습니다. 반환 코드 **0x00**은 자격 증명이 수락되었음을 나타내며, 성공적인 연결을 의미합니다. 반면에 반환 코드 **0x05**는 자격 증명이 잘못되어 연결이 거부되었음을 나타냅니다.
2024-02-08 21:36:35 +00:00
2024-02-10 21:30:13 +00:00
예를 들어, 브로커가 잘못된 자격 증명으로 인해 연결을 거부하는 경우, 시나리오는 다음과 같을 것입니다:
2024-02-08 21:36:35 +00:00
```
{
2024-02-10 21:30:13 +00:00
"returnCode": "0x05",
"description": "Connection Refused, not authorized"
2024-02-08 21:36:35 +00:00
}
```
2022-03-09 12:12:51 +00:00
![](< .. / . gitbook / assets / image ( 645 ) ( 1 ) . png > )
2022-02-19 19:42:58 +00:00
2024-02-10 21:30:13 +00:00
### [**MQTT 무차별 대입 공격**](../generic-methodologies-and-resources/brute-force.md#mqtt)
2020-07-15 15:43:14 +00:00
2024-02-10 21:30:13 +00:00
## MQTT 펜테스팅
2020-07-15 15:43:14 +00:00
2024-02-10 21:30:13 +00:00
**인증은 완전히 선택 사항**이며, 인증이 수행되더라도 **기본적으로 암호화가 사용되지 않습니다** (자격 증명은 평문으로 전송됩니다). MITM 공격을 통해 비밀번호를 도용할 수 있습니다.
2020-07-15 15:43:14 +00:00
2024-02-10 21:30:13 +00:00
MQTT 서비스에 연결하려면 다음을 사용할 수 있습니다: [https://github.com/bapowell/python-mqtt-client-shell ](https://github.com/bapowell/python-mqtt-client-shell ) 및 다음을 수행하여 모든 주제에 대해 구독할 수 있습니다:
2021-10-18 11:21:18 +00:00
```
2020-07-15 15:43:14 +00:00
> 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/#"
```
2024-02-10 21:30:13 +00:00
[**https://github.com/akamai-threat-research/mqtt-pwn** ](https://github.com/akamai-threat-research/mqtt-pwn )을 사용할 수도 있습니다.
2020-07-15 15:43:14 +00:00
2024-02-10 21:30:13 +00:00
또한 다음을 사용할 수도 있습니다:
2022-02-19 19:42:58 +00:00
```bash
apt-get install mosquitto mosquitto-clients
mosquitto_sub -t 'test/topic' -v #Subscriribe to 'test/topic'
```
2024-02-10 21:30:13 +00:00
또는 다음 코드를 실행하여 인증 없이 MQTT 서비스에 연결을 시도하고 모든 주제를 구독하고 듣을 수 있습니다:
2020-07-15 15:43:14 +00:00
2024-02-10 21:30:13 +00:00
```python
import paho.mqtt.client as mqtt
2020-07-15 15:43:14 +00:00
2024-02-10 21:30:13 +00:00
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 서비스에 연결되고 모든 주제를 구독하여 메시지를 수신합니다.
2020-07-15 15:43:14 +00:00
```python
#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):
2024-02-10 21:30:13 +00:00
client.subscribe('#', qos=1)
client.subscribe('$SYS/#')
2020-07-15 15:43:14 +00:00
def on_message(client, userdata, message):
2024-02-10 21:30:13 +00:00
print('Topic: %s | QOS: %s | Message: %s' % (message.topic, message.qos, message.payload))
2020-07-15 15:43:14 +00:00
def main():
2024-02-10 21:30:13 +00:00
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()
2020-07-15 15:43:14 +00:00
if __name__ == "__main__":
2024-02-10 21:30:13 +00:00
main()
2020-07-15 15:43:14 +00:00
```
2024-02-10 21:30:13 +00:00
## 추가 정보
2020-07-15 15:43:14 +00:00
2024-02-10 21:30:13 +00:00
여기에서 확인하세요: [https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b ](https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b )
2020-07-15 15:43:14 +00:00
2024-02-10 21:30:13 +00:00
### 발행/구독 패턴 <a href="#b667" id="b667"></a>
2020-07-15 15:43:14 +00:00
2024-02-10 21:30:13 +00:00
발행/구독 모델은 다음으로 구성됩니다:
2020-07-15 15:43:14 +00:00
2024-02-10 21:30:13 +00:00
* **발행자**: 브로커의 하나(또는 여러 개)의 주제에 메시지를 발행합니다.
* **구독자**: 브로커의 하나(또는 여러 개)의 주제를 구독하고 발행자로부터 전송된 모든 메시지를 수신합니다.
* **브로커**: 발행자로부터 수신한 모든 메시지를 구독자로 라우팅합니다.
* **주제**: 하나 이상의 수준으로 구성되며 슬래시(/)로 구분됩니다 (예: /smartshouse/livingroom/temperature).
2020-07-15 15:43:14 +00:00
2024-02-10 21:30:13 +00:00
### 패킷 형식 <a href="#f15a" id="f15a"></a>
2020-07-15 15:43:14 +00:00
2024-02-10 21:30:13 +00:00
모든 MQTT 패킷은 고정 헤더를 포함합니다 (그림 02). 그림 02: 고정 헤더
2020-07-15 15:43:14 +00:00
2024-02-08 21:36:35 +00:00
![https://miro.medium.com/max/838/1\*k6RkAHEk0576geQGUcKSTA.png ](https://miro.medium.com/max/838/1\*k6RkAHEk0576geQGUcKSTA.png )
2024-02-10 21:30:13 +00:00
### 패킷 유형
* 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라는 두 값은 예약되어 있으며 사용이 금지되어 있습니다.
2020-09-21 23:14:27 +00:00
2022-08-12 14:24:34 +00:00
## Shodan
2020-09-21 23:14:27 +00:00
* `port:1883 MQTT`
2022-04-28 16:01:33 +00:00
< details >
2024-02-10 21:30:13 +00:00
< summary > < strong > htARTE (HackTricks AWS Red Team Expert)< / strong > 를 통해 제로에서 영웅까지 AWS 해킹 배우기< strong > !< / strong > < / summary >
2022-04-28 16:01:33 +00:00
2024-02-10 21:30:13 +00:00
HackTricks를 지원하는 다른 방법:
2022-04-28 16:01:33 +00:00
2024-02-10 21:30:13 +00:00
* HackTricks에서 **회사를 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS** ](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스웨그** ](https://peass.creator-spring.com )를 얻으세요.
* [**The PEASS Family** ](https://opensea.io/collection/the-peass-family )를 발견하세요. 독점적인 [**NFTs** ](https://opensea.io/collection/the-peass-family ) 컬렉션입니다.
* 💬 [**Discord 그룹** ](https://discord.gg/hRep4RUj7f ) 또는 [**텔레그램 그룹** ](https://t.me/peass )에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm** ](https://twitter.com/hacktricks_live )를 **팔로우**하세요.
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
2022-04-28 16:01:33 +00:00
< / details >