recog 3.1.1 → 3.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/Gemfile +6 -0
  4. data/Rakefile +7 -5
  5. data/lib/recog/db.rb +67 -68
  6. data/lib/recog/db_manager.rb +22 -21
  7. data/lib/recog/fingerprint/regexp_factory.rb +10 -13
  8. data/lib/recog/fingerprint/test.rb +9 -8
  9. data/lib/recog/fingerprint.rb +252 -262
  10. data/lib/recog/fingerprint_parse_error.rb +3 -1
  11. data/lib/recog/formatter.rb +41 -39
  12. data/lib/recog/match_reporter.rb +82 -83
  13. data/lib/recog/matcher.rb +37 -40
  14. data/lib/recog/matcher_factory.rb +7 -6
  15. data/lib/recog/nizer.rb +218 -224
  16. data/lib/recog/verifier.rb +30 -28
  17. data/lib/recog/verify_reporter.rb +69 -73
  18. data/lib/recog/version.rb +3 -1
  19. data/lib/recog.rb +2 -0
  20. data/recog/bin/recog_match +21 -20
  21. data/recog/xml/apache_modules.xml +2 -0
  22. data/recog/xml/dhcp_vendor_class.xml +1 -1
  23. data/recog/xml/favicons.xml +133 -1
  24. data/recog/xml/ftp_banners.xml +1 -1
  25. data/recog/xml/html_title.xml +140 -1
  26. data/recog/xml/http_cookies.xml +20 -2
  27. data/recog/xml/http_servers.xml +38 -17
  28. data/recog/xml/http_wwwauth.xml +17 -4
  29. data/recog/xml/mdns_device-info_txt.xml +49 -15
  30. data/recog/xml/sip_banners.xml +0 -2
  31. data/recog/xml/sip_user_agents.xml +1 -1
  32. data/recog/xml/snmp_sysdescr.xml +1 -2
  33. data/recog/xml/ssh_banners.xml +8 -0
  34. data/recog/xml/telnet_banners.xml +3 -2
  35. data/recog/xml/tls_jarm.xml +1 -1
  36. data/recog/xml/x11_banners.xml +1 -0
  37. data/recog/xml/x509_issuers.xml +1 -1
  38. data/recog/xml/x509_subjects.xml +0 -1
  39. data/recog.gemspec +14 -13
  40. data/spec/lib/recog/db_spec.rb +37 -36
  41. data/spec/lib/recog/fingerprint/regexp_factory_spec.rb +19 -20
  42. data/spec/lib/recog/fingerprint_spec.rb +44 -42
  43. data/spec/lib/recog/formatter_spec.rb +20 -18
  44. data/spec/lib/recog/match_reporter_spec.rb +35 -30
  45. data/spec/lib/recog/nizer_spec.rb +85 -101
  46. data/spec/lib/recog/verify_reporter_spec.rb +45 -44
  47. data/spec/spec_helper.rb +2 -1
  48. data.tar.gz.sig +1 -3
  49. metadata +3 -3
  50. metadata.gz.sig +0 -0
@@ -1,97 +1,93 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Recog
2
- class VerifyReporter
3
- attr_reader :formatter
4
- attr_reader :success_count, :warning_count, :failure_count
5
-
6
- def initialize(options, formatter, path=nil)
7
- @options = options
8
- @formatter = formatter
9
- @path = path
10
- reset_counts
11
- end
4
+ class VerifyReporter
5
+ attr_reader :formatter, :success_count, :warning_count, :failure_count
6
+
7
+ def initialize(options, formatter, path = nil)
8
+ @options = options
9
+ @formatter = formatter
10
+ @path = path
11
+ reset_counts
12
+ end
12
13
 
13
- def report(fingerprint_count)
14
- reset_counts
15
- if detail? and !@path.to_s.empty?
16
- formatter.status_message("\n#{@path}:\n")
14
+ def report(fingerprint_count)
15
+ reset_counts
16
+ formatter.status_message("\n#{@path}:\n") if detail? && !@path.to_s.empty?
17
+ yield self
18
+ summarize(fingerprint_count) unless @options.quiet
17
19
  end
18
- yield self
19
- summarize(fingerprint_count) unless @options.quiet
20
- end
21
20
 
