后门混淆和逃避技术

后门是用于旁路系统的正常认证或加密的方法。有时开发人员会出于各种原因为自己的程序构建后门程序。例如,为了提供简单的维护,开发人员引入了一个后门,使他们能够恢复制造商的默认密码。

另一方面,攻击者经常将后门注入易受攻击的服务器来接管服务器,执行攻击并上传恶意payload。后门为黑客发动进一步攻击铺平了道路。例如,攻击者可能会注入后门,允许他们在受感染的服务器上执行代码或上传文件。此代码和文件将包含实际攻击,其中可能包含不同类型的有效payload,例如从内部数据库窃取数据或运行加密恶意软件

在这篇博客中,我们将讨论一些攻击者在逃避检测时注入后门的方法。我们将展示在数据中发现的真实后门的示例,以及它们如何使用不同的规避和混淆技术,其中一些非常复杂。

 

后门的类型

有几种后门,用不同的编程语言编写。例如,用PHP编写的后门设计用于在PHP上运行的服务器,而不是用ASP编写的后门用于在.net服务器上运行。

后门的目的可能各不相同,从允许攻击者在受感染机器上运行操作系统命令的Web shell到允许攻击者上载和执行文件的特制后门。

在像GitHub这样的网站上公开有很多开源后门。黑客可以选择注入一个已知的后门,但随后他们很容易被发现。更复杂的黑客创建他们自己的后门或混淆他们使用不同的逃避技术注入的已知后门。

 

常见的安全控制

安全控件可能会尝试使用几种不同的方法来阻止后门。其中之一是在HTTP请求期间阻止后门的初始注入,该请求通常使用已知漏洞注入服务器。另一种方法是在HTTP响应期间分析后门的内容,以查找它是否包含被视为恶意的代码。

这应该不足为奇,因为攻击者在注入这些后门时努力隐藏自己的真实意图。黑客通常使用几种规避技术,包括混淆已知的功能和参数名称以及使用恶意代码的编码。在接下来的部分中,我们将展示用PHP编写的后门,其中攻击者使用不同的技术以避免安全控制检测。

PHP逃避技术

有许多方法可用于攻击者逃避检测。然而,总体动机是掩盖已知函数或PHP关键字。一些已知的功能和关键字包括:

字符重新排序

在此示例中,此页面的可视输出是众所周知的“404 Not Found”消息(第2行),这可能表示错误。但是,此页面中有一个嵌入式后门代码(第3-13行)。关键字“_POST”写在普通网站上; 但是,攻击者使用一种简单的方法来隐藏它:

图1:后门隐藏“_POST”关键字

在第1行中,后门代码会关闭所有错误报告,以避免在出现错误时进行检测。在第3行中,“ 默认 ”参数被定义为似乎是随机字符组合。在第4行中,当代码重新排序这些字符并将它们转换为大写以构建关键字“ _POST ” 时,定义“ about ”参数。此关键字在第5-12行中用于检查对此页面的HTTP请求是否通过POST方法完成,以及是否包含“ lequ ”参数。

如果是这样,后门使用“ eval ”函数来运行参数“ lequ ”中发送的代码。因此,后门从post请求中的参数读取值,而不使用关键字“ $ _POST ”。

字符串连接

攻击者用来混淆已知关键字的另一种流行方法是字符串连接,如下例所示:

图2:使用字符串连接隐藏已知函数的后门程序

与之前的后门相反,已知函数在没有混淆的情况下写入后门本身,此代码段中唯一可见的命令是“ chr”函数(第1行)。此函数采用0到255之间的数字并返回相关的ascii字符。

在字符或字符串末尾添加一个点是将它连接到下一个字符串的PHP方法。使用此功能,攻击者可以连接多个字符或字符串以创建表示已知函数的关键字,从而将其隐藏起来。

最后,此功能在开头用“@”符号执行,超过了错误通知的打印。此后门的目的是创建一个函数,用于评估post请求的第一个参数中给出的代码。使用此后门,攻击者可以使用POST请求欺骗检测系统并将任意代码发送到受感染的服务器,其中代码将被执行。

不推荐使用的功能

虽然在以前版本的PHP中已经弃用了某些功能或功能,但我们仍然看到攻击试图在当前后门中滥用此功能,如下例所示:
图3:使用preg_replace的弃用功能的后门程序

这个单行代码片段可能看起来很简单,但它实际上使用了一些规避技术,并且作为后门可能会带来很多危害。首先,“str_rot13”函数接受一个字符串,并将每个字母移位到字母表中的13个位置。这个函数在’riny’上的输出是众所周知的函数’eval’。接下来,“preg_replace”函数采用正则表达式,替换字符串和主题字符串。然后,它搜索主题中正则表达式的每次出现,并用替换字符串替换它。上例中的输出字符串将是:

意思是,从post请求中评估参数’rose’中的表达式。

注意’preg_replace ‘中的’/ e’标签。这是一个不推荐使用的标记,它告诉程序执行’preg_replace’函数的输出。PHP手册指出了有关此修饰符的以下警告:“ 小心不建议使用此修饰符,因为它可以轻松引入安全漏洞”。此修饰符在PHP 5.5.0中已弃用,自PHP 7.0.0起已删除。那么为什么要担心自PHP新版本以来被删除的已弃用功能呢?请看W3Techs的以下调查:

图4:使用各种PHP版本的网站的百分比(W3Techs.com,2018年7月3日)

根据这项调查,超过80%的用PHP编写的网站都使用了一个版本,其中使用了’preg_replace’函数的弃用’e’修饰符。因此,用PHP编写的绝大多数网站都容易受到使用此弃用修饰符的攻击。

作为逃避检测的另一种方法,代码将使用前面示例中所示的“@”符号进行评估,这超出了错误消息。

