近日,國外安全研究人員 Gabor 發表了兩篇關于如何利用基于 NTP (Network Time Protocol)的驗證算法缺陷繞過 WordPress 登陸驗證的文章,這兩篇文章分別介紹了基于 NTP 的驗證算法缺陷以及如何利用該缺陷繞過 WordPress 登陸驗證并給出了 POC 和相關工具。以下內容是對這兩篇文章的匯總介紹。 ;)
關于 NTP 相關的知識,可以在這里進行了解。
現在以 WordPress 的一款插件 Google Authenticator 為例來說明一般的 token 生成程序生成一次性密碼(TOTP)的實現細節。
如下圖所示,程序會使用一個密鑰種子與當前服務器的時間戳進行 TOTP 算法后得出一個 6 位純數字的 Token,該 Token 每 30 秒更換一次,其實這就是我們常見的 “動態口令”。
在這個動態口令生成過程中所存在的問題就在于每次使用相同的密鑰種子和時間戳的組合總會生成一個相同的動態口令。而密鑰種子是個不變量同時在攻擊中不可控,因此只要控制了時間戳那么即可生成任意時間戳所對應的動態口令。
圖 1 :基于 NTP 的 TOTP 算法
從目前來看有很多使用 NTP 的網絡都沒有對 NTP 傳輸過程進行加密驗證。因此,攻擊者就可以修改 NTP 傳輸的數據進行中間人攻擊,給 NTP 客戶端提供一個偽造的時間戳。 Gabor 在文章中提到了幾個早先對 NTP 進行安全研究的文章資料和工具。
結合以上工具以及多種中間人攻擊技術就可以通過 NTP 控制遠程服務器的時鐘。
在 Unix 中設置時間的 ntpd 服務不會接受一個偽造的虛假時間戳,所以無法進行時間戳的偽造攻擊。不過,可以結合 CVE-2015-5300 漏洞進行攻擊。
另外一種設置時間的方法是 ntpdate。這種設置方式非常簡單,也是 Ubuntu Wiki 中推薦的方式。因此,在很多地方都使用了這種方式進行時間設置。你可以參考官方手冊 和 這篇博文進行設置。
設置的方式極其簡單,在 corntab 中運行 ntpdate <hostname>
即可。但是值得注意的是 ntpdate 會接受任何來自于 NTP 服務的數據流!。
幾個有名的開源項目,如 Yocto Project,OpenWRT,Startups,還有托管在 GitHub 上的無數配置腳本,以及 5 萬多 Docker 用戶,甚至包括 VPS 提供商 都使用了 ntpdate 進行時間同步設置。
早在 2002年 就有人提出使用 corntab 運行 ntpdate 不是一個好主意。
通過上述描述,讓我們來總結一下攻擊 NTP 的現有條件:
WordPress 中的插件 Google Authenticator 可以對 WordPress 后臺登錄開啟雙重驗證。如下圖所示:
圖 2 :Google Authenticator 插件對 WordPress 后臺登錄開啟雙重驗證
由于可以利用中間人攻擊設置服務器的時間一直為指定的時間,因此,可以使用暴力破解的手段對動態口令進行破解。大約最多需要一百萬次的破解嘗試。
搭建如下網絡環境:
整個網絡非常簡單,三臺 Ubuntu 虛擬機需要處于同一個子網中。如下圖所示:
圖 3 :搭建攻擊網絡環境
為了模擬中間人攻擊以篡改 NTP 傳輸數據,我們首先需要修改 WordPress 服務器的 /etc/hosts
文件,如下圖所示:
圖 4 :修改 /etc/hosts 文件
其次,我們假設管理員使用計劃任務每隔一分鐘同步一次時間(事實上很多人都是這么做的),如下圖所示:
圖 5 :管理員每隔一分鐘同步一次時間
然后,我們使用預先設置的時間作為參數執行 Delorean ,同時 WordPress 服務器依舊會每隔一分鐘同步一次時間。
圖 6 :使用預先設置的時間作為參數執行 Delorean
現在,我們在另外一臺虛擬機中,也就是攻擊者的機器中運行 WPBiff。設置 WordPress 后臺登錄用戶名和密碼,以及與上圖相同的時間戳作為運行參數。如下圖所示:
圖 7 :運行 WPBiff 開始攻擊
在 WPBiff 運行了 39 分鐘后,成功的爆破出了 6 位純數字動態口令,同時 dump 出了有效的登陸 WordPress 后臺的 session cookies。如下圖所示:
圖 8 :成功爆破出了動態口令
由于插件不允許動態口令的重用,所以可以使用 dump 出來的 session cookies 直接登錄 WordPress 后臺。 在額外的三次測試中,又分別花費了 51分鐘,57分鐘,83分鐘 爆破出了動態口令。
圖 9 :成功登陸 WordPress 后臺