22
- def success(text)
23
- @success_count += 1
24
- formatter.success_message("#{padding}#{text}") if detail?
25
- end
21
+ def success(text)
22
+ @success_count += 1
23
+ formatter.success_message("#{padding}#{text}") if detail?
24
+ end
26
25
 
27
- def warning(text, line=nil)
28
- return unless @options.warnings
29
- @warning_count += 1
30
- formatter.warning_message("#{path_label(line)}#{padding}WARN: #{text}")
31
- end
26
+ def warning(text, line = nil)
27
+ return unless @options.warnings
32
28
 
33
- def failure(text, line=nil)
34
- @failure_count += 1
35
- formatter.failure_message("#{path_label(line)}#{padding}FAIL: #{text}")
36
- end
29
+ @warning_count += 1
30
+ formatter.warning_message("#{path_label(line)}#{padding}WARN: #{text}")
31
+ end
32
+
33
+ def failure(text, line = nil)
34
+ @failure_count += 1
35
+ formatter.failure_message("#{path_label(line)}#{padding}FAIL: #{text}")
36
+ end
37
+
38
+ def print_name(fingerprint)
39
+ return unless detail? && fingerprint.tests.any?
37
40
 
38
- def print_name(fingerprint)
39
- if detail? && fingerprint.tests.any?
40
41
  name = fingerprint.name.empty? ? '[unnamed]' : fingerprint.name
41
42
  formatter.status_message("\n#{name}")
42
43
  end
43
- end
44
44
 
45
- def summarize(fingerprint_count)
46
- print_fingerprint_count(fingerprint_count) if detail?
47
- print_summary
48
- end
45
+ def summarize(fingerprint_count)
46
+ print_fingerprint_count(fingerprint_count) if detail?
47
+ print_summary
48
+ end
49
49
 
50
- def print_fingerprint_count(count)
51
- formatter.status_message("\nVerified #{count} fingerprints:")
52
- end
50
+ def print_fingerprint_count(count)
51
+ formatter.status_message("\nVerified #{count} fingerprints:")
52
+ end
53
53
 
54
- def print_summary
55
- colorize_summary(summary_line)
56
- end
54
+ def print_summary
55
+ colorize_summary(summary_line)
56
+ end
57
57
 
58
- private
58
+ private
59
59
 
60
- def reset_counts
61
- @success_count = @failure_count = @warning_count = 0
62
- end
60
+ def reset_counts
61
+ @success_count = @failure_count = @warning_count = 0
62
+ end
63
63
 
64
- def detail?
65
- @options.detail
66
- end
64
+ def detail?
65
+ @options.detail
66
+ end
67
67
 
68
- def path_label(line=nil)
69
- unless detail?
70
- line_label = line ? line.to_s + ":" : ""
71
- @path.to_s.empty? ? "" : "#{@path}:#{line_label} "
68
+ def path_label(line = nil)
69
+ return if detail?
70
+
71
+ line_label = line ? "#{line}:" : ''
72
+ @path.to_s.empty? ? '' : "#{@path}:#{line_label} "
72
73
  end
73
- end
74
74
 
75
- def padding
76
- ' ' if @options.detail
77
- end
75
+ def padding
76
+ ' ' if @options.detail
77
+ end
78
78
 
79
- def summary_line
80
- summary = "#{path_label}SUMMARY: Test completed with "
81
- summary << "#{@success_count} successful"
82
- summary << ", #{@warning_count} warnings"
83
- summary << ", and #{@failure_count} failures"
84
- summary
85
- end
79
+ def summary_line
80
+ "#{path_label}SUMMARY: Test completed with #{@success_count} successful, #{@warning_count} warnings, and #{@failure_count} failures"
81
+ end
86
82
 
87
- def colorize_summary(summary)
88
- if @failure_count > 0
89
- formatter.failure_message(summary)
90
- elsif @warning_count > 0
91
- formatter.warning_message(summary)
92
- else
93
- formatter.success_message(summary)
83
+ def colorize_summary(summary)
84
+ if @failure_count > 0
85
+ formatter.failure_message(summary)
86
+ elsif @warning_count > 0
87
+ formatter.warning_message(summary)
88
+ else
89
+ formatter.success_message(summary)
90
+ end
94
91
  end
