pwn 0.5.199 → 0.5.200

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,144 @@
1
+ # frozen_string_literal: false
2
+
3
+ require 'socket'
4
+
5
+ module PWN
6
+ module SAST
7
+ # SAST Module used to identify any postMessage function/method
8
+ # declarations within source code in an effort to
9
+ # determine if XSS is possible
10
+ module PostMessage
11
+ @@logger = PWN::Plugins::PWNLogger.create
12
+
13
+ # Supported Method Parameters::
14
+ # PWN::SAST::PostMessage.scan(
15
+ # dir_path: 'optional path to dir defaults to .'
16
+ # git_repo_root_uri: 'optional http uri of git repo scanned'
17
+ # )
18
+
19
+ public_class_method def self.scan(opts = {})
20
+ dir_path = opts[:dir_path]
21
+ git_repo_root_uri = opts[:git_repo_root_uri].to_s.scrub
22
+ result_arr = []
23
+ logger_results = ''
24
+
25
+ PWN::Plugins::FileFu.recurse_dir(dir_path: dir_path) do |entry|
26
+ if File.file?(entry) && File.basename(entry) !~ /^pwn.+(html|json|db)$/ && File.basename(entry) !~ /\.JS-BEAUTIFIED$/ && entry !~ /test/i
27
+ line_no_and_contents_arr = []
28
+ entry_beautified = false
29
+
30
+ if File.extname(entry) == '.js' && (`wc -l #{entry}`.split.first.to_i < 20 || entry.include?('.min.js') || entry.include?('-all.js'))
31
+ js_beautify = `js-beautify #{entry} > #{entry}.JS-BEAUTIFIED`.to_s.scrub
32
+ entry = "#{entry}.JS-BEAUTIFIED"
33
+ entry_beautified = true
34
+ end
35
+
36
+ test_case_filter = "
37
+ grep -n \
38
+ -e 'postMessage(' #{entry}
39
+ "
40
+
41
+ str = `#{test_case_filter}`.to_s.scrub
42
+
43
+ if str.to_s.empty?
44
+ # If str length is >= 64 KB do not include results. (Due to Mongo Document Size Restrictions)
45
+ logger_results = "#{logger_results}~" # Catching bugs is good :)
46
+ else
47
+ str = "1:Result larger than 64KB -> Size: #{str.to_s.length}. Please click the \"Path\" link for more details." if str.to_s.length >= 64_000
48
+
49
+ hash_line = {
50
+ timestamp: Time.now.strftime('%Y-%m-%d %H:%M:%S.%9N %z').to_s,
51
+ security_references: security_references,
52
+ filename: { git_repo_root_uri: git_repo_root_uri, entry: entry },
53
+ line_no_and_contents: '',
54
+ raw_content: str,
55
+ test_case_filter: test_case_filter
56
+ }
57
+
58
+ # COMMMENT: Must be a better way to implement this (regex is kinda funky)
59
+ line_contents_split = str.split(/^(\d{1,}):|\n(\d{1,}):/)[1..-1]
60
+ line_no_count = line_contents_split.length # This should always be an even number
61
+ current_count = 0
62
+ while line_no_count > current_count
63
+ line_no = line_contents_split[current_count]
64
+ contents = line_contents_split[current_count + 1]
65
+ if Dir.exist?("#{dir_path}/.git") ||
66
+ Dir.exist?('.git')
67
+
68
+ repo_root = dir_path
69
+ repo_root = '.' if Dir.exist?('.git')
70
+
71
+ author = PWN::Plugins::Git.get_author(
72
+ repo_root: repo_root,
73
+ from_line: line_no,
74
+ to_line: line_no,
75
+ target_file: entry,
76
+ entry_beautified: entry_beautified
77
+ )
78
+ else
79
+ author = 'N/A'
80
+ end
81
+ hash_line[:line_no_and_contents] = line_no_and_contents_arr.push(
82
+ line_no: line_no,
83
+ contents: contents,
84
+ author: author
85
+ )
86
+
87
+ current_count += 2
88
+ end
89
+ result_arr.push(hash_line)
90
+ logger_results = "#{logger_results}x" # Seeing progress is good :)
91
+ end
92
+ end
93
+ end
94
+ logger_banner = "http://#{Socket.gethostname}:8808/doc_root/pwn-#{PWN::VERSION.to_s.scrub}/#{to_s.scrub.gsub('::', '/')}.html"
95
+ if logger_results.empty?
96
+ @@logger.info("#{logger_banner}: No files applicable to this test case.\n")
97
+ else
98
+ @@logger.info("#{logger_banner} => #{logger_results}complete.\n")
99
+ end
100
+ result_arr
101
+ rescue StandardError => e
102
+ raise e
103
+ end
104
+
105
+ # Used primarily to map NIST 800-53 Revision 4 Security Controls
106
+ # https://web.nvd.nist.gov/view/800-53/Rev4/impact?impactName=HIGH
107
+ # to PWN Exploit & Static Code Anti-Pattern Matching Modules to
108
+ # Determine the level of Testing Coverage w/ PWN.
109
+
110
+ public_class_method def self.security_references
111
+ {
112
+ sast_module: self,
113
+ section: 'MALICIOUS CODE PROTECTION',
114
+ nist_800_53_uri: 'https://csrc.nist.gov/Projects/risk-management/sp800-53-controls/release-search#/control/?version=5.1&number=SI-3',
115
+ cwe_id: '79',
116
+ cwe_uri: 'https://cwe.mitre.org/data/definitions/79.html'
117
+ }
118
+ rescue StandardError => e
119
+ raise e
120
+ end
121
+
122
+ # Author(s):: 0day Inc. <support@0dayinc.com>
123
+
124
+ public_class_method def self.authors
125
+ "AUTHOR(S):
126
+ 0day Inc. <support@0dayinc.com>
127
+ "
128
+ end
129
+
130
+ # Display Usage for this Module
131
+
132
+ public_class_method def self.help
133
+ puts "USAGE:
134
+ sast_arr = #{self}.scan(
135
+ dir_path: 'optional path to dir defaults to .',
136
+ git_repo_root_uri: 'optional http uri of git repo scanned'
137
+ )
138
+
139
+ #{self}.authors
140
+ "
141
+ end
142
+ end
143
+ end
144
+ end
data/lib/pwn/sast.rb CHANGED
@@ -24,6 +24,7 @@ module PWN
24
24
  autoload :HTTPAuthorizationHeader, 'pwn/sast/http_authorization_header'
