用Scapy与C套接字交谈

Jos*_*ley 4 c sockets networking scapy localserversocket

我建立了UDP连接并正在侦听端口(本地主机),并且我也尝试从本地主机发送Scapy数据包。由于某种原因,我的C代码实际上从未捕获过该数据包,但是我可以看到该数据包在Wireshark中显示的很好。自从我使用套接字以来已经有一段时间了,但是我是否必须设置一些特殊的套接字选项,或者为什么我能够看到Wireshark中的数据包很好,但不能看到C套接字呢?

注意:当我编写了相应的套接字代码以发送数据包(从本地主机)时,我能够成功捕获数据包,但是当从另一台计算机发送时,我仍然无法获得侦听代码来捕获数据包。

我发现了一个类似的问题,但是当我尝试使用它们的方法(使用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;
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

Eos*_*sis 5

Scapy的配置需要稍有不同才能在Loopback界面上工作,请参阅“ 我无法ping 127.0.0.1。 ”标题下的http://www.secdev.org/projects/scapy/doc/troubleshooting.html 。使用127.0.0.1或在环回接口上 “

我使用那里给出的代码,并发送了一个漏斗包,该包被接收到一个C Socket,具体来说是:

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

然后,在绑定到端口32000上的lo的UDP C套接字上接收到此消息(Scapy默认情况下通过回送接口发送IP数据包)。


bbo*_*nev 1

我认为问题在于设置不兼容的接口、src 和 dst 地址集。

当目的地是环回(127.0.0.1)时,接口应该是lo和 地址(假设客户端和服务器都在同一主机上运行):

ip_pkt.dst = "127.0.0.1"
ip_pkt.src = "127.0.0.1"
Run Code Online (Sandbox Code Playgroud)

另一种方法是发送到以太网地址(假设192.168.1.1已配置eth0并且客户端和服务器在同一主机上运行):

ip_pkt.dst = "192.168.1.1"
ip_pkt.src = "192.168.1.1"
Run Code Online (Sandbox Code Playgroud)

如果您尝试不同的主机,则无法使用127.0.0.1和。lo将 src 设置为客户端计算机的 IP,将 dst 设置为服务器计算机的 IP。