ronin-web 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data.tar.gz.sig +0 -0
  2. data/History.txt +25 -0
  3. data/Manifest.txt +36 -4
  4. data/README.txt +67 -64
  5. data/Rakefile +12 -3
  6. data/bin/ronin-web +1 -1
  7. data/lib/ronin/network/helpers/web.rb +221 -0
  8. data/lib/ronin/web.rb +1 -2
  9. data/lib/ronin/web/extensions.rb +0 -2
  10. data/lib/ronin/web/extensions/nokogiri.rb +0 -23
  11. data/lib/ronin/web/proxy.rb +3 -103
  12. data/lib/ronin/web/proxy/app.rb +31 -0
  13. data/lib/ronin/web/proxy/base.rb +41 -0
  14. data/lib/ronin/web/proxy/web.rb +42 -0
  15. data/lib/ronin/web/server.rb +3 -530
  16. data/lib/ronin/web/server/app.rb +31 -0
  17. data/lib/ronin/web/server/base.rb +334 -0
  18. data/lib/ronin/web/server/files.rb +92 -0
  19. data/lib/ronin/web/server/helpers.rb +25 -0
  20. data/lib/ronin/web/server/helpers/files.rb +126 -0
  21. data/lib/ronin/web/server/helpers/hosts.rb +72 -0
  22. data/lib/ronin/web/server/helpers/proxy.rb +153 -0
  23. data/lib/ronin/web/server/helpers/rendering.rb +36 -0
  24. data/lib/ronin/web/server/hosts.rb +86 -0
  25. data/lib/ronin/web/server/proxy.rb +116 -0
  26. data/lib/ronin/web/server/web.rb +62 -0
  27. data/lib/ronin/web/spider.rb +53 -26
  28. data/lib/ronin/web/version.rb +1 -3
  29. data/lib/ronin/web/web.rb +253 -95
  30. data/spec/spec_helper.rb +1 -1
  31. data/spec/web/proxy/base_spec.rb +9 -0
  32. data/spec/web/server/base_spec.rb +86 -0
  33. data/spec/web/server/classes/files/dir/file.txt +1 -0
  34. data/spec/web/server/classes/files/dir/index.html +1 -0
  35. data/spec/web/server/classes/files/dir2/file2.txt +1 -0
  36. data/spec/web/server/classes/files/dir3/page.xml +4 -0
  37. data/spec/web/server/classes/files/file.txt +1 -0
  38. data/spec/web/server/classes/files_app.rb +27 -0
  39. data/spec/web/server/classes/hosts_app.rb +40 -0
  40. data/spec/web/server/classes/proxy_app.rb +45 -0
  41. data/spec/web/server/classes/public1/static1.txt +1 -0
  42. data/spec/web/server/classes/public2/static2.txt +1 -0
  43. data/spec/web/server/classes/sub_app.rb +13 -0
  44. data/spec/web/server/classes/test_app.rb +20 -0
  45. data/spec/web/server/files_spec.rb +74 -0
  46. data/spec/web/server/helpers/server.rb +42 -0
  47. data/spec/web/server/hosts_spec.rb +55 -0
  48. data/spec/web/server/proxy_spec.rb +49 -0
  49. data/tasks/spec.rb +1 -0
  50. data/tasks/yard.rb +13 -0
  51. metadata +76 -17
  52. metadata.gz.sig +0 -0
  53. data/TODO.txt +0 -7
  54. data/lib/ronin/sessions/web.rb +0 -80
  55. data/lib/ronin/web/fingerprint.rb +0 -76
  56. data/spec/web/server_spec.rb +0 -142
@@ -0,0 +1,49 @@
1
+ require 'ronin/web/server/helpers/proxy'
2
+
3
+ require 'spec_helper'
4
+ require 'web/server/helpers/server'
5
+ require 'web/server/classes/proxy_app'
6
+
7
+ describe Web::Server::Helpers::Proxy do
8
+ include Helpers::Web::Server
9
+
10
+ before(:all) do
11
+ self.app = ProxyApp
12
+ end
13
+
14
+ it "should allow the proxying of requests for certain routes" do
15
+ get_host '/', 'www.example.com'
16
+
17
+ last_response.should be_ok
18
+ last_response.body.should =~ /RFC\s+2606/
19
+ end
20
+
21
+ it "should allow overriding the headers of proxied requests" do
22
+ get '/reddit/erlang'
23
+
24
+ last_response.should be_ok
25
+ last_response.body.should =~ /Erlang/
26
+ end
27
+
28
+ it "should allow modification of proxied responses" do
29
+ get_host '/r/erlang', 'www.reddit.com'
30
+
31
+ last_response.should be_ok
32
+ last_response.body.should_not =~ /erlang/i
33
+ last_response.body.should =~ /Fixed Gear Bicycle/
34
+ end
35
+
36
+ it "should allow modification of proxied HTML documents" do
37
+ get_host '/r/ruby', 'www.reddit.com'
38
+
39
+ last_response.should be_ok
40
+ last_response.body.should_not =~ /rails/i
41
+ end
42
+
43
+ it "should allow modification of proxied XML documents" do
44
+ get_host '/rss.php', 'milw0rm.com'
45
+
46
+ last_response.should be_ok
47
+ last_response.body.should_not =~ /(XSS|SQLi|SQL\s+Injection)/i
48
+ end
49
+ end
@@ -6,4 +6,5 @@ Spec::Rake::SpecTask.new(:spec) do |t|
6
6
  t.spec_opts = ['--colour', '--format', 'specdoc']
