路人甲2015/08/28 15:50 作者:Ambulong(安恒安全研究院) 0x00 前言 fd上有人公开了vBulletin的0day POC,但没有提供漏洞分析过程。 vBulletin是国外领先的论坛程序,国内一般称其为VBB,基于PHP+mySQL开发.vBulletin是商业软件,需付费使用。 vBulletin允许通过URL远程上传文件,但对URL并没有作严格的过滤,导致SSRF漏洞的产生。加上许多vBulletin网站同时将vBulletin的Memcached与WEB服务器安装在一起,结合SSRF将导致漏洞变为命令执行。 0x01 漏洞分析 首先讲下vBulletin的plugin(hook)执行方式,vBulletin将plugin的信息(包括代码)存储在数据库,程序运行时临时从数据库读取代码执行,可以理解成将include 'pluginname.php'变成eval(getCodeFromDB('pluginname'))。在Memcache开启的情况下,vBulletin会将plugin的代码缓存在Memcached里来增加读取速度。 我们都知道访问Memcached是不需要密码的,这样一来如果Memcached的访问端口暴露在公网,我们就修改vBulletin在Memcached中的plugin代码为恶意代码,这导致的后果将不堪设想。 vBulletin官网上的建议是Memcached不要和vBulletin安装在同台服务器,但许多站长对此还是视而不见,或者仅通过将防火墙设置将Memcached端口对外禁止访问就以为解决了问题。 不幸的是,vBulletin中存在SSRF漏洞,攻击者可以将存在漏洞的文件当作代理来向服务器上的Memcached发起本地请求。 Memcached未授权访问 我们首先看下Memcached的未授权访问是如何导致vBulletin命令执行的。 通过关键字查找,发现语句vBulletinHook::set_pluginlist($vbulletin->pluginlist),找到set_pluginlist的声明在文件./includes/class_hook.php中,根据注释内容: #!php // to call a hook: // require_once(DIR . '/includes/class_hook.php'); // ($hook = vBulletinHook::fetch_hook('unique_hook_name')) ? eval($hook) : false; 得知,plugin的调用方式为($hook = vBulletinHook::fetch_hook('unique_hook_name')) ? eval($hook) : false;,功能是获取plugin的代码并执行。 我们选用出现频率较高的global_start的代码,对应的语句是($hook = vBulletinHook::fetch_hook('global_start')) ? eval($hook) : false;,这句话在./global.php文件里,所以包含./global.php的页面都将包含我们的恶意代码。 接下来访问Memcached服务器看下pluginlist项的数据 $ telnet 172.16.80.156 […]