Linux におけるマルウェアの兆候特定

CompTIABeginner
オンラインで実践に進む

はじめに

この実験 (Lab) では、Linux システム上で潜在的なマルウェアの兆候を特定するための基本的な技術を学びます。一連の実践的な演習を通して、標準的なコマンドラインユーティリティを使用して一般的な侵害の兆候を調査し、システム監視と基本的なフォレンジック分析のスキルを習得します。

まず、疑わしいプロセスアクティビティを観察し、悪意のあるプロセスを示唆する可能性のある異常な CPU およびメモリの急増を検出する方法を学びます。次に、ファイルシステムに焦点を当て、不正なアクティビティの重要な兆候である予期しないファイルの作成や変更を検出します。最後に、システムログを分析して、セキュリティ侵害を示唆する可能性のある異常なエントリを見つける練習をします。

CPU およびメモリのスパイクに対する疑わしいプロセスアクティビティの観察

このステップでは、標準的な Linux ユーティリティを使用して、システムプロセスにおける異常な CPU およびメモリ使用量のスパイクを監視する方法を学びます。リソースの突然の高消費は、悪意のあるソフトウェア (マルウェア)、侵害されたプロセス、または誤動作しているアプリケーションの一般的な兆候です。リアルタイム監視には top コマンドを、高負荷シナリオを安全にシミュレートするには stress ツールを使用します。すべてのコマンドは ~/project ディレクトリから実行します。

まず、stress ユーティリティをインストールする必要があります。これはベースシステムには含まれていないためです。apt-get パッケージマネージャーを使用します。最初のコマンドはパッケージリストを更新し、2 番目のコマンドは stress をインストールします。

sudo apt-get update
sudo apt-get install stress -y

インストールが完了したら、システムの現在のプロセスを表示してベースラインを確立しましょう。top コマンドは、実行中のシステムのリアルタイムで動的なビューを提供します。

top

画面全体にわたって継続的に更新されるインターフェイスが表示されます。%CPU (CPU 使用率) および %MEM (メモリ使用率) の列に注意してください。通常の条件下では、ほとんどのプロセスでこれらの値は比較的低いはずです。q キーを押して top を終了し、コマンドプロンプトに戻ります。

top - 16:20:42 up 10 min,  1 user,  load average: 0.00, 0.01, 0.00
Tasks: 100 total,   1 running,  99 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1987.2 total,    845.5 free,    450.1 used,    691.6 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   1355.2 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0  169404  13120   8484 S   0.0   0.6   0:01.55 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd
...

次に、CPU を大量に消費する疑わしいプロセスをシミュレートしましょう。stress を使用して、60 秒間 CPU 負荷の高い計算を実行するワーカーを 1 つ開始します。末尾の & はコマンドをバックグラウンドで実行し、ターミナルを引き続き使用できるようにします。

stress --cpu 1 --timeout 60 &

バックグラウンドジョブのプロセス ID (PID) が表示されます。次に、すぐに top を再度実行して影響を観察します。

top

今回は、stress プロセスがリストの上位またはその近くに表示され、%CPU の値が 100.0 に近くなっているはずです。これは、CPU を占有しているプロセスを探す際にまさに注目すべき点です。60 秒後、stress プロセスは自動的に終了します。q を押して top を終了します。

次に、大量のメモリを消費するプロセスをシミュレートしましょう。このコマンドは、256 メガバイトのメモリを割り当て、それを 60 秒間保持するワーカーを 1 つ開始します。

stress --vm 1 --vm-bytes 256M --timeout 60 &

ここでも、すぐに top を実行して影響を確認します。

top

top の出力で stress プロセスを見つけます。今回は、%CPU は低いですが、%MEM の値は他のプロセスよりも大幅に高くなり、さらなる調査に値する異常なリソース消費を示しています。q を押して終了します。

予期しないファイルの作成と変更の検出

このステップでは、ファイルの予期しない作成や変更など、疑わしいファイルシステムアクティビティを検出する方法を学びます。攻撃者は、永続性の確立、悪意のあるペイロードの保存、またはシステム設定の改ざんのために、ファイルを頻繁に作成または変更します。ここでは、2 つの強力なコマンドラインツールを使用します。find は変更時間に基づいてファイルを検索し、inotifywait はディレクトリイベントのリアルタイム監視を実行します。すべての操作は ~/project ディレクトリで行います。

