2013-07-16 78 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数据包)。