EncodedCommandによるPowerShell攻撃を暴く

By

Category: Unit 42

Tags: ,

This post is also available in: English (英語)

概要

PowerShellは過去数年間で人気を獲得し続けていますが、それはこのフレームワークが発達し続けているからです。したがって、PowerShellを多くの攻撃で見かけるようになっていても少しも驚くことではありません。PowerShellはシステム上の広範囲にわたる機能を攻撃者にネイティブなものとして提供します。有害なPowerShellツールが溢れかえっている現状をざっと見渡してみると、PowerShellの伸びを示す十分な兆候が見て取れます。

Microsoftは、PowerShellの活動(Transcription、ScriptBlockなど)のログを取る複数の方法を提供することにより、PowerShellの新しい方のバージョンにおいて素晴らしいことをしてくれました。したがって、実行時に難読化をさらに行おうとする変化が起きています。

舞台左手からPowerShellの「-EncodedCommand」パラメータが登場!

上記のPowerShellのヘルプ表示から分かるように、これは、そのままだったらコマンドラインで問題が発生する可能性のある複雑な文字列を受け取り、PowerShellが実行できるようラップすることを目的とするコマンドです。うるさい視線からコマンドの「有害な」部分を隠すことで、防御側に警告を与える可能性のある文字列を防止することができます。

このブログ記事の目的は2つあります。まず、「分析の概要」では、Palo Alto NetworksのAutoFocus内で特定された最近のサンプル4,100個を分析します。これらのサンプルは、このEncodedCommand手法を採用していますので、分析ではPowerShellがどのように使われていて、どのような手法がPowerShellによる攻撃に関してネット上で使われているのかを調べます。2番目の目的は、このブログ記事により、PowerShellのコードを分類整理することです。その際には、デコード済みの各サンプルの例を付します。これは将来の特定作業やリサーチに役立たせるためです。

分析の概要

この分析を行うため、まず、この手法を使っているサンプルを特定する必要がありました。しかし、PowerShellが柔軟性に富んでいるため、パラメータ呼び出しが様々な場合、サンプルを特定することは思うほどそう単純ではありません。

下記はEncodedCommandパラメータ呼び出しが可能な様々な方法に関する3つの例です。

  1. 綴りを略さずに完全に書く:
    powershell.exe –EncodedCommand ZQBjAGgAbwAgACIARABvAHIAbwB0AGgAeQAiAA==
  2. 大文字小文字を変更して綴りを短くする:
    powershell.exe –eNco ZQBjAGgAbwAgACIAVwBpAHoAYQByAGQAIgA=
  3. カレット「^」をエスケープ文字として割り込ませて、文字列を分割する:
    powershell.exe –^e^C^ ZQBjAGgAbwAgACIAVwBpAHQAYwBoACIA

これらの方法の組み合せを使えば、「EncodedCommand」パラメータに関するだけでも優に100,000を超えるバリエーションの可能性があります。それを念頭において、下記の正規表現を思いつきました。これは可能性のある亜種のかなりの範囲をカバーし、動的分析レポートの巨大なコーパスに対して容易に適用できました。

これは、さらに分析を進めることを目的として、以下のような行を大規模に抽出することを考慮しています

さて、驚くほどのことではないのですが、エンコード済みデータの大部分が、テンプレートおよび公開されているツールから生成されていることは明らかです。攻撃者はシェルコードを実行して別の有害なファイルをダウンロードをする必要があるとき、その都度、既にあるものをわざわざ作り直すことなどしないからです。このことは、土台となっているコードがほとんど同一であり、ダウンロード場所などが少しだけ調整されているのにすぎない、という事実から分かります。次に、データ分析を行うため、コードを識別し、何がそのコードを生成しているか見極める必要がありました。あるいは、少なくとも、コードの集団を類別する必要がありました。

プロファイリングによるアプローチ

これに伴う困難な点をいくつか例示するため、Matthew Graeber氏が2012年に公開した過去のブログ記事を見てみましょう。記事には、シェルコードをメモリにロードして実行することのできるPowerShellスクリプトが寄せ集められていました。このスクリプトは、この手法に関する基礎テンプレートとなったもので、この機能を利用しようとする公開ツールの大部分で使われています。

以下の2つは、TrustedSecのツールであるSocial-Engineer Toolkit (SET)およびMagic Unicornに由来する手法をそのまま使ったものです。2つのサンプルを比較してみると、初期化済み変数として、SETが「$c」を使っているのに対し、Magic Unicornは「$nLR」を使っています。同様に、SETでの「$size」変数はMagic Unicornでは「$g」であり、「$sc」変数は「$z」、そして最後に、「$x」変数は「$kuss」となっています。

SET

Magic Unicorn

Magic Unicornでは、生成用スクリプト内部に、一部の変数をランダム化する行が含まれています。下記の抜粋は、その動作内容を示したものです。

