|
发表于 2021-11-16 11:13:20
|
显示全部楼层
|阅读模式
IP:山东省 移动/数据上网公共出口
登录后更精彩...O(∩_∩)O...
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 mind 于 2021-11-16 11:16 编辑
海康威视 CVE-2021-36260 分析&利用
本文仅提供安全研究与教学之用,用户将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任
这篇文章只是图个乐,大家看个乐就行
0x0 漏洞说明
- 这个漏洞形成的关键是主程序davinci在处理language标签时出现的逻辑错误,设备的逻辑如下
- 客户端准备一个xml文件,在其中的language标签指定语言信息,然后put给设备
- 设备解析出xml文件中的language标签的内容(这里称之为tag_language)
- 设备从固定路径中尝试加载tag_language文件
- tag_language文件加载失败后,设备使用sprintf+tag_language来构建出解压指令tar zxf %s -C /home/webLib/doc/xml
- tar zxf %s -C /home/webLib/doc/xml中%s指的就是tag_language
- 将$(query_args)设置为tag_language即可实现指令注入:tar zxf $(query_args) -C /home/webLib/doc/xml
- 指令执行完成
0x1 解析tag- 一切始于解析tag_language
- 关键函数sub_55581C的关键代码如下:
image-20211104170522979.png
- 主要负责解析出tag_language
- 然后将tag_language传递给加载器load_language:sub_F0CF0
0x2 判别tag- 先来看一下load_language:sub_F0CF0的上半部分
image-20211104170858644.png
- 尝试加载/home/webLib/doc/xml/{tag_language}
- 文件如果存在就视为加载成功,直接退出函数
- 如果文件不存在就继续指令
0x3 构造指令- 这里就是关键了
- 看一下load_language:sub_F0CF0加载语言的关键代码
image-20211104171119142.png
- 首先构造出language文件压缩包的地址:/dav/{language_tag}.tar.gz
- 然后构造出解压指令:tar zxf /dav/{language_tag}.tar.gz -C /home/webLib/doc/xml
- 当传入language_tag=$(reboot)时,对应的解压指令为tar zxf /dav/$(reboot).tar.gz -C /home/webLib/doc/xml
- 指令执行成功
0x4 利用漏洞原理到这里结束了,这里来收一下尾巴: image-20211104172112306.png
- 这里使用snprintf来构造目标指令
- snprintf设置了最大长度为37
- snprintf的格式化参数/dav/%s.tar.gz已经占用了12字节
- 我们通过$(cmd)的方式来传递language_tag,此时$()回会用三个字节
- 到此为止,cmd能使用的长度为37-12-3=22
- 注入指令的运行目录为/home
- web目录为/home/webLib
- 重定向结果到web目录即可cmd >webLib/r
- 有些设备将/home/webLib挂载为只读,怎么解决这里就不展开了
- 通过分析原理可以发现指令执行的长度不能超过22字节,实际上可以绕过的
- 可以将指令先写到文件中,然后执行文件
- 具体代码这里就不放出来了
- 通过研究发现海康威视设备中使用的busybox精简程度不同
- 有的设备还存在dropbear之类的程序,可以辅助渗透
- 不巧,我这份啥都没有,干干净净的:joy:
image-20211104173309571.png
- 唯一与网络有关的居然是ping
- 话说ping也可以传递数据
发表于:2021/11/04
|
|