25
25
  autoload :InnerHTML, 'pwn/sast/inner_html'
26
26
  autoload :Keystore, 'pwn/sast/keystore'
27
+ autoload :LocalStorage, 'pwn/sast/local_storage'
27
28
  autoload :LocationHash, 'pwn/sast/location_hash'
28
29
  autoload :Log4J, 'pwn/sast/log4j'
29
30
  autoload :Logger, 'pwn/sast/logger'
@@ -35,6 +36,7 @@ module PWN
35
36
  autoload :PHPTypeJuggling, 'pwn/sast/php_type_juggling'
36
37
  autoload :PomVersion, 'pwn/sast/pom_version'
37
38
  autoload :Port, 'pwn/sast/port'
39
+ autoload :PostMessage, 'pwn/sast/post_message'
38
40
  autoload :PrivateKey, 'pwn/sast/private_key'
39
41
  autoload :Redirect, 'pwn/sast/redirect'
40
42
  autoload :ReDOS, 'pwn/sast/redos'
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.5.199'
4
+ VERSION = '0.5.200'
5
5
  end
data/lib/pwn.rb CHANGED
@@ -22,4 +22,7 @@ module PWN
22
22
  public_class_method def self.help
23
23
  constants.sort
24
24
  end
25
+ rescue StandardError => e
26
+ puts e.backtrace
27
+ raise e
25
28
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PWN::Plugins::Hunter do
6
+ it 'should display information for authors' do
7
+ authors_response = PWN::Plugins::Hunter
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::Plugins::Hunter
13
+ expect(help_response).to respond_to :help
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PWN::SAST::LocalStorage do
6
+ it 'scan method should exist' do
7
+ scan_response = PWN::SAST::LocalStorage
8
+ expect(scan_response).to respond_to :scan
9
+ end
10
+
11
+ it 'should display information for security_references' do
12
+ security_references_response = PWN::SAST::LocalStorage
13
+ expect(security_references_response).to respond_to :security_references
14
+ end
15
+
16
+ it 'should display information for authors' do
17
+ authors_response = PWN::SAST::LocalStorage
18
+ expect(authors_response).to respond_to :authors
19
+ end
20
+
21
+ it 'should display information for existing help method' do
22
+ help_response = PWN::SAST::LocalStorage
23
+ expect(help_response).to respond_to :help
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe PWN::SAST::PostMessage do
6
+ it 'scan method should exist' do
7
+ scan_response = PWN::SAST::PostMessage
8
+ expect(scan_response).to respond_to :scan
9
+ end
10
+
11
+ it 'should display information for security_references' do
12
+ security_references_response = PWN::SAST::PostMessage
13
+ expect(security_references_response).to respond_to :security_references
14
+ end
15
+
16
+ it 'should display information for authors' do
17
+ authors_response = PWN::SAST::PostMessage
18
+ expect(authors_response).to respond_to :authors
19
+ end
20
+
21
+ it 'should display information for existing help method' do
22
+ help_response = PWN::SAST::PostMessage
23
+ expect(help_response).to respond_to :help
24
+ end
25
+ 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.5.199
4
+ version: 0.5.200
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-06-25 00:00:00.000000000 Z
11
+ date: 2024-07-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -156,14 +156,14 @@ dependencies:
156
156
  requirements:
157
157
  - - '='
158
158
  - !ruby/object:Gem::Version
159
- version: 2.22.0
159
+ version: 2.23.0
160
160
  type: :runtime
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - '='
165
165
  - !ruby/object:Gem::Version
166
- version: 2.22.0
166
+ version: 2.23.0
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: colorize
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -492,14 +492,14 @@ dependencies:
492
492
  requirements:
493
493
  - - '='
494
494
  - !ruby/object:Gem::Version
