pwn 0.4.647 → 0.4.648
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/bin/pwn +154 -48
- data/lib/pwn/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb95e1a689de3ccedc52ac145a4d55e39b3b4189504a256094cb5de24163f5b6
|
4
|
+
data.tar.gz: 3300a6a7bbf155e635579898f24b07968995daa6204b16b15061afeeb2cbfe1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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.
|
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
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
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
|
-
|
28
|
+
pi.config.pwn_repl_line
|
41
29
|
)
|
42
|
-
|
43
|
-
|
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
|
90
|
-
description "
|
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.
|
95
|
-
|
96
|
-
|
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-
|
101
|
-
description
|
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.
|
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
|
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.
|
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,
|
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(:
|
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.
|
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 "
|
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
|
-
|
181
|
-
|
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:
|
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
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.
|
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-
|
11
|
+
date: 2023-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|