您好,登錄后才能下訂單哦!
CVE-2020-7468:FreeBSD ftpd chroot本地提權漏洞的實例分析,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
在今年7月,我們從一位匿名研究員那里收到了FreeBSD中的一個本地權限提升漏洞的相關信息,即一個存在于FreeBSD的文件傳輸協議守護進程(ftpd)中的漏洞。ftpd提供了一個名為ftpchroot的功能,旨在限制經過身份驗證的用戶對文件系統的訪問。這個特性是使用“chroot”系統調用實現的,這是一種通常稱為“chroot jail”的安全技術,chroot jail可以將進程限制在文件系統的受限部分來運行。但是,在該漏洞的幫助下,攻擊者實際上可以利用這種被“囚禁”的狀態來進行各種非法操作,將其權限從受限制的FTP帳戶提升為“root”權限,并允許攻擊者能夠在目標系統上執行任意代碼。此漏洞在FreeBSD FTP守護程序中存在了很長時間,最早可以追溯到FreeBSD 6.3版本。目前,這個漏洞被標記為了CVE-2020-7468/ZDI-20-1431,相關漏洞補丁已于今年9月份正式發布。
這個漏洞存在的根本原因是freebsd/libexec/ftpd/ftpd.c的chroot()函數在進行業務處理時存在設計缺陷。下面給出的是存在漏洞的函數簡化版本:
void pass(char *passwd) { // ... if (guest || dochroot) { // ... /* * Finally, do chroot() */ if (chroot(chrootdir) < 0) { reply(550, "Can't change root."); goto bad; } __FreeBSD_libc_enter_restricted_mode(); } else /* real user w/o chroot */ homedir = pw->pw_dir; // ... if (chdir(homedir) < 0) { if (guest || dochroot) { reply(550, "Can't change to base directory."); goto bad; } else { // ... } // ... bad: /* Forget all about it... */ #ifdef LOGIN_CAP login_close(lc); #endif if (residue) free(residue); end_login(); }
如果 FTP 用戶試圖登錄并被配置為限制在/etc/ftpchroot中的chroot jail,那么ftpd將調用chroot和chdir系統調用)。如果chdir系統調用失敗,則代碼將跳轉到標簽bad處。在這種情況下,ftpd仍然會等待新的登錄,但連接已鎖定在chroot jail內。此時,將導致連接上的下次登錄嘗試會引發錯誤行為。
為了強制chdir系統調用在登錄過程中失效,攻擊者可使用命令 chmod 0 在主目錄上更改權限。另外,攻擊者將會上傳和主頁目錄相關的文件“etc/spwd.db”。該文件是修改過的常規 FreeBSD 系統(包含root用戶的已知密碼)的密碼數據庫。chdir調用失敗后,ftpd會被鎖定在chroot jail中,以便所有后續的文件系統訪問都會跟用戶主目錄相關,而不是真實的文件系統root路徑。這樣一來,當對后續登錄進行認證時,ftpd讀取攻擊者的spwd.db而不是存儲在文件系統真實root目錄下的/etc/spwd.db。此時,攻擊者就可以通過已知密碼以root身份進行登錄了。
下一步,攻擊者需要上傳/etc/pam.d/ftpd和/usr/lib/pam_opie.so.5。第一個文件可以讓ftpd在登錄過程中加載多個動態庫,其中就包括這第二個文件。第二個文件旨在通過已獲得的root權限來突破chroot jail并執行反向Shell。接下來,攻擊者就能夠以root權限來執行任意代碼了。
通過受限的 FTP 賬戶登錄。
上傳包含已知root密碼的etc/spwd.db。
執行“chmod 0”。
再次以受限的 FTP 賬戶登錄。在登錄過程中,chdir執行失敗,導致ftpd進程在chroot jail中被鎖定。
通過已知密碼以 root 身份登錄。
上傳/etc/pam.d/ftpd和/usr/lib/pam_opie.so.5,后者包含一個反向Shell。
再次以受限 FTP 賬戶身份登錄。和之前一樣,chdir執行失敗,導致ftpd進程在chroot jail中被鎖定。
通過已知密碼以 root 身份登錄。ftpd執行該反向Shell。
為解決這個問題,FreeBSD對其功能實現代碼進行了修改,如果chdir系統調用失敗的話,則ftpd將會立刻斷開連接:
void fatalerror(char *s) { reply(451, "Error in server: %s", s); reply(221, "Closing connection due to server error."); dologout(0); /* NOTREACHED */ } void pass(char *passwd) { // ... if (chdir(homedir) < 0) { if (guest || dochroot) { fatalerror("Can't change to base directory."); } else { //... }
這個漏洞是一個邏輯提權漏洞,因此它的穩定性非常強,這個漏洞跟九月份發布的FreeBSD 內核提權漏洞(CVE-2020-7460)也是不一樣的。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。