標籤:

詳解Linux許可權提升的攻擊與防護

譯文聲明本文是翻譯文章,文章原作者Rashid Feroze,文章來源:payatu.com

原文地址:payatu.com/guide-linux-

什麼是許可權提升?

大多數計算機系統都是為多個用戶而設計的,這些用戶分別具有不同的許可權。所謂許可權,就是用戶被允許執行的操作。常用的許可權包括查看文件、編輯文件和修改系統文件。許可權提升,就是使用戶獲得他們原本不具有的許可權。這些許可權可以用於刪除文件、查看私密信息、安裝有害程序(例如病毒)。要實現許可權提升,通常需要藉助於一個系統漏洞來繞過相應的安全配置,或者是藉助於系統中設計有缺陷的地方。

詳細來說,許可權提升是指利用操作系統或軟體應用程序中的漏洞、設計缺陷或配置疏忽,讓應用或用戶獲得對受保護資源的高級訪問許可權。許可權提升可以直接導致應用程序越過開發者或系統管理員的設定,獲得更高的許可權,並執行未經授權的操作。

根據統計數據,相比於Linux來說,目前大多數企業都擁有更多的Windows客戶端。儘管如此,但如果我們考慮信息安全的整體策略時,就必須將Linux許可權提升攻擊看作一個重要的威脅。並且,企業中最關鍵的基礎設施(比如Web伺服器、資料庫、防火牆等)極有可能運行的是Linux操作系統。一旦這些關鍵設備遭到入侵,那麼有可能嚴重影響企業的正常運作。此外,隨著物聯網(IoT)和嵌入式系統的日漸普及,黑客也逐漸將注意力轉向它們,因此對這些設備進行加固與防護就顯得至關重要。

目標

在這篇文章中,我們將詳細討論基於Linux的系統上可能導致許可權提升攻擊的安全問題,並會講解攻擊者如何藉助已知技術進行遠程主機的許可權提升,同時將告訴大家如何保護我們的系統免受此類攻擊。最後,我們還會根據不同Linux系統環境來講解如何實現許可權提升。

Linux中的許可權模型

Linux系統從UNIX繼承了文件所有權和許可權的概念。設定並檢查文件許可權,是系統防止惡意篡改的一種方式。在UNIX Web伺服器上,存儲在硬碟上的每一個文件和文件夾都有一組與之相關聯的許可權,該許可權表明了允許誰執行文件操作。

在上面兩個屏幕截圖中,我們可以看到文件docker-compose.yml只具有所有者root用戶的只讀訪問許可權。如果有其他用戶試圖讀取該文件,將會被拒絕。當我們以非超級用戶身份嘗試讀取文件時,會出現Permission Denied的錯誤。

考慮到篇幅所限,在這裡,我們將不會深入講解許可權模型的細節。大家只需要理解,普通用戶無權訪問未授予其許可權的所有文件,具體包括讀/寫/執行操作。然而,超級用戶(root)卻可以訪問系統中存在的所有文件。為了改寫重要配置或實現進一步攻擊,首先我們就需要在Linux系統上獲得root許可權。

為什麼我們需要進行許可權提升?

  • 讀/寫任意敏感文件
  • 在重啟後依然保持運行(保證持久性)
  • 可以安插一個永久的後門

用於許可權提升的相關技術

假設我們已經在目標系統上放置了一個Shell。但目前,我們還並沒有root特權,能進行的操作也相當有限。由此,我們可以使用下面的一些技術,在系統上獲得」root」訪問許可權。

1. 內核開發

內核漏洞利用程序藉助於內核漏洞,可以執行具有更高許可權的任意代碼。一次成功的內核漏洞攻擊,通常會使得攻擊者以超級用戶的身份訪問目標系統,大多是通過root命令提示符的方法進行操作。在大多數情況下,提升到Linux系統的root許可權只需要將內核漏洞利用程序下載到目標主機,隨後編譯並執行即可完成。

假設我們可以以非特權用戶的身份運行代碼,下面是內核利用的通用流程

(1) 誘使內核在內核模式下運行我們的有效載荷;

