查找漏洞点
使用Ghidra打开upnp文件后,搜索system
函数
发现除了最后一个
system
是带参数的,别的都是已经定义好的命令,对此system
进行分析
漏洞点分析
int FUN_0040749c(int param_1)
{
int iVar1;
int local_418;
int local_414;
char acStack_410 [1028];
iVar1 = ATP_XML_GetChildNodeByName(*(undefined4 *)(param_1 + 0x2c),"NewDownloadURL",0,&local_418 );
if (((iVar1 == 0) && (local_418 != 0)) &&
(iVar1 = ATP_XML_GetChildNodeByName
(*(undefined4 *)(param_1 + 0x2c),"NewStatusURL",0,&local_414), iVar1 == 0) )
{
if (local_414 != 0) {
snprintf(acStack_410,0x400,"upg -g -U %s -t \'1 Firmware Upgrade Image\' -c upnp -r %s -d -b" ,
local_418,local_414);
system(acStack_410);
}
}
return iVar1;
system
的参数是acStack_410
,acStack_410
是通过snprintf
函数将local_418
和local_414
拼接在一起得到,最大长度是0x400,在这里如果我们能使得local_418
和local_414
中的一个参数可控,可以通过;
来执行多命令,如system(ls;ifconfig)
,所以我们需要分析local_418
和local_414
local_418
通过ATP_XML_GetChildNodeByName
函数从param_1
中获取NewDownloadURL
的值,local_414
通过ATP_XML_GetChildNodeByName
函数从param_1
中获取NewStatusURL
的值
进一步分析param_1的来源,待分析