pwn 0.4.647 → 0.4.648

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 (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/bin/pwn +154 -48
  4. data/lib/pwn/version.rb +1 -1
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7cac8dc36a8fa224c844ae74754c2e2fdfa19da971a130235ab8b220b081f419
4
- data.tar.gz: 7d79fb7aedc4c01157eb15d35a9b790d09acf962edeb0e18fdff056fd5233ae0
3
+ metadata.gz: cb95e1a689de3ccedc52ac145a4d55e39b3b4189504a256094cb5de24163f5b6
4
+ data.tar.gz: 3300a6a7bbf155e635579898f24b07968995daa6204b16b15061afeeb2cbfe1e
5
5
  SHA512:
6
- metadata.gz: 741322843a67b02b60670ec2be63329f7a1c66b0e0b25ffa49544ab10830205a60044ba5ba16787f3660f9e651c15e1aa4e8b64008bc27a64398712963b207b7
7
- data.tar.gz: b67539738e255c51ad75eb3d5e3d55ba0d63321a4557ca1bcf9fd19b5cf9f90ee1a7edadca79136d9787ae94ecfbe4f6b9568bf06d72c3c61438b5ff37e5adf9
6
+ metadata.gz: cd989a97ab5630ec645309f00a84e28d8fc907816fca8fa87dae628edeed6566a34e373c382eb6c44c8b980d5f6307aaaa884dd94cd618a1ce6a7b6791d22cf9
7
+ data.tar.gz: 6a4a7a3350fbc575d3ffdabe037f0f3c0d90fd7bdb058f8170a18b45a67521c55a1fd2f1986c72242dc7ad036e269ad5025eff068306ace8ffc72ed7b804c38e
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.647]:001 >>> PWN.help
40
+ pwn[v0.4.648]: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.647]:001 >>> PWN.help
55
+ pwn[v0.4.648]:001 >>> PWN.help
56
56
  ```
57
57
 
58
58
 
data/bin/pwn CHANGED
@@ -5,9 +5,6 @@ require 'optparse'
5
5
  require 'pwn'
6
6
  require 'pry'
7
7
  require 'yaml'
8
- # require 'colorize'
9
- # require 'tty-prompt'
10
- # require 'tty-reader'
11
8
 
12
9
  opts = {}
13
10
  OptionParser.new do |options|
@@ -21,29 +18,39 @@ OptionParser.new do |options|
21
18
  end.parse!
22
19
 
23
20
  begin
24
- def gen_ps1_proc(opts = {})
25
- delim = opts[:delim]
26
-
27
- # title = 'pwn'.red.bold
28
- title = "\001\e[1m\002\001\e[31m\002#{File.basename($PROGRAM_NAME)}\001\e[0m\002"
29
- # version = PWN::VERSION.cyan
30
- version = "\001\e[36m\002v#{PWN::VERSION}\001\e[0m\002"
31
- # dchars = '>>>'.green
32
- dchars = "\001\e[32m\002>>>\001\e[0m\002"
33
- # dchars = '***'.yellow if delim == :splat
34
- dchars = "\001\e[33m\002***\001\e[0m\002" if delim == :splat
35
-
36
- proc do |_target_self, _nest_level, pry|
37
- pry.config.pwn_repl_line += 1
21
+ def refresh_ps1_proc(opts = {})
22
+ mode = opts[:mode]
23
+
24
+ proc do |_target_self, _nest_level, pi|
25
+ pi.config.pwn_repl_line += 1
38
26
  line_pad = format(
39
27
  '%0.3d',
40
- pry.config.pwn_repl_line
28
+ pi.config.pwn_repl_line
41
29
  )
42
- line_count = "\001\e[34m\002#{line_pad}\001\e[0m\002" # Blue
43
- "#{title}[#{version}]:#{line_count} #{dchars} ".to_s.scrub
30
+
31
+ pi.config.prompt_name = :pwn
32
+ name = "\001\e[1m\002\001\e[31m\002#{pi.config.prompt_name}\001\e[0m\002"
33
+ version = "\001\e[36m\002v#{PWN::VERSION}\001\e[0m\002"
34
+ line_count = "\001\e[34m\002#{line_pad}\001\e[0m\002"
35
+ dchars = "\001\e[32m\002>>>\001\e[0m\002"
36
+ dchars = "\001\e[33m\002***\001\e[0m\002" if mode == :splat
37
+ if pi.config.chat_gpt
38
+ pi.config.prompt_name = 'chatGPT.pwn'
39
+ pi.config.prompt_name = 'SPEAKING.chatGPT.pwn' if pi.config.chat_gpt_speak
40
+ name = "\001\e[1m\002\001\e[33m\002#{pi.config.prompt_name}\001\e[0m\002"
41
+ dchars = "\001\e[32m\002>>>\001\e[31m\002"
42
+ dchars = "\001\e[33m\002***\001\e[31m\002" if mode == :splat
43
+ if pi.config.chat_gpt_debug
44
+ dchars = "\001\e[32m\002(DEBUG) >>>\001\e[31m\002"
45
+ dchars = "\001\e[33m\002(DEBUG) ***\001\e[31m\002" if mode == :splat
46
+ end
47
+ end
48
+
49
+ "#{name}[#{version}]:#{line_count} #{dchars} ".to_s.scrub
44
50
  end
45
51
  end
46
52
 
53
+ # Pry Monkey Patches \_(oo)_/
47
54
  class Pry
48
55
  # Overwrite Pry::History.push method in History class to get duplicate history entries
49
56
  # in order to properly replay automation in this prototyping driver
@@ -66,6 +73,108 @@ begin
66
73
  end
67
74
  alias << push
68
75
  end
76
+
77
+ def handle_line(line, options)
78
+ if line.nil?
79
+ config.control_d_handler.call(self)
80
+ return
81
+ end
82
+
83
+ ensure_correct_encoding!(line)
84
+ Pry.history << line unless options[:generated]
85
+
86
+ @suppress_output = false
87
+ inject_sticky_locals!
88
+ begin
89
+ unless process_command_safely(line)
90
+ @eval_string += "#{line.chomp}\n" if !line.empty? || !@eval_string.empty?
91
+ end
92
+ rescue RescuableException => e
93
+ self.last_exception = e
94
+ result = e
95
+
96
+ Pry.critical_section do
97
+ show_result(result)
98
+ end
99
+ return
100
+ end
101
+
102
+ # This hook is supposed to be executed after each line of ruby code
103
+ # has been read (regardless of whether eval_string is yet a complete expression)
104
+ exec_hook :after_read, eval_string, self
105
+
106
+ begin
107
+ if config.chat_gpt
108
+ complete_expr = true
109
+ @eval_string += ';'
110
+ else
111
+ complete_expr = Pry::Code.complete_expression?(@eval_string)
112
+ end
113
+ rescue SyntaxError => e
114
+ output.puts e.message.gsub(/^.*syntax error, */, "SyntaxError: ")
115
+ reset_eval_string
116
+ end
117
+
118
+ if complete_expr
119
+ if @eval_string =~ /;\Z/ || @eval_string.empty? || @eval_string =~ /\A *#.*\n\z/
120
+ @suppress_output = true
121
+ end
122
+
123
+ # A bug in jruby makes java.lang.Exception not rescued by
124
+ # `rescue Pry::RescuableException` clause.
125
+ #
126
+ # * https://github.com/pry/pry/issues/854
127
+ # * https://jira.codehaus.org/browse/JRUBY-7100
128
+ #
129
+ # Until that gets fixed upstream, treat java.lang.Exception
130
+ # as an additional exception to be rescued explicitly.
131
+ #
132
+ # This workaround has a side effect: java exceptions specified
133
+ # in `Pry.config.unrescued_exceptions` are ignored.
134
+ jruby_exceptions = []
135
+ jruby_exceptions << Java::JavaLang::Exception if Helpers::Platform.jruby?
136
+
137
+ begin
138
+ # Reset eval string, in case we're evaluating Ruby that does something
139
+ # like open a nested REPL on this instance.
140
+ eval_string = @eval_string
141
+ reset_eval_string
142
+
143
+ result = evaluate_ruby(eval_string)
144
+ rescue RescuableException, *jruby_exceptions => e
145
+ # Eliminate following warning:
146
+ # warning: singleton on non-persistent Java type X
147
+ # (http://wiki.jruby.org/Persistence)
148
+ if Helpers::Platform.jruby? && e.class.respond_to?('__persistent__')
149
+ e.class.__persistent__ = true
150
+ end
151
+ self.last_exception = e
152
+ result = e
153
+ end
154
+
155
+ Pry.critical_section do
156
+ show_result(result)
157
+ end
158
+ end
159
+
160
+ throw(:breakout) if current_binding.nil?
161
+ end
162
+
163
+ # Ensure the return value in chat_gpt mode reflects the input
164
+ def evaluate_ruby(code)
165
+ if config.chat_gpt
166
+ result = message = code.to_s
167
+ return
168
+ end
169
+ inject_sticky_locals!
170
+ exec_hook :before_eval, code, self
171
+
172
+ result = current_binding.eval(code, Pry.eval_path, Pry.current_line)
173
+ set_last_result(result, code)
174
+ ensure
175
+ update_input_history(code)
176
+ exec_hook :after_eval, result, self
177
+ end
69
178
  end
70
179
 
71
180
  # Define Custom REPL Commands
@@ -86,42 +195,38 @@ begin
86
195
  end
87
196
  end
88
197
 
89
- Pry::Commands.create_command 'toggle-chatGPT-debug' do
90
- description "Display the response_history object while using OpenAI's ChatGPT."
198
+ Pry::Commands.create_command 'toggle-chatGPT' do
199
+ description "Interact w/ OpenAI's ChatGPT"
91
200
 
92
201
  def process
93
202
  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
203
+ pi.config.chat_gpt ? pi.config.chat_gpt = false : pi.config.chat_gpt = true
204
+ pi.config.color = false if pi.config.chat_gpt
205
+ pi.config.color = true unless pi.config.chat_gpt
97
206
  end
98
207
  end
99
208
 
100
- Pry::Commands.create_command 'toggle-chatGPT-speaks' do
101
- description 'Use speech capabilities within PWN to speak OpenAI ChatGPT answers.'
209
+ Pry::Commands.create_command 'toggle-chatGPT-debug' do
210
+ description "Display the response_history object while using OpenAI's ChatGPT."
102
211
 
103
212
  def process
104
213
  pi = pry_instance
105
- pi.config.chat_gpt_speak ? pi.config.chat_gpt_speak = false : pi.config.chat_gpt_speak = true
106
- print 'ChatGPT Speech Enabled.' if pi.config.chat_gpt_speak
107
- puts 'ChatGPT Speech Disabled.' unless pi.config.chat_gpt_speak
214
+ pi.config.chat_gpt_debug ? pi.config.chat_gpt_debug = false : pi.config.chat_gpt_debug = true
108
215
  end
109
216
  end
110
217
 
111
- Pry::Commands.create_command 'toggle-chatGPT' do
112
- description "Interact w/ OpenAI's ChatGPT"
218
+ Pry::Commands.create_command 'toggle-chatGPT-speaks' do
219
+ description 'Use speech capabilities within PWN to speak OpenAI ChatGPT answers.'
113
220
 
114
221
  def process
115
222
  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
223
+ pi.config.chat_gpt_speak ? pi.config.chat_gpt_speak = false : pi.config.chat_gpt_speak = true
119
224
  end
120
225
  end
121
226
 
122
227
  # Define REPL Hooks
123
228
  # Welcome Banner Hook
124
- Pry.config.hooks.add_hook(:before_session, :welcome) do |output, _binding, _pry|
229
+ Pry.config.hooks.add_hook(:before_session, :welcome) do |output, _binding, _pi|
125
230
  output.puts PWN::Banner.welcome
126
231
  end
127
232
 
@@ -134,8 +239,9 @@ begin
134
239
  end
135
240
  end
136
241
 
137
- Pry.config.hooks.add_hook(:after_eval, :open_ai_hook) do |request, pi|
138
- if pi.config.chat_gpt && request
242
+ Pry.config.hooks.add_hook(:after_read, :open_ai_hook) do |request, pi|
243
+ if pi.config.chat_gpt && !request.chomp.empty?
244
+ request = pi.input.line_buffer
139
245
  debug = pi.config.chat_gpt_debug
140
246
  token = pi.config.chat_gpt_token
141
247
  token ||= ''
@@ -150,13 +256,13 @@ begin
150
256
  speak_answer = pi.config.chat_gpt_speak
151
257
  response = PWN::Plugins::OpenAI.chat(
152
258
  token: token,
153
- request: request.to_s,
259
+ request: request.chomp,
154
260
  temp: 1,
155
261
  max_tokens: 0,
156
262
  response_history: response_history,
157
263
  speak_answer: speak_answer
158
264
  )
159
- puts "\n\n\n#{response[:choices].last[:content]}\n\n\n"
265
+ puts "\n\n\n\001\e[32m\002#{response[:choices].last[:content]}\001\e[31m\002\n\n\n"
160
266
 
161
267
  response_history = {
162
268
  id: response[:id],
@@ -167,9 +273,9 @@ begin
167
273
  response_history[:choices] ||= response[:choices]
168
274
 
169
275
  if debug
170
- puts 'DEBUG: response_history = '
276
+ puts 'DEBUG: response_history => '
171
277
  pp response_history
172
- puts "response_history[:choices] Length: #{response_history[:choices].length}\n" unless response_history.nil?
278
+ puts "\nresponse_history[:choices] Length: #{response_history[:choices].length}\n" unless response_history.nil?
173
279
  end
174
280
  pi.config.chat_gpt_response_history = response_history
175
281
  end
@@ -177,22 +283,22 @@ begin
177
283
 
178
284
  # Define PS1 Prompt
179
285
  Pry.config.pwn_repl_line = 0
180
- arrow_ps1_proc = gen_ps1_proc
181
- splat_ps1_proc = gen_ps1_proc(delim: :splat)
286
+ Pry.config.prompt_name = :pwn
287
+ arrow_ps1_proc = refresh_ps1_proc
288
+ splat_ps1_proc = refresh_ps1_proc(mode: :splat)
182
289
  prompt_ps1 = [arrow_ps1_proc, splat_ps1_proc]
183
-
184
- pwn_prompt = Pry::Prompt.new(
290
+ prompt = Pry::Prompt.new(
185
291
  :pwn,
186
292
  'PWN Prototyping REPL',
187
293
  prompt_ps1
188
294
  )
189
295
 
190
296
  # Start PWN REPL
191
- Pry.config.prompt_name = :pwn
192
297
  Pry.start(
193
298
  self,
194
- prompt: pwn_prompt
299
+ prompt: prompt
195
300
  )
196
301
  rescue StandardError => e
302
+ puts 1111 if Pry.config.chat_gpt
197
303
  raise e
198
304
  end
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.647'
4
+ VERSION = '0.4.648'
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.647
4
+ version: 0.4.648
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-19 00:00:00.000000000 Z
11
+ date: 2023-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport