CVE-2020-17496 vBulletin Pre-Auth RCE漏洞在野利用
2020-09-06 10:30:00 Author: www.4hou.com(查看原文) 阅读量:341 收藏

近日,Unit 42研究人员发现了vBulletin预认证远程代码执行漏洞CVE-2020-17496的在野利用。该漏洞利用是对CVE-2019-16759 漏洞补丁的绕过。由于有超过10万个基于vBulletin的网站,其中包括大企业和组织的论坛,研究人员建议用户尽快修复。

CVE-2020-17496漏洞根源分析

模板渲染是vBulletin中的一个功能,可以将XML模板转化为PHP代码并执行。从5.0版本开始,vBulletin 开始接受Ajax的模板渲染请求。渲染是在函数staticRenderAjax 中执行的。如图1所示,函数的参数值来源于$_REQUESTS,$_GET 和 $_POST。因为这些参数中的模板名和相关的配置都是用户可以控制的,因此可能会引发CVE-2019-16759漏洞。

函数staticRenderAjax中的值和参数来源于$_REQUESTS、$_GET 和 $_POST,如下图中红色箭头所示:

The values and parameters for the function staticRenderAjax are from $_REQUESTS, $_GET and $_POST, as shown by the red arrows. 图1. vBulletin < 5.5.5中的callRender()

