pwn 0.5.192 → 0.5.194
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/lib/pwn/plugins/repl.rb +4 -2
- data/lib/pwn/plugins/transparent_browser.rb +62 -34
- data/lib/pwn/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8e2618c43661322179b1ea623b1dc19c5fc079373197c1ba64d78e63e17d68f
|
4
|
+
data.tar.gz: 7c36ee8c5c48c6c181a7a4204911bdb6c9079f945b1814daafa5ccf433e71bd6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8449c2bfcc574dab0613478ac7f9cc249f039c7fc8ea3d27fd14045ce399377f2be3fdcdd760ffeb93f2812c0157e8c6daa99645d965e59835e35d5bf40b8f0b
|
7
|
+
data.tar.gz: a5018bad53afa6a41bcf41c9b9c3abc0508ab2430f4905ab0368fd2beb479706c2f117bb48cb2414e641e5f39efe3cc28fd05bd7e5ad74ec165f2f9884ed615b
|
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.
|
40
|
+
pwn[v0.5.194]: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.3.3@pwn
|
|
52
52
|
$ gem uninstall --all --executables pwn
|
53
53
|
$ gem install --verbose pwn
|
54
54
|
$ pwn
|
55
|
-
pwn[v0.5.
|
55
|
+
pwn[v0.5.194]: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.3.3@pwn
|
|
62
62
|
$ rvmsudo gem uninstall --all --executables pwn
|
63
63
|
$ rvmsudo gem install --verbose pwn
|
64
64
|
$ pwn
|
65
|
-
pwn[v0.5.
|
65
|
+
pwn[v0.5.194]: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:
|
data/lib/pwn/plugins/repl.rb
CHANGED
@@ -605,7 +605,8 @@ module PWN
|
|
605
605
|
model: model,
|
606
606
|
request: request.chomp,
|
607
607
|
response_history: response_history,
|
608
|
-
speak_answer: speak_answer
|
608
|
+
speak_answer: speak_answer,
|
609
|
+
spinner: true
|
609
610
|
)
|
610
611
|
when :openai
|
611
612
|
response = PWN::Plugins::OpenAI.chat(
|
@@ -613,7 +614,8 @@ module PWN
|
|
613
614
|
model: model,
|
614
615
|
request: request.chomp,
|
615
616
|
response_history: response_history,
|
616
|
-
speak_answer: speak_answer
|
617
|
+
speak_answer: speak_answer,
|
618
|
+
spinner: true
|
617
619
|
)
|
618
620
|
else
|
619
621
|
raise "ERROR: Unsupported AI Engine: #{ai_engine}"
|
@@ -42,7 +42,6 @@ module PWN
|
|
42
42
|
# browser_type: 'optional - :firefox|:chrome|:headless|:rest|:websocket (defaults to :chrome)',
|
43
43
|
# proxy: 'optional - scheme://proxy_host:port || tor (defaults to nil)',
|
44
44
|
# devtools: 'optional - boolean (defaults to true)',
|
45
|
-
# url: 'optional - URL to navigate to after opening browser (Defaults to about:about#RANDID)'
|
46
45
|
# )
|
47
46
|
|
48
47
|
public_class_method def self.open(opts = {})
|
@@ -63,8 +62,6 @@ module PWN
|
|
63
62
|
devtools = opts[:devtools] ||= false
|
64
63
|
devtools = true if devtools_supported.include?(browser_type) && devtools
|
65
64
|
|
66
|
-
url = opts[:url] ||= "about:about##{SecureRandom.hex(8)}"
|
67
|
-
|
68
65
|
# Let's crank up the default timeout from 30 seconds to 15 min for slow sites
|
69
66
|
Watir.default_timeout = 900
|
70
67
|
|
@@ -130,7 +127,7 @@ module PWN
|
|
130
127
|
end
|
131
128
|
end
|
132
129
|
|
133
|
-
args.push('--devtools') if devtools
|
130
|
+
# args.push('--devtools') if devtools
|
134
131
|
options = Selenium::WebDriver::Firefox::Options.new(
|
135
132
|
args: args,
|
136
133
|
accept_insecure_certs: true
|
@@ -161,7 +158,8 @@ module PWN
|
|
161
158
|
accept_insecure_certs: true
|
162
159
|
)
|
163
160
|
|
164
|
-
|
161
|
+
# This is for bidi, once it's ready
|
162
|
+
# options.web_socket_url = true
|
165
163
|
options.profile = this_profile
|
166
164
|
driver = Selenium::WebDriver.for(:chrome, options: options)
|
167
165
|
browser_obj[:browser] = Watir::Browser.new(driver)
|
@@ -221,7 +219,8 @@ module PWN
|
|
221
219
|
accept_insecure_certs: true
|
222
220
|
)
|
223
221
|
|
224
|
-
|
222
|
+
# This is for bidi, once it's ready
|
223
|
+
# options.web_socket_url = true
|
225
224
|
options.profile = this_profile
|
226
225
|
driver = Selenium::WebDriver.for(:firefox, options: options)
|
227
226
|
browser_obj[:browser] = Watir::Browser.new(driver)
|
@@ -243,7 +242,8 @@ module PWN
|
|
243
242
|
accept_insecure_certs: true
|
244
243
|
)
|
245
244
|
|
246
|
-
|
245
|
+
# This is for bidi, once it's ready
|
246
|
+
# options.web_socket_url = true
|
247
247
|
options.profile = this_profile
|
248
248
|
driver = Selenium::WebDriver.for(:chrome, options: options)
|
249
249
|
browser_obj[:browser] = Watir::Browser.new(driver)
|
@@ -258,7 +258,6 @@ module PWN
|
|
258
258
|
browser_obj[:browser].proxy = proxy
|
259
259
|
end
|
260
260
|
end
|
261
|
-
puts browser_obj[:browser].get(url).body if url
|
262
261
|
|
263
262
|
when :websocket
|
264
263
|
if proxy
|
@@ -285,10 +284,6 @@ module PWN
|
|
285
284
|
end
|
286
285
|
|
287
286
|
if devtools_supported.include?(browser_type)
|
288
|
-
rand_tab = SecureRandom.hex(8)
|
289
|
-
browser_obj[:browser].goto(url)
|
290
|
-
browser_obj[:browser].execute_script("document.title = '#{rand_tab}'")
|
291
|
-
|
292
287
|
if devtools
|
293
288
|
driver = browser_obj[:browser].driver
|
294
289
|
browser_obj[:devtools] = driver.devtools
|
@@ -307,11 +302,13 @@ module PWN
|
|
307
302
|
browser_obj[:devtools].send_cmd('DOMSnapshot.enable')
|
308
303
|
end
|
309
304
|
|
310
|
-
|
305
|
+
# Future BiDi API that's more universally supported across browsers
|
306
|
+
# browser_obj[:bidi] = driver.bidi
|
311
307
|
|
312
308
|
jmp_devtools_panel(browser_obj: browser_obj, panel: :elements)
|
313
|
-
browser_obj[:browser].send_keys(:escape)
|
314
309
|
end
|
310
|
+
|
311
|
+
new_tab(browser_obj: browser_obj, first_tab: true)
|
315
312
|
end
|
316
313
|
|
317
314
|
browser_obj
|
@@ -458,7 +455,8 @@ module PWN
|
|
458
455
|
# Supported Method Parameters::
|
459
456
|
# tab = PWN::Plugins::TransparentBrowser.jmp_tab(
|
460
457
|
# browser_obj: 'required - browser_obj returned from #open method)',
|
461
|
-
# keyword: 'required - keyword in title or url used to switch tabs'
|
458
|
+
# keyword: 'required - keyword in title or url used to switch tabs',
|
459
|
+
# explicit: 'optional - boolean to indicate if the keyword is an exact match (Defaults to false)'
|
462
460
|
# )
|
463
461
|
|
464
462
|
public_class_method def self.jmp_tab(opts = {})
|
@@ -468,9 +466,16 @@ module PWN
|
|
468
466
|
keyword = opts[:keyword]
|
469
467
|
raise 'ERROR: keyword parameter is required' if keyword.nil?
|
470
468
|
|
469
|
+
explicit = opts[:explicit] ||= false
|
470
|
+
|
471
471
|
browser = browser_obj[:browser]
|
472
472
|
all_tabs = browser.windows
|
473
|
-
|
473
|
+
if explicit
|
474
|
+
tab_sel = all_tabs.select { |tab| tab.use if tab.title == keyword || tab.url == keyword }
|
475
|
+
else
|
476
|
+
tab_sel = all_tabs.select { |tab| tab.use if tab.title.include?(keyword) || tab.url.include?(keyword) }
|
477
|
+
end
|
478
|
+
|
474
479
|
{ title: tab_sel.last.title, url: tab_sel.last.url, state: :active } if tab_sel.any?
|
475
480
|
rescue StandardError => e
|
476
481
|
raise e
|
@@ -479,31 +484,33 @@ module PWN
|
|
479
484
|
# Supported Method Parameters::
|
480
485
|
# tab = PWN::Plugins::TransparentBrowser.new_tab(
|
481
486
|
# browser_obj: 'required - browser_obj returned from #open method)',
|
482
|
-
#
|
487
|
+
# first_tab: 'optional - boolean to indicate if this is the first tab (Defaults to false)'
|
483
488
|
# )
|
484
489
|
|
485
490
|
public_class_method def self.new_tab(opts = {})
|
486
491
|
browser_obj = opts[:browser_obj]
|
487
492
|
verify_devtools_browser(browser_obj: browser_obj)
|
488
493
|
|
489
|
-
|
494
|
+
chrome_types = %i[chrome headless_chrome]
|
495
|
+
|
496
|
+
first_tab = opts[:first_tab] ||= false
|
490
497
|
|
491
|
-
firefox_types = %i[firefox headless_firefox]
|
492
498
|
browser = browser_obj[:browser]
|
493
499
|
browser_type = browser_obj[:type]
|
494
500
|
devtools = browser_obj[:devtools]
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
if url.nil?
|
499
|
-
browser.goto("about:about##{rand_tab}")
|
500
|
-
browser.execute_script("document.title = '#{rand_tab}'")
|
501
|
+
unless first_tab
|
502
|
+
browser.execute_script('window.open()')
|
503
|
+
jmp_tab(browser_obj: browser_obj, keyword: 'about:blank')
|
501
504
|
end
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
browser.goto(url)
|
505
|
+
|
506
|
+
rand_tab = SecureRandom.hex(8)
|
507
|
+
url = 'about:about'
|
508
|
+
url = 'chrome://chrome-urls/' if chrome_types.include?(browser_type)
|
509
|
+
browser.goto(url)
|
510
|
+
# TODO: replace sleep with something more reliable like an event listener
|
511
|
+
sleep 1
|
512
|
+
browser.execute_script("document.title = 'about:about-#{rand_tab}'")
|
513
|
+
toggle_devtools(browser_obj: browser_obj, first_tab: first_tab) if devtools
|
507
514
|
|
508
515
|
{ title: browser.title, url: browser.url, state: :active }
|
509
516
|
rescue StandardError => e
|
@@ -653,15 +660,29 @@ module PWN
|
|
653
660
|
|
654
661
|
# Supported Method Parameters::
|
655
662
|
# PWN::Plugins::TransparentBrowser.toggle_devtools(
|
656
|
-
# browser_obj: 'required - browser_obj returned from #open method)'
|
663
|
+
# browser_obj: 'required - browser_obj returned from #open method)',
|
664
|
+
# first_tab: 'optional - boolean to indicate if this is the first tab (Defaults to false)',
|
657
665
|
# )
|
658
666
|
|
659
667
|
public_class_method def self.toggle_devtools(opts = {})
|
660
668
|
browser_obj = opts[:browser_obj]
|
661
669
|
verify_devtools_browser(browser_obj: browser_obj)
|
662
670
|
|
671
|
+
first_tab = opts[:first_tab] ||= false
|
672
|
+
|
663
673
|
browser = browser_obj[:browser]
|
674
|
+
tab_id = browser.title.split('-').last.strip
|
675
|
+
devtools_tab_title = "DevTools-#{tab_id}"
|
676
|
+
jmp_tab(browser_obj: browser_obj, keyword: 'DevTools', explicit: true)
|
677
|
+
browser.execute_script("document.title = '#{devtools_tab_title}'")
|
664
678
|
browser.send_keys(:f12)
|
679
|
+
if first_tab
|
680
|
+
# TODO: replace sleep with something more reliable like an event listener
|
681
|
+
sleep 1
|
682
|
+
browser.send_keys(:escape)
|
683
|
+
end
|
684
|
+
tab_tied_to_devtools = "about:about-#{devtools_tab_title.split('-').last.strip}"
|
685
|
+
jmp_tab(browser_obj: browser_obj, keyword: tab_tied_to_devtools, explicit: true)
|
665
686
|
rescue StandardError => e
|
666
687
|
raise e
|
667
688
|
end
|
@@ -697,7 +718,12 @@ module PWN
|
|
697
718
|
hotkey.push('j') if chrome_types.include?(browser_type)
|
698
719
|
hotkey.push('k') if firefox_types.include?(browser_type)
|
699
720
|
when :debugger, :sources
|
700
|
-
|
721
|
+
if firefox_types.include?(browser_type)
|
722
|
+
# If we're in the console, we need to switch to the inspector first
|
723
|
+
jmp_devtools_panel(browser_obj: browser_obj, panel: :inspector)
|
724
|
+
sleep 1
|
725
|
+
hotkey.push('z') if firefox_types.include?(browser_type)
|
726
|
+
end
|
701
727
|
when :network
|
702
728
|
hotkey.push('e') if firefox_types.include?(browser_type)
|
703
729
|
else
|
@@ -705,9 +731,11 @@ module PWN
|
|
705
731
|
end
|
706
732
|
|
707
733
|
# Have to call twice for Chrome, otherwise devtools stays closed
|
708
|
-
browser.
|
734
|
+
browser_obj[:browser].send_keys(:escape)
|
735
|
+
# browser.body.click!
|
709
736
|
browser.send_keys(hotkey)
|
710
737
|
browser.send_keys(hotkey) if chrome_types.include?(browser_type)
|
738
|
+
browser.send_keys(:escape)
|
711
739
|
rescue StandardError => e
|
712
740
|
raise e
|
713
741
|
end
|
@@ -867,7 +895,7 @@ module PWN
|
|
867
895
|
|
868
896
|
tab = #{self}.new_tab(
|
869
897
|
browser_obj: 'required - browser_obj returned from #open method)',
|
870
|
-
|
898
|
+
first_tab: 'optional - boolean to indicate if this is the first tab (Defaults to false)'
|
871
899
|
)
|
872
900
|
|
873
901
|
tab = #{self}.close_tab(
|
data/lib/pwn/version.rb
CHANGED