本文仅提供安全研究与教学之用,用户将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任

这篇文章只是图个乐,大家看个乐就行

0x0 漏洞说明

  • 官方文档,这几年几乎所有设备都受到影响
  • 这个漏洞形成的关键是主程序(davinci)在处理language标签时出现的逻辑错误,设备的逻辑如下
  1. 客户端准备一个xml文件,在其中的language标签指定语言信息,然后put给设备
  2. 设备解析出xml文件中的language标签的内容(这里称之为tag_language)
  3. 设备从固定路径中尝试加载tag_language文件
  4. tag_language文件加载失败后,设备使用sprintf+tag_language来构建出解压指令tar zxf %s -C /home/webLib/doc/xml
  5. tar zxf %s -C /home/webLib/doc/xml%s指的就是tag_language
  6. $(query_args)设置为tag_language即可实现指令注入:tar zxf $(query_args) -C /home/webLib/doc/xml
  7. 指令执行完成
  • 接下来开始详细讲解

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

  1. 首先构造出language文件压缩包的地址:/dav/{language_tag}.tar.gz
  2. 然后构造出解压指令:tar zxf /dav/{language_tag}.tar.gz -C /home/webLib/doc/xml
  3. 当传入language_tag=$(reboot)时,对应的解压指令为tar zxf /dav/$(reboot).tar.gz -C /home/webLib/doc/xml
  4. 指令执行成功

0x4 利用

漏洞原理到这里结束了,这里来收一下尾巴:

  • 执行的指令长度不能超过22字节,原因如下

image-20211104172112306.png

  1. 这里使用snprintf来构造目标指令
  2. snprintf设置了最大长度为37
  3. snprintf的格式化参数/dav/%s.tar.gz已经占用了12字节
  4. 我们通过$(cmd)的方式来传递language_tag,此时$()回会用三个字节
  5. 到此为止,cmd能使用的长度为37-12-3=22
  • 如何获取返回值
  1. 注入指令的运行目录为/home
  2. web目录为/home/webLib
  3. 重定向结果到web目录即可cmd >webLib/r
  4. 有些设备将/home/webLib挂载为只读,怎么解决这里就不展开了
  • 突破22字节
  1. 通过分析原理可以发现指令执行的长度不能超过22字节,实际上可以绕过的
  2. 可以将指令先写到文件中,然后执行文件
  3. 具体代码这里就不放出来了
  • 关于buxybox
  1. 通过研究发现海康威视设备中使用的busybox精简程度不同
  2. 有的设备还存在dropbear之类的程序,可以辅助渗透
  3. 不巧,我这份啥都没有,干干净净的:joy:

image-20211104173309571.png

  • 唯一与网络有关的居然是ping
  • 话说ping也可以传递数据

发表于:2021/11/04

davinci主程序:

此处内容需要评论回复后(审核通过)方可阅读。

Last modification:June 8, 2022
如果觉得我的文章对你有用,请随意赞赏