summaryrefslogtreecommitdiff
path: root/src/main/java/com/it_jaros/jscanner/ServiceDetector.java
diff options
context:
space:
mode:
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