Добавлен urldecode

This commit is contained in:
serega6531
2019-11-26 14:54:25 +03:00
parent 3e05cb64d5
commit 0ba3078073
3 changed files with 41 additions and 17 deletions

View File

@@ -16,4 +16,10 @@ public class CtfService {
private String name; private String name;
private boolean ungzipHttp;
private boolean urldecodeHttpRequests;
private boolean mergeAdjacentPackets;
} }

View File

@@ -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;

View File

@@ -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
@@ -22,7 +20,4 @@ account-login: BinaryBears
account-password: 123456 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