(2) 修改內核數據,例如進程許可權;

(3) 以新許可權啟動一個Shell,並獲取root許可權。

如果想要成功進行內核利用攻擊,就需要下面四個條件:

(1) 易受攻擊的內核;

(2) 存在相應的漏洞;

(3) 擁有將漏洞利用轉移到目標上的能力;

(4) 擁有在目標上執行漏洞利用的能力。

要防範內核漏洞,最簡單的方法是保證及時更新。一旦補丁未進行及時更新,就存在著已知漏洞被黑客利用的風險。如果因某些原因暫時無法打上補丁,管理員可以對目標主機傳輸和執行漏洞利用的能力進行限制。如果管理員能夠阻止Linux文件系統上的漏洞利用導入和執行,那麼內核攻擊漏洞便不再可行。具體來說,管理員應該重點對啟用文件傳輸的程序進行限制或刪除,例如FTP、TFTP、SCP、wget和curl。如果需要用到這些程序,應該對使用的用戶、目錄、應用程序和特定IP地址/域名進行嚴格限制。

臭名昭著的臟牛(DirtyCow)漏洞可在Linux內核3.19.0-3.73.8之間利用。

Linux內核的內存子系統在處理寫時拷貝(Copy-on-Write)時存在條件競爭漏洞,導致可以破壞私有隻讀內存映射。一個低許可權的本地用戶能夠利用此漏洞獲取其他只讀內存映射的寫許可權,有可能進一步導致提權漏洞。這是迄今為止發現的最嚴重的許可權提升漏洞之一,幾乎影響到所有主要的Linux發行版本。

如何利用臟牛漏洞實現攻擊:

$ whoami - 顯示當前用戶是John(非root用戶)。 $ uname -a - 顯示內核版本,我們得知該版本受臟牛漏洞影響。 > 從這裡下載臟牛漏洞的EXP - exploit-db.com/exploits > 編譯並執行。通過編輯/etc/passwd文件,將"root"用戶替換為新用戶"rash"。 $ su rash - 將當前登陸的用戶修改為root許可權的rash。

關於臟牛漏洞的其他利用方法,可以在這裡查看:github.com/dirtycow/dir

針對不同的內核和操作系統,有許多不同的本地許可權提升漏洞可供使用。具體每個漏洞而言,能否使用該漏洞取決於該版本的內核是否易受攻擊。Kail Linux擁有exploit-db漏洞的本地副本,可以用來輕鬆搜索root漏洞。但建議不要在搜索Linux內核漏洞時完全依賴該資料庫。

$ searchsploit Linux Kernel 2.6.24 - 可以向我們展示在Kail Linux中保存的特定Linux內核的所有可用漏洞。

為什麼我們不應該首先考慮許可權提升漏洞?

雖然許可權提升漏洞的利用方式非常簡單,只需要運行漏洞利用程序並獲得root許可權即可,但考慮到如下原因,我們不應該首先考慮這種方式:

(1) 遠程主機可能會崩潰,原因在於許多公開的root漏洞利用程序並不穩定;

(2) 在得到root之後可能會導致崩潰;

(3) 該漏洞利用可能留下痕迹或日誌記錄,並引起運維人員的注意。

因此,建議大家首先嘗試其他方法來獲取root許可權,並將上述方案作為最後的備選。

防範方法:

及時打補丁更新,時刻保持內核的版本最新。

2. 利用正在以root身份運行的服務

著名的EternalBlue和SambaCry攻擊都利用了通常以root身份運行的SMB服務。

只需要一次攻擊,攻擊者就可以獲得遠程代碼執行許可權和本地許可權提升。

因為上述二者組合起來非常致命,因此該漏洞被廣泛用於在全球範圍內傳播勒索軟體。

我們應該使用檢查Web伺服器、郵件伺服器、資料庫伺服器等重要伺服器是否以root身份運行。在很多時候,Web管理員會以root身份運行這些服務,忽視了其可能導致的安全問題。有一些服務是在本地運行的,不會對外暴露,但同樣可以被利用。

