必虎uRouter无线路由器中惊现多处安全漏洞
2016-08-22 15:10:26 来源:易采站长站 作者:安全客-WisFree
必虎uRouter无线路由器中惊现多处安全漏洞
http://blog.ioactive.com/2016/08/multiple-vulnerabilities-in-bhu-wifi.html
一、长话短说
必虎uRouter无线路由器是一款由中国必虎科技生产和销售的企业级智能路由产品。它的外观无可挑剔,但是它却没能做到秀外慧中-因为这款设备中存在多处严重的安全漏洞。
未经身份验证的攻击者可以绕过设备的身份验证机制,访问存储在系统日志中的敏感数据。更糟糕的是,有的攻击者甚至还能以root权限在路由器上执行系统级别的控制命令。除此之外,uRouter默认还启用了隐藏用户、SSH、硬编码root密码等功能,而且它还会向所有用户的HTTP通信数据中注入第三方的JavaScript脚本文件。
在这篇文章中,我将会给大家介绍这款路由器中存在的几个主要的安全漏洞。除此之外,我会教大家如何从设备中提取出系统固件(利用UART调试针脚),并找出其中存在的安全漏洞。
二、直奔主题


当然了,路由器的web管理接口肯定是全中文的了,而且没有提供语言设置的功能。接下来,我打算把它拆开,看看我是否可以访问到它的系统固件。
(一)、使用UART提取系统固件

从上图中可以看到,红色方框圈起来的就是UART针脚,橙色方框标记的是我们插入的SD卡。在实验过程中,我使用了BusPirate总线来连接UART针脚。
启动设备之后,我们可以在终端里面看到下列信息:


随便按下键盘上的某一按键(1),我们就可以终止设备的启动过程,然后终端会显示如下图所示的bootloader菜单:

现在按下“c”键,然后进入命令行界面(2)。由于它使用的是U-Boot,所以我可以修改“bootargs”参数,然后在不需要运行init程序的情况下直接拿到路由器的Shell:

使用命令“printenv”来检查U-Boot的默认配置时,系统会立刻在启动顺序执行完毕后运行“/sbin/init”。这部分代码负责对路由器的Linux操作系统进行初始化操作。
现在,我们可以使用“setenv”命令来将“/sbin/init”替换成“/bin/sh”。替换后,系统将会直接运行我们的shell代码,这样一来,我们就可以直接访问设备的文件系统了。
“boot”命令可以让U-Boot继续按设备的启动顺序执行下去(PS:因为我刚才暂停了设备的启动进程)。在终端显示了一大堆调试信息之后,我们拿到了设备的Shell:

既然已经成功拿到了路由器的Shell,那么我就可以提取出系统固件,然后开始对负责处理路由器Web管理界面的通用网关接口(CGI)进行分析了。
从路由器中提取文件的方法有很多,我在这里对U-Boot的参数进行了修改,开启了设备的联网功能,然后利用“scp”命令来将所有需要的文件拷贝到了我的笔记本电脑之中。
当然了,我也可以直接对存储在SD卡中的recovery.img文件进行分析,这样也能达到同样的效果。但是这样操作的话,我们将有可能遗漏一些预安装的文件和配置信息,因为这些数据并不在recovery镜像中。
(二)、对CGI代码进行逆向分析
我的首要目标就是弄清楚到底是哪一个程序在负责处理路由器的Web管理接口,以及它是如何进行控制的。下图所示的是路由器的启动配置信息:

Mongoose是嵌入在这款路由器设备中的一个轻量级Web服务器。由于我没有在设备中发现mongoose.conf文件,所以我觉得服务器应该使用的是默认配置。根据Mongoose文档的描述,在默认配置下,Mongoose会将所有以.cgi后缀结尾的文件视作CGI代码来处理,我在路由器的文件系统中发现了两个.cgi文件:

