PR 本記事には広告(Amazonアソシエイト・もしもアフィリエイト・A8.net等)が含まれます。掲載情報の正確性には努めていますが、商品の詳細は必ずリンク先で最新情報をご確認ください。
CTF・セキュリティ学習

【永続化編】cron・systemd・scheduled task・WMIで居座る手口と検知|CTF思考フレームワーク #39

かも次郎とアンペンが「永続化」を解説するマスコットイラスト
安全に生きたい編集部

こんにちは、アンペンです!

前回は、コンテナの隔離を破るカーネル脆弱性とエスケープを扱いました。

今回は、攻撃者が侵入後に再起動やパッチ後も生き残るために仕込む永続化(Persistence)を見ていきます。cron・systemd・scheduled task・WMIで居座る手口と検知を学びましょう。

侵入されてもPCを再起動すれば消えるんじゃないの?

攻撃者はまず『再起動後も生き残る仕掛け』を仕込むんだ。cronやscheduled taskが典型で、これを片付けないと完全駆除にならない。

『侵入されても、PCを再起動すればリセットされる』——そう思っている人は多いかもしれません。でも残念ながら、腕のいい攻撃者ほど、侵入してまず最初に“再起動しても生き残る仕掛け”を仕込みます。これが永続化(Persistence)。お掃除したつもりでも、電源を入れ直した瞬間に攻撃者が戻ってくる——そんな事態を防ぐ話です。今日は『毎朝の点検リスト』のたとえで見ていきます。

まず結論

侵入された端末・サーバは、攻撃者が永続化メカニズムを仕込んでいる前提で対応する必要があります。cron/systemd(Linux)、Scheduled Task/Run Key/WMI(Windows)が代表的。守りは『常時実行物の差分監視』『重要設定の整合性チェック』『ベースライン化』が中心です。

この記事で分かること

  • 永続化が成立する代表場所(Linux/Windows)
  • 正規の自動起動と悪性の見分け方
  • ベースライン+差分監視による検知
難易度:上級向け 所要時間:11分 体験:自動起動を棚卸し おすすめ:#38の後

📖 はじめてのWebセキュリティ #39|永続化編
『再起動しても消えない仕掛け』の代表場所と、それを見つける運用を学びます。 シリーズ一覧を見る →

⚠️ 大事なお約束
他者のシステムに永続化機構を仕掛ける行為は、不正アクセス禁止法や器物破損等に該当します。確認は自分が管理する検証環境のみで行ってください。

永続化は『再起動後も動く場所に仕込む』

OSには、正規の運用のために『再起動時や特定のタイミングでプログラムを自動起動する場所』があります。攻撃者は、ここに自分のコードや起動エントリを仕込むことで『電源を落としても消えない侵入』を実現します。

主な仕込み場所は、Linuxとwindowsで分かれます。

ここが永続化の“見つけにくさ”の核心です。攻撃者が追加するのは、たいてい“ごく普通に見える1行”。cronに1行、スタートアップに1項目——どれも、もともと並んでいる正規のエントリと見た目がそっくりです。だから「なんか怪しいものはないか?」と眺めるだけでは、まず見抜けない。“正規のものを全部知っている”状態でないと、紛れ込んだ偽物には気づけないんです。

そもそもOSには、『起動時や決まった時間に、自動でプログラムを動かす』仕組みが、もともとたくさん備わっています。バックアップやアップデートなど、正規の運用に必要だからです。攻撃者は、新しい怪しい仕組みを作るのではなく、この“もとからある自動起動の仕組み”に、自分のプログラムをこっそり登録します。正規の機能に紛れ込むからこそ、ぱっと見では気づきにくい。これが永続化の巧妙なところです。

図解:通常運用と永続化が仕込まれた状態

正規の自動起動リストと、攻撃者が1行追加した永続化済みリストの比較図
ベースラインがあれば、追加された1行に気づける。

通常のサーバには既知の自動起動エントリがあります。攻撃者が新しいエントリを追加すると、見た目は普通でも『余計な1行』が増えています。

店舗の点検リストに1行紛れ込ませる手口のたとえ図
毎朝の点検リストに1行紛れ込ませる手口。サーバの自動起動リストでも同じ構造。
📋 たとえるなら、毎朝の点検リスト

店の毎朝の点検リストに項目が追加されていても、忙しいと『前からあった気がする』と感じて見逃しがちです。攻撃者はこれを利用し、自動起動リストに1行こっそり付け加えます。ベースライン(正規リスト)を保存しておけば、差分を見るだけで気づけます。

ここで覚える用語:ベースライン
正常状態の設定・ファイル・自動起動エントリ等を記録した『お手本』のことです。インシデント時に『差分があるか』を比較することで、永続化や設定改ざんを早く見つけられます。

だからこそ効くのが『ベースライン』です。これは“平常時のお手本”——「このサーバの自動起動は、本来これだけ」というリストを、きれいな状態のうちに保存しておくこと。すると、あとで比べたとき「お手本には無い1行が増えてる!」と一発で分かります。怪しさを“目利き”で探すのではなく、“お手本との違い”で機械的に見つける。間違い探しも、正解の絵があれば一瞬ですよね。それと同じ発想です。

永続化の代表的な場所

永続化が仕込まれる場所は、OSごとに“定番スポット”があります。Linuxならcronやsystemd、Windowsならスケジュールタスクやレジストリの起動キー。守る側は、まずこの“定番の隠れ場所”を一通り知っておくことが大事です。攻撃者の常套手段を知っていれば、巡回すべき場所が分かります。