$ netstat -antup - 該命令可以顯示所有打開並正在監聽的埠,我們可以通過此命令檢查是否有可以利用的本地服務。

利用以root身份運行的受漏洞影響MySQL來獲取root訪問許可權:MySQL UDF動態庫漏洞利用可以允許我們從MySQL Shell執行任意命令。如果MySQL是以root許可權運行的,那麼這些命令就會以root身份來執行。

$ ps -aux | grep root - 顯示以root用戶身份運行的服務。 > 我們可以用MySQL Shell執行任意命令,這些命令會以root身份來執行。

一些網路管理員的最大失誤,就是運行具有root許可權的網路伺服器。Web應用程序上的一些命令注入漏洞可能導致攻擊者獲得root shell。因此,除非真正需要,我們應該避免以root身份運行任何服務。

此外,對root用戶程序進行二進位利用的風險要比內核利用小得多,原因在於即使服務崩潰,主機也不會崩潰,並且服務可能會自動重啟。

防範方法:

除非真正需要,否則絕不要以root身份運行任何服務,特別是Web、資料庫和文件伺服器。

3. 利用可執行文件SUID

SUID即Set User ID(設置用戶ID),它允許用戶使用指定用戶的許可權來執行文件。例如,Linux中的ping命令通常需要root許可權才能打開原始的網路套接字。如果將ping程序的SUID標記為root用戶,就可以讓低許可權用戶在執行程序時,直接以root許可權執行。

> -rwsr-xr-x- 如果其中的x字元被s替代,則證明設置了相應的SUID。

SUID這個功能如果使用得當,可以有效增強Linux的安全性。然而,管理員在安裝第三方應用程序或進行邏輯配置更改時,可能會在不知不覺中引入危險的SUID配置。

許多系統管理員都不了解應該在哪裡設置SUID位,我們需要特彆強調,管理員不應在任何文件編輯器上設置SUID位,因為這樣可以讓攻擊者覆蓋系統中存在的任何文件。

利用易受攻擊的SUID可執行文件獲取root訪問許可權:

$ find / -perm -u=s -type f 2>/dev/null - 列印設置了SUID位的可執行文件。

![](payatu.com/wp-content/u)

$ ls -la /usr/local/bin/nmap - 確認nmap是否設置了SUID位。

![](payatu.com/wp-content/u)

> Nmap設置了SUID位。很多時候,管理員會為Nmap設置SUID位,以便它可以有效地掃描網路,如果不以root許可權運行,那麼所有的掃描都將失效。 > 然而,在nmap早期版本中有一個功能,可以在交互模式下運行nmap,允許用戶轉到Shell。如果nmap設置了SUID位,它將會以root許可權運行,就可以通過交互模式訪問root Shell。 $ nmap -interactive - 運行nmap交互模式(Interactive Mode)。 $ !sh - 從nmap Shell轉到系統Shell。

防範方法:

不應將SUID位設置為允許轉到Shell的任何程序。

不應該在任何文件編輯器、編譯器、解釋器上設置SUID位,這樣可以讓攻擊者輕鬆讀取、覆蓋系統上存在的任何文件。

4. 利用SUDO許可權/用戶

如果攻擊者不能通過其他技直接獲得root訪問許可權,那麼他可能會嘗試破壞任何擁有SUDO訪問許可權的用戶。一旦攻擊者有權訪問任何SUDO用戶,那麼他基本上就可以使用root許可權執行任何命令。

管理員可能只允許用戶通過SUDO運行一些命令,但絕對不是所有命令,即使是使用這樣的配置,他們也可能會在不知情的情況下引入漏洞,從而導致許可權提升的風險。

其中,一個比較典型的例子是將SUDO許可權分配給find命令,以便另一個用戶可以在系統中搜索特定的文件或日誌。雖然管理員可能不知道find命令包含用於執行命令的參數,但實際上,攻擊者確實可以使用root許可權來執行命令。

利用錯誤配置的SUDO許可權獲取root訪問許可權:

$ sudo -l - 列印允許作為SUDO運行的命令。

