红与蓝:现代Webshell检测引擎免杀对抗与实践

上半年Webshell话题很火,业界举办了数场对抗挑战赛,也发布了多篇站在安全产品侧,着重查杀思路的精彩文章,但鲜有看到以蓝军视角为主的paper。

作为多场挑战赛的参赛者及内部红蓝对抗的参与者,笔者试着站在蓝军角度,聊聊现代Webshell对抗的一些思路,也以PHP Webshell为例,分享包括利用PHP自身bug、构造PHP内存马、强制赋值私有变量等一些还没有被提及到但又比较有趣的trick。

希望能对正在参与某些大型攻防对抗演练的你有所收获。

1 轻松绕过传统规则查杀

即便是现在一些主流商业产品,也大量沿用了传统木马特征检测的思路,使用规则或者样本库作为单一查杀手段。
对蓝军来说,这样的安全防护能力无疑是十分单薄和脆弱,通常是不堪一击的。

1.1一个极端的case

先来看一个极端的case
红与蓝:现代Webshell检测引擎免杀对抗与实践_第1张图片

一个公开的Webshell

这样一个在百度就可以搜索到的webshell,自然会被检出查杀。但只是将其做一个简单变形:
红与蓝:现代Webshell检测引擎免杀对抗与实践_第2张图片
POST改成GET

将POST改成GET,就能成功绕过该产品。可见即使是很多商业级产品,也只是简单维护了一个样本库而已。

这虽然是一个比较极端的case,但在面对主流的规则查杀产品时,对抗原理也是相通的,只是需要更高强度地编码。

1.2 花括号的妙用

红与蓝:现代Webshell检测引擎免杀对抗与实践_第3张图片

PHP中,实现了数组索引对于curly brace的支持(7.4之后已标记为deprecated,commit 4416)

这意味着一个数组索引a[0]中的方括号也可以用花括号{0}替代,同时再插入一些圆括号,使原义不变,但正则却匹配不到,便可以成功bypass几乎所有主流规则查杀工具。

更多这类符号可以从词法分析角度挖掘,对于不同的编程语言,其编译器源码或者官方文档中会有对Token的定义。
红与蓝:现代Webshell检测引擎免杀对抗与实践_第4张图片

PHP Token列表

通过查找Space、Separator、Comment、Other等类别,能发现更多有趣的trick。

除此之外,利用加密、或者异或等数学运算生成的样本,也能达到特征湮灭的目的,传统规则查杀的绕过不是本篇重点,这里不再一一列举。其根本原因是,正则表达式的意义就只是在有限长的字符集中匹配有限长度的字符子集,但PHP等编程语言却是图灵完备的,其在字符层面上的排列会有无穷种组合,所以通过高强度的编码便能达到bypass目的。

正则表达式和图灵完备的编程语言之间天然的矛盾也决定了,无论怎样复杂的规则都无法从字符层面cover住图灵完备的PHP等语言,必然带来绕过的可能。

2 突破现代Webshell查杀引擎

在上半年发起公开挑战赛的数款Webshell检测产品都聪明地摒弃了规则方式,通过静态分析或沙箱执行等手段,尽可能地贴近编程语言的解释和执行,有效地减少了传统绕过的可能。

但同时在参赛时也发现,由于静态分析或沙箱执行本身的缺陷,也带来了新的bypass可能。

2.1静态分析缺陷

静态分析也就是白盒的思路,从语法树角度实现了从sink->source的追溯,其一般的工作路径是这样:
红与蓝:现代Webshell检测引擎免杀对抗与实践_第5张图片
通过词法分析->语法分析->语义分析实现了对程序语法上的理解。但由于代码没有真正run起来,实际上并不能实现对一段代码完全地理解,尤其是在面对PHP这类较为灵活的脚本,而非静态类型语言时,利用这点缺陷可以发掘出非常多的case。

2.1.1利用php自身的bug

最极端的情况是,利用php解释器或其他php底层的bug,使语法树和实际run起来的代码表达不一致,达到在语法层面合法,但实际运行起来是webshell的目的。

红与蓝:现代Webshell检测引擎免杀对抗与实践_第6张图片

在这个case中,按照php的语法,并没有任何操作对KaTeX parse error: Expected 'EOF', got '&' at position 27: …了修改(php中引用必须显式=&̲形式)。但在实际运行时由于ph…bar->arr的值实际上被改变,key中会新增system和$_GET[mo]值。

从语法树角度看是回调了两个空值,但实际运行时却是回调了
register_tick_function(‘system’,$_GET[‘mo’]);
成功绕过所有主流的静态分析工具。

不过PHP官方并不将其视为一个bug,官方对此的解释是
在这里插入图片描述

但从PHP对引用的定义来看,必须显式使用=&操作才能获取到引用的返回。如果非要强行解释的话,笔者认为是当执行&get_value( k e y ) 时 实

你可能感兴趣的:(技术分享,shell,安全,安全漏洞)