安全圈 | 专注于最新网络信息安全讯息新闻

首页

@傑克遜

作者 lervik 时间 2020-02-27
all

嘿,這是2020年Metasploit CTF中Repository Manager前端web應用程序的一篇文章。雖然這讓一個忙碌的週末把它和生活中的其他事情混在一起,但這是一個和朋友一起建立團隊的好方法。最重要的是我們最終獲得了第三名!恭喜佩佩加,並為贏得第一和第二名向世界自然基金會致歉,為Metasploit團隊在挑戰和基礎設施方面所做的所有努力而歡呼。

這篇文章的結構經過了思考過程,但如果你想切入主題,這裡是(劇透警告…):前端是Nexus的一個版本,很容易被命令執行。在更新功能時,可以在“notes”參數中使用JSON注入來利用它。

偵察

挑戰從880埠的目標框開始,我們展示了一個Ruby on Rails應用程序,它允許我們查看/編輯repo和管理功能。

在粗略瀏覽存儲庫頁面的同時,我希望我們可以加載一個未列出的repo,可能是一個包含標誌的repo,然後能够通過應用程序訪問其內容。唉,由於沒有讀取檔案數據的方法,這並沒有什麼成效。

功能頁面表面上允許用戶閱讀和更新注釋。在更新百勝功能的說明時,我們只會收到一條狀態消息,而其他功能在更新時會返回一個空白狀態。

退一步,我們繪製出web應用允許我們操作的可見攻擊面,假設接下來的步驟將在這個抽象層:

發現

在創建repo時,我的隊友h4ccinnja在處理可供選擇的提供者清單時發現,將提供者從rubygems託管改為rubygems代理將返回一個轉義的HTML頁面,並引發500個錯誤。

rubygems-hosted rubygems-proxy

這個響應使得在後端使用Sonatype Nexus來管理存儲庫變得更加明顯。這很有意思,因為也許有潜在的SSRF。。。如果我們可以在nexushost:8081上査詢任意api或與其他容器通信呢?

nexushost:8081

另一個有趣的是,版本2.14.14-01正在被使用。通過一些蒐索,我們發現此版本易受通過作業系統命令注入驗證的RCE的攻擊。通過使用惡意命令更新Yum功能的createrepoPath或modifyrepoPath内容,可以利用注入向量。更新後,這些屬性值將使用--version參數執行。例如,如果calc.exe作為“惡意”命令提供,則將執行calc.exe--version。我在這裡簡化了一點,但是在兩份HackerOne報告中都有更多的細節:#654888。

createrepoPath modifyrepoPath --version calc.exe calc.exe --version

剝削

當涉及到攻擊時,我們不必擔心身份驗證部分,因為這是在前端與後端通信時假設的。能够修改這些特性被證明是更具挑戰性的。我們最初假設可以將這些内容添加到update_capa請求(如下所示)中,期望響應中的狀態消息將隨著命令的輸出而更新。

update_capa

當我們嘗試上述請求的許多不同變體時,它已經進入了深夜,但它只是不起作用。

隨著我們的進步,人們開始明白為什麼利用大規模分配漏洞的想法行不通。如果這確實是一個大規模分配漏洞,我們應該能够使用上面的請求修改capability對象。進一步研究Nexus API,發現id内容用於引用功能,並且沒有capa_id内容。囙此,我們可能仍在與前端(它忽略了我們的額外輸入)而不是後端互動。

id capa_id

出於想法和充足的睡眠,我開始在update note欄位中粉碎鍵,並看到一些有趣的東西。以下是不光彩的再現:

什麼?錯誤資訊?意外字元“35;”?在那之前。。。雙引號?它期待著後面會有一個逗號。。。用大寫字母“O”分隔對象條目,比如JSON對象?等等,JSON對象。。。它們是否將用戶輸入連接到字串化JSON並將其發送到後端?為什麼會有人這麼做??在現實世界的現代網路應用中,這種情況多久出現一次?哦,這是CTF。

在實現之後,很明顯需要將有效負載放入notes參數中。下麵您可以看到使用字串連接的預期和意外行為的場景:

notes

最小的測試負載如下所示:MyNote1,“properties”:[{“key”:“createrepoPath”,“value”:“/bin/sh-c id | |/createrepo”}],“notes”:“MyNote2”}。以前的嘗試沒有“}尾碼,這仍然會導致注釋被更新為“MyNote2”,但不會設定或執行新的createrepoPath值。我們知道Nexus版本是2.14.14-01,我們知道僅僅提供命令是行不通的,因為這個實例是為CVE-2019-5475而不是為CVE-2019-15588打補丁的。

MyNote1", "properties": [{"key": "createrepoPath", "value": "/bin/sh -c id || /createrepo"}], "notes": "MyNote2"} "}

接下來,我們將基線有效載荷替換為一個用於反向shell的有效載荷,在系統周圍蒐索該標誌,並獲得其MD5。

這是鑽石王牌的旗牌:

這就是全部!謝謝你的閱讀,如果你寫得這麼好,我希望你喜歡。

格瑞茲向小組出口和中央特勤隊全體人員問好。