當前位置:
首頁 > 最新 > CobaltStrike-用「混淆」繞過Windows防火牆

CobaltStrike-用「混淆」繞過Windows防火牆

對所有紅隊成員來說,在不驚動組織的情況下傳輸載荷是項永恆的挑戰。像所有其他安全方案一樣,Windows防火牆利用CobaltStrike工具後也在檢測通用有效載荷方面效果更明顯了。

在這個例子中,我們將探討用Cobalt Strike生成一個Pwershell,並展示我們如何對其操控,讓其執行繞過Windows10電腦的防火牆。但這還不是從Windows防火牆中隱藏自己載荷最優雅或簡單的方案,只能說是辦法之一,且行之有效。

創建載荷的過程如下:

截屏時間:3月14日16:50:50

這樣就生成了帶有一個Powershell命令的載荷文本

如果在感染者電腦上運行該命令,Windows防火牆會將其視為威脅,發出警告內容。

為了繞過Windows防火牆,我們需要首先理解CobaltStrike生成載荷的原理,然後再更改其中的一些簽名,希望讓Windows防火牆認為是安全的。

首先,顯而易見的是載荷命令的格式是基於64位編碼,或者通過編碼命令Powershell標記看到。

想解碼該命令,我們需要裁掉powershell.exe -nop -w hidden –encodedcommand這部分,保留其它部分。

然後用以下命令解碼其他字元串。

echo 『base64 payload』 | base64 –d

得到的字元串包含了一個64位解碼串,但不能進行解碼和spit out gibberish,因為這個字元串夜視Gzip壓縮,從PowerShell命令的IEX(New-Object IO.StreamReader(New-Object IO.Compression.GzipStream($s[IO.Compression.CompressionMode]::Decompress))).ReadToEnd())部分看是可以看見的。

現在我們需要理解一些命令中是什麼,因為這其實是觸發Windows防火牆的部分。例如:載荷。通過一些谷歌搜索,我發現這個PowerShell腳本正是做這個的:

http://chernodv.blogspot.com.cy/2014/12/powershell-compression-decompression.html

$data = [System.Convert]::FromBase64String(『gzip base64』)

$ms = New-Object System.IO.MemoryStream

$ms.Write($data, 0, $data.Length)

$ms.Seek(0,0) | Out-Null

$sr = New-Object System.IO.StreamReader(New-Object System.IO.Compression.GZipStream($ms, [System.IO.Compression.CompressionMode]::Decompress))

$sr.ReadToEnd() | set-clipboard

這個腳本首先是基於64位解碼字元串,將其解壓,整個代碼就都呈現給我們了。其也會將輸出內容複製到剪切板並粘貼到一個文本文件中,留著備用。

被Windows防火牆檢測出來的$var_code變數承有載荷,我們需要更換一下,以繞過防火牆。

解碼$var_code後是一系列ASCII字元,但完全解碼並不是這裡所需要的。

我們可以通過以下部分進行閱讀:

$readString=[System.Text.Encoding]::ASCII.GetString($enc)

上述內容顯示的是用戶代理和我們攻擊者IP的一些信息。

現在的目標是將目前的載荷取走,並讓其混淆,迷惑Windows防火牆。這種情況最好的工具由Daniel Bohannon開發的Invoke Obfuscation.項目的Github頁面可以在此找到。

開始Invoke-Obfuscation命令的是:

Import-Module .Invoke-Obfuscation.psd1

Invoke-Obfuscation

現在我們需要確定需要混淆的載荷。可以通過以下命令

Set scriptblock 『final_base64payload』

該工具需要我們的腳本(script block),然後問我們如何進行。這種情況下,我選擇了壓縮,然後1。這並不意味著其他選項不行,但我發現這個在寫的時候可以用。Invoke-Obfuscation可以展現其魔法,然後列印出來一個PowerShell命令,這個很可能繞過Windows防火牆。

然後打出來,以及你想保存作為PowerShell腳本的路徑。

Out c:payload.ps1

目前解壓載荷就是這樣。

所以,我們還是需要將「[Byte[]]$var_code = [System.Convert]::FromBase64String」這段內容用從Invoke-Obfuscation中新建的載荷來替換。為了達到這一點,我確定了一個新的變數,我稱其為$evil,只需要將內容從Invoke-Obfuscation中輸出。

重要—在Invoke-Obfuscation的輸出中,你需要清除最後面的部分,因為那是執行命令的命令。我們不需要這個,因為Cobalt Strike模板會為我們做這些。

保存編輯好的腳本,放入到PowerShell中,並執行。在CobaltStrike中,結果應該是一個浮標,如果你用的是@sec_groundzeroAggressor Script,則是一個馬虎的通知。

如果我們用Process Hacker檢查vanilla CS載荷和修改的CS載荷。注意不要改變浮標下劃線的行為。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 MottoIN 的精彩文章:

起底CVE-2018-0825堆溢出緩衝區

TAG:MottoIN |