pwn 0.4.519 → 0.4.520

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
  SHA256:
3
- metadata.gz: fe3ddbaf62f25dd464ff0f20bc246bf64de86e8da5dd99ee9e4bb1e96809ed0e
4
- data.tar.gz: c412d6c18bdd5050f593315fb246d7269bac6af1de1cfa5dc604fdf1f5dc959c
3
+ metadata.gz: 9055d4138a29af0aaf29d6671972de3fb0bd903d76ee9bcfd6807e13202ad73d
4
+ data.tar.gz: 190e35d2c9c8ebc1dcc5bfb34fdfc60f313d5a815a13dcf8ccf1bc46b355cbfd
5
5
  SHA512:
6
- metadata.gz: e13ccc9856631374e168cd58877891784b45ea653eeed58e1c4cd2cc59737078f71aa5891e93c6afa0c0fb1f81f9ca7074cbcad48b411f33981bd495ba0eacca
7
- data.tar.gz: 5c341c124a7c4df33d0f63f272eb00b63e0f6f8a2bddbadade06bc1792fda1a57eddafe79cf70d4c4da28e1bc1538df473b33a892d05bdc06296531e482008ec
6
+ metadata.gz: 987a56505f9a8460198181f32328c8603d4c49de5fb0712540dd468ac485cc24ed70c3ac68e1287dbd10cc50597e01e32fd417046fbe06ed99a8cc33359e3d59
7
+ data.tar.gz: 29e0abf86279e6ca2af1fa6037dd431f812d2c73278c4195a11649e22ba7125070fed6253c6dcc5a100aa1e8564470b1e1e38f515897def9bc5af91e453e84f2
data/.rubocop_todo.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2022-07-28 21:42:33 UTC using RuboCop version 1.31.2.
3
+ # on 2022-08-29 16:58:30 UTC using RuboCop version 1.35.1.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
@@ -17,24 +17,18 @@ Layout/LineContinuationSpacing:
17
17
  - 'packer/provisioners/wpscan.rb'
18
18
  - 'vagrant/provisioners/beef.rb'
19
19
 
20
- # Offense count: 1
21
- # This cop supports unsafe autocorrection (--autocorrect-all).
22
- Lint/NonAtomicFileOperation:
23
- Exclude:
24
- - 'lib/pwn/plugins/baresip.rb'
25
-
26
20
  # Offense count: 264
27
21
  Lint/UselessAssignment:
28
22
  Enabled: false
29
23
 
30
- # Offense count: 263
31
- # Configuration parameters: IgnoredMethods, CountRepeatedAttributes.
24
+ # Offense count: 264
25
+ # Configuration parameters: AllowedMethods, AllowedPatterns, IgnoredMethods, CountRepeatedAttributes.
32
26
  Metrics/AbcSize:
33
27
  Max: 328
34
28
 
35
- # Offense count: 66
36
- # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
37
- # IgnoredMethods: refine
29
+ # Offense count: 68
30
+ # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, AllowedMethods, AllowedPatterns, IgnoredMethods.
31
+ # AllowedMethods: refine
38
32
  Metrics/BlockLength:
39
33
  Max: 196
40
34
 
@@ -44,22 +38,22 @@ Metrics/BlockNesting:
44
38
  Max: 5
45
39
 
46
40
  # Offense count: 94
47
- # Configuration parameters: IgnoredMethods.
41
+ # Configuration parameters: AllowedMethods, AllowedPatterns, IgnoredMethods.
48
42
  Metrics/CyclomaticComplexity:
49
43
  Max: 231
50
44
 
51
- # Offense count: 481
52
- # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
45
+ # Offense count: 482
46
+ # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, AllowedMethods, AllowedPatterns, IgnoredMethods.
53
47
  Metrics/MethodLength:
54
48
  Max: 466
55
49
 
56
- # Offense count: 44
50
+ # Offense count: 47
57
51
  # Configuration parameters: CountComments, CountAsOne.
58
52
  Metrics/ModuleLength:
59
53
  Max: 1186
60
54
 
61
55
  # Offense count: 86
62
- # Configuration parameters: IgnoredMethods.
56
+ # Configuration parameters: AllowedMethods, AllowedPatterns, IgnoredMethods.
63
57
  Metrics/PerceivedComplexity:
64
58
  Max: 51
65
59
 
@@ -67,7 +61,7 @@ Metrics/PerceivedComplexity:
67
61
  Style/ClassVars:
68
62
  Enabled: false
69
63
 
70
- # Offense count: 283
64
+ # Offense count: 284
71
65
  # This cop supports safe autocorrection (--autocorrect).
72
66
  # Configuration parameters: EnforcedStyle, SingleLineConditionsOnly, IncludeTernaryExpressions.
73
67
  # SupportedStyles: assign_to_condition, assign_inside_condition
@@ -80,6 +74,12 @@ Style/ExplicitBlockArgument:
80
74
  Exclude:
81
75
  - 'lib/pwn/plugins/nmap_it.rb'
82
76
 
77
+ # Offense count: 1
78
+ # This cop supports safe autocorrection (--autocorrect).
79
+ Style/RedundantBegin:
80
+ Exclude:
81
+ - 'bin/pwn_www_uri_buster'
82
+
83
83
  # Offense count: 95
84
84
  # This cop supports safe autocorrection (--autocorrect).
85
85
  Style/RedundantCondition:
@@ -92,7 +92,7 @@ Style/RedundantCondition:
92
92
  Style/SlicingWithRange:
93
93
  Enabled: false
94
94
 
95
- # Offense count: 564
95
+ # Offense count: 570
96
96
  # This cop supports safe autocorrection (--autocorrect).
97
97
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns, IgnoredPatterns.
98
98
  # URISchemes: http, https
data/Gemfile CHANGED
@@ -18,7 +18,7 @@ gem 'aws-sdk', '3.1.0'
18
18
  gem 'bettercap', '1.6.2'
19
19
  gem 'brakeman', '5.3.1'
20
20
  gem 'bson', '4.15.0'
21
- gem 'bundler', '>=2.3.20'
21
+ gem 'bundler', '>=2.3.21'
22
22
  gem 'bundler-audit', '0.9.1'
23
23
  gem 'bunny', '2.19.0'
24
24
  gem 'colorize', '0.8.1'
@@ -34,7 +34,7 @@ gem 'ipaddress', '0.8.3'
34
34
  gem 'js-beautify', '0.1.8'
35
35
  gem 'json', '2.6.2'
36
36
  gem 'jsonpath', '1.1.2'
37
- gem 'jwt', '2.4.1'
37
+ gem 'jwt', '2.5.0'
38
38
  gem 'luhn', '1.0.2'
39
39
  gem 'mail', '2.7.1'
40
40
  gem 'mongo', '2.18.1'
data/README.md CHANGED
@@ -37,7 +37,7 @@ $ rvm use ruby-3.1.2@pwn
37
37
  $ rvm list gemsets
38
38
  $ gem install --verbose pwn
39
39
  $ pwn
