pwn 0.5.441 → 0.5.443

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.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/README.md +3 -3
  4. data/lib/pwn/plugins/repl.rb +3 -5
  5. data/lib/pwn/sast/amqp_connect_as_guest.rb +12 -89
  6. data/lib/pwn/sast/apache_file_system_util_api.rb +11 -91
  7. data/lib/pwn/sast/aws.rb +13 -93
  8. data/lib/pwn/sast/banned_function_calls_c.rb +138 -218
  9. data/lib/pwn/sast/base64.rb +12 -90
  10. data/lib/pwn/sast/beef_hook.rb +10 -90
  11. data/lib/pwn/sast/cmd_execution_java.rb +12 -92
  12. data/lib/pwn/sast/cmd_execution_python.rb +14 -94
  13. data/lib/pwn/sast/cmd_execution_ruby.rb +22 -102
  14. data/lib/pwn/sast/cmd_execution_scala.rb +12 -92
  15. data/lib/pwn/sast/csrf.rb +10 -90
  16. data/lib/pwn/sast/deserial_java.rb +17 -97
  17. data/lib/pwn/sast/emoticon.rb +17 -98
  18. data/lib/pwn/sast/eval.rb +10 -90
  19. data/lib/pwn/sast/factory.rb +12 -92
  20. data/lib/pwn/sast/http_authorization_header.rb +20 -100
  21. data/lib/pwn/sast/inner_html.rb +10 -90
  22. data/lib/pwn/sast/keystore.rb +10 -90
  23. data/lib/pwn/sast/local_storage.rb +11 -91
  24. data/lib/pwn/sast/location_hash.rb +10 -90
  25. data/lib/pwn/sast/log4j.rb +10 -90
  26. data/lib/pwn/sast/logger.rb +24 -104
  27. data/lib/pwn/sast/md5.rb +10 -90
  28. data/lib/pwn/sast/outer_html.rb +10 -90
  29. data/lib/pwn/sast/padding_oracle.rb +11 -91
  30. data/lib/pwn/sast/password.rb +15 -95
  31. data/lib/pwn/sast/php_input_mechanisms.rb +16 -96
  32. data/lib/pwn/sast/php_type_juggling.rb +14 -94
  33. data/lib/pwn/sast/pom_version.rb +1 -1
  34. data/lib/pwn/sast/port.rb +16 -96
  35. data/lib/pwn/sast/post_message.rb +10 -90
  36. data/lib/pwn/sast/private_key.rb +10 -90
  37. data/lib/pwn/sast/redirect.rb +13 -93
  38. data/lib/pwn/sast/redos.rb +16 -96
  39. data/lib/pwn/sast/shell.rb +18 -98
  40. data/lib/pwn/sast/signature.rb +10 -90
  41. data/lib/pwn/sast/sql.rb +19 -93
  42. data/lib/pwn/sast/ssl.rb +14 -94
  43. data/lib/pwn/sast/sudo.rb +10 -90
  44. data/lib/pwn/sast/task_tag.rb +23 -103
  45. data/lib/pwn/sast/test_case_engine.rb +147 -0
  46. data/lib/pwn/sast/throw_errors.rb +14 -94
  47. data/lib/pwn/sast/token.rb +12 -92
  48. data/lib/pwn/sast/type_script_type_juggling.rb +14 -94
  49. data/lib/pwn/sast/version.rb +12 -92
  50. data/lib/pwn/sast/window_location_hash.rb +10 -90
  51. data/lib/pwn/sast.rb +4 -0
  52. data/lib/pwn/version.rb +1 -1
  53. data/lib/pwn.rb +0 -2
  54. data/spec/lib/pwn/sast/test_case_engine_spec.rb +20 -0
  55. data/third_party/pwn_rdoc.jsonl +1 -1
  56. metadata +5 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 92d7795afc16b50b13a70ee61a61231840d3c0679b062c94d9ba9999b22f4c5b
4
- data.tar.gz: ff1938f61e559dd262fb1b625fcca4e836a32291a0213b9876c543c8209d4861
3
+ metadata.gz: e9c5f5436eb5aafbcb5f8e3efdbe4ddaf6a072560d16032a86597df309db414f
4
+ data.tar.gz: df3a77d5878eec1334e36c341dc66e720fb9a981c3ded1d8970c778a92cafd81
5
5
  SHA512:
6
- metadata.gz: e5c57b84db4387731d245031c83b17511927fa8d12caefc6f8bb25302e518e8ae52e1d0237cdc51085f72f3059dd5f1a87edfe44ddefc4ec9428450dfd923fab
7
- data.tar.gz: f4d8e56891c24c062aa5d22d9f5972348ca8410355df6bd3510e9d27843a802e6f017a795b5c819eef46cf1ec5893ed7721d940db7b30a75da154045a82a29f2
6
+ metadata.gz: 1c9ffd8beddc6cf2cdee5a563378077fde6ef79418a6ec213b285ca952382a7b1cd43dd4828e669432b39ebdedac7dfc40f7bc1ce98e43ec91a0bb048928bb9a
7
+ data.tar.gz: ca08116991e30c5570ed16b281c3582a6db10be37097771a10b667b1e02c5a483dd14b02df83c53813b21dd1e11196be51802013827cc96792dbb2d9ee355bc1
data/Gemfile CHANGED
@@ -41,7 +41,7 @@ gem 'htmlentities', '4.3.4'
41
41
  gem 'ipaddress', '0.8.3'
42
42
  gem 'jenkins_api_client2', '1.9.0'
43
43
  gem 'js-beautify', '0.1.8'
44
- gem 'json', '2.15.0'
44
+ gem 'json', '2.15.1'
45
45
  gem 'jsonpath', '1.1.5'
46
46
  gem 'json_schemer', '2.4.0'
47
47
  gem 'jwt', '3.1.2'
data/README.md CHANGED
@@ -37,7 +37,7 @@ $ cd /opt/pwn
37
37
  $ ./install.sh
38
38
  $ ./install.sh ruby-gem
39
39
  $ pwn
40
- pwn[v0.5.441]:001 >>> PWN.help
40
+ pwn[v0.5.443]: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.4.4@pwn
52
52
  $ gem uninstall --all --executables pwn
53
53
  $ gem install --verbose pwn
54
54
  $ pwn
55
- pwn[v0.5.441]:001 >>> PWN.help
55
+ pwn[v0.5.443]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
  If you're using a multi-user install of RVM do:
@@ -62,7 +62,7 @@ $ rvm use ruby-3.4.4@pwn
62
62
  $ rvmsudo gem uninstall --all --executables pwn
63
63
  $ rvmsudo gem install --verbose pwn
64
64
  $ pwn