これは、ランダムな英数字から構成される3文字から4文字の文字列で、一部の変数を単純に置き換えるものです。しかし、すべての変数が置き換えられているわけではないので、このランダム文字列を既知のHTMLアンカーと組み合わせることで、これがどのように生成されたのか仮説を立てることができます。あるいは、まさにこのコードが、Magic Unicornスクリプトのランダム化処理の部分を使わずに別のツールにコピーされているような場合も分かります。なぜなら、変数は変更されていないからです。つまり、ランダム化処理を別途加える際の土台になっていたからです。

これは厳密な科学ではありません。長年にわたり、大勢の様々な人によって、はなはだしく再利用されてきたコードを扱う場合、コードがプロファイリングに適していないという事態にいずれ遭遇することになります。分析はできるかぎり正確に行おうとしましたが、ひと言気を付けていただきたいことがあります。この分析全体を通して、具体的な名称は話半分に受け止めてください。なぜなら、人がコードを自分のツール内にコピーアンドペーストするのを阻止することはできないからです。

全体で、公開されているツールまたは機能に関して、27個の集団について特徴の概要をまとめました。他と区別するための一意の識別子を付けてあります。後ほど、各亜種を分類する際、それぞれについて見ていくことにしますが、今は、下記の表をご覧ください。亜種の分類、マッチしたサンプルの個数、サンプル セットにおいてその分類が占める全体の割合が示されています。

 

亜種 カウント 合計の%
Downloader DFSP 1,373 33.49%
Shellcode Inject 1,147 27.98%
Unicorn 611 14.90%
PowerShell Empire 293 7.15%
SET 199 4.85%
不明 104 2.54%
Powerfun Reverse 100 2.44%
Downloader DFSP 2X 81 1.98%
Downloader DFSP DPL 24 0.59%
Downloader IEXDS 19 0.46%
PowerWorm 19 0.46%
Unicorn Modified 14 0.34%
Scheduled Task COM 11 0.27%
BITSTransfer 11 0.27%
VB Task 10 0.24%
TXT C2 10 0.24%
Downloader Proxy 9 0.22%
AMSI Bypass 8 0.20%
Veil Stream 7 0.17%
Meterpreter RHTTP 6 0.15%
DynAmite Launcher 6 0.15%
Downloader Kraken 5 0.12%
AppLocker Bypass 4 0.10%
PowerSploit GTS 3 0.07%
Powerfun Bind 2 0.05%
Remove AV 2 0.05%
DynAmite KL 1 0.02%

 

分析対象となったサンプルの半数以上が、一般的な「DownloadFile-StartProcess」手法か、以前ご紹介したシェルコード インジェクション手法の亜種のいずれかを利用していました。

一般的な配信/統計

4,100個のサンプル全体にわたり、下記の4つのファイル フォーマットが確認されました。

ファイル フォーマット カウント 合計の%
“exe” 2,154 52.54%
“doc” 1,717 41.88%
“xls” 228 5.56%
“dll” 1 0.02%

 

EXEフォーマットおよびDOCフォーマットは、このサンプル セット全体にわたって使われている拡張子の大部分を占めています。DOCファイルについて詳しく見てみると、その77%に当たる1,326個が「Downloader DFSP」亜種にマッチしました。これは、以下に示すDownloadFile-StartProcess方式を採用する汎用ダウンローダーを定義するものです。

そこから割り出すと、1,159のDOCファイル(87%)がCerberランサムウェアの既知のパターンに一致します。これは、この手法でPowerShellを起動するマクロを作成する悪意のあるMicrosoft Word文書を生成するために、テンプレートとしてツールが使用されていることを意味しています。

DOCサンプルの基本的な配信方法はSMTP/POP3で、電子メール攻撃活動を介し、悪意のあるMicrosoft Word文書を使用してランサムウェアを配信している現状と合致しています。

図1 悪意のあるPowershell Word文書を配信するために使用されたアプリケーション
図1 悪意のあるPowershell Word文書を配信するために使用されたアプリケーション

標的とされている業界を見ると、高等教育機関、ハイテク、専門および法的サービス、医療機関にほぼ均等に分布していることもわかります。

図2 悪意のあるPowershell Word文書が検出された業界の内訳
図2 悪意のあるPowershell Word文書が検出された業界の内訳

経時的な分布を見ると、ここでもピーク数と、電子メール攻撃活動の標準動作手順の時期が合致していることがわかります。

図3 過去12か月にAutoFocusで検出された悪意のあるPowershell Word文書
図3 過去12か月にAutoFocusで検出された悪意のあるPowershell Word文書

EXEサンプルの分類方法を見ると、グループまたはマルウェアファミリに関して特に目立って優勢なものはありませんが、大変興味深いことに、ハイテク業界の会社を標的にすることを好んでいるようです。

図4 Powershellを使用した悪意のある実行可能ファイルが検出された業界の内訳
図4 Powershellを使用した悪意のある実行可能ファイルが検出された業界の内訳

経時的な分布をDOCサンプルの経時的な分布と比較してもほぼ同様です。

図5 過去12か月にAutoFocusで検出された悪意のあるPowershellを使用した実行可能ファイルの数
図5 過去12か月にAutoFocusで検出された悪意のあるPowershellを使用した実行可能ファイルの数

