pwn 0.4.645 → 0.4.646

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 (6) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/bin/pwn +92 -1
  4. data/lib/pwn/version.rb +1 -1
  5. metadata +2 -4
  6. data/bin/pwn_chat +0 -173
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 175a84d917a62dd16839be4dad757fa30c0db1ec4b8be44ced24412e34061cfd
4
- data.tar.gz: 56ab72f479c87b3206310be28c1bff3e1ecc71332b82ffc921de7fb612b15139
3
+ metadata.gz: a3c91157de7e5f636150debf731605340089f894541296f328201b94e5d02d79
4
+ data.tar.gz: 2f4c1d07bd0e1b56c03589cd500864e5b39fdd886ca67bc1302d47827047507b
5
5
  SHA512:
6
- metadata.gz: b166ba9ac93ff8cd2908be9078540ad7fd4e0076e2579e1dfa648fb14e6c0caf6d1b598d27f2d39c26d245e7768f85c9b4e02f1e530dd3b08fa541ad162792bb
7
- data.tar.gz: 9c9677f7900576017382915e3a2928d0feeedea1e0e7ad4fccca3dcc2903c9d99a7f76dc3888d5529af471b1d018c96fd1d49ebad1df9776ebb6b1fb3f09d178
6
+ metadata.gz: a8b51af5abbf70b01832ad5b88ea8981cc4224afbbfa823f21e1cdc02ad51891625cd57de522940c37e71b141b29cc8096419f4166ed56323187cc24e0f4188e
7
+ data.tar.gz: 2b0db372b007bbef8dd18c7acc273cf2595d47bd9f1285b22c2146d4a589fa54e1ac0fefcd75d44f0bcf2930ec2c770dffd0fe2dd2c21ebae6a4c1b403ebd684
data/README.md CHANGED
@@ -37,7 +37,7 @@ $ rvm use ruby-3.2.2@pwn
37
37
  $ rvm list gemsets
38
38
  $ gem install --verbose pwn
39
39
  $ pwn
40
- pwn[v0.4.645]:001 >>> PWN.help
40
+ pwn[v0.4.646]: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.2.2@pwn
52
52
  $ gem uninstall --all --executables pwn
53
53
  $ gem install --verbose pwn
54
54
  $ pwn
55
- pwn[v0.4.645]:001 >>> PWN.help
55
+ pwn[v0.4.646]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
 
data/bin/pwn CHANGED
@@ -1,12 +1,25 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
+ require 'optparse'
4
5
  require 'pwn'
5
6
  require 'pry'
6
- require 'colorize'
7
+ require 'yaml'
8
+ # require 'colorize'
7
9
  # require 'tty-prompt'
8
10
  # require 'tty-reader'
9
11
 
12
+ opts = {}
13
+ OptionParser.new do |options|
14
+ options.banner = "USAGE:
15
+ #{$PROGRAM_NAME} [opts]
16
+ "
17
+
18
+ options.on('-cPATH', '--yaml-config=PATH', '<Optional - OpenAI YAML File>') do |p|
19
+ opts[:yaml_config_path] = p
20
+ end
21
+ end.parse!
22
+
10
23
  begin
11
24
  def gen_ps1_proc(opts = {})
12
25
  delim = opts[:delim]
@@ -73,11 +86,89 @@ begin
73
86
  end
74
87
  end
75
88
 
89
+ Pry::Commands.create_command 'toggle-chatGPT-debug' do
90
+ description "Display the response_history object while using OpenAI's ChatGPT."
91
+
92
+ def process
93
+ pi = pry_instance
94
+ pi.config.chat_gpt_debug ? pi.config.chat_gpt_debug = false : pi.config.chat_gpt_debug = true
95
+ puts 'ChatGPT Debug Enabled.' if pi.config.chat_gpt_debug
96
+ puts 'ChatGPT Debug Disabled.' unless pi.config.chat_gpt_debug
97
+ end
98
+ end
99
+
100
+ Pry::Commands.create_command 'toggle-chatGPT-speaks' do
101
+ description 'Use speech capabilities within PWN to speak OpenAI ChatGPT answers.'
102
+
103
+ def process
104
+ pi = pry_instance
105
+ pi.config.chat_gpt_speak ? pi.config.chat_gpt_speak = false : pi.config.chat_gpt_speak = true
106
+ puts 'ChatGPT Speech Enabled.' if pi.config.chat_gpt_speak
107
+ puts 'ChatGPT Speech Disabled.' unless pi.config.chat_gpt_speak
108
+ end
109
+ end
110
+
111
+ Pry::Commands.create_command 'toggle-chatGPT' do
112
+ description "Interact w/ OpenAI's ChatGPT"
113
+
114
+ def process
115
+ pi = pry_instance
116
+ pi.config.chat_gpt ? pi.config.chat_gpt = false : pi.config.chat_gpt = true
117
+ puts 'ChatGPT Enabled.' if pi.config.chat_gpt
118
+ puts 'ChatGPT Disabled.' unless pi.config.chat_gpt
119
+ end
120
+ end
121
+
76
122
  # Define REPL Hooks