Linux / Windows の主要パス

Linux(cron/systemd/.bashrc)・Windows(Scheduled Task/Run Key/WMI)・クラウド(Lambda等)の主要永続化パスを示したカード型インフォグラフィック
Linux・Windows・クラウドそれぞれに代表パスがある。守りはベースライン+差分監視+EDR/Sysmon。
  • Linux: cron / crontab / systemd unit / .bashrc 系 / /etc/ld.so.preload / SSH authorized_keys
  • Windows: Scheduled Task / Run/RunOnce レジストリ / Services / WMI Event Subscription / Startup フォルダ
  • 共通: 起動スクリプト / アプリケーションのプラグイン / クラウド側の Lambda・Cloud Functions など

WMI Event Subscriptionなど、目立たない場所に仕込まれる例も多くあります。EDRやSysmonのような『振る舞いの可視化』ツールがあると、これらの発見が早くなります。

永続化が、インシデント対応で特に重要なのには理由があります。それは“駆除の最後の関門”だから。マルウェア本体を消し、入口の穴をふさいでも、永続化の仕掛けが1つでも残っていれば、攻撃者はまた戻ってきます。「直したはずなのに、また侵入される」——その多くは、この消し残しが原因。だから対応の締めくくりには、必ず「永続化を全部消したか?」の確認が欠かせないんです。

練習は、自分のサーバや端末の“自動起動リスト”を、洗いざらい書き出してみることです。WindowsならAutorunsという定番ツールが便利。これを“ベースライン”として保存しておけば、次に何か追加されたとき、すぐ気づけます。攻撃ではなく、自分のPCの“正規の地図づくり”ですね。もちろん他人の環境で永続化を仕込むのは厳禁です。

CTFでやってみよう:自動起動を棚卸し

やってみよう / 自分の環境・CTFのみ

自分のサーバ/端末で、自動起動エントリを書き出してベースライン化しよう

目的は実際の駆除ではなく、『何が正規』を把握することです。

  1. Linuxサーバで systemctl list-unit-filescrontab -lls /etc/cron.* 等を確認
  2. SSH の authorized_keys や、 /etc/ld.so.preload を点検
  3. Windows で Autoruns(Sysinternals)を実行し、起動エントリを一覧化
  4. WMI Event Subscription を Get-WMIObject -Namespace root/subscription -Class __EventConsumer 等で確認
  5. 結果を『ベースライン』として保存し、定期的に差分を比較する
他者のサーバ上で永続化を仕込む試行は絶対にやめてください。確認は自分の検証環境だけです。

守りの考え方は、ここまでの話で半分見えています。会話で締めましょう。

結局、怪しい自動起動を見つけて消せばいいんでしょ?

方向は合ってる。でも“怪しい”を見抜くのが、実はいちばん難しいんだ。攻撃者の1行は、正規の1行とそっくりに作られているからね。だから順番が逆で、『まず“正規のもの”を全部リスト化(ベースライン)しておく』のが先。そうすれば、あとは“リストに無いもの”を疑えばいい。さらにEDRやSysmonで「新しいタスクが作られた」という動き自体を見張れば、仕込まれた瞬間に気づける。“怪しさ探し”から“差分検知”へ——これが永続化対策の発想転換だよ。

守る側なら、「ベースライン+差分監視+EDR」

永続化対策の核は、「正規の自動起動の一覧をベースライン化」「差分を継続監視」「振る舞いをEDR/Sysmonで可視化」の3点です。

守るための基本チェック
  • 自動起動エントリ(cron/systemd/Scheduled Task/Run Key/WMI)を一覧化してベースラインを保管
  • 構成管理ツール(Ansible/Chef/Puppet等)で意図しない変更を検出
  • EDR・Sysmonでプロセス起動・WMI操作・スケジュールタスク作成イベントを監視
  • OSやアプリケーションのパッチ適用後にベースラインを更新
  • 侵害が疑われたら、永続化エントリを必ず確認してから駆除完了とする
  • SSH authorized_keys や ldso.preload など『盲点』も巡回対象に

『何が正規』を知らないと、見つけられないんだね。

そう。ベースラインがないと、永続化は埋もれやすい。普段からの『正規の地図』作りが効くよ。

ここまでをひと言で言うと、永続化対策は『正規の地図を持ち、差分で気づく』。攻撃者は正規の仕組みに紛れて居座るので、“怪しいものを探す”戦法では埋もれてしまいます。平常時にベースラインを取り、変化を監視し、駆除のときは消し残しがないか確認する。地味ですが、これが“また戻ってくる攻撃者”を断つ確実な道です。

まとめ:『正規の地図』を持って差分で気づく

今回のポイント
  • 永続化は再起動後も動く場所に仕込まれる
  • Linux/Windowsそれぞれの主要パスを把握する
  • 守りはベースライン+差分監視+EDR/Sysmon
  • 侵害駆除では『永続化を消したか』を必ず確認する

今日の持ち帰りは『お掃除の最後は、永続化チェックで締める』です。侵入対応で本体を消して安心しがちですが、本当の完了は“居座りの仕掛けを全部消したか”を確かめてから。そのためには、平常時の“正規の地図(ベースライン)”が何より頼りになります。きれいなうちに地図を作っておく——それが、いざという時のいちばんの備えです。

次回は、攻撃者が痕跡を消すための検知回避・痕跡消去を扱います。EDR Bypass・ログ消去・LOLBinsの発想と防御を見ていきましょう。

次に読みたい記事

参考資料

記事URLをコピーしました