7
7
  end
8
8
 
9
+ task :test => :spec
9
10
  task :default => :spec
@@ -0,0 +1,13 @@
1
+ require 'ronin/yard/handlers'
2
+
3
+ YARD::Rake::YardocTask.new do |t|
4
+ t.files = ['lib/**/*.rb']
5
+ t.options = [
6
+ '--protected',
7
+ '--files', 'History.txt',
8
+ '--title', 'Ronin Web',
9
+ '--quiet'
10
+ ]
11
+ end
12
+
13
+ task :docs => :yardoc
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ronin-web
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Postmodern
@@ -30,7 +30,7 @@ cert_chain:
30
30
  pDj+ws7QjtH/Qcrr1l9jfN0ehDs=
31
31
  -----END CERTIFICATE-----
32
32
 
33
- date: 2009-07-08 00:00:00 -07:00
33
+ date: 2009-09-25 00:00:00 -07:00
34
34
  default_executable:
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
@@ -41,7 +41,7 @@ dependencies:
41
41
  requirements:
42
42
  - - ">="
43
43
  - !ruby/object:Gem::Version
44
- version: 0.9.0
44
+ version: 0.9.3
45
45
  version:
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: spidr
@@ -54,14 +54,14 @@ dependencies:
54
54
  version: 0.1.9
55
55
  version:
56
56
  - !ruby/object:Gem::Dependency
57
- name: rack
57
+ name: sinatra
58
58
  type: :runtime
59
59
  version_requirement:
60
60
  version_requirements: !ruby/object:Gem::Requirement
61
61
  requirements:
62
62
  - - ">="
63
63
  - !ruby/object:Gem::Version
64
- version: 1.0.0
64
+ version: 0.9.4
65
65
  version:
66
66
  - !ruby/object:Gem::Dependency
67
67
  name: ronin
@@ -71,7 +71,37 @@ dependencies:
71
71
  requirements:
72
72
  - - ">="
73
73
  - !ruby/object:Gem::Version
74
- version: 0.2.4
74
+ version: 0.3.0
75
+ version:
76
+ - !ruby/object:Gem::Dependency
77
+ name: rspec
78
+ type: :development
79
+ version_requirement:
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 1.2.8
85
+ version:
86
+ - !ruby/object:Gem::Dependency
87
+ name: test-unit
88
+ type: :development
89
+ version_requirement:
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "="
93
+ - !ruby/object:Gem::Version
94
+ version: 1.2.3
95
+ version:
96
+ - !ruby/object:Gem::Dependency
97
+ name: rack-test
98
+ type: :development
99
+ version_requirement:
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: 0.4.1
75
105
  version:
76
106
  - !ruby/object:Gem::Dependency
77
107
  name: hoe
@@ -81,15 +111,15 @@ dependencies:
81
111
  requirements:
82
112
  - - ">="
83
113
  - !ruby/object:Gem::Version
84
- version: 2.3.2
114
+ version: 2.3.3
85
115
  version:
86
116
  description: |-
87
117
  Ronin Web is a Ruby library for Ronin that provides support for web
88
118
  scraping and spidering functionality.
89
119
 
90
- Ronin is a Ruby platform designed for information security and data
91
- exploration tasks. Ronin allows for the rapid development and distribution
92
- of code over many of the common Source-Code-Management (SCM) systems.
120
+ Ronin is a Ruby platform for exploit development and security research.
121
+ Ronin allows for the rapid development and distribution of code, exploits
122
+ or payloads over many common Source-Code-Management (SCM) systems.
93
123
  email:
94
124
  - postmodern.mod3@gmail.com
95
125
  executables:
