Добавлен анализ пакета
This commit is contained in:
@@ -6,16 +6,21 @@ import org.pcap4j.core.PcapHandle;
|
|||||||
import org.pcap4j.core.PcapNativeException;
|
import org.pcap4j.core.PcapNativeException;
|
||||||
import org.pcap4j.core.PcapNetworkInterface;
|
import org.pcap4j.core.PcapNetworkInterface;
|
||||||
import org.pcap4j.core.Pcaps;
|
import org.pcap4j.core.Pcaps;
|
||||||
|
import org.pcap4j.packet.IpV4Packet;
|
||||||
import org.pcap4j.packet.Packet;
|
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.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
import ru.serega6531.packmate.model.CtfService;
|
||||||
import ru.serega6531.packmate.service.PacketService;
|
import ru.serega6531.packmate.service.PacketService;
|
||||||
import ru.serega6531.packmate.service.PatternService;
|
import ru.serega6531.packmate.service.PatternService;
|
||||||
import ru.serega6531.packmate.service.ServicesService;
|
import ru.serega6531.packmate.service.ServicesService;
|
||||||
import ru.serega6531.packmate.service.StreamService;
|
import ru.serega6531.packmate.service.StreamService;
|
||||||
|
|
||||||
import javax.annotation.PreDestroy;
|
import javax.annotation.PreDestroy;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
@@ -29,21 +34,26 @@ public class PcapWorker {
|
|||||||
private final PacketService packetService;
|
private final PacketService packetService;
|
||||||
private final PatternService patternService;
|
private final PatternService patternService;
|
||||||
|
|
||||||
private PcapNetworkInterface device;
|
private final PcapNetworkInterface device;
|
||||||
private PcapHandle pcap = null;
|
private PcapHandle pcap = null;
|
||||||
private ExecutorService executorService;
|
private final ExecutorService executorService;
|
||||||
|
|
||||||
|
private final String localIp;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public PcapWorker(ServicesService servicesService,
|
public PcapWorker(ServicesService servicesService,
|
||||||
StreamService streamService,
|
StreamService streamService,
|
||||||
PacketService packetService,
|
PacketService packetService,
|
||||||
PatternService patternService,
|
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.servicesService = servicesService;
|
||||||
this.streamService = streamService;
|
this.streamService = streamService;
|
||||||
this.packetService = packetService;
|
this.packetService = packetService;
|
||||||
this.patternService = patternService;
|
this.patternService = patternService;
|
||||||
|
|
||||||
|
this.localIp = localIp;
|
||||||
|
|
||||||
BasicThreadFactory factory = new BasicThreadFactory.Builder()
|
BasicThreadFactory factory = new BasicThreadFactory.Builder()
|
||||||
.namingPattern("pcap-worker").build();
|
.namingPattern("pcap-worker").build();
|
||||||
executorService = Executors.newSingleThreadExecutor(factory);
|
executorService = Executors.newSingleThreadExecutor(factory);
|
||||||
@@ -84,7 +94,45 @@ public class PcapWorker {
|
|||||||
log.info("Intercept stopped");
|
log.info("Intercept stopped");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processPacket(Packet packet) {
|
private void processPacket(Packet rawPacket) {
|
||||||
System.out.println(packet);
|
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<CtfService> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ public class ServiceController {
|
|||||||
|
|
||||||
@DeleteMapping("/{port}")
|
@DeleteMapping("/{port}")
|
||||||
public void deleteService(@PathVariable int port) {
|
public void deleteService(@PathVariable int port) {
|
||||||
service.deleteById(port);
|
service.deleteByPort(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping
|
@PostMapping
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package ru.serega6531.packmate.model;
|
package ru.serega6531.packmate.model;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -8,6 +9,7 @@ import java.util.List;
|
|||||||
@Data
|
@Data
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "service")
|
@Table(name = "service")
|
||||||
|
@ToString(of = {"port", "name"})
|
||||||
public class CtfService {
|
public class CtfService {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import ru.serega6531.packmate.model.CtfService;
|
|||||||
import ru.serega6531.packmate.repository.ServiceRepository;
|
import ru.serega6531.packmate.repository.ServiceRepository;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@@ -19,12 +20,16 @@ public class ServicesService {
|
|||||||
this.repository = repository;
|
this.repository = repository;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Optional<CtfService> findByPort(int port) {
|
||||||
|
return repository.findById(port);
|
||||||
|
}
|
||||||
|
|
||||||
public List<CtfService> findAll() {
|
public List<CtfService> findAll() {
|
||||||
return repository.findAll();
|
return repository.findAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void deleteById(int id) {
|
public void deleteByPort(int port) {
|
||||||
repository.deleteById(id);
|
repository.deleteById(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CtfService save(CtfService service) {
|
public CtfService save(CtfService service) {
|
||||||
|
|||||||
@@ -8,3 +8,4 @@ spring:
|
|||||||
hibernate:
|
hibernate:
|
||||||
ddl-auto: update
|
ddl-auto: update
|
||||||
interface-name: enp0s31f6
|
interface-name: enp0s31f6
|
||||||
|
local-ip: "192.168.0.125"
|
||||||
Reference in New Issue
Block a user