Take a Product Tour Request a Demo Cybersecurity Assessment Contact Us

Blogs

The latest cybersecurity trends, best practices, security vulnerabilities, and more

セキュリティオペレーションの品質向上のヒント

~ 攻撃手法の理解と対応 ~
第1回 DLL Notification Injection (攻撃者目線)

(目次)

1. はじめに

セキュリティオペレーションの品質向上を考える上で、具体的な攻撃テクニックを知っておくことの重要性が高い日常業務としては、”アラート監視”、”Threat Hunting”、“フォレンジック” などが挙げられます。

アラート監視については、通知にしやすい情報と過検知が多すぎてアラートに出来ないデータ(LOTLや特定のイベントIDなど)があります。後者のようなタイプのデータに対しては、攻撃の全体像を想定・把握していることでインシデント調査も効果的に進めやすくなります。

また、プロアクティブな活動として脅威情報を調査してカスタムのクエリや検知ルールを書くといったThreat Huntingや、インシデントに対する事後対応としてプリフェッチファイルやレジストリの分析、揮発性のメモリを分析といった、早急な原因究明に主軸をおいたフォレンジック調査(ファストフォレンジック)など深い調査を行うことも必要となります。これらの活動にも、攻撃の全体像や攻撃手法の理解と共に調査手法の高度な知識が要求されることになります。

そこで、本稿では、攻撃者が用いる具体的な攻撃テクニックについての情報の活用方法を、レッドチーム視点(攻撃者目線)とそれらに対応するブルーチームのためのポイント(防御側目線)にわけてご紹介していきたいと思います。

攻撃者目線:レッドチームがよく用いるテクニックやツールたけでなく、これから注目すべき新しいテクニックなどをピックアップし、技術的概念、侵害時の影響、検証時の再現方法などをご紹介します。

防御側目線:ブルーチームが行うインシデント対応 (Threat Hunting、ファストフォレンジックを含む) に役立つ情報として、プロセスの動きやイベントログなどの調査方法、利用したツールなどをご紹介します。

今回は、その第1回目として、「DLL Notification Injection」について攻撃者目線でご紹介させていただきます。防御側目線でまとめたブログも別途公開予定です。「セキュリティオペレーションの品質向上のヒント」はシリーズものとして、随時弊社ブログサイトにてご紹介させていただきます。

2. DLL Notification Injectionの概要

DLL Notification Injection[1]」は、Process Injection(MITRE ATT&CK® ID:T1055)の一種とされ、悪性コードの実行が”スレッドレス”で行われる点が特徴的な手法です。

Process Injection(プロセスインジェクション)は、動作中の正規のプロセスに、攻撃者が自身のコードを挿入して実行させるマルウェアの実行手法です。これは古くからある防御回避(T0005)、 権限昇格(TA0004)の戦術であり、その具体例として「Reflective DLL injections」や「Process hollowing (T1055.012/2020)」 などが以前から挙げられています[2]。様々なバリエーションがありますが、プロセスのハンドルを取得してメモリ領域に悪性コード(ペイロード)を書き込む処理手順は共通しています。

その中でも「DLL Notification Injection」は、悪性コードを実行する際に正規のコードやデータ(リンクリスト)を書き換えてフック(割り込み処理)をするのでAPIのスレッド関数を利用しないことから「Threadless(スレッドレス)Process Injection」と呼ばれています。

説明をわかりやすくするために、先に具体例として挙げた過去に使用されてきたプロセスインジェクションと「DLL Notification Injection」について、攻撃に使用される代表的なAPIをMicrosoft® Windows®の OSで比較してみました。それぞれの手法で使用されるWindows APIは、下記表のようになります。補足になりますが、下記表で取り上げているAPIは、それぞれの処理手順の違いを説明する目的で代表的なものを列挙しているので、同じ種類のプロセスインジェクションであっても必ずこれらのAPIが使われるとは限りません。

Process Injectionの種類 使用される代表的なWindows API
Reflective DLL injections
  • OpenProcess
  • VirtualAlloc
  • WriteProcessMemory
  • CreateRemoteThread
Process hollowing
  • CreateProcess
  • NtUnmapViewOfSection
  • VirtualAllocEx
  • WriteProcessMemory
  • SetThreadContext
  • ResumeThread
DLL Notification Injection
(Threadless Process Injectionの一種)
  • OpenProcess
  • VirtualAlloc
  • WriteProcessMemory
  • LdrRegisterDllNotification
    (DLL Load Notificationのリンク構造を改ざんすることで、DLLがロードされる際に、処理の流れがフックされる)

