package com.it_jaros.jscanner; import java.util.List; import java.util.regex.Pattern; public class ServiceDetector { private static final List 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(); } } }