まず、find コマンドを使用して最近変更されたファイルを検索しましょう。これは定期的なセキュリティ監査に役立ちます。監視用のサンプル設定ファイルを作成します。

echo "SERVER_IP=192.168.1.1" > ~/project/app.conf

find コマンドは、さまざまな基準に基づいてファイルを検索できます。ここでは、「最終更新時間 (分前)」を意味する -mmin フラグを使用します。次のコマンドは、現在のディレクトリ (.) で過去 5 分以内に変更されたすべてのファイルを見つけます。

find . -mmin -5

出力には、作成したファイルが表示されます。

./app.conf

次に、攻撃者がこの設定ファイルを変更するシナリオをシミュレートします。

echo "MALICIOUS_PAYLOAD=..." >> ~/project/app.conf

find コマンドを再度実行すると、変更時間が更新されているため、再び app.conf が表示されます。これは最近の変更を検出する簡単な方法です。次に、攻撃者が新しいファイルをドロップするシナリオをシミュレートします。これは一般的な戦術です。

touch ~/project/hidden_script.sh

もう一度 find コマンドを実行します。

find . -mmin -5

これで、変更されたファイルと新しく作成されたファイルの両方がリストされ、最近のファイルシステムアクティビティを迅速に特定する方法を示しています。

./app.conf
./hidden_script.sh

find は監査には役立ちますが、リアルタイムのアラートは提供しません。そのためには inotify-tools を使用できます。まず、パッケージをインストールする必要があります。

sudo apt-get update
sudo apt-get install -y inotify-tools

コアコマンドは inotifywait で、ファイルまたはディレクトリを特定のイベントに対して監視できます。~/project ディレクトリに対してモニターモード (-m) で実行しましょう。& はバックグラウンドプロセスとして実行するため、ターミナルを引き続き使用できます。

inotifywait -m ~/project &

コマンドは現在、サイレントに変更を監視しています。トリガーするためにいくつかの操作を実行しましょう。まず、ファイルを作成します。

echo "new file" > ~/project/new_file.txt

すぐに inotifywait から CREATE イベントを報告する出力が表示されます。

/home/labex/project/ CREATE new_file.txt

次に、ファイルを変更します。

echo "modified" >> ~/project/new_file.txt

ツールは MODIFY イベントを報告します。

/home/labex/project/ MODIFY new_file.txt

最後に、ファイルを削除します。

rm ~/project/new_file.txt

DELETE イベントが表示されます。このリアルタイムフィードバックは、セキュリティオペレーションセンター (SOC) や自動侵入検知システムにとって非常に価値があります。

/home/labex/project/ DELETE new_file.txt

バックグラウンドの監視プロセスを停止するには、pkill コマンドを使用できます。

pkill inotifywait

findinotifywait の両方を使用してファイルシステム変更を検出することに成功しました。

異常なエントリのシステムログ分析

このステップでは、システムログを分析して不審なアクティビティの証拠を見つける方法を学びます。システムログはシステムで発生したイベントの記録であり、セキュリティ監視およびフォレンジック分析のための重要な情報源です。ここでは、ユーザーログインと権限昇格を追跡する認証ログに焦点を当て、greptailjournalctl などの標準的な Linux ツールを使用して異常なエントリを見つけます。

Linux システムのほとんどのシステムログは /var/log ディレクトリに保存されています。セキュリティにとって最も重要なものの 1 つは /var/log/auth.log で、SSH ログインや sudo コマンドの使用を含む、認証関連のイベントを記録します。まず、tail コマンドを使用してこのファイルの最後の数行を表示することから始めましょう。このファイルは保護されているため、sudo が必要です。

sudo tail /var/log/auth.log

タイムスタンプ付きのエントリのシリーズが表示されます。フォーマットには通常、日付、時刻、ホスト名、ログを生成したプロセス、およびイベントメッセージが含まれます。

