概述
近日,Unit42安全團隊在Github上公開了自己研發的powershell自動反混淆工具,Star數幾日之間就突破了300,接下來,就來了解下這款神器的用法及原理。
專案地址:https://github.com/pan-unit42/public_tools/tree/master/powershellprofiler

使用方法
工具用法很簡潔,python PowerShellProfiler.py -f <file_name>,若要檢視反混淆過程的話可以加上-d引數進行除錯,下面使用官方給出的惡意指令碼initial_obfusctaed_sample.ps1進行演示,該樣本使用了IEX替換、字串編碼、運算子冗餘、變數重新命名等方式進行混淆。

執行PowerShellProfiler.py後,PowerShellProfiler列印出了每一步反混淆的步驟,反混淆後的指令碼,以及最後的結論:該樣本的惡意分數18.5,高威脅,是個Downloader指令碼,病毒家族為Veil Stream。

工具原理
演示完了PowerShellProfiler.py的使用方法,來看一下工具的原理,主要為4個核心步驟:反混淆目標指令碼 -> 病毒家族檢測 -> 可疑字串掃描 -> 目標指令碼惡意分數統計
除了第一個函式,後三個函式的原理都是通過正規表示式特徵碼匹配,下面重點分析下第一個反混淆的函式unravelContent。

進入該函式後,核心的反混淆函式為normalize(),在反混淆之前,工具會先對字串進行相應的倒序、反編碼、解壓、解密等操作。這次的指令碼initial_obfusctaed_sample.ps1存在frombase64string、decompress等字串,首先會進入decompressContent這個反編碼函式。

該函式首先對指令碼進行base64解密,然後嘗試用各種壓縮方式進行解壓,直到解壓成功為止。

完成以上操作後,工具就呼叫normalize()函式進行反混淆,原理就是即時翻譯powershell常用的混淆運算子、字串,如:
1. 刪除一些無用的運算子:”空格”、”^”、”`”。
2. 轉化Char位元組為ASCII碼。
3. 去掉”+”,連線字串。
4. replace字串。

反混淆前的指令碼如下,存在大量的無用的運算子、char字元,以及一些明顯的-replace替換函式。

進行了normalize()函式反混淆後,得到的指令碼如下,結構已經很清晰了,接下來工具就可以對該指令碼進行特徵碼匹配了,如:downloadstring、Start-Process等可疑字串的提取。

結尾
powershell作為APT攻擊的常用攻擊方式,免殺、混淆的方式千變萬化,光使用該工具無法保證能對所有ps指令碼進行反混淆檢測,我們更應該深入理解ps指令碼的混淆常用方法及原理,才能實時地與這類惡意攻擊樣本進行對抗。