FavoriteLoading
0

NetGear R系列多款路由器远程命令注入漏洞分析

前两天NTP刚搞完事情,NetGear路由器(网件路由器)又来搞事了T.T。目前CERT在上周五已发布公告,“如果用户使用涉及到的路由器,建议停止使用,直到官方发布补丁修复”。此漏洞是由Acew0rm发现的,之后报给NetGear,今天,他又在Twitter上上传了关于这个漏洞利用的视频。
同时也发布了一个Exploit地址,有两个,一个是嵌入html的利用,另一个是比较直接的利用,当然,需要获取路由器的IP地址。
https://github.com/Acew0rm/Exploits/blob/master/Netgear_R7000.html
https://www.exploit-db.com/exploits/40889/
但实际上,这个漏洞影响的路由版本,远不止现在曝光的这么少,目前曝光的是R6400,R7000版本,后来CERT又曝光了R8000版本。我看了此漏洞公开后,下面有很多在使用NetGear路由的老外在聊天,其中总结了一下受漏洞影响版本的路由。
l  R6400 (AC1750): confirmed
l  R7000 Nighthawk (AC1900, AC2300): confirmed (by myself)
l  R7500 Nighthawk X4 (AC2350): confirmed (by [2])
l  R7800 Nighthawk X4S(AC2600): confirmed (by [2])
l  R8000 Nighthawk (AC3200): confirmed
l  R8500 Nighthawk X8 (AC5300): confirmed (by [2])
l  R9000 Nighthawk X10 (AD7200): confirmed (by [2])
l  R6250
l  R6700
几乎所有R系列的路由都受此漏洞影响,当然有一些R系列路由虽然受影响,但因为固件的不同,部分固件是不受此漏洞影响的。
目前此漏洞未提供补丁,官方在Twitter上的回复是正在抓紧时间修复此漏洞,因此应该还有不少设备受漏洞影响。
开始分析前,感谢Spongebobb在微博上和我的讨论,让我从莫名其妙的脑洞中跳转出来,23333。
0x02 检测方式
浏览器访问路由器地址:

http://[router-address]/cgi-bin/;uname$IFS-a
如果返回的页面是错误或者非空的,那么该路由器可能存在这个漏洞。
0x03 为了分析我掉到了好几个坑里
在昨天看到这个漏洞曝光后,我下载了对应版本的固件【_R7000-V1.0.7.2_1.1.93.chk】,分析的过程中当然碰到了不少坑,这里稍微总结一下。
关于这个漏洞,主要问题发生在/usr/sbin/httpd里,但在/www/cgi-bin/下也有一个可执行文件genie.cgi,其中也履行了CGI程序的部分功能,刚开始我比较坚定的认为在genie.cgi中,也找到了比较有趣的调用位置。
v6 = getenv("QUERY_STRING");
ptr = (void *)sub_A304(dword_1385C);
if ( ptr )
{
v0 = sub_9560((int)v6);
if ( v0 != -1 )
{
sub_9C78(v0);
v4 = 0;
sub_ABAC(0xB348, &v4, &v3);
}
}
这里调用getenv获取了QUERY_STRING环境变量,这个变量就是通过GET方法接收到URL中参数的时候,会获取参数,并且给QUERY_STRING赋值,这个setenv赋值过程是在httpd中完成的,genie.cgi只负责getenv。而随后这里调用了一个函数sub_ABAC,跟入这个函数,我发现了在这个程序中唯一一次会调用到系统函数的位置。
.text:0000ABAC                 STMFD           SP!, {R11,LR}
.text:0000ABB0                 ADD             R11, SP, #4
.text:0000ABB4                 SUB             SP, SP, #0x420
.text:0000ABB8                 STR             R0, [R11,#command]
.text:0000ABBC                 STR             R1, [R11,#var_414]
.text:0000ABC0                 STR             R2, [R11,#var_418]
.text:0000ABC4                 LDR             R0, [R11,#command] ; command
.text:0000ABC8                 MOV             R1, #aR_0 ; modes
.text:0000ABD0                 BL              popen
popen可以执行系统函数,正是符合我们exp中的条件,但是却失落的发现,这里传递的值是sub_ABAC函数第一个参数,也就是0xB348,这是一个常量。

.rodata:0000B348 aInternetSetCon DCB "internet set connection genieremote 1",0
刚开始我脑洞有点开大了,想到的是类似于php的变量覆盖,会不会是URL传入的值,由于某些原因会覆盖到这个常量,后来还是否决了这个过程,一筹莫展的时候我想到了对比一下没有漏洞的版本(后来事实证明,我分析所谓没有漏洞的版本,也是有这个漏洞的),对比的时候发现R7000以后的路由版本采取https,在看配置文件的时候无意中发现了R7000中的/usr/sbin/httpd。

分页阅读: 1 2 3 4 5 6 7 8 9
【声明】:8090安全小组门户(http://www.8090-sec.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱hack@ddos.kim,我们会在最短的时间内进行处理。