
前言:Goby之前開放的插件入口點較少,大家只能在掃描前、掃描后執行事件,無法參與掃描過程中來。為實現更多場景的應用及提高掃描效率(如:后臺爆破子域名等),Goby開放了一些新的API:事件通知機制、自定義頁面等,并開發了一個統計數據庫信息的插件——Database Asset,作為案例。該插件可以統計掃描任務中獲取到的數據并進行篩選,篩選出用戶需要顯示的數據庫信息。
0x001 最終效果
安裝完成插件后,Goby左側導航欄會出現我們的插件入口,開始掃描后,插件會統計掃描到的數據庫信息,插件默認統計mysql,redis,MongoDB,Elasticsearch這四個數據庫。掃描過程中會將統計的數據庫數量展現在左側導航欄插件入口標記處。
插件開發文檔 https://gobies.org/docs.html

0x002 最終效果
2.1 確定功能的入口點及用到的API
入口點:左側導航
自定義頁面并可以后臺運行的API:showPage(url,true)
function activate(content) {goby.registerCommand('left-nav',function(){//因為支持相對路徑,所以傳入相對路徑,第二個參數為后臺運行goby.showPage('./assets/index.html',true); })
}
exports.activate = activate;
需要實時獲取掃描過程中的數據以及掃描狀態改變時執行一些自定義事件:bindEvent;
掃描到符合條件的數據是需要通知用戶:changeBadge;
點擊查看信息頁面跳轉:showPage(url,false);
2.2 開發流程
2.2.1 package.json中設置入口點以及initEvents
"views": {"leftNav": [{"command":"left-nav","title": "Database","icon": "src/assets/img/logo.png"}]}
"initEvents": ["left-nav"]
注:新版本支持String 與 Array,如果要執行多個命令,只需將命令依次放到數組里,Goby會在安裝插件成功后,主動執行指定命令:
"initEvents": ["event1", "event2"]
2.2.2 html頁面初始化
首先聲明我們需要統計的數據庫信息、消息通知的內容、整合后的數據對象、任務id:
let app = ["mysql" ,"redis", "MongoDB", "Elasticsearch"];
//消息通知let num = 0;//保存數據let data = {};//任務Idlet taskId;
2.2.3 綁定事件通知及設置Badge
實時獲取數據,對掃描數據進行處理。因為太多,這里只展示對onApp數據的處理,數據的詳細信息在官網中有說明。
goby.bindEvent('onApp',function(content){init();let ip = content.hostinfo.match(ipreg)[0];let port = content.hostinfo.split(':').pop();initIp(ip);initPort(ip,port,content);if(app.map((v,k)=>v.toLowerCase()).includes(content.product.toLowerCase())){num++;goby.changeBadge('leftNav','left-nav',num);let tbody = $(`#${taskId}`)[0];if(!tbody){let ttbody = $(`<tbody id="${taskId}" class="${taskId}"><tr class="task"><td colspan="3">任務 : ${taskId}</td> </tr></tbody>`);$('table').append(ttbody);}if($('.noData').css('display')!='none'){$('.noData').hide();}if($('table').css('display')=='none'){$('table').css('display','table')}let tr = $(`<tr class="info"><td>${content.product}</td><td>${ip}</td><td>${port}</td></tr>`);$(tr).prop('ip',ip);$(tr).prop('port',port);$(tr).prop('taskId',taskId);$(`#${taskId}`).append(tr);}})
點擊跳轉頁面,使用委托事件綁定點擊事件,調用showPage API打開一個臨時頁面,并將要展示的數據傳過去。
$("table").delegate('.info','click',function(){let info = data[$(this).prop('taskId')][$(this).prop('ip')][$(this).prop('port')];
//因為整合數據后偶爾會沒有ip與port,所以在手動設置一遍info.ip = [$(this).prop('ip')];
info.port = [$(this).prop('port')];goby.showPage(`./detail.html?info=${encodeURI(JSON.stringify(info))}`)})
2.2.4 數據展示
詳情頁面中就是將傳送數據的展示:

0x003 小結
這個插件沒有使用第三方UI框架,寫的樣式很簡單,這次在showPage頁面中內置了goby對象,不需要在通過parent.goby來訪問API,可直接使用,除此之外內置了一些css簡單樣式,不需要自己寫的多復雜,只是簡單的展示數據庫信息。
Goby的showPage頁面的還內置的一些css顏色變量(主題顏色變量),我們在開發的時候可以使用這些變量來設置顏色,這樣我們的頁面還會隨著Goby主題的切換而變化:

如何下載Database Asset插件?
Database Asset目前只支持到超級內測版,后面很快支持到內測版、開發版與大家見面,屆時,后臺路徑爆破、IP地理位置識別、操作系統識別等需求都可以通過此方式實現。一起期待吧~
本次用到的API在B站都有詳細的教學,歡迎大家到彈幕區合影~
- 如何開啟一個自定義頁面https://www.bilibili.com/video/BV1Ha411w7RF/
- 綁定事件通知https://www.bilibili.com/video/BV1Py4y1q7LD/
- 設置Badgehttps://www.bilibili.com/video/BV1Ur4y1F7Bp/
- 默認瀏覽器打開給定的URLhttps://www.bilibili.com/video/BV11z4y1k7zP/
文章來自Goby團隊,轉載請注明出處。
下載Goby內測版,請關注公眾號:Gobysec
下載Goby正式版,請訪問官網:http://gobies.org