diff --git a/src/main/java/ru/serega6531/packmate/model/CtfService.java b/src/main/java/ru/serega6531/packmate/model/CtfService.java index 8c1f7b0..01ddf6e 100644 --- a/src/main/java/ru/serega6531/packmate/model/CtfService.java +++ b/src/main/java/ru/serega6531/packmate/model/CtfService.java @@ -16,4 +16,10 @@ public class CtfService { private String name; + private boolean ungzipHttp; + + private boolean urldecodeHttpRequests; + + private boolean mergeAdjacentPackets; + } \ No newline at end of file diff --git a/src/main/java/ru/serega6531/packmate/service/StreamService.java b/src/main/java/ru/serega6531/packmate/service/StreamService.java index f04e57d..ce4aed2 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -1,6 +1,7 @@ package ru.serega6531.packmate.service; import com.google.common.primitives.Bytes; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.ArrayUtils; @@ -20,6 +21,8 @@ import ru.serega6531.packmate.repository.StreamRepository; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.regex.Matcher; import java.util.stream.Collectors; @@ -37,9 +40,7 @@ public class StreamService { private final StreamSubscriptionService subscriptionService; private final String localIp; - private final boolean unpackGzippedHttp; private final boolean ignoreEmptyPackets; - private final boolean mergeAdjacentPackets; private final byte[] GZIP_HEADER = {0x1f, (byte) 0x8b, 0x08}; private final java.util.regex.Pattern userAgentPattern = java.util.regex.Pattern.compile("User-Agent: (.+)\\n"); @@ -51,18 +52,14 @@ public class StreamService { PacketService packetService, StreamSubscriptionService subscriptionService, @Value("${local-ip}") String localIp, - @Value("${unpack-gzipped-http}") boolean unpackGzippedHttp, - @Value("${ignore-empty-packets}") boolean ignoreEmptyPackets, - @Value("${merge-adjacent-packets}") boolean mergeAdjacentPackets) { + @Value("${ignore-empty-packets}") boolean ignoreEmptyPackets) { this.repository = repository; this.patternService = patternService; this.servicesService = servicesService; this.packetService = packetService; this.subscriptionService = subscriptionService; this.localIp = localIp; - this.unpackGzippedHttp = unpackGzippedHttp; this.ignoreEmptyPackets = ignoreEmptyPackets; - this.mergeAdjacentPackets = mergeAdjacentPackets; } /** @@ -83,6 +80,7 @@ public class StreamService { unfinishedStream.getFirstPort(), unfinishedStream.getSecondPort()); return false; } + CtfService service = serviceOptional.get(); Optional firstIncoming = packets.stream() .filter(Packet::isIncoming) @@ -93,7 +91,7 @@ public class StreamService { stream.setTtl(firstIncoming.isPresent() ? firstIncoming.get().getTtl() : 0); stream.setStartTimestamp(packets.get(0).getTimestamp()); stream.setEndTimestamp(packets.get(packets.size() - 1).getTimestamp()); - stream.setService(serviceOptional.get().getPort()); + stream.setService(service.getPort()); if (ignoreEmptyPackets) { packets.removeIf(packet -> packet.getContent().length == 0); @@ -104,11 +102,15 @@ public class StreamService { } } - if (unpackGzippedHttp) { + if (service.isUngzipHttp()) { unpackGzip(packets); } - if (mergeAdjacentPackets) { + if (service.isUrldecodeHttpRequests()) { + urldecodeRequests(packets); + } + + if (service.isMergeAdjacentPackets()) { mergeAdjacentPackets(packets); } @@ -151,7 +153,7 @@ public class StreamService { private void mergeAdjacentPackets(List packets) { int start = 0; int packetsInRow = 0; - boolean incoming = false; + boolean incoming = true; for (int i = 0; i < packets.size(); i++) { Packet packet = packets.get(i); @@ -205,6 +207,27 @@ public class StreamService { } } + @SneakyThrows + private void urldecodeRequests(List 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 packets) { boolean gzipStarted = false; int gzipStartPacket = 0; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2348c1b..9fd8eb6 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -9,10 +9,8 @@ spring: ddl-auto: update properties: hibernate: -# format_sql: true temp: use_jdbc_metadata_defaults: false -# show-sql: true enable-capture: true @@ -22,7 +20,4 @@ account-login: BinaryBears account-password: 123456 udp-stream-timeout: 20 # секунд tcp-stream-timeout: 40 # секунд -timeout-stream-check-interval: 10 # секунд -ignore-empty-packets: true -unpack-gzipped-http: true -merge-adjacent-packets: true \ No newline at end of file +timeout-stream-check-interval: 10 # секунд \ No newline at end of file