记一次漏洞挖掘【网络安全】

漏洞信息

从 CVE-2019-10999 查看该 CVE 的基础信息得知,这是一个栈溢出漏洞,攻击者在已登录的情况下可以通过向 wireless.htm 发送一个超长的 WEPEncryption 参数导致栈溢出,从而执行任意命令攻击. 现在我们利用 Shambles Desktop 工具确定这个漏洞的位置并且执行一次栈溢出攻击。从 Dlink 官网查看存在这个漏洞的设备和版本信息。我们选择 DCS-932L 的 v2.17.01 版本。下载对应固件。

复现过程

首先用 Shambles Desktop 打开固件,利用 Shambles Desktop 的在线解包功能将固件解包并抽取文件系统,这样固件包的内容将会用可视化的文件目录树形式(如图 1 所示)展现,方便分析。同时 Shambles Cloud 会对解包信息初步分析,确定设备,产商,芯片架构,设备类型等信息。如下图右侧的 Firmware Info 的 Hardware Information 所示,该设备是 D-Link 的 MIPS 芯片架构的嵌入式摄像头设备。

1. 静态分析

img

首先我们通过 Shambles Desktop 对该固件进行静态代码分析,确定该漏洞的代码位置。

【一一帮助安全学习,所有资源获取处一一】

①网络安全学习路线

②20 份渗透测试电子书

③安全攻防 357 页笔记

④50 份安全攻防面试指南

⑤安全红队渗透工具包

⑥网络安全必备书籍

⑦100 个漏洞实战案例

⑧安全大厂内部视频资源

CVE 漏洞信息中提到该漏洞存在于设备的 web 服务器可执行文件 alphapd 中,攻击者在请求 wireless.htm 文件时,在请求参数 WEPEncryption 当中构造超长参数可导致栈溢出从而执行任意命令。

所以首先在文件管理器中搜索“alphapd”关键字,从而寻找对应的文件进行静态反编译操作,然后在当前反编译窗口搜索“WEPEncryption”关键字,结果返回十几处匹配信息 (如图 2 所示),再结合右侧代码风险检测窗“ELF Vunerability Info”的检测结果进行分析。

两处信息都多次提到 sub_43b7c0 附近的地址,代码风险检测中直接指出地址 strcpy 相关的栈溢出风险。所以<sub_43b7c0+1b4>的可能性比较大,双击``跳转到 **strcpy(&var30, v2)**处查看 ASM 代码。

img

ASM 代码只能看到该处是一个 strcpy 调用,按 F5 快捷键切换到“pseudo view”查看反汇编代码。如图 3 所示,25 行把 v2 的内容拷贝到栈变量 &var30 的地址。11~19 行的反编译代码逻辑为:“当 p0 内存地址中不存在 WEPEncryption 参数的时候,不进行任何有效操作并直接返回,而当 p0 内存地址中存在 WEPEncryption 参数的时候,websGetVar 返回 WEBEncryption 的参数内容”。结合 CVE 信息以及函数名 websGetVar 的含义,推测 sub_43b7c0 可能是处理网络请求参数 WEPEncryption 的函数。验证这一猜测,需要证明当针对 wireless.htm 发送带有 WEPEncryption 参数的网络请求时,sub_43b7c0 会被执行,这就需要动态模拟运行固件。

img

2. 动态调试

按照上述静态化分析的结论,我们得知漏洞的成因以及可能的指令位置,接下来进入第二阶段的动态验证流程: 利用 Shambles Desktop 的固件仿真模拟“Virtual Machine”(以下简称 “VM”)功能对该固件进行动态调试。 进入仿真模拟功能,首先我们需要将 Shambles Desktop 的文件管理模块切换到“云端模式”下,然后在右侧工具栏 VM 管理工具中点击新建,选择 alphapd 所在的文件系统,建立一个模拟器。然后在文件管理器中选中 alphapd 所在的文件系统,右键打开一个终端(下文称文件系统终端)。如下所示,固件的文件系统被挂载起来了。

img

img

/bin/alphapdalphapd: Startup!alphapd: cannot openpidfile#

复制代码

在新打开的文件系统终端输入:“/bin/alphapd”, 启动 alphapd,有错误返回,启动 alphapd 出错。

在 alphapd 中搜索对应的错误信息"cannot open pid file",只有两处引用,一处是在.rodata(字符串在可执行文件中的存放区域),另外一处是在代码段中的引用。优先查看代码段,分析该函数,62 行处的 if 语句表明当某文件不存在的时候,会抛出"cannot open pid file"的错误。在 62 行处点击 Tab 键,切换到 ASM View,从 ASM 的反编译辅助信息推断,这个文件应该是/var/run/alphapd.pid。

