recog-intrigue 2.3.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +17 -0
  4. data/.github/ISSUE_TEMPLATE/fingerprint_request.md +27 -0
  5. data/.github/PULL_REQUEST_TEMPLATE +24 -0
  6. data/.gitignore +14 -0
  7. data/.rbenv-gemset +1 -0
  8. data/.rspec +3 -0
  9. data/.ruby-gemset +1 -0
  10. data/.ruby-version +1 -0
  11. data/.travis.yml +25 -0
  12. data/.yardopts +1 -0
  13. data/CONTRIBUTING.md +171 -0
  14. data/COPYING +23 -0
  15. data/Gemfile +10 -0
  16. data/LICENSE +7 -0
  17. data/README.md +85 -0
  18. data/Rakefile +22 -0
  19. data/bin/recog_export +81 -0
  20. data/bin/recog_match +55 -0
  21. data/bin/recog_standardize +118 -0
  22. data/bin/recog_verify +64 -0
  23. data/cpe-remap.yaml +134 -0
  24. data/features/data/failing_banners_fingerprints.xml +20 -0
  25. data/features/data/matching_banners_fingerprints.xml +23 -0
  26. data/features/data/multiple_banners_fingerprints.xml +32 -0
  27. data/features/data/no_tests.xml +3 -0
  28. data/features/data/sample_banner.txt +2 -0
  29. data/features/data/successful_tests.xml +18 -0
  30. data/features/data/tests_with_failures.xml +20 -0
  31. data/features/data/tests_with_warnings.xml +17 -0
  32. data/features/match.feature +36 -0
  33. data/features/support/aruba.rb +3 -0
  34. data/features/support/env.rb +6 -0
  35. data/features/verify.feature +48 -0
  36. data/identifiers/README.md +47 -0
  37. data/identifiers/os_architecture.txt +20 -0
  38. data/identifiers/os_device.txt +52 -0
  39. data/identifiers/os_family.txt +160 -0
  40. data/identifiers/os_product.txt +199 -0
  41. data/identifiers/service_family.txt +185 -0
  42. data/identifiers/service_product.txt +255 -0
  43. data/identifiers/software_class.txt +26 -0
  44. data/identifiers/software_family.txt +91 -0
  45. data/identifiers/software_product.txt +333 -0
  46. data/identifiers/vendor.txt +405 -0
  47. data/lib/recog.rb +4 -0
  48. data/lib/recog/db.rb +78 -0
  49. data/lib/recog/db_manager.rb +31 -0
  50. data/lib/recog/fingerprint.rb +280 -0
  51. data/lib/recog/fingerprint/regexp_factory.rb +56 -0
  52. data/lib/recog/fingerprint/test.rb +18 -0
  53. data/lib/recog/formatter.rb +51 -0
  54. data/lib/recog/match_reporter.rb +77 -0
  55. data/lib/recog/matcher.rb +94 -0
  56. data/lib/recog/matcher_factory.rb +14 -0
  57. data/lib/recog/nizer.rb +347 -0
  58. data/lib/recog/verifier.rb +39 -0
  59. data/lib/recog/verifier_factory.rb +13 -0
  60. data/lib/recog/verify_reporter.rb +86 -0
  61. data/lib/recog/version.rb +3 -0
  62. data/misc/convert_mysql_err +61 -0
  63. data/misc/order.xsl +17 -0
  64. data/recog-intrigue.gemspec +45 -0
  65. data/requirements.txt +2 -0
  66. data/spec/data/best_os_match_1.yml +17 -0
  67. data/spec/data/best_os_match_2.yml +17 -0
  68. data/spec/data/best_service_match_1.yml +17 -0
  69. data/spec/data/smb_native_os.txt +25 -0
  70. data/spec/data/test_fingerprints.xml +36 -0
  71. data/spec/data/verification_fingerprints.xml +86 -0
  72. data/spec/data/whitespaced_fingerprint.xml +5 -0
  73. data/spec/lib/fingerprint_self_test_spec.rb +174 -0
  74. data/spec/lib/recog/db_spec.rb +98 -0
  75. data/spec/lib/recog/fingerprint/regexp_factory_spec.rb +73 -0
  76. data/spec/lib/recog/fingerprint_spec.rb +112 -0
  77. data/spec/lib/recog/formatter_spec.rb +69 -0
  78. data/spec/lib/recog/match_reporter_spec.rb +91 -0
  79. data/spec/lib/recog/nizer_spec.rb +330 -0
  80. data/spec/lib/recog/verify_reporter_spec.rb +113 -0
  81. data/spec/spec_helper.rb +82 -0
  82. data/update_cpes.py +186 -0
  83. data/xml/apache_modules.xml +1911 -0
  84. data/xml/apache_os.xml +273 -0
  85. data/xml/architecture.xml +36 -0
  86. data/xml/dns_versionbind.xml +761 -0
  87. data/xml/fingerprints.xsd +128 -0
  88. data/xml/ftp_banners.xml +1553 -0
  89. data/xml/h323_callresp.xml +603 -0
  90. data/xml/hp_pjl_id.xml +358 -0
  91. data/xml/html_title.xml +1630 -0
  92. data/xml/http_cookies.xml +411 -0
  93. data/xml/http_servers.xml +3195 -0
  94. data/xml/http_wwwauth.xml +595 -0
  95. data/xml/imap_banners.xml +245 -0
  96. data/xml/ldap_searchresult.xml +711 -0
  97. data/xml/mdns_device-info_txt.xml +1796 -0
  98. data/xml/mdns_workstation_txt.xml +15 -0
  99. data/xml/mysql_banners.xml +1649 -0
  100. data/xml/mysql_error.xml +871 -0
  101. data/xml/nntp_banners.xml +82 -0
  102. data/xml/ntp_banners.xml +1223 -0
  103. data/xml/operating_system.xml +629 -0
  104. data/xml/pop_banners.xml +499 -0
  105. data/xml/rsh_resp.xml +76 -0
  106. data/xml/rtsp_servers.xml +76 -0
  107. data/xml/sip_banners.xml +359 -0
  108. data/xml/sip_user_agents.xml +221 -0
  109. data/xml/smb_native_lm.xml +62 -0
  110. data/xml/smb_native_os.xml +662 -0
  111. data/xml/smtp_banners.xml +1690 -0
  112. data/xml/smtp_debug.xml +39 -0
  113. data/xml/smtp_ehlo.xml +49 -0
  114. data/xml/smtp_expn.xml +82 -0
  115. data/xml/smtp_help.xml +157 -0
  116. data/xml/smtp_mailfrom.xml +20 -0
  117. data/xml/smtp_noop.xml +44 -0
  118. data/xml/smtp_quit.xml +29 -0
  119. data/xml/smtp_rcptto.xml +25 -0
  120. data/xml/smtp_rset.xml +26 -0
  121. data/xml/smtp_turn.xml +26 -0
  122. data/xml/smtp_vrfy.xml +89 -0
  123. data/xml/snmp_sysdescr.xml +6507 -0
  124. data/xml/snmp_sysobjid.xml +430 -0
  125. data/xml/ssh_banners.xml +1968 -0
  126. data/xml/telnet_banners.xml +1595 -0
  127. data/xml/x11_banners.xml +232 -0
  128. data/xml/x509_issuers.xml +134 -0
  129. data/xml/x509_subjects.xml +1268 -0
  130. metadata +304 -0
