gpt4 book ai didi

java - Pcap4j TCP 数据包在 Wireshark 上显示后被丢弃

转载 作者:太空宇宙 更新时间:2023-11-03 17:04:33 34 4
gpt4 key购买 nike

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

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

如果我通过 Pcap4J(Java 的 Pcap 库)构造一个 TCP 数据包,然后通过处理程序发送它,I see it pop up on the host 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();

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

最佳答案

尽管我还没有发现为什么桥接模式不起作用,但我设法使用仅主机适配器使其工作。当我使用它时,双向都收到了 Ping 和数据包。

关于java - Pcap4j TCP 数据包在 Wireshark 上显示后被丢弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55270143/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com