作者:k0pwn_ko

预估稿费:600RMB(不服你也来投稿啊!

投稿办法:发送邮件至linwei#360.cn,或上岸网页版在线投稿

r7800phpNetGear R系列多款路由器长途敕令注入破绽剖析 RESTful API

0x01 序言

前两天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路由的老外在谈天,个中总结了一下受漏洞影响版本的路由。

123456789l R6400 (AC1750): confirmedl 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): confirmedl R8500 Nighthawk X8 (AC5300): confirmed (by [2])l R9000 Nighthawk X10 (AD7200): confirmed (by [2])l R6250l R6700

险些所有R系列的路由都受此漏洞影响,当然有一些R系列路由虽然受影响,但由于固件的不同,部分固件是不受此漏洞影响的。

目前此漏洞未供应补丁,官方在Twitter上的回答是正在抓紧韶光修复此漏洞,因此该当还有不少设备受漏洞影响。

开始剖析前,感谢Spongebobb在微博上和我的谈论,让我从莫名其妙的脑洞中跳转出来,23333。

0x02 检测办法

浏览器访问路由器地址:

1http://[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中,也找到了比较有趣的调用位置。

123456789101112 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,跟入这个函数,我创造了在这个程序中唯一一次会调用到系统函数的位置。

123456789.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,这是一个常量。

1.rodata:0000B348 aInternetSetCon DCB \"大众internet set connection genieremote 1\"大众,0

刚开始我脑洞有点开大了,想到的是类似于php的变量覆盖,会不会是URL传入的值,由于某些缘故原由会覆盖到这个常量,后来还是反对了这个过程,一筹莫展的时候我想到了比拟一下没有漏洞的版本(后来事实证明,我剖析所谓没有漏洞的版本,也是有这个漏洞的),比拟的时候创造R7000往后的路由版本采纳https,在看配置文件的时候无意中创造了R7000中的/usr/sbin/httpd。

按照同样的思路,我找到了httpd中有两处函数调用可能调用到了系统函数,一处是popen,另一处是system。