これについて考えられる原因は、亜種が配信されたということです。たとえば、DOCサンプルは主に電子メールの添付ファイルとして検出されましたが、EXEサンプルは通常Webブラウジングを通じて配信されていました。

コマンド自体を掘り下げる前に最後に取り上げる項目は、EncodedCommand手法を使用して検出された1つのDLLファイルです。このDLLには、エクスポートは含まれておらず、単に、DLLMainエントリ ポイントで呼び出された時点でPowerShell Empireステージャを起動します。ステージャがWebサイトからXORスクリプトをダウンロードし、その後、PowerShellのInvoke-Expressionコマンドレットを使用してダウンロードしたスクリプトを実行します。このサンプルは、2016年10月にSymantecがブログに投稿したOdinaffファミリに関連していました。

分析前のデータ/統計情報

base64エンコードされたデータを調べる前に、各プロセスがどのように起動されたかを調べました。この頻度分析と検査から、EncodedCommandとともにどの追加パラメータが使用されているかについていくつかの洞察が得られました。

EncodedCommand: (4,100個のサンプル – 100%のカバー率)

実行用に、PowerShellへbase64エンコードされた文字列を渡すために使用されます。

フラグ 件数 合計に占める割合(%)
“-enc” 3,407 83.29%
“-Enc” 412 10.05%
“-EncodedCommand” 229 5.59%
“-encodedcommand” 40 0.98%
“-encodedCommand” 7 0.17%
“-ec” 3 0.07%
“-en” 1 0.02%
“-ENC” 1 0.02%

WindowStyle Hidden: (2,083個のサンプル – 50.8%のカバー率)

コードを実行する際のPowerShellによるウィンドウの表示を阻止するために使用されます。「-window hidden」が最もよく使用されている亜種であるのは、前述のCerberを配信するMicrosoft Word文書が使用しているPowerShellコマンドに起因しています。

フラグ 件数 合計に占める割合(%)
“-window hidden” 1,267 30.90%
“-W Hidden” 315 7.68%
“-w hidden” 159 3.88%
“-windowstyle hidden” 125 3.05%
“-win hidden” 67 1.63%
“-WindowStyle Hidden” 45 1.10%
“-win Hidden” 42 1.02%
“-wind hidden” 40 0.98%
“-WindowStyle hidden” 5 0.12%
“-WindowStyle hiddeN” 5 0.12%
“-windows hidden” 4 0.10%
“-Win Hidden” 3 0.07%
“-win hid” 2 0.05%
“-Window hidden” 2 0.05%
“-Wind Hidden” 1 0.02%
“-Win hidden” 1 0.02%

NonInteractive: (1,405個のサンプル – 42.4%のカバー率)

ユーザー向けのインタラクティブ プロンプトの作成を阻止するために使用されます。WindowStyle Hiddenと組み合わせて使用し、実行の兆候を隠します。「-noni」亜種の場合、76%が汎用のシェルコード インジェクション コードとSETでしたが、「-NonI」はPowerShell Empireでした。

フラグ 件数 合計に占める割合(%)
“-noni” 1,042 25.41%
“-NonI” 331 8.07%
“-noninteractive” 27 0.66%
“-NonInteractive” 4 0.10%
“-nonI” 1 0.02%

NoProfile: (1,350個のサンプル – 32.9%のカバー率)

PowerShellが起動時に実行されるプロファイル スクリプトをロードするのを阻止します。つまり、潜在的に不要なコマンドまたは設定を回避します。NonInteractiveの内訳と同様に、「-nop」は主にSETと汎用のシェルコード インジェクションで、「-NoP」はPowerShell Empireです。

フラグ 件数 合計に占める割合(%)
“-nop” 955 23.29%
“-NoP” 332 8.10%
“-noprofile” 57 1.39%
“-NoProfile” 5 0.12%
“-noP” 1 0.02%

ExecutionPolicy ByPass: (453個のサンプル – 11%のカバー率)

デフォルトのPowerShellスクリプト実行ポリシー(Restricted)をバイパスし、スクリプトの実行やプロンプトの作成をブロックしないようにします。特に興味深いのは、EncodedCommandパラメータ内で実行されたコードが実行ポリシーに適用されない点です。

フラグ 件数 合計に占める割合(%)
“-ep bypass” 128 3.12%
“-exec bypass” 80 1.95%
“-executionpolicy bypass” 78 1.90%
“-Exec Bypass” 73 1.78%
“-ExecutionPolicy ByPass” 42 1.02%
“-ExecutionPolicy bypass” 26 0.63%
“-Exec ByPass” 9 0.22%
“-ExecutionPolicy Bypass” 5 0.12%
“-ExecuTionPolicy ByPasS” 4 0.10%
“-exe byPass” 2 0.05%
“-ep Bypass” 2 0.05%
“-ExecutionPolicy BypasS” 2 0.05%
“-Exe ByPass” 2 0.05%

