0x00
背景介绍
Discuz最新版本于2017年8月1日正式发布X3.在最新版本中修复了许多安全问题。CERT和360 0KEE Team然后跟进事件。
0x01 漏洞概述
360CERT和360 0KEE Team通过对比Discuz_X3.3_SC_UTF8与Discuz_X3.4_SC_UTF8版本,发现X3.3_SC_UTF8版本中有几个漏洞。本报告主要涉及两个漏洞:
1.authkey生成算法的安全问题:
当用户第一次安装软件时,系统会自动生成authkey将文件和数据库写入全局配置,然后删除安装文件。authkey用于普通用户cookie加密等密码学操作,但由于生成算法过于简单,可以利用公共信息进行本地爆破。
2.后台任何代码的执行:
管理员在后台对数据库连接密码进行修改时,由于没有对输入进行检查,导致任意代码执行。
0x02 影响漏洞攻击面
1.影响面
Discuz基本上是基础Cookie而非Session,所以一旦authkey获取,就会导致Cookie加密失效可以解密Cookie的auth获取用户密码的字段。系统中的其他逻辑也被广泛使用authkey和authcode该漏洞可导致一系列安全问题:伪造ulastactivity可控制session持久时间;邮箱验证hash参数被破解,导致任何邮箱注册等。
另外,一旦有管理员账号,可以使用后台的任何代码来执行漏洞,在后台Getshell然后控制服务器。
经过360CERT与360 0KEE Team判断后确认漏洞风险等级高,影响范围广。
2.影响版本
通过代码分析确定以下版本:
lDiscuz_X3.3_SC_GBK
lDiscuz_X3.3_SC_UTF8
lDiscuz_X3.3_TC_BIG5
lDiscuz_X3.3_TC_UTF8
lDiscuz_X3.2_SC_GBK
lDiscuz_X3.2_SC_UTF8
lDiscuz_X3.2_TC_BIG5
lDiscuz_X3.2_TC_UTF8
lDiscuz_X2.5_SC_GBK
lDiscuz_X2.5_SC_UTF8
lDiscuz_X2.5_TC_BIG5
lDiscuz_X2.5_TC_UTF8
3.修复版本
lDiscuz_X3.4_SC_GBK
lDiscuz_X3.4_SC_UTF8
lDiscuz_X3.4_TC_BIG5
lDiscuz_X3.4_TC_UTF8
0x03 漏洞详情
1.authkey生成算法的安全漏洞
Discuz_X3.3_SC_UTF8\upload\install\index.php中
authkey生成方法如下:
$authkey = substr(md5($_SERVER['SERVER_ADDR'].$_SERVER['HTTP_USER_AGENT'].$dbhost.$dbuser.$dbpw.$dbname.$username.$password.$pconnect.substr($timestamp, 0, 6)), 8, 6).random(10);
可以看出authkey主要由两部分组成:
MD部分5(前6位) random生成的10位
跟入random函数
因为字符生成集是固定的,没有重复字符,所以函数中的每生成hash都是唯一对应的chars数组中的一个位置使用相同的位置seed生成的。
在之后的代码中使用了同样的random函数:
$_config['cookie']['cookiepre'] = random(4).'_';
Cookie前四个字节已知,使用相同的字节random所以想法很明显:
通过已知的四位计算random使用的种子,然后得到authkey后10位。剩下的需要完成前6名。根据其生成算法,我们必须选择爆破方法。由于数量太大,我们必须选择本地爆破方法(即使用它)authkey加密结果已知)。
在调用authcode可以在函数多的地方验证,在这里使用密码链接id和sign参数:
sign生成方法如下:
function dsign($str, $length = 16){
return substr(md5($str.getglobal('config/security/authkey')), 0, ($length ? max(8, $length) : 16));
}
爆破authkey 的流程:
1.通过cookie前缀爆破随机数seed。使用php_mt_seed工具。
2.用seed生成random(10)获得所有可能性authkey后缀。
3.将密码邮件发送到您的帐户,并取出密码链接。
4.用生成的后缀爆破前6位,范围为0x000000-0xffffff,和找回密码url拼接后做MD5求出sign。
5.将求出的sign并在密码链接中找回sign相比之下,相等即停止,获得当前authkey。
2.后台任意代码执行漏洞
对比X3.4与X3.3版本发现漏洞:
upload\source\admincp\admincp_setting.php
在2535行左右,在后台UCenter更新密码时,不检查输入的密码,直接写入配置文件,可以关闭前面的单引号,达到getshell这里只有一个连接测试,如果连接成功,则写入配置文件。
0x04 验证漏洞
1.authkey生成算法的安全漏洞
使用普通用户登录:
获取cookie前4位:uie7
使用上述脚本进行分类php_mt_seed参数格式:
接着再用php_mt_seed生成seed:
这里php_mt_seed的参数是:
0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 610 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 0 61 56 56 0 61 44 44 0 61 40 40 0 61 33 33 0 61
需要注意的是:
php_mt_seed多参数为一组4个数,含义如下图所示:
我们得到的是第11-14次的随机数,要估计第1-10次,所以前面要空10组。
获得所有种子后(约250-300),使用以下脚本处理所有可能的种子random(10):
然后重置密码,找回链接:
爆破脚本整理后执行:
最后破解为: 7e2000vULc0oQETA
对比数据库中的数据,可以看出是一致的。
2.后台任意代码执行漏洞
输入管理员UCenter使用密码时,用户的输入没有过滤,导致输入的数据直接写入文件步骤如下:
1.以管理员身份登录后台
2.设置可远程访问的设置mysql,密码为:123);phpinfo();//
3.修改UCenter 数据库密码上述密码
4.更新后即Getshell
还修改了配置文件中的内容:
0x05 修复建议
Discuz最新版本已于2017年8月1日正式发布。请检查您使用的版本,并及时更新到最新版本。
0x06 时间线
2017-08-01 Discuz更新官方安全
2017-08-07 360CERT和0KEE Team完成对新版本的首次分析
2017-08-22 360CERT和0KEE Team完成后续分析,形成报告
0x07 参考文档
https://git.oschina.net/ComsenzDiscuz/DiscuzX/commit/8446bd9e897bb19672389cc4aed42716ccd0f537
https://git.oschina.net/ComsenzDiscuz/DiscuzX/commit/bb600b8dd67a118f15255d24e6e89bd94a9bca8a
http://www.openwall.com/php_mt_seed/