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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +75 -0
- data/LICENSE.txt +21 -0
- data/README.md +59 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/pentest +6 -0
- data/lib/pentest.rb +77 -0
- data/lib/pentest/ast_utils.rb +76 -0
- data/lib/pentest/checkers.rb +21 -0
- data/lib/pentest/checkers/base_checker.rb +49 -0
- data/lib/pentest/checkers/sqli_checker.rb +226 -0
- data/lib/pentest/checkers/xss_checker.rb +87 -0
- data/lib/pentest/commandline.rb +41 -0
- data/lib/pentest/dsl.rb +15 -0
- data/lib/pentest/endpoint.rb +149 -0
- data/lib/pentest/fuzzers/sqli.txt +193 -0
- data/lib/pentest/fuzzers/xss.txt +164 -0
- data/lib/pentest/initializer.rb +8 -0
- data/lib/pentest/logger.rb +59 -0
- data/lib/pentest/payload.rb +76 -0
- data/lib/pentest/ruby_parser.rb +21 -0
- data/lib/pentest/runner.rb +58 -0
- data/lib/pentest/sql_proxy.rb +59 -0
- data/lib/pentest/version.rb +3 -0
- data/pentest.gemspec +50 -0
- metadata +218 -0
@@ -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
|
data/pentest.gemspec
ADDED
@@ -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: []
|