@@ -100,15 +130,12 @@ extra_rdoc_files:
100
130
  - History.txt
101
131
  - Manifest.txt
102
132
  - README.txt
103
- - TODO.txt
104
133
  files:
105
134
  - History.txt
106
135
  - Manifest.txt
107
136
  - README.txt
108
- - TODO.txt
109
137
  - Rakefile
110
138
  - bin/ronin-web
111
- - lib/ronin/sessions/web.rb
112
139
  - lib/ronin/web.rb
113
140
  - lib/ronin/web/extensions.rb
114
141
  - lib/ronin/web/extensions/nokogiri.rb
@@ -118,20 +145,52 @@ files:
118
145
  - lib/ronin/web/extensions/nokogiri/xml/attr.rb
119
146
  - lib/ronin/web/extensions/nokogiri/xml/element.rb
120
147
  - lib/ronin/web/extensions/nokogiri/xml/document.rb
121
- - lib/ronin/web/fingerprint.rb
122
148
  - lib/ronin/web/server.rb
149
+ - lib/ronin/web/server/helpers.rb
150
+ - lib/ronin/web/server/helpers/rendering.rb
151
+ - lib/ronin/web/server/helpers/files.rb
152
+ - lib/ronin/web/server/helpers/hosts.rb
153
+ - lib/ronin/web/server/helpers/proxy.rb
154
+ - lib/ronin/web/server/base.rb
155
+ - lib/ronin/web/server/files.rb
156
+ - lib/ronin/web/server/hosts.rb
157
+ - lib/ronin/web/server/proxy.rb
158
+ - lib/ronin/web/server/app.rb
159
+ - lib/ronin/web/server/web.rb
123
160
  - lib/ronin/web/proxy.rb
161
+ - lib/ronin/web/proxy/base.rb
162
+ - lib/ronin/web/proxy/app.rb
163
+ - lib/ronin/web/proxy/web.rb
124
164
  - lib/ronin/web/spider.rb
125
165
  - lib/ronin/web/web.rb
126
166
  - lib/ronin/web/version.rb
167
+ - lib/ronin/network/helpers/web.rb
127
168
  - tasks/spec.rb
169
+ - tasks/yard.rb
128
170
  - spec/spec_helper.rb
129
171
  - spec/web/helpers/server.rb
130
172
  - spec/web/helpers/root/index.html
131
173
  - spec/web/helpers/root/test.txt
132
174
  - spec/web/extensions/nokogiri_spec.rb
133
- - spec/web/server_spec.rb
134
- has_rdoc: true
175
+ - spec/web/server/classes/public1/static1.txt
176
+ - spec/web/server/classes/public2/static2.txt
177
+ - spec/web/server/classes/files/dir/file.txt
178
+ - spec/web/server/classes/files/dir/index.html
179
+ - spec/web/server/classes/files/dir2/file2.txt
180
+ - spec/web/server/classes/files/dir3/page.xml
181
+ - spec/web/server/classes/files/file.txt
182
+ - spec/web/server/classes/sub_app.rb
183
+ - spec/web/server/classes/test_app.rb
184
+ - spec/web/server/classes/files_app.rb
185
+ - spec/web/server/classes/hosts_app.rb
186
+ - spec/web/server/classes/proxy_app.rb
187
+ - spec/web/server/helpers/server.rb
188
+ - spec/web/server/base_spec.rb
189
+ - spec/web/server/files_spec.rb
190
+ - spec/web/server/hosts_spec.rb
191
+ - spec/web/server/proxy_spec.rb
192
+ - spec/web/proxy/base_spec.rb
193
+ has_rdoc: yard
135
194
  homepage: http://ronin.rubyforge.org/web/
136
195
  licenses: []
137
196
 
@@ -156,7 +215,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
215
  requirements: []
157
216
 
158
217
  rubyforge_project: ronin
159
- rubygems_version: 1.3.4
218
+ rubygems_version: 1.3.5
160
219
  signing_key:
161
220
  specification_version: 3
162
221
  summary: Ronin Web is a Ruby library for Ronin that provides support for web scraping and spidering functionality