攻击者在操作参数widgetConfig[‘code’]中含有模板名widget_php和恶意代码的Ajax请求时,渲染引擎就会将图2中的XML模板widget_php 转化为PHP 代码中的字符串,然后由eval 函数执行代码。因为生成的代码中有有一行vB5_Template_Runtime::evalPhp(” . $widgetConfig[‘code’],因此请求中的恶意代码就会执行。

When an attacker manipulates an Ajax request that contains template name widget_php and malicious code placed in the parameter widgetConfig[‘code’], the render engine will convert the XML template widget_php to a string of PHP code.

图2. 模板“widget_php”

A red box highlights the function eval($templateCode)

图3. 从XML模板转化成的PHP代码

从v5.5.5版本开始,引入了函数callRender()(如图4所示)来修复CVE-2019-16759漏洞。该函数引入了黑名单机制来检查模板名。如果名字是widget_php,模板就不会渲染请求的模板。

Beginning from version 5.5.5, a fix for CVE-2019-16759 was introduced into the function callRender() It uses a disallow-list mechanism to check the template name.

图4. vBulletin ≥ 5.5.5版本的callRender()

另一个补丁是evalPhp 函数会检查当前模板名。通过补丁,widget_php是唯一可以用来执行PHP代码的模板,如图5所示。

The code in the red box begins: if (self::currentTemplate() != 'widget_php') -- It demonstrates how the evalPhp function checks the current template name.

图5. 只有模板是widget_php时,evalPhp() 才执行代码

该补丁使得widget_php是唯一可以用于PHP代码执行的模板,同时还限制了对该模板的访问。但在最新的绕过中,研究人员发现还有一个模板可以用于加载该模板,即widget_tabbedcontainer_tab_panel 。

This shows code from the template widget_tabbedcontainer_tab_panel, which can be utilitzed to load widget_php

图6. 模板widget_tabbedcontainer_tab_panel

模板 widget_tabbedcontainer_tab_panel 如图6所示,是一个用来渲染多个子模板的模板。渲染该模板本身并不会直接导致远程代码执行。但模板渲染会引发其他子模板的渲染。

下面的代码是从XML widget_tabbedcontainer_tab_panel 模板渲染的PHP代码。之后,代码会被生成和执行。

[code]
$final_rendered = ” . ”;
$panel_id = ” . vB5_Template_Runtime::vBVar($id_prefix).vB5_Template_Runtime::vBVar($tab_num) . ”;
$final_rendered .= ” . ” . ” . ‘ ‘ . ”;
if (isset($subWidgets) AND (is_array($subWidgets) OR $subWidgets instanceof ArrayAccess))
{
foreach ($subWidgets AS $subWidget)
{
$final_rendered .= ‘ ‘ . vB5_Template_Runtime::includeTemplate($subWidget[‘template’],array(‘widgetConfig’ => $subWidget[‘config’], ‘widgetinstanceid’ => $subWidget[‘widgetinstanceid’], ‘widgettitle’ => $subWidget[‘title’], ‘tabbedContainerSubModules’ => $subWidget[‘tabbedContainerSubModules’], ‘product’ => $subWidget[‘product’])) . ‘ ‘;
}
}$final_rendered .= ” . ‘’;
[/code]

在PHP代码中,可以看出渲染引擎会遍历subWidget和$subWidgets中的配置,并生成一新的模板对象,然后渲染会生成其PHP 代码。此时,如果字符串widget_php被分配给变量subWidget,恶意代码就会放置在$widgetConfig[‘code’] 中,恶意代码就会像CVE-2019-16759漏洞一样执行。

PoC

基于以上分析,研究人员构造了一个漏洞利用代码来证明该功能。函数callRender的调用需要POST HTTP方法,如图7所示。

The code highlighted in the red box shows how the POST HTTP method is required to call the function callRender. This is a part of our proof of concept of an exploit of CVE-2020-17496. 图7. 调用callRender()

图8 是含有phpinfo()运行结果的被黑页面,图9和图10是有类型效果的被操作的请求。在URL中,子模板名widget_php和恶意代码phpinfo();exit(); 都是数组subWidget 的第一个元素。当后端处理该URL 时,恶意代码就会执行。

This compromised page, part of our proof of concept of an exploit of CVE-2020-17496, contains the result of the code phpinfo(); with the request information

图8. 漏洞利用复现1

This is another manipulated request shown as part of our proof of concept of an exploit of CVE-2020-17496图9. 漏洞利用复现2

This is a third manipulated request shown as part of our proof of concept of an exploit of CVE-2020-17496

图10. 漏洞利用复现3

CVE-2020-17496漏洞在野利用

研究人员在8月10日首次发现了该漏洞的在野漏洞,之后发现了来自不同IP 地址的利用。

扫描活动

研究人员根据捕获的恶意流量分析发现,有多个源IP 在进行扫描。扫描的目的是尝试找出有漏洞的站点并收集相关的信息,如图11-15所示。这些payload会尝试执行系统命令echo and id,攻击者根据响应可以判断目标是否受该漏洞的影响。

This is an example of malicious traffic associated with CVE-2020-17496 exploitation. Our traffic captured multiple source IPs running scans, attempting to find vulnerable sites and collect information about them. 图11. 在野漏洞利用 – 1This is a second example of malicious traffic associated with CVE-2020-17496 exploitation. Our traffic captured multiple source IPs running scans, attempting to find vulnerable sites and collect information about them.

图12. 在野漏洞利用 – 2

This is a third example of malicious traffic associated with CVE-2020-17496 exploitation. Our traffic captured multiple source IPs running scans, attempting to find vulnerable sites and collect information about them. 图13. 在野漏洞利用 – 3

This is a fourth example of malicious traffic associated with CVE-2020-17496 exploitation. Our traffic captured multiple source IPs running scans, attempting to find vulnerable sites and collect information about them.  图14. 在野漏洞利用  – 4

敏感文件读取

也有攻击者尝试利用该漏洞来读取服务器端的文件。Payload中含有PHP 函数shell_exec() 来执行任意系统命令,用系统命令 cat ../../../../../../../../../../etc/passwd 来读取/etc/passwd 的内容。流量如图15所示。一旦攻击成功,来自目标的敏感信息就会泄露。

This example of malicious traffic associated with CVE-2020-17496 exploitation shows a payload containing the PHP function shell_exec() for the execution of system commands.

图15. 在野漏洞利用– 5

Web Shell

也有攻击者利用该漏洞来安装web shell。如图16所示,漏洞利用尝试用PHP函数file_put_content()将基于PHP 的web shell。

This shows that the exploit is trying to write a PHP-based web shell to the file conf.php on the web host directory. Once the attack succeeds, attackers can send their commands via HTTP POST request with the parameter x to the web shell and execute the commands on the server-side. 图16. 在野漏洞利用  – 6

如图17所示,漏洞利用尝试下载一个PHP 脚本到受害者服务器。Web shell 的代码如下所示。代码是一个上传页面,攻击者可以上传任意文件并执行随后的攻击活动。

This shows the exploit of CVE-2020-17496 trying to download a PHP script onto the victim server.  图17. 在野漏洞利用– 7

如图18所示,漏洞利用尝试写入一个base64 编码的PHP 代码到web host目录中。新页面会引发任意文件上传,然后攻击者可以执行随后的攻击步骤。

This shows that the exploit of CVE-2020-17496 is trying to write base64 encoded PHP code into a file in the web host directory.

图18. 在野漏洞利用  – 8

下载Shellbot

也有攻击者利用该漏洞来下载基于Perl的脚本恶意软件Shellbot,用PHP 函数 shell_exec()来执行系统命令wget,从http://178[.]170[.]117[.]50/bot1下载并运行恶意软件,payload如图19所示:

This shows the payload of an exploit of CVE-2020-17496

图19. 在野漏洞利用– 9

脚本执行后,就连接到基于IRC的C2 服务器,地址为66[.]7[.]149[.]161:6667,加入IRC信道#afk ,然后保持回复服务器的ping,流量如图20所示。一旦从聊天信道中接收到命令,就可以执行相关的端口扫描代码、下载文件、执行系统命令、开始洪泛攻击等。

Once the malicious script in the previous figure is executed, it connects to an IRC-based command-and-control server, joins the IRC channel #afk, and responds to the PING from the server, as in the traffic shown here.

图20. ShellBot脚本执行期间的流量

下载Sora

另外一个漏洞利用是从攻击者的服务器下载Mirai变种——Sora。但是由于使用的错误的HTTP 方法,因此该payload是无效的。

This exploit of CVE-2020-17496 attempts to download a Mirai variant (Sora) from the attacker's server.

图21. 在野漏洞利用– 10

根据对样本的分析,研究人员漏洞利用在传播过程中融合了CVE-2020-5902、CVE-2020-1937、CVE-2020-10173、CVE-2020-10987、Netgear R700 RCE、Netlink GPON Router 1.0.11 RCE 和 CVE-2020-17496漏洞利用等多个漏洞。

总结

目前已经有多个针对vBulletin预认证远程代码执行漏洞CVE-2020-17496 的在野利用攻击。由于vBulletin 的普及以及用户基数,使得其成为攻击者的主要目标。vBulletin已于2020年8月10日发布了漏洞补丁,研究人员建议相关用户尽快更新补丁。

本文翻译自:https://unit42.paloaltonetworks.com/cve-2020-17496/如若转载,请注明原文地址:


文章来源: https://www.4hou.com/posts/g6q9
如有侵权请联系:admin#unsafe.sh