Sta: (219個のサンプル – 5.3%のカバー率)

シングルスレッド アパートメントを使用します(PowerShell 3.0以降のデフォルト)。このパラメータはほとんどPowerShell Empireで使用されていました。

フラグ 件数 合計に占める割合(%)
“-sta”  219  5.34%

NoExit: (23個のサンプル – 0.5%のカバー率)

起動コマンドの実行後はPowerShellの終了を阻止します。これはPowerWormマルウェアによってのみ使用され、EncodedCommandとともに使用された唯一のパラメータでした。

フラグ 件数 合計に占める割合(%)
“-noexit”  23  0.56%

ExecutionPolicy Hidden (5個のサンプル – 0.12%のカバー率)

PowerShellはこれを単に無視するため、これは実際には有効なポリシーではありません。すべての使用は、私が「TXT C2」とラベル付けしたスクリプトに関連しています。このスクリプトは、PowerWormに似た別のPowerShellスクリプトを含むDNS TXTレコードのロードを試みます。攻撃者はたいがい、彼らのコマンドの後方にすでに「-w hidden」がある場合は、ここでByPassを使用しています。

フラグ 件数 合計に占める割合(%)
“-ep hidden”  5  0.12%

NoLogo: (33個のサンプル – 0.8%のカバー率)

PowerShellの起動時に著作権バナーを非表示にします。

フラグ 件数 合計に占める割合(%)
“-Nol” 10 0.24%
“-NoL” 10 0.24%
“-nologo” 9 0.22%
“-nol” 4 0.10%

ExecutionPolicy Unrestricted (1個のサンプル – 0.02%のカバー率)

ByPassに似ていますが、インターネットからダウンロードされた未署名のスクリプトを実行する前に、ユーザーに警告します。このパラメータを使用した基礎となる孤立したスクリプトが、インターネットからダウンロードしたスクリプトの実行を試み、その際に警告を生成します。

フラグ 件数 合計に占める割合(%)
“-ExecutionPolicy Unrestricted”  1  0.02%

Command (1個のサンプル – 0.02%のカバー率)

PowerShellプロンプトで入力されたかのように、パラメータに従ってコマンドを実行します。これは1つのインスタンスのみが検出されました。署名ベースの検出の回避に関するブログで取り上げたFireEyeというマルウェアの一部に直接関連していました。PowerShellコードはDOCMファイルの「Comments(コメント)」フィールドに含まれ、Microsoft Word文書内のマクロから起動されました。以下は、複数のコマンドを連鎖させ、FTP転送とそれ以降のNetCat接続を実行する問題となっているコードです。

フラグ 件数 合計に占める割合(%)
“-c”  1  0.02%

最後に、このサンプル セット全体を通じて検出されたトップ10の組み合わせにざっと目を通して、パラメータ分析を締めくくります。

フラグの組み合わせ 件数 合計に占める割合(%)
“-window hidden -enc” 1,242 30.29%
“-enc” 986 24.04%
“-nop -noni -enc” 736 17.95%
“-NoP -sta -NonI -W Hidden -Enc” 206 5.02%
“-EncodedCommand” 169 4.12%
“-ep bypass -noni -w hidden -enc” 102 2.48%
“-NoP -NonI -W Hidden -Enc” 60 1.46%
“-nop  -win hidden -noni -enc” 57 1.39%
“-executionpolicy bypass -windowstyle hidden -enc” 51 1.24%
“-nop -exec bypass -win Hidden -noni -enc” 41 1.00%

変更を考慮した場合でも、結果ではカテゴリごとにいくつかのサンプルが増えただけです。

識別のために一意の署名を試して特定する調査を実施している間に、以下の複数の例を見つけました。これらは、作成者がより新しいバージョンのツールに合わせてパタメータを変更したコードです。

図6 作成者がツールのバージョン間でパラメータを変更したコード
図6 作成者がツールのバージョン間でパラメータを変更したコード

これによって、これらのファミリ全体の集計数が減りますが、合計に大きな影響はないと確信しています。ツールをレビューしたところ、攻撃者はさらに攻撃を隠すためのパラメータの動的な順序付けや潜在的に動的なパラメータ長の調整はあまり重視していません。代わりに、基本的な大文字変換のランダム化を追加し、コードの「本質」を重視しています。これによって、PowerShellコマンドが起動される方法のみに基づくローファイ(低忠実度)プロファイリングが可能になります。

さらに、すべての組み合わせの72%を占めるトップ3の組み合わせは、ほとんど単純で、攻撃をユーザーからさらに隠すための巧妙な試みとは対照的に、コードを実行することのみに重点を置いています。

分析後のデータ/統計情報

次に、識別された各亜種を調べ、それらの機能を確認します。ダウンロードしたファイルまたはスクリプトのそれぞれに対して、観察されたIP/ドメイン/URL(このブログの最後に掲載)を含めます。これらの一部は悪意のある場合もあれば、侵入テスターの場合もあり、新しい手法のランダムなテストを実施している人々の場合もあります。残念ながら、通常は大量分析を実施する場合の意図を推測することはできませんが、読者にはそれらに応じて使用できるデータが提供されます。