路由器的Web管理接口需要依赖下面这两个组件:
1. cgiPage.cgi:这个文件貌似是专门负责处理Web管理面板主页的。
(http://192.168.62.1/cgi-bin/cgiPage.cgi?pg=urouter)
2. cgiSrv.cgi:这份文件负责处理管理面板中的各种功能。例如登录、注册、查询系统信息、以及修改系统配置等等。
在对cgiSrv.cgi文件中的代码进行了分析之后,我发现这份代码非常的有意思。因为它可以更新路由器的配置信息,所以我决定从它开始入手。

虽然代码中去除了所有的系统调试符号(例如函数名和参数名),但是我们可以从其主函数开始分析。为此,我决定使用IDA来对代码进行分析:

主函数会调用“getenv”(6)函数来获取存储在环境变量“REQUEST_METHOD”(7)中的请求方法。然后再调用“strcmp”函数(9)来比较“REQUEST_METHOD”中的值(8)是否为字符串“POST”(10)。如果请求方法为POST(11),那么函数(12)将会被调用。
简而言之,当主函数接收到了一个POST请求时,函数(12)就会被调用。为了方便,我将函数(12)命名为“handle_post”。
对于GET请求,代码也采用了同样的处理逻辑。当主函数接收到了一个GET请求之后,它便会调用相应的处理函数来进行处理,我将该函数命名为“handle_get”。
接下来,我准备从“handle_get”函数开始着手分析。因为这个函数看起来比负责处理POST请求的函数要简单一些。

上图中这些像瀑布一样的方块表示的是“if {} else if{} else {}”这样的条件表达式,它们负责检查和处理相应的GET请求操作。
Block A:

在Block A中,“handler_get”函数会调用“find_val”方法(14)来对URL参数(15)中的字符串“file”进行检查。如果检查结果为真(16),那么函数“get_file_handler”将会被调用(17)。

函数“get_file_handler”可以通过调用函数“strcmp”(20)来检测URL参数“file”的值(18)是否等于“syslog”(19)。如果相等(21),函数将返回字符串“/var/syslog”(22)。否则,函数将返回NULL(23)。接下来,主函数将会调用另一个函数来打开文件/var/syslog,读取文件中的数据内容,然后将其写入服务器的HTTP响应信息中。虽然整个执行过程非常好理解,但是我们仍需要花费一些时间来找出负责处理GET请求的处理函数,并且理解这些请求是如何处理的。
(三)、路由器的身份验证机制
请等一下!在我们访问syslog文件时,系统有没有对我们的用户身份进行验证呢?很明显,当我们在访问路由器的系统日志文件时,cgiSrv.cgi代码并没有对用户的身份进行校验。好吧,也许是系统日志文件中并不包含任何敏感信息…..
请求信息:

响应信息:

但很明显,系统日志中确实包含很多敏感信息。如上图所示,日志文件中包含有管理员账号的cookie信息,例如会话ID(SID)。如果我们在自己的浏览器中使用这些cookie值,我们就可以劫持管理员的会话信息,并重启路由设备:

响应信息:

别着急,我们能获取到的数据远远不止这些。在某些特殊情况下,管理员可能从未登录过路由器,因此系统日志中也就不会有SID的cookie值。但是我们仍然可以使用硬编码的SID:700000000000000。还记得吗,这段数据曾在之前的系统日志中出现过:

即便重启路由器,这个硬编码的SID值也不会改变,而且管理员也同样无法修改这个值。这也就意味着,我们可以用它来访问路由器所有的功能了。
查询我们目前的用户身份:

响应信息:

但是,dms:3是什么?我们在路由器的Web管理接口中并没有发现任何关于dms:3的信息。这是路由器的bug吗?还是说这是某种后门账号?
三、总结
总的来说,必虎uRouter无线路由器的外观设计还是非常棒的。但不幸的是,在它华丽外表的背后,却存在很多非常严重的安全漏洞。
攻击者可以利用这些漏洞来完成:
-通过向路由器提供一个随机的SID cookie值来绕过系统的身份验证机制;
-访问路由器的系统日志,并利用日志中的数据来劫持路由器的管理员会话;
-使用硬编码的SID值来劫持DMS用户,并获取到路由器的管理员权限;
-注入系统级别的控制命令,并以root权限执行这些命令;
除此之外,必虎uRouter无线路由器还会在用户的HTTP通信数据中注入第三方的JavaScript文件。虽然攻击者无法直接访问在线的JavaScript脚本,但是攻击者可以通过注入任意的JavaScript内容来在用户端的浏览器中执行恶意代码。
除了上述的一些安全问题以外,我还对路由器的内核模块进行了分析,并发现了更多的安全问题。由于篇幅有限,在这篇文章中无法对路由器中所有的安全问题一一进行分析。如果你对我的研究感兴趣的话,请浏览IOActive安全公告,我将我发现的所有安全风险全部发布在了这里[跳转链接]。













闽公网安备 35020302000061号