Jenkins Security
Informações Básicas
O Jenkins é uma ferramenta que oferece um método direto para estabelecer um ambiente de integração contínua ou entrega contínua (CI/CD) para quase qualquer combinação de linguagens de programação e repositórios de código-fonte usando pipelines. Além disso, automatiza várias tarefas de desenvolvimento rotineiras. Embora o Jenkins não elimine a necessidade de criar scripts para etapas individuais, ele fornece uma maneira mais rápida e robusta de integrar toda a sequência de ferramentas de compilação, teste e implantação do que se pode facilmente construir manualmente.
pageBasic Jenkins InformationEnumeração não autenticada
Para procurar páginas interessantes do Jenkins sem autenticação como (/people ou /asynchPeople, que lista os usuários atuais), você pode usar:
Verifique se você pode executar comandos sem precisar de autenticação:
Sem credenciais, você pode olhar dentro do caminho /asynchPeople/ ou /securityRealm/user/admin/search/index?q= para nomes de usuário.
Você pode ser capaz de obter a versão do Jenkins a partir do caminho /oops ou /error
Vulnerabilidades Conhecidas
Login
Nas informações básicas, você pode verificar todas as formas de fazer login no Jenkins:
pageBasic Jenkins InformationRegistrar
Você poderá encontrar instâncias do Jenkins que permitem que você crie uma conta e faça login dentro dela. Tão simples assim.
Login SSO
Também, se a funcionalidade/plugins SSO estiverem presentes, você deve tentar fazer login na aplicação usando uma conta de teste (ou seja, uma conta de teste do Github/Bitbucket). Truque de aqui.
Bruteforce
O Jenkins carece de política de senha e mitigação de força bruta de nome de usuário. É essencial fazer força bruta nos usuários, já que senhas fracas ou nomes de usuário como senhas podem estar em uso, até mesmo nomes de usuário invertidos como senhas.
Password spraying
Utilize este script python ou este script powershell.
Bypass de Lista Branca de IP
Muitas organizações combinam sistemas de gerenciamento de controle de origem (SCM) baseados em SaaS como GitHub ou GitLab com uma solução CI interna, auto-hospedada como Jenkins ou TeamCity. Essa configuração permite que os sistemas CI recebam eventos de webhook dos fornecedores de controle de origem SaaS, principalmente para acionar trabalhos de pipeline.
Para alcançar isso, as organizações colocam em lista branca as faixas de IP das plataformas SCM, permitindo que elas acessem o sistema CI interno via webhooks. No entanto, é importante notar que qualquer pessoa pode criar uma conta no GitHub ou GitLab e configurá-la para acionar um webhook, potencialmente enviando solicitações para o sistema CI interno.
Abusos Internos do Jenkins
Nesses cenários, vamos supor que você tenha uma conta válida para acessar o Jenkins.
Dependendo do mecanismo de Autorização configurado no Jenkins e da permissão do usuário comprometido, você pode ou não ser capaz de realizar os ataques a seguir.
Para mais informações, verifique as informações básicas:
pageBasic Jenkins InformationListando usuários
Se você acessou o Jenkins, pode listar outros usuários registrados em http://127.0.0.1:8080/asynchPeople/
Despejando builds para encontrar segredos em texto claro
Utilize este script para despejar saídas de console de build e variáveis de ambiente de build para, esperançosamente, encontrar segredos em texto claro.
Roubo de Credenciais SSH
Se o usuário comprometido tiver privilégios suficientes para criar/modificar um novo nó do Jenkins e as credenciais SSH já estiverem armazenadas para acessar outros nós, ele poderia roubar essas credenciais criando/modificando um nó e configurando um host que registrará as credenciais sem verificar a chave do host:
Normalmente, você encontrará as credenciais SSH do Jenkins em um provedor global (/credentials/
), então você também pode extraí-las como faria com qualquer outro segredo. Mais informações na seção Extração de segredos.
RCE no Jenkins
Obter um shell no servidor Jenkins dá ao atacante a oportunidade de vazar todos os segredos e variáveis de ambiente e de explorar outras máquinas localizadas na mesma rede ou até mesmo coletar credenciais de nuvem.
Por padrão, o Jenkins executará como SYSTEM. Portanto, comprometê-lo dará ao atacante privilégios do SYSTEM.
RCE Criando/Modificando um projeto
Criar/Modificar um projeto é uma maneira de obter RCE no servidor Jenkins:
pageJenkins RCE Creating/Modifying ProjectRCE Executando um script Groovy
Você também pode obter RCE executando um script Groovy, que pode ser mais furtivo do que criar um novo projeto:
pageJenkins RCE with Groovy ScriptRCE Criando/Modificando Pipeline
Você também pode obter RCE criando/modificando um pipeline:
pageJenkins RCE Creating/Modifying PipelineExploração de Pipeline
Para explorar pipelines, você ainda precisa ter acesso ao Jenkins.
Construir Pipelines
Pipelines também podem ser usados como mecanismo de construção em projetos, nesse caso pode ser configurado um arquivo dentro do repositório que conterá a sintaxe do pipeline. Por padrão, /Jenkinsfile
é usado:
Também é possível armazenar arquivos de configuração de pipeline em outros locais (em outros repositórios, por exemplo) com o objetivo de separar o acesso ao repositório e o acesso ao pipeline.
Se um atacante tiver acesso de escrita sobre esse arquivo, ele poderá modificá-lo e potencialmente acionar o pipeline sem nem mesmo ter acesso ao Jenkins. É possível que o atacante precise burlar algumas proteções de branch (dependendo da plataforma e dos privilégios do usuário, elas podem ser burladas ou não).
Os gatilhos mais comuns para executar um pipeline personalizado são:
Pull request para o branch principal (ou potencialmente para outros branches)
Push para o branch principal (ou potencialmente para outros branches)
Atualizar o branch principal e aguardar até que seja executado de alguma forma
Se você é um usuário externo, não espere criar um PR para o branch principal do repositório de outro usuário/organização e acionar o pipeline... mas se estiver mal configurado, você poderia comprometer totalmente empresas apenas explorando isso.
Pipeline RCE
Na seção anterior de RCE, já foi indicada uma técnica para obter RCE modificando um pipeline.
Verificação de Variáveis de Ambiente
É possível declarar variáveis de ambiente em texto claro para todo o pipeline ou para estágios específicos. Essas variáveis de ambiente não devem conter informações sensíveis, mas um atacante sempre poderia verificar todas as configurações do pipeline/Jenkinsfiles:
Vazamento de segredos
Para obter informações sobre como os segredos são geralmente tratados pelo Jenkins, consulte as informações básicas:
pageBasic Jenkins InformationAs credenciais podem ser restritas a provedores globais (/credentials/
) ou a projetos específicos (/job/<project-name>/configure
). Portanto, para extrair todas elas, você precisa comprometer pelo menos todos os projetos que contêm segredos e executar pipelines personalizados/envenenados.
Existe outro problema, para obter um segredo dentro do env de um pipeline, você precisa saber o nome e o tipo do segredo. Por exemplo, se você tentar carregar um segredo usernamePassword
como um segredo string
, você receberá este erro:
Aqui está a maneira de carregar alguns tipos comuns de segredos:
No final desta página, você pode encontrar todos os tipos de credenciais: https://www.jenkins.io/doc/pipeline/steps/credentials-binding/
A melhor maneira de extrair todas as senhas de uma vez é comprometendo a máquina Jenkins (executando um shell reverso no nó integrado, por exemplo) e então vazando as chaves principais e as senhas criptografadas e descriptografando-as offline. Saiba mais sobre como fazer isso na seção Nodes & Agents e na seção Pós-Exploração.
Gatilhos
De documentação: A diretiva triggers
define as formas automatizadas pelas quais o Pipeline deve ser reativado. Para Pipelines integrados com uma fonte como GitHub ou BitBucket, triggers
podem não ser necessários, pois a integração baseada em webhooks provavelmente já estará presente. Os gatilhos atualmente disponíveis são cron
, pollSCM
e upstream
.
Exemplo de Cron:
Verifique outros exemplos na documentação.
Nós e Agentes
Uma instância do Jenkins pode ter diferentes agentes em execução em máquinas diferentes. Do ponto de vista de um atacante, o acesso a diferentes máquinas significa diferentes credenciais de nuvem potenciais para roubar ou diferente acesso à rede que poderia ser abusado para explorar outras máquinas.
Para mais informações, consulte as informações básicas:
pageBasic Jenkins InformationVocê pode enumerar os nós configurados em /computer/
, geralmente encontrará o Nó Incorporado
(que é o nó em execução no Jenkins) e potencialmente mais:
É especialmente interessante comprometer o nó incorporado porque ele contém informações sensíveis do Jenkins.
Para indicar que você deseja executar o pipeline no nó Jenkins incorporado, você pode especificar dentro do pipeline a seguinte configuração:
Exemplo completo
Pipeline em um agente específico, com um acionador cron, com variáveis de ambiente de pipeline e estágio, carregando 2 variáveis em uma etapa e enviando um shell reverso:
Pós-Exploração
Metasploit
Segredos do Jenkins
Você pode listar os segredos acessando /credentials/
se tiver permissões suficientes. Note que isso apenas listará os segredos dentro do arquivo credentials.xml
, mas os arquivos de configuração de build podem ter mais credenciais.
Se você pode ver a configuração de cada projeto, também pode ver lá os nomes das credenciais (segredos) sendo usados para acessar o repositório e outras credenciais do projeto.
A partir de Groovy
pageJenkins Dumping Secrets from GroovyDo disco
Estes arquivos são necessários para descriptografar os segredos do Jenkins:
secrets/master.key
secrets/hudson.util.Secret
Tais segredos geralmente podem ser encontrados em:
credentials.xml
jobs/.../build.xml
jobs/.../config.xml
Aqui está uma regex para encontrá-los:
Descriptografar segredos do Jenkins offline
Se você tiver despejado as senhas necessárias para descriptografar os segredos, use este script para descriptografar esses segredos.
Descriptografar segredos do Jenkins a partir do Groovy
Criar novo usuário administrador
Acesse o arquivo config.xml do Jenkins em
/var/lib/jenkins/config.xml
ouC:\Program Files (x86)\Jenkins\
Procure pela palavra
<useSecurity>true</useSecurity>
e altere a palavratrue
parafalse
.sed -i -e 's/<useSecurity>true</<useSecurity>false</g' config.xml
Reinicie o servidor Jenkins:
service jenkins restart
Agora acesse o portal do Jenkins novamente e o Jenkins não solicitará credenciais desta vez. Navegue até "Gerenciar Jenkins" para definir a senha do administrador novamente.
Habilite a segurança novamente alterando as configurações para
<useSecurity>true</useSecurity>
e reinicie o Jenkins novamente.
Referências
Última actualización