40
- pwn[v0.4.519]:001 >>> PWN.help
40
+ pwn[v0.4.520]:001 >>> PWN.help
41
41
  ```
42
42
 
43
43
  [![Installing the pwn Security Automation Framework](https://raw.githubusercontent.com/0dayInc/pwn/master/documentation/pwn_install.png)](https://youtu.be/G7iLUY4FzsI)
@@ -52,7 +52,7 @@ $ rvm use ruby-3.1.2@pwn
52
52
  $ gem uninstall --all --executables pwn
53
53
  $ gem install --verbose pwn
54
54
  $ pwn
55
- pwn[v0.4.519]:001 >>> PWN.help
55
+ pwn[v0.4.520]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
 
data/bin/pwn_sast CHANGED
@@ -11,12 +11,14 @@ OptionParser.new do |options|
11
11
  #{$PROGRAM_NAME} [opts]
12
12
  "
13
13
 
14
- options.on('-dDIR', '--dir-path=DIR', '<Required - Report Output Directory>') { |d| opts[:dir_path] = d }
15
-
16
14
  options.on('-uGITURI', '--uri-source-root=GITURI', '<Required - HTTP URI of Git Repo Scanned e.g. https://github.com/0dayInc/pwn/tree/master>') do |u|
17
15
  opts[:uri_source_root] = u
18
16
  end
19
17
 
18
+ options.on('-dDIR', '--dir-path=DIR', '<Optional - Report Output Directory (Defaults to ".")>') do |d|
19
+ opts[:dir_path] = d
20
+ end
21
+
20
22
  options.on('-tTHREADS', '--max-threads=THREADS', '<Optional # Test Cases to Run Simultaneously (Default 25)>') do |t|
21
23
  opts[:max_threads] = t
22
24
  end
@@ -53,12 +55,15 @@ begin
53
55
  dir_path ||= '.'
54
56
 
55
57
  uri_source_root = opts[:uri_source_root].to_s.scrub
58
+
56
59
  max_threads = opts[:max_threads]
60
+ max_threads ||= 25
61
+
57
62
  chosen_test_cases = opts[:chosen_test_cases]
58
63
  list_test_cases = opts[:list_test_cases]
59
64
 
60
- report_name = File.basename(Dir.pwd)
61
- report_name = opts[:report_name] unless opts[:report_name].nil?
65
+ report_name = opts[:report_name]
66
+ report_name ||= File.basename(Dir.pwd)
62
67
 
63
68
  start_reporting_server = opts[:start_reporting_server]
64
69
 
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: false
3
+
4
+ require 'pwn'
5
+ require 'optparse'
6
+ require 'uri'
7
+ require 'htmlentities'
8
+
9
+ opts = {}
10
+ OptionParser.new do |options|
11
+ options.banner = "USAGE:
12
+ #{$PROGRAM_NAME} [opts]
13
+ "
14
+
15
+ options.on('-tURL', '--target-url=URL', '<Required - Target URL)>') do |t|
16
+ opts[:target_url] = t
17
+ end
18
+
19
+ options.on('-wFILE', '--word-list=FILE', '<Required - Wordlist File to Use>') do |w|
20
+ opts[:wordlist] = w
21
+ end
22
+
23
+ options.on('-tTHREADS', '--max-threads=THREADS', '<Optional # HTTP Requests to Run Simultaneously (Default 100)>') do |t|
24
+ opts[:max_threads] = t
25
+ end
26
+
27
+ options.on('-dDIR', '--dir-path=DIR', '<Optional - Report Output Directory (Defaults to ".")>') do |w|
28
+ opts[:wordlist] = w
29
+ end
30
+
31
+ options.on('-nREPORTNAME', '--report-name=REPORTNAME', '<Optional Report Name (Defaults to, "<TARGET_URL_HOST>-<format("%Y-%m-%d_%H-%M-%S", Time.now)>")>') do |n|
32
+ opts[:report_name] = n
33
+ end
34
+
35
+ options.on('-s', '--[no-]start-reporting-server', '<Optional - Start Simple HTTP Server for Reporting>') do |s|
36
+ opts[:start_reporting_server] = s
37
+ end
38
+ end.parse!
39
+
40
+ if opts.empty?
41
+ puts `#{$PROGRAM_NAME} --help`
42
+ exit 1
43
+ end
44
+
45
+ begin
46
+ target_url = opts[:target_url]
47
+ raise "ERROR: Invalid URL #{target_url}\nBe sure to include URL scheme (e.g. http://)" if target_url =~ URI::DEFAULT_PARSER.make_regexp.nil?
48
+
49
+ parsed_target_url = URI.parse(target_url)
50
+
51
+ wordlist = opts[:wordlist]
52
+ raise "ERROR: #{wordlist} Does Not Exist." unless File.exist?(wordlist)
53
+
54
+ max_threads = opts[:max_threads]
55
+ max_threads ||= 100
56
+
57
+ dir_path = opts[:dir_path]
58
+ dir_path ||= '.'
59
+
60
+ report_name = opts[:report_name]
61
+ report_name ||= "#{parsed_target_url.host}-#{format('%Y-%m-%d_%H-%M-%S', Time.now)}"
62
+
63
+ start_reporting_server = opts[:start_reporting_server]
64
+
65
+ mutex = Mutex.new
66
+
67
+ results_hash = {
68
+ report_name: HTMLEntities.new.encode(
69
+ report_name.to_s.scrub.strip.chomp
70
+ ),
71
+ data: []
72
+ }
73
+
74
+ wordlist_arr = File.readlines(wordlist)
75
+ PWN::Plugins::ThreadPool.fill(
76
+ enumerable_array: wordlist_arr,
77
+ max_threads: max_threads
78
+ ) do |this_wl_line|
79
+ wordlist_line = this_wl_line.to_s.scrub.strip.chomp
80
+
81
+ next if wordlist_line.match?(/^#/)
82
+
83
+ http_methods = %i[GET HEAD POST PUT DELETE CONNECT OPTIONS TRACE]
84
+
85
+ http_methods.each do |http_method|
86
+ begin
87
+ print '.'
88
+ rest_client_resp_hash = {}
89
+ http_uri = "#{target_url}/#{wordlist_line}"
90
+ rest_client = PWN::Plugins::TransparentBrowser.open(browser_type: :rest)::Request
91
+ response = rest_client_request.execute(
92
+ method: http_method,
93
+ url: http_uri,
94
+ verify_ssl: false
95
+ )
96
+
97
+ rest_client_resp_hash = {
98
+ request_timestamp: format('%Y-%m-%d_%H-%M-%S', Time.now),
99
+ http_uri: http_uri,
100
+ http_method: http_method,
101
+ http_resp_code: response.code,
102
+ http_resp: response.body
103
+ }
104
+ rescue RestClient::Forbidden,
105
+ RestClient::BadRequest,
106
+ RestClient::NotFound => e
107
+
108
+ rest_client_resp_hash = {
109
+ request_timestamp: format('%Y-%m-%d_%H-%M-%S', Time.now),
110
+ http_uri: http_uri,
111
+ http_method: http_method,
112
+ http_resp_code: e.response.code,
113
+ http_resp: e.response.body
114
+ }
115
+ next
116
+ ensure
117
+ mutex.synchronize do
118
+ results_hash[:data].push(rest_client_resp_hash)
119
+ end
120
+ end
121
+ end
122
+ end
123
+
124
+ # Generate HTML Report
125
+ print "#{$PROGRAM_NAME} Generating Report..."
126
+ PWN::Reports::URIBuster.generate(
127
+ dir_path: dir_path,
128
+ results_hash: results_hash
129
+ )
130
+ puts 'complete.'
131
+
132
+ # Start Simple HTTP Server (If Requested)
133
+ if start_reporting_server
134
+ listen_port = Random.rand(1_025..65_535).to_s
135
+
136
+ if pwn_provider == 'docker'
137
+ listen_ip = '0.0.0.0'
138
+ else
139
+ listen_ip = '127.0.0.1'
140
+ end
141
+
142
+ puts "For Scan Results Navigate to: http://127.0.0.1:#{listen_port}/pwn_www_uri_buster.html"
143
+ Dir.chdir(dir_path)
144
+ system(
145
+ 'pwn_simple_http_server',
146
+ '-i',
147
+ listen_ip,
148
+ '-p',
149
+ listen_port
150
+ )
151
+ end
152
+ rescue SystemExit, Interrupt
153
+ puts "\nGoodbye."
154
+ rescue StandardError => e
155
+ raise e
156
+ end
@@ -0,0 +1,240 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module PWN
6
+ module Reports
7
+ # This plugin generates the War Dialing results produced by pwn_www_uri_buster.
8
+ module URIBuster
9
+ # Supported Method Parameters::
10
+ # PWN::Reports::URIBuster.generate(
11
+ # dir_path: dir_path,
12
+ # results_hash: results_hash
13
+ # )
14
+
15
+ public_class_method def self.generate(opts = {})
16
+ dir_path = opts[:dir_path].to_s if File.directory?(opts[:dir_path].to_s)
17
+ raise "PWN Error: Invalid Directory #{dir_path}" if dir_path.nil?
18
+
19
+ results_hash = opts[:results_hash]
20
+
21
+ File.write(
22
+ "#{dir_path}/pwn_www_uri_buster.json",
23
+ JSON.pretty_generate(results_hash)
24
+ )
25
+
26
+ html_report = %q{<!DOCTYPE HTML>
27
+ <html>
28
+ <head>
29
+ <!-- favicon.ico from https://0dayinc.com -->
30
+ <link rel="icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABIXAAASFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAACJAgAAiSYAAIlbAACJcAAAiX0AAIlmAACJLQAAiQQAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAACJAAAAiS0AAIluAACJdwAAiXgAAIl+AACJeAAAiXQAAIk5AACJAQAAiQAAAAAAAAAAAAAAAAAAAAAAAACJAAAAiRgAAIlvAACJbQAAiXcAAIl7AACJcwAAiXEAAIl1AACJZwAAiR4AAIkAAACJAAAAAAAAAAAAAACJAAAAiQAAAIlEAACJfAAAiXIAAIlyAACJewAAiX4AAIl5AACJdQAAiXcAAIlIAACJAAAAiQAAAAAAAAAAAAAAiQAAAIkJAACJWQAAiXUAAIl9AACJdAAAiYYAAImLAACJdAAAiXkAAImNAACJfQAAiQwAAIkAAAAAAAAAAAAAAIkAAACJFQAAiWsAAIl2AACJfAAAiYIAAImCAACJfwAAiXYAAIl5AACJiQAAiYYAAIkWAACJAAAAAAAAAAAAAACJAAAAiSAAAIl2AACJeQAAiXkAAIl1AACJfwAAiYEAAIl8AACJbwAAiXoAAImBAACJFgAAiQAAAAAAAAAAAAAAiQAAAIkpAACJeAAAiXMAAIl3AACJeQAAiXUAAImAAACJfwAAiWYAAIl4AACJfwAAiR4AAIkAAAAAAAAAAAAAAIkAAACJKAAAiXkAAIlyAACJdQAAiXQAAIluAACJfAAAiXwAAIl3AACJewAAiXwAAIkvAACJAAAAAAAAAAAAAACJAAAAiSMAAIl4AACJdgAAiXsAAIl1AACJcQAAiXcAAIl6AACJeQAAiXoAAIl0AACJKQAAiQAAAAAAAAAAAAAAiQAAAIkXAACJaAAAiXgAAIl3AACJfAAAiXkAAIl3AACJZwAAiXcAAIl0AACJagAAiSgAAIkAAAAAAAAAAAAAAIkAAACJDgAAiV4AAIl5AACJbwAAiW4AAIl9AACJewAAiXcAAIl6AACJfQAAiW8AAIkWAACJAAAAAAAAAAAAAACJAAAAiQ0AAIllAACJewAAiXYAAIl4AACJdQAAiXUAAIl4AACJbQAAiXkAAIlNAACJAwAAiQAAAAAAAAAAAAAAiQAAAIkCAACJPQAAiXMAAIl2AACJeAAAiWgAAIlsAACJfQAAiXsAAIlwAACJGQAAiQAAAIkAAAAAAAAAAAAAAAAAAACJAAAAiQcAAIk4AACJXAAAiXoAAIl7AACJfAAAiYAAAIlsAACJJwAAiQMAAIkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIkAAACJAQAAiSsAAIluAACJewAAiXwAAIluAACJKgAAiQAAAIkAAAAAAAAAAAAAAAAA8A8AAPAHAADgBwAA4AcAAMADAADAAwAAwAMAAMADAADAAwAAwAMAAMADAADAAwAAwAMAAMAHAADgBwAA8B8AAA==" type="image/x-icon" />
31
+ <style>
32
+ body {
33
+ font-family: Verdana, Geneva, sans-serif;
34
+ font-size: 11px;
35
+ background-color: #FFFFFF;
36
+ color: #084B8A !important;
37
+ }
38
+
39
+ a:link {
40
+ color: #0174DF;
41
+ text-decoration: none;
42
+ }
43
+
44
+ a:visited {
45
+ color: #B40404;
46
+ text-decoration: none;
47
+ }
48
+
49
+ a:hover {
50
+ color: #01A9DB;
51
+ text-decoration: underline;
52
+ }
53
+
54
+ a:active {
55
+ color: #610B5E;
56
+ text-decoration: underline;
57
+ }
58
+
59
+ table {
60
+ width: 100%;
61
+ border-spacing:0px;
62
+ }
63
+
64
+ table.squish {
65
+ table-layout: fixed;
66
+ }
67
+
68
+ td {
69
+ vertical-align: top;
70
+ word-wrap: break-word !important;
71
+ }
72
+
73
+ .highlighted {
74
+ background-color: #F2F5A9 !important;
75
+ }
76
+ </style>
77
+
78
+ <!-- jQuery, DataTables, & FancyApps -->
79
+ <script type="text/javascript" src="//code.jquery.com/jquery-3.6.0.min.js"></script>
80
+
81
+ <link rel="stylesheet" type="text/css" href="//cdn.datatables.net/v/dt/dt-1.11.4/b-2.2.2/b-colvis-2.2.2/b-html5-2.2.2/b-print-2.2.2/cr-1.5.5/fc-4.0.1/fh-3.2.1/kt-2.6.4/r-2.2.9/rg-1.1.4/rr-1.2.8/sc-2.0.5/sp-1.4.0/sl-1.3.4/datatables.min.css"/>
82
+
83
+ <script type="text/javascript" src="//cdn.datatables.net/v/dt/dt-1.11.4/b-2.2.2/b-colvis-2.2.2/b-html5-2.2.2/b-print-2.2.2/cr-1.5.5/fc-4.0.1/fh-3.2.1/kt-2.6.4/r-2.2.9/rg-1.1.4/rr-1.2.8/sc-2.0.5/sp-1.4.0/sl-1.3.4/datatables.min.js"></script>
84
+
85
+ </head>
86
+
87
+ <body id="pwn_body">
88
+
89
+ <h1 style="display:inline">
90
+ <a href="https://github.com/0dayinc/pwn/tree/master">~ pwn www uri buster</a>
91
+ </h1><br /><br />
92
+ <h2 id="report_name"></h2><br />
93
+
94
+ <div><button type="button" id="button">Rows Selected</button></div><br />
95
+ <div>
96
+ <b>Toggle Column(s):</b>&nbsp;
97
+ <a class="toggle-vis" data-column="1" href="#">Request Time</a>&nbsp;|&nbsp;
98
+ <a class="toggle-vis" data-column="2" href="#">URI</a>&nbsp;|&nbsp;
99
+ <a class="toggle-vis" data-column="3" href="#">HTTP Method</a>&nbsp;|&nbsp;
100
+ <a class="toggle-vis" data-column="4" href="#">HTTP Response Code</a>&nbsp;|&nbsp;
101
+ <a class="toggle-vis" data-column="5" href="#">HTTP Response</a>&nbsp;|&nbsp;
102
+ </div>
103
+ <br /><br />
104
+
105
+ <div>
106
+ <table id="pwn_www_uri_buster_results" class="display" cellspacing="0">
107
+ <thead>
108
+ <tr>
109
+ <th>#</th>
110
+ <th>Request Time</th>
111
+ <th>URI</th>
112
+ <th>HTTP Method</th>
113
+ <th>HTTP Response Code</th>
114
+ <th>HTTP Response</th>
115
+ </tr>
116
+ </thead>
117
+ <!-- DataTables <tbody> -->
118
+ </table>
119
+ </div>
120
+
121
+ <script>
122
+ var htmlEntityEncode = $.fn.dataTable.render.text().display;
123
+ var line_entry_uri = "";
124
+ $(document).ready(function() {
125
+ var oldStart = 0;
126
+ var table = $('#pwn_www_uri_buster_results').DataTable( {
127
+ "paging": true,
128
+ "pagingType": "full_numbers",
129
+ "fnDrawCallback": function ( oSettings ) {
130
+ /* Need to redo the counters if filtered or sorted */
131
+ if ( oSettings.bSorted || oSettings.bFiltered ) {
132
+ for ( var i=0, iLen=oSettings.aiDisplay.length ; i<iLen ; i++ ) {
133
+ $('td:eq(0)', oSettings.aoData[ oSettings.aiDisplay[i] ].nTr ).html( i+1 );
134
+ }
135
+ }
136
+ // Jump to top when utilizing pagination
137
+ if ( oSettings._iDisplayStart != oldStart ) {
138
+ var targetOffset = $('#pwn_body').offset().top;
139
+ $('html,body').animate({scrollTop: targetOffset}, 500);
140
+ oldStart = oSettings._iDisplayStart;
141
+ }
142
+ // Select individual lines in a row
143
+ $('#multi_line_select tbody').on('click', 'tr', function () {
144
+ $(this).toggleClass('highlighted');
145
+ if ($('#multi_line_select tr.highlighted').length > 0) {
146
+ $('#multi_line_select tr td button').attr('disabled', 'disabled');
147
+ // Remove multi-line bug button
148
+ } else {
149
+ $('#multi_line_select tr td button').removeAttr('disabled');
150
+ // Add multi-line bug button
151
+ }
152
+ });
153
+ },
154
+ "ajax": "pwn_www_uri_buster.json",
155
+ //"deferRender": true,
156
+ "dom": "fplitfpliS",
157
+ "autoWidth": false,
158
+ "columns": [
159
+ { "data": null },
160
+ {
161
+ "data": "request_timestamp",
162
+ "render": $.fn.dataTable.render.text()
163
+ },
164
+ {
165
+ "data": "http_uri",
166
+ "render": $.fn.dataTable.render.text()
167
+ },
168
+ {
169
+ "data": "http_method",
170
+ "render": $.fn.dataTable.render.text()
171
+ },
172
+ {
173
+ "data": "http_resp_code",
174
+ "render": $.fn.dataTable.render.text()
175
+ },
176
+ {
177
+ "data": "http_resp",
178
+ "render": $.fn.dataTable.render.text()
179
+ }
180
+ ]
181
+ });
182
+ // Toggle Columns
183
+ $('a.toggle-vis').on('click', function (e) {
184
+ e.preventDefault();
185
+
186
+ // Get the column API object
187
+ var column = table.column( $(this).attr('data-column') );
188
+
189
+ // Toggle the visibility
190
+ column.visible( ! column.visible() );
191
+ });
192
+
193
+ // TODO: Open bug for highlighted rows ;)
194
+ $('#button').click( function () {
195
+ alert($('#multi_line_select tr.highlighted').length +' row(s) highlighted');
196
+ });
197
+ });
198
+
199
+ function multi_line_select() {
200
+ // Select all lines in a row
201
+ //$('#pwn_www_uri_buster_results tbody').on('click', 'tr', function () {
202
+ // $(this).children('td').children('#multi_line_select').children('tbody').children('tr').toggleClass('highlighted');
203
+ //});
204
+
205
+ }
206
+ </script>
207
+ </body>
208
+ </html>
209
+ }
210
+
211
+ File.open("#{dir_path}/pwn_www_uri_buster.html", 'w') do |f|
212
+ f.print(html_report)
213
+ end
214
+ rescue StandardError => e
215
+ raise e
216
+ end
217
+
218
+ # Author(s):: 0day Inc. <request.pentest@0dayinc.com>
219
+
220
+ public_class_method def self.authors
221
+ "AUTHOR(S):
222
+ 0day Inc. <request.pentest@0dayinc.com>
223
+ "
224
+ end
225
+
226
+ # Display Usage for this Module
227
+
228
+ public_class_method def self.help
229
+ puts "USAGE:
230
+ #{self}.generate(
231
+ dir_path: dir_path,
232
+ results_hash: results_hash
233
+ )
234
+
235
+ #{self}.authors
236
+ "
237
+ end
238
+ end
239
+ end
240
+ end
data/lib/pwn/reports.rb CHANGED
@@ -11,6 +11,7 @@ module PWN
11
11
  autoload :Fuzz, 'pwn/reports/fuzz'
