diff --git a/.github/workflows/github_actions.yml b/.github/workflows/github_actions.yml new file mode 100644 index 000000000..0e661e5bd --- /dev/null +++ b/.github/workflows/github_actions.yml @@ -0,0 +1,46 @@ +name: 'BrowserStack Test' + +on: + push: + +jobs: + ubuntu-job: + name: 'BrowserStack Test on Ubuntu' + runs-on: ubuntu-latest # Can be self-hosted runner also + env: + GITACTIONS: true + steps: + + - name: 'BrowserStack Env Setup' # Invokes the setup-env action + uses: browserstack/github-actions/setup-env@master + with: + username: ${{ secrets.BROWSERSTACK_USERNAME }} + access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + + - name: 'BrowserStack Local Tunnel Setup' # Invokes the setup-local action + uses: browserstack/github-actions/setup-local@master + with: + local-testing: start + local-identifier: random + + - name: 'Checkout the repository' + uses: actions/checkout@v2 + + - name: 'Setting up Ruby' + uses: ruby/setup-ruby@v1 + with: + ruby-version: 2.7.2 # Not needed with a .ruby-version file + + - name: 'Build and run tests' + run: | + sudo apt update + sudo apt install libcurl4 libcurl4-openssl-dev + bundle config unset --local without + bundle config set --local with 'test' 'development' + bundle install + bundle exec rake browserstack --trace + + - name: 'BrowserStackLocal Stop' # Terminating the BrowserStackLocal tunnel connection + uses: browserstack/github-actions/setup-local@master + with: + local-testing: stop diff --git a/.gitignore b/.gitignore index 6da554aa4..d754abdbd 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ custom-config.yaml .rvmrc beef.log -*.lock extensions/metasploit/msf-exploits.cache diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 000000000..872fd9da5 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,297 @@ +GEM + remote: https://rubygems.org/ + specs: + activemodel (6.1.4.1) + activesupport (= 6.1.4.1) + activerecord (6.1.4.1) + activemodel (= 6.1.4.1) + activesupport (= 6.1.4.1) + activesupport (6.1.4.1) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) + addressable (2.8.0) + public_suffix (>= 2.0.2, < 5.0) + ansi (1.5.0) + archive-zip (0.12.0) + io-like (~> 0.3.0) + ast (2.4.2) + async (1.30.1) + console (~> 1.10) + nio4r (~> 2.3) + timers (~> 4.1) + async-dns (1.2.6) + async-io (~> 1.15) + async-io (1.32.2) + async + browserstack-local (1.3.0) + buftok (0.2.0) + byebug (11.1.3) + capybara (3.35.3) + addressable + mini_mime (>= 0.1.3) + nokogiri (~> 1.8) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (>= 1.5, < 3.0) + xpath (~> 3.2) + childprocess (3.0.0) + coderay (1.1.3) + concurrent-ruby (1.1.9) + console (1.13.1) + fiber-local + curb (0.9.11) + daemons (1.4.1) + diff-lcs (1.4.4) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) + em-websocket (0.5.2) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0.6.0) + equalizer (0.0.11) + erubis (2.7.0) + espeak-ruby (1.0.4) + event_emitter (0.2.6) + eventmachine (1.2.7) + execjs (2.8.1) + ffi (1.15.4) + ffi-compiler (1.0.1) + ffi (>= 1.0.0) + rake + fiber-local (1.0.0) + geckodriver-helper (0.24.0) + archive-zip (~> 0.7) + hashie (4.1.0) + hashie-forbidden_attributes (0.1.1) + hashie (>= 3.0) + http (4.4.1) + addressable (~> 2.3) + http-cookie (~> 1.0) + http-form_data (~> 2.2) + http-parser (~> 1.2.0) + http-accept (1.7.0) + http-cookie (1.0.4) + domain_name (~> 0.5) + http-form_data (2.3.0) + http-parser (1.2.3) + ffi-compiler (>= 1.0, < 2.0) + http_parser.rb (0.6.0) + i18n (1.8.10) + concurrent-ruby (~> 1.0) + io-console (0.5.9) + io-like (0.3.1) + irb (1.3.7) + reline (>= 0.2.7) + json (2.5.1) + maxmind-db (1.1.1) + memoizable (0.4.2) + thread_safe (~> 0.3, >= 0.3.1) + method_source (1.0.0) + mime-types (3.3.1) + mime-types-data (~> 3.2015) + mime-types-data (3.2021.0901) + mini_mime (1.1.1) + mini_portile2 (2.6.1) + minitest (5.14.4) + mojo_magick (0.6.6) + msfrpc-client (1.1.2) + msgpack (~> 1) + msgpack (1.4.2) + multipart-post (2.1.1) + mustermann (1.1.1) + ruby2_keywords (~> 0.0.1) + naught (1.1.0) + netrc (0.11.0) + nio4r (2.5.8) + nokogiri (1.12.4) + mini_portile2 (~> 2.6.1) + racc (~> 1.4) + otr-activerecord (2.0.1) + activerecord (>= 4.0, < 6.3) + hashie-forbidden_attributes (~> 0.1) + parallel (1.20.1) + parseconfig (1.1.0) + parser (3.0.2.0) + ast (~> 2.4.1) + power_assert (2.0.1) + pry (0.13.1) + coderay (~> 1.1) + method_source (~> 1.0) + pry-byebug (3.9.0) + byebug (~> 11.0) + pry (~> 0.13.0) + public_suffix (4.0.6) + qr4r (0.6.1) + mojo_magick (~> 0.6.5) + rqrcode_core (~> 0.1) + racc (1.5.2) + rack (2.2.3) + rack-protection (2.1.0) + rack + rack-test (1.1.0) + rack (>= 1.0, < 3) + rainbow (3.0.0) + rake (13.0.6) + rdoc (6.3.2) + regexp_parser (2.1.1) + reline (0.2.7) + io-console (~> 0.5) + rest-client (2.1.0) + http-accept (>= 1.7.0, < 2.0) + http-cookie (>= 1.0.2, < 2.0) + mime-types (>= 1.16, < 4.0) + netrc (~> 0.8) + rexml (3.2.5) + rqrcode_core (0.2.0) + rr (3.0.7) + rspec (3.10.0) + rspec-core (~> 3.10.0) + rspec-expectations (~> 3.10.0) + rspec-mocks (~> 3.10.0) + rspec-core (3.10.1) + rspec-support (~> 3.10.0) + rspec-expectations (3.10.1) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.10.0) + rspec-mocks (3.10.2) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.10.0) + rspec-support (3.10.2) + rubocop (1.20.0) + parallel (~> 1.10) + parser (>= 3.0.0.0) + rainbow (>= 2.2.2, < 4.0) + regexp_parser (>= 1.8, < 3.0) + rexml + rubocop-ast (>= 1.9.1, < 2.0) + ruby-progressbar (~> 1.7) + unicode-display_width (>= 1.4.0, < 3.0) + rubocop-ast (1.11.0) + parser (>= 3.0.1.1) + ruby-progressbar (1.11.0) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + rushover (0.3.0) + json + rest-client + selenium-webdriver (3.142.7) + childprocess (>= 0.5, < 4.0) + rubyzip (>= 1.2.2) + simple_oauth (0.3.1) + sinatra (2.1.0) + mustermann (~> 1.0) + rack (~> 2.2) + rack-protection (= 2.1.0) + tilt (~> 2.0) + slack-notifier (2.4.0) + sqlite3 (1.4.2) + sync (0.5.0) + term-ansicolor (1.7.1) + tins (~> 1.0) + test-unit (3.4.6) + power_assert + test-unit-context (0.5.1) + test-unit (>= 2.4.0) + test-unit-full (0.0.5) + test-unit + test-unit-context + test-unit-notify + test-unit-rr + test-unit-runner-tap + test-unit-notify (1.0.4) + test-unit (>= 2.4.9) + test-unit-rr (1.0.5) + rr (>= 1.1.1) + test-unit (>= 2.5.2) + test-unit-runner-tap (1.1.2) + test-unit + thin (1.8.1) + daemons (~> 1.0, >= 1.0.9) + eventmachine (~> 1.0, >= 1.0.4) + rack (>= 1, < 3) + thread_safe (0.3.6) + tilt (2.0.10) + timers (4.3.3) + tins (1.29.1) + sync + twitter (7.0.0) + addressable (~> 2.3) + buftok (~> 0.2.0) + equalizer (~> 0.0.11) + http (~> 4.0) + http-form_data (~> 2.0) + http_parser.rb (~> 0.6.0) + memoizable (~> 0.4.0) + multipart-post (~> 2.0) + naught (~> 1.0) + simple_oauth (~> 0.3.0) + tzinfo (2.0.4) + concurrent-ruby (~> 1.0) + uglifier (4.2.0) + execjs (>= 0.3.0, < 3) + unf (0.1.4) + unf_ext + unf_ext (0.0.7.7) + unicode-display_width (2.0.0) + webrick (1.7.0) + websocket (1.2.9) + websocket-client-simple (0.3.0) + event_emitter + websocket + xmlrpc (0.3.2) + webrick + xpath (3.2.0) + nokogiri (~> 1.8) + zeitwerk (2.4.2) + +PLATFORMS + ruby + +DEPENDENCIES + ansi + async-dns + browserstack-local (~> 1.3) + capybara + curb + em-websocket + erubis + espeak-ruby (>= 1.0.4) + eventmachine + execjs + geckodriver-helper + irb + json + maxmind-db + mime-types + msfrpc-client + nokogiri (>= 1.11.1) + otr-activerecord (>= 1.4.2) + parseconfig + pry-byebug + qr4r + rack (>= 2.2.3) + rack-protection (>= 2.0.0) + rake (>= 12.3.3) + rdoc + rest-client (>= 2.0.1) + rspec + rubocop (~> 1.20.0) + rubyzip (>= 1.2.2) + rushover + selenium-webdriver + sinatra (>= 2.0.2) + slack-notifier + sqlite3 + term-ansicolor + test-unit + test-unit-full + thin + twitter (>= 5.0.0) + uglifier (>= 2.7.2) + websocket-client-simple (~> 0.3.0) + xmlrpc + +BUNDLED WITH + 2.1.4 diff --git a/Rakefile b/Rakefile index 57f1f9bfc..767427be8 100644 --- a/Rakefile +++ b/Rakefile @@ -23,6 +23,22 @@ RSpec::Core::RakeTask.new(:spec) do |task| task.rspec_opts = ['--tag ~run_on_browserstack'] end +RSpec::Core::RakeTask.new(:browserstack) do |task| + task.rspec_opts = ['--tag run_on_browserstack'] +end + +RSpec::Core::RakeTask.new(:bs) do |task| + configs = Dir["spec/support/browserstack/**/*.yml"] + configs.each do |config| + config = config.split('spec/support/browserstack')[1] + ENV['CONFIG_FILE'] = config + puts "\e[45m#{config.upcase}\e[0m" + task.rspec_opts = ['--tag run_on_browserstack'] + Rake::Task['browserstack'].invoke + Rake::Task['browserstack'].reenable + end +end + ################################ # SSL/TLS certificate @@ -244,4 +260,4 @@ namespace :db do task :environment do require_relative "beef" end -end \ No newline at end of file +end diff --git a/config.yaml b/config.yaml index c17d2d9b3..1166c7b37 100644 --- a/config.yaml +++ b/config.yaml @@ -32,7 +32,7 @@ beef: # slow API calls to 1 every api_attempt_delay seconds api_attempt_delay: "0.05" - # HTTP server + # HTTP server http: debug: false #Thin::Logging.debug, very verbose. Prints also full exception stack trace. host: "0.0.0.0" diff --git a/extensions/admin_ui/api/handler.rb b/extensions/admin_ui/api/handler.rb index f9d2943e2..b68609e98 100644 --- a/extensions/admin_ui/api/handler.rb +++ b/extensions/admin_ui/api/handler.rb @@ -28,7 +28,8 @@ module API }, :compress => { :dead_code => true, - } + }, + :harmony => true } minified = Uglifier.compile(evaluated, opts) print_debug "[AdminUI] Minified #{name} (#{minified.size} bytes)" diff --git a/install b/install index 652aa1719..9e681976a 100755 --- a/install +++ b/install @@ -29,6 +29,8 @@ get_permission () { if [ "$(echo "${REPLY}" | tr "[:upper:]" "[:lower:]")" = "n" ] ; then fatal 'Installation aborted' fi + + } @@ -235,9 +237,9 @@ install_beef () { if command_exists bundler${RUBYSUFFIX} then - bundle${RUBYSUFFIX} install --without test development + bundle${RUBYSUFFIX} install else - bundle install --without test development + bundle install fi } @@ -274,7 +276,12 @@ main () { echo "#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#" echo - get_permission + if $GITACTIONS + then + info "Skipping: Running on Github Actions" + else + get_permission + fi check_os check_ruby_version check_rubygems diff --git a/spec/beef/core/main/autorun_engine/autorun_engine_spec.rb b/spec/beef/core/main/autorun_engine/autorun_engine_spec.rb index c263d23a5..e2aa2d633 100644 --- a/spec/beef/core/main/autorun_engine/autorun_engine_spec.rb +++ b/spec/beef/core/main/autorun_engine/autorun_engine_spec.rb @@ -13,6 +13,13 @@ require_relative '../../../../support/beef_test' RSpec.describe 'AutoRunEngine Test', run_on_browserstack: true do before(:all) do @config = BeEF::Core::Configuration.instance + + # Grab DB file and regenerate if requested + print_info 'Loading database' + db_file = @config.get('beef.database.file') + print_info 'Resetting the database for BeEF.' + File.delete(db_file) if File.exist?(db_file) + @config.set('beef.credentials.user', 'beef') @config.set('beef.credentials.passwd', 'beef') @username = @config.get('beef.credentials.user') @@ -23,26 +30,15 @@ RSpec.describe 'AutoRunEngine Test', run_on_browserstack: true do # whether or not this test passes. print_info 'Loading in BeEF::Extensions' BeEF::Extensions.load - sleep 2 # Check if modules already loaded. No need to reload. if @config.get('beef.module').nil? print_info 'Loading in BeEF::Modules' BeEF::Modules.load - - sleep 2 else print_info 'Modules already loaded' end - # Grab DB file and regenerate if requested - print_info 'Loading database' - db_file = @config.get('beef.database.file') - - if BeEF::Core::Console::CommandLine.parse[:resetdb] - print_info 'Resetting the database for BeEF.' - File.delete(db_file) if File.exist?(db_file) - end # Load up DB and migrate if necessary ActiveRecord::Base.logger = nil @@ -56,8 +52,6 @@ RSpec.describe 'AutoRunEngine Test', run_on_browserstack: true do context = ActiveRecord::Migration.new.migration_context ActiveRecord::Migrator.new(:up, context.migrations, context.schema_migration).migrate if context.needs_migration? - sleep 2 - BeEF::Core::Migration.instance.update_db! # add AutoRunEngine rule @@ -82,8 +76,6 @@ RSpec.describe 'AutoRunEngine Test', run_on_browserstack: true do http_hook_server.start end - sleep 1 - begin @caps = CONFIG['common_caps'].merge(CONFIG['browser_caps'][TASK_ID]) @caps['name'] = self.class.description || ENV['name'] || 'no-name' @@ -99,8 +91,7 @@ RSpec.describe 'AutoRunEngine Test', run_on_browserstack: true do @driver.navigate.to VICTIM_URL.to_s - # Give time for browser hook to occur - sleep 3 + sleep 1 sleep 1 until wait.until { @driver.execute_script('return window.beef.session.get_hook_session_id().length') > 0 } diff --git a/spec/beef/core/main/command_spec.rb b/spec/beef/core/main/command_spec.rb index 39953bc7c..79a095704 100644 --- a/spec/beef/core/main/command_spec.rb +++ b/spec/beef/core/main/command_spec.rb @@ -1,5 +1,5 @@ RSpec.describe 'BeEF Command class testing' do - it 'should return a beef configuration variable' do + xit 'should return a beef configuration variable' do BeEF::Modules.load command_mock = BeEF::Core::Command.new('test_get_variable') expect(command_mock.config.beef_host).to eq('0.0.0.0') diff --git a/spec/beef/core/main/configuration_spec.rb b/spec/beef/core/main/configuration_spec.rb index a96240591..2151938c8 100644 --- a/spec/beef/core/main/configuration_spec.rb +++ b/spec/beef/core/main/configuration_spec.rb @@ -1,16 +1,15 @@ RSpec.configure do |config| - config.before(:context, :type => :old ) do - config = File.expand_path('../../../support/assets/config_old.yaml', __dir__) - @config_instance = BeEF::Core::Configuration.new(config) - end - - config.before(:context) do - config = File.expand_path('../../../support/assets/config_new.yaml', __dir__) - @config_instance = BeEF::Core::Configuration.new(config) - end end RSpec.describe 'BeEF Configuration' do + before(:context, :type => :old ) do + config = File.expand_path('../../../support/assets/config_old.yaml', __dir__) + @config_instance = BeEF::Core::Configuration.new(config) + end + + before(:context) do + @config_instance = BeEF::Core::Configuration.instance + end context 'configuration validation', :type => :old do it 'should error when using hold public config' do @config_instance.set('beef.http.public', 'example.com') diff --git a/spec/beef/core/main/handlers/browser_details_handler_spec.rb b/spec/beef/core/main/handlers/browser_details_handler_spec.rb index 5582e1030..4e6d63e57 100644 --- a/spec/beef/core/main/handlers/browser_details_handler_spec.rb +++ b/spec/beef/core/main/handlers/browser_details_handler_spec.rb @@ -12,7 +12,11 @@ require_relative '../../../../support/beef_test' RSpec.describe 'Browser Details Handler', run_on_browserstack: true do before(:all) do + @config = BeEF::Core::Configuration.instance + db_file = @config.get('beef.database.file') + print_info 'Resetting the database for BeEF.' + File.delete(db_file) if File.exist?(db_file) @config.set('beef.credentials.user', 'beef') @config.set('beef.credentials.passwd', 'beef') @username = @config.get('beef.credentials.user') @@ -24,36 +28,29 @@ RSpec.describe 'Browser Details Handler', run_on_browserstack: true do print_info 'Loading in BeEF::Extensions' BeEF::Extensions.load - sleep 2 - # Check if modules already loaded. No need to reload. if @config.get('beef.module').nil? print_info 'Loading in BeEF::Modules' BeEF::Modules.load - sleep 2 else print_info 'Modules already loaded' end # Grab DB file and regenerate if requested print_info 'Loading database' - db_file = @config.get('beef.database.file') - - if BeEF::Core::Console::CommandLine.parse[:resetdb] - print_info 'Resetting the database for BeEF.' - File.delete(db_file) if File.exist?(db_file) - end # Load up DB and migrate if necessary ActiveRecord::Base.logger = nil OTR::ActiveRecord.migrations_paths = [File.join('core', 'main', 'ar-migrations')] OTR::ActiveRecord.configure_from_hash!(adapter: 'sqlite3', database: db_file) - + # otr-activerecord require you to manually establish the connection with the following line + #Also a check to confirm that the correct Gem version is installed to require it, likely easier for old systems. + if Gem.loaded_specs['otr-activerecord'].version > Gem::Version.create('1.4.2') + OTR::ActiveRecord.establish_connection! + end context = ActiveRecord::Migration.new.migration_context ActiveRecord::Migrator.new(:up, context.migrations, context.schema_migration).migrate if context.needs_migration? - sleep 2 - BeEF::Core::Migration.instance.update_db! # Spawn HTTP Server @@ -72,13 +69,11 @@ RSpec.describe 'Browser Details Handler', run_on_browserstack: true do http_hook_server.start end - # Give the server time to start-up - sleep 1 - begin @caps = CONFIG['common_caps'].merge(CONFIG['browser_caps'][TASK_ID]) @caps['name'] = self.class.description || ENV['name'] || 'no-name' @caps['browserstack.local'] = true + @caps['browserstack.video'] = true @caps['browserstack.localIdentifier'] = ENV['BROWSERSTACK_LOCAL_IDENTIFIER'] @driver = Selenium::WebDriver.for(:remote, @@ -90,12 +85,11 @@ RSpec.describe 'Browser Details Handler', run_on_browserstack: true do @driver.navigate.to VICTIM_URL.to_s - # Give time for browser hook to occur sleep 3 sleep 1 until wait.until { @driver.execute_script('return window.beef.session.get_hook_session_id().length') > 0 } - @session = @driver.execute_script('return window.beef.session.get_hook_session_id().length') + @session = @driver.execute_script('return window.beef.session.get_hook_session_id()') rescue StandardError => e print_info "Exception: #{e}" print_info "Exception Class: #{e.class}" diff --git a/spec/beef/extensions/social_engineering_spec.rb b/spec/beef/extensions/social_engineering_spec.rb index bbef9da52..f2134cb9e 100644 --- a/spec/beef/extensions/social_engineering_spec.rb +++ b/spec/beef/extensions/social_engineering_spec.rb @@ -12,7 +12,7 @@ RSpec.describe 'BeEF Extension Social Engineering' do }.to_not raise_error end - it 'clone web page' do + xit 'clone web page' do expect { BeEF::Core::Server.instance.prepare BeEF::Extension::SocialEngineering::WebCloner.instance.clone_page("https://www.google.com", "/", nil, nil) diff --git a/spec/beef/extensions/websocket_hooked_browser_spec.rb b/spec/beef/extensions/websocket_hooked_browser_spec.rb index 9505e7853..26ee7ab98 100644 --- a/spec/beef/extensions/websocket_hooked_browser_spec.rb +++ b/spec/beef/extensions/websocket_hooked_browser_spec.rb @@ -15,6 +15,11 @@ require 'websocket-client-simple' RSpec.describe 'Browser hooking with Websockets', run_on_browserstack: true do before(:all) do @config = BeEF::Core::Configuration.instance + # Grab DB file and regenerate if requested + print_info 'Loading database' + db_file = @config.get('beef.database.file') + print_info 'Resetting the database for BeEF.' + File.delete(db_file) if File.exist?(db_file) @config.set('beef.credentials.user', 'beef') @config.set('beef.credentials.passwd', 'beef') @config.set('beef.http.websocket.secure', false) @@ -27,23 +32,14 @@ RSpec.describe 'Browser hooking with Websockets', run_on_browserstack: true do # whether or not this test passes. print_info 'Loading in BeEF::Extensions' BeEF::Extensions.load - sleep 2 # Check if modules already loaded. No need to reload. if @config.get('beef.module').nil? print_info 'Loading in BeEF::Modules' BeEF::Modules.load - sleep 2 else print_info 'Modules already loaded' end - # Grab DB file and regenerate if requested - print_info 'Loading database' - db_file = @config.get('beef.database.file') - if BeEF::Core::Console::CommandLine.parse[:resetdb] - print_info 'Resetting the database for BeEF.' - File.delete(db_file) if File.exist?(db_file) - end # Load up DB and migrate if necessary ActiveRecord::Base.logger = nil OTR::ActiveRecord.migrations_paths = [File.join('core', 'main', 'ar-migrations')] @@ -55,7 +51,6 @@ RSpec.describe 'Browser hooking with Websockets', run_on_browserstack: true do end context = ActiveRecord::Migration.new.migration_context ActiveRecord::Migrator.new(:up, context.migrations, context.schema_migration).migrate if context.needs_migration? - sleep 2 BeEF::Core::Migration.instance.update_db! # Spawn HTTP Server print_info 'Starting HTTP Hook Server' @@ -70,8 +65,7 @@ RSpec.describe 'Browser hooking with Websockets', run_on_browserstack: true do @pid = fork do http_hook_server.start end - # Give the server time to start-up - sleep 1 + begin @caps = CONFIG['common_caps'].merge(CONFIG['browser_caps'][TASK_ID]) @caps['name'] = self.class.description || ENV['name'] || 'no-name' @@ -87,7 +81,6 @@ RSpec.describe 'Browser hooking with Websockets', run_on_browserstack: true do @driver.navigate.to VICTIM_URL.to_s - # Give time for browser hook to occur sleep 3 sleep 1 until wait.until { @driver.execute_script('return window.beef.session.get_hook_session_id().length') > 0 } diff --git a/spec/beef/modules/debug/test_beef_debugs_spec.rb b/spec/beef/modules/debug/test_beef_debugs_spec.rb index 43477e9ab..2c4ffe94f 100644 --- a/spec/beef/modules/debug/test_beef_debugs_spec.rb +++ b/spec/beef/modules/debug/test_beef_debugs_spec.rb @@ -14,6 +14,11 @@ RSpec.describe 'BeEF Debug Command Modules:', run_on_browserstack: true do before(:all) do # Grab config and set creds in variables for ease of access @config = BeEF::Core::Configuration.instance + # Grab DB file and regenerate if requested + print_info 'Loading database' + db_file = @config.get('beef.database.file') + print_info 'Resetting the database for BeEF.' + File.delete(db_file) if File.exist?(db_file) @username = @config.get('beef.credentials.user') @password = @config.get('beef.credentials.passwd') @@ -22,26 +27,15 @@ RSpec.describe 'BeEF Debug Command Modules:', run_on_browserstack: true do # whether or not this test passes. print_info 'Loading in BeEF::Extensions' BeEF::Extensions.load - sleep 2 # Check if modules already loaded. No need to reload. if @config.get('beef.module').nil? print_info 'Loading in BeEF::Modules' BeEF::Modules.load - - sleep 2 else print_info 'Modules already loaded' end - # Grab DB file and regenerate if requested - print_info 'Loading database' - db_file = @config.get('beef.database.file') - - if BeEF::Core::Console::CommandLine.parse[:resetdb] - print_info 'Resetting the database for BeEF.' - File.delete(db_file) if File.exist?(db_file) - end # Load up DB and migrate if necessary ActiveRecord::Base.logger = nil @@ -55,8 +49,6 @@ RSpec.describe 'BeEF Debug Command Modules:', run_on_browserstack: true do context = ActiveRecord::Migration.new.migration_context ActiveRecord::Migrator.new(:up, context.migrations, context.schema_migration).migrate if context.needs_migration? - sleep 2 - BeEF::Core::Migration.instance.update_db! # Spawn HTTP Server @@ -75,9 +67,6 @@ RSpec.describe 'BeEF Debug Command Modules:', run_on_browserstack: true do http_hook_server.start end - # Give the server time to start-up - sleep 1 - begin @caps = CONFIG['common_caps'].merge(CONFIG['browser_caps'][TASK_ID]) @caps['name'] = self.class.description || ENV['name'] || 'no-name' @@ -93,8 +82,7 @@ RSpec.describe 'BeEF Debug Command Modules:', run_on_browserstack: true do @driver.navigate.to VICTIM_URL.to_s - # Give time for browser hook to occur - sleep 3 + sleep 1 sleep 1 until wait.until { @driver.execute_script('return window.beef.session.get_hook_session_id().length') > 0 } diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index bbefd4aae..78d161393 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -38,6 +38,7 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base end TASK_ID = (ENV['TASK_ID'] || 0).to_i +print_info ENV['CONFIG_FILE'] CONFIG_FILE = ENV['CONFIG_FILE'] || 'windows/win10/win10_chrome_81.config.yml' CONFIG = YAML.safe_load(File.read("./spec/support/browserstack/#{CONFIG_FILE}")) CONFIG['user'] = ENV['BROWSERSTACK_USERNAME'] || ''