From ad186a56de01a6788ccadaac4f9281968e14df40 Mon Sep 17 00:00:00 2001 From: Brendan Coles Date: Fri, 15 Feb 2019 13:33:36 +0000 Subject: [PATCH] Add Zombies tab to main panel --- core/main/rest/handlers/hookedbrowsers.rb | 23 ++++++++++++++++++- extensions/admin_ui/api/handler.rb | 2 +- .../media/javascript/ui/panel/DataGrid.js | 6 ++--- .../media/javascript/ui/panel/MainPanel.js | 23 +++++++++++++++---- .../javascript/ui/panel/tabs/ZombieTabLogs.js | 2 +- 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/core/main/rest/handlers/hookedbrowsers.rb b/core/main/rest/handlers/hookedbrowsers.rb index 9654a0a9f..e53250164 100644 --- a/core/main/rest/handlers/hookedbrowsers.rb +++ b/core/main/rest/handlers/hookedbrowsers.rb @@ -79,6 +79,25 @@ module BeEF hb.destroy end + + # + # @note returns all zombies + # + get '/all' do + hbs = [] + BeEF::Core::Models::HookedBrowser.all.each do |hook| + hbs << get_hb_details(hook) + end + + output = { + 'count' => hbs.length, + 'zombies' => hbs + } + + output.to_json + end + + # # @note this is basically the same call as /api/hooks, but returns different data structured in arrays rather than objects. # Useful if you need to query the API via jQuery.dataTable < 1.10 which is currently used in PhishingFrenzy @@ -167,7 +186,9 @@ module BeEF 'ip' => hb.ip, 'domain' => details.get(hb.session, 'HostName'), 'port' => hb.port.to_s, - 'page_uri' => details.get(hb.session, 'PageURI') + 'page_uri' => details.get(hb.session, 'PageURI'), + 'firstseen' => hb.firstseen, + 'lastseen' => hb.lastseen, } end diff --git a/extensions/admin_ui/api/handler.rb b/extensions/admin_ui/api/handler.rb index 9ab420dbb..fb7ea9d6d 100644 --- a/extensions/admin_ui/api/handler.rb +++ b/extensions/admin_ui/api/handler.rb @@ -42,7 +42,7 @@ module API #NOTE: order counts! make sure you know what you're doing if you add files esapi = %w(esapi/Class.create.js esapi/jquery-3.3.1.min.js esapi/jquery-encoder-0.1.0.js) ux = %w(ui/common/beef_common.js ux/PagingStore.js ux/StatusBar.js ux/TabCloseMenu.js) - panel = %w(ui/panel/common.js ui/panel/DistributedEngine.js ui/panel/PanelStatusBar.js ui/panel/tabs/ZombieTabDetails.js ui/panel/tabs/ZombieTabLogs.js ui/panel/tabs/ZombieTabCommands.js ui/panel/tabs/ZombieTabRider.js ui/panel/tabs/ZombieTabXssRays.js wterm/wterm.jquery.js ui/panel/tabs/ZombieTabIpec.js ui/panel/tabs/ZombieTabAutorun.js ui/panel/PanelViewer.js ui/panel/DataGrid.js ui/panel/MainPanel.js ui/panel/ZombieTab.js ui/panel/ZombieTabs.js ui/panel/zombiesTreeList.js ui/panel/ZombiesMgr.js ui/panel/tabs/ZombieTabNetwork.js ui/panel/tabs/ZombieTabRTC.js ui/panel/Logout.js ui/panel/WelcomeTab.js ui/panel/ModuleSearching.js) + panel = %w(ui/panel/common.js ui/panel/DistributedEngine.js ui/panel/PanelStatusBar.js ui/panel/tabs/ZombieTabDetails.js ui/panel/tabs/ZombieTabLogs.js ui/panel/tabs/ZombieTabCommands.js ui/panel/tabs/ZombieTabRider.js ui/panel/tabs/ZombieTabXssRays.js wterm/wterm.jquery.js ui/panel/tabs/ZombieTabIpec.js ui/panel/tabs/ZombieTabAutorun.js ui/panel/PanelViewer.js ui/panel/DataGrid.js ui/panel/ZombieDataGrid.js ui/panel/MainPanel.js ui/panel/ZombieTab.js ui/panel/ZombieTabs.js ui/panel/zombiesTreeList.js ui/panel/ZombiesMgr.js ui/panel/tabs/ZombieTabNetwork.js ui/panel/tabs/ZombieTabRTC.js ui/panel/Logout.js ui/panel/WelcomeTab.js ui/panel/ModuleSearching.js) global_js = esapi + ux + panel diff --git a/extensions/admin_ui/media/javascript/ui/panel/DataGrid.js b/extensions/admin_ui/media/javascript/ui/panel/DataGrid.js index 0eaa5d435..4d1353419 100644 --- a/extensions/admin_ui/media/javascript/ui/panel/DataGrid.js +++ b/extensions/admin_ui/media/javascript/ui/panel/DataGrid.js @@ -5,7 +5,7 @@ // -DataGrid = function(url, page, base) { +LogsDataGrid = function(url, page, base) { this.page = page; this.url = url; this.base = typeof(base) != 'undefined' ? base : {}; @@ -72,7 +72,7 @@ DataGrid = function(url, page, base) { width: 35 }]; - DataGrid.superclass.constructor.call(this, { + LogsDataGrid.superclass.constructor.call(this, { region: 'center', id: 'topic-grid', loadMask: {msg:'Loading Feed...'}, @@ -93,7 +93,7 @@ DataGrid = function(url, page, base) { }); }; -Ext.extend(DataGrid, Ext.grid.GridPanel, {}); +Ext.extend(LogsDataGrid, Ext.grid.GridPanel, {}); //Because we're using paging stores now, we have to override the PagingToolbar refresh Ext.override(Ext.PagingToolbar, { diff --git a/extensions/admin_ui/media/javascript/ui/panel/MainPanel.js b/extensions/admin_ui/media/javascript/ui/panel/MainPanel.js index e72578a69..01dcf2426 100644 --- a/extensions/admin_ui/media/javascript/ui/panel/MainPanel.js +++ b/extensions/admin_ui/media/javascript/ui/panel/MainPanel.js @@ -29,8 +29,13 @@ MainPanel = function(){ } }); - this.grid = new DataGrid('<%= @base_path %>/logs/all.json',30); - this.grid.border = false; + + this.logs_grid = new LogsDataGrid('<%= @base_path %>/logs/all.json',30); + this.logs_grid.border = false; + + this.zombies_grid = new ZombieDataGrid('/api/hooks/all', 30); + this.zombies_grid.border = false; + this.welcome_tab = new WelcomeTab; MainPanel.superclass.constructor.call(this, { @@ -53,13 +58,23 @@ MainPanel = function(){ shadow:true, items:[ this.welcome_tab - ]},{ + ] + },{ id:'logs-view', layout:'border', title:'Logs', hideMode:'offsets', items:[ - this.grid + this.logs_grid + ] + }, + { + id:'zombies-view', + layout:'border', + title:'Zombies', + hideMode:'offsets', + items:[ + this.zombies_grid ] }] }); diff --git a/extensions/admin_ui/media/javascript/ui/panel/tabs/ZombieTabLogs.js b/extensions/admin_ui/media/javascript/ui/panel/tabs/ZombieTabLogs.js index e9511eddd..2d5b15d37 100644 --- a/extensions/admin_ui/media/javascript/ui/panel/tabs/ZombieTabLogs.js +++ b/extensions/admin_ui/media/javascript/ui/panel/tabs/ZombieTabLogs.js @@ -9,7 +9,7 @@ */ ZombieTab_LogTab = function(zombie) { - var zombieLog = new DataGrid('<%= @base_path %>/logs/zombie.json',30,{session:zombie.session}); + var zombieLog = new LogsDataGrid('<%= @base_path %>/logs/zombie.json',30,{session:zombie.session}); zombieLog.border = false; ZombieTab_LogTab.superclass.constructor.call(this, {