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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1aba32a01fc94c740097f8eb02fa3d37484acf8e
4
- data.tar.gz: d53636e718d386edc72e419eb74758835b051594
3
+ metadata.gz: ca95ad9fc713e6412fcb1cbd7e8d27865234ceb1
4
+ data.tar.gz: 51b2f2944d7c8f3d980e54b3094d32b293dddc7a
5
5
  SHA512:
6
- metadata.gz: '061946dabedeca606426289e01ec7e98a24bf0058b56b20ecfdf30434c8aeaea2bd6804d452f8e035609a366a44541434a7f15847a93b34a9fe3cab8227343de'
7
- data.tar.gz: 259922640eac9486df52ad25c66b1135319127005290b73ac6ddb9f050c1f57a51c2016354a86bbf12b1f6c8f7bc547d29525e7cea84315328087e72dc5c72fa
6
+ metadata.gz: c78fe0ba00c79ade41a29a9642508922ca2d968cbff56eedca71c96ddaae5529320fc93e7507fe5166c3cd46675828e30859acaa6773a66da763c3bec423771c
7
+ data.tar.gz: a73cca1a189cfe1127936ae22dfcae10f8cab91edfb0be1c4105bec2d18a42a98ad3a5f31b6970b87de8eaf2569a045892f84a1484168cde06ee7a385e6d5143
@@ -51,14 +51,8 @@ module Sekureco
51
51
  end
52
52
 
53
53
  def log
54
- 2.times { puts }
55
- if self.to_s.include? 'resizerElement'
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
 
@@ -12,7 +12,7 @@ module Sekureco
12
12
  end
13
13
 
14
14
  def get uri
15
- puts "GET #{uri.to_s}"
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
- puts "POST #{uri.to_s}"
27
- puts "params: #{params}"
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
@@ -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
- def initialize url, port, username = nil, password = nil, app_token = 'foo'
9
- @uri = URI "#{url}:#{port}/"
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
- next_link = URI.join(@uri.to_s, URI::encode(parse(current_link)))
30
- next if next_link.path.include? 'logout'
31
- response = if current_link["data-method"]
32
- @http_client.post(next_link, { '_method' => current_link['data-method'],
33
- 'authenticity_token' => @current_page.csrf_token })
34
- else
35
- @http_client.get(next_link)
36
- end
37
- next_page = HtmlPage.new(response.body)
38
- unless already_visited?(next_page)
39
- next_page.log
40
- mark_as_visited next_page
41
- update_distance next_page
42
- @queue << next_page
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
- puts "funcionou" if @vulnerabilities
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? "password"
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] >= 2
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}'>alert('It worked!');</script>"
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
- # default_email = "joao-bonfim"
4
- # default_password = "test"
5
- # website = "http://localhost"
6
- # puts "Crawling #{website}"
7
- # 2.times { puts }
8
- # wc = Sekureco::WebCrawler.new(website, 3000, default_email, default_password)
9
- # puts wc.test_application
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.2
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: []