summaryrefslogtreecommitdiff
path: root/src/main/java/com/it_jaros/jscanner/ServiceDetector.java
diff options
context:
space:
mode:
authorGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-07-01 13:43:38 +0200
committerGravatar Matthias Jaros <jarlucmat@mailbox.org>2026-07-09 09:59:28 +0200
commit5b3ac6d86152241476d47dba58609643df0a64c1 (patch)
tree2b8897848eba1c926d9e12e623d75326bb80ecb4 /src/main/java/com/it_jaros/jscanner/ServiceDetector.java
parent8b881560dd8884e8e54e1e64654f79749d9ff456 (diff)
Added banner recognition for basic discovery of services
Diffstat (limited to 'src/main/java/com/it_jaros/jscanner/ServiceDetector.java')
-rw-r--r--src/main/java/com/it_jaros/jscanner/ServiceDetector.java45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/main/java/com/it_jaros/jscanner/ServiceDetector.java b/src/main/java/com/it_jaros/jscanner/ServiceDetector.java
new file mode 100644
index 0000000..7559b43
--- /dev/null
+++ b/src/main/java/com/it_jaros/jscanner/ServiceDetector.java
@@ -0,0 +1,45 @@
+package com.it_jaros.jscanner;
+
+import java.util.List;
+import java.util.regex.Pattern;
+
+public class ServiceDetector {
+ private static final List<ServicePattern> patterns = List.of(
+ new ServicePattern(ServiceType.SSH, Pattern.compile("(?i)^SSH-")),
+
+ new ServicePattern(ServiceType.HTTP, Pattern.compile("(?i)^HTTP/")),
+ new ServicePattern(ServiceType.HTTP, Pattern.compile("(?i)\\bServer:\\s*")),
+
+ new ServicePattern(ServiceType.FTP, Pattern.compile("(?i)^220.*\\bFTP\\b")),
+
+ new ServicePattern(ServiceType.SMTP, Pattern.compile("(?i)^220.*\\bSMTP\\b")),
+ new ServicePattern(ServiceType.SMTP, Pattern.compile("(?i)^220.*\\bESMTP\\b")),
+
+ new ServicePattern(ServiceType.IMAP, Pattern.compile("(?i)^\\* OK.*\\bIMAP\\b")),
+
+ new ServicePattern(ServiceType.POP3, Pattern.compile("(?i)^\\+OK.*\\bPOP3\\b"))
+ );
+
+ public static ServiceType detect(String banner) {
+ if (banner == null || banner.isBlank()) {
+ return ServiceType.UNKNOWN;
+ }
+
+ for (ServicePattern servicePattern : patterns) {
+ if (servicePattern.matches(banner)) {
+ 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