本环境是蛇矛实验室基于"火天网演攻防演训靶场"进行搭建,通过火天网演中的环境构建模块,可以灵活的对目标网络进行设计和配置,并且可以快速进行场景搭建和复现验证工作。
自 2005年国际电信联盟正式提出“物联网(IoT)”这一概念以来,物联网在全球范围内迅速获得认可,并成为信息产业革命第三次浪潮和第四次工业革命的核心支撑。同时,数以亿计的设备接入物联网,这些设备如今已渗透到我们生活的方方面面,从家居到工厂无处不在。一方面物联网设备使我们的生活更加便捷,而另一方面物联网安全事件频发,全球物联网安全支出不断增加。
当前,大量物联网设备及云服务端直接暴露于互联网,这些设备和云服务端存在的漏洞一旦被利用,可导致设备被控制、用户隐私泄露、云服务端数据被窃取等安全风险,甚至会对基础通信网络造成严重影响。从2018年全球统计数据来看,路由器、视频监控设备暴漏数量占比较高。路由器暴漏数量超过3000万台,视频监控设备暴露数量超过1700万台,并且这些设备往后几年会一年比一年多,物联网安全的事件也会越来越多。由此,物联网安全行业需要大力发展,物联网安全人才的培养也刻不容缓。
蛇矛实验室在后续将利用火天网境系列靶场中的相关目标仿真和环境构建的特性,将持续发布关于“物联网安全-CVE实战分析”系列的文章来帮助大家入门物联网安全。
关于CVE-2022-26258
从CVE发布的信息来看,漏洞出现在D-Link DIR-820L 1.05B03版本的固件,并且漏洞成因是由于/lan.asp中的Device Name参数导致远程代码执行。
固件下载(https://www.dlinktw.com.tw/techsupport/download.ashx?file=2663)
下载完固件,我们下面开始分析漏洞成因
漏洞分析
"binwalk 固件名"分析,发现固件没有进行加密后,我们使用“binwalk -Me 固件名”命令提取文件系统。
根据上面CVE描述的信息,我们先查看一下lan.asp里面的内容。打开后可以发现里面有很多属性的设置,以及很清楚的写了url为get_set.ccp。大致浏览一下里面的内容后,我们可以运行起来路由器看一下界面是如何的,这样可以更清晰的发觉漏洞点。
靶场内路由器运行后,我们可以访问一下/lan.asp。发现里面确实是有Device Name参数,这里可能就是漏洞点。一般情况下,从web界面的参数开始攻击的漏洞有命令注入、栈溢出以及拒绝服务等等。我们这里暂时还不知道是什么漏洞。所以接着往下分析。
我们继续往下分析,先查看一下。我们还是先查看一下/etc/init.d/目录下的开机自启文件,发现脚本最后启动了bulkListen和ncc2程序。接下来我们分析一下这俩个开机自启程序。
使用IDA Pro打开要分析的bulkListen程序。IDA 自动帮我们识别出了main函数,我们直接进入main函数进行分析。
main函数流程大致为通过iptable建立防火墙规则;
并且通过内部ip地址239.255.255.100进行数据通信,通信过程中将数据保存到"/var/tmp/bulkdatemsg"文件中。等待通信结束后,再次调用iptable删除规则。
sub_400a3c函数建立socket链接并且绑定ip地址。
sub_400be0对文件进行写入操作。
通过对bulkListen程序进行分析,发现与我们要分析的漏洞并无关系。我们接下来分析ncc2程序。我们搜索进入main函数,大致看一下程序执行流程。main函数首先进行fork子进程,然后判断ncc2的线程是否启动,然后对信号量进行设置,然后设置信号处理函数。最后通过ncc_load_hw_cfg设置pin码。
开始对路由器服务器的进行配置,后面就是一些其他服务的配置以及一些信息的输出。
在对ncc_sp_init的简略查看过程中,发现ncc_cameo_proxy_1_0_init等函数中调用了__system函数。根据这个函数的命名和参数规律猜测就是system的包装。这里得到__system函数为导入函数,我们可以根据字符串查找定位__system函数,然后进行分析。
使用'grep -ir "__system" ./*'进行搜索,发现libleopard.so动态库,我们使用IDA进行分析。
__system函数,调用vsprintf对参数进行格式化,然后使用系统system函数进行执行。这里如果开发者没有对用户可控数据进行过滤,即可造成命令注入。这与我们最开始的分析过程中对几种漏洞类型猜测进行了对应。所以我们知道了CVE-2022-26258造成的原因很有可能是命令注入,Device Name参数由于没有过滤或过滤不当导致攻击者进行绕过执行了system函数。
所以我们接下来返回ncc2程序顺着__system函数进行寻找,对着__system函数变量名按"x"查看交叉引用。
这里发现调用__system函数的地址还是比较多的,想要快速的找到漏洞点就需要根据另一个线索点(Device Name)进行寻找。我们在搜索字符串时如果直接指定DeviceName还是比较难找到的,这里可以先简单搜索Device,然后搜索Name,寻找交叉点。这样很快就定位到了疑似漏洞点的函数sub_4f6dfc。这种方法很适合根据已有线索快速寻找漏洞点,但是这样做有一个明显缺点,那就是会失去很多发现漏洞的机会。在该函数中,这里的v3就是用户可控的Device Name参数数据,虽然函数这里调用了hasInjectionString函数进行了过滤,但是过滤不够完全,导致攻击者还是可以绕过执行。
下图为libleopard.so库中的hasInjectionString函数,虽然函数过滤了"`"、""、";"、"|"符号,但是"n"以及"$()"等符号还是没有过滤,导致攻击者绕过进行命令注入。
漏洞复现
仿真运行路由器后,我们访问url,显示为下图中的界面。修改Device Name参数并运行burpsuite进行抓包
burpsuite拦截开启抓包如图所示
然后我们修改lanHostCfg_DeviceName_1.1.1.0=后面的参数,修改为我们的payload。payload为"%0atelnetd -l /bin/sh%0a"。修改完成后点击forward发包。
等待10秒后配置生效,此时我们payload已经执行完毕
使用telnet命令链接路由器,得到shell后可以执行命令
路由器内部已经启动了telnetd服务,本次攻击成功。
总结
这一小节,我们对D Link Dir820L路由器进行了逆向分析,学习了如何根据已有线索进行逐步分析,并且根据有限的线索找到漏洞点。
蛇矛实验室成立于2020年,致力于安全研究、攻防解决方案、靶场对标场景仿真复现及技战法设计与输出等相关方向。团队核心成员均由从事安全行业10余年经验的安全专家组成,团队目前成员涉及红蓝对抗、渗透测试、逆向破解、病毒分析、工控安全以及免杀等相关领域。
原文始发于微信公众号(蛇矛实验室):物联网安全实战从零开始-CVE-2022-26258
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论