Loading
0

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

if ( v24 )
这里显然是不包含的,因此v24为NULL,也就是v22的值。因此下面if语句就不通过,那么进入到else处理。
在else处理中,会将v50赋值,赋值的内容就是v20中从后往前数5字节,也就是;kill,这样v50就获得了我们的命令。可以看到这个过程没有任何过滤
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。当然,我们漏洞的流程,由于没有?,所以不会进入这个流程。
if ( (_BYTE)v47 )
setenv("QUERY_STRING", (const char *)&v47, 1);
接下来就是漏洞触发的关键位置,由于我们不满足条件,就会执行下面的语句。
v26 = "OPTIONS";
v27 = (char *)&v53;
之后出来后会跳转,这里会拷贝v26,也就是OPTIONS到v27中,v27的值就是v53的地址值,之后跳转。
strcpy(v27, v26);
goto LABEL_47;
跳转之后,会进入一系列判断,判断v53的值
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)的时候,就执行了系统命令。
sprintf(v34, v33, &v50);
system((const char *)&v45);
memset(&v49, 0, 0x40u);
memset(&v48, 0, 0x40u);
memset(&v51, 0, 0x20u);
memset(&v52, 0, 0x10u);
而在我们分析的过程中,没有一处对这个命令值进行限制,最后导致了命令注入漏洞的发生。下面贴上整个源码。
int __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
{

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