「DLL Notification Injection」は、過去に使用されてきたプロセスインジェクションの処理と類似しているのですが、コードを操作するWindows API(上表に赤字で示したCreateRemoteThreadおよびResumeThread)が使われていません。代わりに、悪性コードを実行する際にDLL Load Notification という仕組みを使っています。DLLがロードされるたびにコールバックとして関数を実行する役割をもつリンク構造を改ざんし、DLLのロード時に悪性コードが呼び出されるようにセットした新しいエントリをインジェクションしています。結果、本来実行されるはずの処理の流れをフックして、悪性コードが先に実行されることになります。

APIレベルで過去に使用されてきたプロセスインジェクションとは攻撃コード実行の仕組みが異なる為、プロセスツリーから見える親子関係は、スレッド関数を使用する攻撃とは異なったものになります。このように”スレッドレス”にすることで、セキュリティ製品の監視の目を搔い潜り、検知を迂回する可能性を高めています。

「DLL Notification Injection」の技術的詳細については、後半でもう少し記載させて頂こうと思います。

3. レッドチーム視点

レッドチーム視点で、この「DLL Notification Injection」を用いた攻撃をエミュレートしてみます。レッドチームでは演習の目的を検討した後に、攻撃者のTTP(Tactics, Techniques, and Procedures)についてリサーチを行うのですが、今回は仮説としてATP29が「DLL Notification Injection」を攻撃に用いるようになったという前提で、「MITER ATT&CK」に合わせた「攻撃シナリオ」を検討します。

3.1. 想定する攻撃のシナリオ (MITER ATT&CKとのマッピング)

<想定する攻撃の全体像>

Figure: 1

「初期アクセス(Initial Access)」として、悪性WEBサイトの閲覧、公開Webアプリケーションのエクスプロイト、フィッシング、有効なアカウントの不正利用等が考えられます。その中でも今回は、フィッシングメールで送られてくるパターンを想定し、上図のようにユーザー操作により悪性ファイルを実行した後にC2への通信が発生するところまでを今回の攻撃の範囲とすることにします。

MITER Techniqueとマッピングした攻撃のシナリオは以下のようになります。

Technique

名前

該当する処理内容

T1204.002

User Execution: Malicious File

フィッシングメールで送付される、悪性の.LNKファイル。

T1059.001

Command and Scripting

Interpreter: PowerShell

.LNKファイルクリック後に実行されるPowerShell

T12027

Obfuscated Files or Information

- Base64エンコードされたPowerShellコード

- XOR暗号化されたDLLファイル

T1218.011

Signed Binary Proxy Execution: Rundll32

PowerShellからDLLを呼び出す際に使用されるRundll32コマンド

T1055

Process Injection

今回のDLL Notification Injection

T1071.001

Application Layer Protocol:

Web Protocols

DLL実行後に発生するC2とのHTTP通信

攻撃のステップとMITER Techniqueとのマッピングした表は、目的に応じて使用したツールや実行されるコマンドなどを書き加えることで、レッドチームのナレッジ拡充や、防御や検知方法の具体的な検討に役立てることができ、ブルーチームとのコミュニケーションやレッドチーム演習の結果をレビューする際にも活用することができます。

3.2. 攻撃の詳細

以下に、フィッシングメールで送られてくる.lnkファイルをクリックしてからペイロードを含むDLLを実行させるまでのステップ「①ペイロードを運ぶ為の仕組み」と、今回のテーマであるプロセスインジェクションを実行させてC2通信を発生させる処理「②ペイロードの実行」に分けて説明いたします。

  • ① 「ペイロードを運ぶ為の仕組み」

.lnkファイルからC2への通信を発生させる際に、大きく分けて以下の3つで構成される処理を用いることを想定してペイロードを実行させるようにします。

  • .lnkファイルをクリック後にPowerShellコマンドを実行
  • PowerShellコマンドで難読化されたPowerShellスクリプトを.lnkファイルから抽出
  • PowerShellスクリプトからペイロードを含むDLLを実行し、ダミーのPDFを表示

これらの処理をエミュレーションする為にMITRE ATT&CK Defender (MAD)TM を参考にレッドチーム演習に使えるプログラムを作成することが出来ます。今回使用するのはATP29が用いているもので、以下のような具体的な手法をエミュレートすることが出来ます。

.lnkファイルをクリック後にPowerShellコマンドを実行
MITRE MAD に用意されているツールを用いて、.lnkファイルをクリック時にPowerShellが実行されるファイルを作成することが出来ます。作成された.LNKファイルはプロパティから実行されるコマンドが見えないように、Base64エンコードが用いられています。