65
- pwn[v0.5.441]:001 >>> PWN.help
65
+ pwn[v0.5.443]:001 >>> PWN.help
66
66
  ```
67
67
 
68
68
  PWN periodically upgrades to the latest version of Ruby which is reflected in `/opt/pwn/.ruby-version`. The easiest way to upgrade to the latest version of Ruby from a previous PWN installation is to run the following script:
@@ -522,11 +522,9 @@ module PWN
522
522
  end
523
523
 
524
524
  # Supported Method Parameters::
525
- # PWN::Plugins::REPL.add_hooks(
526
- # opts: 'required - Hash object passed in via pwn OptParser'
527
- # )
525
+ # PWN::Plugins::REPL.add_hooks
528
526
 
529
- public_class_method def self.add_hooks(opts = {})
527
+ public_class_method def self.add_hooks
530
528
  # Define REPL Hooks
531
529
  # Welcome Banner Hook
532
530
  Pry.config.hooks.add_hook(:before_session, :welcome) do |output, _binding, _pi|
@@ -669,7 +667,7 @@ module PWN
669
667
  Pry.config.history_file = "#{pwn_env_root}/pwn_history"
670
668
 
671
669
  add_commands
672
- add_hooks(opts)
670
+ add_hooks
673
671
 
674
672
  # Define PS1 Prompt
675
673
  Pry.config.pwn_repl_line = 0
@@ -20,97 +20,20 @@ module PWN
20
20
  public_class_method def self.scan(opts = {})
21
21
  dir_path = opts[:dir_path]
22
22
  git_repo_root_uri = opts[:git_repo_root_uri].to_s.scrub
23
- result_arr = []
24
- ai_introspection = PWN::Env[:ai][:introspection]
25
- logger_results = "AI Introspection => #{ai_introspection} => "
26
23
 
27
- PWN::Plugins::FileFu.recurse_in_dir(dir_path: dir_path) do |entry|
28
- if File.file?(entry) && File.basename(entry) !~ /^pwn.+(html|json|db)$/ && File.basename(entry) !~ /\.JS-BEAUTIFIED$/ && entry !~ /test/i
29
- line_no_and_contents_arr = []
30
- entry_beautified = false
31
-
32
- if File.extname(entry) == '.js' && (`wc -l #{entry}`.split.first.to_i < 20 || entry.include?('.min.js') || entry.include?('-all.js'))
33
- js_beautify = `js-beautify #{entry} > #{entry}.JS-BEAUTIFIED 2> /dev/null`.to_s.scrub
34
- entry = "#{entry}.JS-BEAUTIFIED"
35
- entry_beautified = true
36
- end
37
-
38
- test_case_filter = "
39
- grep -in \
40
- -e amqp \
41
- -e rabbit #{entry} 2> /dev/null | \
42
- grep guest
43
- "
44
-
45
- str = `#{test_case_filter}`.to_s.scrub
46
- if str.to_s.empty?
47
- # If str length is >= 64 KB do not include results. (Due to Mongo Document Size Restrictions)
48
- logger_results = "#{logger_results}~" # Catching bugs is good :)
49
- else
50
- 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
51
-
52
- hash_line = {
53
- timestamp: Time.now.strftime('%Y-%m-%d %H:%M:%S.%9N %z').to_s,
54
- security_references: security_references,
55
- filename: { git_repo_root_uri: git_repo_root_uri, entry: entry },
56
- line_no_and_contents: '',
57
- raw_content: str,
58
- test_case_filter: test_case_filter
59
- }
60
-
61
- # COMMMENT: Must be a better way to implement this (regex is kinda funky)
62
- line_contents_split = str.split(/^(\d{1,}):|\n(\d{1,}):/)[1..-1]
63
- line_no_count = line_contents_split.length # This should always be an even number
64
- current_count = 0
65
- while line_no_count > current_count
66
- line_no = line_contents_split[current_count]
67
- contents = line_contents_split[current_count + 1]
68
- if Dir.exist?('.git')
69
- repo_root = '.'
70
- author = PWN::Plugins::Git.get_author(
71
- repo_root: repo_root,
72
- from_line: line_no,
73
- to_line: line_no,
74
- target_file: entry,
75
- entry_beautified: entry_beautified
76
- )
77
- end
78
- author ||= 'N/A'
79
-
80
- ai_analysis = nil
81
- if ai_introspection
82
- request = {
83
- scm_uri: "#{hash_line[:filename][:git_repo_root_uri]}/#{hash_line[:filename][:entry]}",
84
- line_no: line_no,
85
- source_code_snippet: contents
86
- }.to_json
87
- response = PWN::AI::Introspection.reflect(request: request)
88
- if response.is_a?(Hash)
89
- ai_analysis = response[:choices].last[:text] if response[:choices].last.keys.include?(:text)
90
- ai_analysis = response[:choices].last[:content] if response[:choices].last.keys.include?(:content)
91
- end
92
- end
24
+ test_case_filter = "
25
+ grep -in \
26
+ -e amqp \
27
+ -e rabbit {PWN_SAST_SRC_TARGET} 2> /dev/null | \
28
+ grep guest
29
+ "
93
30
 
94
- hash_line[:line_no_and_contents] = line_no_and_contents_arr.push(
95
- line_no: line_no,
96
- contents: contents,
97
- author: author,
98
- ai_analysis: ai_analysis
99
- )
100
- current_count += 2
101
- end
102
- result_arr.push(hash_line)
103
- logger_results = "#{logger_results}x" # Seeing progress is good :)
104
- end
105
- end
106
- end
107
- logger_banner = "http://#{Socket.gethostname}:8808/doc_root/pwn-#{PWN::VERSION.to_s.scrub}/#{to_s.scrub.gsub('::', '/')}.html"
108
- if logger_results.empty?
109
- @@logger.info("#{logger_banner}: No files applicable to this test case.\n")
110
- else
111
- @@logger.info("#{logger_banner} => #{logger_results}complete.\n")
112
- end
113
- result_arr
31
+ PWN::SAST::TestCaseEngine.execute(
32
+ test_case_filter: test_case_filter,
33
+ security_references: security_references,
34
+ dir_path: dir_path,
35
+ git_repo_root_uri: git_repo_root_uri
36
+ )
114
37
  rescue StandardError => e
115
38
  raise e
116
39
  end
@@ -19,99 +19,19 @@ module PWN
19
19
  public_class_method def self.scan(opts = {})
20
20
  dir_path = opts[:dir_path]
21
21
  git_repo_root_uri = opts[:git_repo_root_uri].to_s.scrub
22
- result_arr = []
23
- ai_introspection = PWN::Env[:ai][:introspection]
24
- logger_results = "AI Introspection => #{ai_introspection} => "
25
22
 
