diff --git a/tools/rest_api_examples/lib/beef_rest_api.rb b/tools/rest_api_examples/lib/beef_rest_api.rb index e6f107773..634283068 100644 --- a/tools/rest_api_examples/lib/beef_rest_api.rb +++ b/tools/rest_api_examples/lib/beef_rest_api.rb @@ -55,6 +55,20 @@ def online_browsers end end +# get offline hooked browsers +def offline_browsers + begin + print_verbose "Retrieving offline browsers" + response = RestClient.get "#{@url}hooks", {:params => {:token => @token}} + result = JSON.parse(response.body) + browsers = result["hooked-browsers"]["offline"] + print_good "Retrieved offline browser list [#{browsers.size} offline]" + browsers + rescue => e + print_error "Could not retrieve browser details: #{e.message}" + end +end + # get hooked browser details by session def browser_details session begin @@ -68,6 +82,18 @@ def browser_details session end end +# delete a browser by session +def delete_browser session + begin + print_verbose "Removing hooked browser [session: #{session}]" + response = RestClient.get "#{@url}hooks/#{session}/delete", {:params => {:token => @token}} + print_good "Removed browser [session: #{session}]" if response.code == 200 + response + rescue => e + print_error "Could not delete hooked browser: #{e.message}" + end +end + # get BeEF logs def logs begin diff --git a/tools/rest_api_examples/remove-offline-browsers b/tools/rest_api_examples/remove-offline-browsers new file mode 100644 index 000000000..ab5641048 --- /dev/null +++ b/tools/rest_api_examples/remove-offline-browsers @@ -0,0 +1,81 @@ +#!/usr/bin/env ruby +# remove-offline-browsers - Example BeEF RESTful API script +# Removes offline browsers from the database +# Refer to the wiki for info: https://github.com/beefproject/beef/wiki/BeEF-RESTful-API +## +require 'rest-client' +require 'json' +require 'optparse' +require 'pp' +require './lib/string' # colored strings +require './lib/print' # print wrappers +require './lib/beef_rest_api' + +if ARGV.length == 0 + puts "#{$0}:" + puts "| Example BeEF RESTful API script" + puts "| Use --help for help" + puts "|_ Use verbose mode (-v) and debug mode (-d) for more output" + exit 1 +end + +# API config +proto = 'http' +host = '127.0.0.1' +port = '3000' +user = 'beef' +pass = 'beef' + +# Command line options +@debug = false +@verbose = false +OptionParser.new do |opts| + opts.on('-h', '--help', 'Shows this help screen') do + puts opts + exit 1 + end + opts.on('--host HOST', "Set BeEF host (default: #{host})") do |h| + host = h + end + opts.on('--port PORT', "Set BeEF port (default: #{port})") do |p| + port = p + end + opts.on('--user USERNAME', "Set BeEF username (default: #{user})") do |u| + user = u + end + opts.on('--pass PASSWORD', "Set BeEF password (default: #{pass})") do |p| + pass = p + end + opts.on('--ssl', 'Use HTTPS') do + proto = 'https' + end + opts.on('-v', '--verbose', 'Enable verbose output') do + @verbose = true + end + opts.on('-d', '--debug', 'Enable debug output') do + @debug = true + end +end.parse! + +@api = BeefRestAPI.new proto, host, port, user, pass + +# Retrieve the RESTful API token +print_status "Authenticating to: #{proto}://#{host}:#{port}" +@api.auth + +# Retrieve BeEF version +@api.version + +# Retrieve online hooked browser list +hooks = @api.offline_browsers.flatten +exit 1 if hooks.empty? +print_debug hooks + +# Remove each offline browser +hooks.each do |hook| + next if hook['id'].nil? + print_status "Removing hooked browser [id: #{hook['id']}]" + details = @api.delete_browser(hook['session']) + print_debug details +end +