Добавлен urldecode
This commit is contained in:
@@ -16,4 +16,10 @@ public class CtfService {
|
|||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
|
private boolean ungzipHttp;
|
||||||
|
|
||||||
|
private boolean urldecodeHttpRequests;
|
||||||
|
|
||||||
|
private boolean mergeAdjacentPackets;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package ru.serega6531.packmate.service;
|
package ru.serega6531.packmate.service;
|
||||||
|
|
||||||
import com.google.common.primitives.Bytes;
|
import com.google.common.primitives.Bytes;
|
||||||
|
import lombok.SneakyThrows;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.commons.lang3.ArrayUtils;
|
import org.apache.commons.lang3.ArrayUtils;
|
||||||
@@ -20,6 +21,8 @@ import ru.serega6531.packmate.repository.StreamRepository;
|
|||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.URLDecoder;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
@@ -37,9 +40,7 @@ public class StreamService {
|
|||||||
private final StreamSubscriptionService subscriptionService;
|
private final StreamSubscriptionService subscriptionService;
|
||||||
|
|
||||||
private final String localIp;
|
private final String localIp;
|
||||||
private final boolean unpackGzippedHttp;
|
|
||||||
private final boolean ignoreEmptyPackets;
|
private final boolean ignoreEmptyPackets;
|
||||||
private final boolean mergeAdjacentPackets;
|
|
||||||
|
|
||||||
private final byte[] GZIP_HEADER = {0x1f, (byte) 0x8b, 0x08};
|
private final byte[] GZIP_HEADER = {0x1f, (byte) 0x8b, 0x08};
|
||||||
private final java.util.regex.Pattern userAgentPattern = java.util.regex.Pattern.compile("User-Agent: (.+)\\n");
|
private final java.util.regex.Pattern userAgentPattern = java.util.regex.Pattern.compile("User-Agent: (.+)\\n");
|
||||||
@@ -51,18 +52,14 @@ public class StreamService {
|
|||||||
PacketService packetService,
|
PacketService packetService,
|
||||||
StreamSubscriptionService subscriptionService,
|
StreamSubscriptionService subscriptionService,
|
||||||
@Value("${local-ip}") String localIp,
|
@Value("${local-ip}") String localIp,
|
||||||
@Value("${unpack-gzipped-http}") boolean unpackGzippedHttp,
|
@Value("${ignore-empty-packets}") boolean ignoreEmptyPackets) {
|
||||||
@Value("${ignore-empty-packets}") boolean ignoreEmptyPackets,
|
|
||||||
@Value("${merge-adjacent-packets}") boolean mergeAdjacentPackets) {
|
|
||||||
this.repository = repository;
|
this.repository = repository;
|
||||||
this.patternService = patternService;
|
this.patternService = patternService;
|
||||||
this.servicesService = servicesService;
|
this.servicesService = servicesService;
|
||||||
this.packetService = packetService;
|
this.packetService = packetService;
|
||||||
this.subscriptionService = subscriptionService;
|
this.subscriptionService = subscriptionService;
|
||||||
this.localIp = localIp;
|
this.localIp = localIp;
|
||||||
this.unpackGzippedHttp = unpackGzippedHttp;
|
|
||||||
this.ignoreEmptyPackets = ignoreEmptyPackets;
|
this.ignoreEmptyPackets = ignoreEmptyPackets;
|
||||||
this.mergeAdjacentPackets = mergeAdjacentPackets;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -83,6 +80,7 @@ public class StreamService {
|
|||||||
unfinishedStream.getFirstPort(), unfinishedStream.getSecondPort());
|
unfinishedStream.getFirstPort(), unfinishedStream.getSecondPort());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
CtfService service = serviceOptional.get();
|
||||||
|
|
||||||
Optional<Packet> firstIncoming = packets.stream()
|
Optional<Packet> firstIncoming = packets.stream()
|
||||||
.filter(Packet::isIncoming)
|
.filter(Packet::isIncoming)
|
||||||
@@ -93,7 +91,7 @@ public class StreamService {
|
|||||||
stream.setTtl(firstIncoming.isPresent() ? firstIncoming.get().getTtl() : 0);
|
stream.setTtl(firstIncoming.isPresent() ? firstIncoming.get().getTtl() : 0);
|
||||||
stream.setStartTimestamp(packets.get(0).getTimestamp());
|
stream.setStartTimestamp(packets.get(0).getTimestamp());
|
||||||
stream.setEndTimestamp(packets.get(packets.size() - 1).getTimestamp());
|
stream.setEndTimestamp(packets.get(packets.size() - 1).getTimestamp());
|
||||||
stream.setService(serviceOptional.get().getPort());
|
stream.setService(service.getPort());
|
||||||
|
|
||||||
if (ignoreEmptyPackets) {
|
if (ignoreEmptyPackets) {
|
||||||
packets.removeIf(packet -> packet.getContent().length == 0);
|
packets.removeIf(packet -> packet.getContent().length == 0);
|
||||||
@@ -104,11 +102,15 @@ public class StreamService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unpackGzippedHttp) {
|
if (service.isUngzipHttp()) {
|
||||||
unpackGzip(packets);
|
unpackGzip(packets);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mergeAdjacentPackets) {
|
if (service.isUrldecodeHttpRequests()) {
|
||||||
|
urldecodeRequests(packets);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (service.isMergeAdjacentPackets()) {
|
||||||
mergeAdjacentPackets(packets);
|
mergeAdjacentPackets(packets);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,7 +153,7 @@ public class StreamService {
|
|||||||
private void mergeAdjacentPackets(List<Packet> packets) {
|
private void mergeAdjacentPackets(List<Packet> packets) {
|
||||||
int start = 0;
|
int start = 0;
|
||||||
int packetsInRow = 0;
|
int packetsInRow = 0;
|
||||||
boolean incoming = false;
|
boolean incoming = true;
|
||||||
|
|
||||||
for (int i = 0; i < packets.size(); i++) {
|
for (int i = 0; i < packets.size(); i++) {
|
||||||
Packet packet = packets.get(i);
|
Packet packet = packets.get(i);
|
||||||
@@ -205,6 +207,27 @@ public class StreamService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SneakyThrows
|
||||||
|
private void urldecodeRequests(List<Packet> packets) {
|
||||||
|
boolean httpStarted = false;
|
||||||
|
|
||||||
|
for (Packet packet : packets) {
|
||||||
|
if (packet.isIncoming()) {
|
||||||
|
String content = new String(packet.getContent());
|
||||||
|
if (content.startsWith("HTTP/")) {
|
||||||
|
httpStarted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (httpStarted) {
|
||||||
|
content = URLDecoder.decode(content, StandardCharsets.UTF_8.toString());
|
||||||
|
packet.setContent(content.getBytes());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
httpStarted = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void unpackGzip(List<Packet> packets) {
|
private void unpackGzip(List<Packet> packets) {
|
||||||
boolean gzipStarted = false;
|
boolean gzipStarted = false;
|
||||||
int gzipStartPacket = 0;
|
int gzipStartPacket = 0;
|
||||||
|
|||||||
@@ -9,10 +9,8 @@ spring:
|
|||||||
ddl-auto: update
|
ddl-auto: update
|
||||||
properties:
|
properties:
|
||||||
hibernate:
|
hibernate:
|
||||||
# format_sql: true
|
|
||||||
temp:
|
temp:
|
||||||
use_jdbc_metadata_defaults: false
|
use_jdbc_metadata_defaults: false
|
||||||
# show-sql: true
|
|
||||||
|
|
||||||
|
|
||||||
enable-capture: true
|
enable-capture: true
|
||||||
@@ -23,6 +21,3 @@ account-password: 123456
|
|||||||
udp-stream-timeout: 20 # секунд
|
udp-stream-timeout: 20 # секунд
|
||||||
tcp-stream-timeout: 40 # секунд
|
tcp-stream-timeout: 40 # секунд
|
||||||
timeout-stream-check-interval: 10 # секунд
|
timeout-stream-check-interval: 10 # секунд
|
||||||
ignore-empty-packets: true
|
|
||||||
unpack-gzipped-http: true
|
|
||||||
merge-adjacent-packets: true
|
|
||||||
Reference in New Issue
Block a user