recog 3.1.1 → 3.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) 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 +208 -2
  24. data/recog/xml/ftp_banners.xml +1 -1
  25. data/recog/xml/html_title.xml +143 -2
  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/rtsp_servers.xml +8 -0
  31. data/recog/xml/sip_banners.xml +0 -2
  32. data/recog/xml/sip_user_agents.xml +1 -1
  33. data/recog/xml/snmp_sysdescr.xml +1 -2
  34. data/recog/xml/ssh_banners.xml +8 -0
  35. data/recog/xml/telnet_banners.xml +3 -2
  36. data/recog/xml/tls_jarm.xml +1 -1
  37. data/recog/xml/x11_banners.xml +1 -0
  38. data/recog/xml/x509_issuers.xml +1 -1
  39. data/recog/xml/x509_subjects.xml +4 -1
  40. data/recog.gemspec +19 -13
  41. data/spec/lib/recog/db_spec.rb +37 -36
  42. data/spec/lib/recog/fingerprint/regexp_factory_spec.rb +19 -20
  43. data/spec/lib/recog/fingerprint_spec.rb +44 -42
  44. data/spec/lib/recog/formatter_spec.rb +20 -18
  45. data/spec/lib/recog/match_reporter_spec.rb +35 -30
  46. data/spec/lib/recog/nizer_spec.rb +85 -101
  47. data/spec/lib/recog/verify_reporter_spec.rb +45 -44
  48. data/spec/spec_helper.rb +2 -1
  49. data.tar.gz.sig +3 -3
  50. metadata +26 -85
  51. 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.3'
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,170 @@
2346
2386
  <param pos="0" name="service.product" value="R1Soft Server Backup Manager"/>
2347
2387
  </fingerprint>
2348
2388
 
2349
- </fingerprints>
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
+
2481
+ <fingerprint pattern="^c9ab649457b4e9affe91ff0ce488d15f$">
2482
+ <description>Freebox OS on Freebox Set-top Box Devices</description>
2483
+ <example>c9ab649457b4e9affe91ff0ce488d15f</example>
2484
+ <param pos="0" name="os.vendor" value="Freebox"/>
2485
+ <param pos="0" name="os.family" value="Linux"/>
2486
+ <param pos="0" name="os.product" value="Freebox OS"/>
2487
+ <param pos="0" name="hw.vendor" value="Freebox"/>
2488
+ <param pos="0" name="hw.device" value="Device"/>
2489
+ </fingerprint>
2490
+
2491
+ <fingerprint pattern="^b5ee418c61dc2b511fbc20b99a982b8d">
2492
+ <description>Logipacs</description>
2493
+ <example>b5ee418c61dc2b511fbc20b99a982b8d</example>
2494
+ <param pos="0" name="service.vendor" value="Neologica"/>
2495
+ <param pos="0" name="service.product" value="Logipacs Dicom server"/>
2496
+ <param pos="0" name="service.certainty" value="0.5"/>
2497
+ </fingerprint>
2498
+
2499
+ <fingerprint pattern="^5107de66fbe7255a56248c5c15be5a8d">
2500
+ <description>Synapse</description>
2501
+ <example>5107de66fbe7255a56248c5c15be5a8d</example>
2502
+ <param pos="0" name="service.vendor" value="Fujifilm"/>
2503
+ <param pos="0" name="service.product" value="SYNAPSE Medical Platform"/>
2504
+ <param pos="0" name="service.certainty" value="0.5"/>
2505
+ </fingerprint>
2506
+
2507
+ <fingerprint pattern="^6daa3eca79787964627179fd5a1c724d">
2508
+ <description>b-rayZ</description>
2509
+ <example>6daa3eca79787964627179fd5a1c724d</example>
2510
+ <param pos="0" name="service.vendor" value="B-RAYZ"/>
2511
+ <param pos="0" name="service.product" value="Augmenting Radiology Platform"/>
2512
+ <param pos="0" name="service.certainty" value="0.5"/>
2513
+ </fingerprint>
2514
+
2515
+ <fingerprint pattern="^ec26e2e3326cb5f8bd0b493b4ff2fa4c">
2516
+ <description>Perrenity</description>
2517
+ <example>ec26e2e3326cb5f8bd0b493b4ff2fa4c</example>
2518
+ <param pos="0" name="service.vendor" value="Telecomsoft"/>
2519
+ <param pos="0" name="service.product" value="Perennity radiology portal"/>
2520
+ <param pos="0" name="service.certainty" value="0.5"/>
2521
+ </fingerprint>
2522
+
2523
+ <fingerprint pattern="^dc499a7d439351c325b953bd3ca01fe5">
2524
+ <description>OsiriX</description>
2525
+ <example>dc499a7d439351c325b953bd3ca01fe5</example>
2526
+ <param pos="0" name="service.vendor" value="OsirX"/>
2527
+ <param pos="0" name="service.product" value="PACS or MEDSCAN platform"/>
2528
+ <param pos="0" name="service.certainty" value="0.5"/>
2529
+ </fingerprint>
2530
+
2531
+ <fingerprint pattern="^18b505dbacd4b14643a739fadd7ba669">
2532
+ <description>Merge PACS</description>
2533
+ <example>18b505dbacd4b14643a739fadd7ba669</example>
2534
+ <param pos="0" name="service.vendor" value="Merge Healthcare"/>
2535
+ <param pos="0" name="service.product" value="Merge PACS"/>
2536
+ <param pos="0" name="service.certainty" value="0.5"/>
2537
+ </fingerprint>
2538
+
2539
+ <fingerprint pattern="^6e028d7cc65a1430c68a581f8064e8e2">
2540
+ <description>Orthanc</description>
2541
+ <example>6e028d7cc65a1430c68a581f8064e8e2</example>
2542
+ <param pos="0" name="service.vendor" value="Orthanc"/>
2543
+ <param pos="0" name="service.product" value="Dicom Server"/>
2544
+ <param pos="0" name="service.certainty" value="0.5"/>
2545
+ </fingerprint>
2546
+
2547
+ <fingerprint pattern="^5104b4e1fd4d2ab80f0060272689391a">
2548
+ <description>Mantrey PACS</description>
2549
+ <example>5104b4e1fd4d2ab80f0060272689391a</example>
2550
+ <param pos="0" name="service.vendor" value="Mantrey"/>
2551
+ <param pos="0" name="service.product" value="Mantrey PACS"/>
2552
+ <param pos="0" name="service.certainty" value="0.5"/>
2553
+ </fingerprint>
2554
+
2555
+ </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