495
- version: 0.0.70
495
+ version: 0.0.71
496
496
  type: :runtime
497
497
  prerelease: false
498
498
  version_requirements: !ruby/object:Gem::Requirement
499
499
  requirements:
500
500
  - - '='
501
501
  - !ruby/object:Gem::Version
502
- version: 0.0.70
502
+ version: 0.0.71
503
503
  - !ruby/object:Gem::Dependency
504
504
  name: metasm
505
505
  requirement: !ruby/object:Gem::Requirement
@@ -800,14 +800,14 @@ dependencies:
800
800
  requirements:
801
801
  - - '='
802
802
  - !ruby/object:Gem::Version
803
- version: 3.7.1
803
+ version: 3.8.0
804
804
  type: :runtime
805
805
  prerelease: false
806
806
  version_requirements: !ruby/object:Gem::Requirement
807
807
  requirements:
808
808
  - - '='
809
809
  - !ruby/object:Gem::Version
810
- version: 3.7.1
810
+ version: 3.8.0
811
811
  - !ruby/object:Gem::Dependency
812
812
  name: rdoc
813
813
  requirement: !ruby/object:Gem::Requirement
@@ -940,14 +940,14 @@ dependencies:
940
940
  requirements:
941
941
  - - '='
942
942
  - !ruby/object:Gem::Version
943
- version: 3.0.1
943
+ version: 3.0.2
944
944
  type: :runtime
945
945
  prerelease: false
946
946
  version_requirements: !ruby/object:Gem::Requirement
947
947
  requirements:
948
948
  - - '='
949
949
  - !ruby/object:Gem::Version
950
- version: 3.0.1
950
+ version: 3.0.2
951
951
  - !ruby/object:Gem::Dependency
952
952
  name: ruby-audio
953
953
  requirement: !ruby/object:Gem::Requirement
@@ -1817,6 +1817,7 @@ files:
1817
1817
  - lib/pwn/plugins/github.rb
1818
1818
  - lib/pwn/plugins/gqrx.rb
1819
1819
  - lib/pwn/plugins/hacker_one.rb
1820
+ - lib/pwn/plugins/hunter.rb
1820
1821
  - lib/pwn/plugins/ip_info.rb
1821
1822
  - lib/pwn/plugins/irc.rb
1822
1823
  - lib/pwn/plugins/jenkins.rb
@@ -1885,6 +1886,7 @@ files:
1885
1886
  - lib/pwn/sast/http_authorization_header.rb
1886
1887
  - lib/pwn/sast/inner_html.rb
1887
1888
  - lib/pwn/sast/keystore.rb
1889
+ - lib/pwn/sast/local_storage.rb
1888
1890
  - lib/pwn/sast/location_hash.rb
1889
1891
  - lib/pwn/sast/log4j.rb
1890
1892
  - lib/pwn/sast/logger.rb
@@ -1896,6 +1898,7 @@ files:
1896
1898
  - lib/pwn/sast/php_type_juggling.rb
1897
1899
  - lib/pwn/sast/pom_version.rb
1898
1900
  - lib/pwn/sast/port.rb
1901
+ - lib/pwn/sast/post_message.rb
1899
1902
  - lib/pwn/sast/private_key.rb
1900
1903
  - lib/pwn/sast/redirect.rb
1901
1904
  - lib/pwn/sast/redos.rb
@@ -2149,6 +2152,7 @@ files:
2149
2152
  - spec/lib/pwn/plugins/github_spec.rb
2150
2153
  - spec/lib/pwn/plugins/gqrx_spec.rb
2151
2154
  - spec/lib/pwn/plugins/hacker_one_spec.rb
2155
+ - spec/lib/pwn/plugins/hunter_spec.rb
2152
2156
  - spec/lib/pwn/plugins/ip_info_spec.rb
2153
2157
  - spec/lib/pwn/plugins/irc_spec.rb
2154
2158
  - spec/lib/pwn/plugins/jenkins_spec.rb
@@ -2217,6 +2221,7 @@ files:
2217
2221
  - spec/lib/pwn/sast/http_authorization_header_spec.rb
2218
2222
  - spec/lib/pwn/sast/inner_html_spec.rb
2219
2223
  - spec/lib/pwn/sast/keystore_spec.rb
2224
+ - spec/lib/pwn/sast/local_storage_spec.rb
2220
2225
  - spec/lib/pwn/sast/location_hash_spec.rb
2221
2226
  - spec/lib/pwn/sast/log4j_spec.rb
2222
2227
  - spec/lib/pwn/sast/logger_spec.rb
@@ -2228,6 +2233,7 @@ files:
2228
2233
  - spec/lib/pwn/sast/php_type_juggling_spec.rb
2229
2234
  - spec/lib/pwn/sast/pom_version_spec.rb
2230
2235
  - spec/lib/pwn/sast/port_spec.rb
2236
+ - spec/lib/pwn/sast/post_message_spec.rb
2231
2237
  - spec/lib/pwn/sast/private_key_spec.rb
2232
2238
  - spec/lib/pwn/sast/redirect_spec.rb
2233
2239
  - spec/lib/pwn/sast/redos_spec.rb