Jul 22 10:30:01 labex-vm sudo:    labex : TTY=pts/0 ; PWD=/home/labex/project ; USER=root ; COMMAND=/usr/bin/tail /var/log/auth.log
Jul 22 10:30:01 labex-vm sudo: pam_unix(sudo:session): session opened for user root(uid=0) by (uid=1000)
Jul 22 10:30:01 labex-vm sudo: pam_unix(sudo:session): session closed for user root

次に、一般的な不審なイベントであるログイン試行の失敗をシミュレートしましょう。攻撃者は、有効なユーザー名または一般的なユーザー名のパスワードを推測しようとすることがよくあります。存在しないユーザー名 (baduser) を使用して、自分のマシン (localhost) に SSH 接続しようとすることでこれをシミュレートできます。

ssh baduser@localhost

システムはパスワードを要求します (パスワードとして labex を使用できます)。ユーザーが存在しないため、どのパスワードでも失敗します。パスワードプロンプトをキャンセルしてターミナルに戻るには、Ctrl+C を押すだけです。接続試行は失敗しますが、ログに記録されます。

次に、証拠を探しましょう。「failed」という単語を含む行を auth.log ファイルからフィルタリングするために grep コマンドを使用できます。これにより、失敗したイベントを迅速に特定できます。

sudo grep "Failed" /var/log/auth.log

出力には、SSH ログイン試行の失敗のログエントリが明確に表示され、これは潜在的な侵入試行の強力な兆候です。

Jul 22 10:35:15 labex-vm sshd[12345]: Failed password for invalid user baduser from 127.0.0.1 port 54321 ssh2

systemd を使用する最新の Linux システムには、journald によって管理される中央ログシステムもあります。journalctl コマンドは、これらのログをクエリするための強力なツールです。sshd プロセスからのメッセージを検索して、同じログイン失敗イベントを見つけましょう。システムレベルのログを表示するには sudo を使用する必要があることに注意してください。

sudo journalctl | grep sshd

出力 (矢印キーを使用し、終了するには q を押します) をスクロールすると、同じ「Failed password」エントリが見つかります。さらに簡単にするために、メッセージの優先度でフィルタリングできます。journalctl に、sshd サービスのエラー (err) 以上の優先度を持つエントリのみを表示するように要求しましょう。

sudo journalctl -p err | grep sshd

このコマンドは、エラー状態のみの非常に簡潔なビューを提供し、問題の特定に非常に効率的です。

-- Logs begin at ... --
Jul 22 10:35:15 labex-vm sshd[12345]: Failed password for invalid user baduser from 127.0.0.1 port 54321 ssh2
-- End of logs --

最後に、logger コマンドを使用してメッセージを手動でログに挿入することもできます。これは、カスタムスクリプトがセキュリティイベントを報告するのに役立ちます。カスタムアラートを作成しましょう。

logger "SECURITY-ALERT: Unauthorized file access detected in /etc"

次に、システムログでこの特定のアラートを検索します。

sudo grep "SECURITY-ALERT" /var/log/syslog

カスタムメッセージが表示され、独自の監視をシステムのログ機能と統合する方法を示しています。

Jul 22 10:40:00 labex-vm labex: SECURITY-ALERT: Unauthorized file access detected in /etc

これで、システムログを操作して異常で潜在的に悪意のあるアクティビティの証拠を見つけるための基本を学びました。

まとめ

この実験では、Linux システムでマルウェアの兆候を特定するための基本的な技術を学びました。異常な CPU およびメモリのスパイクを監視するために top コマンドを使用して、疑わしいプロセスアクティビティを観察する方法を練習しました。実際のシナリオでこれがどのように見えるかを理解するために、stress ユーティリティを使用して高負荷プロセスをシミュレートし、そのリソース消費を通常のシステムベースラインと比較しました。

この実験では、侵害されたシステムの一般的な兆候である予期しないファイルの作成と変更を検出する方法についても説明しました。最後に、異常なエントリのシステムログを分析する方法を学びました。これは、不正アクセス、設定ミス、またはその他のセキュリティ関連イベントの証拠を見つけるための重要なスキルです。