Linuxの権限昇格:初期潜入からルート権限奪取まで

Security tutorial - IT technology blog
Security tutorial - IT technology blog

5分でできるセキュリティヘルスチェック

数年前、私のステージングサーバーの一つで、わずか6時間のうちに42,000回以上のSSHログイン失敗が記録されました。これは大きな警鐘でした。攻撃者が一度 www-data のような低権限ユーザーとしてシステムに侵入すると、そこで止まることはありません。彼らはルート権限(root)を狙います。ルート権限があれば、/etc/shadow をダンプしたり、永続的なルートキットをインストールしたり、ファイルシステム全体を消去したりすることが可能になるからです。

ターミナルを開いてください。攻撃者が最初の30秒で何を見ているかを確認するために、次の3つのコマンドを実行してみましょう。

# すぐにsudoの権限を確認
sudo -l

# SUIDビットが設定されたバイナリを検索(ルートシェルの候補)
find / -perm -4000 -type f 2>/dev/null

# 悪意のあるペイロードを隠すための、誰でも書き込み可能なフォルダを特定
find / -writable -type d 2>/dev/null

もし sudo -lNOPASSWD: ALL を返した場合、セキュリティは実質的にゼロです。そこにリストされているバイナリはすべて、頂点へ登るための梯子になり得ます。

攻撃者はどのように梯子を登るのか

権限昇格は決して魔法のようなものではありません.通常、それは管理者の怠慢な設定や、2年前の未修正のバグを攻撃者が利用しているに過ぎません。私の経験では、内部侵入の90%が以下の4つのベクトルのいずれかを悪用しています。

1. SUID権限の罠

Set User ID (SUID) は、プログラムをファイルの所有者(通常はroot)の権限で実行できるようにするものです。passwd のようなツールには必要ですが、誤って適用されると非常に危険です。2024年の監査中、私は find コマンドにSUIDビットが有効になっているシステムを見つけました。

攻撃者は、わずか一行で全ての制限を回避できます。

find . -exec /bin/sh -p \; -quit

このコマンドは、rootのUIDを継承したシェルを起動します。独自のスクリプトにSUIDを追加する前に、GTFOBins を確認してください。これは、ハッカーが制限された環境から抜け出すために使用するUnixバイナリの不可欠なデータベースです。

2. Sudoの設定ミス

利便性はセキュリティの敵です。管理者は時間を節約するために、特定のツールにsudo権限を与えがちです。例えば、ユーザーに python3 をrootとして実行することを許可すれば、それは王国の鍵を渡したも同然です。

sudo python3 -c 'import os; os.system("/bin/sh")'

これで即座にルートシェルが手に入ります。また、LD_PRELOAD 変数にも注意してください。もし /etc/sudoersenv_keep += "LD_PRELOAD" が設定されていると、攻撃者は正当なコマンドが実行される前に悪意のあるライブラリをシステムに強制的にロードさせることができます。

3. カーネルの脆弱性

古いカーネルはローカル攻撃者にとって宝の山です。「Dirty COW」(CVE-2016-5195)や「PwnKit」(CVE-2021-4034)のような有名なエクスプロイトは、ユーザーが読み取り専用ファイルを上書きすることを可能にします。これらはメモリ破壊のバグを標的にし、権限を持つプロセスに直接コードを注入します。常にバージョンを確認してください。

uname -a
cat /etc/os-release

4. 誰でも書き込み可能なCronジョブ

/etc/crontab 内のCronジョブは、通常root権限で実行されます。もしroot所有のCronジョブが、誰でも書き込み可能なディレクトリにあるスクリプトを実行しているなら、勝負ありです。攻撃者はそのスクリプトにリバースシェルを追記するだけで済みます。次にタイマーが作動したとき、サーバーはフル権限で攻撃者のマシンに接続し返します。

プロアクティブな監視と検知

単一のサーバーであれば手動の監査で十分でしょう。しかし、クラスターを管理している場合は、自動化された可視化が必要です。私はインフラを監視するために、特定の3つのツールを使用しています。

LinPEASによる自動化

LinPEAS は、あらゆるプロのペンテスターにとって定番のスクリプトです。緩いファイル権限から設定ファイル内の隠しパスワードまで、あらゆるものをスキャンします。まずはコンテナ環境やテスト環境で実行し、何がフラグとして立てられるかを確認してください。

# 最新のスキャンを直接実行
curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh

pspyによるリアルタイム追跡

root権限なしで、今何が起きているかを確認する必要がある場合があります。pspy はプロセスが開始されるのを監視します。単に /proc ディレクトリをスキャンし続けるのではなく、inotify APIコールを使用します。これにより、短命なCronジョブや、脆弱性がある可能性のある自動クリーンアップスクリプトを捕捉するのに最適です。

Auditd: フライトレコーダー

Linux監査デーモン(auditd)は、機密ファイルの変更を追跡するための最も信頼できる方法です。私は常に /etc/shadow/etc/sudoers にルールを設定しています。管理者以外のユーザーがこれらに触れると、原因となった正確なPID and ユーザーIDを含むログエントリが生成されます。

# sudoersの書き込みや属性変更を監視
sudo auditctl -w /etc/sudoers -p wa -k alert_sudoers

実際に効果のある要塞化戦術

単にバグを直すだけでなく、環境そのものを変えましょう。これらは、私が新しい本番環境を構築する際に必ず行う具体的なステップです。

  • sudoeditを使用する: ユーザーに vimnano のようなフル機能のテキストエディタをsudo経由で実行させてはいけません。彼らは簡単にシェルへエスケープできてしまいます。代わりに sudoedit を使用してください。これは編集用にファイルのテンポラリコピーを作成します。
  • 実行不可(No-Exec)パーティション: /tmp/dev/shmnoexec フラグ付きでマウントします。これにより、攻撃者が通常書き込み権限を持っている唯一のフォルダで、ダウンロードしたエクスプロイトバイナリを実行することを防げます。
  • コンパイラの削除:
    Share: