逆向人的goby插件開發思路
前言
Goby是一款新的網絡安全測試工具,由趙武Zwell(Pangolin、JSky、FOFA作者)打造,它能夠針對一個目標企業梳理最全的攻擊面信息,同時能進行高效、實戰化漏洞掃描,并快速地從一個驗證入口點,切換到橫向。我們希望能夠輸出更具生命力的工具,能夠對標黑客的實際能力,幫助企業來有效地理解和應對網絡攻擊。
前些天寫了一文《淺談Goby Redteam版本破解》(https://t.zsxq.com/BmuN3RV) 中最終是通過寫插件來獲取了redteam版本的license。
而接下來的本文將講述我以一個逆向人的思路,是如何從0基礎,沒看官方相關文檔而開發goby插件的。
基礎信息收集
首先確定自己要開發什么類型的插件。由于我本身不是很懂滲透并沒有什么想法,就從官方的里面選了一個。
訪問goby官方的github的project,鏈接如下
(https://github.com/gobysec/GobyExtension/projects)
各種插件:

最后我選擇的是數據編碼解碼的插件,確定目標后接下來就是如何開發插件,這里我選擇了一個goby的編碼插件xcode來作為我的參照。在goby上下載插件。根據goby的程序頁面顯示,插件存放在extensions目錄下。

打開目錄后找到我們下載的xcode的文件夾。
可以看到目錄如下:

其中README.md是記錄軟件使用方法,也就是插件下載頁面的詳情。
CHANGELOG.md是更新日志,也就是插件下載頁面的更新日志。
程序的主要功能和代碼在package.json和src文件夾中。
xcode的package.json內容如下:
{
"name": "Xcode",
"publisher": "ettercap",
"description": "The tool is used for string encoding",
"version": "0.1.2",
"icon": "src/assets/img/encode.png",
"engines": "1.6.170",
"initEvents": "",
"main": "./src/extension.js",
"contributes": {
"views": {
"scanDia": [
{
"command": "encode",
"title": "Xcode",
"tips":"Xcode",
"icon": "src/assets/img/encode.png"
}
],
"toolbar": [
{
"command": "encode",
"title": "Xcode",
"icon": "./src/assets/img/encode.png",
"tips":"Xcode"
}
]
}
},
"language":{
"CN":"src/assets/translate/CN/translate.json"
},
"scripts": {},
"devDependencies": {},
"dependencies": {}
}
主要是和展示在goby主界面相關的信息,例如圖標標題等,主要需要注意的是
"main": "./src/extension.js" # 以我的理解 這個類似于入口點,主函數 "command": "encode", # 這個是點擊插件欄目調用的命令。
接下來看一下src文件夾,看一下其內容。

打開code.html看一下,界面如下:

goby啟動插件后界面如下:

至此,我們得到一個結論,goby的插件實際上就是一個JavaScript項目。同時也有一個疑惑,為何兩個界面展示不一樣,而后進行進一步的分析。
以下是extension.js的內容:
function activate(content) {
let translate = require(__dirname+'/assets/js/translate.js');
goby.registerCommand('encode', function(content){
let path = __dirname + "/code.html"
let title = getTranslate('Xcode');
goby.showIframeDia(path,title, "800", "800");
});
goby.bindEvent('onChangeLang',()=>{
let iframes = Array.from(document.querySelectorAll('#iframe-dia iframe'));
let iframe = iframes.find((iframe)=>{
return iframe.contentWindow.goby.id == goby.id;
})
iframe && changeLang(iframe);
})
function changeLang(iframe){
let title = getTranslate('Xcode')
goby.showIframeDia(iframe.getAttribute('src'),title , "800", "800");
}
function getTranslate(key) {
let lang = goby.getLang();
try {
let content = eval("translate[lang][key]");
if(content == undefined){
try {
let content = eval("translate['EN'][key]");
if(content == undefined){
return key;
}else{
return content;
}
} catch (error) {
console.log(error);
return key;
}
}else{
return content;
}
} catch (error) {
try {
let content = eval("translate['EN'][key]");
if(content == undefined){
return key;
}else{
return content;
}
} catch (error) {
console.log(error);
return key;
}
}
}
}
exports.activate = activate;
主要功能是調用goby的API綁定事件,注冊命令等。
goby.registerCommand('encode', function(content){
let path = __dirname + "/code.html"
let title = getTranslate('Xcode');
goby.showIframeDia(path,title, "800", "800");
});
// 注冊命令:path是顯示的頁面,也就是一個html文件;title也就是標題;后面兩個參數就是界面長寬
除了主要功能之外,作者還綁定了onChangeLang事件,也就是當設置的語言改變時,界面內容也會跟隨變化。
隨后看code.html內容有這么一段代碼:
let goby = parent.goby; // 獲取GobyAPi
let fs = parent.require('fs');
let results = []; // 定義搜索結果數組
let net = parent.require('net')
// 字符串轉base64
function encode(str) {
var base64 = $.base64.encode(str);
return base64;
}
function lang() {
//獲取當前Languzge
let language = goby.getLang();
//判斷翻譯文件是否存在
let translateState = fs.existsSync(goby.__dirname + '/assets/translate/' + language + '/html.json');
//翻譯文件存在則使用翻譯文件,否則使用默認EN翻譯
let lang = translateState ? language : 'EN';
let a = $.i18n.init({
lng: language, //指定語言
useCookie: false,
resGetPath: './assets/translate/' + lang + '/html.json',//語言包的路徑
}, function (err, t) {
if (!err) {
$('[data-i18n]').i18n(); // 通過選擇器集體翻譯
return;
}
goby.showErrorMessage(err)
});
}
lang();
//當lang改變時更新頁面內容
goby.bindEvent('onChangeLang', () => {
lang();
})
這段代碼用于根據語言加載內容,使用了goby的API這也解釋了為什么我們自己使用瀏覽器和goby打開界面為何不同。
下面開始插件的開發。
插件開發
當了解其架構之后,插件的開發就相當簡單了。(其實我并不懂JavaScript,但我會復制粘貼)
想到數據編碼這方面我就想到了一個特別好用的工具,Cyberchef(要看效果可以訪問http://pcat.cc/cc),這是英國通信總部GCHQ的一款開源產品,被稱為“網絡版瑞士軍刀”,功能強力,基本上可以解決絕大多數編碼問題以及加密解密問題。到其github(https://github.com/gchq/CyberChef/releases)下載編譯好的,也不用我去編譯。
第一步直接創建插件文件夾,把xcode的文件夾的內容全部拷貝過來。
第二步修改package.json主要需要修改的就是圖標的位置,名字之類的。
第三步修改extension.js,這里我把不需要的東西刪除掉。我的extension.js代碼如下
function activate(content) {
goby.registerCommand('encode', function(content){
let path = __dirname + "/CyberChef_v9.28.0.html"
let title = "Cyberchef";
goby.showIframeDia(path,title, "1000", "800");
});
}
exports.activate = activate;
只有一個功能,注冊encode指令。
第四步把Cyberchef的文件全部拷貝到src文件夾中。
把這些都修改完之后可以打開你的goby發現已下載的插件多了一個。如果發現寫的插件存在問題,比如打不開之類的可以下載官方的debug插件。

打開插件可以通過看控制臺,觀察運行是否有什么問題。

最后插件開發成功,如下圖。

開發過程中的問題
在上傳的過程中,出現了一些問題導致上傳失敗。但經過goby團隊的大佬的幫助還是解決了非常感謝。
主要原因就是上傳的格式不對。
需要注意的是打包上傳的文件夾需要是如下結構。


里面的第一層文件夾,需要和壓縮包名字一樣。
結語
其實我是不太懂滲透web這方面的知識,本來是不想寫的,后來想了想為社區貢獻嘛,不寒顫。然后就硬著頭皮開始搞了,后來發現并沒有我想象中的那么難。很多事情就是這樣,看著很難,但當你真的走進去之后你會發現,并沒有那么難,其中很大一部分困難都是我們想象出來的,或者因為自身惰性虛構出來的。