后门是一种绕过认证或系统加密的方法。攻击者出于各种目的有时候会构建自己的后门,比如攻击者为了恢复设备厂商的默认密码。另一方面,攻击者会注入后门到有漏洞的服务器来接管服务器,执行攻击和上传恶意payload。一般,攻击者会注入后门来获取代码执行或上传文件的权限。
本文讲述攻击者注入后门和避免检测的方法,并举例说明数据中发现的后门以及如何使用不同的避免检测和混淆的技术。
后门有许多类型,也由不同编程语音编写的。比如,PHP语言编写的后门可以运行在PHP服务器上,用ASP编写的后门可以运行在.NET服务器上。
后门的作用也是不同的,比如webshell可以用来在受感染的系统上执行后门,以使攻击者上传和执行文件。Github上有很多开源的后门,黑客可以选择注入一些知名的后门,但缺点是容易被检测到。一些高级黑客会自己开发后门或者对知名的后门使用混淆技术后再使用。
安全控制措施会使用不同的方法来拦截后门。其他之一就是通过HTTP请求拦截注入的后门,另一种方法是在HTTP响应阶段分析后门的内容,确定是否含有恶意代码。
攻击者在代码注入时会隐藏其真实意图,经常使用的避免被检测的技术有混淆函数和参数名,对恶意代码进行编码等。
避免检测的动机就是隐藏函数或PHP关键字,这些函数名和关键字包括:
在本例中,页面的输出是一个“404 Not Found”消息(第2行),这其实是一个错误消息。但这有一个潜入的后门代码(第3-13行)。关键字_POST是明文形式写出的,攻击者用一个简单的方法就隐藏了。
图1:隐藏“_POST”关键词的后门
第1行中,后门代码会关闭错误报告来避免用错误消息进行检测。
第3行中,default参数的定义看起来像字符串的随机组合。
第4行about参数再对字符串进行重新排序并变为大写来构造关键字_POST。
第5-12行_POST关键字用来检查HTTP请求是否通过POST方法发送和是否含有lequ参数。如果是,后门就会用eval函数运行lequ参数发送的代码。这样,后门就可以在不适用关键字$_POST的情况下读取post请求参数中的值。
攻击者使用的了一个混淆已知关键字的方法是字符串连接,如下图所示:
图2: 使用字符串连接到隐藏已知函数的后门
与之前的后门不同的是,上面的后门只代码段中只有chr函数(第1行)。该函数从0~255之间取一个数并返回对应的ASCII码字母。
在字符或字符串的最后加一个点是PHP连接下一个字符串的方法。利用这个功能,攻击者可以将许多字符串连接起来创建一个已知函数的关键字,以躲过检测。
最后,函数会以@开始的标记去执行。该后门的目的是创建一个评估post请求第一个参数代码的函数。攻击者用该后门可以欺骗检测系统,并用POST请求发送任意代码到受感染的服务器,然后代码会在服务器上执行。
虽然一些函数在之前的PHP版本中不在使用,但攻击者还是会尝试在当前后门中去滥用这些功能,如:
图3: 使用不再建议使用的preg_replace功能的后门
这行代码看起来很简单,实际上代码使用了很多避免检测的技术,并且可以带来很大的危害。首先, str_rot13() 函数对字符串执行 ROT13 编码。ROT-13 编码是一种每一个字母被另一个字母代替的方法。这个代替字母是由原来的字母向前移动 13个字母而得到的。函数再riny的输出是一个eval()函数。然后,preg_replace 函数执行一个正则表达式的搜索和替换。对上面例子的输出应该是:
同时,评估post请求中rose参数的表示。需要注意的是preg_replace的‘/e’标签,这是一个不建议使用的标签,目的是让程序执行preg_replace函数的输出。
PHP手册中的描述如下:
Caution Use of this modifier is discouraged, as it can easily introduce security vulnerabilities
这种修饰器再PHP5.5.0中被建议不在使用,再PHP 7.0.0中被移除。那还需要单位一个新版本中被移除的功能吗?答案是肯定的,下图是互联网使用不同PHP版本的情况:
图4: 互联网使用不同PHP版本的情况 (W3Techs.com, 3 July 2018)
还有许多的攻击者使用多种融合的技术来混淆代码以达到避免检测的目的。
图5: 使用字符串倒置、base64编码、gzinflate压缩来隐藏代码的后门
在上面的例子中,攻击者使用了多种方法来隐藏代码。首先,攻击者使用有/e修饰器的preg_replace函数来评估代码。通过第2个参数,可以看出攻击payload被分割为多个字符串,并用运算符“.”连接在一起。攻击者还使用strrev()函数将连接的字符串lave逆序就变成eval()。然后就得到了最终的payload:
而且,代码也不仅用base64编码,还用了deflate数据格式记性了压缩。在解压缩和解码后就得到了下面的payload:
这就是在GET或POST请求中评估“error”参数中发送的代码。
图6: 使用字符串替换和base64编码来隐藏函数名的后门
在本例中,攻击者将函数名隐藏在变量中,并用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编码的文本会被解码为:
图7: 解码的base64文本
这就是后门,后门会执行通过cookie发送到受感染服务器的代码。在第6行中,使用preg_replace函数和两个正则表达式更改通过cookie发送的值。然后,对已更改的文本进行base64解码并执行,运行攻击者发送的任意代码。
这种后门反检测技术比之前提到的要复杂得多。在这里,除了使用PHP函数中的参数之外,后门本身也用base64编码。另外,为了避免简单的base64解码机制,base64文本被分割成四个部分,并且在随机位置加入字符“ hd ”以防止文本被解码。
下一个后门使用的反检测技术更加复杂,需要更多的步骤来找出真正的后门:
图8: 使用多个反检测技术的后门,所有的参数名都是由O和0组成的
里面只有两个已知的函数是第1行的urldecode和第7行的eval,解码的URL是乱码的,会用于之后的字符串连接。
所有的参数名都是都是由O(大写字母)和0(数字)组成的。因为这两个字符看起来很像,因此很难理解和读取这些代码。每个这样的参数都会被分配给一个前面解码的URL与之连接。参数值分别是:
最后,在第7行中,在base64中编码的长文本正在被解码,然后使用先前定义的“ base64_decode ”参数执行。解码后的文字是:
图9: base64解码的文本,因为是0和O组成的,仍然不便阅读
这还不是后门,而只是避免检测的一步。先前定义的O和0的参数再次被使用。
第1行包含另一个用base64编码的长文本,但这次解码更复杂,不能按原样解码。将第2行中的参数替换为其值,可得到以下代码行:
图10: 与之前相同的代码,用其值替换参数
其余O和0的参数是第1行的编码base64文本。命令会获取编码文本的偏移量为104的部分,然后创建一个映射到编码文本的第二个52个字符的前52个字符并使用strtr函数将字符替换为字符。然后,使用eval函数对被操纵的文本进行base64解码和执行。没有上述的映射关系就不能解码文本。最后,文本被解码为真实的后门:
图11: base64解码后的后门
通过base64解码后的后门,可以看出攻击者的真实意图。后门的目的就是创建一个含有input标签的HTML表单,攻击者可以利用该表单上传文件。然后,攻击者可以上传选择的选择,而后门会将该文件移动到特定目录中。然后通过打印消息来判断移动是否成功。
从上面的例子中,可以看出攻击者在努力隐藏恶意代码并避免被检测到。其中使用的技术有:
研究人员提出几种预防措施来缓解来自后门的攻击:
首先,后门的上传点是拦截后门的最佳位置,因为这是在上传到受感染的服务器之前的动作。而且,上传后门一般都要利用一些已知的漏洞,大多数时候是通过利用未经授权的文件上传来完成的。因此建议使用易受RCE漏洞影响的服务器的组织及时更新补丁。还有一种手动修复的方法——虚拟修补。虚拟补丁可以主动保护Web应用程序免受攻击,减少暴露的窗口并减少紧急补丁和修复周期的成本。
其次,在上传后门时,可以检查上传的代码是否有恶意内容。检查代码可能需要很复杂,因为攻击者会对代码进行混淆处理,因此很难理解。使用静态安全规则和签名成功的可能性会比较小。但分析应用程序的正常行为并警告与分析行为的任何偏差这样的动态规则效果会比较好。
第三,如果后门已经上传到受感染的服务器上,那么拦截攻击者和后门之间的通信可能是一种有效的方法。这种方法会阻止后门工作并向服务器管理员发出警告,因此可以系统管理员可以删除后门。