From 5f668baf05231c6245b3707a203647149f77d2a8 Mon Sep 17 00:00:00 2001 From: serega6531 Date: Sun, 28 Apr 2019 03:04:30 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=20=D0=BF=D0=B0?= =?UTF-8?q?=D0=BA=D0=B5=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/serega6531/packmate/PcapWorker.java | 58 +++++++++++++++++-- .../controller/ServiceController.java | 2 +- .../serega6531/packmate/model/CtfService.java | 2 + .../packmate/service/ServicesService.java | 9 ++- src/main/resources/application.yml | 3 +- 5 files changed, 65 insertions(+), 9 deletions(-) diff --git a/src/main/java/ru/serega6531/packmate/PcapWorker.java b/src/main/java/ru/serega6531/packmate/PcapWorker.java index 3342f7f..62fd253 100644 --- a/src/main/java/ru/serega6531/packmate/PcapWorker.java +++ b/src/main/java/ru/serega6531/packmate/PcapWorker.java @@ -6,16 +6,21 @@ import org.pcap4j.core.PcapHandle; import org.pcap4j.core.PcapNativeException; import org.pcap4j.core.PcapNetworkInterface; import org.pcap4j.core.Pcaps; +import org.pcap4j.packet.IpV4Packet; import org.pcap4j.packet.Packet; +import org.pcap4j.packet.TcpPacket; +import org.pcap4j.packet.UdpPacket; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import ru.serega6531.packmate.model.CtfService; import ru.serega6531.packmate.service.PacketService; import ru.serega6531.packmate.service.PatternService; import ru.serega6531.packmate.service.ServicesService; import ru.serega6531.packmate.service.StreamService; import javax.annotation.PreDestroy; +import java.util.Optional; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeoutException; @@ -29,21 +34,26 @@ public class PcapWorker { private final PacketService packetService; private final PatternService patternService; - private PcapNetworkInterface device; + private final PcapNetworkInterface device; private PcapHandle pcap = null; - private ExecutorService executorService; + private final ExecutorService executorService; + + private final String localIp; @Autowired public PcapWorker(ServicesService servicesService, StreamService streamService, PacketService packetService, PatternService patternService, - @Value("${interface-name}") String interfaceName) throws PcapNativeException { + @Value("${interface-name}") String interfaceName, + @Value("${local-ip}") String localIp) throws PcapNativeException { this.servicesService = servicesService; this.streamService = streamService; this.packetService = packetService; this.patternService = patternService; + this.localIp = localIp; + BasicThreadFactory factory = new BasicThreadFactory.Builder() .namingPattern("pcap-worker").build(); executorService = Executors.newSingleThreadExecutor(factory); @@ -84,7 +94,45 @@ public class PcapWorker { log.info("Intercept stopped"); } - private void processPacket(Packet packet) { - System.out.println(packet); + private void processPacket(Packet rawPacket) { + String sourceIp = null; + String destIp = null; + int sourcePort = -1; + int destPort = -1; + byte[] content = null; + + if(rawPacket.contains(IpV4Packet.class)){ + final IpV4Packet.IpV4Header header = rawPacket.get(IpV4Packet.class).getHeader(); + sourceIp = header.getSrcAddr().getHostAddress(); + destIp = header.getDstAddr().getHostAddress(); + } + + if(rawPacket.contains(TcpPacket.class)) { + final TcpPacket packet = rawPacket.get(TcpPacket.class); + final TcpPacket.TcpHeader header = packet.getHeader(); + sourcePort = header.getSrcPort().valueAsInt(); + destPort = header.getDstPort().valueAsInt(); + content = packet.getRawData(); + } else if(rawPacket.contains(UdpPacket.class)) { + final UdpPacket packet = rawPacket.get(UdpPacket.class); + final UdpPacket.UdpHeader header = packet.getHeader(); + sourcePort = header.getSrcPort().valueAsInt(); + destPort = header.getDstPort().valueAsInt(); + content = packet.getRawData(); + } + + if(sourceIp != null && sourcePort != -1) { + Optional serviceOptional = Optional.empty(); + + if(sourceIp.equals(localIp)) { + serviceOptional = servicesService.findByPort(sourcePort); + } else if(destIp.equals(localIp)) { + serviceOptional = servicesService.findByPort(destPort); + } + + if(serviceOptional.isPresent()) { + log.info("{} {}:{} -> {}:{}", serviceOptional, sourceIp, sourcePort, destIp, destPort); + } + } } } diff --git a/src/main/java/ru/serega6531/packmate/controller/ServiceController.java b/src/main/java/ru/serega6531/packmate/controller/ServiceController.java index 9416aef..b8480ec 100644 --- a/src/main/java/ru/serega6531/packmate/controller/ServiceController.java +++ b/src/main/java/ru/serega6531/packmate/controller/ServiceController.java @@ -25,7 +25,7 @@ public class ServiceController { @DeleteMapping("/{port}") public void deleteService(@PathVariable int port) { - service.deleteById(port); + service.deleteByPort(port); } @PostMapping diff --git a/src/main/java/ru/serega6531/packmate/model/CtfService.java b/src/main/java/ru/serega6531/packmate/model/CtfService.java index 06b3ace..0f9f861 100644 --- a/src/main/java/ru/serega6531/packmate/model/CtfService.java +++ b/src/main/java/ru/serega6531/packmate/model/CtfService.java @@ -1,6 +1,7 @@ package ru.serega6531.packmate.model; import lombok.Data; +import lombok.ToString; import javax.persistence.*; import java.util.List; @@ -8,6 +9,7 @@ import java.util.List; @Data @Entity @Table(name = "service") +@ToString(of = {"port", "name"}) public class CtfService { @Id diff --git a/src/main/java/ru/serega6531/packmate/service/ServicesService.java b/src/main/java/ru/serega6531/packmate/service/ServicesService.java index f7311fb..3da4430 100644 --- a/src/main/java/ru/serega6531/packmate/service/ServicesService.java +++ b/src/main/java/ru/serega6531/packmate/service/ServicesService.java @@ -7,6 +7,7 @@ import ru.serega6531.packmate.model.CtfService; import ru.serega6531.packmate.repository.ServiceRepository; import java.util.List; +import java.util.Optional; @Service @Slf4j @@ -19,12 +20,16 @@ public class ServicesService { this.repository = repository; } + public Optional findByPort(int port) { + return repository.findById(port); + } + public List findAll() { return repository.findAll(); } - public void deleteById(int id) { - repository.deleteById(id); + public void deleteByPort(int port) { + repository.deleteById(port); } public CtfService save(CtfService service) { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b2f9d2e..0ea2b86 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -7,4 +7,5 @@ spring: jpa: hibernate: ddl-auto: update -interface-name: enp0s31f6 \ No newline at end of file +interface-name: enp0s31f6 +local-ip: "192.168.0.125" \ No newline at end of file