在 MQTT 上使用 Scapy 创建客户端

Create a client by using Scapy on MQTT

我正在努力通过将 scapy 用于 MQTT 网络来创建合法客户端。我实现了 3 次握手和与 MQTT 代理的可能连接(代理完全正常工作,我用另一个客户端测试了它)。这是我的代码:

from scapy.contrib.mqtt import *
from scapy.all import send, sendp, IP, TCP, Ether, sr, sr1

seq = 12345
src='192.168.1.90'
dst='192.168.1.91'
sport = 1040
dport=1883

pkt=IP(src=src, dst=dst)   
SYN=pkt/TCP(sport=sport, dport=dport, flags="S")
SYNACK=sr1(SYN)
ACK=pkt/TCP(sport=sport, dport=dport, flags="A", seq=SYNACK.ack, ack=SYNACK.seq + 1)
send(ACK)
 
payload_packet = TCP(sport=sport, dport=dport, flags='A', seq=ACK.ack, ack=ACK.seq + 1)
mqtt_pkt = MQTTConnect(clientId='my_client_id')

reply, error = sr(pkt/payload_packet/mqtt_pkt, multi=1, timeout=1)
for r in reply:
    r[0].show2()
    r[1].show2()

此代码无法将客户端连接到 MQTT 代理,因为软件会在 ACK 数据包之前发送 RST。请看下图。

Wireshark 流程:

你能帮帮我吗?提前致谢

当您自己的机器看到来自您的 TCP partenaire 的 syn 时,它正在发送 TCP 重置。

你需要做的是通知你的内核你想使用一个特定的端口。 在 linux 中,它是通过以下方式完成的:

sudo iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP
# to see the result:
sudo iptables -L

参考:https://www.fir3net.com/Programming/Python/how-to-build-a-tcp-connection-in-scapy.html