12345678910.plt:0000E6BC ; FILE popen(const char command, const char modes).plt:0000E6BC popen ; CODE XREF: sub_73F40+3D4_x0019_p.plt:0000E6BC ; sub_95B44+1BC_x0019_p.plt:0000E6BC ADRL R12, 0x1086C4.plt:0000E6C4 LDR PC, [R12,#(popen_ptr - 0x1086C4)]! ; __imp_popen.plt:0000D69C ; int system(const char command).plt:0000D69C system ; CODE XREF: sub_147A0+D2C_x0019_p.plt:0000D69C ; sub_147A0+D94_x0019_p ....plt:0000D69C ADRL R12, 0x1076A4.plt:0000D6A4 LDR PC, [R12,#(system_ptr - 0x1076A4)]! ; __imp_system

为了剖析实行路径,我用了xrefs的功能,先来看看popen的。

实行路径比较大略,再来看看system的。

我全体人都崩溃了……后来我想到用cgi-bin搜索一下关键字,结果真的还有收成。

12.text:000110E8 off_110E8 DCD aCgiBin ; DATA XREF: sub_100A0+1808_x0019_r.text:000110E8 ; \公众cgi-bin/\"大众

通过这种方法,我找到了比较外层的函数调用sub_100A0,随后终于抓出了一条线。

这次对我这样对路由比较感兴趣的人来说也是一次学习的过程,下面进入对这个漏洞的详细剖析。

0x04 命令注入漏洞剖析

首先我们下载R系列路由器的固件。

下载地址:http://support.netgear.cn/doucument/detail.asp?id=2251

然后用binwalk -eM来迭代解压这个固件,得到这个固件的squashfs文件系统,这里天生的.squashfs文件须要用7zip来解压。

天生之后用IDA打开/usr/sbin/httpd,跟入sub_100A0函数,在这个函数中有一处调用。

1 return sub_19600((const char )v9, v246, v4);

这里会调用到sub_19600,个中涉及到三个参数,这里v9是我比较关心的,v9是什么呢,在sub_100A0函数中实在比较随意马虎预测。

123456if ( !strstr((const char )v9, \公众unauth.cgi\公众) && !strstr((const char )v9, \"大众securityquestions.cgi\"大众) && !strstr((const char )v9, \"大众passwordrecovered.cgi\"大众) && !strstr((const char )v9, \"大众userlogin.cgi\"大众) && !strstr((const char )v9, \"大众multi_login.cgi\"大众) && (strncmp((const char )v9, \"大众cgi-bin/\"大众, 8u) || strstr((const char )v9, \"大众RMT_invite_\"大众)) )

在这个函数中涉及到大量的strstr子字符串比较,个中比较的内容便是某个常量和v9变量,预测v9变量便是url的值,这里我们就假设v9的值便是exp的定义 /IP-Addr/cgi-bin/;killall$IFS’httpd’

这里$IFS是Linux的内部域分隔符,这里可以看做是一个空格。

那么接下来跟入sub_19600。

123456789101112131415161718char __fastcall sub_19600(const char a1, const char a2, int a3){ const char v3; // r6@1 const char v4; // r4@1 int v5; // r5@1 char result; // r0@1 v3 = a2; v4 = a1; v5 = a3; result = strstr(a1, \"大众cgi-bin\"大众); if ( result ) { if ( acosNvramConfig_match((int)\"大众cgi_debug_msg\"大众, (int)\"大众1\公众) ) printf(\"大众\r\n##########%s(%d)url=%s\r\n\"大众, \"大众handle_options\"大众, 1293, v4); result = (char )sub_36C34(v3, v5, v4, 2); } return result;}

比较简短,这里会打印一个url字符串,而url后面跟的%s便是v4,v4由a1而来,a1便是此函数第一个参数,以是第一个参数的确是url的值,接下来v4会作为第三个参数传入sub_36C34函数,漏洞便是在此函数中发生。

这里我先分段讲解这个函数中产生漏洞的全体过程,末了,我再贴上这个函数的完全伪代码
我们重点关注第三个参数v4。

进入后,首先第三个参数,也便是url会交给v6。

1

v6 = a3;

然后会判断v6中是否包含cgi-bin,如果包含,则进入内部处理,这里根据exp,是存在cgi-bin的,接下来进入处理,在处理的过程中,会判断是否包含?,如果包含?,则会给v47赋值,v47这个值我们要记住,在后面设置QUERY_STRING,我们会用到,但是实际上跟此漏洞没有关系。

这里为什么要用到?,便是QUERY_STRING是CGI吸收GET参数的,这里默认GET参数是在?后面,便是由此而来。

12345678910111213141516 v12 = strstr(v6, \"大众cgi-bin\公众); if ( v12 ) { if ( acosNvramConfig_match((int)&unk_F0378, (int)\公众1\"大众) ) printf(\公众\r\n##########%s(%d)\r\n\"大众, \公众netgear_commonCgi\"大众, 76); if ( strchr(v12, 63) ) { if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众1\"大众) ) printf(\"大众\r\n##########%s(%d)\r\n\"大众, \"大众netgear_commonCgi\公众, 80); v13 = strchr(v12, 63); if ( acosNvramConfig_match((int)&unk_F0378, (int)\公众1\"大众) ) printf(\"大众\r\n#############%s(%d)tmp1=%s,tmp2=%s\r\n\公众, \"大众netgear_commonCgi\"大众, 83, v12, v13 + 1); strcpy((char )&v47, v13 + 1); if ( acosNvramConfig_match((int)&unk_F0378, (int)\公众2\"大众) ) printf(\"大众\r\n###############%s(%d)query_string=%s\r\n\"大众, \"大众netgear_commonCgi\公众, 86, &v47); v14 = strchr(v6, 47);

当然,在exp中是不包含?的,因此这个if ( strchr(v12, 63) )

语句不成立,则不进入这个处理,看一下下面的else语句。

在else语句中会进行字符串切割,切割的便是v12,也便是cgi-bin/;killall,这里注释里我写出了切割后地址指针指向的字符串内容。

比较关心的便是v20,v21和v22,个中由于切割后,后面不再包含47,也便是/的ascii码,因此v22为0,之后会对v50进行初始化。

12345678910 else { if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\公众) ) printf(\公众\r\n##########%s(%d)\r\n\公众, \"大众netgear_commonCgi\"大众, 99); v19 = strchr(v12, 47); v20 = v19 + 1; // ;kill v21 = v19; // /;kill v22 = strchr(v19 + 1, 47); // v22=NULL memset(&v50, 0, 0x40u); // v50init v23 = (char)v21;

然后就进入一系列的判断,判断的内容便是切割之后;kill后面还包含不包含/。

123456 if ( v21 ) v23 = 1; v24 = v22 == 0; if ( v22 ) v24 = v21 == 0; if ( v24 )

这里显然是不包含的,因此v24为NULL,也便是v22的值。
因此下面if语句就不通过,那么进入到else处理。

在else处理中,会将v50赋值,赋值的内容便是v20中从后往前数5字节,也便是;kill,这样v50就得到了我们的命令。
可以看到这个过程没有任何过滤

1234567891011121314 else { strncpy((char )&v50, v20, v22 - 1 - v21);// v50=;kill if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\公众) ) printf(\"大众\r\n#############tmp1=%s,tmp2=%s,tmp3=%s,cgi=%s\r\n\公众, v12, v21, v22, &v50); v15 = &v46; strcpy((char )&v46, v22); if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\公众) ) { v16 = \"大众\r\n###############%s(%d)path_info=%s\r\n\"大众; v17 = 110; v18 = \公众netgear_commonCgi\"大众; goto LABEL_34; }

随后会进入连续的goto跳转,跳转过程中紧张还是打印一些信息,随后会进入到v7处理,v7处理代码挺长的,个中涉及到了QUERY_STRING环境变量的赋值,赋值内容便是v47。
当然,我们漏洞的流程,由于没有?,以是不会进入这个流程。

12 if ( (_BYTE)v47 ) setenv(\公众QUERY_STRING\公众, (const char )&v47, 1);

接下来便是漏洞触发的关键位置,由于我们不知足条件,就会实行下面的语句。

12 v26 = \公众OPTIONS\"大众; v27 = (char )&v53;

之后出来后会跳转,这里会拷贝v26,也便是OPTIONS到v27中,v27的值便是v53的地址值,之后跳转。

12 strcpy(v27, v26); goto LABEL_47;

跳转之后,会进入一系列判断,判断v53的值

123456789101112 if ( !strcmp((const char )&v53, \"大众POST\"大众) ){ v33 = (const char )&unk_F062B; v34 = (char )&v45;} else if ( !strcmp((const char )&v53, \"大众OPTIONS\公众) ) { } else {…… }

这里省略了一部分过程,由于v53的值是OPTIONS,末了会有一处赋值,v34会赋值为v45的地址值,之后就进入漏洞触发的关键位置,这里会调用sprintf将v50,也便是我们命令的值交给v34。
而v34的值便是v45地址的值,这样调用system(&45)的时候,就实行了系统命令。

123456 sprintf(v34, v33, &v50); system((const char )&v45); memset(&v49, 0, 0x40u); memset(&v48, 0, 0x40u); memset(&v51, 0, 0x20u); memset(&v52, 0, 0x10u);

而在我们剖析的过程中,没有一处对这个命令值进行限定,末了导致了命令注入漏洞的发生。
下面贴上全体源码。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258int __fastcall sub_36C34(const char a1, int a2, const char a3, int a4){ v4 = a1; v5 = a2; v6 = a3; v7 = a4; v8 = fork(); v9 = v8; if ( !v8 ) { if ( fork() ) { v10 = v9; goto LABEL_101; } if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众1\"大众) ) printf(\"大众\r\n###############%s(%d)url=%s,method=%d\r\n\公众, \公众netgear_commonCgi\"大众, 59, v6, v7); v11 = fopen(\"大众/tmp/var/readydropd.conf\"大众, \"大众r\公众); if ( v11 ) { fclose(v11); } else { system(\"大众cp -f /www/cgi-bin/readydropd.conf /tmp/var/\"大众); if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众1\"大众) ) puts(\"大众\r\n###################copy readydropd.conf\r\"大众); } v12 = strstr(v6, \"大众cgi-bin\公众); if ( v12 ) { if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众1\"大众) ) printf(\"大众\r\n##########%s(%d)\r\n\公众, \公众netgear_commonCgi\"大众, 76); if ( strchr(v12, 63) ) { if ( acosNvramConfig_match((int)&unk_F0378, (int)\公众1\"大众) ) printf(\"大众\r\n##########%s(%d)\r\n\"大众, \"大众netgear_commonCgi\"大众, 80); v13 = strchr(v12, 63); if ( acosNvramConfig_match((int)&unk_F0378, (int)\公众1\"大众) ) printf(\"大众\r\n#############%s(%d)tmp1=%s,tmp2=%s\r\n\"大众, \"大众netgear_commonCgi\公众, 83, v12, v13 + 1); strcpy((char )&v47, v13 + 1); if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\公众) ) printf(\"大众\r\n###############%s(%d)query_string=%s\r\n\"大众, \公众netgear_commonCgi\公众, 86, &v47); v14 = strchr(v6, 47); if ( v14 ) { v15 = &v50; memset(&v50, 0, 0x40u); strncpy((char )&v50, v14 + 1, v13 - 1 - v14); if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\公众) ) { v16 = \公众\r\n###############%s(%d)cgi_name=%s\r\n\"大众; v17 = 93; v18 = \公众netgear_commonCgi\"大众;LABEL_34: printf(v16, v18, v17, v15); goto LABEL_40; } } } else { if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\公众) ) printf(\"大众\r\n##########%s(%d)\r\n\公众, \公众netgear_commonCgi\"大众, 99); v19 = strchr(v12, 47); v20 = v19 + 1; // ;kill v21 = v19; // /;kill v22 = strchr(v19 + 1, 47); // v22=0 memset(&v50, 0, 0x40u); // v50init v23 = (char)v21; if ( v21 ) v23 = 1; v24 = v22 == 0; if ( v22 ) v24 = v21 == 0; if ( v24 ) { if ( v22 ) v25 = 0; else v25 = v23 & 1; if ( v25 ) strcpy((char )&v50, v20); } else { strncpy((char )&v50, v20, v22 - 1 - v21);// v50=;kill if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\"大众) ) printf(\"大众\r\n#############tmp1=%s,tmp2=%s,tmp3=%s,cgi=%s\r\n\公众, v12, v21, v22, &v50); v15 = &v46; strcpy((char )&v46, v22); if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\"大众) ) { v16 = \"大众\r\n###############%s(%d)path_info=%s\r\n\"大众; v17 = 110; v18 = \"大众netgear_commonCgi\"大众; goto LABEL_34; } } } }LABEL_40: if ( v7 ) { if ( v7 == 1 ) { v26 = \"大众POST\"大众; v27 = (char )&v53; } else { if ( v7 != 2 ) {LABEL_47: if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\公众) ) printf(\"大众\r\n###############%s(%d)request_method=%s\r\n\"大众, \"大众netgear_commonCgi\"大众, 130, &v53); if ( (_BYTE)v46 ) setenv(\"大众PATH_INFO\"大众, (const char )&v46, 1); if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\"大众) ) { v28 = getenv(\"大众PATH_INFO\公众); printf(\"大众\r\n###############%s(%d)PATH_INFO=%s\r\n\"大众, \"大众netgear_commonCgi\"大众, 136, v28); } setenv(\公众LD_LIBRARY_PATH\公众, \公众/usr/lib\"大众, 1); if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\"大众) ) { v29 = getenv(\"大众LD_LIBRARY_PATH\公众); printf(\"大众\r\n###############%s(%d)LD_LIBRARY_PATH=%s\r\n\"大众, \"大众netgear_commonCgi\公众, 140, v29); } setenv(\"大众REQUEST_METHOD\公众, (const char )&v53, 1); if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\"大众) ) { v30 = getenv(\"大众REQUEST_METHOD\"大众); printf(\"大众\r\n###############%s(%d)REQUEST_METHOD=%s\r\n\"大众, \"大众netgear_commonCgi\"大众, 144, v30); } if ( (_BYTE)v47 ) setenv(\"大众QUERY_STRING\公众, (const char )&v47, 1); if ( !strcmp((const char )&v53, \公众POST\"大众) ) { v31 = fopen(\"大众/tmp/post_result\"大众, \"大众r\"大众); if ( v31 ) { fclose(v31); system((const char )&unk_F05D8); if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\"大众) ) puts(\"大众\r\n##########del post ############\r\公众); } system(\"大众rm -f /tmp/post_data.txt\"大众); sleep(1u); v32 = fopen(\"大众/tmp/post_data.txt\公众, \公众w\"大众); if ( v32 ) { fputs(v4, v32); fclose(v32); } v33 = (const char )&unk_F062B; v34 = (char )&v45; } else if ( !strcmp((const char )&v53, \"大众OPTIONS\公众) ) { v35 = fopen(\"大众/tmp/options_result\"大众, \公众r\"大众); if ( v35 ) { fclose(v35); system(\公众rm -f /tmp/options_result\"大众); if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\公众) ) puts(\"大众\r\n##########del option ############\r\公众); } v33 = (const char )&unk_F06A2; v34 = (char )&v45; } else { v36 = fopen(\"大众/tmp/cgi_result\"大众, \"大众r\"大众); if ( v36 ) { fclose(v36); system(\"大众rm -f /tmp/cgi_result\"大众); if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\"大众) ) puts(\"大众\r\n##########delete /tmp/cgi_result ############\r\公众); } v33 = (const char )&unk_F070F; v34 = (char )&v45; } sprintf(v34, v33, &v50); system((const char )&v45);//key


memset(&v49, 0, 0x40u); memset(&v48, 0, 0x40u); memset(&v51, 0, 0x20u); memset(&v52, 0, 0x10u); if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众1\"大众) ) printf(\"大众\r\n###############%s(%d)\r\n\"大众, \"大众netgear_commonCgi\"大众, 200); if ( !strcmp((const char )&v53, \"大众POST\公众) ) { v37 = \"大众/tmp/post_result\公众; } else if ( !strcmp((const char )&v53, \公众OPTIONS\"大众) ) { v37 = \公众/tmp/options_result\"大众; } else { v37 = \"大众/tmp/cgi_result\公众; } v38 = fopen(v37, \"大众r\公众); if ( v38 ) { if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众1\"大众) ) printf(\公众\r\n###############%s(%d)\r\n\"大众, \公众netgear_commonCgi\"大众, 211); while ( fgets((char )&v44, 0xFFFF, v38) ) { if ( acosNvramConfig_match((int)&unk_F0378, (int)\公众1\"大众) ) printf(\"大众\r\n###############%s(%d)\r\n\公众, \"大众netgear_commonCgi\"大众, 215); v39 = strstr((const char )&v44, \"大众Status:\"大众); if ( v39 ) { strcpy((char )&v49, v39 + 7); v40 = strchr((const char )&v49, 10); if ( v40 ) v40 = 0; if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\"大众) ) printf(\公众\r\n###############%s(%d)status=%s\r\n\"大众, \"大众netgear_commonCgi\"大众, 223, &v49); sprintf((char )&v43, \"大众HTTP/1.1%s\r\n\"大众, &v49); } else { strcat((char )&v43, (const char )&v44); } } fclose(v38); } strcat((char )&v43, \公众\r\n\公众); if ( acosNvramConfig_match((int)&unk_F0378, (int)\公众1\公众) ) printf(\"大众\r\n###############%s(%d)http_hdr=%s\r\n\公众, \公众netgear_commonCgi\"大众, 276, &v43); v41 = strlen((const char )&v43); sub_F9E0(v5, &v43, v41, 0); if ( acosNvramConfig_match((int)&unk_F0378, (int)\"大众2\"大众) ) printf(\"大众\r\n######======######%s(%d)\r\n\公众, \"大众netgear_commonCgi\"大众, 280); v10 = 0;LABEL_101: exit(v10); } v26 = \"大众OPTIONS\"大众; v27 = (char )&v53; } } else { v26 = \公众GET\"大众; v27 = (char )&v53; } strcpy(v27, v26);//key
goto LABEL_47; } if ( v8 > 0 ) waitpid(v8, &v54, 0); return 0;}

0x05 办理方案

临时方案 : ) 利用这个漏洞,实行关闭WEB做事的命令,不会影响路由功能,从而进行缓解该漏洞。
但是需把稳重启之后会重新加载WEB做事。

1http://[router-address]/cgi-bin/;killall$IFS'httpd'

CERT官方建议停滞利用该路由器,直到官方发布补丁修复。