ダウンローダー

PowerShellコードの主な目的が、セカンダリ ペイロードのダウンロードと実行、またはリモートで取得したPowerShellコードの実行であることは明らかです。

ダウンローダーDFSP (1,373個のサンプル – 33.49%のカバー率)

これは、ファイルをダウンロードし実行するためにPowerShellを使用している典型的な例です。Googleでファイルのダウンロードおよび実行方法を検索すると得られる、基本的で文字通りの結果です。そのため、真のペイロードのシンプルなダウンローダーとして動作する、base64エンコードされたデータの汎用分類として、以下のテンプレートを使用しています。

以前に指摘したとおり、このカテゴリに一致するほとんどすべての検出が、Cerberをダウンロードするためのマクロを介してこのPowerShellコマンドを起動するMicrosoft Word文書にリンクされていました。このサンプルで観察された独自のパターンの1つは、それらのURIパターンに加え、環境変数を使用していることでした。

Cerber用ダウンローダー –

PowerShell Empire (293個のサンプル – 7.15%のカバー率)

この場合、サンプルはPowerShell EmpireのEncryptedScriptDropperを使用して、スクリプトをリモートでダウンロードし、埋め込まれたXORキーでそれを復号化しています。

この例では、XORキーは「0192023a7bbd73250516f069df18b500」で、取得されたスクリプト(そのキーで復号化されたもの)はPowerShell Empireエージェント ステージャ スクリプトです。これは、C2サーバへシステム情報をPOSTし、その後、暗号化されたステージ1 Empireペイロードをダウンロードします。

ダウンローダーDFSP 2X (81個のサンプル – 1.98%のカバー率)

これは前出のダウンローダーと同じですが、ダウンロードを行うために別のPowerShellインスタンスを起動します。これらも同様に、すべてCerberダウンローダー文書にリンクされていました。

ダウンローダーDFSP DPL (24個のサンプル – 0.59%のカバー率)

DownloadFile -> Start-Process手法を使用しているもう1つのダウンローダーで、サンプル セット内には異なる2つの亜種がありました。これらのサンプルの多くはBartalexに関連する動作に一致していたため、このよく知られたOfficeマクロ ジェネレータに変更が加えられたことを示唆している可能性があります。

未短縮 –

短縮形 –

ダウンローダーIEXDS (19個のサンプル – 0.46%のカバー率)

これは、PowerShellのスクリプトをダウンロードおよび実行する方法を検索すると頻繁にポップアップされる別の独特なスタイルのダウンローダーです。効果的に、コードは単にリモートでPowerShellスクリプトをダウンロードし、それをInvoke-Expressionで実行します。結果のペイロードは、互いにまったく異なっている場合があり、関連はないようでした。

以下の2つのサンプルは、「Invoke-TwitterBot」スクリプト、つまり、「ShmooCon IXでリリースされたTwitterアカウントによって制御されているトロイの木馬ボット」をダウンロードします。

BITSTransfer (11個のサンプル – 0.27%のカバー率)

PowerShellを介してマルウェアをダウンロードする別のメカニズムは、BitsTransferモジュールを使用したものです。バックグラウンド インテリジェント転送サービス(BITS)はマルウェアのダウンロードではそれほど頻繁には目にしませんが、HTTPなどの他の既知の転送サービスと同様の機能を提供しています。この異なる方法を使用すると、攻撃者は特定の監視を回避し、BITSが他の帯域幅使用に影響しないように転送を抑制するという事実を利用できます。

以前のブログで、一時期BITSを使用しているCerberダウンローダーの亜種が検出され、これらの11個のサンプルのうち10個がCerberにつながるMicrosoft Word文書であったことを述べました。

TXT C2 (10個のサンプル – 0.24%のカバー率)

この場合、攻撃者はPowerShellを使用して、ドメインのTXTレコードに対するDNSクエリを作成します。TXTレコードには、別のPowerShellスクリプトが含まれており、このスクリプトはその後、実行するためにInvoke-Expressionに渡されます。

返されるスクリプトを見ると、この初期ルックアップの発生後、それ自体を不変ループに設定しています。このループでは、ドメインのTXTレコードをクエリし、その後base64デコードして結果を実行するという動作が継続されます。

これによって、攻撃者は、侵害したシステムとやり取りする準備が整った時点で、コマンド アンド コントロール チャネルを確立できます。

MicrosoftのJohn Lambert氏が、最近この亜種についてツィートし、侵入テスト時に使用されているものとして特定しました。その手法の別の例が、侵入テスト用のNishangフレームワークで見つかることがあります。

ダウンローダーProxy (9個のサンプル – 0.22%のカバー率)

この亜種は、PowerShellコマンドを実行しているユーザーの設定済みのプロキシと認証情報を明示的に使用します。これの注目すべき点は、ユーザー名を値としてWebリクエストの「u」パラメータに渡していることです。これは一般の「チェックイン」アクティビティであるため、攻撃者は感染相手を把握しています。それ以降のやり取りする方法をさらに操作するために使用できます(たとえば、既知のサンドボックス ユーザー名の場合はさらなる接続をブロックする)。