metadata.gz.sig CHANGED
Binary file
data/TODO.txt DELETED
@@ -1,7 +0,0 @@
1
- == TODO:
2
-
3
- === Ronin Web 0.1.3:
4
-
5
- * Add configurable hooks to Web::Spider:
6
- * Leverage for SQL Injection, LFI and RFI scanning.
7
-
@@ -1,80 +0,0 @@
1
- #
2
- #--
3
- # Ronin Web - A Ruby library for Ronin that provides support for web
4
- # scraping and spidering functionality.
5
- #
6
- # Copyright (c) 2006-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
7
- #
8
- # This program is free software; you can redistribute it and/or modify
9
- # it under the terms of the GNU General Public License as published by
10
- # the Free Software Foundation; either version 2 of the License, or
11
- # (at your option) any later version.
12
- #
13
- # This program is distributed in the hope that it will be useful,
14
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- # GNU General Public License for more details.
17
- #
18
- # You should have received a copy of the GNU General Public License
19
- # along with this program; if not, write to the Free Software
20
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
- #++
22
- #
23
-
24
- require 'ronin/sessions/session'
25
- require 'ronin/web/web'
26
-
27
- module Ronin
28
- module Sessions
29
- module Web
30
- include Session
31
-
32
- setup_session do
33
- parameter :web_proxy,
34
- :default => lambda { Ronin::Web.proxy },
35
- :description => 'Web Proxy'
36
-
37
- parameter :web_user_agent,
38
- :default => lambda { Ronin::Web.user_agent },
39
- :description => 'Web User-Agent'
40
- end
41
-
42
- protected
43
-
44
- def web_agent(options={},&block)
45
- options[:proxy] ||= @web_proxy
46
- options[:user_agent] ||= @web_user_agent
47
-
48
- return Ronin::Web.agent(options,&block)
49
- end
50
-
51
- def web_get(uri,options={},&block)
52
- page = web_agent(options).get(uri)
53
-
54
- block.call(page) if block
55
- return page
56
- end
57
-
58
- def web_get_body(uri,options={},&block)
59
- body = web_agent(options).get(uri).body
60
-
61
- block.call(body) if block
62
- return body
63
- end
64
-
65
- def web_post(uri,options={},&block)
66
- page = web_agent(options).post(uri)
67
-
68
- block.call(page) if block
69
- return page
70
- end
71
-
72
- def web_post_body(uri,options={},&block)
73
- body = web_agent(options).post(uri).body
74
-
75
- block.call(body) if block
76
- return body
77
- end
78
- end
79
- end
80
- end
@@ -1,76 +0,0 @@
1
- #
2
- #--
3
- # Ronin Web - A Ruby library for Ronin that provides support for web
4
- # scraping and spidering functionality.
5
- #
6
- # Copyright (c) 2006-2009 Hal Brodigan (postmodern.mod3 at gmail.com)
7
- #
8
- # This program is free software; you can redistribute it and/or modify
9
- # it under the terms of the GNU General Public License as published by
10
- # the Free Software Foundation; either version 2 of the License, or
11
- # (at your option) any later version.
12
- #
13
- # This program is distributed in the hope that it will be useful,
14
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
- # GNU General Public License for more details.
17
- #
18
- # You should have received a copy of the GNU General Public License
19
- # along with this program; if not, write to the Free Software
20
- # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
- #++
22
- #
23
-
24
- module Ronin
25
- module Web
26
- module Fingerprint
27
- #
28
- # The Hash of web application identities and their associated
29
- # fingerprint tests.
30
- #
31
- def Fingerprint.tests
32
- @@ronin_web_fingerprints ||= Hash.new do |hash,key|
33
- hash[key] ||= []
34
- end
35
- end
36
-
37
- #
38
- # Adds a test for the web application identity with the specified
39
- # _name_ and _block_. When the _block_ is called, it will be passed
40
- # the URL of the unknown web application.
41
- #
42
- # Fingerprint.test_for('app') do |url|
43
- # url.path.include?('/app/')
44
- # end
45
- #
46
- def Fingerprint.test_for(name,&block)
47
- Fingerprint.tests[name.to_sym] << block
48
- return nil
49
- end
50
-
51
- #
52
- # Identifies the web application represented by the specified _url_,
53
- # returning the name of identified web application. If the
54
- # web application cannot be identified, +nil+ will be returned.
55
- #
56
- def Fingerprint.identify(url)
57
- unless url.kind_of?(URI)
58
- url = URI(url.to_s)
59
- end
60
-
61
- matches = []
62
-
63
- Fingerprint.tests.each do |name,blocks|
64
- blocks.each do |block|
65
- if block.call(url)
66
- matches << name
67
- break
68
- end
69
- end
70
- end
71
-
72
- return matches
73
- end
74
- end
75
- end
76
- end
@@ -1,142 +0,0 @@
1
- require 'ronin/web/server'
2
-
3
- require 'spec_helper'
4
- require 'web/helpers/server'
5
-
6
- describe Web::Server do
7
- before(:all) do
8
- @server = Web::Server.new do |server|
9
- server.default do |env|
10
- server.response('This is default.')
11
- end
12
-
13
- server.bind('/test/bind.xml') do |env|
14
- server.response('<secret/>', :content_type => 'text/xml')
15
- end
16
-
17
- server.paths_like(/path_patterns\/secret\./) do |env|
18
- server.response('No secrets here.')
19
- end
20
-
21
- server.map('/test/map') do |env|
22
- server.response('mapped')
23
- end
24
-
25
- server.file('/test/file.txt',File.join(WEB_SERVER_ROOT,'test.txt'))
26
-
27
- server.directory('/test/directory/',WEB_SERVER_ROOT)
28
- end
29
-
30
- @vhost = Web::Server.new do |vhost|
31
- vhost.bind('/test/virtual_host.xml') do |env|
32
- vhost.response('<virtual/>', :content_type => 'text/xml')
33
- end
34
- end
35
-
36
- @server.host('virtual.host.com') do |vhost|
37
- vhost.bind('/test/virtual_host.xml') do |env|
38
- vhost.response('<virtual/>', :content_type => 'text/xml')
39
- end
40
- end
41
-
42
- @server.hosts_like(/^virtual[0-9]\./) do |vhost|
43
- vhost.bind('/test/virtual_host_patterns.xml') do |env|
44
- vhost.response('<virtual-patterns/>', :content_type => 'text/xml')
45
- end
46
- end
47
- end
48
-
49
- it "should have a default host to listen on" do
50
- Web::Server.default_host.should_not be_nil
51
- end
52
-
53
- it "should have a default port to listen on" do
54
- Web::Server.default_port.should_not be_nil
55
- end
56
-
57
- it "should have built-in content types" do
58
- Web::Server.content_types.should_not be_empty
59
- end
60
-
61
- it "should map file extensions to content-types" do
62
- @server.content_type('html').should == 'text/html'
63
- end
64
-
65
- it "should have a default content-type for unknown files" do
66
- @server.content_type('lol').should == 'application/x-unknown-content-type'
67
- end
68
-
69
- it "should find the index file for a directory" do
70
- dir = WEB_SERVER_ROOT
71
-
72
- @server.index_of(dir).should == File.join(dir,'index.html')
73
- end
74
-
75
- it "should have a default response for un-matched paths" do
76
- path = '/test/default'
77
-
78
- get_path(@server,path).body.should == ['This is default.']
79
- end
80
-
81
- it "should bind a path to a certain response" do
82
- path = '/test/bind.xml'
83
-
84
- get_path(@server,path).body.should == ['<secret/>']
85
- end
86
-
87
- it "should match paths with patterns" do
88
- path = '/test/path_patterns/secret.pdf'
89
-
90
- get_path(@server,path).body.should == ['No secrets here.']
91
- end
92
-
93
- it "should match paths to sub-directories" do
94
- path = '/test/map/impossible.html'
95
-
96
- get_path(@server,path).body.should == ['mapped']
97
- end
98
-
99
- it "should return a response for a file" do
100
- path = '/test/file.txt'
101
-
102
- get_path(@server,path).body.should == ["This is a test.\n"]
103
- end
104
-
105
- it "should return files from bound directories" do
106
- path = '/test/directory/test.txt'
107
-
108
- get_path(@server,path).body.should == ["This is a test.\n"]
109
- end
110
-
111
- it "should return the index file for a bound directory" do
112
- path = '/test/directory/'
113
-
114
- get_path(@server,path).body.should == ["Index of files.\n"]
115
- end
116
-
117
- it "should match virtual hosts" do
118
- url = 'http://virtual.host.com/test/virtual_host.xml'
119
-
120
- get_url(@server,url).body.should == ['<virtual/>']
121
- end
122
-
123
- it "should match virtual hosts with patterns" do
124
- url = 'http://virtual0.host.com/test/virtual_host_patterns.xml'
125
-
126
- get_url(@server,url).body.should == ['<virtual-patterns/>']
127
- end
128
-
129
- it "should provide access to servers via their host-names" do
130
- virtual_host = @server.vhost('virtual.host.com')
131
- url = 'http://virtual.host.com/test/virtual_host.xml'
132
-
133
- get_url(virtual_host,url).body.should == ['<virtual/>']
134
- end
135
-
136
- it "should provide access to servers via their host-names that match virtual host patterns" do
137
- virtual_host = @server.vhost('virtual1.host.com')
138
- url = 'http://virtual0.host.com/test/virtual_host_patterns.xml'
139
-
140
- get_url(virtual_host,url).body.should == ['<virtual-patterns/>']
141
- end
142
- end