recog 3.1.1 → 3.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/Gemfile +6 -0
- data/Rakefile +7 -5
- data/lib/recog/db.rb +67 -68
- data/lib/recog/db_manager.rb +22 -21
- data/lib/recog/fingerprint/regexp_factory.rb +10 -13
- data/lib/recog/fingerprint/test.rb +9 -8
- data/lib/recog/fingerprint.rb +252 -262
- data/lib/recog/fingerprint_parse_error.rb +3 -1
- data/lib/recog/formatter.rb +41 -39
- data/lib/recog/match_reporter.rb +82 -83
- data/lib/recog/matcher.rb +37 -40
- data/lib/recog/matcher_factory.rb +7 -6
- data/lib/recog/nizer.rb +218 -224
- data/lib/recog/verifier.rb +30 -28
- data/lib/recog/verify_reporter.rb +69 -73
- data/lib/recog/version.rb +3 -1
- data/lib/recog.rb +2 -0
- data/recog/bin/recog_match +21 -20
- data/recog/xml/apache_modules.xml +2 -0
- data/recog/xml/dhcp_vendor_class.xml +1 -1
- data/recog/xml/favicons.xml +133 -1
- data/recog/xml/ftp_banners.xml +1 -1
- data/recog/xml/html_title.xml +140 -1
- data/recog/xml/http_cookies.xml +20 -2
- data/recog/xml/http_servers.xml +38 -17
- data/recog/xml/http_wwwauth.xml +17 -4
- data/recog/xml/mdns_device-info_txt.xml +49 -15
- data/recog/xml/sip_banners.xml +0 -2
- data/recog/xml/sip_user_agents.xml +1 -1
- data/recog/xml/snmp_sysdescr.xml +1 -2
- data/recog/xml/ssh_banners.xml +8 -0
- data/recog/xml/telnet_banners.xml +3 -2
- data/recog/xml/tls_jarm.xml +1 -1
- data/recog/xml/x11_banners.xml +1 -0
- data/recog/xml/x509_issuers.xml +1 -1
- data/recog/xml/x509_subjects.xml +0 -1
- data/recog.gemspec +14 -13
- data/spec/lib/recog/db_spec.rb +37 -36
- data/spec/lib/recog/fingerprint/regexp_factory_spec.rb +19 -20
- data/spec/lib/recog/fingerprint_spec.rb +44 -42
- data/spec/lib/recog/formatter_spec.rb +20 -18
- data/spec/lib/recog/match_reporter_spec.rb +35 -30
- data/spec/lib/recog/nizer_spec.rb +85 -101
- data/spec/lib/recog/verify_reporter_spec.rb +45 -44
- data/spec/spec_helper.rb +2 -1
- data.tar.gz.sig +1 -3
- metadata +3 -3
- metadata.gz.sig +0 -0
@@ -1,97 +1,93 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Recog
|
2
|
-
class VerifyReporter
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
def success(text)
|
22
|
+
@success_count += 1
|
23
|
+
formatter.success_message("#{padding}#{text}") if detail?
|
24
|
+
end
|
26
25
|
|
27
|
-
|
28
|
-
|
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
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
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
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
45
|
+
def summarize(fingerprint_count)
|
46
|
+
print_fingerprint_count(fingerprint_count) if detail?
|
47
|
+
print_summary
|
48
|
+
end
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
def print_fingerprint_count(count)
|
51
|
+
formatter.status_message("\nVerified #{count} fingerprints:")
|
52
|
+
end
|
53
53
|
|
54
|
-
|
55
|
-
|
56
|
-
|
54
|
+
def print_summary
|
55
|
+
colorize_summary(summary_line)
|
56
|
+
end
|
57
57
|
|
58
|
-
|
58
|
+
private
|
59
59
|
|
60
|
-
|
61
|
-
|
62
|
-
|
60
|
+
def reset_counts
|
61
|
+
@success_count = @failure_count = @warning_count = 0
|
62
|
+
end
|
63
63
|
|
64
|
-
|
65
|
-
|
66
|
-
|
64
|
+
def detail?
|
65
|
+
@options.detail
|
66
|
+
end
|
67
67
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
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
|
-
|
76
|
-
|
77
|
-
|
75
|
+
def padding
|
76
|
+
' ' if @options.detail
|
77
|
+
end
|
78
78
|
|
79
|
-
|
80
|
-
|
81
|
-
|
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
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
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
data/lib/recog.rb
CHANGED
data/recog/bin/recog_match
CHANGED
@@ -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: #{$
|
12
|
-
opts.separator
|
13
|
-
opts.separator
|
14
|
-
opts.separator
|
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(
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
-
|
26
|
+
when :detail
|
25
27
|
options.detail = true
|
26
|
-
|
28
|
+
when :json
|
27
29
|
options.json_format = true
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
31
|
-
opts.on(
|
32
|
-
|
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 =
|
36
|
+
options.stop_after = num.to_i == 0 ? 10 : num.to_i
|
35
37
|
end
|
36
38
|
|
37
|
-
opts.on(
|
39
|
+
opts.on('-c', '--color', 'Enable color in the output.') do
|
38
40
|
options.color = true
|
39
41
|
end
|
40
42
|
|
41
|
-
opts.on(
|
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(
|
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="
|
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"/>
|
data/recog/xml/favicons.xml
CHANGED
@@ -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>
|
data/recog/xml/ftp_banners.xml
CHANGED
@@ -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
|
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
|
|