module BeEF module Core module Models # # Table stores the commands that have been sent to the Hooked Browsers. # # Attributes: # # - id # - data # - creationdate # - label # - instructions_sent # - command_module_id # - hooked_browser_id # class Command include DataMapper::Resource storage_names[:default] = 'commands' property :id, Serial property :data, Text property :creationdate, String, :length => 15, :lazy => false property :label, Text, :lazy => false property :instructions_sent, Boolean, :default => false has n, :results # # Save results and flag that the command has been run on the hooked browser # # @param: {String} the session_id. # @param: {String} the command_id. # @param: {String} the command friendly name. # @param: {String} the result of the command module. # def self.save_result(hook_session_id, command_id, command_friendly_name, result) # enforcing arguments types command_id = command_id.to_i # argument type checking raise Exception::TypeError, '"hook_session_id" needs to be a string' if not hook_session_id.string? raise Exception::TypeError, '"command_id" needs to be an integer' if not command_id.integer? raise Exception::TypeError, '"command_friendly_name" needs to be a string' if not command_friendly_name.string? raise Exception::TypeError, '"result" needs to be a hash' if not result.hash? # get the hooked browser structure and id from the database hooked_browser = BeEF::Core::Models::HookedBrowser.first(:session => hook_session_id) || nil raise Exception::TypeError, "hooked_browser is nil" if hooked_browser.nil? raise Exception::TypeError, "hooked_browser.id is nil" if hooked_browser.id.nil? hooked_browser_id = hooked_browser.id raise Exception::TypeError, "hooked_browser.ip is nil" if hooked_browser.ip.nil? hooked_browser_ip = hooked_browser.ip # get the command module data structure from the database command = first(:id => command_id.to_i, :hooked_browser_id => hooked_browser_id) || nil raise Exception::TypeError, "command is nil" if command.nil? # create the entry for the results command.results.new(:hooked_browser_id => hooked_browser_id, :data => result.to_json, :date => Time.now.to_i) command.save # log that the result was returned BeEF::Core::Logger.instance.register('Command', "Hooked browser #{hooked_browser.ip} has executed instructions from command module '#{command_friendly_name}'", hooked_browser_id) # prints the event into the console if BeEF::Settings.console? print_info "Hooked browser #{hooked_browser.ip} has executed instructions from command module '#{command_friendly_name}'" end end end end end end