123
+ # Welcome Banner Hook
77
124
  Pry.config.hooks.add_hook(:before_session, :welcome) do |output, _binding, _pry|
78
125
  output.puts PWN::Banner.welcome
79
126
  end
80
127
 
128
+ # ChatGPT Hooks
129
+ Pry.config.hooks.add_hook(:before_session, :init_opts) do |_output, _binding, pi|
130
+ pi.config.chat_gpt_token = ''
131
+ if opts[:yaml_config_path] && File.exist?(opts[:yaml_config_path])
132
+ yaml_config_path = opts[:yaml_config_path]
133
+ yaml_config = YAML.load_file(yaml_config_path, symbolize_names: true)
134
+ pi.config.chat_gpt_token = yaml_config[:bearer_token]
135
+ end
136
+ end
137
+
138
+ Pry.config.hooks.add_hook(:after_eval, :open_ai_hook) do |request, pi|
139
+ if request.instance_of?(String) && pi.config.chat_gpt
140
+ debug = pi.config.chat_gpt_debug
141
+ token = pi.config.chat_gpt_token
142
+ token = PWN::Plugins::AuthenticationHelper.mask_password(prompt: 'OpenAI API Key') if token.empty?
143
+ response_history = pi.config.chat_gpt_response_history
144
+ speak_answer = pi.config.chat_gpt_speak
145
+ response = PWN::Plugins::OpenAI.chat(
146
+ token: token,
147
+ request: request.to_s,
148
+ temp: 1,
149
+ max_tokens: 0,
150
+ response_history: response_history,
151
+ speak_answer: speak_answer
152
+ )
153
+ puts "\n\n\n#{response[:choices].last[:content]}\n\n\n"
154
+
155
+ response_history = {
156
+ id: response[:id],
157
+ object: response[:object],
158
+ model: response[:model],
159
+ usage: response[:usage]
160
+ }
161
+ response_history[:choices] ||= response[:choices]
162
+
163
+ if debug
164
+ puts 'DEBUG: response_history = '
165
+ pp response_history
166
+ puts "response_history[:choices] Length: #{response_history[:choices].length}\n" unless response_history.nil?
167
+ end
168
+ pi.config.chat_gpt_response_history = response_history
169
+ end
170
+ end
171
+
81
172
  # Define PS1 Prompt
82
173
  Pry.config.pwn_repl_line = 0
83
174
  arrow_ps1_proc = gen_ps1_proc
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.645'
4
+ VERSION = '0.4.646'
5
5
  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.645
4
+ version: 0.4.646
5
5
  platform: ruby
6
6
  authors:
7
7
  - 0day Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-18 00:00:00.000000000 Z
11
+ date: 2023-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -1091,7 +1091,6 @@ executables:
1091
1091
  - pwn_char_html_entity_encoding
1092
1092
  - pwn_char_unicode_escaped_encoding
1093
1093
  - pwn_char_url_encoding
1094
- - pwn_chat
1095
1094
  - pwn_defectdojo_engagement_create
1096
1095
  - pwn_defectdojo_importscan
1097
1096
  - pwn_defectdojo_reimportscan
@@ -1158,7 +1157,6 @@ files:
1158
1157
  - bin/pwn_char_html_entity_encoding
1159
1158
  - bin/pwn_char_unicode_escaped_encoding
1160
1159
  - bin/pwn_char_url_encoding
1161
- - bin/pwn_chat
1162
1160
  - bin/pwn_defectdojo_engagement_create
1163
1161
  - bin/pwn_defectdojo_importscan
1164
1162
  - bin/pwn_defectdojo_reimportscan
data/bin/pwn_chat DELETED
@@ -1,173 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- require 'optparse'
5
- require 'pwn'
6
- require 'pry'
7
- require 'yaml'
8
-
9
- opts = {}
10
- OptionParser.new do |options|
11
- options.banner = "USAGE:
12
- #{$PROGRAM_NAME} [opts]
13
- "
14
-
15
- options.on('-cPATH', '--yaml-config=PATH', '<Required - OpenAI YAML File>') do |p|
16
- opts[:yaml_config_path] = p
17
- end
18
-
19
- options.on('-d', '--[no-]debug', '<Options - Display response_history Object During Session>') do |d|
20
- opts[:debug] = d
21
- end
22
-
23
- options.on('-sSTAGE', '--system-role-content=STAGE', '<Optional - system Role Content Value to Define Behavior of assistant responses (Defaults to value in PWN::Plugins::OpenAI.chat method)>') do |s|
24
- opts[:system_role_content] = s
25
- end
26
-
27
- options.on('-S', '--speak-answer', '<Options - Speak Answers (Defaults to false)>') do |v|
28
- opts[:speak_answer] = v
29
- end
30
- end.parse!
31
-
32
- if opts.empty?
33
- puts `#{$PROGRAM_NAME} --help`
34
- exit 1
35
- end
36
-
37
- begin
38
- def gen_ps1_proc(opts = {})
39
- delim = opts[:delim]
40
-
41
- # title = 'pwn'.red.bold
42
- title = "\001\e[1m\002\001\e[31m\002#{File.basename($PROGRAM_NAME)}\001\e[0m\002"
43
- # version = PWN::VERSION.cyan
44
- version = "\001\e[36m\002v#{PWN::VERSION}\001\e[0m\002"
45
- # dchars = '>>>'.green
46
- dchars = "\001\e[32m\002>>>\001\e[0m\002"
47
- # dchars = '***'.yellow if delim == :splat
48
- dchars = "\001\e[33m\002***\001\e[0m\002" if delim == :splat
49
-
50
- proc do |_target_self, _nest_level, pry|
51
- pry.config.pwn_repl_line += 1
52
- line_pad = format(
53
- '%0.3d',
54
- pry.config.pwn_repl_line
55
- )
56
- line_count = "\001\e[34m\002#{line_pad}\001\e[0m\002" # Blue
57
- "#{title}[#{version}]:#{line_count} #{dchars} ".to_s.scrub
58
- end
59
- end
60
-
61
- class Pry
62
- # Overwrite Pry::History.push method in History class to get duplicate history entries
63
- # in order to properly replay automation in this prototyping driver
64
- class History
65
- def push(line)
66
- return line if line.empty? || invalid_readline_line?(line)
67
-
68
- begin
69
- last_line = @history[-1]
70
- rescue IndexError
71
- last_line = nil
72
- end
73
-
74
- @history << line
75
- @history_line_count += 1
76
- @saver.call(line) if !should_ignore?(line) &&
77
- Pry.config.history_save
78
-
79
- line
80
- end
81
- alias << push
82
- end
83
- end
84
-
85
- # Get OptParse Cli Parameters
86
- yaml_config_path = opts[:yaml_config_path]
87
- raise "ERROR: YAML Config => #{yaml_config_path} not found." unless File.exist?(yaml_config_path)
88
-
89
- yaml_config = YAML.load_file(yaml_config_path, symbolize_names: true)
90
- token = yaml_config[:bearer_token]
91
-
92
- debug = opts[:debug]
93
-
94
- system_role_content = opts[:system_role_content]
95
-
96
- @speak_answer = true if opts[:speak_answer]
97
-
98
- # Define Custom REPL Commands
99
- Pry::Commands.create_command 'welcome-banner' do
100
- description 'Display the random welcome banner, including basic usage.'
101
-
102
- def process
103
- puts PWN::Banner.welcome
104
- end
105
- end
106
-
107
- Pry::Commands.create_command 'toggle-pager' do
108
- description 'Toggle less on returned objects surpassing the terminal.'
109
-
110
- def process
111
- pi = pry_instance
112
- pi.config.pager ? pi.config.pager = false : pi.config.pager = true
113
- end
114
- end
115
-
116
- # Define REPL Hooks
117
- Pry.config.hooks.add_hook(:before_session, :welcome) do |output, _binding, _pry|
118
- output.puts PWN::Banner.welcome
119
- end
120
-
121
- @response_history = nil
122
- Pry.config.hooks.add_hook(:after_eval, :open_ai_hook) do |request, _pry|
123
- if request.instance_of?(String)
124
- response = PWN::Plugins::OpenAI.chat(
125
- token: token,
126
- system_role_content: system_role_content,
127
- request: request.to_s,
128
- temp: 1,
129
- max_tokens: 0,
130
- response_history: @response_history,
131
- speak_answer: @speak_answer
132
- )
133
- puts "\n\n\n#{response[:choices].last[:content]}\n\n\n"
134
-
135
- @response_history = {
136
- id: response[:id],
137
- object: response[:object],
138
- model: response[:model],
139
- usage: response[:usage]
140
- }
141
- @response_history[:choices] ||= response[:choices]
142
- end
143
- end
144
-
145
- if debug
146
- Pry.config.hooks.add_hook(:after_eval, :open_ai_hook_resp) do |_request, _pry|
147
- puts 'DEBUG: @response_history = '
148
- pp @response_history
149
- puts "@response_history[:choices] Length: #{@response_history[:choices].length}\n" unless @response_history.nil?
150
- end
151
- end
152
-
153
- # Define PS1 Prompt
154
- Pry.config.pwn_repl_line = 0
155
- arrow_ps1_proc = gen_ps1_proc
156
- splat_ps1_proc = gen_ps1_proc(delim: :splat)
157
- prompt_ps1 = [arrow_ps1_proc, splat_ps1_proc]
158
-
159
- pwn_prompt = Pry::Prompt.new(
160
- :pwn_chat,
161
- 'PWN Prototyping REPL w/ OpenAI Assistant',
162
- prompt_ps1
163
- )
164
-
165
- # Start PWN REPL
166
- Pry.config.prompt_name = :pwn_chat
167
- Pry.start(
168
- self,
169
- prompt: pwn_prompt
170
- )
171
- rescue StandardError => e
172
- raise e
173
- end