Figure: 2

PowerShellコマンドで難読化されたPowerShellスクリプトを.lnkファイルから抽出
同様に用意されているツールを用いて下記のように.lnkファイルに3つのデータを内包させる構造を作成することができます。

今回はクリックしたユーザーに表示させる為の「ダミーのPDFファイル」、DLLを実行させてローダーのような役割をする「難読化されたPowerShellスクリプト」、ペイロードを含むDLL「暗号化されたDLLファイル」 を含ませています。暗号化/難読化を行うことで、メールで送付する際にEmailセキュリティやAV等にも検知されづらくするようにしています。

DLLの実態は、後述する「DLL Notification Injection」を行うファイルで、成功後にC2への通信を発生させる仕様にしています。

Figure: 3

.lnkをクリック実行後に実行されるPowerShellコマンドでは、難読化されたPowerShellを取り出し、複合化して実行させるところまで行います。

PowerShellスクリプトからペイロードを含むDLLを実行し、ダミーのPDFを表示
複合化したPowerShellスクリプトでは、先程のPowerShellコマンドと同様に.lnkファイルに含まれる「ダミーのPDFファイル」と「暗号化されたDLLファイル」を取り出しています。

PDFファイルはあくまで、.lnkファイルをクリックしたユーザーに表示させる為のもので、ダミーファイルとして含まれています。表示させている一方で、DLLファイルをXORで複合化してバックグラウンドで実行しています。

Figure: 4

以上でMITRE MAD に用意されているATP29のエミュレーションを用いて、いくつかのファイル抽出と複合化のステップを踏む「ペイロードを運ぶ為の仕組み」を作成することが出来ました。

  • ② 「ペイロードの実行」

次に、ペイロードを実行させるDLLの作成に移ります。

「DLL Notification Injection」を行った結果としてシェルコード(ペイロード)が実行されるまでの基本的な仕組みを簡素化すると、以下のようなステップで処理が行われます。

  • Injectionする対象のプロセスのハンドルを取得 (対象:Explorer:exe)
  • 対象プロセスのLDR_DLL_NOTIFICATION_ENTRYを改ざん
  • 対象プロセスがdllを読み込み、ペイロードが実行されるのを待つ

この処理を行うPoCコードは、一般向けに第三者がGitHubに公開している場合があり、その中で、今回はサンプルとして、GitHubでShorSec/DllNotificationInjectionから公開がされているコードを使用するモデルをご紹介します。なお、当社では、このコードの利用に関するご質問への回答やご要望等へのお応えはいたしかねますので予めご了承のほどお願いいたします。

このコードは、そのままコンパイルしてexeファイルとして実行させることも出来るのですが、「①ペイロードを運ぶ為の仕組み」で作成したプログラムから実行出来るようにする為にDLLに変換し、C2への通信を発生させるなど、若干のカスタマイズを加えています。

カスタマイズ後のDLLの動き

Figure: 5

DLLが実行された後、シェルコードのメモリ領域が確保されます。その際、トランポリンコード、リストアコード、シェルコードといった種類のコードが後で格納されることが考慮されています。LdrpDllNotificationListの改ざんでは、シェルコードを指すエントリを最初に作成した上で、二重リンクリスト構造のリンクを改ざんしています。最終的に、標的プロセスのDLL読込処理が行わる際に改ざんしたLdrpDllNotificationListからコールバック関数(シェルコード)が呼び出される仕組みになっています。

以上が.lnkファイルをクリックした後にC2への通信を発生させるまでのステップの詳細です。

4. 「DLL Notification Injection」の技術的詳細

冒頭に記載通り、「DLL Notification Injection」は、大きく分けるとProcess Injection (MITRE T1055)に分類されますが、低レイヤーでは様々なテクニックが使われています。かなり複雑な処理を行っているものもあり、すべて詳細まで記載することは出来ないのですが、少しだけかいつまんでご紹介させて頂きます。