Meterpreter RHTTP (6個のサンプル – 0.15%のカバー率)

この手法は、PowerShell EmpireやPowerSploitなどのツールで使用されたInvoke-Shellcodeスクリプトを取得し、その後、リバースHTTPS Meterpreterシェルを生成するための関数を呼び出します。

1個を除きすべてのサンプルが、正式なリポジトリを通じて直接、または分岐したバージョンを通じて、GitHubからコードを取得しています。

GitHub –

GitHub以外 –

ダウンローダーKraken (5個のサンプル – 0.12%のカバー率)

私はこれを「Kraken」と呼んでいますが、単に、それがダウンロードされる実行可能ファイルの名前(「Kraken.jpg」)だからです。ただし、これはダウンローダーDFSPで見られるものと類似のダウンロード手法を使用しています。相違の1つは、「$env」変数を直接使用する代わりに、System.IO.Pathを使用して、$TEMPディレクトリのパスを取得している点です。

AppLocker Bypass (4個のサンプル – 0.12%のカバー率)

この手法は、PowerShellを使用して、regsvr32ツールを実行し、Microsoft Windows AppLockerをバイパスしています。この手法は、Casey Smith氏 (@subTee)によって発見され、regsvr32を介してCOMオブジェクトを登録解除するとスクリプトが実行されるという事実を悪用しています。

埋め込まれているペイロード

PowerShellコードの主な目的は、シェルコードなどの埋め込まれているペイロードを起動することです。

Shellcode Inject (1,147個のサンプル – 27.98%のカバー率)

Unicorn (611個のサンプル – 14.90%のカバー率)

SET (199個のサンプル – 4.85%のカバー率)

Unicorn Modified (14個のサンプル – 0.34%のカバー率)

私は、すでに、シェルコード インジェクション手法のSETおよびMagic Unicornの実装例を示したときに、このシェルコード インジェクション テンプレートを使用するすべての亜種を一塊にまとめることを決めました。以下は、「Shellcode Inject」亜種からのサンプルで、Matt Graeber氏の元の投稿をコピーしたものです。SETコードとMagic Unicornコードの類似点がすぐにわかるはずです。

Cerberダウンローダーは、Microsoft Word文書で見つかったEncodedCommandの大半を占めていますが、これらの4つの亜種は、EXEファイルから起動されたほぼ全体を占めるものと同じ手法を使用しています。

コードの骨子は次のとおりです。それらは以下の順序でDLLから関数をインポートします。

“kernel32.dll” VirtualAlloc

“kernel32.dll” CreateThread

“msvcrt.dll” memset

その後、「0x」16進表記を使用してシェルコードをバイトの配列にロードします。次に、VirtualAllocを呼び出して、RWXメモリの4,096バイト以上のページを割り当て、memsetでバイト配列をメモリにコピーし、最後に、CreateThreadでシェルコードに実行を移します。

1,971件のサンプルのうち、1,211件のユニークなシェルコードのペイロードがありました。これは、そのうちの50%以上がその他の攻撃でも再利用されたことを示しています。これらのツールのほとんどはMetasploitを利用してシェルコードを生成し、ペイロードの指定を行えない場合は、リバースMeterpreterシェルを通常は活用しています。たとえば、下記の行はMagic Unicornのコードで、MSFペイロードの指定方法を示しています。

以下は、プラットフォーム、アーキテクチャ、エンコーディングを含む、ペイロードを生成するためのコードです。

もう1つの興味深い点として、シェルコードの長さを調べると、上位2つのコードの長さは294バイトと312バイトで、それぞれ846件と544件のサンプルを有していますが、その後はサンプル数が急激に減っています。

シェルコードの長さ(バイト) カウント
294 846
312 544
337 145
303 131
285 46

興味深いのは、送信されてくる膨大な量の同じ長さのシグナルです。これは、攻撃者が同じツールを使用して同じペイロードを生成していることを示唆しています。また、C2の可変長のURLに対し、ここでは4バイトIPなど、ほとんど変化を付けられない長さを使用しています。

このブログでは、これらの亜種の違いを分類しています。以下に、特定の亜種を識別するための正規表現によるクエリを示します。

シェルコード挿入

Unicorn

設定

変更されたUnicorn

Powerfun Reverse (100件のサンプル – 2.44%のカバレッジ)、

Powerfun Bind (2件のサンプル – 0.05%のカバレッジ)

コード実行の別の亜種は、 Powerfunの内部で検出されています。具体的には、攻撃者は Metasploitの「windows/powershell_reverse_tcp」ペイロードと「powershell_bind_tcp」ペイロードを利用して、ターゲット システムの対話式シェルを作成します。リバース ペイロードはbase64でエンコードされ、System.Diagnostics.Processを使用してバックグラウンド プロセス経由で起動されます。

