recog 3.1.1 → 3.1.2

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 (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