Scapy 原始套接字

2 投票
2 回答
5566 浏览
提问于 2025-04-18 02:40

我在用Python和Scapy实现三次握手的过程,使用的是原始套接字。

这段代码是:

s=socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.IPPROTO_TCP)
ss=StreamSocket(s)
iph=IPheader()
syn = TCP(sport=TCP_SOURCE_PORT,dport=TCP_DESTINATION_PORT, flags="S")
synack = ss.sr1(iph/syn)
myack = iph/TCP(dport=synack[TCP].sport, sport=synack[TCP].dport, seq=synack[TCP].ack, ack=synack[TCP].seq+1, flags="A")
ss.send(myack)

IPheader()这个方法会返回一个Scapy的IP头部。

但是当我运行这个脚本时,出现了这个错误:

ERROR: --- Error in child 3057
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/scapy/sendrecv.py", line 89, in sndrcv
pks.send(p)
File "/usr/lib/python2.7/dist-packages/scapy/supersocket.py", line 34, in send
return self.outs.send(sx)
error: [Errno 6] No such device or address

2 个回答

0

这个设备没有对你的SYN数据包做出回应,因为RAW套接字并不会自动处理这些。你需要手动发送SYN-ACK。此外,Wireshark和TCP显示的序列号是相对的。如果你想看到实际的序列号,需要关闭这个选项。最后,你可以手动设置序列号,或者使用下面的代码来随机生成它。

TCP(sport = port1, dport = port2, flags="A", seq = random.getrandbits(32), ack = MY_ACK)

或者

TCP(sport = port1, dport = port2, flags="A", seq = 01395, ack = MY_ACK)
2

我看到你的代码可能有几个问题:

  • 在调用 StreamSocket() 之前,你需要先用一个普通的套接字建立连接。所以你需要先连接一下,类似于 s.connect(("10.1.1.1",9000)),然后再执行 ss=StreamSocket(s) 这一行。更多信息可以在 这里 找到。

  • 你可能需要修正基础套接字的类型。我建议你使用类似 s=socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) 的代码。想了解更多,可以查看 这个链接

撰写回答