95
92
  end
96
93
  end
97
- end
data/lib/recog/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Recog
2
- VERSION = '3.1.1'
4
+ VERSION = '3.1.2'
3
5
  end
data/lib/recog.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'recog/version'
2
4
  require 'recog/db_manager'
3
5
  require 'recog/nizer'
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'optparse'
4
5
  require 'ostruct'
@@ -8,47 +9,47 @@ require 'recog/matcher_factory'
8
9
  options = OpenStruct.new(color: false, detail: false, json_format: false, fail_fast: false, multi_match: false)
9
10
 
10
11
  option_parser = OptionParser.new do |opts|
11
- opts.banner = "Usage: #{$0} [options] XML_FINGERPRINT_FILE [BANNERS_FILE]"
12
- opts.separator "Identifies the matches and misses between the fingerprints and the banners file or STDIN"
13
- opts.separator ""
14
- opts.separator "Options"
12
+ opts.banner = "Usage: #{$PROGRAM_NAME} [options] XML_FINGERPRINT_FILE [BANNERS_FILE]"
13
+ opts.separator 'Identifies the matches and misses between the fingerprints and the banners file or STDIN'
14
+ opts.separator ''
15
+ opts.separator 'Options'
15
16
 
16
- opts.on("-f", "--format FORMATTER", [:summary, :detail, :json],
17
- "Choose a formatter.",
18
- " [s]ummary (default - failure/match msgs)",
19
- " [d]etail (msgs with total counts)",
20
- " [j]son (JSON failure/match msgs)") do |format|
21
- if format == :summary
17
+ opts.on('-f', '--format FORMATTER', %i[summary detail json],
18
+ 'Choose a formatter.',
19
+ ' [s]ummary (default - failure/match msgs)',
20
+ ' [d]etail (msgs with total counts)',
21
+ ' [j]son (JSON failure/match msgs)') do |format|
22
+ case format
23
+ when :summary
22
24
  options.detail = false
23
25
  options.json_format = false
24
- elsif format == :detail
26
+ when :detail
25
27
  options.detail = true
26
- elsif format == :json
28
+ when :json
27
29
  options.json_format = true
28
30
  end
29
31
  end
30
32
 
31
- opts.on("--fail-fast [NUM]",
32
- "Stop after number of failures (default: 10).") do |num|
33
+ opts.on('--fail-fast [NUM]',
34
+ 'Stop after number of failures (default: 10).') do |num|
33
35
  options.fail_fast = true
34
- options.stop_after = (num.to_i == 0) ? 10 : num.to_i
36
+ options.stop_after = num.to_i == 0 ? 10 : num.to_i
35
37
  end
36
38
 
37
- opts.on("-c", "--color", "Enable color in the output.") do
39
+ opts.on('-c', '--color', 'Enable color in the output.') do
38
40
  options.color = true
39
41
  end
40
42
 
41
- opts.on("--[no-]multi-match", "Enable or disable multiple matches (defaults to disabled)") do |o|
43
+ opts.on('--[no-]multi-match', 'Enable or disable multiple matches (defaults to disabled)') do |o|
42
44
  options.multi_match = o
43
45
  end
44
46
 
45
- opts.on("-h", "--help", "Show this message.") do
47
+ opts.on('-h', '--help', 'Show this message.') do
46
48
  puts opts
47
49
  exit
48
50
  end
49
51
  end
50
52
 
51
-
52
53
  begin
53
54
  option_parser.parse!(ARGV)
54
55
  rescue OptionParser::ParseError => e
@@ -65,4 +66,4 @@ end
65
66
  ndb = Recog::DB.new(ARGV.shift)
66
67
  options.fingerprints = ndb.fingerprints
67
68
  matcher = Recog::MatcherFactory.build(options)
68
- matcher.match_banners(ARGV.shift || "-")
69
+ matcher.match_banners(ARGV.shift || '-')
@@ -1196,6 +1196,7 @@
1196
1196
  <param pos="0" name="service.component.vendor" value="Apache"/>
1197
1197
  <param pos="0" name="service.component.product" value="mod_jk"/>
1198
1198
  <param pos="1" name="service.component.version"/>
