出于教育目的,我正在尝试对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服务器虚拟机(以及将其发回的服务器)。
代码:
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。
发布于 2019-03-24 22:21:01
尽管我还没有找到桥接模式不工作的原因,但我设法使用仅主机适配器使其工作。当我使用它时,Pings和数据包都是双向接收的。
https://stackoverflow.com/questions/55270143
复制相似问题