img

img

手动创建"alphapd.pid",命令如图 8 所示。再次运行 alphapd,旧错误已经解决,有新的错误。同样的,搜索这个错误,定位到原因是/var/run/nvramd.pid 文件不存在。

#mkdir/var/run#touch/var/run/alphapd.pid#/bin/alphapdalphapd: Startup!alphapd: waiting fornvram_daemonalphapd: .alphapd: .alphapd: .alphapd: .alphapd: .alphapd: .alphapd: .alphapd: .alphapd: .alphapd: .alphapd: .alphapd: .alphapd: .alphapd: .alphapd: please executenvram_daemonfirst!#

复制代码

img

创建"/var/run/nvramd.pid"文件, 再次运行 alphapd。旧错误已经解决,有新的错误出现。

#touch/var/run/nvramd.pid#/bin/alphapdalphapd: Startup!alphapd: Can't getlanipfromsysinfo!alphapd: failed toconvert  tobinaryipdataalphapd: Shutdown!

复制代码

同样搜索对应的错误,定位原因是 nvram_bufget 拿不到"IPAddress"(如下所示)。nvram_bufget 的功能是读取信息。Shambles 的模拟环境,支持从配置文件初始化设备参数配置。所以我们只需要做正确的配置,先查看固件中是否存在配置文件,不存在的话就需要从可执行文件中查询设备运行参数。

全局搜索”IPAddress”关键字,有多个文件引用,因为是查找配置文件,所以先排除可执行文件、sh 文件以及 cgi 文件,就只剩下 RT2860_default_vlan 这个文件了,查看 RT2860_default_vlan,发现存在多种参数配置,"IPAddress"也在其中,所以 RT2860_default_vlan 就是设备参数配置文件的概率比较大,可以拿来测试一下。这里比较幸运,搜索结果多的时候,需要做的排除工作比较多。

Shambles 的模拟环境在/shambles 目录下预置了 libnvram.so,可以从配置文件加载设备参数信息。把 RT2860_default_vlan 拷贝到 libnvarm.so 所在目录,重命名为 nvram.ini,再次运行 alphapd,因为这次要用 libnvram 模拟设备信息,所以运行时需要预加载 libnvram.so 。输入命令"LD_PRELOAD=/shambles/libnvram.so /bin/alphapd",运行结果如下所示,虽然还有一些其他的错误抛出,但是 alphapd 并没有中断,说明成功启动。

#mkdir-p /shambles/libnvram#cp /etc_ro/Wireless/RT2860AP/RT2860_default_vlan /shambles/nvram.ini#LD_PRELOAD=/shambles/libnvram.so /bin/alphapdnvram_get_buf:IPAddresssem_get: Key: 41370002sem_get: Key: 41370002nvram_get_buf: = "2.65.87.200"alphapd: Can't getlanipfromsysinfo!alphapd: Version 2.1.8 running at address 2.65.87.200:80nvram_get_buf:AccessControlEnablesem_get: Key: 41370002sem_get: Key: 41370002nvram_get_buf: = "0"nvram_get_buf: User1sem_get: Key: 41370002sem_get: Key: 41370002nvram_get_buf: = ""nvram_get_buf: User2sem_get: Key: 41370002sem_get: Key: 41370002nvram_get_buf: = ""nvram_get_buf: User3sem_get: Key: 41370002sem_get: Key: 41370002nvram_get_buf: = ""nvram_get_buf: User4sem_get: Key: 41370002sem_get: Key: 41370002nvram_get_buf: = ""nvram_get_buf: User5sem_get: Key: 41370002sem_get: Key: 41370002nvram_get_buf: = ""nvram_get_buf: User6sem_get: Key: 41370002sem_get: Key: 41370002nvram_get_buf: = ""nvram_get_buf: User7sem_get: Key: 41370002sem_get: Key: 41370002nvram_get_buf: = ""nvram_get_buf: User8sem_get: Key: 41370002sem_get: Key: 41370002nvram_get_buf: = ""

复制代码

一般 alphapd 默认的 web 服务端口是 80(如图 9 所示),设置端口转发,访问http://127.0.0.1:80试试。

img

img

img

用浏览器访问下http://127.0.0.1,显示如上图 10 所示界面,在该设备上,默认 admin 秘密是空。点击登录后看到如上图 11 所示界面,证明 alphapd web 服务正常运行。

3. CVE 重现

