summaryrefslogtreecommitdiff
path: root/src/main/java/com/it_jaros/jscanner/scan/service
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-08-12 13:24:27 +0200
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-08-12 13:50:46 +0200
commitff14e0fc4e3fe4f5b8a67640d28850064661d7ab (patch)
treef141a2d34d902d344207cfbbc6ac614ec1b3840d /src/main/java/com/it_jaros/jscanner/scan/service
parent540b09b1a019f95a9322a6d19e8928369bb20fcb (diff)
Major refactoring of package structure
Diffstat (limited to 'src/main/java/com/it_jaros/jscanner/scan/service')
-rw-r--r--src/main/java/com/it_jaros/jscanner/scan/service/ServiceDetector.java47
-rw-r--r--src/main/java/com/it_jaros/jscanner/scan/service/ServiceType.java5
2 files changed, 52 insertions, 0 deletions
diff --git a/src/main/java/com/it_jaros/jscanner/scan/service/ServiceDetector.java b/src/main/java/com/it_jaros/jscanner/scan/service/ServiceDetector.java
new file mode 100644
index 0000000..93e05d4
--- /dev/null
+++ b/src/main/java/com/it_jaros/jscanner/scan/service/ServiceDetector.java
@@ -0,0 +1,47 @@
+package com.it_jaros.jscanner.scan.service;
+
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.regex.Pattern;
+
+public class ServiceDetector {
+ private static final List<ServicePattern> patterns = List.of(
+ new ServicePattern(ServiceType.DNS, Pattern.compile("(?i)\\bDNS\\b")),
+ new ServicePattern(ServiceType.DNS, Pattern.compile("(?i)\\bBIND\\b")),
+ new ServicePattern(ServiceType.DNS, Pattern.compile("(?i)\\bNSD\\b")),
+ new ServicePattern(ServiceType.DNS, Pattern.compile("(?i)\\bPowerDNS\\b")),
+ new ServicePattern(ServiceType.DNS, Pattern.compile("(?i)\\bUnbound\\b")),
+ new ServicePattern(ServiceType.FTP, Pattern.compile("(?i)^220.*\\bFTP\\b")),
+ new ServicePattern(ServiceType.HTTP, Pattern.compile("(?i)\\bServer:\\s*")),
+ new ServicePattern(ServiceType.HTTP, Pattern.compile("(?i)^HTTP/")),
+ new ServicePattern(ServiceType.IMAP, Pattern.compile("(?i)^\\* OK.*\\bIMAP\\b")),
+ new ServicePattern(ServiceType.POP3, Pattern.compile("(?i)^\\+OK.*\\bPOP3\\b")),
+ new ServicePattern(ServiceType.SMTP, Pattern.compile("(?i)^220.*\\bESMTP\\b")),
+ new ServicePattern(ServiceType.SMTP, Pattern.compile("(?i)^220.*\\bSMTP\\b")),
+ new ServicePattern(ServiceType.SSH, Pattern.compile("(?i)^SSH-"))
+ );
+
+ public static ServiceType detect(byte[] banner) {
+ if (banner == null || banner.length == 0) {
+ return ServiceType.UNKNOWN;
+ }
+
+ String bannerString = new String(banner, StandardCharsets.UTF_8);
+ for (ServicePattern servicePattern : patterns) {
+ if (servicePattern.matches(bannerString)) {
+ return servicePattern.serviceType();
+ }
+ }
+
+ return ServiceType.UNKNOWN;
+ }
+
+ private record ServicePattern(
+ ServiceType serviceType,
+ Pattern pattern
+ ) {
+ boolean matches(String banner) {
+ return pattern.matcher(banner).find();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/it_jaros/jscanner/scan/service/ServiceType.java b/src/main/java/com/it_jaros/jscanner/scan/service/ServiceType.java
new file mode 100644
index 0000000..86b282a
--- /dev/null
+++ b/src/main/java/com/it_jaros/jscanner/scan/service/ServiceType.java
@@ -0,0 +1,5 @@
+package com.it_jaros.jscanner.scan.service;
+
+public enum ServiceType {
+ HTTP, FTP, SMTP, IMAP, POP3, UNKNOWN, DNS, SSH
+}