*本文原创作者:Ano_Tom,本文属CodeSec原创奖励计划,未经许可禁止转载 0×01 前言
NSA的Equation Group(方程式组织)泄露的漏洞攻击代码已经有一段时间了,我们将Exploits中涉及到天融信防火墙的攻击代码进行了简单分析,发现其中的一处漏洞跟我们在2016年1月10号提交到乌云的漏洞相重合,如图
该漏洞的利用代码在/Firewall/Exploits/ELCA/eligiblecandidate.py,查看文件修改时间,得知该组织在2013年6月11号就已经发现了该漏洞。其实该漏洞不止影响天融信的防火墙,还影响基于TOS(Topsec Operating System)开发的其他产品,比如天融信的TopVPN、TopGage等众多产品。由于漏洞影响很大,基本影响天融信全线产品,所以延期3个月公开。鉴于方程式的漏洞EXP已经公开,我们将该漏洞的产生原理简单还原一下。
0×02 天融信产品简介 1. 安全公告 针对该组织泄露的攻击代码,天融信厂商已经发布了相关补丁,以及安全公告。其公布了官方统计的受影响版本以及数量,具体可查看 [安全公告](http://www.topsec.com.cn/aqtb/aqtb1/jjtg/160820.htm) 公告中指出目前受影响的设备情况是“天融信安全云服务团队对所有可能涉及到的相关产品版本进行了跟踪,统计到在互联网运行防火墙10000余台,其中已确认受影响2546台” 2. 天融信产品介绍 查看 [NGFW防火墙](http://www.topsec.com.cn/aqcp/bjaq/fhq/topasicptlbxl/index.htm) 的介绍,其采用了自主研发的TOS安全系统平台TopVPN产品也采用了TOS
其他产品的是否采用了TOS可以访问其 [产品介绍](http://www.topsec.com.cn/aqcp/index.htm)
从中可以发现TOS(Topsec Operating System)安全操作系统是天融信完全自主知识产权的系统,采用全模块化的设计,使用中间层的理念,减少了系统对硬件的依赖性,应用于众多产品中。
Exploits 简介其中与天融信防火墙有关的漏洞利用代码在/Firewall/EXPLOITS/下
1. ELBA-Eligible Bachelor
漏洞利用程序,具体待分析。其中在/SCRIPTS/Eligible.txt有程序使用说明
2. ELBO-Eligible Bombshell
该漏洞是TOS系统中的一个溢出漏洞,具体待分析。其中在/SCRIPTS/ELIGIBLEBOMBSHELL.txt有程序使用说明
2. ELCA-Eligible Candidate
该漏洞是TOS系统中入口文件maincgi.cgi文件里的一个命令执行漏洞,在其处理cookie时候产生的问题,本文将简单介绍该漏洞的产生原理。其中在/SCRIPTS/ELCA.txt有程序使用说明
3. ELCO-Eligible Contestant
该漏洞是maingcgi.cgi文件里处理post请求产生的命令执行漏洞,具体待分析。其中在/SCRIPTS/ELCO.txt有程序使用说明
查看Firewall/EXPLOITS/ELCA/eligiblecandidate.py中的代码,在/Firewall/SCRIPTS/ELCA.txt中记录了脚本操作流程,首先是执行touch,获取服务器的相关信息,然后执行probe探测漏洞是否存在,该代码如图,
其通过先请求/site/pages/index.html,获取etag标识,然后执行touch /w */* / */p* /* 命令(其真实路径为/www/htdocs/site/pages/index.html),修改文件时间,继续访问查看Etag是否变化来判断漏洞是否存在。如图
执行exploit,的逻辑如下
其先把/tmp临时目录里的文件清除,然后将后门文件代码执行post请求,存到临时文件里
再利用命令执行漏洞,执行上传的后门文件,从而反弹shell。其脚本使用说明如下
命令执行漏洞原理
我们对/Firewall/Exploits/ELCA中涉及的漏洞进行分析。该漏洞是maincgi.cgi文件处理cookie设计缺陷导致漏洞的产生。
TOS安全操作系统的主文件为maincgi.cgi,所有Web版功能集成在此文件中,其实现位于so库文件中。
此文件main()函数逻辑如下
int __cdecl sub_804EBEE(int a1) //main 函数{
char v2; // [sp+10h] [bp-230h]@9 //变量定义
//......省略
int *v28; // [sp+238h] [bp-8h]@1
v28 = &a1; //变量初始化
//.....省略
sub_804E482(&s1, &v6);
if ( cgiFormCheckboxSingle("loginSubmitIpt") ) //判断是不是登陆,是返回0,否则返回1
{
if ( cgiFormCheckboxSingle("loginRegister") ) //判断是不是注册,是返回0,不是返回1
{
if ( !sub_804E6E2(&s2) ) //判断Url的值是不是Main和MainFrame,返回相应内容
{
memset(&v3, 0, 0x20u);//空间初始化
snprintf(&v3, 31 - strlen(&v3), "session_id_%s", cgiServerPort); //拼接session名称,名称为session_id加cgiServer端口
sub_817C75D(&v3, &unk_8221B00, 64);//获取session值,长度为64
sub_804E394(&s2); //判断参数Url的值,列举一些功能并验证登陆,需要绕过
ptr = (void *)getCookieFromFile(&unk_8221B00); //判断session是否存在
if ( ptr && *(_BYTE *)ptr )
{
//......省略
}
else//若获取的session内容不存在,则执行销毁操作
{
destroy_cookie_file(&unk_8221B00); //销毁session,漏洞根源
quit_system_timeout(&s2);
}
}
}
else
{
sub_80541DB(0); //注册功能函数
}
}
else
{
sub_80541DB(1); //登陆功能函数
}
LABEL_141:
clear_quit();
sub_817B9F5();
return 0;
}
可以看到只要存在session,并且参数url的值不等于系统内定的特定值,系统都会去尝试读取session的值,若session无效则会销毁session。销毁session的逻辑存在漏洞,所以我们进入该逻辑的条件是,请求中包含自定义的session且保证url的值不为如下值
.data:08221B84 dd offset aMainnav ; "MainNav".data:08221B88 dd offset aMainright ; "MainRight"
.data:08221B8C dd offset aHead ; "Head"
.data:08221B90 dd offset aAaaauser_right ; "AAAAUser_right"
.data:08221B94 dd offset aAaaauser_lef_0 ; "AAAAUser_left"
.data:08221B98 dd offset aAaaagrade_ri_0 ; "AAAAGrade_right"
.data:08221B9C dd offset aAaaagrade_le_0 ; "AAAAGrade_left"
.data:08221BA0 dd offset aAaaarole_1 ; "AAAARole"
跟进destroy_cookie_file()查看代码
int __cdecl destroy_cookie_file(int a1){
return destroy_cookie_file(a1);
}
该函数调用的 destroy_cookie_file()函数,传入的a1是我们session的值,该函数是此文件的导入函数,实现不在这个文件中。我们看下这个文件所使用的库都有哪些
.init:0804D39C ; Interpreter '/lib/ld-linux.so.2'.init:0804D39C ; Needed Library 'libwebui_string.so'
.init:0804D39C ; Needed Library 'libwebui_tools.so'
.init:0804D39C ; Needed Library 'libwebui_parse.so'
.init:0804D39C ; Needed Library 'libwebui_templ.so'
//.......省略
目测函数就在这些库文件里面,使用nm命令可帮我们快速的找到函数实现
的地方,执行nm -D *.so >1.txt,将所有库文件的导入导出函数写入到1.txt里
然后查找destroy_cookie_file
前面是T说明是导出函数,也就是函数在libwebui_tools.so 中实现的。如果是U就是导入函数,函数只是在这引用。我们跟进查看:
int __cdecl destroy_cookie_file(const char *a1){
char s; // [sp+34h] [bp-84h]@4
if ( a1 && strlen(a1) > 4 )
{
snprintf(&s, 0x80u, "rm %s%s %s%s* %s*%s* -f", "/www/cookie/", a1, "/tmp/", a1, "/www/htdocs/site/image/", a1);
system(&s);//直接拼接session内容,并执行system命令
}
return 0;
}
可以看到直接拼接带入了system函数,这种拼接方式虽然有限制,但是不影响我们执行命令。此外还需要注意的是天融信的TOS系统内有沙盒,禁止了很多命令的执行,还禁止了;的使用,此处不对沙盒多做分析。
利用方式可以获取管理员密码等信息,近而修改设备配置,或直接执行系统命令,监听流量等。天融信相关设备会将用户的账号以及base64编码的密码存储在/www/cookie目录的文件中,可以直接读取(ls获取文件名,然后执行tar到web目录即可,/www/htdocs/site/image里有写权限)。
如下给出当时测试的几个采用TOS,并受影响的产品截图。
1.天融信VPN系列产品(TopVPN)
获取存储管理员密码的文件,打包到web目录,并查看登陆。
2.NGFW防火墙系列(NGFW4000)
3.天融信统一威胁管理系统(TopGate)