Update BrowserDetails to store textual OID-style key/value data

This commit is contained in:
Brendan Coles
2019-02-26 15:22:54 +00:00
parent 25988d1728
commit 03424c804e
22 changed files with 546 additions and 428 deletions

View File

@@ -0,0 +1,97 @@
//
// Copyright (c) 2006-2019 Wade Alcorn - wade@bindshell.net
// Browser Exploitation Framework (BeEF) - http://beefproject.com
// See the file 'doc/COPYING' for copying permission
//
BrowserDetailsDataGrid = function(url, page, base) {
this.page = page;
this.url = url;
this.base = typeof(base) != 'undefined' ? base : {};
// RESTful API token
var token = BeefWUI.get_rest_token();
this.store = new Ext.ux.data.PagingJsonStore({
root: 'details',
autoDestroy: true,
autoLoad: true,
proxy: new Ext.data.HttpProxy({
method: 'GET',
url: url + '?token=' + token
}),
storeId: 'details-store',
baseParams: this.base,
idProperty: 'id',
fields: ['key','value', 'source'],
totalProperty: 'count',
remoteSort: false,
sortInfo: {field: "key", direction: "ASC"}
});
this.bbar = new Ext.PagingToolbar({
pageSize: this.page,
store: this.store,
displayInfo: true,
displayMsg: 'Displaying zombie browser details {0} - {1} of {2}',
emptyMsg: 'No zombie browser data to display'
});
this.columns = [{
id: 'details-key',
header: 'Key',
dataIndex: 'key',
sortable: true,
width: 40,
renderer: function(value) {
return $jEncoder.encoder.encodeForHTML(value);
}
}, {
id: 'details-value',
header: "Value",
dataIndex: 'value',
sortable: true,
width: 60,
renderer: function(value) {
return $jEncoder.encoder.encodeForHTML(value);
}
},
];
BrowserDetailsDataGrid.superclass.constructor.call(this, {
region: 'center',
id: 'topic-grid',
loadMask: {msg:'Loading Feed...'},
sm: new Ext.grid.RowSelectionModel({
singleSelect: true
}),
viewConfig: {
forceFit: true
},
listeners: {
afterrender: function(datagrid) {
datagrid.store.reload({params:{start:0, limit:datagrid.page, sort:"key", dir:"ASC"}});
},
rowclick: function(grid, rowIndex) {
var r = grid.getStore().getAt(rowIndex).data;
},
containercontextmenu: function(view, e) {
e.preventDefault();
},
}
}) // BrowserDetailsDataGrid.superclass
}
Ext.extend(BrowserDetailsDataGrid, Ext.grid.GridPanel, {});
Ext.override(Ext.PagingToolbar, {
doRefresh: function() {
delete this.store.lastParams;
this.doLoad(this.cursor);
}
});

View File

@@ -8,83 +8,21 @@
* The main Tab panel for the selected zombie.
*/
ZombieTab_DetailsTab = function(zombie) {
var store_summary = new Ext.data.GroupingStore({
url: '<%= @base_path %>/modules/select/zombie_summary.json',
baseParams: {zombie_session: zombie.session} ,
reader: new Ext.data.JsonReader({
root: 'results'
},[
{name: 'data'},
{name: 'category'},
{name: 'from'}
]),
autoLoad: false,
sortInfo:{field: 'from', direction: "ASC"},
groupField:'category'
});
var grid_summary = new Ext.grid.GridPanel({
store: store_summary,
border: false,
region: 'center',
layout: 'fit',
hideHeaders: true,
loadMask: {msg:'Loading Information...'},
view: new Ext.grid.GroupingView({
forceFit:true,
groupTextTpl: '{text} ({[values.rs.length]} {[values.rs.length > 1 ? "Items" : "Item"]})',
emptyText: "No Record found: this tab gets populated after you've ran some command modules.",
enableRowBody:true
}),
viewConfig: {
forceFit:true
},
columns:[
{
header: 'information',
dataIndex: 'data',
renderer: function(value, p, record) {
html = '';
for(index in value) {
result = value[index];
index = index.toString().replace('_', ' ');
html += String.format('<b>{0}</b>: {1}<br>', index, $jEncoder.encoder.encodeForHTML(result));
}
return html;
}
},
{header: 'command_module', dataIndex:'from', width: 25, renderer: function(value){return $jEncoder.encoder.encodeForHTML(value);}},
{header: 'Category', dataIndex:'category', hidden: true, renderer: function(value){return $jEncoder.encoder.encodeForHTML(value);}}
]
});
ZombieTab_DetailsTab.superclass.constructor.call(this, {
id: 'zombie-details-tab'+zombie.session,
layout: 'fit',
title: 'Details',
items: {
layout:'border',
border: false,
items:[grid_summary]
},
listeners:{
activate : function(maintab){
maintab.items.items[0].items.items[0].store.reload();
}
}
});
var zombieDetails = new BrowserDetailsDataGrid('/api/browserdetails/' + zombie.session, 30);
zombieDetails.border = false;
ZombieTab_DetailsTab.superclass.constructor.call(this, {
id: 'browser-details-tab' + zombie.session,
layout: 'fit',
title: 'Details',
items: {
layout: 'border',
border: false,
items:[zombieDetails]
}
});
};
Ext.extend(ZombieTab_DetailsTab, Ext.Panel, {});
Ext.extend(ZombieTab_DetailsTab, Ext.Panel, {} );