yawast 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/Dockerfile +0 -6
- data/README.md +3 -1
- data/lib/commands/cms.rb +5 -2
- data/lib/commands/dns.rb +9 -3
- data/lib/commands/head.rb +5 -3
- data/lib/commands/scan.rb +4 -2
- data/lib/commands/ssl.rb +4 -2
- data/lib/scanner/core.rb +1 -0
- data/lib/scanner/generic.rb +8 -0
- data/lib/scanner/ssl_labs.rb +114 -0
- data/lib/shared/output.rb +15 -1
- data/lib/version.rb +1 -1
- data/lib/yawast.rb +4 -0
- data/test/test_ssl_labs_analyze.rb +0 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6eb300bec83fd978ab09a5868fa37e6907942063
|
4
|
+
data.tar.gz: 6917a7cd0974f048968f573bd3b31c1827fcf6c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f61f93e1a8e844d5643c00c3051c1ca8f5003e7ed485c8aadc09b93084fc4e8f1d4d59508c6cfbd2cf1d93b96dad9ae7fa2345033e13eb101507fa47b5d90d30
|
7
|
+
data.tar.gz: caa33cda72644fa4efd5feb751ba906742eccd7b6bb358ee538a0cb92dc341fce5ced112c10e22ae970ff3f787c60fae102ec729ec6a2323e64a9c5ea1af9f23
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## 0.7.1 - 2019-05-07
|
2
|
+
|
3
|
+
* [#37](https://github.com/adamcaudill/yawast/issues/37) - Batch Scanning Mode
|
4
|
+
* [#165](https://github.com/adamcaudill/yawast/issues/165) - Add check for Referrer-Policy & Feature-Policy headers
|
5
|
+
* [#167](https://github.com/adamcaudill/yawast/issues/167) - SSL Labs: Add Zombie POODLE & Related Findings
|
6
|
+
|
1
7
|
## 0.7.0 - 2019-04-19
|
2
8
|
|
3
9
|
* [#38](https://github.com/adamcaudill/yawast/issues/38) - JSON Output Option via `--output=` (work in progress)
|
data/Dockerfile
CHANGED
@@ -36,15 +36,9 @@ RUN CHROME_STRING=$(/usr/bin/google-chrome-stable --version) \
|
|
36
36
|
&& rm /tmp/chromedriver_linux64.zip \
|
37
37
|
&& chmod +x /usr/bin/chromedriver
|
38
38
|
|
39
|
-
RUN groupadd -r chrome && useradd -r -g chrome -G audio,video chrome \
|
40
|
-
&& mkdir -p /home/chrome && chown -R chrome:chrome /home/chrome \
|
41
|
-
&& mkdir -p /opt/google/chrome && chown -R chrome:chrome /opt/google/chrome
|
42
|
-
|
43
39
|
COPY . /data
|
44
40
|
WORKDIR /data
|
45
41
|
|
46
|
-
USER chrome
|
47
|
-
|
48
42
|
ENV LANG C.UTF-8
|
49
43
|
ENV LANGUAGE C.UTF-8
|
50
44
|
ENV LC_ALL C.UTF-8
|
data/README.md
CHANGED
@@ -43,6 +43,8 @@ The following tests are performed:
|
|
43
43
|
* *(Generic)* X-Content-Type-Options header not present
|
44
44
|
* *(Generic)* Content-Security-Policy header not present
|
45
45
|
* *(Generic)* Public-Key-Pins header not present
|
46
|
+
* *(Generic)* Referrer-Policy header not present
|
47
|
+
* *(Generic)* Feature-Policy header not present
|
46
48
|
* *(Generic)* X-XSS-Protection disabled header present
|
47
49
|
* *(Generic)* SSL: HSTS not enabled
|
48
50
|
* *(Generic)* Source Control: Common source control directories present
|
@@ -122,7 +124,7 @@ In addition to these tests, certain basic information is also displayed, such as
|
|
122
124
|
|
123
125
|
The most common usage scenario is as simple as:
|
124
126
|
|
125
|
-
`yawast scan <
|
127
|
+
`yawast scan <url1> <url2>`
|
126
128
|
|
127
129
|
Detailed [usage information](https://github.com/adamcaudill/yawast/wiki/Usage-&-Parameters) is available on the wiki.
|
128
130
|
|
data/lib/commands/cms.rb
CHANGED
@@ -4,8 +4,11 @@ module Yawast
|
|
4
4
|
module Commands
|
5
5
|
class Cms
|
6
6
|
def self.process(args, options)
|
7
|
-
|
8
|
-
|
7
|
+
args.each do |arg|
|
8
|
+
uri = Yawast::Commands::Utils.extract_uri([arg])
|
9
|
+
|
10
|
+
Yawast::Scanner::Core.get_cms(uri, options)
|
11
|
+
end
|
9
12
|
end
|
10
13
|
end
|
11
14
|
end
|
data/lib/commands/dns.rb
CHANGED
@@ -10,10 +10,16 @@ module Yawast
|
|
10
10
|
|
11
11
|
Yawast::Shared::Output.setup uri, options unless options.output.nil?
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
args.each do |arg|
|
14
|
+
uri = Yawast::Commands::Utils.extract_uri([arg])
|
15
|
+
Yawast::Shared::Output.set_current_uri uri
|
16
|
+
|
17
|
+
puts "Scanning: #{uri}"
|
18
|
+
puts
|
19
|
+
|
20
|
+
Yawast::Scanner::Plugins::DNS::Generic.dns_info uri, options
|
21
|
+
end
|
15
22
|
|
16
|
-
Yawast::Scanner::Plugins::DNS::Generic.dns_info uri, options
|
17
23
|
Yawast::Shared::Output.write_file
|
18
24
|
end
|
19
25
|
end
|
data/lib/commands/head.rb
CHANGED
@@ -4,10 +4,12 @@ module Yawast
|
|
4
4
|
module Commands
|
5
5
|
class Head
|
6
6
|
def self.process(args, options)
|
7
|
-
|
7
|
+
args.each do |arg|
|
8
|
+
uri = Yawast::Commands::Utils.extract_uri([arg])
|
8
9
|
|
9
|
-
|
10
|
-
|
10
|
+
options.head = true
|
11
|
+
Yawast::Scanner::Core.process(uri, options)
|
12
|
+
end
|
11
13
|
end
|
12
14
|
end
|
13
15
|
end
|
data/lib/commands/scan.rb
CHANGED
@@ -4,9 +4,11 @@ module Yawast
|
|
4
4
|
module Commands
|
5
5
|
class Scan
|
6
6
|
def self.process(args, options)
|
7
|
-
|
7
|
+
args.each do |arg|
|
8
|
+
uri = Yawast::Commands::Utils.extract_uri([arg])
|
8
9
|
|
9
|
-
|
10
|
+
Yawast::Scanner::Core.process(uri, options)
|
11
|
+
end
|
10
12
|
end
|
11
13
|
end
|
12
14
|
end
|
data/lib/commands/ssl.rb
CHANGED
@@ -4,9 +4,11 @@ module Yawast
|
|
4
4
|
module Commands
|
5
5
|
class Ssl
|
6
6
|
def self.process(args, options)
|
7
|
-
|
7
|
+
args.each do |arg|
|
8
|
+
uri = Yawast::Commands::Utils.extract_uri([arg])
|
8
9
|
|
9
|
-
|
10
|
+
Yawast::Scanner::Core.check_ssl(uri, options, nil)
|
11
|
+
end
|
10
12
|
end
|
11
13
|
end
|
12
14
|
end
|
data/lib/scanner/core.rb
CHANGED
data/lib/scanner/generic.rb
CHANGED
@@ -22,6 +22,8 @@ module Yawast
|
|
22
22
|
via = ''
|
23
23
|
hpkp = ''
|
24
24
|
acao = ''
|
25
|
+
referrer_policy = ''
|
26
|
+
feature_policy = ''
|
25
27
|
|
26
28
|
Yawast::Utilities.puts_info 'HEAD:'
|
27
29
|
head.each do |k, v|
|
@@ -40,6 +42,8 @@ module Yawast
|
|
40
42
|
via = v if k.casecmp('via').zero?
|
41
43
|
hpkp = v if k.casecmp('public-key-pins').zero?
|
42
44
|
acao = v if k.casecmp('access-control-allow-origin').zero?
|
45
|
+
referrer_policy = v if k.casecmp('referrer-policy').zero?
|
46
|
+
feature_policy = v if k.casecmp('feature-policy').zero?
|
43
47
|
|
44
48
|
if k.casecmp('set-cookie').zero?
|
45
49
|
# this chunk of magic manages to properly split cookies, when multiple are sent together
|
@@ -107,6 +111,10 @@ module Yawast
|
|
107
111
|
|
108
112
|
Yawast::Utilities.puts_warn 'Access-Control-Allow-Origin: Unrestricted' if acao == '*'
|
109
113
|
|
114
|
+
Yawast::Utilities.puts_warn 'Referrer-Policy Header Not Present' if referrer_policy == ''
|
115
|
+
|
116
|
+
Yawast::Utilities.puts_warn 'Feature-Policy Header Not Present' if feature_policy == ''
|
117
|
+
|
110
118
|
puts ''
|
111
119
|
|
112
120
|
unless cookies.empty?
|
data/lib/scanner/ssl_labs.rb
CHANGED
@@ -560,6 +560,118 @@ module Yawast
|
|
560
560
|
{vulnerable: false}
|
561
561
|
end
|
562
562
|
|
563
|
+
Yawast::Shared::Output.log_hash 'vulnerabilities',
|
564
|
+
'tls_zombie_poodle',
|
565
|
+
{vulnerable: false, exploitable: false}
|
566
|
+
case ep['details']['zombiePoodle']
|
567
|
+
when -1
|
568
|
+
Yawast::Utilities.puts_error "\t\t\tZombie POODLE: Test Failed"
|
569
|
+
when 0
|
570
|
+
Yawast::Utilities.puts_error "\t\t\tZombie POODLE: Test Failed (Unknown)"
|
571
|
+
when 1
|
572
|
+
Yawast::Utilities.puts_info "\t\t\tZombie POODLE: No"
|
573
|
+
when 2
|
574
|
+
Yawast::Utilities.puts_warn "\t\t\tZombie POODLE: Vulnerable - Not Exploitable"
|
575
|
+
|
576
|
+
Yawast::Shared::Output.log_hash 'vulnerabilities',
|
577
|
+
'tls_zombie_poodle',
|
578
|
+
{vulnerable: true, exploitable: false}
|
579
|
+
when 3
|
580
|
+
Yawast::Utilities.puts_vuln "\t\t\tZombie POODLE: Vulnerable - Exploitable"
|
581
|
+
|
582
|
+
Yawast::Shared::Output.log_hash 'vulnerabilities',
|
583
|
+
'tls_zombie_poodle',
|
584
|
+
{vulnerable: true, exploitable: true}
|
585
|
+
when nil
|
586
|
+
# do nothing, this means they aren't sending the result
|
587
|
+
else
|
588
|
+
Yawast::Utilities.puts_error "\t\t\tZombie POODLE: Unknown Response #{ep['details']['zombiePoodle']}"
|
589
|
+
end
|
590
|
+
|
591
|
+
Yawast::Shared::Output.log_hash 'vulnerabilities',
|
592
|
+
'tls_goldendoodle',
|
593
|
+
{vulnerable: false, exploitable: false}
|
594
|
+
case ep['details']['goldenDoodle']
|
595
|
+
when -1
|
596
|
+
Yawast::Utilities.puts_error "\t\t\tGOLDENDOODLE: Test Failed"
|
597
|
+
when 0
|
598
|
+
Yawast::Utilities.puts_error "\t\t\tGOLDENDOODLE: Test Failed (Unknown)"
|
599
|
+
when 1
|
600
|
+
Yawast::Utilities.puts_info "\t\t\tGOLDENDOODLE: No"
|
601
|
+
when 4
|
602
|
+
Yawast::Utilities.puts_warn "\t\t\tGOLDENDOODLE: Vulnerable - Not Exploitable"
|
603
|
+
|
604
|
+
Yawast::Shared::Output.log_hash 'vulnerabilities',
|
605
|
+
'tls_goldendoodle',
|
606
|
+
{vulnerable: true, exploitable: false}
|
607
|
+
when 5
|
608
|
+
Yawast::Utilities.puts_vuln "\t\t\tGOLDENDOODLE: Vulnerable - Exploitable"
|
609
|
+
|
610
|
+
Yawast::Shared::Output.log_hash 'vulnerabilities',
|
611
|
+
'tls_goldendoodle',
|
612
|
+
{vulnerable: true, exploitable: true}
|
613
|
+
when nil
|
614
|
+
# do nothing, this means they aren't sending the result
|
615
|
+
else
|
616
|
+
Yawast::Utilities.puts_error "\t\t\tGOLDENDOODLE: Unknown Response #{ep['details']['goldenDoodle']}"
|
617
|
+
end
|
618
|
+
|
619
|
+
Yawast::Shared::Output.log_hash 'vulnerabilities',
|
620
|
+
'tls_openssl_cve_2019_1559',
|
621
|
+
{vulnerable: false, exploitable: false}
|
622
|
+
case ep['details']['zeroLengthPaddingOracle']
|
623
|
+
when -1
|
624
|
+
Yawast::Utilities.puts_error "\t\t\tOpenSSL 0-Length Padding Oracle (CVE-2019-1559): Test Failed"
|
625
|
+
when 0
|
626
|
+
Yawast::Utilities.puts_error "\t\t\tOpenSSL 0-Length Padding Oracle (CVE-2019-1559): Test Failed (Unknown)"
|
627
|
+
when 1
|
628
|
+
Yawast::Utilities.puts_info "\t\t\tOpenSSL 0-Length Padding Oracle (CVE-2019-1559): No"
|
629
|
+
when 6
|
630
|
+
Yawast::Utilities.puts_warn "\t\t\tOpenSSL 0-Length Padding Oracle (CVE-2019-1559): Vulnerable - Not Exploitable"
|
631
|
+
|
632
|
+
Yawast::Shared::Output.log_hash 'vulnerabilities',
|
633
|
+
'tls_openssl_cve_2019_1559',
|
634
|
+
{vulnerable: true, exploitable: false}
|
635
|
+
when 7
|
636
|
+
Yawast::Utilities.puts_vuln "\t\t\tOpenSSL 0-Length Padding Oracle (CVE-2019-1559): Vulnerable - Exploitable"
|
637
|
+
|
638
|
+
Yawast::Shared::Output.log_hash 'vulnerabilities',
|
639
|
+
'tls_openssl_cve_2019_1559',
|
640
|
+
{vulnerable: true, exploitable: true}
|
641
|
+
when nil
|
642
|
+
# do nothing, this means they aren't sending the result
|
643
|
+
else
|
644
|
+
Yawast::Utilities.puts_error "\t\t\tOpenSSL 0-Length Padding Oracle (CVE-2019-1559): Unknown Response #{ep['details']['zeroLengthPaddingOracle']}"
|
645
|
+
end
|
646
|
+
|
647
|
+
Yawast::Shared::Output.log_hash 'vulnerabilities',
|
648
|
+
'tls_goldendoodle',
|
649
|
+
{vulnerable: false, exploitable: false}
|
650
|
+
case ep['details']['sleepingPoodle']
|
651
|
+
when -1
|
652
|
+
Yawast::Utilities.puts_error "\t\t\tSleeping POODLE: Test Failed"
|
653
|
+
when 0
|
654
|
+
Yawast::Utilities.puts_error "\t\t\tSleeping POODLE: Test Failed (Unknown)"
|
655
|
+
when 1
|
656
|
+
Yawast::Utilities.puts_info "\t\t\tSleeping POODLE: No"
|
657
|
+
when 10
|
658
|
+
Yawast::Utilities.puts_warn "\t\t\tSleeping POODLE: Vulnerable - Not Exploitable"
|
659
|
+
|
660
|
+
Yawast::Shared::Output.log_hash 'vulnerabilities',
|
661
|
+
'tls_sleeping_poodle',
|
662
|
+
{vulnerable: true, exploitable: false}
|
663
|
+
when 11
|
664
|
+
Yawast::Utilities.puts_vuln "\t\t\tSleeping POODLE: Vulnerable - Exploitable"
|
665
|
+
|
666
|
+
Yawast::Shared::Output.log_hash 'vulnerabilities',
|
667
|
+
'tls_sleeping_poodle',
|
668
|
+
{vulnerable: true, exploitable: true}
|
669
|
+
when nil
|
670
|
+
# do nothing, this means they aren't sending the result
|
671
|
+
else
|
672
|
+
Yawast::Utilities.puts_error "\t\t\tSleeping POODLE: Unknown Response #{ep['details']['sleepingPoodle']}"
|
673
|
+
end
|
674
|
+
|
563
675
|
Yawast::Shared::Output.log_hash 'vulnerabilities',
|
564
676
|
'tls_poodle',
|
565
677
|
{vulnerable: false}
|
@@ -580,6 +692,8 @@ module Yawast
|
|
580
692
|
Yawast::Shared::Output.log_hash 'vulnerabilities',
|
581
693
|
'tls_poodle',
|
582
694
|
{vulnerable: true}
|
695
|
+
when nil
|
696
|
+
# do nothing, this means they aren't sending the result
|
583
697
|
else
|
584
698
|
Yawast::Utilities.puts_error "\t\t\tPOODLE (TLS): Unknown Response #{ep['details']['poodleTls']}"
|
585
699
|
end
|
data/lib/shared/output.rb
CHANGED
@@ -38,9 +38,16 @@ module Yawast
|
|
38
38
|
log_value 'ruby_version', "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
|
39
39
|
log_value 'openssl_version', OpenSSL::OPENSSL_VERSION
|
40
40
|
log_value 'platform', RUBY_PLATFORM
|
41
|
-
log_value 'target_uri', uri
|
42
41
|
log_value 'options', options.__hash__
|
43
42
|
log_value 'encoding', __ENCODING__
|
43
|
+
|
44
|
+
# setup the data structure to capture info for individual targets
|
45
|
+
@data['targets'] = {}
|
46
|
+
set_current_uri uri
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.set_current_uri(uri)
|
50
|
+
@current_uri = uri
|
44
51
|
end
|
45
52
|
|
46
53
|
def self.log_value(super_parent = nil, parent = nil, key, value)
|
@@ -89,6 +96,12 @@ module Yawast
|
|
89
96
|
def self.get_target(super_parent = nil, parent = nil)
|
90
97
|
target = @data
|
91
98
|
|
99
|
+
# make sure we are on the right URI, and that it exists
|
100
|
+
unless @current_uri.nil?
|
101
|
+
target['targets'][@current_uri] = {} if target['targets'][@current_uri].nil?
|
102
|
+
target = target['targets'][@current_uri]
|
103
|
+
end
|
104
|
+
|
92
105
|
# fix parent vs super confusion
|
93
106
|
if parent.nil? && !super_parent.nil?
|
94
107
|
parent = super_parent
|
@@ -129,6 +142,7 @@ module Yawast
|
|
129
142
|
return unless @setup
|
130
143
|
|
131
144
|
# note the ending time
|
145
|
+
set_current_uri nil
|
132
146
|
log_value 'end_time', Time.new.to_i.to_s
|
133
147
|
|
134
148
|
begin
|
data/lib/version.rb
CHANGED
data/lib/yawast.rb
CHANGED
@@ -30,6 +30,9 @@ module Yawast
|
|
30
30
|
HTTP_UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) YAWAST/#{VERSION} Chrome/61.0.3163.100 Safari/537.36"
|
31
31
|
|
32
32
|
def self.header
|
33
|
+
# prevent multiple runs
|
34
|
+
return if @header
|
35
|
+
|
33
36
|
puts '__ _____ _ _ ___ _____ _____ '
|
34
37
|
puts '\ \ / / _ \| | | |/ _ \ / ___|_ _|'
|
35
38
|
puts ' \ V / /_\ \ | | / /_\ \\\ `--. | | '
|
@@ -54,6 +57,7 @@ module Yawast
|
|
54
57
|
end
|
55
58
|
|
56
59
|
puts ''
|
60
|
+
@header = true
|
57
61
|
end
|
58
62
|
|
59
63
|
def self.options
|
@@ -100,7 +100,6 @@ class TestSSLLabsAnalyze < Minitest::Test
|
|
100
100
|
|
101
101
|
assert stdout_value.include?('www.forest.gov.tw'), "domain name not found in #{stdout_value}"
|
102
102
|
assert stdout_value.include?('Root Stores: Apple (trusted) Windows (trusted)'), "root store name not found in #{stdout_value}"
|
103
|
-
assert !stdout_value.include?('[E]'), "Error message found in #{stdout_value}"
|
104
103
|
|
105
104
|
restore_stdout
|
106
105
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yawast
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Caudill
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|