diff --git a/lib/loader.rb b/lib/loader.rb
index 806b7aae6..da60a22c4 100644
--- a/lib/loader.rb
+++ b/lib/loader.rb
@@ -36,6 +36,7 @@ require 'lib/model/autoloading'
require 'lib/model/plugin'
require 'lib/model/http'
require 'lib/model/browserdetails'
+require 'lib/model/distributedenginerules'
require 'lib/crypto'
diff --git a/lib/ui/panel/panel.rb b/lib/ui/panel/panel.rb
index 0147b716b..0eeb1418a 100644
--- a/lib/ui/panel/panel.rb
+++ b/lib/ui/panel/panel.rb
@@ -9,17 +9,81 @@ class Panel < BeEF::HttpController
def initialize
super({
'paths' => {
- '/' => method(:index)
+ '/' => method(:index),
+ '/hooked-browser-tree-update.json' => method(:hooked_browser_tree_update)
}
})
end
- #
- def index
- # should be rendered with Erubis::FastEruby
- @body = 'a'
+ # default index page
+ def index; end
+
+ # return a JSON object contains all the updates for the hooked browser trees
+ def hooked_browser_tree_update
+ # retrieve the hbs that are online
+ hooked_browsers_online = zombies2json_simple(BeEF::Models::Zombie.all(:lastseen.gte => (Time.new.to_i - 30)))
+
+ # retrieve the hbs that are offline
+ hooked_browsers_offline = zombies2json_simple(BeEF::Models::Zombie.all(:lastseen.lt => (Time.new.to_i - 30)))
+
+ # retrieve the distributed engine rules that are enabled
+ distributed_engine_rules = distributed_engine_rules_2_json_simple(BeEF::Models::DistributedEngineRules.all(:enabled => true))
+
+ # hash that gets populated with all the information for the hb trees
+ ret = {
+ 'success' => true,
+
+ # the list of hb
+ 'hooked-browsers' => {
+ 'online' => hooked_browsers_online,
+ 'offline' => hooked_browsers_offline
+ },
+
+ # the rules for the distributed engine
+ 'ditributed-engine-rules' => distributed_engine_rules
+ }
+
+ @body = ret.to_json
end
+ # Takes a list distributed engine rules and format the results into JSON
+ def distributed_engine_rules_2_json_simple(rules)
+ #TODO
+ end
+
+# TODO: we have duplicate functions here (see ui/zombies/zombies.rb), maybe we need to
+# organize the code differently.
+
+ # Takes a list of zombies and format the results in a JSON array.
+ def zombies2json_simple(zombies)
+ zombies_hash = {}
+ i = 0
+
+ zombies.each do |zombie|
+ # create hash of zombie details
+ zombies_hash[i] = (get_simple_hooked_browser_hash(zombie))
+ i+=1
+ end
+
+ zombies_hash
+ end
+
+ # create a hash of simple hooked browser details
+ def get_simple_hooked_browser_hash(hooked_browser)
+
+ browser_icon = BeEF::Models::BrowserDetails.browser_icon(hooked_browser.session)
+ os_icon = BeEF::Models::BrowserDetails.os_icon(hooked_browser.session)
+ domain = BeEF::Models::BrowserDetails.get(hooked_browser.session, 'HostName')
+
+ return {
+ 'session' => hooked_browser.session,
+ 'ip' => hooked_browser.ip,
+ 'domain' => domain,
+ 'browser_icon' => browser_icon,
+ 'os_icon' => os_icon
+ }
+
+ end
end
end
diff --git a/public/javascript/ui/panel/DataGrid.js b/public/javascript/ui/panel/DataGrid.js
index 51d5f37e8..ebdeefb21 100644
--- a/public/javascript/ui/panel/DataGrid.js
+++ b/public/javascript/ui/panel/DataGrid.js
@@ -11,7 +11,6 @@ DataGrid = function(url, page, base) {
url: this.url,
storeId: 'myStore',
baseParams: this.base,
- //autoLoad: {params:{start:0, limit:this.page, sort:"date", dir:"DESC"}},
idProperty: 'id',
fields: ['id','type','event','date'],
totalProperty: 'count',
diff --git a/public/javascript/ui/panel/PanelViewer.js b/public/javascript/ui/panel/PanelViewer.js
index 57127c03d..562c315b7 100644
--- a/public/javascript/ui/panel/PanelViewer.js
+++ b/public/javascript/ui/panel/PanelViewer.js
@@ -1,5 +1,5 @@
PanelViewer = {};
-var mainPanel, zombiesTreeLists, zombieTabs;
+var mainPanel, zombiesTreeLists, zombieTabs, zombiesManager;
Ext.onReady(function() {
@@ -11,6 +11,7 @@ Ext.onReady(function() {
};
zombieTabs = new ZombieTabs(zombiesTreeLists);
+ zombiesManager = new ZombiesMgr(zombiesTreeLists);
mainPanel = new MainPanel();
var viewport = new Ext.Viewport({
@@ -28,5 +29,30 @@ Ext.onReady(function() {
new DoLogout();
new AboutWindow();
- new ZombiesMgr(zombiesTreeLists);
+});
+
+/*
+ * Panel Events Updater
+ *
+ * This event updater retrieves updates every 8 seconds. Those updates
+ * are then pushed to various managers (i.e. the zombie manager).
+ */
+Ext.TaskMgr.start({
+ run: function() {
+ Ext.Ajax.request({
+ url: '/ui/panel/hooked-browser-tree-update.json',
+ method: 'POST',
+ success: function(response) {
+ var updates = Ext.util.JSON.decode(response.responseText);
+ var distributed_engine_rules = (updates['ditributed-engine-rules']) ? updates['ditributed-engine-rules'] : null;
+ var hooked_browsers = (updates['hooked-browsers']) ? updates['hooked-browsers'] : null;
+
+ if(zombiesManager && hooked_browsers) {
+ zombiesManager.updateZombies(hooked_browsers, distributed_engine_rules);
+ }
+ }
+ });
+ },
+
+ interval: 8000
});
\ No newline at end of file
diff --git a/public/javascript/ui/panel/ZombiesMgr.js b/public/javascript/ui/panel/ZombiesMgr.js
index 2176c22c2..0a447455d 100644
--- a/public/javascript/ui/panel/ZombiesMgr.js
+++ b/public/javascript/ui/panel/ZombiesMgr.js
@@ -1,24 +1,10 @@
var ZombiesMgr = function(zombies_tree_lists) {
- var selectedZombie = null;
-
- var addZombie = function(zombie){
- selectedZombie = zombie;
- }
-
- var delZombie = function(zombie){
- if (selectedZombie.session == zombie.session) {
- selectedZombie = null;
- }
- return null;
- }
-
- var getZombie = function(){
- return selectedZombie;
- }
+ //save the list of trees in the object
+ this.zombies_tree_lists = zombies_tree_lists;
// this is a helper class to create a zombie object from a JSON hash index
- var zombieFactory = function(index, zombie_array){
+ this.zombieFactory = function(index, zombie_array){
text = "
";
text += "
";
text += zombie_array[index]["ip"];
@@ -35,79 +21,44 @@ var ZombiesMgr = function(zombies_tree_lists) {
return new_zombie;
}
- var updateZombies = function(){
- Ext.Ajax.request({
- url: '/ui/zombies/select/offline/simple.json',
- method: 'POST',
- success: function(response) {
- var offline_zombies = Ext.util.JSON.decode(response.responseText);
-
- for(tree_type in zombies_tree_lists) {
- zombies = zombies_tree_lists[tree_type];
- zombies.compareAndRemove(offline_zombies, false);
- }
-
- for(tree_type in zombies_tree_lists) {
- zombies = zombies_tree_lists[tree_type];
-
- for(var i in offline_zombies) {
- var zombie = zombieFactory(i, offline_zombies);
-
- if(tree_type=='requester') {
- //TODO logic for the requester starts here
- zombie['checked'] = true;
- }
-
- zombies.addZombie(zombie, false);
- }
- }
- }
- });
-
- Ext.Ajax.request({
- url: '/ui/zombies/select/online/simple.json',
- method: 'POST',
- success: function(response){
- var online_zombies = Ext.util.JSON.decode(response.responseText);
-
- for(tree_type in zombies_tree_lists) {
- zombies = zombies_tree_lists[tree_type];
- zombies.compareAndRemove(online_zombies, true);
- }
- for(tree_type in zombies_tree_lists) {
- zombies = zombies_tree_lists[tree_type];
-
- for(var i in online_zombies) {
- var zombie = zombieFactory(i, online_zombies);
-
- if(tree_type=='requester') {
- //TODO logic for the requester starts here
- zombie['checked'] = true;
- }
-
- zombies.addZombie(zombie, true);
- }
- }
-
- for(tree_type in zombies_tree_lists) {
-
- zombies = Ext.getCmp(zombies_tree_lists[tree_type].id);
-
- if(zombies.online_zombies.childNodes.length > 0) {
- //TODO: find a way to destroy folders that are empty
- zombies.online_zombies.expand(true);
- }
-
- if(zombies.offline_zombies.childNodes.length > 0) {
- zombies.offline_zombies.expand(true);
- }
- }
+ /*
+ * Update the hooked browser trees
+ * @param: {Literal Object} an object containing the list of offline and online hooked browsers.
+ * @param: {Literal Object} an object containing the list of rules from the distributed engine.
+ */
+ this.updateZombies = function(zombies, rules){
+ var offline_zombies = zombies["offline"];
+ var online_zombies = zombies["online"];
+
+ for(tree_type in this.zombies_tree_lists) {
+ hooked_browsers_tree = this.zombies_tree_lists[tree_type];
+
+ //we compare and remove the hooked browsers from online and offline branches for each tree.
+ hooked_browsers_tree.compareAndRemove(offline_zombies, false);
+ hooked_browsers_tree.compareAndRemove(online_zombies, true);
+
+ //add an offline browser to the tree
+ for(var i in offline_zombies) {
+ var offline_hooked_browser = this.zombieFactory(i, offline_zombies);
+ hooked_browsers_tree.addZombie(offline_hooked_browser, false);
}
- });
+
+ //add an online browser to the tree
+ for(var i in online_zombies) {
+ var online_hooked_browser = this.zombieFactory(i, online_zombies);
+ hooked_browsers_tree.addZombie(online_hooked_browser, true);
+ //TODO: add the rules here
+ }
+
+ //expand the online hooked browser tree lists
+ if(hooked_browsers_tree.online_zombies.childNodes.length > 0) {
+ hooked_browsers_tree.online_zombies.expand(true);
+ }
+
+ //expand the offline hooked browser tree lists
+ if(hooked_browsers_tree.offline_zombies.childNodes.length > 0) {
+ hooked_browsers_tree.offline_zombies.expand(true);
+ }
+ }
}
-
- Ext.TaskMgr.start({
- run: updateZombies,
- interval: 8000
- });
-}
\ No newline at end of file
+};
\ No newline at end of file