严正声明:本文仅限于技术讨论,严禁用于其他用途。
写在前面的话
后门是一种绕过认证或系统加密的方法。有时开发人员会出于某原因,为自己的程序构建后门程序。例如,为了提供简单的维护,开发人员引入了一个后门,可以恢复设备厂商的默认密码。而另一方面,攻击者则会将后门注入到有漏洞的服务器来接管服务器,执行攻击和上传恶意payload。比如,攻击者会注入后门来获取代码执行或上传文件的权限。另一方面,攻击者经常将后门注入易受攻击的服务器来接管服务器,执行攻击并上传payload。
后门为黑客发动进一步攻击铺平了道路。例如,攻击者可能会通过后门在受感染的服务器上执行代码或上传文件。此代码和文件将包含实际攻击,其中可能包含不同类型的payload,例如从内部数据库窃取数据或运行加密恶意软件。在这篇文章中,我们将讨论一些逃避检测的方法。我们将展示在我们的数据中发现的真实后门的示例,以及它们如何使用不同的规避和混淆技术,其中一些非常复杂。
后门的类型
后门有许多类型,是由不同编程语音编写的。比如,PHP语言编写的后门可以运行在PHP服务器上,用ASP编写的后门可以运行在.NET服务器上。后门的作用也是不同的,比如webshell可以用在受感染的系统上执行后门,从而使攻击者上传和执行文件。Github上有很多开源的后门,黑客可以选择注入一些知名的后门,但缺点是容易被检测到。一些高级黑客会自己开发后门或者对知名的后门使用混淆技术后再使用。
常见安全控制措施
安全控制措施会使用不同的方法来拦截后门。其中之一就是通过HTTP请求拦截注入的后门,另一种方法是在HTTP响应阶段分析后门的内容,确定是否含有恶意代码。攻击者在代码注入时会隐藏其真实意图,经常使用的避免被检测的技术有混淆函数和参数名,对恶意代码进行编码等。
PHP逃避技术
有许多方法可用于攻击者逃避检测。然而,总体动机是掩盖已知函数或PHP关键字。一些已知的功能和关键字包括:
字符重新排序
在本例中,页面的输出是一个“404 Not Found”
消息(第2行),这其实是一个错误消息。但这有一个潜入的后门代码(第3-13行)。关键字_POST
是明文形式写出的,攻击者用一个简单的方法就隐藏了。
第1行中,代码会关闭错误报告来避免用错误消息进行检测。第3行中,default
参数的定义字符串的随机组合。第4行中,about
参数再对字符串进行重新排序并变为大写来构造关键字_POST
。第5-12行中_POST
关键字用来检查HTTP请求是否通过POST方法发送和是否含有lequ
参数。如果是,后门就会用eval
函数运行lequ
参数发送的代码。这样,后门就可以在不适用关键字$_POST
的情况下读取post请求参数中的值。
字符串连接
攻击者用来混淆关键字的另一种方法是字符串连接,如下例所示:
与之前的后门不同的是,上面的后门只代码段中只有chr
函数(第1行)。该函数从0~255之间取一个数并返回对应的ASCII码字母。在字符或字符串的最后加一个点是PHP连接下一个字符串的方法。利用这个功能,攻击者可以将许多字符串连接起来创建一个已知函数的关键字,以躲过检测。
最后,此功能会从开头用“@”
符号执行。该后门的目的是创建一个用于评估post请求第一个参数代码的函数。使用此后门,攻击者可以使用POST请求欺骗检测系统并将任意代码发送到受感染的服务器,其中代码将被执行。
被抛弃的功能
虽然在以前版本的PHP中已经弃用了某些功能或功能,但我们仍然看到攻击试图在当前后门中滥用此功能,如下例所示:
这行代码看起来很简单,实际上代码使用了很多避免检测的技术,并且可以带来很大的危害。首先, str_rot13()
函数对字符串执行ROT13编码。ROT-13编码是一种每一个字母被另一个字母代替的方法。这个代替字母是由原来的字母向前移动13个字母而得到的。函数再'riny'
的输出是一个eval()
函数。然后,preg_replace()
函数执行一个正则表达式的搜索和替换。对上面例子的输出应该是:
意思是,从post
请求中评估参数'rose'
中的表达式。注意'preg_replace '
中的'/ e'
标签。这是一个不推荐使用的标记,它告诉程序执行'preg_replace'
函数的输出。PHP手册指出了有关此修饰符的以下警告:“ 小心不建议使用此修饰符,因为它可以轻松引入安全漏洞”。此修饰符在PHP 5.5.0中已弃用,自PHP 7.0.0起已删除。那么为什么要担心自PHP新版本以来被删除的已弃用功能呢?请看W3Techs的以下调查:
多步PHP逃避技术
存在一些攻击者使用多种技术的组合来混淆他们的代码逃避方法。
字符串逆向、连接、压缩和编码
在上面的例子中,攻击者使用了多种方法来隐藏代码。首先,攻击者使用有/e
修饰器的preg_replace
函数来评估代码。通过第2个参数,可以看出攻击payload被分割为多个字符串,并用运算符“.”
连接在一起。攻击者还使用strrev()
函数将连接的字符串lave
逆序就变成eval()
。然后就得到了最终的payload
:
这里,代码不仅使用base64编码进行编码,还使用“deflate”
数据格式进行压缩。通过解码和解压缩后,我们得到以下payload:
这就是在GET或POST请求中评估“error”参数中发送的代码。
字符串替换,连接和编码
在本例中,攻击者将函数名隐藏在变量中,并用base64编码来混淆后门。这里唯一看到的关键字就是第2行的str_replace
,而且只能使用1次。首先,第2行tsdg
参数的值是str_replace
,是通过用str_replace
函数将字符串bsbtbrb_rbebpblacbe
中的字母b移除来完成的。在这里,攻击者通过创建包含指定函数(包括附加字母)的字符串来混淆已知的PHP函数。然后,使用str_replace
函数删除这些字母。在第6-7行中,攻击者使用相同的方法给参数赋值“ base64_decode ”
,给参数liiy赋值“ create_function ”
。然后,第1,3,4,5行中还有四个包含base64编码文本的参数。在第8行中,这四个参数的值按特定顺序连接,以形成在base64中编码的长字符串。第8行中参数“ iuwt ”
包含以下代码:
此代码将创建一个函数,从base64编码的文本中删除所有“ hd ”
,然后解码它。在第9行中,执行此函数并将base64编码的文本解码为:
这就是后门,后门会执行通过cookie发送到受感染服务器的代码。在第6行中,使用preg_replace
函数和两个正则表达式更改通过cookie发送的值。然后,对已更改的文本进行base64解码并执行,运行攻击者发送的任意代码。这种后门反检测技术比之前提到的要复杂得多。在这里,除了使用PHP函数中的参数之外,后门本身也用base64编码。另外,为了避免简单的base64解码机制,base64文本被分割成四个部分,并且在随机位置加入字符“ hd ”
以防止文本被解码。
O和0 Catch
接下来这个后门使用的反检测技术更加复杂,需要更多的步骤来找出真正的后门:
里面只有两个已知的函数是第1行的urldecode和第7行的eval,解码的URL是乱码的,会用于之后的字符串连接。所有的参数名都是都是由O(大写字母)和0(数字)组成的。因为这两个字符看起来很像,因此很难理解和读取这些代码。每个这样的参数都会被分配给一个前面解码的URL与之连接。参数值分别是:>· 第3行 – ‘strtr’· 第4行 – ‘substr’· 5号线 – ‘52’· 第2 + 6行 – 连接在一起形成’ base64_decode ‘最后,在第7行中,在base64中编码的长文本正在被解码,然后使用先前定义的“ base64_decode ”参数执行。解码后的文字是:
这还不是后门,而只是避免检测的一步。先前定义的O和0的参数再次被使用。第1行包含另一个用base64编码的长文本,但这次解码更复杂,不能按原样解码。将第2行中的参数替换为其值,可得到以下代码行:
其余O和0的参数是第1行的编码base64文本。命令会获取编码文本的偏移量为104的部分,然后创建一个映射到编码文本的第二个52个字符的前52个字符并使用strtr函数将字符替换为字符。然后,使用eval函数对被操纵的文本进行base64解码和执行。没有上述的映射关系就不能解码文本。最后,文本被解码为真实的后门:
通过base64解码后的后门,可以看出攻击者的真实意图。后门的目的就是创建一个含有input标签的HTML表单,攻击者可以利用该表单上传文件。然后,攻击者可以上传选择的文件,而后门会将该文件移动到特定目录中。然后通过打印消息来判断移动是否成功。
逃避技术摘要
>从上面的例子中,可以看出攻击者在努力隐藏恶意代码并避免被检测到。其中使用的技术有:· 通过对字符串的操作(替换、连接、分割、位移等)来隐藏已知的PHP函数;· 使用混淆的参数名,如随机字符串和看起来很像的字符串的组合;· 对后门进行编码,或对部分代码进行base64编码;· 使用压缩方法来隐藏后门代码;· 通过对文本进行操作来混淆base64编码的文本来避免一些简单的解码机制;· 混淆发送给后门的请求,如用preg_replace函数对输入进行操作。
建议
第一,后门的上传点是拦截后门的最佳位置,因为这是在上传到受感染的服务器之前的动作。而且,上传后门一般都要利用一些已知的漏洞,大多数时候是通过利用未经授权的文件上传来完成的。因此建议使用易受RCE漏洞影响的服务器的组织及时更新补丁。还有一种手动修复的方法——虚拟修补。虚拟补丁可以主动保护Web应用程序免受攻击,减少暴露的窗口并减少紧急补丁和修复周期的成本。
第二,在上传后门时,可以检查上传的代码是否有恶意内容。检查代码可能很复杂,因为攻击者会对代码进行混淆处理,因此很难理解。使用静态安全规则和签名成功的可能性会比较小。但分析应用程序的正常行为并警告与分析行为的任何偏差这样的动态规则效果会比较好。第三,如果后门已经上传到受感染的服务器上,那么拦截攻击者和后门之间的通信可能是一种有效的方法。这种方法会阻止后门工作并向服务器管理员发出警告,因此系统管理员可以删除后门。
*参考来源:imperva,周大涛编译,转载请注明来自 FreeBuf.COM