pentest 1.0.0

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.
@@ -0,0 +1,21 @@
1
+ require 'ruby_parser'
2
+
3
+ module Pentest
4
+ module RubyParser
5
+ class << self
6
+ # Get S-expression of specified method. Return nil if something went wrong.
7
+ def get_sexp(method)
8
+ file, loc = method.source_location
9
+ ast = ::RubyParser.new.parse File.read(file), file
10
+ ast.each do |exp|
11
+ next unless Sexp === exp
12
+ next unless exp[0] == :defn
13
+ if exp.line == loc
14
+ return exp
15
+ end
16
+ end
17
+ nil
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,58 @@
1
+ require 'pentest/endpoint'
2
+
3
+ module Pentest
4
+ class Runner
5
+ def initialize(app_path, hooks)
6
+ @app_path = app_path
7
+ @hooks = hooks
8
+ @routes = ::Rails.application.routes.routes
9
+
10
+ @ingredients = Set.new
11
+ end
12
+
13
+ def run
14
+ @endpoints = @routes.map do |route|
15
+ endpoint = Endpoint.new(route, @app_path, @hooks)
16
+ end.select(&:valid?)
17
+
18
+ Logger.debug "Fetched #{@endpoints.size} endpoints"
19
+ Logger.print_seperator
20
+
21
+ @hooks[:setups].each do |setup_proc|
22
+ self.instance_eval &setup_proc
23
+ end
24
+
25
+ # TODO: Add ingredients when not enough
26
+ Logger.debug "Registered Ingredients: #{@ingredients.to_a.inspect}"
27
+
28
+ payloads = []
29
+ @endpoints.each do |endpoint|
30
+ payloads += endpoint.scan!(@ingredients.to_a)
31
+ Logger.print_seperator
32
+ end
33
+
34
+ if payloads.empty?
35
+ Logger.info 'No vulnerabilities found'
36
+ return nil
37
+ end
38
+
39
+ Logger.error "#{payloads.size} vulnerabilities found!!"
40
+
41
+ payloads.each_with_index do |payload, index|
42
+ puts ''
43
+ puts ''
44
+ puts payload.to_s(index)
45
+ end
46
+
47
+ puts ''
48
+
49
+ :error
50
+ end
51
+
52
+ private
53
+
54
+ def add_ingredient(ingredient)
55
+ @ingredients << ingredient.to_s
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,59 @@
1
+ require 'arproxy'
2
+
3
+ module Pentest
4
+ class SqlProxy < Arproxy::Base
5
+ @handlers = nil
6
+ @parser = nil
7
+
8
+ def self.enable!(handler)
9
+ Arproxy.configure do |config|
10
+ config.use self
11
+ config.adapter_class.class_eval do
12
+ attr_accessor :handler
13
+ @@handler = handler
14
+ def exec_query_proxy(*args)
15
+ sql, = args
16
+ unless @@handler.nil?
17
+ @@handler.call(sql)
18
+ end
19
+ self.exec_query_original(*args)
20
+ end
21
+ alias_method :exec_query_original, :exec_query
22
+ alias_method :exec_query, :exec_query_proxy
23
+ end
24
+ end
25
+ Arproxy.enable!
26
+ Arproxy.proxy_chain.head.register_handler(handler)
27
+ end
28
+
29
+ def self.disable!(handler)
30
+ Arproxy.configure do |config|
31
+ config.adapter_class.class_eval do
32
+ alias_method :exec_query, :exec_query_original
33
+ end
34
+ end
35
+ Arproxy.proxy_chain.head.unregister_handler(handler)
36
+ Arproxy.disable!
37
+ end
38
+
39
+ def initialize
40
+ @handler = nil
41
+ end
42
+
43
+ def register_handler(handler)
44
+ @handler = handler
45
+ end
46
+
47
+ def unregister_handler(handler)
48
+ @handler = nil
49
+ end
50
+
51
+ def execute(*args)
52
+ sql, = args
53
+ unless @handler.nil?
54
+ @handler.call(sql)
55
+ end
56
+ super(*args)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,3 @@
1
+ module Pentest
2
+ VERSION = "1.0.0"
3
+ end
@@ -0,0 +1,50 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "pentest/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "pentest"
8
+ spec.version = Pentest::VERSION
9
+ spec.authors = ["Koki Takahashi"]
10
+ spec.email = ["hakatasiloving@gmail.com"]
11
+
12
+ spec.summary = %q{Penetration testing automation tool for Ruby on Rails application}
13
+ spec.description = %q{}
14
+ spec.homepage = "https://github.com/hakatashi/pentest"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ if spec.respond_to?(:metadata)
20
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
21
+
22
+ spec.metadata["homepage_uri"] = spec.homepage
23
+ spec.metadata["source_code_uri"] = "https://github.com/hakatashi/pentest"
24
+ spec.metadata["changelog_uri"] = "https://github.com/hakatashi/pentest"
25
+ else
26
+ raise "RubyGems 2.0 or newer is required to protect against " \
27
+ "public gem pushes."
28
+ end
29
+
30
+ # Specify which files should be added to the gem when it is released.
31
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
32
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
33
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
34
+ end
35
+ spec.bindir = "exe"
36
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
37
+ spec.require_paths = ["lib"]
38
+
39
+ spec.add_dependency "ruby_parser"
40
+ spec.add_dependency "term-ansicolor"
41
+ spec.add_dependency "pairwise"
42
+ spec.add_dependency "arproxy"
43
+ spec.add_dependency "callsite"
44
+ spec.add_dependency "gda"
45
+ spec.add_dependency "nokogiri"
46
+
47
+ spec.add_development_dependency "bundler", "~> 1.17"
48
+ spec.add_development_dependency "rake", "~> 10.0"
49
+ spec.add_development_dependency "rspec", "~> 3.0"
50
+ end
metadata ADDED
@@ -0,0 +1,218 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pentest
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Koki Takahashi
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-08-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: ruby_parser
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'
27
+ - !ruby/object:Gem::Dependency
28
+ name: term-ansicolor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pairwise
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: arproxy
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: callsite
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: gda
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: nokogiri
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: bundler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.17'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.17'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '10.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '10.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '3.0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '3.0'
153
+ description: ''
154
+ email:
155
+ - hakatasiloving@gmail.com
156
+ executables:
157
+ - pentest
158
+ extensions: []
159
+ extra_rdoc_files: []
160
+ files:
161
+ - ".gitignore"
162
+ - ".rspec"
163
+ - ".travis.yml"
164
+ - Gemfile
165
+ - Gemfile.lock
166
+ - LICENSE.txt
167
+ - README.md
168
+ - Rakefile
169
+ - bin/console
170
+ - bin/setup
171
+ - exe/pentest
172
+ - lib/pentest.rb
173
+ - lib/pentest/ast_utils.rb
174
+ - lib/pentest/checkers.rb
175
+ - lib/pentest/checkers/base_checker.rb
176
+ - lib/pentest/checkers/sqli_checker.rb
177
+ - lib/pentest/checkers/xss_checker.rb
178
+ - lib/pentest/commandline.rb
179
+ - lib/pentest/dsl.rb
180
+ - lib/pentest/endpoint.rb
181
+ - lib/pentest/fuzzers/sqli.txt
182
+ - lib/pentest/fuzzers/xss.txt
183
+ - lib/pentest/initializer.rb
184
+ - lib/pentest/logger.rb
185
+ - lib/pentest/payload.rb
186
+ - lib/pentest/ruby_parser.rb
187
+ - lib/pentest/runner.rb
188
+ - lib/pentest/sql_proxy.rb
189
+ - lib/pentest/version.rb
190
+ - pentest.gemspec
191
+ homepage: https://github.com/hakatashi/pentest
192
+ licenses:
193
+ - MIT
194
+ metadata:
195
+ allowed_push_host: https://rubygems.org
196
+ homepage_uri: https://github.com/hakatashi/pentest
197
+ source_code_uri: https://github.com/hakatashi/pentest
198
+ changelog_uri: https://github.com/hakatashi/pentest
199
+ post_install_message:
200
+ rdoc_options: []
201
+ require_paths:
202
+ - lib
203
+ required_ruby_version: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ required_rubygems_version: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - ">="
211
+ - !ruby/object:Gem::Version
212
+ version: '0'
213
+ requirements: []
214
+ rubygems_version: 3.0.3
215
+ signing_key:
216
+ specification_version: 4
217
+ summary: Penetration testing automation tool for Ruby on Rails application
218
+ test_files: []