多步PHP逃避技术

存在一些逃避方法,攻击者使用多种技术的组合来混淆他们的代码。

反向字符串,连接,压缩和编码

图5:后门使用反向字符串,base64编码和gzinflate压缩来隐藏代码

在此示例中,攻击者使用多种方法组合来隐藏代码。首先,攻击者使用上述“ preg_replace”函数和评估代码的“ / e”修饰符。在第二个参数中,我们可以看到攻击有效负载被拆分为多个字符串并与“。”运算符连接。我们还可以看到攻击者使用“ strrev”函数来反转连接字符串“ lave”的顺序,后者变成“eval”。连接后,我们得到以下有效payload:

这里,代码不仅使用base64编码进行编码,还使用“deflate”数据格式进行压缩。解码和解压缩后,我们得到以下有效payload:

这意味着在GET或POST请求中评估“error”参数中发送的代码。

字符串替换,连接和编码

图6:使用字符串替换来隐藏函数名称和base64编码的后门程序

在此示例中,攻击者在变量中隐藏函数名称,并使用base64编码对后门本身进行模糊处理。唯一可见的已知关键字是第2行中的“ str_replace ”,它只使用一次。

让我们回顾一下代码,看看它是如何工作的。首先,在第2行中,参数“ tsdg ”的值为“ str_replace ”,取字符串“ bsbtbrb_rbebpblacb e”并使用str_replace函数删除所有字母“ b ” 。在这里,攻击者通过创建包含指定函数(包括附加字母)的字符串来混淆已知的PHP函数。然后,使用str_replace函数删除这些字母。

接下来,使用相同的方法,在第6和7行中,参数“ zjzy ”被赋予值“ base64_decode ”,参数“ liiy ”被赋予值“ create_function ”。请注意,不是直接使用str_replace函数,而是使用参数“ tsdg ”来逃避检测。

接下来,第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 ”被添加到随机位置以防止文本被解码。

O和0 Catch

在下一个后门,逃避技术甚至更复杂,需要更多的步骤才能找到真正的后门:

图8:使用几种规避技术的后门程序。所有参数名称都由O和0组成

同样,只有两个可见的已知函数是“ urldecode ”,它在第1行用于解码URL,而“eval”用在第7行。解码的URL只是乱码,但在后面的步骤中用于字符连接在之前的逃避方法中看到过。

所有参数名称都由零和大写O组合而成。由于这两个字符在视觉上相似,因此很难阅读和理解代码。使用来自先前解码的URL的字符串联为每个这样的参数分配字符串。参数值为:

第3行 – ‘strtr’

第4行 – ‘substr’

5号线 – ‘52’

第2 + 6行 – 连接在一起形成’ base64_decode ‘

最后,在第7行中,在base64中编码的长文本正在被解码,然后使用先前定义的“ base64_decode ”参数执行。解码后的文字是:

图9:base64解码文本。由于存在由O和0组成的参数,代码仍然是不可读的

这不是后门本身,而只是逃避的又一步。这里,先前定义的O和0的参数再次被使用。
第1行包含另一个用base64编码的长文本,但这次解码更复杂,不能按原样解码。将第2行中的参数替换为其值,可得到以下代码行:

图10:与之前相同的代码,用其值替换参数

其余O和0的参数是第1行的编码base64文本。此命令获取编码文本的偏移量为104的部分,然后创建一个映射到编码文本的第二个52个字符的前52个字符并使用strtr函数将字符替换为字符。然后,使用eval函数对被操纵的文本进行base64解码和执行。不使用上述地图就不可能解码文本。最后,文本被解码为实际的后门:

图11:base64解码后的后门本身。揭示了攻击者的真实意图

现在攻击者的真实意图被揭露了。此后门的目的是创建一个包含“输入”标记的新HTML表单,该标记使攻击者能够上载文件。然后,攻击者可以上传他选择的文件,后门将其移动到受攻击服务器内的攻击者指定的目录。后门还通过打印相应的消息指示文件是否已成功移动到所需的文件夹。

 

逃避技术摘要

如上例所示,攻击者正在尽最大努力隐藏其恶意代码并逃避检测。我们在攻击者使用的数据中看到的一些技术是:
• 使用字符串操作隐藏已知的PHP函数(替换,连接,反向,移位和拆分)
• 使用模糊的参数名称,如随机字符或字符O和0的组合,它们在视觉上相似
• 使用base64编码对后门或其部分代码进行编码
• 使用压缩作为隐藏后门代码的方法
• 通过操纵文本来混淆base64编码的文本以避免简单的解码
• 通过在输入上使用“preg_replace”函数上传后发送到后门的请求

 

缓解建议

有几个预防措施可以减轻后门攻击。

首先,在后门的上传点。这是阻止后门的最佳位置,因为它甚至在上传到受感染的服务器之前就已经发生了。通常,后门的上传是使用已知漏洞完成的,大多数时候是通过利用或未经授权的文件上传来完成的。建议使用易受RCE漏洞影响的服务器的组织使用最新的供应商补丁程序。手动修补的替代方法是虚拟修补。虚拟补丁主动保护Web应用程序免受攻击,减少暴露窗口并降低紧急补丁和修复周期的成本。

其次,在上传后门时,可以检查上传的代码本身是否有恶意内容。检查代码可能很复杂,因为攻击者会对代码进行模糊处理,因此无法理解,并且通常在查看代码时没有太多清晰的代码。使用静态安全规则和签名可能会导致成功有限。相反,其他动态规则包括分析应用程序的正常行为并警告与分析行为的任何偏差。

第三,如果后门已经上传到受感染的服务器上,则可能会阻止攻击者和后门之间的通信。此方法会阻止后门工作并向服务器管理员发出警报,因此可以删除后门。

审核人:yiwang   编辑:边边

(完)