リバース ペイロード –

バインド ペイロードは、System.Net.Socketsでリスニングすることによって、TCPリスナーを設定します。TCPClient、および受け取ったデータによって、PowerShellスクリプトからInvoke-Expressionが実行されます。

バインド ペイロード –

Powerfun Bind (19件のサンプル – 0.46%のカバレッジ)

PowerWormは、2014年にTrendMicroがブログ上で報告したマルウェア ファミリで、他のMicrosoft Office DOC(X)/XLS(X)ファイルを感染させることで拡散します。PowerShellコードは、 正規のコマンド間に「ジャンク」データを配置することで難読化されます。

若干クリーンアップされたもの –

このコードでは、DNS TXTレコードのソフトウェアからダウンロードURLをフェッチすることにより、TorとPolipoをダウンロードします。その後、ソフトウェアを使用して、Invoke-Expressionに渡されるPowerShellの新しいコマンドを継続的にチェックします。Matt Graeberは、 このマルウェアの全機能を非常にうまく分析しており、基盤となっているPowerShellの難読化を解除した、コメント付きのバージョンを提供しています。

Veil Stream (7件のサンプル – 0.17%のカバレッジ)

これは、「Powerfun Reverse」亜種のテクニックに類似しています。PowerShellコードは、base64文字列からメモリに挿入され、実際のシェルコード ペイロードを起動するInvoke-Expressionで実行されます。コードのレイアウトは、Veil Frameworkの実装に関連付けられています。

持続性

PowerShellコードは、主にホスト上で持続性を確立するために特定されます。

Scheduled Task COM (11件のサンプル – 0.27%のカバレッジ)

この亜種は、悪意のあるバイナリを実行するスケジュール化したタスクを作成することで、持続性メカニズムを作成しようとします。このサンプルの発信元であるPEファイルは「minecraft.exe」をドロップし、ほとんどの場合、下記のようにこのPowerShellコマンドを起動します。このタイプの機能は、発信元であるファイルにコーディングするよりも、PowerShellに渡すほうが容易だからです。

主に散見されるテクニックは、Retefeバンキング型トロイの木馬のサンプルに関連付けられているものです。

VB Task (10件のサンプル – 0.24%のカバレッジ)

PowerShellコードのこのグループは、EncodedCommandを使用してPowerShellを実行するPEからのものです。これは、その後でVBScriptを作成し、それをスケジュール化したタスクとしてインストールします。実行されたVBSriptは、感染させるために別のPowerShellスクリプトを起動します。

DynAmite Launcher (6件のサンプル – 0.15%のカバレッジ)、

DynAmite KL (1件のサンプル – 0.02%のカバレッジ)

DynAmiteは「マルウェア作成ツールキット」で、マルウェア ツールの標準的な機能の一部として認識されるようになっています。

これにより、必要な機能を混合させて組み合わせることができ、PowerShellコマンドを実行するだけで特定のタスクを遂行できるPEラッパーが生成されます。このキットによって生成されたコードの大部分は、公開ツールから取得されたものですが、その変数名と場所は異なっています。

「DynAmite Launcher」の亜種は、持続性の側面も有しており、これはスケジュール化したタスクの作成により確立されます。異なるバージョンおよび構成からの3つの異なる反復コードを以下に示します。

「DynAmite KL」亜種の場合、キットのキーロガー箇所になりますが、そのコードはPowerSploit関数Get-Keystrokesの古いバージョンから直接借用したものになります。以下は、2つのコードにおけるスクリプトの該当箇所を比較したものです。これにより、変数とタイプの場所がDynAmiteによってどのように変更されるかを確認できます。

Get-Keystrokes –

関数DynAKey –

その他のテクニック

AMSI Bypass (8件のサンプル – 0.20%のカバレッジ)

Antimalware Scan Interface (AMSI)は、MicrosoftがWindows 10でリリースした新しい機能で、アプリケーションとアンチウイルス製品との間の通信を容易にするように設計されています。難読化が解除され、Webサイトからリモートに取り込まれたスクリプトを、アプリケーション(このコンテキストではPowerShell)が実行時に受け取ってから、AMSI を介してスキャン用にアンチウイルスに渡すことが理想的です。アンチウイルス ソフトウェアが有害であると判断した場合は、スクリプトの実行がブロックされます。

#YAOMG (Yet Another of Matt Graebers)

Matt Graeberがリリースした1行のツイートには、「amsiInitFailed」を「True」に変更するだけでAMSIをどのようにバイパスできるかが示されています。これにより、ロードが失敗したかのように見え、このチェックは実質的にスキップされてしまいます。

このコードのシグネチャは、PowerShell EmpireのXORルーチンで使用されるEncryptedScriptDropperと類似しているため、関連性のあるコードであるか、借用されたコードである可能性があります。

PowerSploit GTS (3件のサンプル – 0.07%のカバレッジ)

これは、別のツールからのモジュールを使用するサンプル群で、この場合は、PowerSploit Get-TimedScreenshotになります。このコードは、Drawing.Bitmapを使用して2秒毎にスクリーンショットを取得します。

