加入收藏 | 设为首页 | 会员中心 | 我要投稿 好传媒网 (https://www.haochuanmei.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

物联网安全实战从零开始-CVE-2022-36233

发布时间:2022-11-26 15:02:05 所属栏目:Linux 来源:转载
导读: 本环境是蛇矛实验室基于"火天网演攻防演训靶场"进行搭建,通过火天网演中的环境构建模块,可以灵活的对目标网络进行设计和配置,并且可以快速进行场景搭建和复现验证工作。
自 2005年国际电

本环境是蛇矛实验室基于"火天网演攻防演训靶场"进行搭建,通过火天网演中的环境构建模块,可以灵活的对目标网络进行设计和配置,并且可以快速进行场景搭建和复现验证工作。

自 2005年国际电信联盟正式提出“物联网(IoT)”这一概念以来,物联网在全球范围内迅速获得认可,并成为信息产业革命第三次浪潮和第四次工业革命的核心支撑。同时,数以亿计的设备接入物联网,这些设备如今已渗透到我们生活的方方面面,从家居到工厂无处不在。一方面物联网设备使我们的生活更加便捷,而另一方面物联网安全事件频发,全球物联网安全支出不断增加。

当前,大量物联网设备及云服务端直接暴露于互联网,这些设备和云服务端存在的漏洞一旦被利用,可导致设备被控制、用户隐私泄露、云服务端数据被窃取等安全风险,甚至会对基础通信网络造成严重影响。从2018年全球统计数据来看,路由器、视频监控设备暴漏数量占比较高。路由器暴漏数量超过3000万台,视频监控设备暴露数量超过1700万台,并且这些设备往后几年会一年比一年多,物联网安全的事件也会越来越多。由此,物联网安全行业需要大力发展,物联网安全人才的培养也刻不容缓。

矛实验室在后续将利用火天网境系列靶场中的相关目标仿真和环境构建的特性,将持续发布关于“物联网安全-CVE实战分析”系列的文章来帮助大家入门物联网安全。

关于CVE-2022-36233

linux联网_linux联网_重启linux后无法联网

从CVE发布的信息来看,漏洞出现在Tenda AC9 V15.03.2.13版本的固件,并且漏洞成因是由于httpd程序中form_fast_setting_wifi_set函数中出现了栈溢出漏洞。

固件下载(drivers.softpedia.com/get/Router-Switch-Access-Point/Tenda/Tenda-AC9-Wireless-Router-Firmware-15-03-2-13.shtml)

下载好固件后,我们下面开始分析和复现漏洞

漏洞分析

"binwalk 固件名"分析,发现固件中的文件系统可以由binwalk提取linux联网,我们紧接着使用“binwalk -Me 固件名”命令提取文件系统。

重启linux后无法联网_linux联网_linux联网

进入到文件系统目录,使用"file busybox"命令,查看路由器程序架构。然后使用"readelf -h busybox"查看程序的大小端序。

linux联网_重启linux后无法联网_linux联网

根据CVE发布的信息,我们可以快速定位漏洞函数。我们将httpd程序拖入IDA Pro进行分析,我们在函数窗口直接搜索form_fast_setting_wifi_set,双击进入到form_fast_setting_wifi_set函数中进行逆向分析。

重启linux后无法联网_linux联网_linux联网

form_fast_setting_wifi_set函数中,稍微晃了一眼,就发现了漏洞所在之处。strcpy函数是敏感函数,大多数栈溢出漏洞中,都是由于使用strcpy前,没有对用户数据进行过滤。导致攻击者构造恶意数据控制程序执行流执行攻击者的恶意代码,从而获得系统权限。form_fast_setting_wifi_set函数最开始对3个局部变量(s,dest,v10)进行初始化,根据后面动态调试可知,sub_2B318函数会对ssid参数后面的值进行提取,放入到src变量中。然后调用strcpy函数,进行了拷贝,产生了栈溢出。

这里的栈溢出原理非常简单,但是有一个小坑。这里调用了俩次strcpy函数,并且都是由src拷贝到目的地址,目的地址分别是局部变量s和局部变量dest。根据上面的局部变量声明可知这俩个局部变量是相邻的,所以栈溢出数据可能会有一定影响。是否会影响到shellcode的执行,后面我们会进行动态调试查看栈溢出流程。

重启linux后无法联网_linux联网_linux联网

知道了栈溢出的漏洞触发点,我们需要关注一下漏洞触发的条件,首先就是ssid后面的参数是溢出点,我们分析过了。但是我们需要往前分析找到ssid是在哪个form表单中,通过对form_fast_setting_wifi_set函数按"x",发现ssid为fast_setting_wifi_set表单中的参数。

程序以webroot为根目录,根据用户URI请求中"/goform/"后面的参数,使用sub_41238函数进行匹配处理。

下面我们开始动态调试,由于前面我们已经分析出了漏洞点,我们先构造一个poc进行测试。

linux联网_linux联网_重启linux后无法联网

先运行httpd,然后运行gdbserver进行attach。这时主机运行gdb-multiarch调试httpd程序,使用target remote xxx.xxx.xxx.xxx:port。我们设置断点位置form_fast_setting_wifi_set函数和0x6309c处(函数返回前)

重启linux后无法联网_linux联网_linux联网

输入c回车运行,然后运行我们的poc后,程序直接在strcpy函数处崩溃了。这里的r1内容为'bbbb',strcpy访问不到[r1]里面的内容,所以崩溃了。

重启linux后无法联网_linux联网_linux联网

我们重新写一个poc进行调试,然后仔细调试一下栈溢出过程。

linux联网_重启linux后无法联网_linux联网

老样子,下断点在0x62988处,c运行。然后执行poc,程序停在了断点处。

linux联网_linux联网_重启linux后无法联网

运行到0x629c4处,对R0中的地址(stack_s)进行memset初始化,大小为0x40字节。

linux联网_重启linux后无法联网_linux联网

运行到0x629dc处,对R0中的地址(stack_dest)进行memset初始化,大小为0x40字节。

linux联网_重启linux后无法联网_linux联网

这里调用0x2b318函数获取request包中的ssid参数后面的值

重启linux后无法联网_linux联网_linux联网

获取ssid参数的值后存入堆段

linux联网_linux联网_重启linux后无法联网

第一次strcpy,将ssid值复制到0x7ed729cc(stack_s)

linux联网_重启linux后无法联网_linux联网

此时,局部变量s的空间分布如下

linux联网_linux联网_重启linux后无法联网

stack_dest的空间分布如下

linux联网_linux联网_重启linux后无法联网

第二次strcpy,由于heap段src地址被我们覆盖,所以是被覆盖地址的内容复制到dest

重启linux后无法联网_linux联网_linux联网

第二次strcpy执行后,一直执行到返回地址,我们在返回地址0x630a0处下断,c执行,此时的栈空间分布如下。发现我们写入的poc所有字节后面4字节就是ret address。

linux联网_重启linux后无法联网_linux联网

pop后pc指令寄存器的地址,下一次,我们写exp将ret addr设置为我们需要执行的rop链地址就行了。

linux联网_重启linux后无法联网_linux联网

漏洞复现

运行路由器后,访问主界面

重启linux后无法联网_linux联网_linux联网

运行后,使用exp进行攻击,这里动态调试跟踪到执行我们的rop链。

exp如下:

注释:解释一下这里为什么用libc的rop链,因为我调试发现使用程序空间的rop地址过不了第二次strcpy,所以需要用libc.so.0中的rop_blx地址进行绕过。

linux联网_重启linux后无法联网_linux联网

动态调试发现,程序已经执行我们的rop链

重启linux后无法联网_linux联网_linux联网

已经执行到我们想要执行的puts函数,攻击成功。

重启linux后无法联网_linux联网_linux联网

攻击后,路由器已经访问不了,并且路由器终端中httpd程序已经消失。

linux联网_linux联网_重启linux后无法联网

总结

这一小节,我们学习tenda路由器的漏洞分析,学习了如何进行动态调试,并成功复现了tenda ac9栈溢出漏洞。

蛇矛实验室成立于2020年,致力于安全研究、攻防解决方案、靶场对标场景仿真复现及技战法设计与输出等相关方向。团队核心成员均由从事安全行业10余年经验的安全专家组成,团队目前成员涉及红蓝对抗、渗透测试、逆向破解、病毒分析、工控安全以及免杀等相关领域。

(编辑:好传媒网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!