首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Wireshark上显示后丢弃的Pcap4j TCP数据包

在Wireshark上显示后丢弃的Pcap4j TCP数据包
EN

Stack Overflow用户
提问于 2019-03-21 05:02:51
回答 1查看 402关注 0票数 1

出于教育目的,我正在尝试对Ubuntu 18.04虚拟机执行SYN洪水攻击。我已经在我的VM设置中启用了网桥模式,并设置了一个可以在我的主机pc (10.0.0.3)上访问的web服务器(10.0.0.10),反之亦然。从主机到服务器的ping显示服务器上的Wireshark流量(请求和响应),从服务器到主机的ping也显示服务器上的Wireshark流量,但不显示主机上的Wireshark流量,即使ping数据包已正确构建。

我构建攻击的方法是生成随机is,构造TCP SYN数据包,然后从我的主机通过端口80 (打开)将其发送到web服务器,该端口应发送回TCP SYN/ACK数据包(我使用iptables将其路由回我的主机pc)。

如果我通过Pcap4J (用于Java的Pcap library )构造一个TCP包,然后通过处理程序I see it pop up on the host Wireshark.发送它

但是,如果我检查虚拟机上的Wireshark,数据包不会到达。处理程序没有给出错误,程序正确退出,因此我不确定如何解决此问题。

丢弃的数据包在哪里?我该如何修复它?我需要数据包到达web服务器虚拟机(以及将其发回的服务器)。

代码:

代码语言:javascript
复制
    Pcaphandle send_handle;
    //nif_address is a constant of my ethernet connection defined in the file
    try {
        PcapNetworkInterface nif = Pcaps.getDevByAddress(nif_address);
        if (nif == null) {
            System.out.println("Networkinterface is null");
            return;
        }
        // Open the device and get a send_handle
        int snapshotLength = 65536; // in bytes
        int readTimeout = 50; // in milliseconds
        send_handle = nif.openLive(snapshotLength, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, readTimeout);
    } catch (PcapNativeException e) {
        System.out.println("Cannot bind NIF to variable from localhost");
        e.printStackTrace();
        return;
    }

    //Send packets, e.g. 1 packet by 5 different IPs
    for (int i = 0; i < 5; i++) {
        //generateIP() function not shown here, but is simply a randomizer and format to IP
        InetAddress src_ip = generateIP(); 

        Packet tcpPacket = constructSYNPacket(i, src_ip);
        try {
            send_handle.sendPacket(tcpPacket);
            System.out.println(send_handle.getError());
        } catch (PcapNativeException | NotOpenException e) {
            e.printStackTrace();
        }
    }

    private Packet constructSYNPacket(int packetNr, InetAddress src_address) {
    TcpPacket.Builder tcpBuilder = new TcpPacket.Builder();
    tcpBuilder
            .syn(true)
            .ack(false)
            .rst(false)
            .psh(false)
            .urg(false)
            .srcAddr(src_address)
            .srcPort(TcpPort.getInstance((short) srcPort))
            .dstAddr(dst_address)
            .dstPort(TcpPort.getInstance((short) dstPort))
            .correctLengthAtBuild(true)
            .correctChecksumAtBuild(true)
            .sequenceNumber(100000 + (packetNr*50));

    IpV4Packet.Builder ipv4Builder = new IpV4Packet.Builder();
    ipv4Builder
            .srcAddr((Inet4Address)src_address)
            .dstAddr((Inet4Address)dst_address)
            .dontFragmentFlag(true)
            .fragmentOffset((short)0)
            .ihl((byte)5)
            .correctLengthAtBuild(true)
            .correctChecksumAtBuild(true)
            .protocol(IpNumber.TCP)
            .version(IpVersion.IPV4)
            .tos((IpV4Packet.IpV4Tos) () -> (byte)0)
            .ttl((byte)100)
            .payloadBuilder(tcpBuilder);

    EthernetPacket.Builder ethBuilder = new EthernetPacket.Builder();
    ethBuilder
            .srcAddr(nif_mac)
            .dstAddr(dst_mac)
            .type(EtherType.IPV4)
            .payloadBuilder(ipv4Builder)
            .paddingAtBuild(true);

    Packet p = ethBuilder.build();

注意:我已经在Ubuntu sysctl中禁用了SYN cookies。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-24 22:21:01

尽管我还没有找到桥接模式不工作的原因,但我设法使用仅主机适配器使其工作。当我使用它时,Pings和数据包都是双向接收的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55270143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档