26
- PWN::Plugins::FileFu.recurse_in_dir(dir_path: dir_path) do |entry|
27
- if File.file?(entry) && File.basename(entry) !~ /^pwn.+(html|json|db)$/ && File.basename(entry) !~ /\.JS-BEAUTIFIED$/ && entry !~ /test/i
28
- line_no_and_contents_arr = []
29
- entry_beautified = false
30
-
31
- if File.extname(entry) == '.js' && (`wc -l #{entry}`.split.first.to_i < 20 || entry.include?('.min.js') || entry.include?('-all.js'))
32
- js_beautify = `js-beautify #{entry} > #{entry}.JS-BEAUTIFIED 2> /dev/null`.to_s.scrub
33
- entry = "#{entry}.JS-BEAUTIFIED"
34
- entry_beautified = true
35
- end
36
-
37
- test_case_filter = "
38
- grep -n \
39
- -e 'import org.apache.commons.io.FileSystemUtils' \
40
- -e 'freeSpaceKb' #{entry} 2> /dev/null
41
- "
42
-
43
- str = `#{test_case_filter}`.to_s.scrub
44
-
45
- if str.to_s.empty?
46
- # If str length is >= 64 KB do not include results. (Due to Mongo Document Size Restrictions)
47
- logger_results = "#{logger_results}~" # Catching bugs is good :)
48
- else
49
- 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
50
-
51
- hash_line = {
52
- timestamp: Time.now.strftime('%Y-%m-%d %H:%M:%S.%9N %z').to_s,
53
- security_references: security_references,
54
- filename: { git_repo_root_uri: git_repo_root_uri, entry: entry },
55
- line_no_and_contents: '',
56
- raw_content: str,
57
- test_case_filter: test_case_filter
58
- }
59
-
60
- # COMMMENT: Must be a better way to implement this (regex is kinda funky)
61
- line_contents_split = str.split(/^(\d{1,}):|\n(\d{1,}):/)[1..-1]
62
- line_no_count = line_contents_split.length # This should always be an even number
63
- current_count = 0
64
- while line_no_count > current_count
65
- line_no = line_contents_split[current_count]
66
- contents = line_contents_split[current_count + 1]
67
- if Dir.exist?('.git')
68
- repo_root = '.'
69
-
70
- author = PWN::Plugins::Git.get_author(
71
- repo_root: repo_root,
72
- from_line: line_no,
73
- to_line: line_no,
74
- target_file: entry,
75
- entry_beautified: entry_beautified
76
- )
77
- end
78
- author ||= 'N/A'
79
-
80
- ai_analysis = nil
81
- if ai_introspection
82
- request = {
83
- scm_uri: "#{hash_line[:filename][:git_repo_root_uri]}/#{hash_line[:filename][:entry]}",
84
- line_no: line_no,
85
- source_code_snippet: contents
86
- }.to_json
87
- response = PWN::AI::Introspection.reflect(request: request)
88
- if response.is_a?(Hash)
89
- ai_analysis = response[:choices].last[:text] if response[:choices].last.keys.include?(:text)
90
- ai_analysis = response[:choices].last[:content] if response[:choices].last.keys.include?(:content)
91
- end
92
- end
93
-
94
- hash_line[:line_no_and_contents] = line_no_and_contents_arr.push(
95
- line_no: line_no,
96
- contents: contents,
97
- author: author,
98
- ai_analysis: ai_analysis
99
- )
23
+ test_case_filter = "
24
+ grep -n \
25
+ -e 'import org.apache.commons.io.FileSystemUtils' \
26
+ -e 'freeSpaceKb' {PWN_SAST_SRC_TARGET} 2> /dev/null
27
+ "
100
28
 
101
- current_count += 2
102
- end
103
- result_arr.push(hash_line)
104
- logger_results = "#{logger_results}x" # Seeing progress is good :)
105
- end
106
- end
107
- end
108
- logger_banner = "http://#{Socket.gethostname}:8808/doc_root/pwn-#{PWN::VERSION.to_s.scrub}/#{to_s.scrub.gsub('::', '/')}.html"
109
- if logger_results.empty?
110
- @@logger.info("#{logger_banner}: No files applicable to this test case.\n")
111
- else
112
- @@logger.info("#{logger_banner} => #{logger_results}complete.\n")
113
- end
114
- result_arr
29
+ PWN::SAST::TestCaseEngine.execute(
30
+ test_case_filter: test_case_filter,
31
+ security_references: security_references,
32
+ dir_path: dir_path,
33
+ git_repo_root_uri: git_repo_root_uri
34
+ )
115
35
  rescue StandardError => e
