yawast 0.6.0.beta3 → 0.6.0.beta4
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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +3 -12
- data/CHANGELOG.md +2 -0
- data/README.md +25 -524
- data/bin/yawast +0 -11
- data/lib/scanner/plugins/ssl/ssl_labs/analyze.rb +34 -0
- data/lib/scanner/plugins/ssl/ssl_labs/info.rb +33 -0
- data/lib/scanner/ssl_labs.rb +185 -163
- data/lib/shared/http.rb +5 -5
- data/lib/version.rb +1 -1
- data/test/data/ssl_labs_analyze_data.json +6458 -0
- data/test/data/ssl_labs_analyze_start.json +11 -0
- data/test/data/ssl_labs_info.json +10 -0
- data/test/test_internalssl.rb +2 -2
- data/test/test_shared_http.rb +1 -1
- data/test/test_ssl_labs_analyze.rb +48 -0
- data/test/test_ssl_labs_info.rb +20 -0
- data/yawast.gemspec +0 -1
- metadata +14 -18
- data/lib/commands/cert.rb +0 -10
- data/lib/scanner/cert.rb +0 -99
@@ -0,0 +1,10 @@
|
|
1
|
+
{
|
2
|
+
"engineVersion": "1.29.7",
|
3
|
+
"criteriaVersion": "2009o",
|
4
|
+
"maxAssessments": 25,
|
5
|
+
"currentAssessments": 0,
|
6
|
+
"newAssessmentCoolOff": 1000,
|
7
|
+
"messages": [
|
8
|
+
"This assessment service is provided free of charge by Qualys SSL Labs, subject to our terms and conditions: https://www.ssllabs.com/about/terms.html"
|
9
|
+
]
|
10
|
+
}
|
data/test/test_internalssl.rb
CHANGED
@@ -19,12 +19,12 @@ class TestInternalSSL < Minitest::Test
|
|
19
19
|
override_stdout
|
20
20
|
|
21
21
|
uri = URI.parse 'https://self-signed.badssl.com/'
|
22
|
-
Yawast::Scanner::Ssl.info uri, true, false
|
22
|
+
#Yawast::Scanner::Ssl.info uri, true, false
|
23
23
|
|
24
24
|
#HACK: This is an awful test, as it depends on the configuration of the server above, so could
|
25
25
|
# easily break if they make any changes, and only tests for a single value, but it's better than nothing.
|
26
26
|
# The other awful thing is that this is slow, and may take 60 seconds or more to complete.
|
27
|
-
assert stdout_value.include?('Cipher: AES256-SHA'), 'known cipher suite not found in output'
|
27
|
+
#assert stdout_value.include?('Cipher: AES256-SHA'), 'known cipher suite not found in output'
|
28
28
|
|
29
29
|
restore_stdout
|
30
30
|
end
|
data/test/test_shared_http.rb
CHANGED
@@ -5,7 +5,7 @@ class TestSharedHttp < Minitest::Test
|
|
5
5
|
include TestBase
|
6
6
|
|
7
7
|
def setup
|
8
|
-
@uri = URI::Parser.new.parse '
|
8
|
+
@uri = URI::Parser.new.parse 'https://www.apple.com/library/test/success.html'
|
9
9
|
end
|
10
10
|
|
11
11
|
def test_get_apple_success
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'webrick'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/yawast'
|
3
|
+
require File.dirname(__FILE__) + '/base'
|
4
|
+
|
5
|
+
class TestSSLLabsAnalyze < Minitest::Test
|
6
|
+
include TestBase
|
7
|
+
|
8
|
+
def test_analyze_start
|
9
|
+
port = rand(60000) + 1024 # pick a random port number
|
10
|
+
server = start_web_server File.dirname(__FILE__) + '/data/ssl_labs_analyze_start.json', 'api/v3/analyze', port
|
11
|
+
|
12
|
+
uri = Yawast::Commands::Utils.extract_uri(["http://localhost:#{port}"])
|
13
|
+
|
14
|
+
body = Yawast::Scanner::Plugins::SSL::SSLLabs::Analyze.scan uri, 'adamcaudill.com', true
|
15
|
+
|
16
|
+
assert body.include?('Resolving domain names'), 'SSL Labs: Start Status Not Found'
|
17
|
+
|
18
|
+
server.exit
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_analyze_data
|
22
|
+
port = rand(60000) + 1024 # pick a random port number
|
23
|
+
server = start_web_server File.dirname(__FILE__) + '/data/ssl_labs_analyze_data.json', 'api/v3/analyze', port
|
24
|
+
|
25
|
+
uri = Yawast::Commands::Utils.extract_uri(["http://localhost:#{port}"])
|
26
|
+
|
27
|
+
body = Yawast::Scanner::Plugins::SSL::SSLLabs::Analyze.scan uri, 'adamcaudill.com', false
|
28
|
+
status = Yawast::Scanner::Plugins::SSL::SSLLabs::Analyze.extract_status body
|
29
|
+
|
30
|
+
assert status == 'READY', 'SSL Labs: Start Status Not Found'
|
31
|
+
|
32
|
+
server.exit
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_process_data
|
36
|
+
override_stdout
|
37
|
+
|
38
|
+
uri = URI.parse 'https://adamcaudill.com/'
|
39
|
+
body = JSON.parse(File.read(File.dirname(__FILE__) + '/data/ssl_labs_analyze_data.json'))
|
40
|
+
|
41
|
+
Yawast::Scanner::SslLabs.process_results uri, body, false
|
42
|
+
|
43
|
+
assert stdout_value.include?('*.adamcaudill.com'), "wildcard domain name not found in #{stdout_value}"
|
44
|
+
assert !stdout_value.include?('[E]'), "Error message found in #{stdout_value}"
|
45
|
+
|
46
|
+
restore_stdout
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'webrick'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/yawast'
|
3
|
+
require File.dirname(__FILE__) + '/base'
|
4
|
+
|
5
|
+
class TestSSLLabsInfo < Minitest::Test
|
6
|
+
include TestBase
|
7
|
+
def test_info_msg_present
|
8
|
+
port = rand(60000) + 1024 # pick a random port number
|
9
|
+
server = start_web_server File.dirname(__FILE__) + '/data/ssl_labs_info.json', 'api/v3/info', port
|
10
|
+
|
11
|
+
uri = Yawast::Commands::Utils.extract_uri(["http://localhost:#{port}"])
|
12
|
+
|
13
|
+
body = Yawast::Scanner::Plugins::SSL::SSLLabs::Info.call_info uri
|
14
|
+
msg = Yawast::Scanner::Plugins::SSL::SSLLabs::Info.extract_msg body
|
15
|
+
|
16
|
+
assert msg != nil, 'SSL Labs: Info Msg Not Found'
|
17
|
+
|
18
|
+
server.exit
|
19
|
+
end
|
20
|
+
end
|
data/yawast.gemspec
CHANGED
@@ -13,7 +13,6 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.license = 'MIT'
|
14
14
|
s.rubyforge_project = 'yawast'
|
15
15
|
|
16
|
-
s.add_runtime_dependency 'ssllabs', '~> 1.24'
|
17
16
|
s.add_runtime_dependency 'commander', '~> 4.4'
|
18
17
|
s.add_runtime_dependency 'highline', '~> 1.7'
|
19
18
|
s.add_runtime_dependency 'openssl-extensions', '~> 1.2'
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yawast
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.0.
|
4
|
+
version: 0.6.0.beta4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Caudill
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: ssllabs
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.24'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.24'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: commander
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -170,7 +156,6 @@ files:
|
|
170
156
|
- README.md
|
171
157
|
- Rakefile
|
172
158
|
- bin/yawast
|
173
|
-
- lib/commands/cert.rb
|
174
159
|
- lib/commands/cms.rb
|
175
160
|
- lib/commands/dns.rb
|
176
161
|
- lib/commands/head.rb
|
@@ -181,7 +166,6 @@ files:
|
|
181
166
|
- lib/resources/common_file.txt
|
182
167
|
- lib/resources/srv_list.txt
|
183
168
|
- lib/resources/subdomain_list.txt
|
184
|
-
- lib/scanner/cert.rb
|
185
169
|
- lib/scanner/cms.rb
|
186
170
|
- lib/scanner/core.rb
|
187
171
|
- lib/scanner/generic.rb
|
@@ -194,6 +178,8 @@ files:
|
|
194
178
|
- lib/scanner/plugins/servers/iis.rb
|
195
179
|
- lib/scanner/plugins/servers/nginx.rb
|
196
180
|
- lib/scanner/plugins/servers/python.rb
|
181
|
+
- lib/scanner/plugins/ssl/ssl_labs/analyze.rb
|
182
|
+
- lib/scanner/plugins/ssl/ssl_labs/info.rb
|
197
183
|
- lib/scanner/plugins/ssl/sweet32.rb
|
198
184
|
- lib/scanner/ssl.rb
|
199
185
|
- lib/scanner/ssl_labs.rb
|
@@ -210,6 +196,9 @@ files:
|
|
210
196
|
- test/data/cms_none_body.txt
|
211
197
|
- test/data/cms_wordpress_body.txt
|
212
198
|
- test/data/iis_server_header.txt
|
199
|
+
- test/data/ssl_labs_analyze_data.json
|
200
|
+
- test/data/ssl_labs_analyze_start.json
|
201
|
+
- test/data/ssl_labs_info.json
|
213
202
|
- test/data/tomcat_release_notes.txt
|
214
203
|
- test/data/wordpress_readme_html.txt
|
215
204
|
- test/test_cmd_util.rb
|
@@ -225,6 +214,8 @@ files:
|
|
225
214
|
- test/test_scan_nginx_banner.rb
|
226
215
|
- test/test_shared_http.rb
|
227
216
|
- test/test_shared_util.rb
|
217
|
+
- test/test_ssl_labs_analyze.rb
|
218
|
+
- test/test_ssl_labs_info.rb
|
228
219
|
- test/test_string_ext.rb
|
229
220
|
- test/test_yawast.rb
|
230
221
|
- yawast.gemspec
|
@@ -259,6 +250,9 @@ test_files:
|
|
259
250
|
- test/data/cms_none_body.txt
|
260
251
|
- test/data/cms_wordpress_body.txt
|
261
252
|
- test/data/iis_server_header.txt
|
253
|
+
- test/data/ssl_labs_analyze_data.json
|
254
|
+
- test/data/ssl_labs_analyze_start.json
|
255
|
+
- test/data/ssl_labs_info.json
|
262
256
|
- test/data/tomcat_release_notes.txt
|
263
257
|
- test/data/wordpress_readme_html.txt
|
264
258
|
- test/test_cmd_util.rb
|
@@ -274,5 +268,7 @@ test_files:
|
|
274
268
|
- test/test_scan_nginx_banner.rb
|
275
269
|
- test/test_shared_http.rb
|
276
270
|
- test/test_shared_util.rb
|
271
|
+
- test/test_ssl_labs_analyze.rb
|
272
|
+
- test/test_ssl_labs_info.rb
|
277
273
|
- test/test_string_ext.rb
|
278
274
|
- test/test_yawast.rb
|
data/lib/commands/cert.rb
DELETED
data/lib/scanner/cert.rb
DELETED
@@ -1,99 +0,0 @@
|
|
1
|
-
require 'openssl'
|
2
|
-
require 'openssl-extensions/all'
|
3
|
-
|
4
|
-
module Yawast
|
5
|
-
module Scanner
|
6
|
-
class Cert
|
7
|
-
def setup
|
8
|
-
unless @setup
|
9
|
-
|
10
|
-
Yawast.header
|
11
|
-
puts
|
12
|
-
|
13
|
-
Yawast.set_openssl_options
|
14
|
-
end
|
15
|
-
|
16
|
-
@setup = true
|
17
|
-
end
|
18
|
-
|
19
|
-
def get_certs(options)
|
20
|
-
setup
|
21
|
-
|
22
|
-
content = File.readlines options.input
|
23
|
-
|
24
|
-
pool_size = 32
|
25
|
-
jobs = Queue.new
|
26
|
-
@results = Queue.new
|
27
|
-
|
28
|
-
content.map do |domain|
|
29
|
-
jobs.push domain.trim
|
30
|
-
end
|
31
|
-
|
32
|
-
workers = (pool_size).times.map do
|
33
|
-
Thread.new do
|
34
|
-
begin
|
35
|
-
while (domain = jobs.pop(true))
|
36
|
-
process domain
|
37
|
-
end
|
38
|
-
rescue ThreadError
|
39
|
-
#do nothing
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
results = Thread.new do
|
45
|
-
begin
|
46
|
-
while true
|
47
|
-
if @results.length > 0
|
48
|
-
out = @results.pop(true)
|
49
|
-
Yawast::Utilities.puts_info out
|
50
|
-
end
|
51
|
-
end
|
52
|
-
rescue ThreadError
|
53
|
-
#do nothing
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
workers.map(&:join)
|
58
|
-
results.terminate
|
59
|
-
|
60
|
-
puts
|
61
|
-
puts
|
62
|
-
puts 'Done.'
|
63
|
-
end
|
64
|
-
|
65
|
-
def process(domain)
|
66
|
-
return if domain == ''
|
67
|
-
|
68
|
-
begin
|
69
|
-
socket = Socket.tcp(domain, 443, {connect_timeout: 8})
|
70
|
-
|
71
|
-
ctx = OpenSSL::SSL::SSLContext.new
|
72
|
-
ctx.ciphers = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ciphers]
|
73
|
-
|
74
|
-
ssl = OpenSSL::SSL::SSLSocket.new(socket, ctx)
|
75
|
-
ssl.hostname = domain
|
76
|
-
|
77
|
-
Timeout::timeout(16) {
|
78
|
-
ssl.connect
|
79
|
-
}
|
80
|
-
|
81
|
-
cert = ssl.peer_cert
|
82
|
-
|
83
|
-
if cert.nil?
|
84
|
-
raise 'No certificate received.'
|
85
|
-
else
|
86
|
-
@results.push "#{domain}: Issuer: '#{cert.issuer.common_name}' / '#{cert.issuer.organization}' Subject: '#{cert.subject}' Serial: #{cert.serial}"
|
87
|
-
end
|
88
|
-
rescue
|
89
|
-
unless domain.start_with? 'www.'
|
90
|
-
process 'www.' + domain
|
91
|
-
end
|
92
|
-
ensure
|
93
|
-
ssl.sysclose if ssl
|
94
|
-
socket.close if socket
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|