2014-04-14 152 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)