1199
+ <param pos="0" name="service.component.cpe23" value="cpe:/a:apache:mod_jk:{service.component.version}"/>
1199
1200
  </fingerprint>
1200
1201
 
1201
1202
  <fingerprint pattern="mod_jk/?$">
@@ -1203,6 +1204,7 @@
1203
1204
  <example>mod_jk/</example>
1204
1205
  <param pos="0" name="service.component.vendor" value="Apache"/>
1205
1206
  <param pos="0" name="service.component.product" value="mod_jk"/>
1207
+ <param pos="0" name="service.component.cpe23" value="cpe:/a:apache:mod_jk:-"/>
1206
1208
  </fingerprint>
1207
1209
 
1208
1210
  <fingerprint pattern="mod_jk2/(\S+)$">
@@ -947,7 +947,7 @@
947
947
  <fingerprint pattern="^JNPR\.IVE$">
948
948
  <description>Juniper SSL VPN</description>
949
949
  <example>JNPR.IVE</example>
950
- <param pos="0" name="hw.device" value="SSL-VPN"/>
950
+ <param pos="0" name="hw.device" value="VPN"/>
951
951
  <param pos="0" name="hw.vendor" value="Juniper"/>
952
952
  <param pos="0" name="os.vendor" value="Juniper"/>
953
953
  <param pos="0" name="os.product" value="IVE OS"/>
@@ -30,6 +30,36 @@
30
30
  <param pos="0" name="service.product" value="Media Server"/>
31
31
  </fingerprint>
32
32
 
33
+ <fingerprint pattern="^(?:1a60f7f928a659f763204d525b3cf90d|6d4c72194ecff7ead96f65db45851be9|55ece828b1329741c1d553a6575d71f1)$">
34
+ <description>Radarr</description>
35
+ <!-- favicon-16x16.png -->
36
+
37
+ <example>1a60f7f928a659f763204d525b3cf90d</example>
38
+ <!-- favicon-32x32.png -->
39
+
40
+ <example>6d4c72194ecff7ead96f65db45851be9</example>
41
+ <!-- favicon.ico -->
42
+
43
+ <example>55ece828b1329741c1d553a6575d71f1</example>
44
+ <param pos="0" name="service.vendor" value="Radarr"/>
45
+ <param pos="0" name="service.product" value="Radarr"/>
46
+ </fingerprint>
47
+
48
+ <fingerprint pattern="^(?:b3ae051d2c6b875b2064288104856291|c24b156cfaa12860760793f43b487c21|657ebbffad0e5c71a1010fbc9b279b1e)$">
49
+ <description>Sonarr</description>
50
+ <!-- favicon-32x32.png -->
51
+
52
+ <example>b3ae051d2c6b875b2064288104856291</example>
53
+ <!-- favicon-16x16.png -->
54
+
55
+ <example>c24b156cfaa12860760793f43b487c21</example>
56
+ <!-- favicon.ico -->
57
+
58
+ <example>657ebbffad0e5c71a1010fbc9b279b1e</example>
59
+ <param pos="0" name="service.vendor" value="Sonarr"/>
60
+ <param pos="0" name="service.product" value="Sonarr"/>
61
+ </fingerprint>
62
+
33
63
  <fingerprint pattern="^0f584138aacfb79aaba7e2539fc4e642$">
34
64
  <description>Plex Media Server</description>
35
65
  <example>0f584138aacfb79aaba7e2539fc4e642</example>
@@ -1303,7 +1333,6 @@
1303
1333
  <param pos="0" name="os.family" value="Adaptive Security Appliance"/>
1304
1334
  <param pos="0" name="os.product" value="Adaptive Security Appliance"/>
1305
1335
  <param pos="0" name="os.certainty" value="0.5"/>
1306
- <param pos="0" name="os.cpe23" value="cpe:/o:cisco:adaptive_security_appliance_software:-"/>
1307
1336
  <param pos="0" name="hw.vendor" value="Cisco"/>
1308
1337
  <param pos="0" name="hw.family" value="Adaptive Security Appliance"/>
1309
1338
  <param pos="0" name="hw.product" value="Adaptive Security Appliance"/>
@@ -1698,6 +1727,7 @@
1698
1727
  <param pos="0" name="hw.vendor" value="HP"/>
