2014-04-14 117 views
2

我尝试实现3路,hadnshake与Python中的原始套接字,并使用Scapy的。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

我看到一对夫妇与您的代码可能出现的问题:调用StreamSocket()

  • 你需要建立一个普通的连接插座。所以,你需要让行ss=StreamSocket(s)之前的连接,像s.connect(("10.1.1.1",9000))。进一步的信息可以发现here

  • 您可能需要更正底部插槽类型。我建议像s=socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)。欲了解更多信息,请查询this

+0

所做的更改和工作随机它。现在,我尝试通过StreamSocket发送SYN数据包,但我看到了畸形的Wireshark的。 iph = IPheader() syn = TCP(sport = TCP_SOURCE_PORT,dport = TCP_DESTINATION_PORT,seq = 100,ack = 400,flags =“S”) pkt = iph/syn ss.send(pkt)' – user2399087

+0

我解决了上面的问题,通过发送通过套接字只有TCP头没有IP头。接下来的问题是,我的设备没有响应我的SYN数据包。我无法设置我想要的序列号和SYN数据包与SEQ = 0发送,但我不认为这是问题 – user2399087

0

设备没有响应您的SYN数据包,因为RAW套接字没有这样做。您必须手动发送SYN-ACK。此外,Wireshark和TCP显示序列号为RELATIVE。为了显示ACTUAL号码,您必须关闭此选项。第三,你可以手动设置序列号或使用

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)