我們可以以SUDO運行find、cat和python。這些命令在用SUDO時會以root用戶身份運行。如果我們可以通過這些命令,以某種方式逃逸到Shell,那我們就可以獲得root許可權。

$ sudo find /home -exec sh -i ; - find命令的exec參數可用於任意代碼執行。

> 不要將SUDO許可權賦予任何編程語言編譯器、解釋器和編輯器。 > 這種技術也可以用於vi、more、less、perl、ruby、gdb和其他命令。 $ sudo python -c import pty;pty.spawn("/bin/bash"); - 產生一個Shell。

防範方法:

不要將SUDO許可權授予任何允許逃逸到Shell的程序。

不要將SUDO許可權賦予vi、more、less、perl、ruby、gdb等命令。

5. 利用未正確配置的CRON任務

如果Cron任務配置不當,可能會被利用獲取root許可權。

(1) 任何可寫的Cron任務腳本或二進位文件?

(2) 我們是否可以自己覆蓋寫入Cron文件?

(3) cron.d目錄是否可寫入?

Cron任務常常以root許可權運行。如果我們可以成功篡改Cron任務中定義的任何腳本或二進位文件,我們便可以使用root許可權執行任意代碼。

利用錯誤配置的Cron任務來獲取root1訪問許可權:

$ ls -la /etc/cron.d - 列印cron.d中已經存在的Cron任務。

![](payatu.com/wp-content/u)

$ find / -perm -2 -type f 2>/dev/null - 列印全局可寫入文件。 $ ls -la /usr/local/sbin/cron-logrotate.sh - 確認cron-logrotate.sh是否是全局可寫入的。

> cron-logrotate.sh是全局可寫入的,它由cronjob運行。我們在cron-logrotate.sh中寫入/添加的任何命令都會以root身份執行。 > 我們在/tmp目錄下編寫一個C文件,並對其進行編譯。

> rootme可執行文件會產生一個Shell。 $ ls -la rootme - 說明該文件由用戶SHayslett擁有。

$ echo "chown root:root /tmp/rootme; chmod u+s /tmp/rootme;">/usr/local/sbin/cron-logrotate.sh - 將可執行文件的所有者和分組修改為root,同時也會設置SUID位。 $ ls -la rootme - 在5分鐘後,運行logrotate Cron任務,cron-logrotate.sh會以root許可權執行。 $ ./rootme - 產生一個root Shell。

防範方法:

在Cron任務中定義的任何腳本或二進位文件都不應該是可寫入的。

Cron文件不應被除root之外的任何用戶寫入。

Cron.d目錄不應被除root之外的任何用戶寫入。

6. 在用戶路徑上利用』.』實現利用

如果PATH中帶有』.』,就意味著用戶可以從當前目錄執行二進位文件或腳本。為了變每次都輸入這兩個額外的字元,用戶可能會將』.』添加到他們的PATH中。對於攻擊者來說,這是一個用於許可權提升的不錯方式。

假如Susan是一名管理員,她在她的路徑中添加了』.』,這樣就不必再寫入兩個字元。

路徑中有』.』 – program

路徑中沒有』.』 – ./program

這種情況的原因在於,Linux會首先在PATH中添加』.』,然後在其他地方進行搜索時,會首先在當前目錄中搜索程序。

> 假設另一個用戶rashid知道Susan在她的PATH中加入了.。 > rashid告訴Susan說,ls命令在他的目錄下不起作用。 > rashid在他的目錄中添加一個代碼,該代碼可以更改sudoers文件,使rashid成為管理員。 > rashid將該代碼保存在名為ls的文件中並使其可執行。 > Susan擁有root許可權,她在rashid的主目錄下執行了ls命令。 > 惡意代碼將會代替原來的ls命令,以root許可權執行。 > 在名稱為"ls"的文件中,添加了一行代碼,該代碼將會列印出"Hello World"。

$ PATH=.:${PATH} - 將.添加到PATH變數中。

$ ls - 執行./ls文件,而不是執行list命令。 > 現在,如果root用戶以root許可權執行代碼,我們就可以使用root許可權實現任意代碼執行。

防範方法:

不要將』.』放在你的路徑中。

