recog-intrigue 2.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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>