Basic response recv system implemented

todo ping-pong for alive host. thread's content is  in websocket.rb
todo setting up a separate handler for via ws answer's
This commit is contained in:
Graziano Felline
2012-04-18 12:00:17 +02:00
parent 2198c69aa8
commit 656262c0f4
6 changed files with 298 additions and 247 deletions

View File

@@ -13,17 +13,19 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
#@todo STOP POLLING
module BeEF
module Core
module Websocket
require 'singleton'
require 'json'
require 'base64'
class Websocket
# require 'singleton'
#include Singleton
#all hooked browser
include Singleton
@@activeSocket= Hash.new #empty at begin
# @note obtain dynamic mount points from HttpHookServer
MOUNTS = BeEF::Core::Server.instance.mounts
@@activeSocket= Hash.new #empty at begin
def initialize
config = BeEF::Core::Configuration.instance
@@ -43,31 +45,68 @@ module BeEF
while true
#command interpretation
message=ws.receive()
if(/BEEFHOOK=/.match(message))
messageHash= JSON.parse("#{message}")
#@note messageHash[result] is Base64 encoded
if (messageHash["cookie"]!= nil)
print_info("Browser #{ws.origin} says helo! ws is running")
#insert new connection in activesocket
@@activeSocket["#{message.split(/BEEFHOOK=/)[1]}"] = ws
@@activeSocket["#{messageHash["cookie"]}"] = ws
print_debug("In activesocket we have #{@@activeSocket}")
else
#json recv is a cmd response decode and send all to
#we have to call dynamicreconstructor handler camp must be websocket
print_info("We recived that #{messageHash}")
execute(messageHash)
end
end
end
end
}
##Alive check
# Thread.new{
#
# @@activeSocket.each_key{|key , value|
# ping send token and update beefdb whit new timestamp insert a timer
#
# }
#
#
# }
end
#@note used in command.rd return nill if browser is not in list else giveback websocket
#@param [String] browser_id the cookie value
def getsocket (browser_id)
if ( @@activeSocket[browser_id] != nil)
true
if (@@activeSocket[browser_id] != nil)
true
else
false
false
end
end
#@note send a function to hooked and ws browser
def sent (fn ,browser_id )
@@activeSocket[browser_id].send(fn)
#@param [String] fn the module to execute
#@param [String] browser_id the cookie value
def sent (fn, browser_id)
@@activeSocket[browser_id].send(fn)
end
BeEF::Core::Handlers::Commands
#call the handler for websocket cmd response
#@param [Hash] data contains the answer of a command
#@todo ve this stuff in an Handler and resolve the Module friendly name
def execute (data)
command_results=Hash.new
command_results["data"]=Base64.decode64(data["result"])
(print_error "BeEFhook is invalid"; return) if not BeEF::Filters.is_valid_hook_session_id?(data["bh"])
(print_error "command_id is invalid"; return) if not BeEF::Filters.is_valid_command_id?(data["cid"])
(print_error "command name is empty"; return) if data["handler"].empty?
(print_error "command results are empty"; return) if command_results.empty?
BeEF::Core::Models::Command.save_result(data["bh"], data["cid"], data["handler"], command_results)
end
end
end
end