Выбор сервиса в паттернах

This commit is contained in:
serega6531
2021-01-12 22:32:10 +03:00
parent 8c752f1d44
commit f5dc4b7b6f
7 changed files with 26 additions and 12 deletions

View File

@@ -27,6 +27,7 @@ dependencies {
implementation "org.springframework.boot:spring-boot-starter-security" implementation "org.springframework.boot:spring-boot-starter-security"
implementation "org.springframework.boot:spring-boot-starter-websocket" implementation "org.springframework.boot:spring-boot-starter-websocket"
implementation 'org.springframework.session:spring-session-core' implementation 'org.springframework.session:spring-session-core'
compile 'com.github.jmnarloch:modelmapper-spring-boot-starter:1.1.0'
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.10' compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.10'
compile group: 'commons-io', name: 'commons-io', version: '2.7' compile group: 'commons-io', name: 'commons-io', version: '2.7'
compile 'org.pcap4j:pcap4j-core:1.8.2' compile 'org.pcap4j:pcap4j-core:1.8.2'

View File

@@ -42,6 +42,8 @@ public class Pattern {
private PatternActionType actionType; private PatternActionType actionType;
private Integer serviceId;
private long searchStartTimestamp; private long searchStartTimestamp;
@ManyToMany(mappedBy = "foundPatterns", fetch = FetchType.LAZY) @ManyToMany(mappedBy = "foundPatterns", fetch = FetchType.LAZY)

View File

@@ -16,5 +16,6 @@ public class PatternDto {
private PatternSearchType searchType; private PatternSearchType searchType;
private PatternDirectionType directionType; private PatternDirectionType directionType;
private PatternActionType actionType; private PatternActionType actionType;
private Integer serviceId;
} }

View File

@@ -6,6 +6,7 @@ import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.serega6531.packmate.model.CtfService;
import ru.serega6531.packmate.model.FoundPattern; import ru.serega6531.packmate.model.FoundPattern;
import ru.serega6531.packmate.model.Pattern; import ru.serega6531.packmate.model.Pattern;
import ru.serega6531.packmate.model.enums.PatternActionType; import ru.serega6531.packmate.model.enums.PatternActionType;
@@ -27,17 +28,19 @@ public class PatternService {
private final PatternRepository repository; private final PatternRepository repository;
private final StreamService streamService; private final StreamService streamService;
private final SubscriptionService subscriptionService; private final SubscriptionService subscriptionService;
private final ModelMapper modelMapper;
private final Map<Integer, Pattern> patterns = new HashMap<>(); private final Map<Integer, Pattern> patterns = new HashMap<>();
private final ModelMapper modelMapper = new ModelMapper();
@Autowired @Autowired
public PatternService(PatternRepository repository, public PatternService(PatternRepository repository,
@Lazy StreamService streamService, @Lazy StreamService streamService,
SubscriptionService subscriptionService) { SubscriptionService subscriptionService,
ModelMapper modelMapper) {
this.repository = repository; this.repository = repository;
this.streamService = streamService; this.streamService = streamService;
this.subscriptionService = subscriptionService; this.subscriptionService = subscriptionService;
this.modelMapper = modelMapper;
repository.findAll().forEach(p -> patterns.put(p.getId(), p)); repository.findAll().forEach(p -> patterns.put(p.getId(), p));
log.info("Loaded {} patterns", patterns.size()); log.info("Loaded {} patterns", patterns.size());
@@ -51,9 +54,10 @@ public class PatternService {
return patterns.values(); return patterns.values();
} }
public Set<FoundPattern> findMatches(byte[] bytes, PatternDirectionType directionType, PatternActionType actionType) { public Set<FoundPattern> findMatches(byte[] bytes, CtfService service, PatternDirectionType directionType, PatternActionType actionType) {
final List<Pattern> list = patterns.values().stream() final List<Pattern> list = patterns.values().stream()
.filter(Pattern::isEnabled) .filter(Pattern::isEnabled)
.filter(p -> p.getServiceId() == null || p.getServiceId() == service.getPort())
.filter(p -> p.getActionType() == actionType) .filter(p -> p.getActionType() == actionType)
.filter(p -> p.getDirectionType() == directionType || p.getDirectionType() == PatternDirectionType.BOTH) .filter(p -> p.getDirectionType() == directionType || p.getDirectionType() == PatternDirectionType.BOTH)
.collect(Collectors.toList()); .collect(Collectors.toList());

View File

@@ -31,16 +31,18 @@ public class ServicesService {
private final InetAddress localIp; private final InetAddress localIp;
private final Map<Integer, CtfService> services = new HashMap<>(); private final Map<Integer, CtfService> services = new HashMap<>();
private final ModelMapper modelMapper = new ModelMapper(); private final ModelMapper modelMapper;
@Autowired @Autowired
public ServicesService(ServiceRepository repository, public ServicesService(ServiceRepository repository,
SubscriptionService subscriptionService, SubscriptionService subscriptionService,
@Lazy PcapService pcapService, @Lazy PcapService pcapService,
ModelMapper modelMapper,
@Value("${local-ip}") String localIpString) throws UnknownHostException { @Value("${local-ip}") String localIpString) throws UnknownHostException {
this.repository = repository; this.repository = repository;
this.subscriptionService = subscriptionService; this.subscriptionService = subscriptionService;
this.pcapService = pcapService; this.pcapService = pcapService;
this.modelMapper = modelMapper;
this.localIp = InetAddress.getByName(localIpString); this.localIp = InetAddress.getByName(localIpString);
repository.findAll().forEach(s -> services.put(s.getPort(), s)); repository.findAll().forEach(s -> services.put(s.getPort(), s));

View File

@@ -37,11 +37,11 @@ public class StreamService {
private final CountingService countingService; private final CountingService countingService;
private final SubscriptionService subscriptionService; private final SubscriptionService subscriptionService;
private final RsaKeysHolder keysHolder; private final RsaKeysHolder keysHolder;
private final ModelMapper modelMapper;
private final boolean ignoreEmptyPackets; private final boolean ignoreEmptyPackets;
private final java.util.regex.Pattern userAgentPattern = java.util.regex.Pattern.compile("User-Agent: (.+)\\r\\n"); private final java.util.regex.Pattern userAgentPattern = java.util.regex.Pattern.compile("User-Agent: (.+)\\r\\n");
private final ModelMapper modelMapper = new ModelMapper();
@Autowired @Autowired
public StreamService(StreamRepository repository, public StreamService(StreamRepository repository,
@@ -50,6 +50,7 @@ public class StreamService {
CountingService countingService, CountingService countingService,
SubscriptionService subscriptionService, SubscriptionService subscriptionService,
RsaKeysHolder keysHolder, RsaKeysHolder keysHolder,
ModelMapper modelMapper,
@Value("${ignore-empty-packets}") boolean ignoreEmptyPackets) { @Value("${ignore-empty-packets}") boolean ignoreEmptyPackets) {
this.repository = repository; this.repository = repository;
this.patternService = patternService; this.patternService = patternService;
@@ -57,6 +58,7 @@ public class StreamService {
this.countingService = countingService; this.countingService = countingService;
this.subscriptionService = subscriptionService; this.subscriptionService = subscriptionService;
this.keysHolder = keysHolder; this.keysHolder = keysHolder;
this.modelMapper = modelMapper;
this.ignoreEmptyPackets = ignoreEmptyPackets; this.ignoreEmptyPackets = ignoreEmptyPackets;
} }
@@ -103,7 +105,7 @@ public class StreamService {
packets = new StreamOptimizer(keysHolder, service, packets).optimizeStream(); packets = new StreamOptimizer(keysHolder, service, packets).optimizeStream();
if (isStreamIgnored(packets)) { if (isStreamIgnored(packets, service)) {
log.debug("New stream is ignored"); log.debug("New stream is ignored");
return false; return false;
} }
@@ -115,7 +117,7 @@ public class StreamService {
packet.setStream(savedStream); packet.setStream(savedStream);
} }
Set<Pattern> foundPatterns = matchPatterns(packets); Set<Pattern> foundPatterns = matchPatterns(packets, service);
savedStream.setFoundPatterns(foundPatterns); savedStream.setFoundPatterns(foundPatterns);
savedStream.setPackets(packets); savedStream.setPackets(packets);
savedStream = save(savedStream); savedStream = save(savedStream);
@@ -167,12 +169,13 @@ public class StreamService {
return "" + alphabet[hash % l] + alphabet[(hash / l) % l] + alphabet[(hash / (l * l)) % l]; return "" + alphabet[hash % l] + alphabet[(hash / l) % l] + alphabet[(hash / (l * l)) % l];
} }
private Set<Pattern> matchPatterns(List<Packet> packets) { private Set<Pattern> matchPatterns(List<Packet> packets, CtfService service) {
Set<Pattern> foundPatterns = new HashSet<>(); Set<Pattern> foundPatterns = new HashSet<>();
for (Packet packet : packets) { for (Packet packet : packets) {
PatternDirectionType direction = packet.isIncoming() ? PatternDirectionType.INPUT : PatternDirectionType.OUTPUT; PatternDirectionType direction = packet.isIncoming() ? PatternDirectionType.INPUT : PatternDirectionType.OUTPUT;
final Set<FoundPattern> matches = patternService.findMatches(packet.getContent(), direction, PatternActionType.FIND); final Set<FoundPattern> matches = patternService.findMatches(packet.getContent(), service,
direction, PatternActionType.FIND);
packet.setMatches(matches); packet.setMatches(matches);
matches.forEach(m -> m.setPacket(packet)); matches.forEach(m -> m.setPacket(packet));
@@ -210,10 +213,11 @@ public class StreamService {
return matched; return matched;
} }
private boolean isStreamIgnored(List<Packet> packets) { private boolean isStreamIgnored(List<Packet> packets, CtfService service) {
for (Packet packet : packets) { for (Packet packet : packets) {
PatternDirectionType direction = packet.isIncoming() ? PatternDirectionType.INPUT : PatternDirectionType.OUTPUT; PatternDirectionType direction = packet.isIncoming() ? PatternDirectionType.INPUT : PatternDirectionType.OUTPUT;
final Set<FoundPattern> matches = patternService.findMatches(packet.getContent(), direction, PatternActionType.IGNORE); final Set<FoundPattern> matches = patternService.findMatches(packet.getContent(), service,
direction, PatternActionType.IGNORE);
if (!matches.isEmpty()) { if (!matches.isEmpty()) {
return true; return true;
} }