lib/pwn/plugins/transparent_browser.rb in pwn-0.5.189 vs lib/pwn/plugins/transparent_browser.rb in pwn-0.5.190
- old
+ new
@@ -39,11 +39,12 @@
# Supported Method Parameters::
# browser_obj1 = PWN::Plugins::TransparentBrowser.open(
# browser_type: 'optional - :firefox|:chrome|:headless|:rest|:websocket (defaults to :chrome)',
# proxy: 'optional - scheme://proxy_host:port || tor (defaults to nil)',
- # with_devtools: 'optional - boolean (defaults to true)'
+ # with_devtools: 'optional - boolean (defaults to true)',
+ # url: 'optional - URL to navigate to after opening browser (Defaults to about:about#RANDID)'
# )
public_class_method def self.open(opts = {})
browser_type = opts[:browser_type] ||= :chrome
proxy = opts[:proxy].to_s unless opts[:proxy].nil?
@@ -60,10 +61,12 @@
devtools_supported = %i[chrome headless_chrome firefox headless_firefox headless]
with_devtools = opts[:with_devtools] ||= false
with_devtools = true if devtools_supported.include?(browser_type) && with_devtools
+ url = opts[:url] ||= "about:about##{SecureRandom.hex(8)}"
+
# Let's crank up the default timeout from 30 seconds to 15 min for slow sites
Watir.default_timeout = 900
args = []
args.push('--start-maximized')
@@ -284,10 +287,11 @@
end
if devtools_supported.include?(browser_type)
rand_tab = SecureRandom.hex(8)
browser_obj[:browser].goto("about:about##{rand_tab}")
+ browser_obj[:browser].execute_script("document.title = '#{rand_tab}'")
if with_devtools
driver = browser_obj[:browser].driver
browser_obj[:devtools] = driver.devtools
@@ -305,11 +309,11 @@
browser_obj[:devtools].send_cmd('DOMSnapshot.enable')
end
browser_obj[:bidi] = driver.bidi
- browser_obj[:browser].body.send_keys(:escape)
+ browser_obj[:browser].send_keys(:escape)
end
end
browser_obj
rescue StandardError => e
@@ -495,13 +499,13 @@
if url.nil?
browser.goto("about:about##{rand_tab}")
browser.execute_script("document.title = '#{rand_tab}'")
end
# Open the DevTools for Firefox, Chrome opens them automatically
- browser.body.send_keys(:f12) if firefox_types.include?(browser_type)
+ browser.send_keys(:f12) if firefox_types.include?(browser_type)
# Open Console drawer if DevTools are open
- browser.body.send_keys(:escape) unless devtools.nil?
+ browser.send_keys(:escape) unless devtools.nil?
browser.goto(url) unless url.nil?
{ title: browser.title, url: browser.url, state: :active }
rescue StandardError => e
raise e
@@ -520,15 +524,17 @@
keyword = opts[:keyword]
raise 'ERROR: keyword parameter is required' if keyword.nil?
browser = browser_obj[:browser]
# Switch to an inactive tab before closing the active tab if it's currently active
- active_tab = list_tabs(browser_obj: browser_obj).select { |tab| tab[:state] == :active }
- if active_tab.last[:url] == browser.url
- inactive_tabs = list_tabs(browser_obj: browser_obj).reject { |tab| tab[:url] == browser.url }
- keyword = inactive_tabs.last[:url]
- jmp_tab(browser_obj: browser_obj, keyword: keyword)
+ active_tab = list_tabs(browser_obj: browser_obj).find { |tab| tab[:state] == :active }
+ if active_tab[:url] == browser.url
+ inactive_tabs = list_tabs(browser_obj: browser_obj).reject { |tab| tab[:state] == :active }
+ if inactive_tabs.any?
+ keyword = inactive_tabs.last[:url]
+ jmp_tab(browser_obj: browser_obj, keyword: keyword)
+ end
end
all_tabs = browser.windows
tab_sel = all_tabs.select { |tab| tab.close if tab.title.include?(keyword) || tab.url.include?(keyword) }
{ title: tab_sel.last.title, url: tab_sel.last.url, state: :closed } if tab_sel.any?
rescue StandardError => e
@@ -645,11 +651,11 @@
public_class_method def self.toggle_devtools(opts = {})
browser_obj = opts[:browser_obj]
verify_devtools_browser(browser_obj: browser_obj)
browser = browser_obj[:browser]
- browser.body.send_keys(:f12)
+ browser.send_keys(:f12)
rescue StandardError => e
raise e
end
# Supported Method Parameters::
@@ -689,11 +695,11 @@
else
raise 'ERROR: panel parameter must be :elements|:inspector|:console|:debugger|:sources|:network'
end
# Have to call twice for Chrome, otherwise devtools stays closed
- browser.body.send_keys(hotkey)
- browser.body.send_keys(hotkey) if chrome_types.include?(browser_type)
+ browser.send_keys(hotkey)
+ browser.send_keys(hotkey) if chrome_types.include?(browser_type)
rescue StandardError => e
raise e
end
# Supported Method Parameters::