12
12
  autoload :Phone, 'pwn/reports/phone'
13
13
  autoload :SAST, 'pwn/reports/sast'
14
+ autoload :URIBuster, 'pwn/reports/uri_buster'
14
15
  # autoload :XML, 'pwn/reports/xml'
15
16
 
16
17
  # Display a List of Every PWN Report
data/lib/pwn/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PWN
4
- VERSION = '0.4.519'
4
+ VERSION = '0.4.520'
5
5
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PWN::Reports::URIBuster do
6
+ it 'should display information for authors' do
7
+ authors_response = PWN::Reports::URIBuster
8
+ expect(authors_response).to respond_to :authors
9
+ end
10
+
11
+ it 'should display information for existing help method' do
12
+ help_response = PWN::Reports::URIBuster
13
+ expect(help_response).to respond_to :help
14
+ end
15
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pwn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.519
4
+ version: 0.4.520
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-08-23 00:00:00.000000000 Z
11
+ date: 2022-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: 2.3.20
117
+ version: 2.3.21
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
- version: 2.3.20
124
+ version: 2.3.21
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: bundler-audit
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -324,14 +324,14 @@ dependencies:
324
324
  requirements:
325
325
  - - '='
326
326
  - !ruby/object:Gem::Version
327
- version: 2.4.1
327
+ version: 2.5.0
328
328
  type: :runtime
329
329
  prerelease: false
330
330
  version_requirements: !ruby/object:Gem::Requirement
331
331
  requirements:
332
332
  - - '='
333
333
  - !ruby/object:Gem::Version
334
- version: 2.4.1
334
+ version: 2.5.0
335
335
  - !ruby/object:Gem::Dependency
336
336
  name: luhn
337
337
  requirement: !ruby/object:Gem::Requirement
@@ -1066,6 +1066,7 @@ executables:
1066
1066
  - pwn_simple_http_server
1067
1067
  - pwn_web_cache_deception
1068
1068
  - pwn_www_checkip
1069
+ - pwn_www_uri_buster
1069
1070
  - pwn_xss_dom_vectors
1070
1071
  extensions: []
1071
1072
  extra_rdoc_files: []
@@ -1130,6 +1131,7 @@ files:
1130
1131
  - bin/pwn_simple_http_server
1131
1132
  - bin/pwn_web_cache_deception
1132
1133
  - bin/pwn_www_checkip
1134
+ - bin/pwn_www_uri_buster
1133
1135
  - bin/pwn_xss_dom_vectors
1134
1136
  - build_pwn_gem.sh
1135
1137
  - documentation/PWN.png
@@ -1614,6 +1616,7 @@ files:
1614
1616
  - lib/pwn/reports/fuzz.rb
1615
1617
  - lib/pwn/reports/phone.rb
1616
1618
  - lib/pwn/reports/sast.rb
1619
+ - lib/pwn/reports/uri_buster.rb
1617
1620
  - lib/pwn/sast.rb
1618
1621
  - lib/pwn/sast/amqp_connect_as_guest.rb
1619
1622
  - lib/pwn/sast/apache_file_system_util_api.rb
@@ -1911,6 +1914,7 @@ files:
1911
1914
  - spec/lib/pwn/reports/fuzz_spec.rb
1912
1915
  - spec/lib/pwn/reports/phone_spec.rb
1913
1916
  - spec/lib/pwn/reports/sast_spec.rb
1917
+ - spec/lib/pwn/reports/uri_buster_spec.rb
1914
1918
  - spec/lib/pwn/reports_spec.rb
1915
1919
  - spec/lib/pwn/sast/amqp_connect_as_guest_spec.rb
1916
1920
  - spec/lib/pwn/sast/apache_file_system_util_api_spec.rb