116
36
  raise e
117
37
  end
data/lib/pwn/sast/aws.rb CHANGED
@@ -18,101 +18,21 @@ module PWN
18
18
  public_class_method def self.scan(opts = {})
19
19
  dir_path = opts[:dir_path]
20
20
  git_repo_root_uri = opts[:git_repo_root_uri].to_s.scrub
21
- result_arr = []
22
- ai_introspection = PWN::Env[:ai][:introspection]
23
- logger_results = "AI Introspection => #{ai_introspection} => "
24
21
 
25
- PWN::Plugins::FileFu.recurse_in_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 2> /dev/null`.to_s.scrub
32
- entry = "#{entry}.JS-BEAUTIFIED"
33
- entry_beautified = true
34
- end
35
-
36
- test_case_filter = "
37
- grep -niE \
38
- -e 'ec2-' \
39
- -e 'access.key' \
40
- -e 'secret.access' \
41
- -e 'secret.key' #{entry} 2> /dev/null
42
- "
43
-
44
- str = `#{test_case_filter}`.to_s.scrub
45
-
46
- if str.to_s.empty?
47
- # If str length is >= 64 KB do not include results. (Due to Mongo Document Size Restrictions)
48
- logger_results = "#{logger_results}~" # Catching bugs is good :)
49
- else
50
- 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
51
-
52
- hash_line = {
53
- timestamp: Time.now.strftime('%Y-%m-%d %H:%M:%S.%9N %z').to_s,
54
- security_references: security_references,
55
- filename: { git_repo_root_uri: git_repo_root_uri, entry: entry },
56
- line_no_and_contents: '',
57
- raw_content: str,
58
- test_case_filter: test_case_filter
59
- }
60
-
61
- # COMMMENT: Must be a better way to implement this (regex is kinda funky)
62
- line_contents_split = str.split(/^(\d{1,}):|\n(\d{1,}):/)[1..-1]
63
- line_no_count = line_contents_split.length # This should always be an even number
64
- current_count = 0
65
- while line_no_count > current_count
66
- line_no = line_contents_split[current_count]
67
- contents = line_contents_split[current_count + 1]
68
- if Dir.exist?('.git')
69
- repo_root = '.'
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
- end
79
- author ||= 'N/A'
80
-
81
- ai_analysis = nil
82
- if ai_introspection
83
- request = {
84
- scm_uri: "#{hash_line[:filename][:git_repo_root_uri]}/#{hash_line[:filename][:entry]}",
85
- line_no: line_no,
86
- source_code_snippet: contents
87
- }.to_json
88
- response = PWN::AI::Introspection.reflect(request: request)
89
- if response.is_a?(Hash)
90
- ai_analysis = response[:choices].last[:text] if response[:choices].last.keys.include?(:text)
91
- ai_analysis = response[:choices].last[:content] if response[:choices].last.keys.include?(:content)
92
- end
93
- end
94
-
95
- hash_line[:line_no_and_contents] = line_no_and_contents_arr.push(
96
- line_no: line_no,
97
- contents: contents,
98
- author: author,
99
- ai_analysis: ai_analysis
100
- )
22
+ test_case_filter = "
23
+ grep -niE \
24
+ -e 'ec2-' \
25
+ -e 'access.key' \
26
+ -e 'secret.access' \
27
+ -e 'secret.key' {PWN_SAST_SRC_TARGET} 2> /dev/null
28
+ "
101
29
 
102
- current_count += 2
103
- end
104
- result_arr.push(hash_line)
105
- logger_results = "#{logger_results}x" # Seeing progress is good :)
106
- end
107
- end
108
- end
109
- logger_banner = "http://#{Socket.gethostname}:8808/doc_root/pwn-#{PWN::VERSION.to_s.scrub}/#{to_s.scrub.gsub('::', '/')}.html"
110
- if logger_results.empty?
111
- @@logger.info("#{logger_banner}: No files applicable to this test case.\n")
112
- else
113
- @@logger.info("#{logger_banner} => #{logger_results}complete.\n")
114
- end
115
- result_arr
30
+ PWN::SAST::TestCaseEngine.execute(
31
+ test_case_filter: test_case_filter,
32
+ security_references: security_references,
33
+ dir_path: dir_path,
34
+ git_repo_root_uri: git_repo_root_uri
35
+ )
116
36
  rescue StandardError => e
117
37
  raise e
118
38
  end