これらの攻撃タイプでは、PowerShellコードは、 攻撃で使用されている全般的なツール群を補強する機能に過ぎません。すなわち、攻撃者が必要な機能を開発するまでの時間を買うための機能になります。この場合、Microsoft Excelドキュメントに、 PowerShellコードをデコードする関数を最初に起動するマクロが含まれており、この関数によってスクリーンショットの取得が開始されます。その間に2番目の関数が呼び出され、残りの攻撃を処理するPEファイルがデコードされます。

図7 Excelマクロによる埋め込みPowershellスクリプトとPEファイルのデコード
図7 Excelマクロによる埋め込みPowershellスクリプトとPEファイルのデコード

Remove AV (2件のサンプル – 0.05%のカバレッジ)

この亜種は、PowerShellを使用して、インストールされたアンチウイルス アプリケーションのx86バージョンとx64バージョンを強制的にアンインストールします。Uninstallレジストリ パスのエントリに対して繰り返し処理を行うことで、「*AVG*」を含む項目を検出し、各インスタンスを暗黙的にアンインストールします。

よく知られている亜種

できるだけ多くの亜種を特定した後に残ったのは100件の「未知」のサンプルです。これらは通常、上記のテクニックで記述されているカスタムのスピンになります。よく知られているいくつかのサンプルを簡単に説明することで、この分類作業を締めくくりたいと思います。

隠れたメッセージ

このサンプルは、PowerShellを介して基本的な日付チェックを行います。また、現在の日時とコード内の日時を比較します。現在の日時がコード内の日時よりも後の場合は、実行されません。コードの終わりには、おそらく「ハッカー」グループに対するコメント化されたコールアウトが残されています。

次のサンプルは、隠れたメッセージが残されたコードを示すもう1つの例です。

分析対象のコードは、GitHubからリモートで取得されます。このブログの執筆時において、このコードはPowerShellプロセスをkillして、「Hello SOC/IR team!  :-)」を表示していました。このファイルでは数多くの「Test」が実行されているため、これは侵入テストか赤チームによる演習である可能性もあります。

図8 JavaScriptファイルによるpowershellのkillとSOC/IRチームへの挨拶
図8 JavaScriptファイルによるpowershellのkillとSOC/IRチームへの挨拶

プロセスのkill

これは、攻撃全般でPowerShellを使用して特定の目的を達成するための別の例です。このコードは、一般的にマルウェア分析に関連付けられている複数のプロセスをkillします。

難読化のレイヤー

元のマクロがほぼ同じであるため、この最後の例は「PowerSploit GTS」の亜種で示したサンプルと関連しているように見えますが、このサンプルではそれ以外のコード箇所がまったく使用されていません。

この特定のサンプルでは、攻撃を実行するのに複数の難読化レイヤーを使用します。

レイヤー1 –

Microsoft Excelドキュメントには、セルからbase64のエンコード データを取り込んで、PowerShellの EncodedCommandパラメータの実行時にそのデータを渡すマクロがあります。

レイヤー2 –

デコードされたbase64は、char値に変換されるint値の長い配列で、別のPowerShellスクリプトとして実行されます。

レイヤー3 –

デコード データは、さまざまなテクニックを活用して難読化を行います。最初のテクニックは、他の文字の間に、実行時には無視されるバックティック (`)を挿入することです。これは、コマンドラインにおけるカレット(^)の挿入と同様のテクニックです。この場合は、かわりにPowerShellコード内で実行されます。

また、ある文字列をランダム化されたリストに分割した後、個々の値を呼び出して元の文字列を再構築するという、他のスクリプト言語でよく見られるテクニックも活用しています。

コードのクリーンアップ、および文字列の構築が行われているということは、コードがリモートにダウンロードされて、Invoke-Expressionに渡されることを示しています。

結論

PowerShellは、攻守を併せ持つ、多様な機能を備えた堅牢なスクリプト フレームワークです。このブログをお読みになることで、マルウェア ツールや攻撃で採用されている現在のテクニックについてご理解頂けたのならば幸いです。

これらのサンプルを見ると、マルウェア攻撃のほとんどが未だに公開ツールに頼っていることが分かります。これは、驚くほどのことではありません。PowerShellフレームワークが調査され、その理解が深まるにつれ、この技術を利用した攻撃はますます多様化するものと予想されます。現時点では、PowerShellは、他のフレームワーク内で一般的に使用されている関数を簡単に実行するためのツールとして主に利用されているようですが、「移転」フェーズから「革新」フェーズへの移行に伴って、今後はよりネイティブな機能を活用していくことが予想されます。

観察されたC2またはダウンロード サイト

Downloader DFSP

PowerShell Empire

Downloader DFSP 2X

Downloader DFSP DPL

Downloader IEXDS

BITSTransfer

TXT C2

Downloader Proxy

Downloader Kraken

PowerWorm

AMSI Bypass

Meterpreter RHTTP

難読化のレイヤー

SHA1ハッシュタグ