官方漏洞描述
根据漏洞描述我们可以发现漏洞是在/lan.asp中存在一个Device Name导致的一个命令执行
漏洞分析:
通过搜索发现 是把lan_device_name的值传入拼接paramStr
进一步审计发现 copyDataToDataModelFormat是返回paramStr的也就是说 最后是提交给了get_set.ccp
我们用grep -r "get_set.cpp"是查不到相关信息的,既然没有“get_set.ccp”文件,那么可能是这个URL会交给后端处理,处理好之后返回给用户结果。
我们通过grep -r "get_set"发现这四个二进制文件中有调用于是我们进一步更进 去分析这四个二进制文件
然后我们再去看一下开机自启文件包括哪些
可以看到开机自启了ncc2和bulkListen
所以可见正确答案是ncc2的位置,因为有get_set字符串和相对应的函数
先对ncc2进行一个简单的分析
这里先是对fork子进程的一个检测来判断ncc2是否启动,然后对信号量进行一系列的设置然后设置信号处理函数 再通过ncc_load_hw_cfg设置pin码(这里介绍一下 PIN码(Personal Identification Number, 个人识别号码)是一种为了安全目的而设计的数字代码,通常用于验证用户的身份) 在后面就是一些其他服务的配置部分了
然后进一步分析 敏感函数 由于是命令执行我们去审system函数的代码
这些都不存在命令任意执行漏洞,我们发现还有一个_system函数,想要快速的找到漏洞点就需要根据另一个线索点(Device Name)进行寻找。我们在搜索字符串时如果直接指定DeviceName还是比较难找到的,这里可以先简单搜索Device,然后搜索Name,寻找交叉点
然后定位到sub_4F6DFC函数
有两条路径一个利用下面的_system另一个是利用上面的_system
先分析第一条路径:
关键是看a2是否可控:
发现不可控 此路不通0..........0
第二条路径:
Obj = (const char **)getObj(0x60u, (int)v9);
v4 = Obj;
v4是getObj
函数的返回值Obj,需要绕过hasInjectionString
的判断才能到达命令注入点,现在需要找到hasInjectionString
函数在哪个文件中,同样使用grep -r
命令:
这里就是一些简单的过滤 没有过滤冒号和换行符,可以使用“\n”来绕过
这里就可以通过修改参数来进行命令执行了
漏洞复现
sudo ./run.sh -r DIR820L /home/luyouqi/模拟/Dir-820/DIR820LA1_FW105B03.bin
用FIRMAE进行环境直接模拟
模拟好之后是这样 访问后
默认密码是空直接登录就可 必须要登录这是验证后的命令执行漏洞
修改红框参数为 %0atelnetd -l /bin/sh%0a
这里要注意直接在原包上进行修改 而不是放入重放后修改再发送,原因是会认定发送了多次导致崩溃 无法执行,发送后在等十秒就可以了
再用telnet进行连接 就可以成功拿到shell
额外挖掘
额外漏洞查找,一般漏洞存在就意味着肯定不只一个 我们继续去查询可能涉及到http_post且是需要执行的语句
可以看到这个界面也是post指令传入 那我们就跟进tools_vct.asp查看
传入的是ping.cpp
通过前面的过程 查询发现可能还是在ncc2中 继续审代码发现
是不是非常熟悉基本和前面那个洞没区别了
然后发送 之后连接看看能否拿到shell
成功了!!!!
刚准备去交cnvd的 结果一查
得 白高兴一场 早被打了
参考文献:https://cn-sec.com/archives/1262036.html