diff options
| author | 2026-07-01 13:43:38 +0200 | |
|---|---|---|
| committer | 2026-07-09 09:59:28 +0200 | |
| commit | 5b3ac6d86152241476d47dba58609643df0a64c1 (patch) | |
| tree | 2b8897848eba1c926d9e12e623d75326bb80ecb4 /src/main/java/com/it_jaros/jscanner/ServiceDetector.java | |
| parent | 8b881560dd8884e8e54e1e64654f79749d9ff456 (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.java | 45 |
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 |
