因WordPress SoakSoak恶意软件谷歌已屏蔽1.1万个网站
2014年12月14日,国外Sucuri安全博客报道了大量WordPress站点受到SoakSoak恶意软件影响的消息。据报道,该恶意软件会感染WordPress的源码文件,在里面植入恶意代码。攻击者利用SoakSoak对受感染的站点进行挂马、植入后门等一系列攻击行为。(报道链接:http://blog.sucuri.net/2014/12/soaksoak-malware-compromises-100000-wordpress-websites.html)
据安全公司Sucuri曝光,这一漏洞是一款来源于俄罗斯的恶意软件,已感染了超过10万个WordPress网站,大量博客网站沦为受害者。为了遏制破坏范围的进一步扩大,Google已经屏蔽了1.1万个域名。
而据知道创宇团队通过多种分析手段得到的严谨数据,仅被植入后门的WordPress站点就有约14500个,这个数量已经非常多了。(估算基数是知道创宇 ZoomEye 检测到的约270万WordPress 基站 )
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/033320QjN.jpg
知道创宇安全研究团队也在第一时间对这款漏洞进行了追踪和调查。
>>>漏洞描述
据报道,此次SoakSoak恶意软件在大量WordPress站点中的爆发源于一款名为Revslider的幻灯片插件,该插件曾被爆多个安全漏洞,涉及任意文件下载、任意文件上传等。Revslider由ThemePunch出品,属于一款商业性插件(收费),因其具有强大的功能和良好的易用性而有着不错的销量,并且在ThemePunch出品的一些WordPress主题中也自带有该款插件。
攻击者可能利用了该插件的任意文件下载漏洞获取了大量的WordPress的wp-config.php配置文件,并通过任意文件上传漏洞上传webshell对WordPress的源码文件进行修改并插入了恶意代码。结合报道文章中所提到的,攻击者应该是通过修改了WordPress中“/wp-content/template-loader.php”的源代码,使得在访问受感染WordPress站点的页面的同时远程加载了soaksoak.ru上的一段JavaScript脚本。攻击者通过该段JavaScript脚本来对特定的浏览器进行攻击。(报道连接:http://blog.sucuri.net/2014/12/revslider-vulnerability-leads-to-massive-wordpress-soaksoak-compromise.html)
>>>漏洞分析:
任意文件上传漏洞源于该插件自带的 “插件更新”功能,在启用该插件的同时会将一系列的action操作都注册到WordPress的ajax请求里。并且插件在接受更新请求后并没有判断用户权限,导致恶意者可利用该点进行攻击。
该插件在启用后,提供了一个show_image的功能,可以通过WordPress的ajax调用来使用该功能,但在该功能实现的过程中考虑不全导致了任意文件下载,这使得攻击者能通过该漏洞下载到WordPress的配置文件wp-config.php,获得数据库连接信息等敏感数据。
>>所涉及文件:/revslider_admin.php
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/033348A00.jpg
该插件在启用时,会将 ajax_action 参数与函数 onAjaxAction()进行绑定,当通过/wp-admin/admin-ajax.php 向插件传递参数时会调用 onAjaxAction()。
onAjaxAction()函数关键部分如下:
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/03340244s.jpg
当post参数$client_action为 “update_plugin”时,会调用 updatePlugin()开始升级插件。
updatePlugin()函数位于/inc_php/framework/base_admin.class.php中。
>>所涉及文件:/inc_php/framework/base_admin.class.php
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/033519IfN.jpg
简要分析一下文件上传漏洞形成的过程。首先该函数(updatePlugin())获取了post过来的文件的信息:
$arrFiles= UniteFunctionsRev::getVal($_FILES, "update_file");
随后会获取上传文件的文件名,MIME类型(插件将MIME类型的检测代码注释掉了)。
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/033534fNM.jpg
然后获取了上传文件的临时路径和创建了目录“/temp/update_extract” (目录创建失败会抛出异常并中止处理):
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/033549U2b.jpg
如果“/temp/update_extract”创建成功,会清理该目录下的所有文件,然后将上传的文件移动至该目录下:
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/033604tIz.jpg
这里很明显,没有对上传文件做限制,直接使用move_uploaded_file()将上传文件(任意)拷贝到了“/temp/update_extract/”目录下,后续的处理都不用再分析。
本地构造如下表单:
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/033709LJh.jpg
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/033724Jao.jpg
其中temp.txt内容为:
testfile upload
然后点击上传>>
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/033739An3.jpg
这里可以看到,回显提示 “更新错误”,但是根据刚才的分析,上传的文件其实已经通过 move_uploaded_file()拷贝到了“/temp/update_extract/”目录下。
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/033754E8V.jpg
任意文件下载漏洞:
该插件在启用后,提供了一个show_image的功能,可以通过WordPress的ajax调用来使用该功能,但在该功能实现的过程中考虑不全导致了任意文件下载,使得攻击者能通过该漏洞下载到WordPress的配置文件wp-config.php,获得数据库连接信息等敏感数据。
>>所涉及文件:/inc_php/framework/base_admin.class.php
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/033809wy5.jpg
插件在启用时将ajax中的show_image请求绑定处理函数onShowImage()。其中onShowImage()函数原型位于 “/inc_php/framework/base.class.php” 中。
>>所涉及文件:/inc_php/framework/base.class.php
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/03390621T.jpg
可以看到在onShowImage()函数中,实例化了 UniteImageViewRev类,并调用了该类的showImageFromGet()方法。
>>所涉及文件:/inc_php/framework/image_view.class.php
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/033921yhI.jpg
showImageFromGet()函数从 “GET” 请求里获取参数 “img”的值赋值给变量
$imageFilename= UniteFunctionsRev::getGetVar("img");
然后注意 $effect这个变量:
$effect= UniteFunctionsRev::getGetVar("e");
在函数最后调用 showImage()方法,showImage()函数部分关键代码如下:
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/034014e5u.jpg
其中$this->pathImage的值在一开始的时候被赋值为了WordPress“wp-content”所在的物理路径(例如:C:\xxxx\www\wordpress\wp-content\),然后通过将$this->pathImage与传进来的文件名 $filename进行连接赋值给 $filepath:
$filepath= $this->pathImages.$filename;
并且$this->effect,$maxWidth和$maxHeight都可以从 “GET”请求参数中获取,所以可以构造一定的payload,使得函数流程执行到 $this->outputImage($filepath)来读取文件。outputImage()函数如下:
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/0340281mg.jpg
outputImage()函数直接通过两个操作就将文件内容输出:
$contents= file_get_contents($filepath);
echo$contents;
并且在这个过程中没有任何的过滤,因此作为测试可以构造如下payload:
http://www.test.com/wordpress/wp-admin/admin-ajax.php?action=revslider_show_image&img=../../wp-config.php
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/0340431od.jpg
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/0340587Mn.jpg
>>>漏洞追踪
知道创宇安全研究团队还针对Revslider插件的任意文件上传漏洞写出了PoC,并从ZoomEye上抽取了一部分含有Revslider插件指纹的WordPress站点进行测试。比较遗憾的是,测试结果显示所有的测试站点都不能成功验证该漏洞。
但是,我们在扫描测试的过程中,意外的发现了疑似攻击者通过任意文件上传漏洞留下的后门(后门地址:http://wpsite/wp-content/plugins/revslider/temp/update_extract/temp.php)。
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/034222tu3.jpg
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/034237P1r.jpg
攻击者植入后门后,修改了文件上传漏洞所涉及目录的写权限,封堵了该漏洞。攻击者的技术和经验,于此可见一斑。
temp.php后门分析:
虽然攻击者通过修改目录权限封堵了Revslider插件的任意文件上传漏洞,但是我们通过该插件的任意文件下载漏洞成功得到攻击者所上传的webshell(后门)并进行了分析。
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/034422qbj.jpg
对混淆后的webshell解码后,得到了类似c99.php(国外比较流行的一款webshell)的后门代码。
http://static.zmke.com/wp-content/uploads/autoimage/2014/12/034436loa.jpg
虽然攻击者留下的webshell我们成功的拿到了源码,但是webshell的密码hash并没有成功地破解出来。(针对该后门我们会进行持续的跟踪和调查)
>>>关于SoakSoak的背景知识:
2014年12月16日,国外发布了关于SoakSoak恶意软件Payload分析的一篇要文(http://blog.sucuri.net/2014/12/soaksoak-payload-analysis-evolution-of-compromised-sites-ie-11.html)攻击者注入恶意代码加载JavaScript代码旨在通过Firefox和IE11的0day攻击那些浏览受染WordPress站点的浏览器,猜测攻击者是为了获取更多的肉鸡来进行下一步行动。
其实,Slider Revolution插件团队早在今年9月份就知道了该漏洞的存在,但其开发团队显然没能赶在黑客发现漏洞并据此发起攻击前将漏洞修复。目前,还并不清楚该恶意软件的散播者攻击WordPress是出于何种目的。
知道创宇团队会持续关注此漏洞的修复进展。
【知道创宇作为国内最早提出并践行云监测、云防御的高新企业,始终致力于研制基于云技术的下一代Web应用安全解决方案,打造更好更安全的互联网。】
1.知道创宇官网:http://www.knownsec.com/
2.知道创宇旗下 -ZoomEye官网:http://www.zoomeye.org/
3.知道创宇旗下 - 加速乐云防御平台官网:http://www.jiasule.com/
页:
[1]