LdrpDllNotificationListの改ざん
LdrpDllNotificationListは、循環二重連結リスト構造になっており、前後のコールバックを指す構造によって相互にリンクされています。DLL がロードまたはアンロードされると、システムはこのリンク リストをたどって各コールバック関数を呼び出し、DLL のロードまたはアンロードについてアプリケーションに通知される仕組みになっています。
攻撃者は、自身のコードがコールバック関数として実行されるように、リンクリストを改ざんします。この循環二重リンクリストを改ざんする際に、LdrRegisterDllNotification関数が用いられております。一度ダミーのエントリを登録し、エントリへのポインタであるCookieから Flink を辿ってリストの先頭(Head)のアドレスを取得することで、DLLロード時にコールバックとして実行したいペイロードのアドレスをセットした攻撃者のエントリを二重リンクリストの1番目に挿入しています。エントリの1番目に挿入することで、他のコールバックより先にペイロードが実行されるようになります。
Process Injectionやフックを行うような悪性コードは、本来は意図されていない処理を悪用するため、調査方法も変わる可能性があります。例えば今回の手法ではプロセスの親子関係からはマルウェアが見えなくなることを踏まえて調査する必要があります。このような特徴を把握しておく為にもPoCを動かして実際の動きを確認した方が良いことがあります。

LdrpDllNotificationListを改ざんした後に、循環二重リンクリストがどうなっているのかイメージし易くする為に、以下に図示いたします。

Figure: 6

参考: https://github.com/m417z/LdrDllNotificationHook

トランポリンコード
トランポリンコードは、実行したいコードの前に実行させるコードで、ジャンプしてターゲットのコードを実行させてから元のコードに戻ることからトランポリンと呼ばれています。

LdrpDllNotificationListに登録された攻撃者のコールバック関数はトランポリンコードへのアドレスを指しており、トランポリンコードからリストアコードへジャンプします。リストアコードは、LdrDllNotificationListを改ざん前のリストが保持していた情報(FlinkとBlink)に戻す役割を担います。そして、最終的にシェルコードが実行される仕組みになっています。

Figure: 7

これらのテクニックは、プログラムの処理の流れを、意図されていない方法で変更するため、エンドポイントでセキュリティ製品の検知迂回や、実行ステップの調査を攪乱できるためフォレンジック調査の際に、攻撃手法の発見を困難にする要因になる可能性があります。

5. レッドチームによる「DLL Notification Injection」演習に関するまとめ

今回のブログでは、レッドチーム視点でAPT29の攻撃手口をエミュレートして、新しいプロセスインジェクション手法で「DLL Notification Injection」が実行されたケースを想定した内容を記載させて頂きました。

プロセスインジェクションの仕組みは、Windowsなどの OSの内部機能を操作する為の”APIの悪用”や”メモリ上の値を変更する”といった低レイヤーのテクニックが使われていることが多く、どういった振る舞いが観察できて、どういったログが出力されるのか、把握できていないことが多いと思います。セキュリティ製品での検知可否やインシデント調査の際にどういった調査が必要になるのかなどを確認する目的としてもレッドチーム演習が有効ではないかと思います。

また、4. 「DLL Notification Injection」の技術的詳細 で記載した通り、様々な手法を組み合わせて使われていることもあります。こういった低レイヤーの手法は、Threat Huntingやファストフォレンジックを行う際に理解しておくことが重要になり、新たな手法のナレッジを蓄積することで、インシデント対応能力の向上を図ることに繋がります。

6. Trellix Professional Servicesでのレッドチーム演習支援について

ランサムウェアを扱う攻撃者を代表とするAPTは、今回のテーマのような新しい手法が使用される可能性があります。セキュリティインシデント対応の向上という観点で、Trellix Professional Services(以下、Trellix PS)ではレッドチーム演習を行うことが可能です。

レッドチーム演習の主なステップ

Figure: 8

レッドチーム演習の期待する効果

  • セキュリティ弱点の特定
  • 攻撃シナリオの理解
  • インシデント対応能力の向上
  • 従業員の意識向上
  • コンプライアンスおよび規制要求への対応

この他にも様々なサービスをTrellix PSでは提供しています。

  • 技術的監査支援(脆弱性診断、ペネトレーションテスト、レッドチーム演習)
  • サイバーセキュリティ体制構築支援
  • SOCの高度化・自動化支援
  • CSIRT支援(インシデント対応含む)
  • セキュリティ教育支援

これらサービスはお客様事情にカスタマイズした柔軟な提供も可能なため、セキュリティに関する課題を抱えている場合にはTrellix PSへお気軽にご相談ください。

Trellix お問合せ窓口:https://www.trellix.com/ja-jp/contact-us/

最新情報を入手する

サイバー セキュリティは私たちの得意とするところです。とはいえ、私たちは新しい会社です。
これから進化してまいりますので、最新情報をお見逃しなきよう、お願いいたします。

有効な電子メール アドレスを入力してください。
迷惑メールゼロ。配信はいつでも停止できます。