下面结合我们第一节的静态分析结论,来重现该 CVE。首先验证 alphapd 可以响应针对 wireless.htm 的请求。验证方法如下: 发送带有 WEPEncryption 的请求到wireless.htm,如果正常返回信息,则说明 alphapd 响应该网络请求。在电脑本机命令行输入"curl http://127.0.0.1/wireless.htm?WEPEncryption=FEWFEW",返回信息如下图所示,说明 alphapd 响应带有 WEPEncryption 的请求。

img

然后验证向 wireless.htm 发送带有 WEBEncryption 的网络请求,可以执行到sub_43b7c0+1b4处的strcpy。首先以调试模式启动 alphapd。在刚才运行 alphapd 的文件系统终端中按 ctrl+c 关闭这个进程。然后在 Shambles Desktop 的 alphapd 反编译界面点击调试配置把 libnvram.so 配置为预加载库。(这么做和我们刚才运行LD_PRELOAD=/shambles/libnvram.so /bin/alphapd是一样的作用)。启动调试,事件日志窗口返回的日志如图 13 所示。和文件系统终端运行 alphapd 显示的日志是一样的,证明调试正常启动。

img

img

先在下图标注位置打断点(如图断点 1 所示),发送对应网络请求,调试进程确实会在断点 1 停留,证明向 wireless.html 发送带有 WEPEncryption 参数的网络请求会执行到 strcpy。

img

最后验证当 WEPEncryption 的参数过长时,会导致栈溢出。

验证方法如下,分别向 wireless.html 发送正常长度的 WEPEncryption 的参数请求和超长度的 WEPEncryption 的参数请求,网络请求完成后,对比 pc 寄存器中的信息。如下图断点 2 所示中位置打断点,查看执行 jr 后,pc 寄存器信息是否被修改。断点 2 中的 ra 存储的是断点 1 strcpy 的调用函数 sub_43b7c0 执行完成后的跳转地址。jr 指令会把 ra 中的值拷贝到 pc 寄存器。

找到断点 2 的过程如下:

把光标放置在 sub_43b7c0 函数 return 处(如图 14 所示),按 tab 键切换到"ASM View”。找到对应的 jr 指令位置。就是下图断点 2 所示的断点 2。

img

img

测试 1:

启动 alphapd 调试,在电脑本机命令行输入"curl http://127.0.0.1/wireless.htm?WEPEncryption=ewfwefwefewf"。调试进程会前后停在断点 1 和断点 2,执行完成后,pc 寄存器中的内容是某条指令地址(如图 15 所示),且网络请求会正常返回。

测试 2:

电脑终端命令行输入"curl http://127.0.0.1/wireless.htm?WEPEncryption=ewfwefwefewffeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefwefwefwefwefwwwwwwwwwwvvvvewfwefwefwefwefwefwefwefweffweeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"。调试进程会前后停在断点 1 和断点 2,执行完成后,pc 寄存器中的内容不再是某一条指令地址,而是被修改为某个内存地址(如图 16 所示),此时继续执行,alphapd 会崩溃,说明栈已经被破坏。

以上两次测试结果对比说明发送带有 WEPEncryption 参数的网络请求到,会执行 strcpy。这个函数会让用户输入变量拷贝到栈内存。从而导致用户输入变量可以任意修改栈内存。攻击者通过巧妙的 WEPEncryption 的参数构造,pc 寄存器内容可以被修改为其他任意指令的地址,从而执行任意命令攻击。

【一一帮助安全学习,所有资源获取处一一】①网络安全学习路线②20 份渗透测试电子书③安全攻防 357 页笔记④50 份安全攻防面试指南⑤安全红队渗透工具包⑥网络安全必备书籍⑦100 个漏洞实战案例⑧安全大厂内部视频资源

至此,CVE-2019-10999在Shambles上重现完成。

img

img

网安&黑客学习资源分享:

给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

因篇幅有限,仅展示部分资料,朋友们如果需要可以点击链接免费领取或者滑到最后扫描二v码

👉[CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享]安全链接,放心点击

图片

同时每个成长路线对应的板块都有配套的视频提供:

图片

因篇幅有限,仅展示部分资料,朋友们如果需要可以点击链接免费领取或者滑到最后扫描二v码

👉[CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享]安全链接,放心点击

视频配套资料&国内外网安书籍、文档

当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料

图片
图片
所有资料共282G,朋友们如果有需要全套《网络安全入门+进阶学习资源包,需要点击下方链接或者保存图片到wx扫描二v码免费领取保证100%免费

👉[CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享]安全链接,放心点击

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值