pwn 0.5.508 → 0.5.509
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.
- checksums.yaml +4 -4
- metadata +24 -1131
- data/.github/FUNDING.yml +0 -1
- data/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
- data/.gitignore +0 -65
- data/.rubocop.yml +0 -35
- data/.rubocop_todo.yml +0 -178
- data/.ruby-gemset +0 -1
- data/.ruby-version +0 -1
- data/.travis.yml +0 -24
- data/CHANGELOG_BETWEEN_TAGS.txt +0 -185
- data/CODE_OF_CONDUCT.md +0 -46
- data/CONTRIBUTING.md +0 -13
- data/Gemfile +0 -107
- data/LICENSE.txt +0 -22
- data/README.md +0 -100
- data/Rakefile +0 -20
- data/Vagrantfile +0 -250
- data/bin/pwn +0 -30
- data/bin/pwn_android_war_dialer +0 -151
- data/bin/pwn_autoinc_version +0 -58
- data/bin/pwn_aws_describe_resources +0 -717
- data/bin/pwn_bdba_groups +0 -107
- data/bin/pwn_bdba_scan +0 -198
- data/bin/pwn_burp_suite_pro_active_rest_api_scan +0 -167
- data/bin/pwn_burp_suite_pro_active_scan +0 -132
- data/bin/pwn_char_base64_encoding +0 -15
- data/bin/pwn_char_dec_encoding +0 -14
- data/bin/pwn_char_hex_escaped_encoding +0 -17
- data/bin/pwn_char_html_entity_encoding +0 -15
- data/bin/pwn_char_unicode_escaped_encoding +0 -14
- data/bin/pwn_char_url_encoding +0 -15
- data/bin/pwn_crt_sh +0 -73
- data/bin/pwn_defectdojo_engagement_create +0 -148
- data/bin/pwn_defectdojo_importscan +0 -130
- data/bin/pwn_defectdojo_reimportscan +0 -118
- data/bin/pwn_diff_csv_files_w_column_exclude +0 -171
- data/bin/pwn_domain_reversewhois +0 -76
- data/bin/pwn_fuzz_net_app_proto +0 -170
- data/bin/pwn_gqrx_scanner +0 -196
- data/bin/pwn_jenkins_create_job +0 -58
- data/bin/pwn_jenkins_create_view +0 -58
- data/bin/pwn_jenkins_install_plugin +0 -83
- data/bin/pwn_jenkins_thinBackup_aws_s3 +0 -113
- data/bin/pwn_jenkins_update_plugins +0 -77
- data/bin/pwn_jenkins_useradd +0 -76
- data/bin/pwn_mail_agent +0 -114
- data/bin/pwn_msf_postgres_login +0 -28
- data/bin/pwn_nessus_cloud_scan_crud +0 -334
- data/bin/pwn_nessus_cloud_vulnscan +0 -87
- data/bin/pwn_nexpose +0 -42
- data/bin/pwn_nmap_discover_tcp_udp +0 -353
- data/bin/pwn_openvas_vulnscan +0 -104
- data/bin/pwn_pastebin_sample_filter +0 -47
- data/bin/pwn_phone +0 -129
- data/bin/pwn_rdoc_to_jsonl +0 -83
- data/bin/pwn_sast +0 -183
- data/bin/pwn_serial_check_voicemail +0 -56
- data/bin/pwn_serial_msr206 +0 -168
- data/bin/pwn_serial_qualcomm_commands +0 -16
- data/bin/pwn_serial_son_micro_sm132_rfid +0 -188
- data/bin/pwn_shodan_graphql_introspection +0 -304
- data/bin/pwn_shodan_search +0 -90
- data/bin/pwn_simple_http_server +0 -44
- data/bin/pwn_web_cache_deception +0 -205
- data/bin/pwn_www_checkip +0 -77
- data/bin/pwn_www_uri_buster +0 -363
- data/bin/pwn_xss_dom_vectors +0 -149
- data/bin/pwn_zaproxy_active_rest_api_scan +0 -159
- data/bin/pwn_zaproxy_active_scan +0 -130
- data/build_pwn_gem.sh +0 -33
- data/documentation/PWN.png +0 -0
- data/documentation/PWN_Contributors_and_Users.png +0 -0
- data/documentation/fax-spectrogram.png +0 -0
- data/documentation/fax-waveform.png +0 -0
- data/documentation/frozen_string_literal_files_changed_from_false_to_true.txt +0 -54
- data/documentation/pwn_android_war_dialer_session.png +0 -0
- data/documentation/pwn_install.png +0 -0
- data/documentation/pwn_wallpaper.jpg +0 -0
- data/documentation/ringing-spectrogram.png +0 -0
- data/documentation/ringing-waveform.png +0 -0
- data/etc/systemd/msfrpcd.service +0 -12
- data/etc/systemd/openvas.service +0 -14
- data/etc/userland/aws/apache2/jenkins_443.conf +0 -90
- data/etc/userland/aws/apache2/jenkins_80.conf +0 -7
- data/etc/userland/aws/apache2/openvas_443.conf +0 -87
- data/etc/userland/aws/apache2/openvas_80.conf +0 -7
- data/etc/userland/aws/apache2/sast_443.conf +0 -87
- data/etc/userland/aws/apache2/sast_80.conf +0 -9
- data/etc/userland/aws/apache2/vagrant.yaml.EXAMPLE +0 -9
- data/etc/userland/aws/arachni/navigation-REST.instruct.EXAMPLE +0 -29
- data/etc/userland/aws/arachni/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/aws/burpsuite/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/aws/burpsuite/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/aws/defectdojo/vagrant.yaml.EXAMPLE +0 -3
- data/etc/userland/aws/jenkins/inject_build_envs.sh +0 -15
- data/etc/userland/aws/jenkins/jenkins +0 -81
- data/etc/userland/aws/jenkins/jobs/pipeline-pwntemplate.xml +0 -298
- data/etc/userland/aws/jenkins/jobs/pipeline-selfupdate.xml +0 -462
- data/etc/userland/aws/jenkins/jobs/pwntemplate-DOMAIN-burpsuite.xml +0 -44
- data/etc/userland/aws/jenkins/jobs/pwntemplate-DOMAIN-owasp_zap.xml +0 -35
- data/etc/userland/aws/jenkins/jobs/pwntemplate-DOMAIN-ssllabs-scan.xml +0 -45
- data/etc/userland/aws/jenkins/jobs/pwntemplate-GITREPO_BRANCH-sast.xml +0 -71
- data/etc/userland/aws/jenkins/jobs/pwntemplate-NETWORKRANGE-nmap_discovery_scan_tcp_udp_65k.xml +0 -56
- data/etc/userland/aws/jenkins/jobs/pwntemplate-NETWORKRANGE-nmap_xml_results_searchsploit.xml +0 -59
- data/etc/userland/aws/jenkins/jobs/pwntemplate-NETWORKRANGE-openvas.xml +0 -45
- data/etc/userland/aws/jenkins/jobs/selfupdate-exploit-db.xml +0 -43
- data/etc/userland/aws/jenkins/jobs/selfupdate-gem.xml +0 -42
- data/etc/userland/aws/jenkins/jobs/selfupdate-jenkins_plugins.xml +0 -42
- data/etc/userland/aws/jenkins/jobs/selfupdate-metasploit.xml +0 -42
- data/etc/userland/aws/jenkins/jobs/selfupdate-nmap_all_live_hosts.xml +0 -42
- data/etc/userland/aws/jenkins/jobs/selfupdate-openvas_sync.xml +0 -42
- data/etc/userland/aws/jenkins/jobs/selfupdate-openvas_wrappers.xml +0 -42
- data/etc/userland/aws/jenkins/jobs/selfupdate-os.xml +0 -42
- data/etc/userland/aws/jenkins/jobs/selfupdate-pwn.xml +0 -42
- data/etc/userland/aws/jenkins/jobs/selfupdate-rvm.xml +0 -42
- data/etc/userland/aws/jenkins/jobs/selfupdate-ssllabs-scan.xml +0 -42
- data/etc/userland/aws/jenkins/jobs/selfupdate-wpscan.xml +0 -42
- data/etc/userland/aws/jenkins/jobs_userland/.gitkeep +0 -0
- data/etc/userland/aws/jenkins/log_parser_rules/arachni.rules +0 -5
- data/etc/userland/aws/jenkins/log_parser_rules/sast.rules +0 -2
- data/etc/userland/aws/jenkins/log_parser_rules/self_update.rules +0 -14
- data/etc/userland/aws/jenkins/log_parser_rules/ssllabs-scan.rules +0 -8
- data/etc/userland/aws/jenkins/log_parser_rules/system_maintenance.rules +0 -9
- data/etc/userland/aws/jenkins/log_parser_rules/wpscan.rules +0 -2
- data/etc/userland/aws/jenkins/vagrant.yaml.EXAMPLE +0 -8
- data/etc/userland/aws/letsencrypt/vagrant.yaml.EXAMPLE +0 -5
- data/etc/userland/aws/metasploit/vagrant.yaml.EXAMPLE +0 -4
- data/etc/userland/aws/nessus/vagrant.yaml.EXAMPLE +0 -15
- data/etc/userland/aws/openvas/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/aws/owasp_zap/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/aws/postgres/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/aws/recon-ng/vagrant.yaml.EXAMPLE +0 -52
- data/etc/userland/aws/vagrant.yaml.EXAMPLE +0 -35
- data/etc/userland/docker/apache2/jenkins_443.conf +0 -90
- data/etc/userland/docker/apache2/jenkins_80.conf +0 -7
- data/etc/userland/docker/apache2/openvas_443.conf +0 -87
- data/etc/userland/docker/apache2/openvas_80.conf +0 -7
- data/etc/userland/docker/apache2/sast_443.conf +0 -87
- data/etc/userland/docker/apache2/sast_80.conf +0 -9
- data/etc/userland/docker/apache2/vagrant.yaml.EXAMPLE +0 -9
- data/etc/userland/docker/arachni/navigation-REST.instruct.EXAMPLE +0 -29
- data/etc/userland/docker/arachni/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/docker/burpsuite/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/docker/burpsuite/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/docker/defectdojo/vagrant.yaml.EXAMPLE +0 -3
- data/etc/userland/docker/jenkins/inject_build_envs.sh +0 -15
- data/etc/userland/docker/jenkins/jenkins +0 -81
- data/etc/userland/docker/jenkins/jobs/pipeline-pwntemplate.xml +0 -298
- data/etc/userland/docker/jenkins/jobs/pipeline-selfupdate.xml +0 -462
- data/etc/userland/docker/jenkins/jobs/pwntemplate-DOMAIN-burpsuite.xml +0 -44
- data/etc/userland/docker/jenkins/jobs/pwntemplate-DOMAIN-owasp_zap.xml +0 -35
- data/etc/userland/docker/jenkins/jobs/pwntemplate-DOMAIN-ssllabs-scan.xml +0 -45
- data/etc/userland/docker/jenkins/jobs/pwntemplate-GITREPO_BRANCH-sast.xml +0 -71
- data/etc/userland/docker/jenkins/jobs/pwntemplate-NETWORKRANGE-nmap_discovery_scan_tcp_udp_65k.xml +0 -56
- data/etc/userland/docker/jenkins/jobs/pwntemplate-NETWORKRANGE-nmap_xml_results_searchsploit.xml +0 -59
- data/etc/userland/docker/jenkins/jobs/pwntemplate-NETWORKRANGE-openvas.xml +0 -45
- data/etc/userland/docker/jenkins/jobs/selfupdate-exploit-db.xml +0 -43
- data/etc/userland/docker/jenkins/jobs/selfupdate-gem.xml +0 -42
- data/etc/userland/docker/jenkins/jobs/selfupdate-jenkins_plugins.xml +0 -42
- data/etc/userland/docker/jenkins/jobs/selfupdate-metasploit.xml +0 -42
- data/etc/userland/docker/jenkins/jobs/selfupdate-nmap_all_live_hosts.xml +0 -42
- data/etc/userland/docker/jenkins/jobs/selfupdate-openvas_sync.xml +0 -42
- data/etc/userland/docker/jenkins/jobs/selfupdate-openvas_wrappers.xml +0 -42
- data/etc/userland/docker/jenkins/jobs/selfupdate-os.xml +0 -42
- data/etc/userland/docker/jenkins/jobs/selfupdate-pwn.xml +0 -42
- data/etc/userland/docker/jenkins/jobs/selfupdate-rvm.xml +0 -42
- data/etc/userland/docker/jenkins/jobs/selfupdate-ssllabs-scan.xml +0 -42
- data/etc/userland/docker/jenkins/jobs/selfupdate-wpscan.xml +0 -42
- data/etc/userland/docker/jenkins/jobs_userland/.gitkeep +0 -0
- data/etc/userland/docker/jenkins/log_parser_rules/arachni.rules +0 -5
- data/etc/userland/docker/jenkins/log_parser_rules/sast.rules +0 -2
- data/etc/userland/docker/jenkins/log_parser_rules/self_update.rules +0 -14
- data/etc/userland/docker/jenkins/log_parser_rules/ssllabs-scan.rules +0 -8
- data/etc/userland/docker/jenkins/log_parser_rules/system_maintenance.rules +0 -9
- data/etc/userland/docker/jenkins/log_parser_rules/wpscan.rules +0 -2
- data/etc/userland/docker/jenkins/vagrant.yaml.EXAMPLE +0 -8
- data/etc/userland/docker/letsencrypt/vagrant.yaml.EXAMPLE +0 -5
- data/etc/userland/docker/metasploit/vagrant.yaml.EXAMPLE +0 -4
- data/etc/userland/docker/nessus/vagrant.yaml.EXAMPLE +0 -15
- data/etc/userland/docker/openvas/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/docker/owasp_zap/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/docker/postgres/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/docker/recon-ng/vagrant.yaml.EXAMPLE +0 -52
- data/etc/userland/qemu/apache2/jenkins_443.conf +0 -90
- data/etc/userland/qemu/apache2/jenkins_80.conf +0 -7
- data/etc/userland/qemu/apache2/openvas_443.conf +0 -87
- data/etc/userland/qemu/apache2/openvas_80.conf +0 -7
- data/etc/userland/qemu/apache2/sast_443.conf +0 -87
- data/etc/userland/qemu/apache2/sast_80.conf +0 -9
- data/etc/userland/qemu/apache2/vagrant.yaml.EXAMPLE +0 -9
- data/etc/userland/qemu/arachni/navigation-REST.instruct.EXAMPLE +0 -29
- data/etc/userland/qemu/arachni/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/qemu/burpsuite/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/qemu/burpsuite/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/qemu/defectdojo/vagrant.yaml.EXAMPLE +0 -3
- data/etc/userland/qemu/jenkins/inject_build_envs.sh +0 -15
- data/etc/userland/qemu/jenkins/jenkins +0 -81
- data/etc/userland/qemu/jenkins/jobs/pipeline-pwntemplate.xml +0 -298
- data/etc/userland/qemu/jenkins/jobs/pipeline-selfupdate.xml +0 -462
- data/etc/userland/qemu/jenkins/jobs/pwntemplate-DOMAIN-burpsuite.xml +0 -44
- data/etc/userland/qemu/jenkins/jobs/pwntemplate-DOMAIN-owasp_zap.xml +0 -35
- data/etc/userland/qemu/jenkins/jobs/pwntemplate-DOMAIN-ssllabs-scan.xml +0 -45
- data/etc/userland/qemu/jenkins/jobs/pwntemplate-GITREPO_BRANCH-sast.xml +0 -71
- data/etc/userland/qemu/jenkins/jobs/pwntemplate-NETWORKRANGE-nmap_discovery_scan_tcp_udp_65k.xml +0 -56
- data/etc/userland/qemu/jenkins/jobs/pwntemplate-NETWORKRANGE-nmap_xml_results_searchsploit.xml +0 -59
- data/etc/userland/qemu/jenkins/jobs/pwntemplate-NETWORKRANGE-openvas.xml +0 -45
- data/etc/userland/qemu/jenkins/jobs/selfupdate-exploit-db.xml +0 -43
- data/etc/userland/qemu/jenkins/jobs/selfupdate-gem.xml +0 -42
- data/etc/userland/qemu/jenkins/jobs/selfupdate-jenkins_plugins.xml +0 -42
- data/etc/userland/qemu/jenkins/jobs/selfupdate-metasploit.xml +0 -42
- data/etc/userland/qemu/jenkins/jobs/selfupdate-nmap_all_live_hosts.xml +0 -42
- data/etc/userland/qemu/jenkins/jobs/selfupdate-openvas_sync.xml +0 -42
- data/etc/userland/qemu/jenkins/jobs/selfupdate-openvas_wrappers.xml +0 -42
- data/etc/userland/qemu/jenkins/jobs/selfupdate-os.xml +0 -42
- data/etc/userland/qemu/jenkins/jobs/selfupdate-pwn.xml +0 -42
- data/etc/userland/qemu/jenkins/jobs/selfupdate-rvm.xml +0 -42
- data/etc/userland/qemu/jenkins/jobs/selfupdate-ssllabs-scan.xml +0 -42
- data/etc/userland/qemu/jenkins/jobs/selfupdate-wpscan.xml +0 -42
- data/etc/userland/qemu/jenkins/jobs_userland/.gitkeep +0 -0
- data/etc/userland/qemu/jenkins/log_parser_rules/arachni.rules +0 -5
- data/etc/userland/qemu/jenkins/log_parser_rules/sast.rules +0 -2
- data/etc/userland/qemu/jenkins/log_parser_rules/self_update.rules +0 -14
- data/etc/userland/qemu/jenkins/log_parser_rules/ssllabs-scan.rules +0 -8
- data/etc/userland/qemu/jenkins/log_parser_rules/system_maintenance.rules +0 -9
- data/etc/userland/qemu/jenkins/log_parser_rules/wpscan.rules +0 -2
- data/etc/userland/qemu/jenkins/vagrant.yaml.EXAMPLE +0 -8
- data/etc/userland/qemu/letsencrypt/vagrant.yaml.EXAMPLE +0 -5
- data/etc/userland/qemu/metasploit/vagrant.yaml.EXAMPLE +0 -4
- data/etc/userland/qemu/nessus/vagrant.yaml.EXAMPLE +0 -15
- data/etc/userland/qemu/openvas/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/qemu/owasp_zap/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/qemu/postgres/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/qemu/recon-ng/vagrant.yaml.EXAMPLE +0 -52
- data/etc/userland/ruby-gem/apache2/jenkins_443.conf +0 -90
- data/etc/userland/ruby-gem/apache2/jenkins_80.conf +0 -7
- data/etc/userland/ruby-gem/apache2/openvas_443.conf +0 -87
- data/etc/userland/ruby-gem/apache2/openvas_80.conf +0 -7
- data/etc/userland/ruby-gem/apache2/sast_443.conf +0 -87
- data/etc/userland/ruby-gem/apache2/sast_80.conf +0 -9
- data/etc/userland/ruby-gem/apache2/vagrant.yaml.EXAMPLE +0 -9
- data/etc/userland/ruby-gem/arachni/navigation-REST.instruct.EXAMPLE +0 -29
- data/etc/userland/ruby-gem/arachni/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/ruby-gem/burpsuite/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/ruby-gem/burpsuite/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/ruby-gem/defectdojo/vagrant.yaml.EXAMPLE +0 -3
- data/etc/userland/ruby-gem/jenkins/inject_build_envs.sh +0 -15
- data/etc/userland/ruby-gem/jenkins/jenkins +0 -81
- data/etc/userland/ruby-gem/jenkins/jobs/pipeline-pwntemplate.xml +0 -298
- data/etc/userland/ruby-gem/jenkins/jobs/pipeline-selfupdate.xml +0 -462
- data/etc/userland/ruby-gem/jenkins/jobs/pwntemplate-DOMAIN-burpsuite.xml +0 -44
- data/etc/userland/ruby-gem/jenkins/jobs/pwntemplate-DOMAIN-owasp_zap.xml +0 -35
- data/etc/userland/ruby-gem/jenkins/jobs/pwntemplate-DOMAIN-ssllabs-scan.xml +0 -45
- data/etc/userland/ruby-gem/jenkins/jobs/pwntemplate-GITREPO_BRANCH-sast.xml +0 -71
- data/etc/userland/ruby-gem/jenkins/jobs/pwntemplate-NETWORKRANGE-nmap_discovery_scan_tcp_udp_65k.xml +0 -56
- data/etc/userland/ruby-gem/jenkins/jobs/pwntemplate-NETWORKRANGE-nmap_xml_results_searchsploit.xml +0 -59
- data/etc/userland/ruby-gem/jenkins/jobs/pwntemplate-NETWORKRANGE-openvas.xml +0 -45
- data/etc/userland/ruby-gem/jenkins/jobs/selfupdate-exploit-db.xml +0 -43
- data/etc/userland/ruby-gem/jenkins/jobs/selfupdate-gem.xml +0 -42
- data/etc/userland/ruby-gem/jenkins/jobs/selfupdate-jenkins_plugins.xml +0 -42
- data/etc/userland/ruby-gem/jenkins/jobs/selfupdate-metasploit.xml +0 -42
- data/etc/userland/ruby-gem/jenkins/jobs/selfupdate-nmap_all_live_hosts.xml +0 -42
- data/etc/userland/ruby-gem/jenkins/jobs/selfupdate-openvas_sync.xml +0 -42
- data/etc/userland/ruby-gem/jenkins/jobs/selfupdate-openvas_wrappers.xml +0 -42
- data/etc/userland/ruby-gem/jenkins/jobs/selfupdate-os.xml +0 -42
- data/etc/userland/ruby-gem/jenkins/jobs/selfupdate-pwn.xml +0 -42
- data/etc/userland/ruby-gem/jenkins/jobs/selfupdate-rvm.xml +0 -42
- data/etc/userland/ruby-gem/jenkins/jobs/selfupdate-ssllabs-scan.xml +0 -42
- data/etc/userland/ruby-gem/jenkins/jobs/selfupdate-wpscan.xml +0 -42
- data/etc/userland/ruby-gem/jenkins/jobs_userland/.gitkeep +0 -0
- data/etc/userland/ruby-gem/jenkins/log_parser_rules/arachni.rules +0 -5
- data/etc/userland/ruby-gem/jenkins/log_parser_rules/sast.rules +0 -2
- data/etc/userland/ruby-gem/jenkins/log_parser_rules/self_update.rules +0 -14
- data/etc/userland/ruby-gem/jenkins/log_parser_rules/ssllabs-scan.rules +0 -8
- data/etc/userland/ruby-gem/jenkins/log_parser_rules/system_maintenance.rules +0 -9
- data/etc/userland/ruby-gem/jenkins/log_parser_rules/wpscan.rules +0 -2
- data/etc/userland/ruby-gem/jenkins/vagrant.yaml.EXAMPLE +0 -8
- data/etc/userland/ruby-gem/letsencrypt/vagrant.yaml.EXAMPLE +0 -5
- data/etc/userland/ruby-gem/metasploit/vagrant.yaml.EXAMPLE +0 -4
- data/etc/userland/ruby-gem/nessus/vagrant.yaml.EXAMPLE +0 -15
- data/etc/userland/ruby-gem/openvas/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/ruby-gem/owasp_zap/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/ruby-gem/postgres/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/ruby-gem/recon-ng/vagrant.yaml.EXAMPLE +0 -52
- data/etc/userland/virtualbox/apache2/jenkins_443.conf +0 -90
- data/etc/userland/virtualbox/apache2/jenkins_80.conf +0 -7
- data/etc/userland/virtualbox/apache2/openvas_443.conf +0 -87
- data/etc/userland/virtualbox/apache2/openvas_80.conf +0 -7
- data/etc/userland/virtualbox/apache2/sast_443.conf +0 -87
- data/etc/userland/virtualbox/apache2/sast_80.conf +0 -9
- data/etc/userland/virtualbox/apache2/vagrant.yaml.EXAMPLE +0 -9
- data/etc/userland/virtualbox/arachni/navigation-REST.instruct.EXAMPLE +0 -29
- data/etc/userland/virtualbox/arachni/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/virtualbox/burpsuite/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/virtualbox/burpsuite/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/virtualbox/defectdojo/vagrant.yaml.EXAMPLE +0 -3
- data/etc/userland/virtualbox/jenkins/inject_build_envs.sh +0 -15
- data/etc/userland/virtualbox/jenkins/jenkins +0 -81
- data/etc/userland/virtualbox/jenkins/jobs/pipeline-pwntemplate.xml +0 -298
- data/etc/userland/virtualbox/jenkins/jobs/pipeline-selfupdate.xml +0 -462
- data/etc/userland/virtualbox/jenkins/jobs/pwntemplate-DOMAIN-burpsuite.xml +0 -44
- data/etc/userland/virtualbox/jenkins/jobs/pwntemplate-DOMAIN-owasp_zap.xml +0 -35
- data/etc/userland/virtualbox/jenkins/jobs/pwntemplate-DOMAIN-ssllabs-scan.xml +0 -45
- data/etc/userland/virtualbox/jenkins/jobs/pwntemplate-GITREPO_BRANCH-sast.xml +0 -71
- data/etc/userland/virtualbox/jenkins/jobs/pwntemplate-NETWORKRANGE-nmap_discovery_scan_tcp_udp_65k.xml +0 -56
- data/etc/userland/virtualbox/jenkins/jobs/pwntemplate-NETWORKRANGE-nmap_xml_results_searchsploit.xml +0 -59
- data/etc/userland/virtualbox/jenkins/jobs/pwntemplate-NETWORKRANGE-openvas.xml +0 -45
- data/etc/userland/virtualbox/jenkins/jobs/selfupdate-exploit-db.xml +0 -43
- data/etc/userland/virtualbox/jenkins/jobs/selfupdate-gem.xml +0 -42
- data/etc/userland/virtualbox/jenkins/jobs/selfupdate-jenkins_plugins.xml +0 -42
- data/etc/userland/virtualbox/jenkins/jobs/selfupdate-metasploit.xml +0 -42
- data/etc/userland/virtualbox/jenkins/jobs/selfupdate-nmap_all_live_hosts.xml +0 -42
- data/etc/userland/virtualbox/jenkins/jobs/selfupdate-openvas_sync.xml +0 -42
- data/etc/userland/virtualbox/jenkins/jobs/selfupdate-openvas_wrappers.xml +0 -42
- data/etc/userland/virtualbox/jenkins/jobs/selfupdate-os.xml +0 -42
- data/etc/userland/virtualbox/jenkins/jobs/selfupdate-pwn.xml +0 -42
- data/etc/userland/virtualbox/jenkins/jobs/selfupdate-rvm.xml +0 -42
- data/etc/userland/virtualbox/jenkins/jobs/selfupdate-ssllabs-scan.xml +0 -42
- data/etc/userland/virtualbox/jenkins/jobs/selfupdate-wpscan.xml +0 -42
- data/etc/userland/virtualbox/jenkins/jobs_userland/.gitkeep +0 -0
- data/etc/userland/virtualbox/jenkins/log_parser_rules/arachni.rules +0 -5
- data/etc/userland/virtualbox/jenkins/log_parser_rules/sast.rules +0 -2
- data/etc/userland/virtualbox/jenkins/log_parser_rules/self_update.rules +0 -14
- data/etc/userland/virtualbox/jenkins/log_parser_rules/ssllabs-scan.rules +0 -8
- data/etc/userland/virtualbox/jenkins/log_parser_rules/system_maintenance.rules +0 -9
- data/etc/userland/virtualbox/jenkins/log_parser_rules/wpscan.rules +0 -2
- data/etc/userland/virtualbox/jenkins/vagrant.yaml.EXAMPLE +0 -8
- data/etc/userland/virtualbox/letsencrypt/vagrant.yaml.EXAMPLE +0 -5
- data/etc/userland/virtualbox/metasploit/vagrant.yaml.EXAMPLE +0 -4
- data/etc/userland/virtualbox/nessus/vagrant.yaml.EXAMPLE +0 -15
- data/etc/userland/virtualbox/openvas/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/virtualbox/owasp_zap/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/virtualbox/postgres/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/virtualbox/recon-ng/vagrant.yaml.EXAMPLE +0 -52
- data/etc/userland/virtualbox/vagrant.yaml.EXAMPLE +0 -4
- data/etc/userland/vmware/apache2/jenkins_443.conf +0 -90
- data/etc/userland/vmware/apache2/jenkins_80.conf +0 -7
- data/etc/userland/vmware/apache2/openvas_443.conf +0 -87
- data/etc/userland/vmware/apache2/openvas_80.conf +0 -7
- data/etc/userland/vmware/apache2/sast_443.conf +0 -87
- data/etc/userland/vmware/apache2/sast_80.conf +0 -9
- data/etc/userland/vmware/apache2/vagrant.yaml.EXAMPLE +0 -9
- data/etc/userland/vmware/arachni/navigation-REST.instruct.EXAMPLE +0 -29
- data/etc/userland/vmware/arachni/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/vmware/burpsuite/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/vmware/burpsuite/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/vmware/defectdojo/vagrant.yaml.EXAMPLE +0 -3
- data/etc/userland/vmware/jenkins/inject_build_envs.sh +0 -15
- data/etc/userland/vmware/jenkins/jenkins +0 -81
- data/etc/userland/vmware/jenkins/jobs/pipeline-pwntemplate.xml +0 -298
- data/etc/userland/vmware/jenkins/jobs/pipeline-selfupdate.xml +0 -462
- data/etc/userland/vmware/jenkins/jobs/pwntemplate-DOMAIN-burpsuite.xml +0 -44
- data/etc/userland/vmware/jenkins/jobs/pwntemplate-DOMAIN-owasp_zap.xml +0 -35
- data/etc/userland/vmware/jenkins/jobs/pwntemplate-DOMAIN-ssllabs-scan.xml +0 -45
- data/etc/userland/vmware/jenkins/jobs/pwntemplate-GITREPO_BRANCH-sast.xml +0 -71
- data/etc/userland/vmware/jenkins/jobs/pwntemplate-NETWORKRANGE-nmap_discovery_scan_tcp_udp_65k.xml +0 -56
- data/etc/userland/vmware/jenkins/jobs/pwntemplate-NETWORKRANGE-nmap_xml_results_searchsploit.xml +0 -59
- data/etc/userland/vmware/jenkins/jobs/pwntemplate-NETWORKRANGE-openvas.xml +0 -45
- data/etc/userland/vmware/jenkins/jobs/selfupdate-exploit-db.xml +0 -43
- data/etc/userland/vmware/jenkins/jobs/selfupdate-gem.xml +0 -42
- data/etc/userland/vmware/jenkins/jobs/selfupdate-jenkins_plugins.xml +0 -42
- data/etc/userland/vmware/jenkins/jobs/selfupdate-metasploit.xml +0 -42
- data/etc/userland/vmware/jenkins/jobs/selfupdate-nmap_all_live_hosts.xml +0 -42
- data/etc/userland/vmware/jenkins/jobs/selfupdate-openvas_sync.xml +0 -42
- data/etc/userland/vmware/jenkins/jobs/selfupdate-openvas_wrappers.xml +0 -42
- data/etc/userland/vmware/jenkins/jobs/selfupdate-os.xml +0 -42
- data/etc/userland/vmware/jenkins/jobs/selfupdate-pwn.xml +0 -42
- data/etc/userland/vmware/jenkins/jobs/selfupdate-rvm.xml +0 -42
- data/etc/userland/vmware/jenkins/jobs/selfupdate-ssllabs-scan.xml +0 -42
- data/etc/userland/vmware/jenkins/jobs/selfupdate-wpscan.xml +0 -42
- data/etc/userland/vmware/jenkins/jobs_userland/.gitkeep +0 -0
- data/etc/userland/vmware/jenkins/log_parser_rules/arachni.rules +0 -5
- data/etc/userland/vmware/jenkins/log_parser_rules/sast.rules +0 -2
- data/etc/userland/vmware/jenkins/log_parser_rules/self_update.rules +0 -14
- data/etc/userland/vmware/jenkins/log_parser_rules/ssllabs-scan.rules +0 -8
- data/etc/userland/vmware/jenkins/log_parser_rules/system_maintenance.rules +0 -9
- data/etc/userland/vmware/jenkins/log_parser_rules/wpscan.rules +0 -2
- data/etc/userland/vmware/jenkins/vagrant.yaml.EXAMPLE +0 -8
- data/etc/userland/vmware/letsencrypt/vagrant.yaml.EXAMPLE +0 -5
- data/etc/userland/vmware/metasploit/vagrant.yaml.EXAMPLE +0 -4
- data/etc/userland/vmware/nessus/vagrant.yaml.EXAMPLE +0 -15
- data/etc/userland/vmware/openvas/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/vmware/owasp_zap/navigation.instruct.EXAMPLE +0 -3
- data/etc/userland/vmware/postgres/vagrant.yaml.EXAMPLE +0 -2
- data/etc/userland/vmware/recon-ng/vagrant.yaml.EXAMPLE +0 -52
- data/etc/userland/vmware/vagrant.yaml.EXAMPLE +0 -5
- data/find_latest_gem_versions_per_Gemfile.sh +0 -19
- data/git_commit_test_reinit_gem.sh +0 -57
- data/install.sh +0 -177
- data/lib/pwn/ai/grok.rb +0 -258
- data/lib/pwn/ai/introspection.rb +0 -100
- data/lib/pwn/ai/ollama.rb +0 -260
- data/lib/pwn/ai/open_ai.rb +0 -807
- data/lib/pwn/ai.rb +0 -19
- data/lib/pwn/aws/acm.rb +0 -92
- data/lib/pwn/aws/api_gateway.rb +0 -92
- data/lib/pwn/aws/app_stream.rb +0 -92
- data/lib/pwn/aws/application_auto_scaling.rb +0 -92
- data/lib/pwn/aws/application_discovery_service.rb +0 -92
- data/lib/pwn/aws/auto_scaling.rb +0 -92
- data/lib/pwn/aws/batch.rb +0 -92
- data/lib/pwn/aws/budgets.rb +0 -92
- data/lib/pwn/aws/cloud_formation.rb +0 -92
- data/lib/pwn/aws/cloud_front.rb +0 -92
- data/lib/pwn/aws/cloud_hsm.rb +0 -92
- data/lib/pwn/aws/cloud_search.rb +0 -92
- data/lib/pwn/aws/cloud_search_domain.rb +0 -92
- data/lib/pwn/aws/cloud_trail.rb +0 -92
- data/lib/pwn/aws/cloud_watch.rb +0 -92
- data/lib/pwn/aws/cloud_watch_events.rb +0 -92
- data/lib/pwn/aws/cloud_watch_logs.rb +0 -92
- data/lib/pwn/aws/code_build.rb +0 -92
- data/lib/pwn/aws/code_commit.rb +0 -92
- data/lib/pwn/aws/code_deploy.rb +0 -92
- data/lib/pwn/aws/code_pipeline.rb +0 -92
- data/lib/pwn/aws/cognito_identity.rb +0 -92
- data/lib/pwn/aws/cognito_identity_provider.rb +0 -92
- data/lib/pwn/aws/cognito_sync.rb +0 -92
- data/lib/pwn/aws/config_service.rb +0 -92
- data/lib/pwn/aws/data_pipleline.rb +0 -92
- data/lib/pwn/aws/database_migration_service.rb +0 -92
- data/lib/pwn/aws/device_farm.rb +0 -92
- data/lib/pwn/aws/direct_connect.rb +0 -92
- data/lib/pwn/aws/directory_service.rb +0 -92
- data/lib/pwn/aws/dynamo_db.rb +0 -92
- data/lib/pwn/aws/dynamo_db_streams.rb +0 -92
- data/lib/pwn/aws/ec2.rb +0 -92
- data/lib/pwn/aws/ecr.rb +0 -92
- data/lib/pwn/aws/ecs.rb +0 -92
- data/lib/pwn/aws/efs.rb +0 -92
- data/lib/pwn/aws/elasti_cache.rb +0 -92
- data/lib/pwn/aws/elastic_beanstalk.rb +0 -89
- data/lib/pwn/aws/elastic_load_balancing.rb +0 -92
- data/lib/pwn/aws/elastic_load_balancing_v2.rb +0 -92
- data/lib/pwn/aws/elastic_transcoder.rb +0 -92
- data/lib/pwn/aws/elasticsearch_service.rb +0 -92
- data/lib/pwn/aws/emr.rb +0 -92
- data/lib/pwn/aws/firehose.rb +0 -92
- data/lib/pwn/aws/game_lift.rb +0 -92
- data/lib/pwn/aws/glacier.rb +0 -92
- data/lib/pwn/aws/health.rb +0 -92
- data/lib/pwn/aws/iam.rb +0 -200
- data/lib/pwn/aws/import_export.rb +0 -92
- data/lib/pwn/aws/inspector.rb +0 -92
- data/lib/pwn/aws/iot.rb +0 -92
- data/lib/pwn/aws/iot_data_plane.rb +0 -92
- data/lib/pwn/aws/kinesis.rb +0 -92
- data/lib/pwn/aws/kinesis_analytics.rb +0 -92
- data/lib/pwn/aws/kms.rb +0 -92
- data/lib/pwn/aws/lambda.rb +0 -92
- data/lib/pwn/aws/lambda_preview.rb +0 -92
- data/lib/pwn/aws/lex.rb +0 -92
- data/lib/pwn/aws/lightsail.rb +0 -92
- data/lib/pwn/aws/machine_learning.rb +0 -92
- data/lib/pwn/aws/marketplace_commerce_analytics.rb +0 -92
- data/lib/pwn/aws/marketplace_metering.rb +0 -92
- data/lib/pwn/aws/ops_works.rb +0 -92
- data/lib/pwn/aws/ops_works_cm.rb +0 -92
- data/lib/pwn/aws/pinpoint.rb +0 -92
- data/lib/pwn/aws/polly.rb +0 -92
- data/lib/pwn/aws/rds.rb +0 -92
- data/lib/pwn/aws/redshift.rb +0 -92
- data/lib/pwn/aws/rekognition.rb +0 -92
- data/lib/pwn/aws/route53.rb +0 -92
- data/lib/pwn/aws/route53_domains.rb +0 -92
- data/lib/pwn/aws/s3.rb +0 -92
- data/lib/pwn/aws/service_catalog.rb +0 -92
- data/lib/pwn/aws/ses.rb +0 -92
- data/lib/pwn/aws/shield.rb +0 -92
- data/lib/pwn/aws/simple_db.rb +0 -92
- data/lib/pwn/aws/sms.rb +0 -92
- data/lib/pwn/aws/snowball.rb +0 -92
- data/lib/pwn/aws/sns.rb +0 -92
- data/lib/pwn/aws/sqs.rb +0 -92
- data/lib/pwn/aws/ssm.rb +0 -92
- data/lib/pwn/aws/states.rb +0 -92
- data/lib/pwn/aws/storage_gateway.rb +0 -92
- data/lib/pwn/aws/sts.rb +0 -63
- data/lib/pwn/aws/support.rb +0 -92
- data/lib/pwn/aws/swf.rb +0 -92
- data/lib/pwn/aws/waf.rb +0 -92
- data/lib/pwn/aws/waf_regional.rb +0 -92
- data/lib/pwn/aws/workspaces.rb +0 -92
- data/lib/pwn/aws/x_ray.rb +0 -92
- data/lib/pwn/aws.rb +0 -105
- data/lib/pwn/banner/anon.rb +0 -50
- data/lib/pwn/banner/bubble.rb +0 -42
- data/lib/pwn/banner/cheshire.rb +0 -58
- data/lib/pwn/banner/code_cave.rb +0 -1035
- data/lib/pwn/banner/dont_panic.rb +0 -52
- data/lib/pwn/banner/f_society.rb +0 -60
- data/lib/pwn/banner/fork_bomb.rb +0 -39
- data/lib/pwn/banner/jmp_esp.rb +0 -44
- data/lib/pwn/banner/matrix.rb +0 -206
- data/lib/pwn/banner/ninja.rb +0 -55
- data/lib/pwn/banner/off_the_air.rb +0 -73
- data/lib/pwn/banner/pirate.rb +0 -62
- data/lib/pwn/banner/radare2.rb +0 -41
- data/lib/pwn/banner/radare2_ai.rb +0 -116
- data/lib/pwn/banner/white_rabbit.rb +0 -55
- data/lib/pwn/banner.rb +0 -108
- data/lib/pwn/blockchain/btc.rb +0 -282
- data/lib/pwn/blockchain/eth.rb +0 -160
- data/lib/pwn/blockchain.rb +0 -17
- data/lib/pwn/config.rb +0 -304
- data/lib/pwn/driver.rb +0 -85
- data/lib/pwn/ffi/stdio.rb +0 -41
- data/lib/pwn/ffi.rb +0 -16
- data/lib/pwn/plugins/android.rb +0 -1617
- data/lib/pwn/plugins/assembly.rb +0 -275
- data/lib/pwn/plugins/authentication_helper.rb +0 -86
- data/lib/pwn/plugins/baresip.rb +0 -708
- data/lib/pwn/plugins/basic_auth.rb +0 -63
- data/lib/pwn/plugins/beef.rb +0 -312
- data/lib/pwn/plugins/black_duck_binary_analysis.rb +0 -790
- data/lib/pwn/plugins/burp_suite.rb +0 -2208
- data/lib/pwn/plugins/bus_pirate.rb +0 -147
- data/lib/pwn/plugins/char.rb +0 -474
- data/lib/pwn/plugins/credit_card.rb +0 -105
- data/lib/pwn/plugins/dao_ldap.rb +0 -131
- data/lib/pwn/plugins/dao_mongo.rb +0 -96
- data/lib/pwn/plugins/dao_postgres.rb +0 -224
- data/lib/pwn/plugins/dao_sqlite3.rb +0 -125
- data/lib/pwn/plugins/defect_dojo.rb +0 -841
- data/lib/pwn/plugins/detect_os.rb +0 -71
- data/lib/pwn/plugins/ein.rb +0 -141
- data/lib/pwn/plugins/file_fu.rb +0 -93
- data/lib/pwn/plugins/fuzz.rb +0 -204
- data/lib/pwn/plugins/git.rb +0 -159
- data/lib/pwn/plugins/github.rb +0 -137
- data/lib/pwn/plugins/hacker_one.rb +0 -154
- data/lib/pwn/plugins/hunter.rb +0 -160
- data/lib/pwn/plugins/ip_info.rb +0 -264
- data/lib/pwn/plugins/irc.rb +0 -312
- data/lib/pwn/plugins/jenkins.rb +0 -537
- data/lib/pwn/plugins/jira_data_center.rb +0 -676
- data/lib/pwn/plugins/json_pathify.rb +0 -46
- data/lib/pwn/plugins/log.rb +0 -123
- data/lib/pwn/plugins/mail_agent.rb +0 -344
- data/lib/pwn/plugins/metasploit.rb +0 -151
- data/lib/pwn/plugins/monkey_patch.rb +0 -182
- data/lib/pwn/plugins/msr206.rb +0 -1257
- data/lib/pwn/plugins/nessus_cloud.rb +0 -847
- data/lib/pwn/plugins/nexpose_vuln_scan.rb +0 -356
- data/lib/pwn/plugins/nmap_it.rb +0 -136
- data/lib/pwn/plugins/oauth2.rb +0 -67
- data/lib/pwn/plugins/ocr.rb +0 -43
- data/lib/pwn/plugins/open_api.rb +0 -896
- data/lib/pwn/plugins/openvas.rb +0 -314
- data/lib/pwn/plugins/packet.rb +0 -1313
- data/lib/pwn/plugins/pdf_parse.rb +0 -53
- data/lib/pwn/plugins/pony.rb +0 -281
- data/lib/pwn/plugins/ps.rb +0 -90
- data/lib/pwn/plugins/pwn_logger.rb +0 -64
- data/lib/pwn/plugins/rabbit_mq.rb +0 -70
- data/lib/pwn/plugins/repl.rb +0 -999
- data/lib/pwn/plugins/scannable_codes.rb +0 -87
- data/lib/pwn/plugins/serial.rb +0 -273
- data/lib/pwn/plugins/shodan.rb +0 -629
- data/lib/pwn/plugins/slack_client.rb +0 -104
- data/lib/pwn/plugins/sock.rb +0 -289
- data/lib/pwn/plugins/spider.rb +0 -78
- data/lib/pwn/plugins/ssn.rb +0 -52
- data/lib/pwn/plugins/thread_pool.rb +0 -80
- data/lib/pwn/plugins/tor.rb +0 -273
- data/lib/pwn/plugins/transparent_browser.rb +0 -1738
- data/lib/pwn/plugins/twitter_api.rb +0 -151
- data/lib/pwn/plugins/uri_scheme.rb +0 -328
- data/lib/pwn/plugins/vault.rb +0 -305
- data/lib/pwn/plugins/vin.rb +0 -361
- data/lib/pwn/plugins/voice.rb +0 -145
- data/lib/pwn/plugins/vsphere.rb +0 -81
- data/lib/pwn/plugins/xxd.rb +0 -298
- data/lib/pwn/plugins/zaproxy.rb +0 -837
- data/lib/pwn/plugins.rb +0 -81
- data/lib/pwn/reports/fuzz.rb +0 -328
- data/lib/pwn/reports/html_footer.rb +0 -160
- data/lib/pwn/reports/html_header.rb +0 -271
- data/lib/pwn/reports/phone.rb +0 -384
- data/lib/pwn/reports/sast.rb +0 -435
- data/lib/pwn/reports/uri_buster.rb +0 -335
- data/lib/pwn/reports.rb +0 -25
- data/lib/pwn/sast/amqp_connect_as_guest.rb +0 -78
- data/lib/pwn/sast/apache_file_system_util_api.rb +0 -76
- data/lib/pwn/sast/aws.rb +0 -77
- data/lib/pwn/sast/banned_function_calls_c.rb +0 -207
- data/lib/pwn/sast/base64.rb +0 -74
- data/lib/pwn/sast/beef_hook.rb +0 -75
- data/lib/pwn/sast/cmd_execution_go_lang.rb +0 -83
- data/lib/pwn/sast/cmd_execution_java.rb +0 -80
- data/lib/pwn/sast/cmd_execution_python.rb +0 -82
- data/lib/pwn/sast/cmd_execution_ruby.rb +0 -90
- data/lib/pwn/sast/cmd_execution_scala.rb +0 -80
- data/lib/pwn/sast/csrf.rb +0 -74
- data/lib/pwn/sast/deserial_java.rb +0 -85
- data/lib/pwn/sast/emoticon.rb +0 -82
- data/lib/pwn/sast/eval.rb +0 -76
- data/lib/pwn/sast/factory.rb +0 -79
- data/lib/pwn/sast/http_authorization_header.rb +0 -80
- data/lib/pwn/sast/inner_html.rb +0 -76
- data/lib/pwn/sast/keystore.rb +0 -75
- data/lib/pwn/sast/local_storage.rb +0 -77
- data/lib/pwn/sast/location_hash.rb +0 -76
- data/lib/pwn/sast/log4j.rb +0 -78
- data/lib/pwn/sast/logger.rb +0 -90
- data/lib/pwn/sast/md5.rb +0 -75
- data/lib/pwn/sast/outer_html.rb +0 -76
- data/lib/pwn/sast/padding_oracle.rb +0 -72
- data/lib/pwn/sast/password.rb +0 -75
- data/lib/pwn/sast/php_input_mechanisms.rb +0 -84
- data/lib/pwn/sast/php_type_juggling.rb +0 -82
- data/lib/pwn/sast/pom_version.rb +0 -164
- data/lib/pwn/sast/port.rb +0 -82
- data/lib/pwn/sast/post_message.rb +0 -76
- data/lib/pwn/sast/private_key.rb +0 -75
- data/lib/pwn/sast/redirect.rb +0 -77
- data/lib/pwn/sast/redos.rb +0 -82
- data/lib/pwn/sast/shell.rb +0 -83
- data/lib/pwn/sast/signature.rb +0 -75
- data/lib/pwn/sast/sql.rb +0 -85
- data/lib/pwn/sast/ssl.rb +0 -79
- data/lib/pwn/sast/sudo.rb +0 -75
- data/lib/pwn/sast/task_tag.rb +0 -89
- data/lib/pwn/sast/test_case_engine.rb +0 -189
- data/lib/pwn/sast/throw_errors.rb +0 -78
- data/lib/pwn/sast/token.rb +0 -77
- data/lib/pwn/sast/type_script_type_juggling.rb +0 -82
- data/lib/pwn/sast/use_after_free.rb +0 -82
- data/lib/pwn/sast/version.rb +0 -76
- data/lib/pwn/sast/window_location_hash.rb +0 -75
- data/lib/pwn/sast.rb +0 -67
- data/lib/pwn/sdr/decoder/gsm.rb +0 -200
- data/lib/pwn/sdr/decoder.rb +0 -19
- data/lib/pwn/sdr/flipper_zero.rb +0 -128
- data/lib/pwn/sdr/frequency_allocation.rb +0 -416
- data/lib/pwn/sdr/gqrx.rb +0 -655
- data/lib/pwn/sdr/rfidler.rb +0 -56
- data/lib/pwn/sdr/son_micro_rfid.rb +0 -773
- data/lib/pwn/sdr.rb +0 -21
- data/lib/pwn/version.rb +0 -5
- data/lib/pwn/www/app_cobalt_io.rb +0 -139
- data/lib/pwn/www/bing.rb +0 -88
- data/lib/pwn/www/bug_crowd.rb +0 -136
- data/lib/pwn/www/checkip.rb +0 -69
- data/lib/pwn/www/coinbase_pro.rb +0 -136
- data/lib/pwn/www/duckduckgo.rb +0 -114
- data/lib/pwn/www/facebook.rb +0 -124
- data/lib/pwn/www/google.rb +0 -114
- data/lib/pwn/www/hacker_one.rb +0 -649
- data/lib/pwn/www/linkedin.rb +0 -124
- data/lib/pwn/www/pandora.rb +0 -124
- data/lib/pwn/www/pastebin.rb +0 -84
- data/lib/pwn/www/paypal.rb +0 -208
- data/lib/pwn/www/synack.rb +0 -136
- data/lib/pwn/www/torch.rb +0 -107
- data/lib/pwn/www/trading_view.rb +0 -127
- data/lib/pwn/www/twitter.rb +0 -138
- data/lib/pwn/www/uber.rb +0 -124
- data/lib/pwn/www/upwork.rb +0 -124
- data/lib/pwn/www/wayback_machine.rb +0 -113
- data/lib/pwn/www/youtube.rb +0 -88
- data/lib/pwn/www.rb +0 -36
- data/lib/pwn.rb +0 -39
- data/packer/daemons/msfrpcd.rb +0 -64
- data/packer/daemons/openvas.rb +0 -51
- data/packer/deploy_docker_containers.sh +0 -9
- data/packer/deploy_packer_box.sh +0 -87
- data/packer/docker/kali_rolling_docker_pwn_fuzz_net_app_proto.json +0 -44
- data/packer/docker/kali_rolling_docker_pwn_prototyper.json +0 -48
- data/packer/docker/kali_rolling_docker_pwn_sast.json +0 -44
- data/packer/docker/kali_rolling_docker_pwn_transparent_browser.json +0 -46
- data/packer/docker/kali_rolling_docker_pwn_www_checkip.json +0 -34
- data/packer/http/kali_rolling_preseed.cfg +0 -81
- data/packer/kali_rolling_aws_ami.json +0 -139
- data/packer/kali_rolling_qemu_kvm.json +0 -159
- data/packer/kali_rolling_virtualbox.json +0 -186
- data/packer/kali_rolling_vmware.json +0 -167
- data/packer/packer_secrets.json.EXAMPLE +0 -9
- data/packer/provisioners/PayloadsAllTheThings.sh +0 -5
- data/packer/provisioners/SecLists.sh +0 -5
- data/packer/provisioners/afl.sh +0 -28
- data/packer/provisioners/aliases.rb +0 -23
- data/packer/provisioners/amass.sh +0 -5
- data/packer/provisioners/android.sh +0 -18
- data/packer/provisioners/ansible.sh +0 -5
- data/packer/provisioners/apache2.sh +0 -24
- data/packer/provisioners/arachni.sh +0 -28
- data/packer/provisioners/awscli.sh +0 -5
- data/packer/provisioners/bashrc.sh +0 -13
- data/packer/provisioners/beef.rb +0 -23
- data/packer/provisioners/burpsuite.sh +0 -24
- data/packer/provisioners/chrome.sh +0 -11
- data/packer/provisioners/coreutils.sh +0 -6
- data/packer/provisioners/curl.sh +0 -6
- data/packer/provisioners/docker.sh +0 -43
- data/packer/provisioners/docker_bashrc.sh +0 -2
- data/packer/provisioners/docker_rvm.sh +0 -22
- data/packer/provisioners/eyewitness.sh +0 -5
- data/packer/provisioners/ffmpeg.sh +0 -6
- data/packer/provisioners/firefox.sh +0 -7
- data/packer/provisioners/fuzzdb.sh +0 -5
- data/packer/provisioners/gdb.sh +0 -5
- data/packer/provisioners/geckodriver.sh +0 -9
- data/packer/provisioners/ghidra.sh +0 -5
- data/packer/provisioners/git.sh +0 -6
- data/packer/provisioners/init_image.sh +0 -103
- data/packer/provisioners/install_vagrant_ssh_key.sh +0 -15
- data/packer/provisioners/irc.sh +0 -13
- data/packer/provisioners/jenkins.sh +0 -77
- data/packer/provisioners/metasploit.rb +0 -59
- data/packer/provisioners/nmap.sh +0 -5
- data/packer/provisioners/openvas.sh +0 -23
- data/packer/provisioners/openvas_wrappers.sh +0 -4
- data/packer/provisioners/openvpn.sh +0 -7
- data/packer/provisioners/peda.sh +0 -4
- data/packer/provisioners/phantomjs.rb +0 -28
- data/packer/provisioners/phantomjs_wrapper.sh +0 -22
- data/packer/provisioners/post_install.sh +0 -41
- data/packer/provisioners/postgresql.sh +0 -49
- data/packer/provisioners/preeny.sh +0 -8
- data/packer/provisioners/pwn.sh +0 -100
- data/packer/provisioners/pwntools.sh +0 -13
- data/packer/provisioners/radamsa.sh +0 -7
- data/packer/provisioners/radare2.sh +0 -29
- data/packer/provisioners/rc.local.sh +0 -16
- data/packer/provisioners/reboot_os.sh +0 -7
- data/packer/provisioners/ruby.sh +0 -35
- data/packer/provisioners/rvm.sh +0 -31
- data/packer/provisioners/scapy.sh +0 -5
- data/packer/provisioners/scout2.sh +0 -5
- data/packer/provisioners/sox.sh +0 -5
- data/packer/provisioners/ssllabs-scan.sh +0 -9
- data/packer/provisioners/strace.sh +0 -5
- data/packer/provisioners/sublist3r.sh +0 -5
- data/packer/provisioners/terminator.sh +0 -5
- data/packer/provisioners/toggle_tor.sh +0 -2
- data/packer/provisioners/tor.sh +0 -5
- data/packer/provisioners/twinkle.sh +0 -6
- data/packer/provisioners/update_os.sh +0 -108
- data/packer/provisioners/upload_globals.sh +0 -63
- data/packer/provisioners/vim.sh +0 -23
- data/packer/provisioners/virtualbox_guest_additions.sh +0 -20
- data/packer/provisioners/vmware_tools.sh +0 -8
- data/packer/provisioners/wpscan.rb +0 -23
- data/packer/provisioners/xrdp.sh +0 -23
- data/packer/provisioners/zzuf.sh +0 -5
- data/pwn.gemspec +0 -77
- data/reinstall_pwn_gemset.sh +0 -30
- data/spec/lib/pwn/ai/grok_spec.rb +0 -15
- data/spec/lib/pwn/ai/introspection_spec.rb +0 -15
- data/spec/lib/pwn/ai/ollama_spec.rb +0 -15
- data/spec/lib/pwn/ai/open_ai_spec.rb +0 -15
- data/spec/lib/pwn/ai_spec.rb +0 -10
- data/spec/lib/pwn/aws/acm_spec.rb +0 -15
- data/spec/lib/pwn/aws/api_gateway_spec.rb +0 -15
- data/spec/lib/pwn/aws/app_stream_spec.rb +0 -15
- data/spec/lib/pwn/aws/application_auto_scaling_spec.rb +0 -15
- data/spec/lib/pwn/aws/application_discovery_service_spec.rb +0 -15
- data/spec/lib/pwn/aws/auto_scaling_spec.rb +0 -15
- data/spec/lib/pwn/aws/batch_spec.rb +0 -15
- data/spec/lib/pwn/aws/budgets_spec.rb +0 -15
- data/spec/lib/pwn/aws/cloud_formation_spec.rb +0 -15
- data/spec/lib/pwn/aws/cloud_front_spec.rb +0 -15
- data/spec/lib/pwn/aws/cloud_hsm_spec.rb +0 -15
- data/spec/lib/pwn/aws/cloud_search_domain_spec.rb +0 -15
- data/spec/lib/pwn/aws/cloud_search_spec.rb +0 -15
- data/spec/lib/pwn/aws/cloud_trail_spec.rb +0 -15
- data/spec/lib/pwn/aws/cloud_watch_events_spec.rb +0 -15
- data/spec/lib/pwn/aws/cloud_watch_logs_spec.rb +0 -15
- data/spec/lib/pwn/aws/cloud_watch_spec.rb +0 -15
- data/spec/lib/pwn/aws/code_build_spec.rb +0 -15
- data/spec/lib/pwn/aws/code_commit_spec.rb +0 -15
- data/spec/lib/pwn/aws/code_deploy_spec.rb +0 -15
- data/spec/lib/pwn/aws/code_pipeline_spec.rb +0 -15
- data/spec/lib/pwn/aws/cognito_identity_provider_spec.rb +0 -15
- data/spec/lib/pwn/aws/cognito_identity_spec.rb +0 -15
- data/spec/lib/pwn/aws/cognito_sync_spec.rb +0 -15
- data/spec/lib/pwn/aws/config_service_spec.rb +0 -15
- data/spec/lib/pwn/aws/data_pipleline_spec.rb +0 -15
- data/spec/lib/pwn/aws/database_migration_service_spec.rb +0 -15
- data/spec/lib/pwn/aws/device_farm_spec.rb +0 -15
- data/spec/lib/pwn/aws/direct_connect_spec.rb +0 -15
- data/spec/lib/pwn/aws/directory_service_spec.rb +0 -15
- data/spec/lib/pwn/aws/dynamo_db_spec.rb +0 -15
- data/spec/lib/pwn/aws/dynamo_db_streams_spec.rb +0 -15
- data/spec/lib/pwn/aws/ec2_spec.rb +0 -15
- data/spec/lib/pwn/aws/ecr_spec.rb +0 -15
- data/spec/lib/pwn/aws/ecs_spec.rb +0 -15
- data/spec/lib/pwn/aws/efs_spec.rb +0 -15
- data/spec/lib/pwn/aws/elasti_cache_spec.rb +0 -15
- data/spec/lib/pwn/aws/elastic_beanstalk_spec.rb +0 -15
- data/spec/lib/pwn/aws/elastic_load_balancing_spec.rb +0 -15
- data/spec/lib/pwn/aws/elastic_load_balancing_v2_spec.rb +0 -15
- data/spec/lib/pwn/aws/elastic_transcoder_spec.rb +0 -15
- data/spec/lib/pwn/aws/elasticsearch_service_spec.rb +0 -15
- data/spec/lib/pwn/aws/emr_spec.rb +0 -15
- data/spec/lib/pwn/aws/firehose_spec.rb +0 -15
- data/spec/lib/pwn/aws/game_lift_spec.rb +0 -15
- data/spec/lib/pwn/aws/glacier_spec.rb +0 -15
- data/spec/lib/pwn/aws/health_spec.rb +0 -15
- data/spec/lib/pwn/aws/iam_spec.rb +0 -15
- data/spec/lib/pwn/aws/import_export_spec.rb +0 -15
- data/spec/lib/pwn/aws/inspector_spec.rb +0 -15
- data/spec/lib/pwn/aws/iot_data_plane_spec.rb +0 -15
- data/spec/lib/pwn/aws/iot_spec.rb +0 -15
- data/spec/lib/pwn/aws/kinesis_analytics_spec.rb +0 -15
- data/spec/lib/pwn/aws/kinesis_spec.rb +0 -15
- data/spec/lib/pwn/aws/kms_spec.rb +0 -15
- data/spec/lib/pwn/aws/lambda_preview_spec.rb +0 -15
- data/spec/lib/pwn/aws/lambda_spec.rb +0 -15
- data/spec/lib/pwn/aws/lex_spec.rb +0 -15
- data/spec/lib/pwn/aws/lightsail_spec.rb +0 -15
- data/spec/lib/pwn/aws/machine_learning_spec.rb +0 -15
- data/spec/lib/pwn/aws/marketplace_commerce_analytics_spec.rb +0 -15
- data/spec/lib/pwn/aws/marketplace_metering_spec.rb +0 -15
- data/spec/lib/pwn/aws/ops_works_cm_spec.rb +0 -15
- data/spec/lib/pwn/aws/ops_works_spec.rb +0 -15
- data/spec/lib/pwn/aws/pinpoint_spec.rb +0 -15
- data/spec/lib/pwn/aws/polly_spec.rb +0 -15
- data/spec/lib/pwn/aws/rds_spec.rb +0 -15
- data/spec/lib/pwn/aws/redshift_spec.rb +0 -15
- data/spec/lib/pwn/aws/rekognition_spec.rb +0 -15
- data/spec/lib/pwn/aws/route53_domains_spec.rb +0 -15
- data/spec/lib/pwn/aws/route53_spec.rb +0 -15
- data/spec/lib/pwn/aws/s3_spec.rb +0 -15
- data/spec/lib/pwn/aws/service_catalog_spec.rb +0 -15
- data/spec/lib/pwn/aws/ses_spec.rb +0 -15
- data/spec/lib/pwn/aws/shield_spec.rb +0 -15
- data/spec/lib/pwn/aws/simple_db_spec.rb +0 -15
- data/spec/lib/pwn/aws/sms_spec.rb +0 -15
- data/spec/lib/pwn/aws/snowball_spec.rb +0 -15
- data/spec/lib/pwn/aws/sns_spec.rb +0 -15
- data/spec/lib/pwn/aws/sqs_spec.rb +0 -15
- data/spec/lib/pwn/aws/ssm_spec.rb +0 -15
- data/spec/lib/pwn/aws/states_spec.rb +0 -15
- data/spec/lib/pwn/aws/storage_gateway_spec.rb +0 -15
- data/spec/lib/pwn/aws/sts_spec.rb +0 -15
- data/spec/lib/pwn/aws/support_spec.rb +0 -15
- data/spec/lib/pwn/aws/swf_spec.rb +0 -15
- data/spec/lib/pwn/aws/waf_regional_spec.rb +0 -15
- data/spec/lib/pwn/aws/waf_spec.rb +0 -15
- data/spec/lib/pwn/aws/workspaces_spec.rb +0 -15
- data/spec/lib/pwn/aws/x_ray_spec.rb +0 -15
- data/spec/lib/pwn/aws_spec.rb +0 -10
- data/spec/lib/pwn/banner/anon_spec.rb +0 -20
- data/spec/lib/pwn/banner/bubble_spec.rb +0 -20
- data/spec/lib/pwn/banner/cheshire_spec.rb +0 -20
- data/spec/lib/pwn/banner/code_cave_spec.rb +0 -20
- data/spec/lib/pwn/banner/dont_panic_spec.rb +0 -20
- data/spec/lib/pwn/banner/f_society_spec.rb +0 -20
- data/spec/lib/pwn/banner/fork_bomb_spec.rb +0 -20
- data/spec/lib/pwn/banner/jmp_esp_spec.rb +0 -20
- data/spec/lib/pwn/banner/matrix_spec.rb +0 -20
- data/spec/lib/pwn/banner/ninja_spec.rb +0 -20
- data/spec/lib/pwn/banner/off_the_air_spec.rb +0 -20
- data/spec/lib/pwn/banner/pirate_spec.rb +0 -20
- data/spec/lib/pwn/banner/radare2_ai_spec.rb +0 -20
- data/spec/lib/pwn/banner/radare2_spec.rb +0 -20
- data/spec/lib/pwn/banner/white_rabbit_spec.rb +0 -20
- data/spec/lib/pwn/banner_spec.rb +0 -15
- data/spec/lib/pwn/blockchain/btc_spec.rb +0 -15
- data/spec/lib/pwn/blockchain/eth_spec.rb +0 -15
- data/spec/lib/pwn/blockchain_spec.rb +0 -10
- data/spec/lib/pwn/config_spec.rb +0 -15
- data/spec/lib/pwn/driver_spec.rb +0 -15
- data/spec/lib/pwn/ffi/stdio_spec.rb +0 -15
- data/spec/lib/pwn/ffi_spec.rb +0 -10
- data/spec/lib/pwn/plugins/android_spec.rb +0 -15
- data/spec/lib/pwn/plugins/assembly_spec.rb +0 -15
- data/spec/lib/pwn/plugins/authentication_helper_spec.rb +0 -15
- data/spec/lib/pwn/plugins/baresip_spec.rb +0 -15
- data/spec/lib/pwn/plugins/basic_auth_spec.rb +0 -15
- data/spec/lib/pwn/plugins/beef_spec.rb +0 -15
- data/spec/lib/pwn/plugins/black_duck_binary_analysis_spec.rb +0 -15
- data/spec/lib/pwn/plugins/burp_suite_spec.rb +0 -15
- data/spec/lib/pwn/plugins/bus_pirate_spec.rb +0 -15
- data/spec/lib/pwn/plugins/char_spec.rb +0 -15
- data/spec/lib/pwn/plugins/credit_card_spec.rb +0 -15
- data/spec/lib/pwn/plugins/dao_ldap_spec.rb +0 -15
- data/spec/lib/pwn/plugins/dao_mongo_spec.rb +0 -15
- data/spec/lib/pwn/plugins/dao_postgres_spec.rb +0 -15
- data/spec/lib/pwn/plugins/dao_sqlite3_spec.rb +0 -15
- data/spec/lib/pwn/plugins/defect_dojo_spec.rb +0 -15
- data/spec/lib/pwn/plugins/detect_os_spec.rb +0 -15
- data/spec/lib/pwn/plugins/ein_spec.rb +0 -15
- data/spec/lib/pwn/plugins/file_fu_spec.rb +0 -15
- data/spec/lib/pwn/plugins/fuzz_spec.rb +0 -15
- data/spec/lib/pwn/plugins/git_spec.rb +0 -15
- data/spec/lib/pwn/plugins/github_spec.rb +0 -15
- data/spec/lib/pwn/plugins/hacker_one_spec.rb +0 -15
- data/spec/lib/pwn/plugins/hunter_spec.rb +0 -15
- data/spec/lib/pwn/plugins/ip_info_spec.rb +0 -15
- data/spec/lib/pwn/plugins/irc_spec.rb +0 -15
- data/spec/lib/pwn/plugins/jenkins_spec.rb +0 -15
- data/spec/lib/pwn/plugins/jira_data_center_spec.rb +0 -15
- data/spec/lib/pwn/plugins/json_pathify_spec.rb +0 -15
- data/spec/lib/pwn/plugins/log_spec.rb +0 -15
- data/spec/lib/pwn/plugins/mail_agent_spec.rb +0 -15
- data/spec/lib/pwn/plugins/metasploit_spec.rb +0 -15
- data/spec/lib/pwn/plugins/monkey_patch_spec.rb +0 -15
- data/spec/lib/pwn/plugins/msr206_spec.rb +0 -15
- data/spec/lib/pwn/plugins/nessus_cloud_spec.rb +0 -15
- data/spec/lib/pwn/plugins/nexpose_vuln_scan_spec.rb +0 -15
- data/spec/lib/pwn/plugins/nmap_it_spec.rb +0 -15
- data/spec/lib/pwn/plugins/oauth2_spec.rb +0 -15
- data/spec/lib/pwn/plugins/ocr_spec.rb +0 -15
- data/spec/lib/pwn/plugins/open_api_spec.rb +0 -15
- data/spec/lib/pwn/plugins/openvas_spec.rb +0 -15
- data/spec/lib/pwn/plugins/packet_spec.rb +0 -15
- data/spec/lib/pwn/plugins/pdf_parse_spec.rb +0 -15
- data/spec/lib/pwn/plugins/pony_spec.rb +0 -15
- data/spec/lib/pwn/plugins/ps_spec.rb +0 -15
- data/spec/lib/pwn/plugins/pwn_logger_spec.rb +0 -15
- data/spec/lib/pwn/plugins/rabbit_mq_spec.rb +0 -15
- data/spec/lib/pwn/plugins/repl_spec.rb +0 -15
- data/spec/lib/pwn/plugins/scannable_codes_spec.rb +0 -15
- data/spec/lib/pwn/plugins/serial_spec.rb +0 -15
- data/spec/lib/pwn/plugins/shodan_spec.rb +0 -15
- data/spec/lib/pwn/plugins/slack_client_spec.rb +0 -15
- data/spec/lib/pwn/plugins/sock_spec.rb +0 -15
- data/spec/lib/pwn/plugins/spider_spec.rb +0 -15
- data/spec/lib/pwn/plugins/ssn_spec.rb +0 -15
- data/spec/lib/pwn/plugins/thread_pool_spec.rb +0 -15
- data/spec/lib/pwn/plugins/tor_spec.rb +0 -15
- data/spec/lib/pwn/plugins/transparent_browser_spec.rb +0 -15
- data/spec/lib/pwn/plugins/twitter_api_spec.rb +0 -15
- data/spec/lib/pwn/plugins/uri_scheme_spec.rb +0 -15
- data/spec/lib/pwn/plugins/vault_spec.rb +0 -15
- data/spec/lib/pwn/plugins/vin_spec.rb +0 -15
- data/spec/lib/pwn/plugins/voice_spec.rb +0 -15
- data/spec/lib/pwn/plugins/vsphere_spec.rb +0 -15
- data/spec/lib/pwn/plugins/xxd_spec.rb +0 -15
- data/spec/lib/pwn/plugins/zaproxy_spec.rb +0 -15
- data/spec/lib/pwn/plugins_spec.rb +0 -10
- data/spec/lib/pwn/reports/fuzz_spec.rb +0 -15
- data/spec/lib/pwn/reports/html_footer_spec.rb +0 -15
- data/spec/lib/pwn/reports/html_header_spec.rb +0 -15
- data/spec/lib/pwn/reports/phone_spec.rb +0 -15
- data/spec/lib/pwn/reports/sast_spec.rb +0 -15
- data/spec/lib/pwn/reports/uri_buster_spec.rb +0 -15
- data/spec/lib/pwn/reports_spec.rb +0 -10
- data/spec/lib/pwn/sast/amqp_connect_as_guest_spec.rb +0 -25
- data/spec/lib/pwn/sast/apache_file_system_util_api_spec.rb +0 -25
- data/spec/lib/pwn/sast/aws_spec.rb +0 -25
- data/spec/lib/pwn/sast/banned_function_calls_c_spec.rb +0 -25
- data/spec/lib/pwn/sast/base64_spec.rb +0 -25
- data/spec/lib/pwn/sast/beef_hook_spec.rb +0 -25
- data/spec/lib/pwn/sast/cmd_execution_go_lang_spec.rb +0 -25
- data/spec/lib/pwn/sast/cmd_execution_java_spec.rb +0 -25
- data/spec/lib/pwn/sast/cmd_execution_python_spec.rb +0 -25
- data/spec/lib/pwn/sast/cmd_execution_ruby_spec.rb +0 -25
- data/spec/lib/pwn/sast/cmd_execution_scala_spec.rb +0 -25
- data/spec/lib/pwn/sast/csrf_spec.rb +0 -25
- data/spec/lib/pwn/sast/deserial_java_spec.rb +0 -25
- data/spec/lib/pwn/sast/emoticon_spec.rb +0 -25
- data/spec/lib/pwn/sast/eval_spec.rb +0 -25
- data/spec/lib/pwn/sast/factory_spec.rb +0 -25
- data/spec/lib/pwn/sast/http_authorization_header_spec.rb +0 -25
- data/spec/lib/pwn/sast/inner_html_spec.rb +0 -25
- data/spec/lib/pwn/sast/keystore_spec.rb +0 -25
- data/spec/lib/pwn/sast/local_storage_spec.rb +0 -25
- data/spec/lib/pwn/sast/location_hash_spec.rb +0 -25
- data/spec/lib/pwn/sast/log4j_spec.rb +0 -25
- data/spec/lib/pwn/sast/logger_spec.rb +0 -25
- data/spec/lib/pwn/sast/md5_spec.rb +0 -25
- data/spec/lib/pwn/sast/outer_html_spec.rb +0 -25
- data/spec/lib/pwn/sast/padding_oracle_spec.rb +0 -25
- data/spec/lib/pwn/sast/password_spec.rb +0 -25
- data/spec/lib/pwn/sast/php_input_mechanisms_spec.rb +0 -25
- data/spec/lib/pwn/sast/php_type_juggling_spec.rb +0 -25
- data/spec/lib/pwn/sast/pom_version_spec.rb +0 -25
- data/spec/lib/pwn/sast/port_spec.rb +0 -25
- data/spec/lib/pwn/sast/post_message_spec.rb +0 -25
- data/spec/lib/pwn/sast/private_key_spec.rb +0 -25
- data/spec/lib/pwn/sast/redirect_spec.rb +0 -25
- data/spec/lib/pwn/sast/redos_spec.rb +0 -25
- data/spec/lib/pwn/sast/shell_spec.rb +0 -25
- data/spec/lib/pwn/sast/signature_spec.rb +0 -25
- data/spec/lib/pwn/sast/sql_spec.rb +0 -25
- data/spec/lib/pwn/sast/ssl_spec.rb +0 -25
- data/spec/lib/pwn/sast/sudo_spec.rb +0 -25
- data/spec/lib/pwn/sast/task_tag_spec.rb +0 -25
- data/spec/lib/pwn/sast/test_case_engine_spec.rb +0 -20
- data/spec/lib/pwn/sast/throw_errors_spec.rb +0 -25
- data/spec/lib/pwn/sast/token_spec.rb +0 -25
- data/spec/lib/pwn/sast/type_script_type_juggling_spec.rb +0 -25
- data/spec/lib/pwn/sast/use_after_free_spec.rb +0 -25
- data/spec/lib/pwn/sast/version_spec.rb +0 -25
- data/spec/lib/pwn/sast/window_location_hash_spec.rb +0 -25
- data/spec/lib/pwn/sast_spec.rb +0 -10
- data/spec/lib/pwn/sdr/decoder/gsm_spec.rb +0 -15
- data/spec/lib/pwn/sdr/decoder_spec.rb +0 -10
- data/spec/lib/pwn/sdr/flipper_zero_spec.rb +0 -15
- data/spec/lib/pwn/sdr/frequency_allocation_spec.rb +0 -15
- data/spec/lib/pwn/sdr/gqrx_spec.rb +0 -15
- data/spec/lib/pwn/sdr/rfidler_spec.rb +0 -15
- data/spec/lib/pwn/sdr/son_micro_rfid_spec.rb +0 -15
- data/spec/lib/pwn/sdr_spec.rb +0 -10
- data/spec/lib/pwn/version_spec.rb +0 -17
- data/spec/lib/pwn/www/app_cobalt_io_spec.rb +0 -15
- data/spec/lib/pwn/www/bing_spec.rb +0 -15
- data/spec/lib/pwn/www/bug_crowd_spec.rb +0 -15
- data/spec/lib/pwn/www/checkip_spec.rb +0 -15
- data/spec/lib/pwn/www/coinbase_pro_spec.rb +0 -15
- data/spec/lib/pwn/www/duckduckgo_spec.rb +0 -15
- data/spec/lib/pwn/www/facebook_spec.rb +0 -15
- data/spec/lib/pwn/www/google_spec.rb +0 -15
- data/spec/lib/pwn/www/hacker_one_spec.rb +0 -15
- data/spec/lib/pwn/www/linkedin_spec.rb +0 -15
- data/spec/lib/pwn/www/pandora_spec.rb +0 -15
- data/spec/lib/pwn/www/pastebin_spec.rb +0 -15
- data/spec/lib/pwn/www/paypal_spec.rb +0 -15
- data/spec/lib/pwn/www/synack_spec.rb +0 -15
- data/spec/lib/pwn/www/torch_spec.rb +0 -15
- data/spec/lib/pwn/www/trading_view_spec.rb +0 -15
- data/spec/lib/pwn/www/twitter_spec.rb +0 -15
- data/spec/lib/pwn/www/uber_spec.rb +0 -15
- data/spec/lib/pwn/www/upwork_spec.rb +0 -15
- data/spec/lib/pwn/www/wayback_machine_spec.rb +0 -15
- data/spec/lib/pwn/www/youtube_spec.rb +0 -15
- data/spec/lib/pwn/www_spec.rb +0 -10
- data/spec/lib/pwn_spec.rb +0 -10
- data/spec/spec_helper.rb +0 -3
- data/third_party/.gitkeep +0 -0
- data/third_party/http-request-headers-fields-large.txt +0 -1185
- data/third_party/pwn_rdoc.jsonl +0 -1435
- data/third_party/r2-pwn-layout +0 -1
- data/update_pwn.sh +0 -9
- data/upgrade_ruby.sh +0 -42
- data/vagrant/provisioners/apache2.sh +0 -76
- data/vagrant/provisioners/beef.rb +0 -30
- data/vagrant/provisioners/burpsuite_pro.rb +0 -37
- data/vagrant/provisioners/exploit-db.sh +0 -2
- data/vagrant/provisioners/gem.sh +0 -4
- data/vagrant/provisioners/init_env.sh +0 -22
- data/vagrant/provisioners/jenkins.sh +0 -87
- data/vagrant/provisioners/jenkins_ssh-keygen.rb +0 -86
- data/vagrant/provisioners/kali_customize.rb +0 -130
- data/vagrant/provisioners/letsencrypt.rb +0 -35
- data/vagrant/provisioners/metasploit.rb +0 -25
- data/vagrant/provisioners/nmap_all_live_hosts.sh +0 -2
- data/vagrant/provisioners/openvas.sh +0 -23
- data/vagrant/provisioners/openvas_wrappers.sh +0 -2
- data/vagrant/provisioners/post_install.sh +0 -14
- data/vagrant/provisioners/postgres.sh +0 -22
- data/vagrant/provisioners/pwn.sh +0 -13
- data/vagrant/provisioners/rvm.sh +0 -18
- data/vagrant/provisioners/ssllabs-scan.sh +0 -10
- data/vagrant/provisioners/toggle_tor.sh +0 -2
- data/vagrant/provisioners/update_jenkins_plugins.rb +0 -30
- data/vagrant/provisioners/update_os.sh +0 -108
- data/vagrant/provisioners/upload_globals.sh +0 -63
- data/vagrant/provisioners/userland_fdisk.sh +0 -22
- data/vagrant/provisioners/userland_lvm.sh +0 -5
- data/vagrant/provisioners/wpscan.rb +0 -25
- data/vagrant_rsync_third_party.lst +0 -1
- data/vagrant_rsync_userland_template.lst +0 -8
|
@@ -1,1738 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'diffy'
|
|
4
|
-
require 'em/pure_ruby'
|
|
5
|
-
require 'faye/websocket'
|
|
6
|
-
require 'nokogiri'
|
|
7
|
-
require 'openssl'
|
|
8
|
-
require 'rest-client'
|
|
9
|
-
require 'securerandom'
|
|
10
|
-
require 'selenium/devtools'
|
|
11
|
-
require 'selenium/webdriver'
|
|
12
|
-
require 'socksify'
|
|
13
|
-
require 'timeout'
|
|
14
|
-
require 'watir'
|
|
15
|
-
require 'yaml'
|
|
16
|
-
|
|
17
|
-
module PWN
|
|
18
|
-
module Plugins
|
|
19
|
-
# This plugin rocks. Chrome, Firefox, headless, REST Client,
|
|
20
|
-
# all from the comfort of one plugin. Proxy support (e.g. Burp
|
|
21
|
-
# Suite Professional) is completely available for all browsers
|
|
22
|
-
# except for limited functionality within IE (IE has interesting
|
|
23
|
-
# protections in place to prevent this). This plugin also supports
|
|
24
|
-
# taking screenshots :)
|
|
25
|
-
module TransparentBrowser
|
|
26
|
-
@@logger = PWN::Plugins::PWNLogger.create
|
|
27
|
-
|
|
28
|
-
# Supported Method Parameters::
|
|
29
|
-
# verify_devtools_browser(
|
|
30
|
-
# browser_obj: 'required - browser_obj returned from #open method',
|
|
31
|
-
# supported: 'optional - array of supported browser types (defaults to [:chrome, :headless_chrome, :firefox, :headless_firefox, :headless])'
|
|
32
|
-
# )
|
|
33
|
-
private_class_method def self.verify_devtools_browser(opts = {})
|
|
34
|
-
browser_obj = opts[:browser_obj]
|
|
35
|
-
supported = opts[:supported] ||= %i[chrome headless_chrome firefox headless_firefox headless]
|
|
36
|
-
|
|
37
|
-
browser_type = browser_obj[:type]
|
|
38
|
-
verified = false
|
|
39
|
-
verified = true if supported.include?(browser_type)
|
|
40
|
-
rescue StandardError => e
|
|
41
|
-
raise e
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# Supported Method Parameters::
|
|
45
|
-
# browser_obj1 = PWN::Plugins::TransparentBrowser.open(
|
|
46
|
-
# browser_type: 'optional - :firefox|:chrome|:headless|:rest|:websocket (defaults to :chrome)',
|
|
47
|
-
# proxy: 'optional - scheme://proxy_host:port || tor (defaults to nil)',
|
|
48
|
-
# devtools: 'optional - boolean (defaults to false)',
|
|
49
|
-
# )
|
|
50
|
-
|
|
51
|
-
public_class_method def self.open(opts = {})
|
|
52
|
-
browser_type = opts[:browser_type] ||= :chrome
|
|
53
|
-
proxy = opts[:proxy].to_s unless opts[:proxy].nil?
|
|
54
|
-
|
|
55
|
-
browser_obj = {}
|
|
56
|
-
browser_obj[:type] = browser_type
|
|
57
|
-
|
|
58
|
-
tor_obj = nil
|
|
59
|
-
if opts[:proxy] == 'tor'
|
|
60
|
-
tor_obj = PWN::Plugins::Tor.start
|
|
61
|
-
proxy = "socks5://#{tor_obj[:ip]}:#{tor_obj[:port]}"
|
|
62
|
-
browser_obj[:tor_obj] = tor_obj
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
devtools_supported = %i[chrome headless_chrome firefox headless_firefox headless]
|
|
66
|
-
devtools = opts[:devtools] ||= false
|
|
67
|
-
devtools = true if devtools_supported.include?(browser_type) && devtools
|
|
68
|
-
|
|
69
|
-
# Let's crank up the default timeout from 30 seconds to 15 min for slow sites
|
|
70
|
-
Watir.default_timeout = 900
|
|
71
|
-
|
|
72
|
-
args = []
|
|
73
|
-
# args.push('--start-maximized')
|
|
74
|
-
args.push('--disable-notifications')
|
|
75
|
-
|
|
76
|
-
unless browser_type == :rest
|
|
77
|
-
logger = Selenium::WebDriver.logger
|
|
78
|
-
logger.level = :error
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
case browser_type
|
|
82
|
-
when :firefox
|
|
83
|
-
this_profile = Selenium::WebDriver::Firefox::Profile.new
|
|
84
|
-
|
|
85
|
-
# Increase Web Assembly Verbosity
|
|
86
|
-
this_profile['javascript.options.wasm_verbose'] = true
|
|
87
|
-
|
|
88
|
-
# Downloads reside in ~/Downloads
|
|
89
|
-
this_profile['browser.download.folderList'] = 1
|
|
90
|
-
this_profile['browser.helperApps.neverAsk.saveToDisk'] = 'application/pdf'
|
|
91
|
-
|
|
92
|
-
# disable Firefox's built-in PDF viewer
|
|
93
|
-
this_profile['pdfjs.disabled'] = true
|
|
94
|
-
|
|
95
|
-
# disable Adobe Acrobat PDF preview plugin
|
|
96
|
-
this_profile['plugin.scan.plid.all'] = false
|
|
97
|
-
this_profile['plugin.scan.Acrobat'] = '99.0'
|
|
98
|
-
|
|
99
|
-
# ensure localhost proxy capabilities are enabled
|
|
100
|
-
this_profile['network.proxy.no_proxies_on'] = ''
|
|
101
|
-
|
|
102
|
-
# allow scripts to run a bit longer
|
|
103
|
-
# this_profile['dom.max_chrome_script_run_time'] = 180
|
|
104
|
-
# this_profile['dom.max_script_run_time'] = 180
|
|
105
|
-
|
|
106
|
-
# disable browser cache
|
|
107
|
-
this_profile['browser.cache.disk.enable'] = false
|
|
108
|
-
this_profile['browser.cache.disk_cache_ssl.enable'] = false
|
|
109
|
-
this_profile['browser.cache.memory.enable'] = false
|
|
110
|
-
this_profile['browser.cache.offline.enable'] = false
|
|
111
|
-
this_profile['devtools.cache.disabled'] = true
|
|
112
|
-
this_profile['dom.caches.enabled'] = false
|
|
113
|
-
|
|
114
|
-
if devtools
|
|
115
|
-
# args.push('--start-debugger-server')
|
|
116
|
-
# this_profile['devtools.debugger.remote-enabled'] = true
|
|
117
|
-
# this_profile['devtools.debugger.remote-host'] = 'localhost'
|
|
118
|
-
# this_profile['devtools.debugger.remote-port'] = 6000
|
|
119
|
-
|
|
120
|
-
# DevTools ToolBox Settings in Firefox about:config
|
|
121
|
-
this_profile['devtools.f12.enabled'] = true
|
|
122
|
-
this_profile['devtools.toolbox.host'] = 'right'
|
|
123
|
-
this_profile['devtools.toolbox.selectedTool'] = 'jsdebugger'
|
|
124
|
-
this_profile['devtools.toolbox.sidebar.width'] = 1700
|
|
125
|
-
this_profile['devtools.toolbox.splitconsoleHeight'] = 200
|
|
126
|
-
|
|
127
|
-
# DevTools Debugger Settings in Firefox about:config
|
|
128
|
-
this_profile['devtools.chrome.enabled'] = true
|
|
129
|
-
this_profile['devtools.debugger.start-panel-size'] = 200
|
|
130
|
-
this_profile['devtools.debugger.end-panel-size'] = 200
|
|
131
|
-
this_profile['devtools.debugger.auto-pretty-print'] = true
|
|
132
|
-
this_profile['devtools.debugger.ui.editor-wrapping'] = true
|
|
133
|
-
this_profile['devtools.debugger.features.javascript-tracing'] = true
|
|
134
|
-
this_profile['devtools.debugger.xhr-breakpoints-visible'] = true
|
|
135
|
-
this_profile['devtools.debugger.expressions-visible'] = true
|
|
136
|
-
this_profile['devtools.debugger.dom-mutation-breakpoints-visible'] = true
|
|
137
|
-
this_profile['devtools.debugger.features.async-live-stacks'] = true
|
|
138
|
-
this_profile['devtools.debugger.features.autocomplete-expressions'] = true
|
|
139
|
-
this_profile['devtools.debugger.features.code-folding'] = true
|
|
140
|
-
this_profile['devtools.debugger.features.command-click'] = true
|
|
141
|
-
this_profile['devtools.debugger.features.component-pane'] = true
|
|
142
|
-
this_profile['devtools.debugger.map-scopes-enabled'] = true
|
|
143
|
-
|
|
144
|
-
# Never optimize out variables in the debugger
|
|
145
|
-
this_profile['javascript.options.baselinejit'] = false
|
|
146
|
-
this_profile['javascript.options.ion'] = false
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
# caps = Selenium::WebDriver::Remote::Capabilities.firefox
|
|
150
|
-
# caps[:acceptInsecureCerts] = true
|
|
151
|
-
|
|
152
|
-
if proxy
|
|
153
|
-
this_profile['network.proxy.type'] = 1
|
|
154
|
-
this_profile['network.proxy.allow_hijacking_localhost'] = true
|
|
155
|
-
if tor_obj
|
|
156
|
-
this_profile['network.proxy.socks_version'] = 5
|
|
157
|
-
this_profile['network.proxy.socks'] = tor_obj[:ip]
|
|
158
|
-
this_profile['network.proxy.socks_port'] = tor_obj[:port]
|
|
159
|
-
else
|
|
160
|
-
this_profile['network.proxy.ftp'] = URI(proxy).host
|
|
161
|
-
this_profile['network.proxy.ftp_port'] = URI(proxy).port
|
|
162
|
-
this_profile['network.proxy.http'] = URI(proxy).host
|
|
163
|
-
this_profile['network.proxy.http_port'] = URI(proxy).port
|
|
164
|
-
this_profile['network.proxy.ssl'] = URI(proxy).host
|
|
165
|
-
this_profile['network.proxy.ssl_port'] = URI(proxy).port
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
# Private browsing mode
|
|
170
|
-
args.push('--private')
|
|
171
|
-
options = Selenium::WebDriver::Firefox::Options.new(
|
|
172
|
-
args: args,
|
|
173
|
-
accept_insecure_certs: true
|
|
174
|
-
)
|
|
175
|
-
|
|
176
|
-
# This is required for BiDi support
|
|
177
|
-
options.web_socket_url = true
|
|
178
|
-
options.add_preference('remote.active-protocols', 3)
|
|
179
|
-
options.profile = this_profile
|
|
180
|
-
driver = Selenium::WebDriver.for(:firefox, options: options)
|
|
181
|
-
browser_obj[:browser] = Watir::Browser.new(driver)
|
|
182
|
-
|
|
183
|
-
when :chrome
|
|
184
|
-
this_profile = Selenium::WebDriver::Chrome::Profile.new
|
|
185
|
-
this_profile['download.prompt_for_download'] = false
|
|
186
|
-
this_profile['download.default_directory'] = '~/Downloads'
|
|
187
|
-
|
|
188
|
-
if proxy
|
|
189
|
-
args.push("--host-resolver-rules='MAP * 0.0.0.0 , EXCLUDE #{tor_obj[:ip]}'") if tor_obj
|
|
190
|
-
args.push("--proxy-server=#{proxy}")
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
# Incognito browsing mode
|
|
194
|
-
args.push('--incognito')
|
|
195
|
-
options = Selenium::WebDriver::Chrome::Options.new(
|
|
196
|
-
args: args,
|
|
197
|
-
accept_insecure_certs: true
|
|
198
|
-
)
|
|
199
|
-
|
|
200
|
-
if devtools
|
|
201
|
-
args.push('--auto-open-devtools-for-tabs')
|
|
202
|
-
args.push('--disable-hang-monitor')
|
|
203
|
-
options.add_preference('devtools.preferences.enable-ignore-listing', false)
|
|
204
|
-
options.add_preference('devtools.preferences.default-indentation', '2 spaces')
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
# This is required for BiDi support
|
|
208
|
-
options.web_socket_url = true
|
|
209
|
-
options.add_preference('remote.active-protocols', 3)
|
|
210
|
-
options.profile = this_profile
|
|
211
|
-
driver = Selenium::WebDriver.for(:chrome, options: options)
|
|
212
|
-
browser_obj[:browser] = Watir::Browser.new(driver)
|
|
213
|
-
|
|
214
|
-
when :headless, :headless_firefox
|
|
215
|
-
this_profile = Selenium::WebDriver::Firefox::Profile.new
|
|
216
|
-
|
|
217
|
-
# Increase Web Assembly Verbosity
|
|
218
|
-
this_profile['javascript.options.wasm_verbose'] = true
|
|
219
|
-
|
|
220
|
-
# Downloads reside in ~/Downloads
|
|
221
|
-
this_profile['browser.download.folderList'] = 1
|
|
222
|
-
this_profile['browser.helperApps.neverAsk.saveToDisk'] = 'application/pdf'
|
|
223
|
-
|
|
224
|
-
# disable Firefox's built-in PDF viewer
|
|
225
|
-
this_profile['pdfjs.disabled'] = true
|
|
226
|
-
|
|
227
|
-
# disable Adobe Acrobat PDF preview plugin
|
|
228
|
-
this_profile['plugin.scan.plid.all'] = false
|
|
229
|
-
this_profile['plugin.scan.Acrobat'] = '99.0'
|
|
230
|
-
|
|
231
|
-
# ensure localhost proxy capabilities are enabled
|
|
232
|
-
this_profile['network.proxy.no_proxies_on'] = ''
|
|
233
|
-
|
|
234
|
-
# allow scripts to run a bit longer
|
|
235
|
-
# this_profile['dom.max_chrome_script_run_time'] = 180
|
|
236
|
-
# this_profile['dom.max_script_run_time'] = 180
|
|
237
|
-
|
|
238
|
-
# disable browser cache
|
|
239
|
-
this_profile['browser.cache.disk.enable'] = false
|
|
240
|
-
this_profile['browser.cache.disk_cache_ssl.enable'] = false
|
|
241
|
-
this_profile['browser.cache.memory.enable'] = false
|
|
242
|
-
this_profile['browser.cache.offline.enable'] = false
|
|
243
|
-
this_profile['devtools.cache.disabled'] = true
|
|
244
|
-
this_profile['dom.caches.enabled'] = false
|
|
245
|
-
|
|
246
|
-
if proxy
|
|
247
|
-
this_profile['network.proxy.type'] = 1
|
|
248
|
-
this_profile['network.proxy.allow_hijacking_localhost'] = true
|
|
249
|
-
if tor_obj
|
|
250
|
-
this_profile['network.proxy.socks_version'] = 5
|
|
251
|
-
this_profile['network.proxy.socks'] = tor_obj[:ip]
|
|
252
|
-
this_profile['network.proxy.socks_port'] = tor_obj[:port]
|
|
253
|
-
else
|
|
254
|
-
this_profile['network.proxy.ftp'] = URI(proxy).host
|
|
255
|
-
this_profile['network.proxy.ftp_port'] = URI(proxy).port
|
|
256
|
-
this_profile['network.proxy.http'] = URI(proxy).host
|
|
257
|
-
this_profile['network.proxy.http_port'] = URI(proxy).port
|
|
258
|
-
this_profile['network.proxy.ssl'] = URI(proxy).host
|
|
259
|
-
this_profile['network.proxy.ssl_port'] = URI(proxy).port
|
|
260
|
-
end
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
args.push('--headless')
|
|
264
|
-
# Private browsing mode
|
|
265
|
-
args.push('--private')
|
|
266
|
-
options = Selenium::WebDriver::Firefox::Options.new(
|
|
267
|
-
args: args,
|
|
268
|
-
accept_insecure_certs: true
|
|
269
|
-
)
|
|
270
|
-
|
|
271
|
-
# This is required for BiDi support
|
|
272
|
-
options.web_socket_url = true
|
|
273
|
-
options.add_preference('remote.active-protocols', 3)
|
|
274
|
-
options.profile = this_profile
|
|
275
|
-
driver = Selenium::WebDriver.for(:firefox, options: options)
|
|
276
|
-
browser_obj[:browser] = Watir::Browser.new(driver)
|
|
277
|
-
|
|
278
|
-
when :headless_chrome
|
|
279
|
-
this_profile = Selenium::WebDriver::Chrome::Profile.new
|
|
280
|
-
this_profile['download.prompt_for_download'] = false
|
|
281
|
-
this_profile['download.default_directory'] = '~/Downloads'
|
|
282
|
-
|
|
283
|
-
if proxy
|
|
284
|
-
args.push("--host-resolver-rules='MAP * 0.0.0.0 , EXCLUDE #{tor_obj[:ip]}'") if tor_obj
|
|
285
|
-
args.push("--proxy-server=#{proxy}")
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
args.push('--headless')
|
|
289
|
-
# Incognito browsing mode
|
|
290
|
-
args.push('--incognito')
|
|
291
|
-
options = Selenium::WebDriver::Chrome::Options.new(
|
|
292
|
-
args: args,
|
|
293
|
-
accept_insecure_certs: true
|
|
294
|
-
)
|
|
295
|
-
|
|
296
|
-
# This is required for BiDi support
|
|
297
|
-
options.web_socket_url = true
|
|
298
|
-
options.add_preference('remote.active-protocols', 3)
|
|
299
|
-
options.profile = this_profile
|
|
300
|
-
driver = Selenium::WebDriver.for(:chrome, options: options)
|
|
301
|
-
browser_obj[:browser] = Watir::Browser.new(driver)
|
|
302
|
-
|
|
303
|
-
when :rest
|
|
304
|
-
browser_obj[:browser] = RestClient
|
|
305
|
-
if proxy
|
|
306
|
-
if tor_obj
|
|
307
|
-
TCPSocket.socks_server = tor_obj[:ip]
|
|
308
|
-
TCPSocket.socks_port = tor_obj[:port]
|
|
309
|
-
else
|
|
310
|
-
browser_obj[:browser].proxy = proxy
|
|
311
|
-
end
|
|
312
|
-
end
|
|
313
|
-
|
|
314
|
-
when :websocket
|
|
315
|
-
if proxy
|
|
316
|
-
if tor_obj
|
|
317
|
-
TCPSocket.socks_server = tor_obj[:ip]
|
|
318
|
-
TCPSocket.socks_port = tor_obj[:port]
|
|
319
|
-
end
|
|
320
|
-
proxy_opts = { origin: proxy }
|
|
321
|
-
tls_opts = { verify_peer: false }
|
|
322
|
-
browser_obj[:browser] = Faye::WebSocket::Client.new(
|
|
323
|
-
'',
|
|
324
|
-
[],
|
|
325
|
-
{
|
|
326
|
-
tls: tls_opts,
|
|
327
|
-
proxy: proxy_opts
|
|
328
|
-
}
|
|
329
|
-
)
|
|
330
|
-
else
|
|
331
|
-
browser_obj[:browser] = Faye::WebSocket::Client.new('')
|
|
332
|
-
end
|
|
333
|
-
else
|
|
334
|
-
puts 'Error: browser_type only supports :firefox, :chrome, :headless, :headless_chrome, :headless_firefox, :rest, :websocket'
|
|
335
|
-
return nil
|
|
336
|
-
end
|
|
337
|
-
|
|
338
|
-
if devtools && devtools_supported.include?(browser_type)
|
|
339
|
-
chrome_types = %i[chrome headless_chrome]
|
|
340
|
-
firefox_types = %i[firefox headless_firefox]
|
|
341
|
-
|
|
342
|
-
# Switch to the last opened window which should be the active tab
|
|
343
|
-
# if it doesn't work, try the first window handle. In chrome they
|
|
344
|
-
# get reversed sometimes ¯\_(ツ)_/¯
|
|
345
|
-
target_window_handle = browser_obj[:browser].driver.window_handles.last
|
|
346
|
-
begin
|
|
347
|
-
browser_obj[:browser].driver.switch_to.window(target_window_handle)
|
|
348
|
-
|
|
349
|
-
url = 'about:about'
|
|
350
|
-
url = 'chrome://chrome-urls' if chrome_types.include?(browser_type)
|
|
351
|
-
browser_obj[:browser].goto(url)
|
|
352
|
-
rescue Selenium::WebDriver::Error::WebDriverError
|
|
353
|
-
target_window_handle = browser_obj[:browser].driver.window_handles.first
|
|
354
|
-
retry
|
|
355
|
-
end
|
|
356
|
-
|
|
357
|
-
rand_tab = SecureRandom.hex(8)
|
|
358
|
-
browser_obj[:browser].execute_script("document.title = 'about:about-#{rand_tab}'")
|
|
359
|
-
|
|
360
|
-
browser_obj[:browser].driver.manage.window.maximize
|
|
361
|
-
toggle_devtools(browser_obj: browser_obj)
|
|
362
|
-
|
|
363
|
-
browser_obj[:bidi] = browser_obj[:browser].driver.bidi
|
|
364
|
-
browser_obj[:devtools] = browser_obj[:browser].driver.devtools if chrome_types.include?(browser_type)
|
|
365
|
-
browser_obj[:devtools] = browser_obj[:browser].driver.bidi if firefox_types.include?(browser_type)
|
|
366
|
-
end
|
|
367
|
-
|
|
368
|
-
browser_obj
|
|
369
|
-
rescue StandardError => e
|
|
370
|
-
puts e.backtrace
|
|
371
|
-
raise e
|
|
372
|
-
end
|
|
373
|
-
|
|
374
|
-
# Supported Method Parameters::
|
|
375
|
-
# browser_obj = PWN::Plugins::TransparentBrowser.dump_links(
|
|
376
|
-
# browser_obj: browser_obj1
|
|
377
|
-
# )
|
|
378
|
-
|
|
379
|
-
public_class_method def self.dump_links(opts = {})
|
|
380
|
-
browser_obj = opts[:browser_obj]
|
|
381
|
-
|
|
382
|
-
dump_links_arr = []
|
|
383
|
-
browser_obj[:browser].links.each do |link|
|
|
384
|
-
link_hash = {}
|
|
385
|
-
|
|
386
|
-
link_hash[:text] = link.text
|
|
387
|
-
link_hash[:href] = link.href
|
|
388
|
-
link_hash[:id] = link.id
|
|
389
|
-
link_hash[:name] = link.name
|
|
390
|
-
link_hash[:class_name] = link.class_name
|
|
391
|
-
link_hash[:html] = link.html
|
|
392
|
-
link_hash[:target] = link.target
|
|
393
|
-
dump_links_arr.push(link_hash)
|
|
394
|
-
|
|
395
|
-
yield link if block_given?
|
|
396
|
-
end
|
|
397
|
-
|
|
398
|
-
dump_links_arr
|
|
399
|
-
rescue StandardError => e
|
|
400
|
-
raise e
|
|
401
|
-
end
|
|
402
|
-
|
|
403
|
-
# Supported Method Parameters::
|
|
404
|
-
# browser_obj = PWN::Plugins::TransparentBrowser.find_elements_by_text(
|
|
405
|
-
# browser_obj: browser_obj1,
|
|
406
|
-
# text: 'required - text to search for in the DOM'
|
|
407
|
-
# )
|
|
408
|
-
|
|
409
|
-
public_class_method def self.find_elements_by_text(opts = {})
|
|
410
|
-
browser_obj = opts[:browser_obj]
|
|
411
|
-
text = opts[:text].to_s
|
|
412
|
-
|
|
413
|
-
elements = browser_obj[:browser].elements
|
|
414
|
-
elements_found_arr = []
|
|
415
|
-
elements.each do |element|
|
|
416
|
-
begin
|
|
417
|
-
if element.text == text || element.value == text
|
|
418
|
-
element_hash = {}
|
|
419
|
-
element_hash[:tag_name] = element.tag_name
|
|
420
|
-
element_hash[:html] = element.html
|
|
421
|
-
elements_found_arr.push(element_hash)
|
|
422
|
-
|
|
423
|
-
yield element if block_given?
|
|
424
|
-
end
|
|
425
|
-
rescue NoMethodError
|
|
426
|
-
next
|
|
427
|
-
end
|
|
428
|
-
end
|
|
429
|
-
|
|
430
|
-
elements_found_arr
|
|
431
|
-
rescue StandardError => e
|
|
432
|
-
puts e.backtrace
|
|
433
|
-
raise e
|
|
434
|
-
end
|
|
435
|
-
|
|
436
|
-
# Supported Method Parameters::
|
|
437
|
-
# PWN::Plugins::TransparentBrowser.type_as_human(
|
|
438
|
-
# string: 'required - string to type as human',
|
|
439
|
-
# rand_sleep_float: 'optional - float timing in between keypress (defaults to 0.09)'
|
|
440
|
-
# )
|
|
441
|
-
|
|
442
|
-
public_class_method def self.type_as_human(opts = {})
|
|
443
|
-
string = opts[:string].to_s
|
|
444
|
-
|
|
445
|
-
rand_sleep_float = if opts[:rand_sleep_float]
|
|
446
|
-
opts[:rand_sleep_float].to_f
|
|
447
|
-
else
|
|
448
|
-
0.09
|
|
449
|
-
end
|
|
450
|
-
|
|
451
|
-
string.each_char do |char|
|
|
452
|
-
yield char
|
|
453
|
-
|
|
454
|
-
sleep Random.rand(rand_sleep_float)
|
|
455
|
-
end
|
|
456
|
-
rescue StandardError => e
|
|
457
|
-
raise e
|
|
458
|
-
end
|
|
459
|
-
|
|
460
|
-
# Supported Method Parameters::
|
|
461
|
-
# console_resp = PWN::Plugins::TransparentBrowser.console(
|
|
462
|
-
# browser_obj: browser_obj1,
|
|
463
|
-
# js: 'required - JavaScript expression to evaluate',
|
|
464
|
-
# return_to: 'optional - return to :console or :stdout (defaults to :console)'
|
|
465
|
-
# )
|
|
466
|
-
|
|
467
|
-
public_class_method def self.console(opts = {})
|
|
468
|
-
browser_obj = opts[:browser_obj]
|
|
469
|
-
verified = verify_devtools_browser(browser_obj: browser_obj)
|
|
470
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
471
|
-
return unless verified
|
|
472
|
-
|
|
473
|
-
js = opts[:js] ||= "alert('ACK from => #{self}')"
|
|
474
|
-
return_to = opts[:return_to] ||= :console
|
|
475
|
-
raise 'ERROR: return_to parameter must be :console or :stdout' unless %i[console stdout].include?(return_to.to_s.downcase.to_sym)
|
|
476
|
-
|
|
477
|
-
case js
|
|
478
|
-
when 'clear', 'clear;', 'clear()', 'clear();'
|
|
479
|
-
script = 'console.clear()'
|
|
480
|
-
when 'debugger', 'debugger;', 'debugger()', 'debugger();'
|
|
481
|
-
script = 'debugger'
|
|
482
|
-
else
|
|
483
|
-
case return_to.to_s.downcase.to_sym
|
|
484
|
-
when :stdout
|
|
485
|
-
script = "return #{js}"
|
|
486
|
-
when :console
|
|
487
|
-
script = "console.log(#{js})"
|
|
488
|
-
end
|
|
489
|
-
end
|
|
490
|
-
|
|
491
|
-
console_resp = nil
|
|
492
|
-
begin
|
|
493
|
-
Timeout.timeout(1) { console_resp = browser_obj[:browser].execute_script(script) }
|
|
494
|
-
rescue Timeout::Error, Timeout::ExitException
|
|
495
|
-
console_resp
|
|
496
|
-
rescue Selenium::WebDriver::Error::JavascriptError
|
|
497
|
-
script = js
|
|
498
|
-
retry
|
|
499
|
-
end
|
|
500
|
-
|
|
501
|
-
console_resp
|
|
502
|
-
rescue StandardError => e
|
|
503
|
-
raise e
|
|
504
|
-
end
|
|
505
|
-
|
|
506
|
-
# Supported Method Parameters:
|
|
507
|
-
# console_resp = PWN::Plugins::TransparentBrowser.view_dom_mutations(
|
|
508
|
-
# browser_obj: 'required - browser_obj returned from #open method',
|
|
509
|
-
# index: 'optional - index of tab to switch to (defaults to active tab)',
|
|
510
|
-
# target: 'optional - target JavaScript node to observe (defaults to document.body)',
|
|
511
|
-
# observe_clobbering: 'optional - boolean to enable DOM Clobbering detection (defaults to true)',
|
|
512
|
-
# observe_redirects: 'optional - boolean to enable Insecure Redirect detection (defaults to true)',
|
|
513
|
-
# observe_resources: 'optional - boolean to enable resource load monitoring (defaults to true)'
|
|
514
|
-
# )
|
|
515
|
-
|
|
516
|
-
public_class_method def self.view_dom_mutations(opts = {})
|
|
517
|
-
browser_obj = opts[:browser_obj]
|
|
518
|
-
verified = verify_devtools_browser(browser_obj: browser_obj)
|
|
519
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
520
|
-
return unless verified
|
|
521
|
-
|
|
522
|
-
index = opts[:index]
|
|
523
|
-
jmp_tab(browser_obj: browser_obj, index: index) if index
|
|
524
|
-
|
|
525
|
-
target = opts[:target] ||= 'undefined'
|
|
526
|
-
observe_clobbering = opts.fetch(:observe_clobbering, true)
|
|
527
|
-
observe_redirects = opts.fetch(:observe_redirects, true)
|
|
528
|
-
observe_resources = opts.fetch(:observe_resources, true)
|
|
529
|
-
|
|
530
|
-
jmp_devtools_panel(
|
|
531
|
-
browser_obj: browser_obj,
|
|
532
|
-
panel: :console
|
|
533
|
-
)
|
|
534
|
-
|
|
535
|
-
js = <<~JAVASCRIPT
|
|
536
|
-
// Select the target node to observe (default to document.body)
|
|
537
|
-
const targetNode = document.getElementById(#{target}) || document.body;
|
|
538
|
-
|
|
539
|
-
// Configuration for MutationObserver
|
|
540
|
-
const config = {
|
|
541
|
-
attributes: true,
|
|
542
|
-
childList: true,
|
|
543
|
-
subtree: true,
|
|
544
|
-
characterData: true,
|
|
545
|
-
attributeOldValue: true
|
|
546
|
-
};
|
|
547
|
-
|
|
548
|
-
// Exhaustive list of elements that can execute scripts or load resources
|
|
549
|
-
const xssElements = [
|
|
550
|
-
'SCRIPT', 'IFRAME', 'FRAME', 'OBJECT', 'EMBED', 'APPLET', 'SVG', 'IMG', 'VIDEO', 'AUDIO', 'LINK', 'META', 'BASE',
|
|
551
|
-
'INPUT', 'SOURCE', 'TRACK', 'FORM', 'BUTTON', 'AREA', 'NOSCRIPT', 'STYLE', 'HTML', 'BODY'
|
|
552
|
-
];
|
|
553
|
-
|
|
554
|
-
// Exhaustive list of attributes that can contain URLs, scripts, or event handlers
|
|
555
|
-
const xssAttributes = [
|
|
556
|
-
'src', 'href', 'action', 'srcdoc', 'data', 'codebase', 'style', 'manifest', 'poster', 'background', 'lowsrc',
|
|
557
|
-
'formaction', 'cite', 'ping', 'icon', 'longdesc', 'usemap', 'content', 'value', 'pattern',
|
|
558
|
-
'onload', 'onerror', 'onclick', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'onchange', 'onsubmit', 'onreset',
|
|
559
|
-
'onselect', 'ondblclick', 'onkeydown', 'onkeypress', 'onkeyup', 'onmousedown', 'onmousemove', 'onmouseup', 'onwheel',
|
|
560
|
-
'oncontextmenu', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onscroll',
|
|
561
|
-
'ontouchstart', 'ontouchmove', 'ontouchend', 'ontouchcancel', 'onanimationstart', 'onanimationend', 'onanimationiteration',
|
|
562
|
-
'ontransitionend'
|
|
563
|
-
];
|
|
564
|
-
|
|
565
|
-
// Attributes that can cause navigation (for insecure redirects)
|
|
566
|
-
const redirectAttributes = ['href', 'action', 'src', 'formaction', 'content'];
|
|
567
|
-
|
|
568
|
-
// Attributes that load resources (for data exfiltration)
|
|
569
|
-
const resourceAttributes = ['src', 'href', 'poster', 'data', 'background', 'lowsrc', 'cite', 'ping', 'icon', 'longdesc'];
|
|
570
|
-
|
|
571
|
-
// Global properties that could be clobbered
|
|
572
|
-
const globalProperties = [
|
|
573
|
-
'document', 'window', 'location', 'navigator', 'history', 'screen', 'console', 'alert', 'confirm', 'prompt',
|
|
574
|
-
'fetch', 'XMLHttpRequest', 'WebSocket', 'localStorage', 'sessionStorage'
|
|
575
|
-
];
|
|
576
|
-
|
|
577
|
-
// Callback function to handle mutations
|
|
578
|
-
const callback = (mutationList, observer) => {
|
|
579
|
-
mutationList.forEach((mutation) => {
|
|
580
|
-
if (mutation.type === 'childList') {
|
|
581
|
-
if (mutation.addedNodes.length) {
|
|
582
|
-
mutation.addedNodes.forEach((node) => {
|
|
583
|
-
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
584
|
-
const tagName = node.tagName.toUpperCase();
|
|
585
|
-
// Check for XSS sinks
|
|
586
|
-
if (xssElements.includes(tagName)) {
|
|
587
|
-
console.warn('Potential DOM-XSS sink: Added element', {
|
|
588
|
-
tagName: tagName,
|
|
589
|
-
id: node.id || 'N/A',
|
|
590
|
-
classList: node.className || 'N/A',
|
|
591
|
-
outerHTML: node.outerHTML
|
|
592
|
-
});
|
|
593
|
-
}
|
|
594
|
-
// Check for DOM Clobbering
|
|
595
|
-
if (#{observe_clobbering} && (node.id || node.name) && globalProperties.includes(node.id || node.name)) {
|
|
596
|
-
console.warn('Potential DOM Clobbering: Added element with id/name', {
|
|
597
|
-
id: node.id || 'N/A',
|
|
598
|
-
name: node.name || 'N/A',
|
|
599
|
-
tagName: tagName,
|
|
600
|
-
outerHTML: node.outerHTML
|
|
601
|
-
});
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
});
|
|
605
|
-
}
|
|
606
|
-
} else if (mutation.type === 'attributes') {
|
|
607
|
-
const attrName = mutation.attributeName.toLowerCase();
|
|
608
|
-
const tagName = mutation.target.tagName.toUpperCase();
|
|
609
|
-
// Check for XSS sinks
|
|
610
|
-
if (xssAttributes.includes(attrName)) {
|
|
611
|
-
console.warn('Potential DOM-XSS sink: Attribute change', {
|
|
612
|
-
element: tagName,
|
|
613
|
-
id: mutation.target.id || 'N/A',
|
|
614
|
-
attribute: attrName,
|
|
615
|
-
oldValue: mutation.oldValue,
|
|
616
|
-
newValue: mutation.target.getAttribute(attrName),
|
|
617
|
-
outerHTML: mutation.target.outerHTML
|
|
618
|
-
});
|
|
619
|
-
}
|
|
620
|
-
// Check for insecure redirects
|
|
621
|
-
if (#{observe_redirects} && redirectAttributes.includes(attrName) &&
|
|
622
|
-
(tagName === 'A' || tagName === 'FORM' || tagName === 'IFRAME' || tagName === 'BUTTON' || tagName === 'INPUT' ||
|
|
623
|
-
(tagName === 'META' && mutation.target.getAttribute('http-equiv') === 'refresh'))) {
|
|
624
|
-
console.warn('Potential Insecure Redirect: Attribute change', {
|
|
625
|
-
element: tagName,
|
|
626
|
-
id: mutation.target.id || 'N/A',
|
|
627
|
-
attribute: attrName,
|
|
628
|
-
oldValue: mutation.oldValue,
|
|
629
|
-
newValue: mutation.target.getAttribute(attrName),
|
|
630
|
-
outerHTML: mutation.target.outerHTML
|
|
631
|
-
});
|
|
632
|
-
}
|
|
633
|
-
// Check for resource loads (data exfiltration)
|
|
634
|
-
if (#{observe_resources} && resourceAttributes.includes(attrName)) {
|
|
635
|
-
console.warn('Potential Resource Load (Data Exfiltration): Attribute change', {
|
|
636
|
-
element: tagName,
|
|
637
|
-
id: mutation.target.id || 'N/A',
|
|
638
|
-
attribute: attrName,
|
|
639
|
-
oldValue: mutation.oldValue,
|
|
640
|
-
newValue: mutation.target.getAttribute(attrName),
|
|
641
|
-
outerHTML: mutation.target.outerHTML
|
|
642
|
-
});
|
|
643
|
-
}
|
|
644
|
-
} else if (mutation.type === 'characterData') {
|
|
645
|
-
if (mutation.target.parentElement) {
|
|
646
|
-
const parentTag = mutation.target.parentElement.tagName.toUpperCase();
|
|
647
|
-
if (parentTag === 'SCRIPT') {
|
|
648
|
-
console.warn('Potential DOM-XSS sink: Script content changed', {
|
|
649
|
-
scriptId: mutation.target.parentElement.id || 'N/A',
|
|
650
|
-
oldValue: mutation.oldValue,
|
|
651
|
-
newValue: mutation.target.textContent
|
|
652
|
-
});
|
|
653
|
-
} else if (parentTag === 'STYLE') {
|
|
654
|
-
console.warn('Potential DOM-XSS sink: Style content changed', {
|
|
655
|
-
styleId: mutation.target.parentElement.id || 'N/A',
|
|
656
|
-
oldValue: mutation.oldValue,
|
|
657
|
-
newValue: mutation.target.textContent
|
|
658
|
-
});
|
|
659
|
-
}
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
});
|
|
663
|
-
};
|
|
664
|
-
|
|
665
|
-
// Create and start the MutationObserver
|
|
666
|
-
const observer = new MutationObserver(callback);
|
|
667
|
-
observer.observe(targetNode, config);
|
|
668
|
-
|
|
669
|
-
// Function to stop the observer
|
|
670
|
-
window.hide_dom_mutations = () => {
|
|
671
|
-
observer.disconnect();
|
|
672
|
-
console.log('MutationObserver stopped.');
|
|
673
|
-
};
|
|
674
|
-
|
|
675
|
-
// Log instructions to console
|
|
676
|
-
console.log('MutationObserver started for DOM-based vulnerabilities. To stop, run: hide_dom_mutations()');
|
|
677
|
-
JAVASCRIPT
|
|
678
|
-
|
|
679
|
-
console(browser_obj: browser_obj, js: 'clear();')
|
|
680
|
-
browser_obj[:browser].execute_script(js)
|
|
681
|
-
rescue StandardError => e
|
|
682
|
-
raise e
|
|
683
|
-
end
|
|
684
|
-
|
|
685
|
-
# Supported Method Parameters::
|
|
686
|
-
# console_resp = PWN::Plugins::TransparentBrowser.hide_dom_mutations(
|
|
687
|
-
# browser_obj: browser_obj1,
|
|
688
|
-
# index: 'optional - index of tab to switch to (defaults to active tab)'
|
|
689
|
-
# )
|
|
690
|
-
|
|
691
|
-
public_class_method def self.hide_dom_mutations(opts = {})
|
|
692
|
-
browser_obj = opts[:browser_obj]
|
|
693
|
-
verified = verify_devtools_browser(browser_obj: browser_obj)
|
|
694
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
695
|
-
return unless verified
|
|
696
|
-
|
|
697
|
-
index = opts[:index]
|
|
698
|
-
jmp_tab(browser_obj: browser_obj, index: index) if index
|
|
699
|
-
|
|
700
|
-
jmp_devtools_panel(
|
|
701
|
-
browser_obj: browser_obj,
|
|
702
|
-
panel: :console
|
|
703
|
-
)
|
|
704
|
-
|
|
705
|
-
js = <<~JAVASCRIPT
|
|
706
|
-
if (typeof hide_dom_mutations === 'function') {
|
|
707
|
-
hide_dom_mutations();
|
|
708
|
-
console.log('DOM mutation observer and event listeners disabled.');
|
|
709
|
-
} else {
|
|
710
|
-
console.log('Error: hide_dom_mutations function not found. DOM mutation observer was not active.');
|
|
711
|
-
}
|
|
712
|
-
JAVASCRIPT
|
|
713
|
-
|
|
714
|
-
console(browser_obj: browser_obj, js: 'clear();')
|
|
715
|
-
browser_obj[:browser].execute_script(js)
|
|
716
|
-
rescue StandardError => e
|
|
717
|
-
raise e
|
|
718
|
-
end
|
|
719
|
-
# Supported Method Parameters::
|
|
720
|
-
# PWN::Plugins::TransparentBrowser.update_about_config(
|
|
721
|
-
# browser_obj: browser_obj1,
|
|
722
|
-
# key: 'required - key to update in about:config',
|
|
723
|
-
# value: 'required - value to set for key in about:config'
|
|
724
|
-
# )
|
|
725
|
-
|
|
726
|
-
public_class_method def self.update_about_config(opts = {})
|
|
727
|
-
browser_obj = opts[:browser_obj]
|
|
728
|
-
supported = %i[firefox headless_firefox]
|
|
729
|
-
verified = verify_devtools_browser(browser_obj: browser_obj, supported: supported)
|
|
730
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
731
|
-
return unless verified
|
|
732
|
-
|
|
733
|
-
key = opts[:key]
|
|
734
|
-
raise 'ERROR: key parameter is required' if key.nil?
|
|
735
|
-
|
|
736
|
-
value = opts[:value]
|
|
737
|
-
raise 'ERROR: value parameter is required' if value.nil?
|
|
738
|
-
|
|
739
|
-
browser_type = browser_obj[:type]
|
|
740
|
-
# chrome_types = %i[chrome headless_chrome]
|
|
741
|
-
firefox_types = %i[firefox headless_firefox]
|
|
742
|
-
|
|
743
|
-
browser_obj[:browser].goto('about:config')
|
|
744
|
-
# Confirmed working in Firefox
|
|
745
|
-
js = %{Services.prefs.setStringPref("#{key}", "#{value}")} if firefox_types.include?(browser_type)
|
|
746
|
-
console(browser_obj: browser_obj, js: js)
|
|
747
|
-
browser_obj[:browser].back
|
|
748
|
-
rescue Timeout::Error, Timeout::ExitException
|
|
749
|
-
console_resp
|
|
750
|
-
rescue StandardError => e
|
|
751
|
-
raise e
|
|
752
|
-
end
|
|
753
|
-
|
|
754
|
-
# Supported Method Parameters::
|
|
755
|
-
# tabs = PWN::Plugins::TransparentBrowser.list_tabs(
|
|
756
|
-
# browser_obj: 'required - browser_obj returned from #open method)'
|
|
757
|
-
# )
|
|
758
|
-
|
|
759
|
-
public_class_method def self.list_tabs(opts = {})
|
|
760
|
-
browser_obj = opts[:browser_obj]
|
|
761
|
-
verified = verify_devtools_browser(browser_obj: browser_obj)
|
|
762
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
763
|
-
return unless verified
|
|
764
|
-
|
|
765
|
-
current_window_handle = browser_obj[:browser].driver.window_handle
|
|
766
|
-
|
|
767
|
-
tabs_arr_hash = []
|
|
768
|
-
browser_obj[:browser].driver.window_handles.each do |window_handle|
|
|
769
|
-
# Skip DevTools tabs
|
|
770
|
-
browser_obj[:browser].driver.switch_to.window(window_handle)
|
|
771
|
-
title = browser_obj[:browser].execute_script('return document.title')
|
|
772
|
-
url = browser_obj[:browser].execute_script('return document.location.href')
|
|
773
|
-
next if url.include?('devtools://')
|
|
774
|
-
|
|
775
|
-
# Get title and URL without switching tabs
|
|
776
|
-
|
|
777
|
-
state = window_handle == current_window_handle ? :active : :inactive
|
|
778
|
-
|
|
779
|
-
tabs_arr_hash << { index: window_handle, title: title, url: url, state: state }
|
|
780
|
-
ensure
|
|
781
|
-
# Ensure we return to the original active tab
|
|
782
|
-
browser_obj[:browser].driver.switch_to.window(current_window_handle)
|
|
783
|
-
end
|
|
784
|
-
|
|
785
|
-
# Ensure we have a visible tab that's active
|
|
786
|
-
active_tab = tabs_arr_hash.find { |tab| tab[:state] == :active } || tabs_arr_hash.first
|
|
787
|
-
# Switch to the active tab if it exists
|
|
788
|
-
browser_obj[:browser].driver.switch_to.window(active_tab[:index]) if active_tab
|
|
789
|
-
|
|
790
|
-
tabs_arr_hash
|
|
791
|
-
rescue Selenium::WebDriver::Error::NoSuchWindowError => e
|
|
792
|
-
puts "Error: No valid window handles available (#{e.message})"
|
|
793
|
-
[] # Return empty array if no tabs are available
|
|
794
|
-
rescue StandardError => e
|
|
795
|
-
raise "Failed to list tabs: #{e.message}"
|
|
796
|
-
end
|
|
797
|
-
|
|
798
|
-
# Supported Method Parameters::
|
|
799
|
-
# tab = PWN::Plugins::TransparentBrowser.jmp_tab(
|
|
800
|
-
# browser_obj: 'required - browser_obj returned from #open method)',
|
|
801
|
-
# index: 'optional - index of tab to switch to (defaults to switching to next tab)',
|
|
802
|
-
# keyword: 'optional - keyword in title or url used to switch tabs (defaults to switching to next tab)'
|
|
803
|
-
# )
|
|
804
|
-
|
|
805
|
-
public_class_method def self.jmp_tab(opts = {})
|
|
806
|
-
browser_obj = opts[:browser_obj]
|
|
807
|
-
verified = verify_devtools_browser(browser_obj: browser_obj)
|
|
808
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
809
|
-
return unless verified
|
|
810
|
-
|
|
811
|
-
index = opts[:index]
|
|
812
|
-
keyword = opts[:keyword]
|
|
813
|
-
|
|
814
|
-
tabs_arr_hash = list_tabs(browser_obj: browser_obj)
|
|
815
|
-
|
|
816
|
-
if index.nil? && keyword.nil?
|
|
817
|
-
# If no keyword is provided, switch to the next tab in the list
|
|
818
|
-
active_tab_index = tabs_arr_hash.find_index { |tab| tab[:state] == :active }
|
|
819
|
-
next_tab_index = (active_tab_index + 1) % tabs_arr_hash.size
|
|
820
|
-
# Find value of :index key from tabs_arr_hash
|
|
821
|
-
tab_sel = tabs_arr_hash[next_tab_index]
|
|
822
|
-
elsif index
|
|
823
|
-
tab_sel = tabs_arr_hash.find { |tab| tab[:index] == index }
|
|
824
|
-
else
|
|
825
|
-
tab_sel = tabs_arr_hash.find { |tab| tab[:title].include?(keyword) || tab[:url].include?(keyword) }
|
|
826
|
-
end
|
|
827
|
-
|
|
828
|
-
if tab_sel.is_a?(Hash) && tab_sel[:index]
|
|
829
|
-
index = tab_sel[:index]
|
|
830
|
-
browser_obj[:browser].driver.switch_to.window(index)
|
|
831
|
-
else
|
|
832
|
-
tab_sel = { index: index, error: 'not found' }
|
|
833
|
-
end
|
|
834
|
-
|
|
835
|
-
tab_sel
|
|
836
|
-
rescue StandardError => e
|
|
837
|
-
raise e
|
|
838
|
-
end
|
|
839
|
-
|
|
840
|
-
# Supported Method Parameters::
|
|
841
|
-
# tab = PWN::Plugins::TransparentBrowser.new_tab(
|
|
842
|
-
# browser_obj: 'required - browser_obj returned from #open method)',
|
|
843
|
-
# url: 'optional - URL to open in new tab'
|
|
844
|
-
# )
|
|
845
|
-
|
|
846
|
-
public_class_method def self.new_tab(opts = {})
|
|
847
|
-
browser_obj = opts[:browser_obj]
|
|
848
|
-
verified = verify_devtools_browser(browser_obj: browser_obj)
|
|
849
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
850
|
-
return unless verified
|
|
851
|
-
|
|
852
|
-
url = opts[:url]
|
|
853
|
-
chrome_types = %i[chrome headless_chrome]
|
|
854
|
-
firefox_types = %i[firefox headless_firefox]
|
|
855
|
-
|
|
856
|
-
browser_type = browser_obj[:type]
|
|
857
|
-
|
|
858
|
-
if url.nil? || url.empty?
|
|
859
|
-
url = 'about:about' if firefox_types.include?(browser_type)
|
|
860
|
-
url = 'chrome://chrome-urls/' if chrome_types.include?(browser_type)
|
|
861
|
-
end
|
|
862
|
-
|
|
863
|
-
# Open a new tab
|
|
864
|
-
console(
|
|
865
|
-
browser_obj: browser_obj,
|
|
866
|
-
js: "window.open('#{url}', '_blank')",
|
|
867
|
-
return_to: :stdout
|
|
868
|
-
)
|
|
869
|
-
|
|
870
|
-
# tabs_arr_hash = list_tabs(browser_obj: browser_obj)
|
|
871
|
-
# new_tab_index = tabs_arr_hash.find { |tab| tab[:state] == :inactive && tab[:url] == url }[:index]
|
|
872
|
-
# jmp_tab(browser_obj: browser_obj, index: new_tab_index)
|
|
873
|
-
jmp_tab(browser_obj: browser_obj)
|
|
874
|
-
new_tab_index = browser_obj[:browser].driver.window_handles.last
|
|
875
|
-
|
|
876
|
-
rand_tab = SecureRandom.hex(8)
|
|
877
|
-
browser_obj[:browser].execute_script("document.title = 'about:about-#{rand_tab}'")
|
|
878
|
-
toggle_devtools(browser_obj: browser_obj) if browser_obj[:devtools]
|
|
879
|
-
|
|
880
|
-
{ index: new_tab_index, title: browser_obj[:browser].title, url: browser_obj[:browser].url, state: :active }
|
|
881
|
-
rescue StandardError => e
|
|
882
|
-
puts e.backtrace
|
|
883
|
-
raise e
|
|
884
|
-
end
|
|
885
|
-
|
|
886
|
-
# Supported Method Parameters::
|
|
887
|
-
# tab = PWN::Plugins::TransparentBrowser.close_tab(
|
|
888
|
-
# browser_obj: 'required - browser_obj returned from #open method)',
|
|
889
|
-
# index: 'optional - index of tab to close (defaults to closing active tab)',
|
|
890
|
-
# keyword: 'optional - keyword in title or url used to close tabs (defaults to closing active tab)'
|
|
891
|
-
# )
|
|
892
|
-
|
|
893
|
-
public_class_method def self.close_tab(opts = {})
|
|
894
|
-
browser_obj = opts[:browser_obj]
|
|
895
|
-
verified = verify_devtools_browser(browser_obj: browser_obj)
|
|
896
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
897
|
-
return unless verified
|
|
898
|
-
|
|
899
|
-
index = opts[:index]
|
|
900
|
-
keyword = opts[:keyword]
|
|
901
|
-
|
|
902
|
-
tabs_arr_hash = list_tabs(browser_obj: browser_obj)
|
|
903
|
-
browser_ready_to_close = true if tabs_arr_hash.length == 1
|
|
904
|
-
|
|
905
|
-
if browser_ready_to_close
|
|
906
|
-
close(browser_obj: browser_obj)
|
|
907
|
-
return [{ index: nil, title: nil, url: nil, state: :browser_closed }]
|
|
908
|
-
elsif index.nil? && keyword.nil?
|
|
909
|
-
index = browser_obj[:browser].driver.window_handle
|
|
910
|
-
browser_obj[:browser].driver.switch_to.window(index)
|
|
911
|
-
browser_obj[:browser].driver.close
|
|
912
|
-
new_tab_index_arr = browser_obj[:browser].driver.window_handles
|
|
913
|
-
if new_tab_index_arr.any?
|
|
914
|
-
new_tab_index = new_tab_index_arr.last
|
|
915
|
-
browser_obj[:browser].driver.switch_to.window(new_tab_index)
|
|
916
|
-
end
|
|
917
|
-
elsif index
|
|
918
|
-
browser_obj[:browser].driver.switch_to.window(index)
|
|
919
|
-
browser_obj[:browser].driver.close
|
|
920
|
-
new_tab_index_arr = browser_obj[:browser].driver.window_handles
|
|
921
|
-
if new_tab_index_arr.any?
|
|
922
|
-
new_tab_index = new_tab_index_arr.last
|
|
923
|
-
browser_obj[:browser].driver.switch_to.window(new_tab_index)
|
|
924
|
-
end
|
|
925
|
-
else
|
|
926
|
-
active_tab = tabs_arr_hash.find { |tab| tab[:state] == :active }
|
|
927
|
-
if active_tab[:url].include?(keyword)
|
|
928
|
-
inactive_tabs = tabs_arr_hash.reject { |tab| tab[:url] == browser_obj[:browser].url }
|
|
929
|
-
if inactive_tabs.any?
|
|
930
|
-
tab_to_activate = inactive_tabs.last[:url]
|
|
931
|
-
jmp_tab(browser_obj: browser_obj, keyword: tab_to_activate)
|
|
932
|
-
end
|
|
933
|
-
end
|
|
934
|
-
all_tabs = browser_obj[:browser].windows
|
|
935
|
-
|
|
936
|
-
tabs_to_close = all_tabs.select { |tab| tab.title.include?(keyword) || tab.url.include?(keyword) }
|
|
937
|
-
tabs_to_close.each(&:close)
|
|
938
|
-
end
|
|
939
|
-
|
|
940
|
-
list_tabs(browser_obj: browser_obj)
|
|
941
|
-
rescue StandardError => e
|
|
942
|
-
raise e
|
|
943
|
-
end
|
|
944
|
-
|
|
945
|
-
# Supported Method Parameters::
|
|
946
|
-
# current_dom = PWN::Plugins::TransparentBrowser.dom(
|
|
947
|
-
# browser_obj: 'required - browser_obj returned from #open method)'
|
|
948
|
-
# )
|
|
949
|
-
|
|
950
|
-
public_class_method def self.dom(opts = {})
|
|
951
|
-
browser_obj = opts[:browser_obj]
|
|
952
|
-
verified = verify_devtools_browser(browser_obj: browser_obj)
|
|
953
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
954
|
-
return unless verified
|
|
955
|
-
|
|
956
|
-
dom_str = console(browser_obj: browser_obj, js: 'document.documentElement.outerHTML', return_to: :stdout)
|
|
957
|
-
raise 'DOM capture failed: returned nil or empty string. Check DevTools connection.' if dom_str.nil? || dom_str.strip.empty?
|
|
958
|
-
|
|
959
|
-
Nokogiri::HTML.parse(dom_str)
|
|
960
|
-
rescue StandardError => e
|
|
961
|
-
raise e
|
|
962
|
-
end
|
|
963
|
-
|
|
964
|
-
# Supported Method Parameters::
|
|
965
|
-
# page_state = PWN::Plugins::TransparentBrowser.get_page_state(
|
|
966
|
-
# browser_obj: 'required - browser_obj returned from #open method)'
|
|
967
|
-
# )
|
|
968
|
-
|
|
969
|
-
public_class_method def self.get_page_state(opts = {})
|
|
970
|
-
browser_obj = opts[:browser_obj]
|
|
971
|
-
verified = verify_devtools_browser(browser_obj: browser_obj)
|
|
972
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
973
|
-
return unless verified
|
|
974
|
-
|
|
975
|
-
js = <<~JS.strip
|
|
976
|
-
(function() {
|
|
977
|
-
try {
|
|
978
|
-
let ls = {};
|
|
979
|
-
for (let i = 0; i < localStorage.length; i++) {
|
|
980
|
-
let key = localStorage.key(i);
|
|
981
|
-
ls[key] = localStorage.getItem(key);
|
|
982
|
-
}
|
|
983
|
-
let ss = {};
|
|
984
|
-
for (let i = 0; i < sessionStorage.length; i++) {
|
|
985
|
-
let key = sessionStorage.key(i);
|
|
986
|
-
ss[key] = sessionStorage.getItem(key);
|
|
987
|
-
}
|
|
988
|
-
|
|
989
|
-
let scripts = Array.from(document.scripts).map(s => ({
|
|
990
|
-
src: s.src,
|
|
991
|
-
innerHTML: s.innerHTML
|
|
992
|
-
})).filter(s => s.src || s.innerHTML);
|
|
993
|
-
|
|
994
|
-
let stylesheets = Array.from(document.querySelectorAll('link[rel="stylesheet"]')).map(l => l.href).filter(h => h);
|
|
995
|
-
|
|
996
|
-
let inline_styles = Array.from(document.querySelectorAll('style')).map(s => s.innerHTML).filter(c => c);
|
|
997
|
-
|
|
998
|
-
let forms = Array.from(document.forms).map(f => ({
|
|
999
|
-
action: f.action,
|
|
1000
|
-
method: f.method,
|
|
1001
|
-
elements: Array.from(f.elements).map(e => ({
|
|
1002
|
-
name: e.name,
|
|
1003
|
-
type: e.type,
|
|
1004
|
-
value: e.value
|
|
1005
|
-
}))
|
|
1006
|
-
}));
|
|
1007
|
-
|
|
1008
|
-
let iframes = Array.from(document.querySelectorAll('iframe')).map(i => i.src).filter(s => s);
|
|
1009
|
-
|
|
1010
|
-
let csp_meta = document.querySelector('meta[http-equiv="Content-Security-Policy"]');
|
|
1011
|
-
let csp = csp_meta ? csp_meta.content : null;
|
|
1012
|
-
|
|
1013
|
-
let feature_policy = [];
|
|
1014
|
-
if (document.featurePolicy) {
|
|
1015
|
-
feature_policy = document.featurePolicy.allowedFeatures().sort();
|
|
1016
|
-
}
|
|
1017
|
-
|
|
1018
|
-
let is_framed = false;
|
|
1019
|
-
try {
|
|
1020
|
-
if (window.top !== window.self) {
|
|
1021
|
-
is_framed = true;
|
|
1022
|
-
}
|
|
1023
|
-
} catch (e) {
|
|
1024
|
-
is_framed = true;
|
|
1025
|
-
}
|
|
1026
|
-
|
|
1027
|
-
let resources = window.performance.getEntriesByType('resource').map(e => ({
|
|
1028
|
-
name: e.name,
|
|
1029
|
-
initiatorType: e.initiatorType
|
|
1030
|
-
}));
|
|
1031
|
-
|
|
1032
|
-
// Enhanced globals capture with values
|
|
1033
|
-
let globals = {};
|
|
1034
|
-
let propNames = Object.getOwnPropertyNames(window).sort();
|
|
1035
|
-
const safeStringify = (value, depth = 0) => {
|
|
1036
|
-
if (depth > 5) return '[Max depth exceeded]'; // Prevent deep recursion
|
|
1037
|
-
try {
|
|
1038
|
-
return JSON.stringify(value, (key, val) => {
|
|
1039
|
-
if (typeof val === 'function') {
|
|
1040
|
-
return val.toString(); // Capture function source
|
|
1041
|
-
} else if (typeof val === 'symbol') {
|
|
1042
|
-
return val.toString();
|
|
1043
|
-
} else if (val === window) {
|
|
1044
|
-
return '[Window reference]'; // Avoid circularity
|
|
1045
|
-
} else if (val && typeof val === 'object') {
|
|
1046
|
-
if (depth > 5) return '[Object (depth limit)]';
|
|
1047
|
-
return val; // Let JSON handle, recurse with depth
|
|
1048
|
-
}
|
|
1049
|
-
return val;
|
|
1050
|
-
});
|
|
1051
|
-
} catch (e) {
|
|
1052
|
-
return '[Stringify error: ' + e.message + ']';
|
|
1053
|
-
}
|
|
1054
|
-
};
|
|
1055
|
-
|
|
1056
|
-
for (let name of propNames) {
|
|
1057
|
-
try {
|
|
1058
|
-
let value = window[name];
|
|
1059
|
-
globals[name] = safeStringify(value);
|
|
1060
|
-
} catch (e) {
|
|
1061
|
-
globals[name] = '[Access error: ' + e.message + ']';
|
|
1062
|
-
}
|
|
1063
|
-
}
|
|
1064
|
-
|
|
1065
|
-
return JSON.stringify({
|
|
1066
|
-
cookies: document.cookie,
|
|
1067
|
-
localStorage: ls,
|
|
1068
|
-
sessionStorage: ss,
|
|
1069
|
-
globals: globals, // Now an object with name: stringified_value
|
|
1070
|
-
scripts: scripts,
|
|
1071
|
-
stylesheets: stylesheets,
|
|
1072
|
-
inline_styles: inline_styles,
|
|
1073
|
-
stack: new Error().stack,
|
|
1074
|
-
location: {
|
|
1075
|
-
href: location.href,
|
|
1076
|
-
origin: location.origin,
|
|
1077
|
-
pathname: location.pathname,
|
|
1078
|
-
search: location.search,
|
|
1079
|
-
hash: location.hash
|
|
1080
|
-
},
|
|
1081
|
-
referrer: document.referrer,
|
|
1082
|
-
userAgent: navigator.userAgent,
|
|
1083
|
-
html_snapshot: document.documentElement.outerHTML,
|
|
1084
|
-
forms: forms,
|
|
1085
|
-
iframes: iframes,
|
|
1086
|
-
csp: csp,
|
|
1087
|
-
feature_policy: feature_policy,
|
|
1088
|
-
is_framed: is_framed,
|
|
1089
|
-
has_service_worker: 'serviceWorker' in navigator,
|
|
1090
|
-
resources: resources
|
|
1091
|
-
});
|
|
1092
|
-
} catch (e) {
|
|
1093
|
-
return JSON.stringify({
|
|
1094
|
-
error: e.message,
|
|
1095
|
-
stack: e.stack
|
|
1096
|
-
});
|
|
1097
|
-
}
|
|
1098
|
-
})()
|
|
1099
|
-
JS
|
|
1100
|
-
|
|
1101
|
-
browser_obj[:devtools].send_cmd('Console.clearMessages')
|
|
1102
|
-
browser_obj[:devtools].send_cmd('Log.clear')
|
|
1103
|
-
console_events = []
|
|
1104
|
-
browser_obj[:browser].driver.on_log_event(:console) { |event| console_events.push(event) }
|
|
1105
|
-
|
|
1106
|
-
# page_state = console(browser_obj: browser_obj, js: js, return_to: :stdout)
|
|
1107
|
-
console_cmd = { expression: js }
|
|
1108
|
-
runtime_resp = browser_obj[:devtools].send_cmd('Runtime.evaluate', **console_cmd)
|
|
1109
|
-
page_state = runtime_resp['result']['result']['value']
|
|
1110
|
-
JSON.parse(page_state, symbolize_names: true)
|
|
1111
|
-
rescue JSON::ParserError => e
|
|
1112
|
-
raise "Failed to parse state JSON: #{e.message}. Raw output: #{state_json.inspect}"
|
|
1113
|
-
rescue StandardError => e
|
|
1114
|
-
raise e
|
|
1115
|
-
end
|
|
1116
|
-
|
|
1117
|
-
# Supported Method Parameters::
|
|
1118
|
-
# messages = PWN::Plugins::TransparentBrowser.devtools_websocket_messages(
|
|
1119
|
-
# browser_obj: 'required - browser_obj returned from #open method)'
|
|
1120
|
-
# )
|
|
1121
|
-
|
|
1122
|
-
public_class_method def self.devtools_websocket_messages(opts = {})
|
|
1123
|
-
browser_obj = opts[:browser_obj]
|
|
1124
|
-
verified = verify_devtools_browser(browser_obj: browser_obj)
|
|
1125
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
1126
|
-
return unless verified
|
|
1127
|
-
|
|
1128
|
-
devtools = browser_obj[:devtools]
|
|
1129
|
-
websocket = devtools.instance_variable_get(:@ws)
|
|
1130
|
-
websocket.instance_variable_get(:@messages)[nil]
|
|
1131
|
-
rescue StandardError => e
|
|
1132
|
-
raise e
|
|
1133
|
-
end
|
|
1134
|
-
|
|
1135
|
-
# Supported Method Parameters::
|
|
1136
|
-
# PWN::Plugins::TransparentBrowser.debugger(
|
|
1137
|
-
# browser_obj: 'required - browser_obj returned from #open method)',
|
|
1138
|
-
# action: 'optional - action to take :enable|:pause|:resume|:disable (Defaults to :enable)',
|
|
1139
|
-
# )
|
|
1140
|
-
|
|
1141
|
-
public_class_method def self.debugger(opts = {})
|
|
1142
|
-
browser_obj = opts[:browser_obj]
|
|
1143
|
-
verified = verify_devtools_browser(browser_obj: browser_obj)
|
|
1144
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
1145
|
-
return unless verified
|
|
1146
|
-
|
|
1147
|
-
valid_actions = %i[enable pause resume disable]
|
|
1148
|
-
action = opts[:action] ||= :enable
|
|
1149
|
-
action = action.to_s.downcase.to_sym
|
|
1150
|
-
raise 'ERROR: action parameter must be :enable|:pause|:resume|:disable' unless valid_actions.include?(action)
|
|
1151
|
-
|
|
1152
|
-
devtools = browser_obj[:devtools]
|
|
1153
|
-
debugger_state = devtools.instance_variable_get(:@debugger_state) || {}
|
|
1154
|
-
breakpoint_arr = debugger_state[:breakpoints] || []
|
|
1155
|
-
|
|
1156
|
-
method = nil
|
|
1157
|
-
case action
|
|
1158
|
-
when :enable
|
|
1159
|
-
devtools.dom.enable
|
|
1160
|
-
devtools.log.disable
|
|
1161
|
-
devtools.network.disable
|
|
1162
|
-
devtools.page.disable
|
|
1163
|
-
devtools.runtime.disable
|
|
1164
|
-
|
|
1165
|
-
method = 'Debugger.scriptParsed'
|
|
1166
|
-
callbacks_to_delete = devtools.callbacks.keys.reject { |k| k == 'Target.atta`chedToTarget' }
|
|
1167
|
-
# until devtools.callbacks.keys.include?(method) && breakpoint_arr.any?
|
|
1168
|
-
until breakpoint_arr.any?
|
|
1169
|
-
callbacks_to_delete.each { |method| devtools.callbacks.delete(method) }
|
|
1170
|
-
breakpoint_set = false
|
|
1171
|
-
# devtools.dom.disable
|
|
1172
|
-
devtools.debugger.disable
|
|
1173
|
-
devtools.debugger.on(:script_parsed) do |params|
|
|
1174
|
-
url = params['url']
|
|
1175
|
-
next if breakpoint_set || url.include?('devtools://') || url.empty?
|
|
1176
|
-
|
|
1177
|
-
breakpoint_set = true
|
|
1178
|
-
puts url
|
|
1179
|
-
bcmd = 'Debugger.setBreakpoint'
|
|
1180
|
-
script_id = params['scriptId']
|
|
1181
|
-
line = params['startLine']
|
|
1182
|
-
column = params['startColumn']
|
|
1183
|
-
location = { scriptId: script_id, lineNumber: line, columnNumber: column }
|
|
1184
|
-
breakpoint = devtools.send_cmd(bcmd, location: location)
|
|
1185
|
-
breakpoint['result']['breakpointId'] = "#{bcmd}.#{script_id}.#{line}.#{column}.#{SecureRandom.uuid}"
|
|
1186
|
-
breakpoint['id'] = breakpoint['id'].to_s
|
|
1187
|
-
breakpoint['url'] = url
|
|
1188
|
-
breakpoint['caught'] = false
|
|
1189
|
-
breakpoint_arr.push(breakpoint)
|
|
1190
|
-
debugger_state[:breakpoints] = breakpoint_arr
|
|
1191
|
-
devtools.instance_variable_set(:@debugger_state, debugger_state)
|
|
1192
|
-
|
|
1193
|
-
puts "Breakpoint set in #{url} at line #{line}, column #{column}: #{breakpoint}"
|
|
1194
|
-
puts params.inspect
|
|
1195
|
-
end
|
|
1196
|
-
devtools.debugger.enable
|
|
1197
|
-
end
|
|
1198
|
-
devtools.callbacks.delete(method)
|
|
1199
|
-
method = 'Debugger.enabled'
|
|
1200
|
-
when :pause
|
|
1201
|
-
method = 'Debugger.paused'
|
|
1202
|
-
callbacks_to_delete = devtools.callbacks.keys.reject { |k| k == 'Target.attachedToTarget' }
|
|
1203
|
-
Timeout.timeout(30) { browser_obj[:browser].refresh }
|
|
1204
|
-
until devtools.callbacks.keys.include?(method) && breakpoint_arr.any? { |bp| bp['caught'] == true }
|
|
1205
|
-
devtools.callbacks.delete(method)
|
|
1206
|
-
devtools.debugger.resume
|
|
1207
|
-
devtools.debugger.on(:paused) do |params|
|
|
1208
|
-
breakpoint_id_caught = params['callFrames'].first['location']['scriptId']
|
|
1209
|
-
breakpoint_arr.each_with_index do |bp, idx|
|
|
1210
|
-
next unless bp['id'] == breakpoint_id_caught
|
|
1211
|
-
|
|
1212
|
-
bp['caught'] = true
|
|
1213
|
-
breakpoint_arr[idx] = bp
|
|
1214
|
-
debugger_state[:breakpoints] = breakpoint_arr
|
|
1215
|
-
devtools.instance_variable_set(:@debugger_state, debugger_state)
|
|
1216
|
-
end
|
|
1217
|
-
# puts "TARGET BREAKPOINTS: #{breakpoint_arr.inspect}"
|
|
1218
|
-
# puts "PARAMS Observerd: #{params.inspect}"
|
|
1219
|
-
debugger_state = devtools.instance_variable_get(:@debugger_state)
|
|
1220
|
-
puts devtools.callbacks.inspect
|
|
1221
|
-
puts debugger_state.inspect
|
|
1222
|
-
end
|
|
1223
|
-
devtools.debugger.pause
|
|
1224
|
-
# browser_obj[:browser].refresh
|
|
1225
|
-
debugger_state = devtools.instance_variable_get(:@debugger_state)
|
|
1226
|
-
breakpoint_arr = debugger_state[:breakpoints]
|
|
1227
|
-
end
|
|
1228
|
-
devtools.callbacks.delete(method)
|
|
1229
|
-
when :resume
|
|
1230
|
-
method = 'Debugger.resumed'
|
|
1231
|
-
callbacks_to_delete = devtools.callbacks.keys.reject { |k| k == 'Target.attachedToTarget' }
|
|
1232
|
-
callbacks_to_delete.each { |method| devtools.callbacks.delete(method) }
|
|
1233
|
-
devtools.debugger.resume until devtools.callbacks.keys.include?(method)
|
|
1234
|
-
when :disable
|
|
1235
|
-
callbacks_to_delete = devtools.callbacks.keys.reject { |k| k == 'Target.attachedToTarget' }
|
|
1236
|
-
callbacks_to_delete.each { |method| devtools.callbacks.delete(method) }
|
|
1237
|
-
devtools.debugger.disable
|
|
1238
|
-
method = 'Debugger.disabled'
|
|
1239
|
-
end
|
|
1240
|
-
|
|
1241
|
-
devtools
|
|
1242
|
-
rescue Selenium::WebDriver::Error::WebDriverError => e
|
|
1243
|
-
puts e.message
|
|
1244
|
-
rescue StandardError => e
|
|
1245
|
-
raise e
|
|
1246
|
-
ensure
|
|
1247
|
-
debugger_state[:method] = method
|
|
1248
|
-
devtools.instance_variable_set(:@debugger_state, debugger_state) if debugger_state.is_a?(Hash)
|
|
1249
|
-
end
|
|
1250
|
-
|
|
1251
|
-
# Supported Method Parameters::
|
|
1252
|
-
# page_state_arr = PWN::Plugins::TransparentBrowser.get_targets(
|
|
1253
|
-
# browser_obj: 'required - browser_obj returned from #open method)'
|
|
1254
|
-
# )
|
|
1255
|
-
|
|
1256
|
-
public_class_method def self.get_targets(opts = {})
|
|
1257
|
-
browser_obj = opts[:browser_obj]
|
|
1258
|
-
supported = %i[chrome headless_chrome]
|
|
1259
|
-
verified = verify_devtools_browser(browser_obj: browser_obj, supported: supported)
|
|
1260
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
1261
|
-
return unless verified
|
|
1262
|
-
|
|
1263
|
-
devtools = browser_obj[:devtools]
|
|
1264
|
-
bcmd = 'Target.getTargets'
|
|
1265
|
-
devtools.send_cmd(bcmd)
|
|
1266
|
-
rescue StandardError => e
|
|
1267
|
-
raise e
|
|
1268
|
-
end
|
|
1269
|
-
|
|
1270
|
-
# Supported Method Parameters::
|
|
1271
|
-
# page_state_arr = PWN::Plugins::TransparentBrowser.breakpoint_locations(
|
|
1272
|
-
# browser_obj: 'required - browser_obj returned from #open method)'
|
|
1273
|
-
# )
|
|
1274
|
-
|
|
1275
|
-
public_class_method def self.breakpoint_locations(opts = {})
|
|
1276
|
-
browser_obj = opts[:browser_obj]
|
|
1277
|
-
supported = %i[chrome headless_chrome]
|
|
1278
|
-
verified = verify_devtools_browser(browser_obj: browser_obj, supported: supported)
|
|
1279
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
1280
|
-
return unless verified
|
|
1281
|
-
|
|
1282
|
-
valid_methods = %w[Debugger.scriptParsed Debugger.paused Debugger.resumed]
|
|
1283
|
-
devtools = browser_obj[:devtools]
|
|
1284
|
-
ws_msg = devtools_websocket_messages(browser_obj: browser_obj)
|
|
1285
|
-
method = ws_msg['method']
|
|
1286
|
-
raise "ERROR: Unsupported method: #{method}" unless valid_methods.include?(method)
|
|
1287
|
-
|
|
1288
|
-
case method
|
|
1289
|
-
when 'Debugger.resumed', 'Debugger.paused'
|
|
1290
|
-
script_id = ws_msg['params']['callFrames'].first['location']['scriptId'].to_s
|
|
1291
|
-
when 'Debugger.scriptParsed'
|
|
1292
|
-
script_id = ws_msg['params']['scriptId'].to_s
|
|
1293
|
-
end
|
|
1294
|
-
|
|
1295
|
-
puts "Method: #{method}"
|
|
1296
|
-
puts "Fetching possible breakpoints for script ID: #{script_id}..."
|
|
1297
|
-
bcmd = 'Debugger.getPossibleBreakpoints'
|
|
1298
|
-
devtools.send_cmd(bcmd, start: { scriptId: script_id, lineNumber: 0, columnNumber: 0 })
|
|
1299
|
-
rescue StandardError => e
|
|
1300
|
-
raise e
|
|
1301
|
-
end
|
|
1302
|
-
|
|
1303
|
-
# Supported Method Parameters::
|
|
1304
|
-
# page_state_arr = PWN::Plugins::TransparentBrowser.step(
|
|
1305
|
-
# browser_obj: 'required - browser_obj returned from #open method)',
|
|
1306
|
-
# action: 'optional - action to take :into|:out|:over (Defaults to :into)',
|
|
1307
|
-
# steps: 'optional - number of steps taken (Defaults to 1)'
|
|
1308
|
-
# )
|
|
1309
|
-
|
|
1310
|
-
public_class_method def self.step(opts = {})
|
|
1311
|
-
browser_obj = opts[:browser_obj]
|
|
1312
|
-
supported = %i[chrome headless_chrome]
|
|
1313
|
-
verified = verify_devtools_browser(browser_obj: browser_obj, supported: supported)
|
|
1314
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
1315
|
-
return unless verified
|
|
1316
|
-
|
|
1317
|
-
valid_actions = %i[into out over]
|
|
1318
|
-
action = opts[:action] ||= :into
|
|
1319
|
-
action = action.to_s.downcase.to_sym
|
|
1320
|
-
raise 'ERROR: action parameter must be :into|:out|:over' unless valid_actions.include?(action)
|
|
1321
|
-
|
|
1322
|
-
steps = opts[:steps].to_i
|
|
1323
|
-
steps = 1 if steps.zero? || steps.negative?
|
|
1324
|
-
|
|
1325
|
-
devtools = browser_obj[:devtools]
|
|
1326
|
-
ws_msg = devtools_websocket_messages(browser_obj: browser_obj)
|
|
1327
|
-
method = ws_msg['method']
|
|
1328
|
-
|
|
1329
|
-
debugger_state = devtools.instance_variable_get(:@debugger_state)
|
|
1330
|
-
debugger_state[:method] = method
|
|
1331
|
-
devtools.instance_variable_set(:@debugger_state, debugger_state)
|
|
1332
|
-
|
|
1333
|
-
valid_methods = %w[Debugger.scriptParsed Debugger.paused Debugger.resumed]
|
|
1334
|
-
devtools = browser_obj[:devtools]
|
|
1335
|
-
ws_msg = devtools_websocket_messages(browser_obj: browser_obj)
|
|
1336
|
-
method = ws_msg['method']
|
|
1337
|
-
raise "ERROR: Unsupported method: #{method}" unless valid_methods.include?(method)
|
|
1338
|
-
|
|
1339
|
-
steps_arr = []
|
|
1340
|
-
cursor_termination_chars = %w[; , . ( ) { } = |]
|
|
1341
|
-
steps.times do |s|
|
|
1342
|
-
step_num = s + 1
|
|
1343
|
-
puts "Stepping #{action} (step #{step_num}/#{steps})..."
|
|
1344
|
-
|
|
1345
|
-
method = 'Debugger.resumed'
|
|
1346
|
-
case action
|
|
1347
|
-
when :into
|
|
1348
|
-
devtools.debugger.step_into until devtools.callbacks.keys.include?(method)
|
|
1349
|
-
when :out
|
|
1350
|
-
devtools.debugger.step_out until devtools.callbacks.keys.include?(method)
|
|
1351
|
-
when :over
|
|
1352
|
-
devtools.debugger.step_over until devtools.callbacks.keys.include?(method)
|
|
1353
|
-
end
|
|
1354
|
-
devtools.callbacks.delete(method)
|
|
1355
|
-
|
|
1356
|
-
method = 'Debugger.paused'
|
|
1357
|
-
devtools.debugger.pause until devtools.callbacks.keys.include?(method)
|
|
1358
|
-
devtools.callbacks.delete(method)
|
|
1359
|
-
|
|
1360
|
-
ws_msg = devtools_websocket_messages(browser_obj: browser_obj)
|
|
1361
|
-
ws_msg_params = ws_msg['params']
|
|
1362
|
-
ws_msg_call_frames = ws_msg_params['callFrames'].first
|
|
1363
|
-
ws_msg_scope_chain_local = ws_msg_call_frames['scopeChain'].find { |scope| scope['type'] == 'local' }
|
|
1364
|
-
next unless ws_msg_scope_chain_local.is_a?(Hash)
|
|
1365
|
-
|
|
1366
|
-
ws_msg_scope_chain_block = ws_msg_call_frames['scopeChain'].find { |scope| scope['type'] == 'block' }
|
|
1367
|
-
|
|
1368
|
-
cursor_location = ws_msg_call_frames['location']
|
|
1369
|
-
cursor_line_num = cursor_location['lineNumber']
|
|
1370
|
-
cursor_column_num = cursor_location['columnNumber']
|
|
1371
|
-
|
|
1372
|
-
script_id = cursor_location['scriptId']
|
|
1373
|
-
|
|
1374
|
-
start_location = ws_msg_scope_chain_local['startLocation']
|
|
1375
|
-
start_line_num = start_location['lineNumber']
|
|
1376
|
-
start_column_num = start_location['columnNumber']
|
|
1377
|
-
|
|
1378
|
-
end_location = ws_msg_scope_chain_local['endLocation']
|
|
1379
|
-
# end_location_block = ws_msg_scope_chain_block['endLocation']
|
|
1380
|
-
# puts "TEST: #{end_location - end_location_block}"
|
|
1381
|
-
end_line_num = end_location['lineNumber']
|
|
1382
|
-
end_column_num = end_location['columnNumber']
|
|
1383
|
-
|
|
1384
|
-
source_obj = devtools.debugger.get_script_source(script_id: script_id)
|
|
1385
|
-
full_source_code = source_obj['result']['scriptSource']
|
|
1386
|
-
|
|
1387
|
-
source_lines = full_source_code.split("\n")
|
|
1388
|
-
# puts source_lines.inspect
|
|
1389
|
-
source_lines_range = source_lines[start_line_num..end_line_num]
|
|
1390
|
-
next if source_lines_range.nil?
|
|
1391
|
-
|
|
1392
|
-
source_lines_str = source_lines_range.join("\n")
|
|
1393
|
-
source_to_review = source_lines_str[start_column_num..end_column_num]
|
|
1394
|
-
current_step = source_lines_str[cursor_column_num..end_column_num]
|
|
1395
|
-
|
|
1396
|
-
# TODO: leverage ANSI escape codes to highlight current_step to red
|
|
1397
|
-
# puts ws_msg.inspect
|
|
1398
|
-
# puts "\n"
|
|
1399
|
-
# puts ws_msg_call_frames['scopeChain'].inspect
|
|
1400
|
-
# puts "\n"
|
|
1401
|
-
cursor_terminated = false
|
|
1402
|
-
source_to_review.each_char.with_index do |char, idx|
|
|
1403
|
-
cursor_start_offset = cursor_column_num - start_column_num
|
|
1404
|
-
cursor_end_offset = end_column_num - start_column_num
|
|
1405
|
-
|
|
1406
|
-
if idx >= cursor_start_offset && !cursor_terminated
|
|
1407
|
-
cursor_terminated = true if cursor_termination_chars.include?(char)
|
|
1408
|
-
print char if cursor_terminated
|
|
1409
|
-
print "\001\e[31m\002#{char}\001\e[0m\002" unless cursor_terminated
|
|
1410
|
-
else
|
|
1411
|
-
print char
|
|
1412
|
-
end
|
|
1413
|
-
end
|
|
1414
|
-
|
|
1415
|
-
if current_step.length.positive?
|
|
1416
|
-
system_role_content = "Being an expert penetration tester skilled in code analysis, debugging, and exploitation while stepping through JavaScript in a Chrome DevTools debugging session: 1. Your sole purpose is to analyze each JavaScript step and generate an Exploit Prediction Scoring System (EPSS) score between 0% - 100%. The step currently resides in this block of JavaScript:\n```\n#{source_to_review}\n```\n2. If the score is >= 75%, generate a JavaScript proof-of-concept that would allow a threat actor to directly exploit or target a user for exploitation (i.e. no self-exploit). 3. If the EPSS score is >= 75% also provide a code fix. *** If the EPSS score is < 75%, no explanations or summaries - just the EPSS score."
|
|
1417
|
-
|
|
1418
|
-
ai_analysis = PWN::AI::Introspection.reflect_on(
|
|
1419
|
-
system_role_content: system_role_content,
|
|
1420
|
-
request: current_step,
|
|
1421
|
-
suppress_pii_output: true
|
|
1422
|
-
)
|
|
1423
|
-
puts "^^^ #{ai_analysis}" unless ai_analysis.nil?
|
|
1424
|
-
end
|
|
1425
|
-
puts "\n" * 3
|
|
1426
|
-
|
|
1427
|
-
step_hash = {
|
|
1428
|
-
step: step_num,
|
|
1429
|
-
action: action,
|
|
1430
|
-
source: current_step
|
|
1431
|
-
}
|
|
1432
|
-
|
|
1433
|
-
steps_arr.push(step_hash)
|
|
1434
|
-
end
|
|
1435
|
-
|
|
1436
|
-
steps_arr
|
|
1437
|
-
rescue Selenium::WebDriver::Error::WebDriverError
|
|
1438
|
-
devtools
|
|
1439
|
-
rescue StandardError => e
|
|
1440
|
-
raise e
|
|
1441
|
-
end
|
|
1442
|
-
|
|
1443
|
-
# Supported Method Parameters::
|
|
1444
|
-
# PWN::Plugins::TransparentBrowser.toggle_devtools(
|
|
1445
|
-
# browser_obj: 'required - browser_obj returned from #open method)'
|
|
1446
|
-
# )
|
|
1447
|
-
|
|
1448
|
-
public_class_method def self.toggle_devtools(opts = {})
|
|
1449
|
-
browser_obj = opts[:browser_obj]
|
|
1450
|
-
verified = verify_devtools_browser(browser_obj: browser_obj)
|
|
1451
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
1452
|
-
return unless verified
|
|
1453
|
-
|
|
1454
|
-
# TODO: Find replacement for hotkey - there must be a better way.
|
|
1455
|
-
browser_obj[:browser].send_keys(:f12)
|
|
1456
|
-
rescue StandardError => e
|
|
1457
|
-
raise e
|
|
1458
|
-
end
|
|
1459
|
-
|
|
1460
|
-
# Supported Method Parameters::
|
|
1461
|
-
# PWN::Plugins::TransparentBrowser.jmp_devtools_panel(
|
|
1462
|
-
# browser_obj: 'required - browser_obj returned from #open method)',
|
|
1463
|
-
# panel: 'optional - panel to switch to :elements|:inspector|:console|:debugger|:sources|:network
|
|
1464
|
-
# )
|
|
1465
|
-
|
|
1466
|
-
public_class_method def self.jmp_devtools_panel(opts = {})
|
|
1467
|
-
browser_obj = opts[:browser_obj]
|
|
1468
|
-
verified = verify_devtools_browser(browser_obj: browser_obj)
|
|
1469
|
-
puts 'This browser is not supported for DevTools operations.' unless verified
|
|
1470
|
-
return unless verified
|
|
1471
|
-
|
|
1472
|
-
panel = opts[:panel] ||= :elements
|
|
1473
|
-
browser = browser_obj[:browser]
|
|
1474
|
-
browser_type = browser_obj[:type]
|
|
1475
|
-
firefox_types = %i[firefox headless_firefox]
|
|
1476
|
-
chrome_types = %i[chrome headless_chrome]
|
|
1477
|
-
|
|
1478
|
-
# TODO: Find replacement for hotkey - there must be a better way.
|
|
1479
|
-
hotkey = []
|
|
1480
|
-
case PWN::Plugins::DetectOS.type
|
|
1481
|
-
when :linux, :openbsd, :windows
|
|
1482
|
-
hotkey = %i[control shift]
|
|
1483
|
-
when :macos
|
|
1484
|
-
hotkey = %i[command option]
|
|
1485
|
-
end
|
|
1486
|
-
|
|
1487
|
-
case panel
|
|
1488
|
-
when :elements, :inspector
|
|
1489
|
-
hotkey.push('i') if chrome_types.include?(browser_type)
|
|
1490
|
-
hotkey.push('c') if firefox_types.include?(browser_type)
|
|
1491
|
-
when :console
|
|
1492
|
-
hotkey.push('j') if chrome_types.include?(browser_type)
|
|
1493
|
-
hotkey.push('k') if firefox_types.include?(browser_type)
|
|
1494
|
-
when :debugger, :sources
|
|
1495
|
-
hotkey.push('s') if chrome_types.include?(browser_type)
|
|
1496
|
-
if firefox_types.include?(browser_type)
|
|
1497
|
-
# If we're in the console, we need to switch to the inspector first
|
|
1498
|
-
jmp_devtools_panel(browser_obj: browser_obj, panel: :inspector)
|
|
1499
|
-
sleep 1
|
|
1500
|
-
hotkey.push('z')
|
|
1501
|
-
end
|
|
1502
|
-
when :network
|
|
1503
|
-
hotkey.push('e') if firefox_types.include?(browser_type)
|
|
1504
|
-
else
|
|
1505
|
-
raise 'ERROR: panel parameter must be :elements|:inspector|:console|:debugger|:sources|:network'
|
|
1506
|
-
end
|
|
1507
|
-
|
|
1508
|
-
browser_obj[:browser].send_keys(:escape)
|
|
1509
|
-
|
|
1510
|
-
# Have to call twice for Chrome, otherwise devtools stays closed
|
|
1511
|
-
browser_obj[:browser].send_keys(hotkey)
|
|
1512
|
-
# browser.send_keys(hotkey) if chrome_types.include?(browser_type)
|
|
1513
|
-
browser.send_keys(:escape)
|
|
1514
|
-
rescue StandardError => e
|
|
1515
|
-
raise e
|
|
1516
|
-
end
|
|
1517
|
-
|
|
1518
|
-
# Supported Method Parameters::
|
|
1519
|
-
# browser_obj1 = PWN::Plugins::TransparentBrowser.close(
|
|
1520
|
-
# browser_obj: 'required - browser_obj returned from #open method)'
|
|
1521
|
-
# )
|
|
1522
|
-
|
|
1523
|
-
public_class_method def self.close(opts = {})
|
|
1524
|
-
browser_obj = opts[:browser_obj]
|
|
1525
|
-
|
|
1526
|
-
return nil unless browser_obj.is_a?(Hash)
|
|
1527
|
-
|
|
1528
|
-
browser = browser_obj[:browser]
|
|
1529
|
-
tor_obj = browser_obj[:tor_obj]
|
|
1530
|
-
|
|
1531
|
-
PWN::Plugins::Tor.stop(tor_obj: browser_obj[:tor_obj]) if tor_obj
|
|
1532
|
-
|
|
1533
|
-
# Close the browser unless browser.nil? (thus the &)
|
|
1534
|
-
browser&.close unless browser == RestClient
|
|
1535
|
-
|
|
1536
|
-
nil
|
|
1537
|
-
rescue StandardError => e
|
|
1538
|
-
raise e
|
|
1539
|
-
end
|
|
1540
|
-
|
|
1541
|
-
# Author(s):: 0day Inc. <support@0dayinc.com>
|
|
1542
|
-
|
|
1543
|
-
public_class_method def self.authors
|
|
1544
|
-
"AUTHOR(S):
|
|
1545
|
-
0day Inc. <support@0dayinc.com>
|
|
1546
|
-
"
|
|
1547
|
-
end
|
|
1548
|
-
|
|
1549
|
-
# Display Usage for this Module
|
|
1550
|
-
|
|
1551
|
-
public_class_method def self.help
|
|
1552
|
-
puts "USAGE:
|
|
1553
|
-
browser_obj1 = #{self}.open(
|
|
1554
|
-
browser_type: 'optional - :firefox|:chrome|:headless|:rest|:websocket (defaults to :chrome)',
|
|
1555
|
-
proxy: 'optional scheme://proxy_host:port || tor (defaults to nil)',
|
|
1556
|
-
devtools: 'optional - boolean (defaults to false)'
|
|
1557
|
-
)
|
|
1558
|
-
browser = browser_obj1[:browser]
|
|
1559
|
-
puts browser.public_methods
|
|
1560
|
-
|
|
1561
|
-
********************************************************
|
|
1562
|
-
* DevTools Interaction
|
|
1563
|
-
* All DevTools Commands can be found here:
|
|
1564
|
-
* https://chromedevtools.github.io/devtools-protocol/
|
|
1565
|
-
* Examples
|
|
1566
|
-
devtools = browser_obj1[:devtools]
|
|
1567
|
-
puts devtools.public_methods
|
|
1568
|
-
puts devtools.instance_variables
|
|
1569
|
-
puts devtools.instance_variable_get('@session_id')
|
|
1570
|
-
|
|
1571
|
-
websocket = devtools.instance_variable_get('@ws')
|
|
1572
|
-
puts websocket.public_methods
|
|
1573
|
-
puts websocket.instance_variables
|
|
1574
|
-
puts websocket.instance_variable_get('@messages')
|
|
1575
|
-
|
|
1576
|
-
* Tracing
|
|
1577
|
-
devtools.send_cmd('Tracing.start')
|
|
1578
|
-
devtools.send_cmd('Tracing.requestMemoryDump')
|
|
1579
|
-
devtools.send_cmd('Tracing.end')
|
|
1580
|
-
puts devtools.instance_variable_get('@messages')
|
|
1581
|
-
|
|
1582
|
-
* Network
|
|
1583
|
-
devtools.send_cmd('Network.enable')
|
|
1584
|
-
last_ws_resp = devtools.instance_variable_get('@messages').last if devtools.instance_variable_get('@messages').last['method'] == 'Network.webSocketFrameReceived'
|
|
1585
|
-
puts last_ws_resp
|
|
1586
|
-
devtools.send_cmd('Network.disable')
|
|
1587
|
-
|
|
1588
|
-
* Debugging DOM and Sending JavaScript to Console
|
|
1589
|
-
devtools.send_cmd('Runtime.enable')
|
|
1590
|
-
devtools.send_cmd('Console.enable')
|
|
1591
|
-
devtools.send_cmd('DOM.enable')
|
|
1592
|
-
devtools.send_cmd('Page.enable')
|
|
1593
|
-
devtools.send_cmd('Log.enable')
|
|
1594
|
-
devtools.send_cmd('Debugger.enable')
|
|
1595
|
-
devtools.send_cmd('Debugger.pause')
|
|
1596
|
-
step = 1
|
|
1597
|
-
next_step = 60
|
|
1598
|
-
loop do
|
|
1599
|
-
devtools.send_cmd('Console.clearMessages')
|
|
1600
|
-
devtools.send_cmd('Log.clear')
|
|
1601
|
-
console_events = []
|
|
1602
|
-
browser.driver.on_log_event(:console) { |event| console_events.push(event) }
|
|
1603
|
-
|
|
1604
|
-
devtools.send_cmd('Debugger.stepInto')
|
|
1605
|
-
puts \"Step: \#{step}\"
|
|
1606
|
-
|
|
1607
|
-
this_document = devtools.send_cmd('DOM.getDocument')
|
|
1608
|
-
puts \"This #document:\\n\#{this_document}\\n\\n\\n\"
|
|
1609
|
-
|
|
1610
|
-
console_cmd = {
|
|
1611
|
-
expression: 'for(var pop_var in window) { if (window.hasOwnProperty(pop_var) && window[pop_var] != null) console.log(pop_var + \" = \" + window[pop_var]); }'
|
|
1612
|
-
}
|
|
1613
|
-
puts devtools.send_cmd('Runtime.evaluate', **console_cmd)
|
|
1614
|
-
|
|
1615
|
-
print '-' * 180
|
|
1616
|
-
print \"\\n\"
|
|
1617
|
-
console_events.each do |event|
|
|
1618
|
-
puts event.args
|
|
1619
|
-
end
|
|
1620
|
-
puts \"Console Response Length: \#{console_events.length}\"
|
|
1621
|
-
console_events_digest = OpenSSL::Digest::SHA256.hexdigest(
|
|
1622
|
-
console_events.inspect
|
|
1623
|
-
)
|
|
1624
|
-
puts \"Console Events Array SHA256 Digest: \#{console_events_digest}\"
|
|
1625
|
-
print '-' * 180
|
|
1626
|
-
puts \"\\n\\n\\n\"
|
|
1627
|
-
|
|
1628
|
-
print \"Next Step in \"
|
|
1629
|
-
next_step.downto(1) {|n| print \"\#{n} \"; sleep 1 }
|
|
1630
|
-
puts 'READY!'
|
|
1631
|
-
step += 1
|
|
1632
|
-
end
|
|
1633
|
-
|
|
1634
|
-
devtools.send_cmd('Debugger.disable')
|
|
1635
|
-
devtools.send_cmd('Log.disable')
|
|
1636
|
-
devtools.send_cmd('Page.disable')
|
|
1637
|
-
devtools.send_cmd('DOM.disable')
|
|
1638
|
-
devtools.send_cmd('Console.disable')
|
|
1639
|
-
devtools.send_cmd('Runtime.disable')
|
|
1640
|
-
* End of DevTools Examples
|
|
1641
|
-
********************************************************
|
|
1642
|
-
|
|
1643
|
-
browser_obj1 = #{self}.dump_links(
|
|
1644
|
-
browser_obj: 'required - browser_obj returned from #open method)'
|
|
1645
|
-
)
|
|
1646
|
-
|
|
1647
|
-
browser_obj1 = #{self}.find_elements_by_text(
|
|
1648
|
-
browser_obj: 'required - browser_obj returned from #open method)',
|
|
1649
|
-
text: 'required - text to search for in the DOM'
|
|
1650
|
-
)
|
|
1651
|
-
|
|
1652
|
-
#{self}.type_as_human(
|
|
1653
|
-
string: 'required - string to type as human',
|
|
1654
|
-
rand_sleep_float: 'optional - float timing in between keypress (defaults to 0.09)'
|
|
1655
|
-
) {|char| browser_obj1.text_field(name: \"search\").send_keys(char) }
|
|
1656
|
-
|
|
1657
|
-
console_resp = #{self}.console(
|
|
1658
|
-
browser_obj: 'required - browser_obj returned from #open method)',
|
|
1659
|
-
js: 'required - JavaScript expression to evaluate',
|
|
1660
|
-
return_to: 'optional - return to :console or :stdout (defaults to :console)'
|
|
1661
|
-
)
|
|
1662
|
-
|
|
1663
|
-
console_resp = #{self}.view_dom_mutations(
|
|
1664
|
-
browser_obj: 'required - browser_obj returned from #open method)',
|
|
1665
|
-
index: 'optional - index of tab to switch to (defaults to active tab)',
|
|
1666
|
-
target: 'optional - target JavaScript node to observe (defaults to document.body)'
|
|
1667
|
-
)
|
|
1668
|
-
|
|
1669
|
-
console_resp = #{self}.hide_dom_mutations(
|
|
1670
|
-
browser_obj: 'required - browser_obj returned from #open method)',
|
|
1671
|
-
index: 'optional - index of tab to switch to (defaults to active tab)'
|
|
1672
|
-
)
|
|
1673
|
-
|
|
1674
|
-
#{self}.update_about_config(
|
|
1675
|
-
browser_obj: 'required - browser_obj returned from #open method)',
|
|
1676
|
-
key: 'required - key to update in about:config',
|
|
1677
|
-
value: 'required - value to set for key in about:config'
|
|
1678
|
-
)
|
|
1679
|
-
|
|
1680
|
-
tabs = #{self}.list_tabs(
|
|
1681
|
-
browser_obj: 'required - browser_obj returned from #open method)'
|
|
1682
|
-
)
|
|
1683
|
-
|
|
1684
|
-
tab = #{self}.jmp_tab(
|
|
1685
|
-
browser_obj: 'required - browser_obj returned from #open method)',
|
|
1686
|
-
index: 'optional - index of tab to switch to (defaults to switching to next tab)',
|
|
1687
|
-
keyword: 'optional - keyword in title or url used to switch tabs (defaults to switching to next tab)',
|
|
1688
|
-
)
|
|
1689
|
-
|
|
1690
|
-
tab = #{self}.new_tab(
|
|
1691
|
-
browser_obj: 'required - browser_obj returned from #open method)',
|
|
1692
|
-
url: 'optional - URL to open in new tab'
|
|
1693
|
-
)
|
|
1694
|
-
|
|
1695
|
-
tab = #{self}.close_tab(
|
|
1696
|
-
browser_obj: 'required - browser_obj returned from #open method)',
|
|
1697
|
-
index: 'optional - index of tab to close (defaults to closing active tab)',
|
|
1698
|
-
keyword: 'optional - keyword in title or url used to close tabs (defaults to closing active tab)'
|
|
1699
|
-
)
|
|
1700
|
-
|
|
1701
|
-
current_dom = #{self}.dom(
|
|
1702
|
-
browser_obj: 'required - browser_obj returned from #open method)'
|
|
1703
|
-
)
|
|
1704
|
-
|
|
1705
|
-
page_state = #{self}.get_page_state(
|
|
1706
|
-
browser_obj: 'required - browser_obj returned from #open method)'
|
|
1707
|
-
)
|
|
1708
|
-
|
|
1709
|
-
#{self}.debugger(
|
|
1710
|
-
browser_obj: 'required - browser_obj returned from #open method)',
|
|
1711
|
-
action: 'optional - action to take :enable|:pause|:resume|:disable (Defaults to :enable)'
|
|
1712
|
-
)
|
|
1713
|
-
|
|
1714
|
-
#{self}.step(
|
|
1715
|
-
browser_obj: 'required - browser_obj returned from #open method)',
|
|
1716
|
-
action: 'optional - action to take :into|:out|:over (Defaults to :into)',
|
|
1717
|
-
steps: 'optional - number of steps taken (Defaults to 1)'
|
|
1718
|
-
)
|
|
1719
|
-
|
|
1720
|
-
#{self}.toggle_devtools(
|
|
1721
|
-
browser_obj: 'required - browser_obj returned from #open method)'
|
|
1722
|
-
)
|
|
1723
|
-
|
|
1724
|
-
#{self}.jmp_devtools_panel(
|
|
1725
|
-
browser_obj: 'required - browser_obj returned from #open method)',
|
|
1726
|
-
panel: 'optional - panel to switch to :elements|:inspector|:console|:debugger|:sources|:network'
|
|
1727
|
-
)
|
|
1728
|
-
|
|
1729
|
-
browser_obj1 = #{self}.close(
|
|
1730
|
-
browser_obj: 'required - browser_obj returned from #open method)'
|
|
1731
|
-
)
|
|
1732
|
-
|
|
1733
|
-
#{self}.authors
|
|
1734
|
-
"
|
|
1735
|
-
end
|
|
1736
|
-
end
|
|
1737
|
-
end
|
|
1738
|
-
end
|