CVE-2020-16846 CVE-2020-25592 分析

  • A+
所属分类:安全文章

作者:jambolt  编辑:白帽子社区运营团队




    "白帽子社区在线CTF靶场BMZCTF,欢迎各位在这里练习、学习,BMZCTF全身心为网络安全赛手提供优质学习环境,链接(http://www.bmzclub.cn/)

"    





CVE-2020-16846 CVE-2020-25592 分析
漏洞编号:
CVE-2020-16846、CVE-2020-25592

CVE-2020-16846 CVE-2020-25592 分析
受影响版本:
• 3002• 3001.1, 3001.2• 3000.3, 3000.4• 2019.2.5, 2019.2.6• 2018.3.5• 2017.7.4, 2017.7.8• 2016.11.3, 2016.11.6,2016.11.10• 2016.3.4, 2016.3.6,2016.3.8• 2015.8.10, 2015.8.13

CVE-2020-16846 CVE-2020-25592 分析
POC:
POST /run
token=111&client=ssh&tgt=anything&fun=anything&ssh_priv=aaa|touch /tmp/success%3b

CVE-2020-16846 CVE-2020-25592 分析
漏洞分析:
salt源码存在于python lib中。

step 1

salt/netapi/init.py run()
传参示例    Provide a uniform method of accessing the various client interfaces in Salt    in the form of low-data data structures. For example:
>>> client = NetapiClient(__opts__) >>> lowstate = {'client': 'local', 'tgt': '*', 'fun': 'test.ping', 'arg': ''} >>> client.run(lowstate)
CVE-2020-16846 CVE-2020-25592 分析
函数调用前,必须通过4个逻辑验证,除开salt_master服务是否已运行外。
逻辑判定1 client
client参数获取后在可调用函数数组中可进行调用
CVE-2020-16846 CVE-2020-25592 分析

类中的非run和_开头函数,可调用列表

传递的参数low[client]必须为下列中的一个
local_asynclocallocal_subsetlocal_batchsshrunnerrunner_asyncwheelwheel_async
逻辑判定2 token

参数列表中必须有token(POC测试中发现必须为数字型)


 逻辑判定3 raw_shell,netapi_allow_raw_shell

如果获取参数 raw_shell 必须要有 netapi_allow_raw_shell 参数

lowstate = {'raw_shell': '*', 'netapi_allow_raw_shell': '*', ....}

之后根据client 参数进行 函数调用,此处client为ssh

step 2

salt/netapi/init.py run() -> salt/netapi/init.py ssh()CVE-2020-16846 CVE-2020-25592 分析

根据salt/netapi/init.py 初始化获得的参数 初始化 salt.client.ssh.client.SSHClient 类

step 3

salt/netapi/init.py ssh() -> salt/client/ssh/client.py cmd_sync()CVE-2020-16846 CVE-2020-25592 分析

传递获取的low字典中的参数

step 4

salt/client/ssh/client.py cmd_sync() -> salt/client/ssh/client.py cmd()CVE-2020-16846 CVE-2020-25592 分析

必须有的参数是 tgt fun才能完成 _prep_ssh调用

step 5

salt/client/ssh/client.py cmd() -> salt/client/ssh/client.py _prep_ssh()CVE-2020-16846 CVE-2020-25592 分析

参数处理后传递初始化 salt.client.ssh.SSH类

step 6

salt/client/ssh/init.py SSH类 初始化CVE-2020-16846 CVE-2020-25592 分析

逻辑上需要tgt参数 才不调用 self._update_targets() 对于 roster参数有无并无要求 CVE-2020-16846 CVE-2020-25592 分析

ssh_priv 参数获取后且无此文件 则 try salt.client.ssh.shell.gen_key()

step 7

salt/client/ssh/shell.py gen_key() 命令执行点

CVE-2020-16846 CVE-2020-25592 分析
命令注入点 通过ssh_priv 完成命令注入ssh-keygen -P "" -f {ssh_priv} -t rsa -q

POC变种

内联执行 `touch /tmp/success`


往期精彩文章




MISC题解
利用句柄表实现反调试
Chrome浏览器代码执行0 day漏洞通知
虎符ctf  wp




CVE-2020-16846 CVE-2020-25592 分析
技术支持:白帽子社区团队
— 扫码关注我们 



本文始发于微信公众号(白帽子社区):CVE-2020-16846 CVE-2020-25592 分析

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: