2013-07-16 124 views
3

我有一個UDP連接並監聽端口(本地主機),我也想從本地主機發送Scapy數據包。出於某種原因,我的C代碼從來沒有實際捕獲數據包,但是我可以看到Wireshark中顯示的數據包很好。我已經使用套接字已經有一段時間了,但是有一些特殊的套接字選項需要設置,或者爲什麼我能夠在Wireshark中看到數據包,但不能使用C套接字?與Scapy交談的C socket

注意:當我編寫相應的套接字代碼來發送數據包(來自本地主機)時,我能夠成功捕獲數據包,但是我仍然無法從其他計算機發送數據包時聽到代碼。

我發現了一個similar question但是當我嘗試他們的方法(使用UDP而不是TCP)時,我仍然無法使用netcat來捕獲Scapy數據包。

C代碼(冷凝爲了清楚起見)

int main() { 
    int sock, dataLen, inLen; 
    struct sockaddr_in inAddr; 
    short listen_port = 8080; 
    char buffer[2048]; 

    if (sock = socket(AF_INET,SOCK_DGRAM,0) < 0) { 
     printf("ERROR: unable to establish socket\n"); 
    return -1; 
    } 

    // zero out address structure 
    memset(&inAddr, 0, sizeof(inAddr)); 

    inAddr.sin_family = AF_INET; 
    inAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    inAddr.sin_port = htons(listen_port); 

    if (bind(sock, (struct sockaddr*)&inAddr, sizeof(inAddr)) < 0) { 
    printf("ERROR: unable to bind\n"); 
    return -1; 
    } 

    inLen = sizeof(inAddr); 

    printf("Now listening on port %d\n", listen_port); 
    while(1) { 
    dataLen = recvfrom(sock, buffer, 1500, 0, (struct sockaddr*)&inAddr, &inLen); 

    if (dataLen < 0) 
     printf("Error receiving datagram\n"); 
    else 
     printf("Received packet of length %d\n", dataLen); 

    } 
    return 0; 
} 

Scapy的腳本

# set interface 
conf.iface="lo0" 

# create IP packet 
ip_pkt = IP()/UDP() 
ip_pkt.payload = "payload test message" 
ip_pkt.dport = 8080 
ip_pkt.dst = "127.0.0.1" 
ip_pkt.src = "127.0.0.1" 

# send out packet 
send(ip_pkt) 
+0

你的本地主機上監聽器將永遠無法捕捉到另一臺計算機發送的數據包,因爲這些數據包將不會穿越的loopback您監聽器 – jxh

+0

@jxh監聽器綁定到'INADDR_ANY';它依賴於系統,但從另一個地址發送數據包到127.0.0.1可能會被過濾 – bbonev

+0

@bbonev:'Scapy腳本'指定本地主機的目標IP地址。如果該腳本在另一臺機器上運行,則它無法到達偵聽器的機器。 – jxh

回答

1

我認爲問題是在設置不相容集界面中,src和dst的地址。

當目的地是回送(127.0.0.1),接口應該是lo和地址(假設在同一主機上的客戶端和服務器運行):

ip_pkt.dst = "127.0.0.1" 
ip_pkt.src = "127.0.0.1" 

另一種方式是發送到以太網地址(假設192.168.1.1eth0,並在同一臺主機上的客戶端和服務器運行)配置:

ip_pkt.dst = "192.168.1.1" 
ip_pkt.src = "192.168.1.1" 

如果你嘗試不同的主機,然後使用127.0.0.1lo是不可能的。將src設置爲客戶端機器的ip,將dst設置爲服務器的ip。

+0

scapy腳本中的src IP應該是真的嗎?我的意思是,你可以將src IP僞裝成真實IP以外的東西,並且Scapy會將數據包發送到另一臺計算機(我之前已經完成)。 –

+0

取決於配置 - 接收機可能會拒絕出現意外源的數據包。你能澄清你的網絡設置? – bbonev

+0

它與Scapy無關,它與基本的IP網絡相關。 127.0.0.0/8接口只是本地主機,它甚至不使用或需要網卡存在,也不能從任何其他網絡發送東西到它。它甚至是安全問題。即使這個數據包正在打到它的目標機器,系統也會丟棄這個數據包,因爲如果這個數據包不是來自這個網絡的話,它就不能被髮送到這個網絡。 – Havenard

2

我有同樣的問題,udp套接字不接收scapy數據包。 我想有可能是這個職位相關的東西:Raw Socket Help: Why UDP packets created by raw sockets are not being received by kernel UDP? 而我的作品是socket.IP_HDRINCL選項。這是兩者和發件人的工作代碼。

發件人:

import socket 
from scapy.all import * 

rawudp=socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP) 
rawudp.bind(('0.0.0.0',56789)) 
rawudp.setsockopt(socket.SOL_IP, socket.IP_HDRINCL,1) 

pkt = IP()/UDP(sport=56789, dport=7890)/'hello' 

rawudp.sendto(pkt.build(), ('127.0.0.1',7890)) 

接收器:

import socket 
so = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
so.bind(('0.0.0.0',7890)) 
while True: 
    print so.recv(1024) 

驗證在Fedora 14,雖然不能在我的MBP工作...

3

Scapy的需要不同,以稍微配置在Loopback接口上工作,請參閱http://www.secdev.org/projects/scapy/doc/troubleshooting.html,標題爲「我無法ping 127.0.0.1。Scapy不能與127.0.0一起使用。1或環回接口

上我使用了規定那裏的代碼和發送其中接收一個C插槽一個Scapy的分組,這是特別:

from scapy.all import * 
conf.L3socket=L3RawSocket 
packet=IP()/UDP(dport=32000)/"HELLO WORLD" 
send(packet) 

然後將其上的UDP交流電插座接收綁定到LO端口32000(Scapy的默認通過環回接口發送IP數據包)。