@@ -0,0 +1,39 @@
1
+ module Recog
2
+ class Verifier
3
+ attr_reader :fingerprints, :reporter
4
+
5
+ def initialize(fingerprints, reporter)
6
+ @fingerprints = fingerprints
7
+ @reporter = reporter
8
+ end
9
+
10
+ def verify
11
+ reporter.report(fingerprints.count) do
12
+ fingerprints.each do |fp|
13
+ reporter.print_name fp
14
+
15
+ fp.verify_params do |status, message|
16
+ case status
17
+ when :warn
18
+ reporter.warning "WARN: #{message}"
19
+ when :fail
20
+ reporter.failure "FAIL: #{message}"
21
+ when :success
22
+ reporter.success(message)
23
+ end
24
+ end
25
+ fp.verify_tests do |status, message|
26
+ case status
27
+ when :warn
28
+ reporter.warning "WARN: #{message}"
29
+ when :fail
30
+ reporter.failure "FAIL: #{message}"
31
+ when :success
32
+ reporter.success(message)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,13 @@
1
+ require 'verifier'
2
+ require 'formatter'
3
+ require 'verify_reporter'
4
+
5
+ module Recog
6
+ module VerifierFactory
7
+ def self.build(options)
8
+ formatter = Formatter.new(options, $stdout)
9
+ reporter = VerifyReporter.new(options, formatter)
10
+ Verifier.new(options.fingerprints, reporter)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,86 @@
1
+ module Recog
2
+ class VerifyReporter
3
+ attr_reader :formatter
4
+ attr_reader :success_count, :warning_count, :failure_count
5
+
6
+ def initialize(options, formatter)
7
+ @options = options
8
+ @formatter = formatter
9
+ reset_counts
10
+ end
11
+
12
+ def report(fingerprint_count)
13
+ reset_counts
14
+ yield self
15
+ summarize(fingerprint_count) unless @options.quiet
16
+ end
17
+
18
+ def success(text)
19
+ @success_count += 1
20
+ formatter.success_message("#{padding}#{text}") if detail?
21
+ end
22
+
23
+ def warning(text)
24
+ return unless @options.warnings
25
+ @warning_count += 1
26
+ formatter.warning_message("#{padding}#{text}")
27
+ end
28
+
29
+ def failure(text)
30
+ @failure_count += 1
31
+ formatter.failure_message("#{padding}#{text}")
32
+ end
33
+
34
+ def print_name(fingerprint)
35
+ if detail? && fingerprint.tests.any?
36
+ name = fingerprint.name.empty? ? '[unnamed]' : fingerprint.name
37
+ formatter.status_message("\n#{name}")
38
+ end
39
+ end
40
+
41
+ def summarize(fingerprint_count)
42
+ print_fingerprint_count(fingerprint_count) if detail?
43
+ print_summary
44
+ end
45
+
46
+ def print_fingerprint_count(count)
47
+ formatter.status_message("\nVerified #{count} fingerprints:")
48
+ end
49
+
50
+ def print_summary
51
+ colorize_summary(summary_line)
52
+ end
53
+
54
+ private
55
+
56
+ def reset_counts
57
+ @success_count = @failure_count = @warning_count = 0
58
+ end
59
+
60
+ def detail?
61
+ @options.detail
62
+ end
63
+
64
+ def padding
65
+ ' ' if @options.detail
66
+ end
67
+
68
+ def summary_line
69
+ summary = "SUMMARY: Test completed with "
70
+ summary << "#{@success_count} successful"
71
+ summary << ", #{@warning_count} warnings"
72
+ summary << ", and #{@failure_count} failures"
73
+ summary
74
+ end
75
+
76
+ def colorize_summary(summary)
77
+ if @failure_count > 0
78
+ formatter.failure_message(summary)
79
+ elsif @warning_count > 0
80
+ formatter.warning_message(summary)
81
+ else
82
+ formatter.success_message(summary)
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,3 @@
1
+ module Recog
2
+ VERSION = '2.3.7'
3
+ end
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Takes the MySQL error messages from sql/share/errmsg-utf8.txt, locates the
4
+ # provided error message type (for example, ER_HOST_NOT_PRIVILEGED), then
5
+ # creates XML snippets for each locale to be used in Recog. Note that this
6
+ # cannot be used as-is to generate mysql_errors.xml, or oftentimes even parts
7
+ # -- it merely spits out XML snippets that you can start with; many will still
8
+ # need to be modified by hand.
9
+
10
+ require 'builder'
11
+ require 'open-uri'
12
+ require 'securerandom'
13
+
14
+ def generate_recog(error_name, locale, error_message)
15
+ xml = Builder::XmlMarkup.new(target: STDOUT, indent: 2)
16
+ xml.fingerprint(pattern: error_message) do
17
+ xml.description "Oracle MySQL error #{error_name} (#{locale})"
18
+ xml.example(error_message)
19
+ xml.param(pos: 0, name: 'service.vendor', value: 'Oracle')
20
+ xml.param(pos: 0, name: 'service.family', value: 'MySQL')
21
+ xml.param(pos: 0, name: 'service.product', value: 'MySQL')
22
+ end
23
+ end
24
+
25
+ unless ARGV.size == 2
26
+ fail "Usage: #{$PROGRAM_NAME} <path/URI for errmsg-utf8.txt> <error name>"
27
+ end
28
+
29
+ path = ARGV.first
30
+ error_name = ARGV.last
31
+
32
+ lines = IO.readlines(open(path))
33
+
34
+ fail "Nothing read from #{path}" if lines.empty?
35
+
36
+ unless (error_start = lines.find_index { |line| line.strip =~ /^#{error_name}(?:\s+\S+)?$/ })
37
+ fail "Unable to find #{error_name} in #{path}"
38
+ end
39
+
40
+ locale_map = {}
41
+ lines.slice(error_start + 1, lines.size).each do |line|
42
+ if /^\s+(?<locale>\S+)\s+"(?<error_message>.*)",?$/ =~ line
43
+ locale_map[locale] = error_message
44
+ else
45
+ break
46
+ end
47
+ end
48
+
49
+ # Many of the error messages contain format strings. This can be problematic
50
+ # in that they need to be removed or otherwise handled as part of the 'pattern'
51
+ # attribute and appropriately filled in in any example elements. So simply try
52
+ # a rough count of the possible format strings and warn the user so that they
53
+ # can deal with it.
54
+ format_count = locale_map.values.map { |error_message| error_message.scan(/%/).size }.inject(&:+)
55
+ unless format_count == 0
56
+ warn("#{format_count} possible format strings found -- you'll need to deal with this")
57
+ end
58
+
59
+ Hash[locale_map.sort].map do |locale, error_message|
60
+ generate_recog(error_name, locale, error_message)
61
+ end
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0"?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
3
+ <xsl:output encoding="UTF-8" indent="yes" method="xml"/>
4
+ <xsl:template match="@*|node()">
5
+ <xsl:copy>
6
+ <xsl:apply-templates select="@*|node()"/>
7
+ </xsl:copy>
8
+ </xsl:template>
9
+ <xsl:template match="fingerprints/fingerprint">
10
+ <xsl:copy>
11
+ <xsl:copy-of select="@*"/>
12
+ <xsl:apply-templates select="description"/>
13
+ <xsl:apply-templates select="example"/>
14
+ <xsl:apply-templates select="param"/>
15
+ </xsl:copy>
16
+ </xsl:template>
17
+ </xsl:stylesheet>
@@ -0,0 +1,45 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
3
+ require 'recog/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'recog-intrigue'
7
+ s.version = Recog::VERSION
8
+ s.required_ruby_version = '>= 2.1'
9
+ s.authors = [
10
+ 'Rapid7 Research',
11
+ 'jcran'
12
+ ]
13
+ s.email = [
14
+ 'jcran@intrigue.io'
15
+ ]
16
+ s.homepage = "https://www.github.com/rapid7/recog"
17
+ s.summary = %q{Network service fingerprint database, classes, and utilities}
18
+ s.description = %q{
19
+ Recog is a framework for identifying products, services, operating systems, and hardware by matching
20
+ fingerprints against data returned from various network probes. Recog makes it simply to extract useful
21
+ information from web server banners, snmp system description fields, and a whole lot more.
22
+ }.gsub(/\s+/, ' ').strip
23
+
24
+ s.files = `git ls-files`.split("\n")
25
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
26
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
27
+ s.require_paths = ['lib']
28
+
29
+ # ---- Dependencies ----
30
+
31
+ s.add_development_dependency 'rspec'
32
+ s.add_development_dependency 'yard'
33
+ if RUBY_PLATFORM =~ /java/
34
+ # markdown formatting for yard
35
+ s.add_development_dependency 'kramdown'
36
+ else
37
+ # markdown formatting for yard
38
+ s.add_development_dependency 'redcarpet'
39
+ end
40
+ s.add_development_dependency 'cucumber'
41
+ s.add_development_dependency 'aruba'
42
+ s.add_development_dependency 'simplecov'
43
+
44
+ s.add_runtime_dependency 'nokogiri'
45
+ end
@@ -0,0 +1,2 @@
1
+ lxml==4.2.4
2
+ pyyaml
@@ -0,0 +1,17 @@
1
+ ---
2
+ - os.product: Windows 2008
3
+ os.vendor: Microsoft
4
+ os.version: Service Pack 2
5
+ os.certainty: 0.5
6
+ - os.product: Windows 2008
7
+ os.vendor: Microsoft
8
+ os.version: Service Pack 1
9
+ os.certainty: 0.4
10
+ - os.product: Windows 2008
11
+ os.vendor: Microsoft
12
+ os.certainty: 0.3
13
+ os.language: English
14
+ - os.product: Windows 2012
15
+ os.vendor: Microsoft
16
+ os.certainty: 0.4
17
+ os.language: Arabic
@@ -0,0 +1,17 @@
1
+ ---
2
+ - os.product: Windows 2008
3
+ os.vendor: Microsoft
4
+ os.version: Service Pack 2
5
+ os.certainty: 1.0
6
+ - os.product: Windows 2012
7
+ os.vendor: Microsoft
8
+ os.version: Service Pack 1
9
+ os.certainty: 0.7
10
+ - os.product: Windows 2008
11
+ os.vendor: Microsoft
12
+ os.certainty: 0.3
13
+ os.language: English
14
+ - os.product: Windows 2012
15
+ os.vendor: Microsoft
16
+ os.certainty: 0.8
17
+ os.language: Arabic
@@ -0,0 +1,17 @@
1
+ ---
2
+ - service.product: IIS
3
+ service.vendor: Microsoft
4
+ service.version: 6.0
5
+ service.certainty: 1.0
6
+ - service.product: Apache
7
+ service.vendor: Linux
8
+ service.version: 2.2.4
9
+ service.certainty: 0.5
10
+ - service.product: IIS
11
+ service.vendor: Microsoft
12
+ service.certainty: 0.5
13
+ service.language: English
14
+ - service.product: IIS
15
+ service.vendor: Microsoft
16
+ service.certainty: 0.4
17
+ service.language: Arabic
@@ -0,0 +1,25 @@
1
+ Windows Web Server 2008 R2 7601 Service Pack 1
2
+ Windows Vista (TM) Home Premium 6002 Service Pack 2
3
+ Windows Server (R) 2008 Standard 6002 Service Pack 2
4
+ Windows Server (R) 2008 Enterprise without Hyper-V 6001 Service Pack 1
5
+ Windows Server (R) 2008 Enterprise 6002 Service Pack 2
6
+ Windows Server (R) 2008 Enterprise 6001 Service Pack 1
7
+ Windows Server 2012 Standard 9200
8
+ Windows Server 2012 R2 Standard 9600
9
+ Windows Server 2008 R2 Standard 7601 Service Pack 1
10
+ Windows Server 2008 R2 Standard 7600
11
+ Windows Server 2008 R2 Enterprise 7601 Service Pack 1
12
+ Windows Server 2008 R2 Enterprise 7600
13
+ Windows Server 2008 HPC Edition 7600
14
+ Windows Server 2003 R2 3790 Service Pack 2
15
+ Windows Server 2003 3790 Service Pack 2
16
+ Windows (R) Web Server 2008 6002 Service Pack 2
17
+ Windows MultiPoint Server 2012 Premium 9200
18
+ Windows 8 Enterprise 9200
19
+ Windows 8.1 Enterprise 9600
20
+ Windows 7 Ultimate 7601 Service Pack 1
21
+ Windows 7 Ultimate 7600
22
+ Windows 7 Starter 7601 Service Pack 1
23
+ Windows 7 Home Premium 7600
24
+ Windows 7 Enterprise 7601 Service Pack 1
25
+ Windows 7 Enterprise 7600
@@ -0,0 +1,36 @@
1
+ <?xml version="1.0"?>
2
+ <fingerprints>
3
+ <fingerprint pattern=".*\(iSeries\).*">
4
+ </fingerprint>
5
+
6
+ <fingerprint pattern=".*\(PalmOS\).*">
7
+ <description>PalmOS</description>
8
+ <param pos="1" name="os.vendor" value="Palm"/>
9
+ <param pos="2" name="os.device" value="General"/>
10
+ </fingerprint>
11
+
12
+ <fingerprint pattern="(designjet \S+)" flags="REG_ICASE">
13
+ <description>HP Designjet printer</description>
14
+ <description>I should be ignored</description>
15
+ <param pos="0" name="service.vendor" value="HP"/>
16
+ </fingerprint>
17
+
18
+ <fingerprint pattern="laserjet (.*)(?: series)?" flags="REG_ICASE">
19
+ <description>HP JetDirect Printer</description>
20
+ <example>HP LaserJet 4100 Series</example>
21
+ <example>HP LaserJet 2200</example>
22
+ <param pos="0" name="service.vendor" value="HP"/>
23
+ </fingerprint>
24
+
25
+ <fingerprint pattern="^Windows XP (\d+) (Service Pack \d+)$">
26
+ <description>Windows XP</description>
27
+ <example os.build="2600" os.version="Service Pack 1"
28
+ >Windows XP 2600 Service Pack 1</example>
29
+ <param pos="0" name="os.certainty" value="1.0"/>
30
+ <param pos="0" name="os.vendor" value="Microsoft"/>
31
+ <param pos="0" name="os.product" value="Windows XP"/>
32
+ <param pos="1" name="os.build"/>
33
+ <param pos="2" name="os.version"/>
34
+ </fingerprint>
35
+
36
+ </fingerprints>
@@ -0,0 +1,86 @@
1
+ <fingerprints>
2
+
3
+ <fingerprint pattern="^[dD]ovecot (?:\((.*)\) )?(?:DA )?ready\.(?: &lt;.+@(.+)&gt;)?$">
4
+ <description>Dovecot Secure POP Server - no params</description>
5
+ <example>Dovecot ready.</example>
6
+ </fingerprint>
7
+
8
+ <fingerprint pattern="^[dD]ovecot (?:\((.*)\) )?(?:DA )?ready\.(?: &lt;.+@(.+)&gt;)?$">
9
+ <description>Dovecot Secure POP Server - no params defined by capture group</description>
10
+ <example>Dovecot ready.</example>
11
+ <param pos="0" name="service.family" value="Dovecot"/>
12
+ <param pos="0" name="service.product" value="Dovecot"/>
13
+ </fingerprint>
14
+
15
+ <fingerprint pattern="^[dD]ovecot (?:\((.*)\) )?(?:DA )?ready\.(?: &lt;.+@(.+)&gt;)?$">
16
+ <description>Dovecot Secure POP Server - no example</description>
17
+ <param pos="0" name="service.family" value="Dovecot"/>
18
+ <param pos="0" name="service.product" value="Dovecot"/>
19
+ </fingerprint>
20
+
21
+ <fingerprint pattern="^[dD]ovecot (?:\((.*)\) )?(?:DA )?ready\.(?: &lt;.+@(.+)&gt;)?$">
22
+ <description>Dovecot Secure POP Server - one parameter, one example</description>
23
+ <example host.name="domain">Dovecot ready. &lt;abc11.1.1234abcd.abdcabcdabcd@domain&gt;</example>
24
+ <param pos="0" name="service.family" value="Dovecot"/>
25
+ <param pos="0" name="service.product" value="Dovecot"/>
26
+ <param pos="2" name="host.name"/>
27
+ </fingerprint>
28
+
29
+ <fingerprint pattern="^[dD]ovecot (?:\((.*)\) )?(?:DA )?ready\.(?: &lt;.+@(.+)&gt;)?$">
30
+ <description>Dovecot Secure POP Server - two paremeters, one example</description>
31
+ <example host.name="domain" os.vendor="Ubuntu">Dovecot (Ubuntu) ready. &lt;abc11.1.1234abcd.abdcabcdabcd@domain&gt;</example>
32
+ <param pos="0" name="service.family" value="Dovecot"/>
33
+ <param pos="0" name="service.product" value="Dovecot"/>
34
+ <param pos="1" name="os.vendor"/>
35
+ <param pos="2" name="host.name"/>
36
+ </fingerprint>
37
+
38
+ <fingerprint pattern="^[dD]ovecot (?:\((.*)\) )?(?:DA )?ready\.(?: &lt;.+@(.+)&gt;)?$">
39
+ <description>Dovecot Secure POP Server - two parameters, two examples</description>
40
+ <example host.name="domain">Dovecot ready. &lt;abc11.1.1234abcd.abdcabcdabcd@domain&gt;</example>
41
+ <example os.vendor="Ubuntu">Dovecot (Ubuntu) ready.</example>
42
+ <param pos="0" name="service.family" value="Dovecot"/>
43
+ <param pos="0" name="service.product" value="Dovecot"/>
44
+ <param pos="1" name="os.vendor"/>
45
+ <param pos="2" name="host.name"/>
46
+ </fingerprint>
47
+
48
+ <fingerprint pattern="^[dD]ovecot (?:\((.*)\) )?(?:DA )?ready\.(?: &lt;.+@(.+)&gt;)?$">
49
+ <description>Dovecot Secure POP Server - two parameters, one example, one missing param</description>
50
+ <example host.name="domain">Dovecot ready. &lt;abc11.1.1234abcd.abdcabcdabcd@domain&gt;</example>
51
+ <param pos="0" name="service.family" value="Dovecot"/>
52
+ <param pos="0" name="service.product" value="Dovecot"/>
53
+ <param pos="1" name="os.vendor"/>
54
+ <param pos="2" name="host.name"/>
55
+ </fingerprint>
56
+
57
+ <fingerprint pattern="^[dD]ovecot (?:\((.*)\) )?(?:DA )?ready\.(?: &lt;.+@(.+)&gt;)?$">
58
+ <description>Dovecot Secure POP Server - two parameters, one example, two missing params</description>
59
+ <example>Dovecot ready. &lt;abc11.1.1234abcd.abdcabcdabcd@domain&gt;</example>
60
+ <param pos="0" name="service.family" value="Dovecot"/>
61
+ <param pos="0" name="service.product" value="Dovecot"/>
62
+ <param pos="1" name="os.vendor"/>
63
+ <param pos="2" name="host.name"/>
64
+ </fingerprint>
65
+
66
+ <fingerprint pattern="^[dD]ovecot (?:\((.*)\) )?(?:DA )?ready\.(?: &lt;.+@(.+)&gt;)?$">
67
+ <description>Dovecot Secure POP Server - two parameters, two examples, one missing param</description>
68
+ <example host.name="domain">Dovecot ready. &lt;abc11.1.1234abcd.abdcabcdabcd@domain&gt;</example>
69
+ <example>Dovecot (Ubuntu) ready.</example>
70
+ <param pos="0" name="service.family" value="Dovecot"/>
71
+ <param pos="0" name="service.product" value="Dovecot"/>
72
+ <param pos="1" name="os.vendor"/>
73
+ <param pos="2" name="host.name"/>
74
+ </fingerprint>
75
+
76
+ <fingerprint pattern="^[dD]ovecot (?:\((.*)\) )?(?:DA )?ready\.(?: &lt;.+@(.+)&gt;)?$">
77
+ <description>Dovecot Secure POP Server - two parameters, two examples, two missing params</description>
78
+ <example>Dovecot ready. &lt;abc11.1.1234abcd.abdcabcdabcd@domain&gt;</example>
79
+ <example>Dovecot (Ubuntu) ready.</example>
80
+ <param pos="0" name="service.family" value="Dovecot"/>
81
+ <param pos="0" name="service.product" value="Dovecot"/>
82
+ <param pos="1" name="os.vendor"/>
83
+ <param pos="2" name="host.name"/>
84
+ </fingerprint>
85
+
86
+ </fingerprints>