module PWN::Plugins::TransparentBrowser

def self.authors

def self.authors
st.pentest@0dayinc.com>

def self.close(opts = {})

def self.close(opts = {})
[:browser_obj]
[:tor_obj].nil?
r_obj[:tor_obj]
r.stop(tor_obj: browser_obj[:tor_obj])
[:browser].to_s.include?('RestClient')
ser unless this_browser_obj.nil? (thus the &)
wser]&.close
 => e

def self.find_element_by_text(opts = {})

def self.find_element_by_text(opts = {})
[:browser_obj]
.to_s
rowser_obj[:browser].elements.select do |element|
text
h do |element_found|
{element_found.html}\n\n\n")
 => e

def self.help

def self.help
{self}.open(
:firefox|:chrome|:headless_chrome|:headless_firefox|:rest|:websocket,
al scheme://proxy_host:port || tor',
 'optional - boolean (defaults to false)'
1.public_methods
****************************************
action Only works w/ Chrome
ommands can be found here:
devtools.github.io/devtools-protocol/
er_obj1.driver.devtools
blic_methods
stance_variables
stance_variable_get('@messages')
d('Tracing.start')
d('Tracing.requestMemoryDump')
d('Tracing.end')
stance_variable_get('@messages')
d('Network.enable')
evtools.instance_variable_get('@messages').last if devtools.instance_variable_get('@messages').last['method'] == 'Network.webSocketFrameReceived'
p
d('Network.disable')
and Sending JavaScript to Console
d('Runtime.enable')
d('Console.enable')
d('DOM.enable')
d('Page.enable')
d('Log.enable')
d('Debugger.enable')
d('Debugger.pause')
cmd('Console.clearMessages')
cmd('Log.clear')
 = []
g_event(:console) { |event| console_events.push(event) }
cmd('Debugger.stepInto')
#{step}\"
= devtools.send_cmd('DOM.getDocument')
ocument:\\n\#{this_document}\\n\\n\\n\"
{
'for(var pop_var in window) { if (window.hasOwnProperty(pop_var) && window[pop_var] != null) console.log(pop_var + \" = \" + window[pop_var]); }'
send_cmd('Runtime.evaluate', **console_cmd)
0
.each do |event|
rgs
 Response Length: \#{console_events.length}\"
_digest = OpenSSL::Digest::SHA256.hexdigest(
ts.inspect
 Events Array SHA256 Digest: \#{console_events_digest}\"
0
\n\"
tep in \"
to(1) {|n| print \"\#{n} \"; sleep 1 }
d('Debugger.disable')
d('Log.disable')
d('Page.disable')
d('DOM.disable')
d('Console.disable')
d('Runtime.disable')
s Examples
****************************************
{self}.linkout(
required - browser_obj returned from #open method)'
{self}.find_element_by_text(
required - browser_obj returned from #open method)',
d - text to search for in the DOM'
human(
red - string to type as human',
at: 'optional - float timing in between keypress (defaults to 0.09)'
r_obj1.text_field(name: \"search\").send_keys(char) }
{self}.close(
required - browser_obj returned from #open method)'

def self.linkout(opts = {})

def self.linkout(opts = {})
[:browser_obj]
er].links.each do |link|
{link.text} => #{link.href}\n\n\n") unless link.text == ''
 => e

def self.open(opts = {})

def self.open(opts = {})
s[:browser_type]
y].to_s unless opts[:proxy].nil?
 'tor'
lugins::Tor.start
//#{tor_obj[:ip]}:#{tor_obj[:port]}"
_obj] = tor_obj
s] ? (with_devtools = true) : (with_devtools = false)
he default timeout from 30 seconds to 15 min for slow sites
out = 900
elenium::WebDriver::Firefox::Profile.new
ssembly Verbosity
vascript.options.wasm_verbose'] = true
de in ~/Downloads
owser.download.folderList'] = 1
owser.helperApps.neverAsk.saveToDisk'] = 'application/pdf'
x's built-in PDF viewer
fjs.disabled'] = true
Acrobat PDF preview plugin
ugin.scan.plid.all'] = false
ugin.scan.Acrobat'] = '99.0'
st proxy capabilities are enabled
twork.proxy.no_proxies_on'] = ''
to run a bit longer
dom.max_chrome_script_run_time'] = 180
dom.max_script_run_time'] = 180
r cache
owser.cache.disk.enable'] = false
owser.cache.disk_cache_ssl.enable'] = false
owser.cache.memory.enable'] = false
owser.cache.offline.enable'] = false
vtools.cache.disabled'] = true
m.caches.enabled'] = false
m::WebDriver::Remote::Capabilities.firefox
secureCerts] = true
network.proxy.type'] = 1
network.proxy.allow_hijacking_localhost'] = true
['network.proxy.socks_version'] = 5
['network.proxy.socks'] = tor_obj[:ip]
['network.proxy.socks_port'] = tor_obj[:port]
['network.proxy.ftp'] = URI(proxy).host
['network.proxy.ftp_port'] = URI(proxy).port
['network.proxy.http'] = URI(proxy).host
['network.proxy.http_port'] = URI(proxy).port
['network.proxy.ssl'] = URI(proxy).host
['network.proxy.ssl_port'] = URI(proxy).port
tools') if with_devtools
um::WebDriver::Firefox::Options.new(args: args, accept_insecure_certs: true)
= this_profile
ium::WebDriver.for(:firefox, capabilities: options)
m::WebDriver.for(:firefox, options: options)
wser] = Watir::Browser.new(driver)
elenium::WebDriver::Chrome::Profile.new
wnload.prompt_for_download'] = false
wnload.default_directory'] = '~/Downloads'
-start-maximized')
-disable-notifications')
"--host-resolver-rules='MAP * 0.0.0.0 , EXCLUDE #{tor_obj[:ip]}'") if tor_obj
"--proxy-server=#{proxy}")

'--auto-open-devtools-for-tabs')
'--disable-hang-monitor')
um::WebDriver::Chrome::Options.new(
,
e_certs: true
= this_profile
ium::WebDriver.for(:chrome, capabilities: options)
m::WebDriver.for(:chrome, options: options)
wser] = Watir::Browser.new(driver)
eadless_firefox
elenium::WebDriver::Firefox::Profile.new
ssembly Verbosity
vascript.options.wasm_verbose'] = true
de in ~/Downloads
owser.download.folderList'] = 1
owser.helperApps.neverAsk.saveToDisk'] = 'application/pdf'
x's built-in PDF viewer
fjs.disabled'] = true
Acrobat PDF preview plugin
ugin.scan.plid.all'] = false
ugin.scan.Acrobat'] = '99.0'
st proxy capabilities are enabled
twork.proxy.no_proxies_on'] = ''
to run a bit longer
dom.max_chrome_script_run_time'] = 180
dom.max_script_run_time'] = 180
r cache
owser.cache.disk.enable'] = false
owser.cache.disk_cache_ssl.enable'] = false
owser.cache.memory.enable'] = false
owser.cache.offline.enable'] = false
vtools.cache.disabled'] = true
m.caches.enabled'] = false
m::WebDriver::Remote::Capabilities.firefox
secureCerts] = true
network.proxy.type'] = 1
network.proxy.allow_hijacking_localhost'] = true
['network.proxy.socks_version'] = 5
['network.proxy.socks'] = tor_obj[:ip]
['network.proxy.socks_port'] = tor_obj[:port]
['network.proxy.ftp'] = URI(proxy).host
['network.proxy.ftp_port'] = URI(proxy).port
['network.proxy.http'] = URI(proxy).host
['network.proxy.http_port'] = URI(proxy).port
['network.proxy.ssl'] = URI(proxy).host
['network.proxy.ssl_port'] = URI(proxy).port
um::WebDriver::Firefox::Options.new(args: ['-headless'], accept_insecure_certs: true)
= this_profile
m::WebDriver.for(:firefox, options: options)
wser] = Watir::Browser.new(driver)
ome
elenium::WebDriver::Chrome::Profile.new
wnload.prompt_for_download'] = false
wnload.default_directory'] = '~/Downloads'
-headless')
-start-maximized')
-disable-notifications')
"--host-resolver-rules='MAP * 0.0.0.0 , EXCLUDE #{tor_obj[:ip]}'") if tor_obj
"--proxy-server=#{proxy}")
um::WebDriver::Chrome::Options.new(
,
e_certs: true
= this_profile
m::WebDriver.for(:chrome, options: options)
wser] = Watir::Browser.new(driver)
wser] = RestClient
cks_server = tor_obj[:ip]
cks_port = tor_obj[:port]
:browser].proxy = proxy
cks_server = tor_obj[:ip]
cks_port = tor_obj[:port]
 origin: proxy }
erify_peer: false }
rowser] = Faye::WebSocket::Client.new(
pts,
xy_opts
rowser] = Faye::WebSocket::Client.new('')
wser_type only supports :firefox, :chrome, :headless, :rest, or :websocket'
 => e

def self.type_as_human(opts = {})

def self.type_as_human(opts = {})
ing].to_s
 if opts[:rand_sleep_float]
   opts[:rand_sleep_float].to_f
 else
   0.09
 end
o |char|
d(rand_sleep_float)
 => e