1699
1728
  <param pos="0" name="hw.product" value="iLO 3"/>
1700
1729
  <param pos="0" name="hw.certainty" value="0.5"/>
1730
+ <param pos="0" name="hw.cpe23" value="cpe:/h:hp:integrated_lights-out_3:-"/>
1701
1731
  <param pos="0" name="os.vendor" value="HP"/>
1702
1732
  <param pos="0" name="os.device" value="Lights Out Management"/>
1703
1733
  <param pos="0" name="os.family" value="iLO"/>
@@ -2128,6 +2158,16 @@
2128
2158
  <param pos="0" name="service.cpe23" value="cpe:/a:apache:spark:-"/>
2129
2159
  </fingerprint>
2130
2160
 
2161
+ <fingerprint pattern="^0629ce6bd8a86ff6b5dbb2a24c040849$">
2162
+ <description>Apache Superset</description>
2163
+ <!-- favicon.png from version 2.1.0 -->
2164
+
2165
+ <example>0629ce6bd8a86ff6b5dbb2a24c040849</example>
2166
+ <param pos="0" name="service.vendor" value="Apache"/>
2167
+ <param pos="0" name="service.product" value="Superset"/>
2168
+ <param pos="0" name="service.cpe23" value="cpe:/a:apache:superset:-"/>
2169
+ </fingerprint>
2170
+
2131
2171
  <fingerprint pattern="^a3dcb28303f26786e262e0760781057a$">
2132
2172
  <description>Eltex device web interface</description>
2133
2173
  <example>a3dcb28303f26786e262e0760781057a</example>
@@ -2346,4 +2386,96 @@
2346
2386
  <param pos="0" name="service.product" value="R1Soft Server Backup Manager"/>
2347
2387
  </fingerprint>
2348
2388
 
