こんにちは!日々の開発やインフラの管理、本当にお疲れ様です。
システムを作ったり守ったりする立場になると、「セキュリティって難しそうだな…」「攻撃者ってどうやって侵入してくるんだろう?」と不安になること、ありますよね。
今回は、セキュリティの世界で最も有名であり、同時に最も恐れられている攻撃ツールの一つである「Mimikatz(ミミカッツ)」をテーマに取り上げます。そして、その攻撃者がパソコンのメモリ上で何を企んでいるのか、それをどうやって見つけ出すのかという「メモリフォレンジック」の世界へ、一歩ずつ優しくご案内していきますね。
難しい専門用語が出てきても置いてけぼりにしませんので、リラックスして読み進めてください!
—
1. 家の鍵に例えて理解する「認証情報」と lsass.exe の役割
まずは、私たちが普段使っているパソコンの中で、認証情報(パスワードやチケット)がどのように扱われているのかを、身近な「家と鍵」の例えで考えてみましょう。
皆さんが自分の家に入るとき、玄関の鍵を開けますよね。一度鍵を開けて家に入ってしまえば、リビングでテレビを見たりお風呂に入ったりするたびに、いちいち玄関の鍵を開け直したりはしません。
Windowsのパソコンもこれと全く同じです。
パソコンを起動してパスワードを入力してログインすると、Windowsは「この人は正しいユーザーですよ」という証明書(デジタルな合鍵)を心臓部であるメモリの中にこっそり保管します。そして、ファイルサーバーにアクセスしたり、メールを見たりするたびに、その合鍵を自動で提示してくれます。
この「合鍵をまとめて安全に管理してくれているお部屋」に当たるのが、Windowsのシステム内部で動いている lsass.exe(Local Security Authority Subsystem Service)という特別なプログラムなんです。
攻撃者はなぜ lsass.exe を狙うのか?
もし泥棒があなたの家の合鍵ケースをごっそり盗み出すことができたらどうなるでしょうか? 家中のどの部屋のドアも、いとも簡単に開けられてしまいますよね。
サイバー攻撃における「Mimikatz」も、まさにこれと同じことをやります。
攻撃者は一度パソコンの中に侵入することに成功すると、この lsass.exe がメモリ上に広げている「合鍵(パスワードのハッシュ値やKerberosチケット)」の保管場所をこっそり覗き見して、丸ごと盗み出してしまうのです。これが、メモリダンプからパスワードを抽出する手口の正体です。
—
2. 攻撃はどうやって行われる? Mimikatzのメカニズム
Mimikatzは、フランスのセキュリティ研究者であるベンジャミン・ドゥルエ(Benjamin Delpy)氏によって開発されたツールです(もともとはWindowsの認証の仕組みの脆弱性を証明するために作られました)。
このツールが恐ろしいのは、Windowsが正当な管理プログラムからの要求として処理してしまう仕組みの隙を突き、lsass.exe のメモリ領域へのアクセス権(プロセスハンドル)を無理やり取得してしまう点にあります。
攻撃者は次のようなステップで私たちの大切な認証情報を奪っていきます。
1. 侵入(初期アクセス): フィッシングメールや脆弱性を突いて、パソコンのなかにこっそりと侵入します。
2. 権限昇格: そのままではシステムの大事な部分に触れないため、管理者権限(AdministratorやSYSTEM)を奪い取ります。
3. メモリの覗き見(Dump): lsass.exe に対して「メモリの中身をこっちにコピーして!」と要求(ダンプ)を出します。
4. ハッシュの解読・利用: 抽出したデータから、パスワードそのものや、パスワードの暗号化されたハッシュ値を取り出し、他のサーバーへなりすましアクセス(横展開:ラテラルムーブメント)を行います。
—
3. メモリフォレンジックで「痕跡」を見つけ出す
「じゃあ、攻撃者がこっそりメモリを覗き見した跡なんて、どうやって見つけるの?」と思いますよね。
ここで登場するのが、今回の主役であるメモリフォレンジックです。
犯人が現場に残した足跡や指紋を探すように、私たちはパソコンの電源が入っている状態のメモリ(RAM)の全データをファイルとして保存し(メモリダンプ)、その中に不正なアクセスの痕跡がなかったかを調べます。
現場のインシデントレスポンスでは、オープンソースの強力な解析ツールである Volatility 3 などのツールを使って調査を行います。ここでは、実務でどのように調査の端緒をつかむのか、そのアプローチを見ていきましょう。
調査の第一歩:不審なプロセスの確認(Volatility 3の例)
まずは、メモリ上にどんなプログラムが起動していたかを一覧で確認します。Mimikatzそのものが実行されていたり、怪しい名前のプロセスが動いていないかを探す基本のコマンドです。
# パソコンのメモリダンプファイル(memory.raw)から、実行中のプロセス一覧を抽出するコマンド
python vol.py -f memory.raw windows.pslist.PsList
もしここで、lsass.exe のメモリを不自然に読み込もうとした別のプログラム(例えば、身に覚えのないコマンドプロンプトや、変な名前のスクリプト)が見つかったら、それがインシデントの引き金である可能性が非常に高いと言えます。
プロセスハンドルの調査:誰が lsass.exe を覗き見したか?
Mimikatzなどのツールは、lsass.exe のプロセスハンドル(アクセス許可のチケット)を開いてメモリを読み取ります。したがって、「どのプログラムが lsass.exe のハンドルを開いたか」を調べることで、不正アクセスの決定的な証拠を掴むことができます。
# lsass.exe(PIDが仮に 688 だとします)に対して開かれたハンドルを調査するイメージ
python vol.py -f memory.raw windows.handles.Handles --pid 688
このような調査を行い、通常の正当なシステムサービス以外の不審なプロセスが lsass.exe に対して読み取り権限(PROCESS_VM_READ や PROCESS_QUERY_INFORMATION)を要求していた履歴を見つけ出すのが、私たちSOCアナリストの腕の見せ所となります。
—
4. 現場のプロが教える!今すぐできる実践的な防御策
メモリからパスワードを抜かれる手口は非常に強力ですが、もちろん手立てがないわけではありません。現場のセキュリティエンジニアとして、最低限これだけは絶対にやっておいてほしい対策をいくつかご紹介します。
① LSASSの保護(RunAsPPLの有効化)
Windowsには、lsass.exe を「保護されたプロセス(Protected Process Light: PPL)」として動作させ、管理者権限を持つユーザーであっても、外部から簡単にメモリを読み取れないようにする強力な機能が備わっています。
レジストリを設定することで、この保護を有効にすることができます。
【レジストリ設定の例】
パス: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
キー名: RunAsPPL
値(DWORD): 1
※この設定を行っておくことで、Mimikatzのようなツールが lsass.exe のメモリを直接ダンプしようとしても、アクセス拒否(Access Denied)ではじき返すことができるようになります。
② 不要なパスワードキャッシュ(WDigest)の無効化
古いWindowsの仕様では、メモリ上に平文のパスワード(WDigest認証情報)が残りやすいという弱点がありました。モダンな環境では標準で無効化されていることが多いですが、念のため確認しておきましょう。
こちらもレジストリで制御可能です。
【WDigest無効化の設定例】
パス: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest
キー名: UseLogonCredential
値(DWORD): 0
(値を 0 に設定することで、メモリ上に平文パスワードが残るリスクを大きく減らすことができます)
③ EDR(Endpoint Detection and Response)の導入
従来のウイルス対策ソフト(アンチウイルス)は「既知のウイルスファイル」を見つけるのが得意ですが、Mimikatzのように正当なWindowsの仕組みを悪用する攻撃はすり抜けてしまうことがあります。
そのため、メモリへの不審なアクセスや、lsass.exe を読み込もうとする不自然な挙動そのものをリアルタイムで検知・遮断してくれる EDR製品 の導入が、現代のインフラストラクチャにおいては必須の防犯カメラとなります。
—
まとめ
今回は、メモリフォレンジックの代表的なテーマである「lsass.exe からの認証情報抽出(Mimikatz手法)」について、家の鍵の例えを交えながら解説しました。
- パソコンの中では、
lsass.exeという金庫が私たちの「合鍵」を管理している。 - 攻撃者はそこを狙ってメモリを覗き見(ダンプ)し、パスワードを盗み出そうとする。
- 万が一被害に遭った(またはその疑いがある)場合は、メモリダンプを採取し、
Volatilityなどのツールを使って誰がアクセスしたのかを徹底的に調査する。 RunAsPPLなどの機能を有効にして、そもそもメモリを簡単に覗かれないように要塞化しておくことが何よりも大切。
セキュリティの対策に「100パーセント安全」はありませんが、仕組みを正しく知り、一つずつ適切な鍵をかけていくことで、攻撃者の侵入コストを跳ね上げることができます。
「難しそう」と感じた部分も、日々の運用や検証を通じて少しずつ自分のものになりますので、焦らず一歩ずつセキュリティのスキルを磨いていきましょう!それでは、また次の記事でお会いしましょう!
コメント