不同虛擬機環境上的許可權提升方法

目前,我已經編譯了一系列不同的許可權提升方法,並且成功在不同的虛擬機上獲得了root許可權。我們在這裡提供一個整體思路,也就是告訴大家如何在實際場景中使用上述技術。很多時候,可以選擇多種技術在同一台機器上獲得」root」訪問許可權。

  1. Kioptrix 1

    內核漏洞攻擊 – Apache mod_ssl < 2.8.7 OpenSSL – 『OpenFuckV2.c』遠程緩衝區溢出( exploit-db.com/exploits )

    SMB漏洞利用 – Samba(2.2.1a) trans2open緩衝區溢出( exploit-db.com/exploits )
  2. Kioptrix 2

    內核漏洞利用 – Linux Kernel 2.6 < 2.6.19 – 『ip_append_data()』 Ring0許可權提升(1)( exploit-db.com/exploits )
  3. Kioptrix 3

    在文件編輯器上設置SUID位 – 編輯/etc/sudoers文件以獲得SUDO許可權
  4. Kioptrix 4

    內核漏洞利用 – 『Dirty COW』 『PTRACE_POKEDATA』競爭條件許可權提升( exploit-db.com/exploits )

    MySQL漏洞利用 – MySQL 4.x/5.0 (Linux) – 用戶定義函數(UDF)動態庫(2)( exploit-db.com/exploits )

    內核漏洞利用 – 2.4/2.6 sock_sendpage() ring0 Root利用( packetstormsecurity.com )
  5. Kioptrix 5

    內核漏洞利用 – FreeBSD 9.0 – Intel SYSRET內核許可權提升( exploit-db.com/exploits )
  6. SickOS 1.2

    未正確配置的Cron任務 – Chkrootkit 0.49 – 本地許可權提升( exploit-db.com/exploits )
  7. Stapler

    正在運行的受漏洞影響版本Samba – SambaCry利用( rapid7.com/db/modules/e )

    未正確配置的Cron任務 – 全局可寫cron文件

    在.bash_history中找到root密碼

    內核漏洞利用 – Linux Kernel 4.4.x (Ubuntu 16.04) – 『double-fdput()』 bpf(BPF_PROG_LOAD) 許可權提升( exploit-db.com/exploits )
  8. Troll1

    Sudo su得到root許可權
  9. MrRobot

    在nmap上設置SUID位 – 從nmap交互模式轉到Shell
  10. Vulnix

    未正確配置的服務 – root_squash目錄裝載錯誤配置
  11. droopy

    內核漏洞利用 – 『overlayfs』許可權提升( exploit-db.com/exploits )
  12. VulnOsv2

    內核漏洞利用 – 『overlayfs』許可權提升( exploit-db.com/exploits )
  13. Fristileaks

    SUDO許可權賦予一個易受攻擊的二進位文件
  14. LordOfTheRoot

    內核漏洞利用 – 『overlayfs』許可權提升( exploit-db.com/exploits )

重要資源

大家可以參考這些博客文章,以便更好地了解Linux許可權提升的相關知識。

基礎的Linux許可權提升:blog.g0tmi1k.com/2011/0

本地Linux遍歷和許可權提升備忘錄:rebootuser.com/?

黑客入侵Linux第一部分-許可權提升:dankalia.com/tutor/0100

許可權提升:chryzsh.gitbooks.io/pen

以下是遍歷腳本。儘管我們建議手動進行便利,但使用腳本無疑會更為便捷,但運行腳本可能會產生一些誤報。

unix-privesc-check:pentestmonkey.net/tools

Linuxprivchecker(我的最愛):github.com/sleventyelev

LinEnum:github.com/rebootuser/L

參考

dankalia.com/tutor/0100 youtube.com/watch? sans.org/reading-room/w


推薦閱讀:

通過擺弄python scapy模塊 了解網路模型--Get your hands dirty!
沒有 Linux 和開源軟體的世界會變得怎麼樣
為什麼把部分蘋果設備的系統時間調整為1970.1.1,重啟後就會變磚?
何謂後台

TAG:Linux |