1. 程式人生 > 其它 >看我如何破解OpenNMS雜湊密碼?

看我如何破解OpenNMS雜湊密碼?

背景

在最近的一次滲透測試中,我拿下了一臺執行OpenNMS的伺服器,並獲取了該伺服器的root訪問許可權。在後利用階段我提取了幾個本地使用者的雜湊密碼,我想嘗試破解這些雜湊值因為這些密碼可能會被重複用在其他重要認證上。但對於OpenNMS的雜湊密碼我幾乎一無所知,通過在Google上的一番搜尋也並未發現任何有價值的資源。為此,我決定釋出一款Python工具以幫助那些OpenNMS伺服器的滲透測試者。具初步瞭解這些雜湊密碼是base64編碼的字串,前16個位元組是鹽,剩餘的32個位元組是sha256(salt.password)的100,000次迭代。

百疏一漏

我們發現了一個伺服器當前正執行著一個老舊的OpenNMS版本,而該版本曾被曝出存在一個已知的Java反序列化漏洞。漏洞詳情可以參考FoxGlove Security釋出的這篇文章。

Metasploit模組的利用並不容易。我們將模組指向了埠為1099的RMI介面,將payload設定為linux/x86/shell_reverse_tcp,並給予了以root許可權執行的shell:

OpenNMS被安裝在/opt/opennms中,我通過shell瀏覽了該目錄,並找到了一個定義OpenNMS的本地使用者帳戶的檔案。通過對一些使用者名稱的觀察,我意識到其中一些賬戶很可能是該組織的超級管理員賬戶,這更激起了我的破解慾望。

雜湊被儲存在/opt/opennms/etc/users.xml中,如下所示:

以上XML中被加鹽的這串字元引起了我的注意:

L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn

我首先想到了john和hashcat並查看了它們的幫助頁面,看是否有OpenNMS雜湊模式,但可惜的是並沒有發現任何有用的資訊。然後我又使用Google進行了查詢,仍然沒有找到任何有關OpenNMS雜湊是如何鹽化和/或計算的解釋。因此我決定自己來分析和破解它。

雜湊識別

大多數密碼破解程式都會使用十六進位制來表示雜湊,因此我將XML中的base64值轉換為十六進位制:

接著,我使用了一個基於Python的HASH加密方式識別工具hashID來幫助我進行初步的hash判斷:

從以上結果可以看到這可能是SHA-384加密,但這種加密是非常罕見的,因此我對其準確性持懷疑態度。

明文識別

即便我知道了它正確的雜湊演算法,但我仍然不知道它是如何加的鹽,更不用說它加的鹽是什麼。我首先想到的是,鹽可能被儲存在OpenNMS使用的PostgresQL資料庫中。由於我當前的許可權為root,因此我可以連線資料庫並查看錶資料。經過一番查詢並沒有發現任何與密碼或鹽有關的資料。據此我斷定,它一定被儲存在應用程式的某個位置。

OpenNMS是一個開源的系統,因此我來到了它的Github頁面並搜尋了關鍵字“salt”。我獲取到了一些用於測試的users.xml檔案示例。

通過對原始碼的檢索,我發現了一處雜湊密碼加鹽的斷言測試:

經過對上述測試程式碼中的“rtc”使用者雜湊加鹽計算後我們發現,其結果與我們之前發現的users.xml中的加鹽密碼雜湊值相同。這意味著我們成功獲取到了一個本地使用者的明文密碼。

  • 明文:rtc
  • 加鹽雜湊:L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn

雖然我們仍然無法獲知它是如何加的鹽以及鹽是什麼,但是這為我們提供了一個很好的判斷依據。

雜湊演算法識別

現在讓我們把視線從Github上轉回到我們的root shell。雖說Github上的原始碼為我們提供了一個很好的參考依據,但伺服器上程式碼可能會有所不同。因此,如果在伺服器上找到原始碼會獲得更準確的資訊。

我進入到了opennms目錄,並通過搜尋關鍵字“salt”來定位:

可以看到搜尋出了大量包含”salt”關鍵字的JAR庫檔案,這裡我們尤其關注./lib/jasypt-1.9.0.jar這個檔案。

從他們的官方主頁上我們瞭解到,Jasypt是一個java庫,它允許開發人員不需要深入瞭解加密技術的工作原理,就可以輕鬆的為自己專案新增基本的加密功能。

通過對文件的進一步挖掘,我發現了一個讓我看到有希望的東西:一個名為StrongPasswordEncryptor的類,它使用另一個被稱為StandardStringDigester的類。以下是文件中關於StrongPasswordEncryptor類的簡單描述:

Jasypt同樣是開源的,因此我在Github上找到了這兩個類的原始碼(StrongPasswordEncryptor和StandardStringDigester)。通過StandardStringDigester原始碼中的註釋資訊,我終於弄明白了digest是如何構建的。

至此,我已經獲取到了所有我需要的資訊:

  • 明文: “rtc”
  • Digest: L5j2hiVX4B+LTHnY3Mwq5m5dBZzNdHhiBpvBjyCerBsBqqJcxRUsRAxaDQtjRkcn
  • 鹽長度: 16位元組
  • Digest格式: (salt.password)
  • 演算法:sha256
  • 迭代:100,000

混合計算

現在讓我們來驗證一下演算法,我們需要將鹽的位元組與明文連線,然後計算一個sha256摘要100,000次。我寫了一個Python指令碼來幫助我們驗證明文和密碼:

並用已知的明文進行測試,可以看到10萬次迭代後我們得到了正確的結果!

編寫一個破解器

為了方便大家對opennms雜湊密碼的額破解,我在Github上釋出了一款Python編寫的爆破指令碼。你可以通過以下連結獲取到:

https://github.com/ropnop/opennms_hash_cracker

該指令碼首先會提取users.xml檔案中的雜湊值,然後使用我們提供的字典對雜湊進行爆破。此外,該指令碼也包含了一些邏輯來解析和測試OpenNMS的無鹽雜湊(也就是MD5摘要)。以下是它的執行示例:

雖然這個指令碼的速度和成功率可能都不太理想。但是如果你使用的爆破字典較小或爆破物件使用的是弱密碼,那麼它將非常的有用。如果你懂得程式設計開發,你還可以將這個指令碼移植到hashcat。