2389
+ <fingerprint pattern="^(?:cc21dae362a981ea9ce93138cb855e66|372be2fa33d5836cdcf8c1867e6900c2|54bb0b4a353b89c42e63b8e8bd6ea504)$">
2390
+ <description>Jellyseerr</description>
2391
+ <!-- favicon.ico-->
2392
+
2393
+ <example>cc21dae362a981ea9ce93138cb855e66</example>
2394
+ <!-- favicon-16x16.png-->
2395
+
2396
+ <example>372be2fa33d5836cdcf8c1867e6900c2</example>
2397
+ <!-- favicon-32x32.png-->
2398
+
2399
+ <example>54bb0b4a353b89c42e63b8e8bd6ea504</example>
2400
+ <param pos="0" name="service.vendor" value="Jellyseerr"/>
2401
+ <param pos="0" name="service.product" value="Jellyseerr"/>
2402
+ </fingerprint>
2403
+
2404
+ <fingerprint pattern="^d6abc57c65b787c0418803ffc75a7fa0$">
2405
+ <description>MeterSphere - Open-source Continuous Testing Platform</description>
2406
+ <example>d6abc57c65b787c0418803ffc75a7fa0</example>
2407
+ <param pos="0" name="service.vendor" value="MeterSphere"/>
2408
+ <param pos="0" name="service.product" value="MeterSphere"/>
2409
+ <param pos="0" name="service.cpe23" value="cpe:/a:metersphere:metersphere:-"/>
2410
+ </fingerprint>
2411
+
2412
+ <fingerprint pattern="^(?:eddb2b697c8c3dab5a9572de564976d1|b0f000f8041a6f1d2c366972b1dbad69)$">
2413
+ <description>FatPipe Networks device web interface</description>
2414
+ <!--
2415
+ favicon.ico from multiple products and builds:
2416
+ * FatPipe MPVPN versions: 9.1.2r161p26, 9.1.2r164p5
2417
+ * FatPipe IPVPN versions: 9.1.2r129, 10.1.2r60p89
2418
+ * FatPipe WARP versions: 9.1.2r161p19, 9.1.2r161p26, 9.1.2r185
2419
+ * FatPipe SDWAN versions: unknown
2420
+ -->
2421
+
2422
+ <example>eddb2b697c8c3dab5a9572de564976d1</example>
2423
+ <!--
2424
+ favicon.ico from multiple products and builds:
2425
+ * FatPipe MPVPN version 9.1.2r161p26 to 9.1.2r164p5
2426
+ * FatPipe IPVPN versions: 9.1.2r129
2427
+ * FatPipe WARP versions: 9.1.2r161p19, 9.1.2r161p26, 9.1.2r185
2428
+ -->
2429
+
2430
+ <example>b0f000f8041a6f1d2c366972b1dbad69</example>
2431
+ <param pos="0" name="os.vendor" value="FatPipe Networks"/>
2432
+ <param pos="0" name="hw.vendor" value="FatPipe Networks"/>
2433
+ </fingerprint>
2434
+
2435
+ <fingerprint pattern="^619e4452da00dad6c3d7b5fd99b9390e$">
2436
+ <description>3CX Phone System Management Console</description>
2437
+ <example>619e4452da00dad6c3d7b5fd99b9390e</example>
2438
+ <param pos="0" name="service.vendor" value="3CX"/>
2439
+ <param pos="0" name="service.product" value="3CX Web Server"/>
2440
+ <param pos="0" name="service.cpe23" value="cpe:/a:3cx:3cx_web_server:-"/>
2441
+ </fingerprint>
2442
+
2443
+ <fingerprint pattern="^(?:4764ad78b4c0d93bc48d4d0df3b36c7e|8d8030454ec1d7f96c8fdf670d4eb3c6)$">
2444
+ <description>PaperCut MF and PaperCut NG - print management system</description>
2445
+ <!--
2446
+ favicon.ico across two products and multiple builds
2447
+ * PaperCut MF builds: 54736 to 65997
2448
+ * PaperCut NG builds: 59505
2449
+ -->
2450
+
2451
+ <example>4764ad78b4c0d93bc48d4d0df3b36c7e</example>
2452
+ <!-- favicon.ico from PaperCut MF builds: 47777 -->
2453
+
2454
+ <example>8d8030454ec1d7f96c8fdf670d4eb3c6</example>
2455
+ <param pos="0" name="service.vendor" value="PaperCut"/>
2456
+ </fingerprint>
2457
+
2458
+ <fingerprint pattern="^57801ef5135f6a6e8ea69baef85f8607$">
2459
+ <description>frp - fast reverse proxy</description>
2460
+ <!-- favicon.ico from frp version 0.48.0 -->
2461
+
2462
+ <example>57801ef5135f6a6e8ea69baef85f8607</example>
2463
+ <param pos="0" name="service.vendor" value="frp"/>
2464
+ <param pos="0" name="service.product" value="frp"/>
2465
+ </fingerprint>
2466
+
2467
+ <fingerprint pattern="^(?:924a68d347c80d0e502157e83812bb23|f1ac749564d5ba793550ec6bdc472e7c|ef9c0362bf20a086bb7c2e8ea346b9f0)$">
2468
+ <description>Roundcube Webmail</description>
2469
+ <!-- favicon.ico from Roundcube Webmail version 1.5.0+ -->
2470
+
2471
+ <example>924a68d347c80d0e502157e83812bb23</example>
2472
+ <!-- favicon.ico from Roundcube Webmail up to version 1.4.13 -->
2473
+
2474
+ <example>f1ac749564d5ba793550ec6bdc472e7c</example>
2475
+ <example>ef9c0362bf20a086bb7c2e8ea346b9f0</example>
2476
+ <param pos="0" name="service.vendor" value="Roundcube"/>
2477
+ <param pos="0" name="service.product" value="Webmail"/>
2478
+ <param pos="0" name="service.cpe23" value="cpe:/a:roundcube:webmail:-"/>
2479
+ </fingerprint>
2480
+
2349
2481
  </fingerprints>
@@ -615,7 +615,7 @@ more text</example>
615
615
  <param pos="0" name="os.family" value="z/OS"/>
616
616
  <param pos="0" name="os.device" value="Mainframe"/>
617
617
  <param pos="1" name="os.version"/>
618
- <param pos="0" name="os.cpe23" value="cpe:/o:ibm:z\/os:{os.version}"/>
618
+ <param pos="0" name="os.cpe23" value="cpe:/o:ibm:z%2fos:{os.version}"/>
619
619
  <param pos="2" name="host.name"/>
620
620
  </fingerprint>
621
621