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載荷。注意不要改變浮標下劃線的行為。
TAG:MottoIN |