hacktricks/network-services-pentesting/pentesting-web/artifactory-hacking-guide.md

225 lines
18 KiB
Markdown
Raw Normal View History

2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
Outras formas de apoiar o HackTricks:
2022-04-28 16:01:33 +00:00
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>
2023-06-06 18:56:34 +00:00
**Este conteúdo foi retirado de** [**https://www.errno.fr/artifactory/Attacking\_Artifactory**](https://www.errno.fr/artifactory/Attacking\_Artifactory)
2020-09-28 08:31:31 +00:00
# Fundamentos do Artifactory <a href="#artifactory-basics" id="artifactory-basics"></a>
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
## Usuários e senhas padrão <a href="#default-users-and-passwords" id="default-users-and-passwords"></a>
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
As contas padrão do Artifactory são:
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
| Conta | Senha padrão | Notas |
| ------------ | ---------------------------------------------- | -------------------------------------------------------------------- |
| admin | password | conta comum de administração |
| access-admin | password (<6.8.0) ou um valor aleatório (>= 6.8.0) | usada apenas para operações de administração local |
| anonymous | | usuário anônimo para recuperar pacotes remotamente, não ativado por padrão |
2020-09-28 08:31:31 +00:00
Por padrão, não há uma política de bloqueio de senha, o que torna o Artifactory um alvo principal para ataques de preenchimento de credenciais e pulverização de senhas.
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
## Autorizações <a href="#authorizations" id="authorizations"></a>
2020-09-28 08:31:31 +00:00
Idealmente, é isso que você deve ver ao se conectar ao Artifactory:
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
![Página de login](https://www.errno.fr/artifactory/artif\_login.png)
2020-09-28 08:31:31 +00:00
Por outro lado, se você for recebido com algo mais parecido com isto:
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
![Página padrão](https://www.errno.fr/artifactory/artif\_default.png)
2020-09-28 08:31:31 +00:00
Isso significa que o "Acesso Anônimo" foi habilitado no painel de administração, o que é uma configuração comum usada para permitir que aplicações recuperem artefatos sem problemas, mas permite que você, o atacante, veja mais do que é preferível.
2020-09-28 08:31:31 +00:00
## Verificando direitos de conta <a href="#checking-account-rights" id="checking-account-rights"></a>
2020-09-28 08:31:31 +00:00
Às vezes, devido a uma má configuração, o usuário anônimo tem permissão para implantar arquivos em alguns repositórios!
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
Para verificar em quais repositórios o usuário anônimo pode implantar, use a seguinte solicitação:
```
2020-09-28 08:31:31 +00:00
curl http://localhost:8081/artifactory/ui/repodata?deploy=true
{"repoList":["artifactory-build-info","example-repo-local"]}
```
Se houver entradas `repoKey` na solicitação, o usuário anônimo pode implantar nelas, o que é realmente muito ruim. Você definitivamente deve estar autenticado para implantar quaisquer arquivos.
2020-09-28 08:31:31 +00:00
Isso pode ser generalizado para outras contas assim que você obter uma senha ou token para elas.
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
## Listando usuários <a href="#listing-users" id="listing-users"></a>
2020-09-28 08:31:31 +00:00
Por algum motivo, listar usuários é um direito reservado apenas para administradores. Encontrei uma maneira alternativa de listar usuários (aqueles que estão ativamente implantando pelo menos) que depende do valor “Implantado Por” dos artefatos:
2020-09-28 08:31:31 +00:00
![Implantado Por](https://www.errno.fr/artifactory/artif\_deployed\_by.png)
2020-09-28 08:31:31 +00:00
[Este script](https://gist.github.com/gquere/347e8e042490be87e6e9e32e428cb47a) simplesmente tenta encontrar recursivamente todos os usuários que implantaram artefatos. Note que pode levar um tempo para ser concluído se houver muitos repositórios (>1000).
```
2020-09-28 08:31:31 +00:00
./artifactory_list_users.py http://127.0.0.1:8081/artifactory
There are 23 repositories to process
Found user admin
Found user test
Found user user
Found user test_deploy
```
2023-06-06 18:56:34 +00:00
## Permissões <a href="#permissions" id="permissions"></a>
2020-09-28 08:31:31 +00:00
Aqui estão as permissões básicas e suas utilidades:
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
* Gerenciar: ?
* Excluir/Sobrescrever: interessante para pentest
* Implementar/Cache: interessante para pentest
2023-06-06 18:56:34 +00:00
* Anotar: necessário para CVE-2020-7931
* Ler: geralmente uma permissão padrão
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
# Vulnerabilidades conhecidas <a href="#known-vulnerabilities" id="known-vulnerabilities"></a>
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
Aqui está uma lista selecionada de vulnerabilidades públicas de alto impacto:
2020-09-28 08:31:31 +00:00
## CVE-2016-10036: Upload de Arquivo Arbitrário & RCE (<4.8.6) <a href="#cve-2016-10036-arbitrary-file-upload--rce-486" id="cve-2016-10036-arbitrary-file-upload--rce-486"></a>
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
[Detalhes aqui.](https://www.exploit-db.com/exploits/44543)
2020-09-28 08:31:31 +00:00
Esta está ficando um pouco antiga e é improvável que você encontre uma versão tão desatualizada do Artifactory. No entanto, é bastante eficaz, pois é uma simples travessia de diretório que permite a execução arbitrária de código no nível do Tomcat.
2020-09-28 08:31:31 +00:00
## CVE-2019-9733: Bypass de Autenticação (<6.8.6) <a href="#cve-2019-9733-authentication-bypass-686" id="cve-2019-9733-authentication-bypass-686"></a>
2020-09-28 08:31:31 +00:00
[Aviso original aqui.](https://www.ciphertechs.com/jfrog-artifactory-advisory/)
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
Em versões mais antigas do Artifactory (até 6.7.3), a conta `access-admin` usava uma senha padrão `password`.
2020-09-28 08:31:31 +00:00
Esta conta local normalmente é proibida de acessar a UI ou API, mas até a versão 6.8.6 o Artifactory poderia ser enganado para acreditar que a solicitação emanava localmente se o cabeçalho HTTP `X-Forwarded-For` fosse definido como `127.0.0.1`.
2020-09-28 08:31:31 +00:00
## CVE-2020-7931: Injeção de Template no Lado do Servidor (Artifactory Pro) <a href="#cve-2020-7931-server-side-template-injection-artifactory-pro" id="cve-2020-7931-server-side-template-injection-artifactory-pro"></a>
2020-09-28 08:31:31 +00:00
[Aviso original aqui.](https://github.com/atredispartners/advisories/blob/master/ATREDIS-2019-0006.md)
2020-09-28 08:31:31 +00:00
Aqui está uma [ferramenta que escrevi](https://github.com/gquere/CVE-2020-7931) para automatizar a exploração desta vulnerabilidade.
2020-09-28 08:31:31 +00:00
Estes são necessários para a exploração:
2020-09-28 08:31:31 +00:00
* um usuário com direitos de implementar (criar arquivos) e anotar (definir filtrados)
2020-09-28 08:31:31 +00:00
* Artifactory Pro
A vulnerabilidade é bastante simples: se um recurso implementado for definido como filtrado, ele é interpretado como um Template Freemarker, o que dá ao atacante uma janela de ataque SSTI. ![Recurso Filtrado](https://www.errno.fr/artifactory/artif\_filtered.png)
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
Aqui estão as primitivas implementadas:
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
* leituras básicas do sistema de arquivos
* escritas limitadas no sistema de arquivos
2020-09-28 08:31:31 +00:00
Estas devem ser suficientes para lhe dar execução de código remoto de várias maneiras, da mais fácil/discreta à mais difícil/barulhenta:
2020-09-28 08:31:31 +00:00
* lendo um segredo no sistema de arquivos que permite pivotar (/home/user/.bash\_history, /home/user/password.txt, /home/user/.ssh/id\_rsa …)
2023-06-06 18:56:34 +00:00
* adicionando uma chave SSH ao usuário
* implementando um .war para executar um servlet
* implementando um script de usuário Groovy do Artifactory
### Histórias de .war: Travessuras do Java renameTo() <a href="#war-stories-java-renameto-shenanigans" id="war-stories-java-renameto-shenanigans"></a>
Esta é uma pequena história de como bati a cabeça contra a parede por horas, se não dias, durante um pentest. Eu me deparei com um Artifactory desatualizado que eu sabia que era vulnerável ao CVE-2020-7931. Implementei o template SSTI do aviso original e comecei a percorrer o sistema de arquivos. Parecia que o Artifactory havia sido instalado em um local não padrão, o que não é tão incomum, pois os administradores gostam de manter partições separadas entre binários de aplicativos, dados, logs e configuração (isso é bom!). Não havia chaves SSH ou senhas no diretório home do usuário que me proporcionassem um pivot fácil, então chegou a hora de ser menos discreto e escrever no sistema de arquivos. Colocar o payload inicial (uma chave pública) no diretório de upload do Artifactory foi tranquilo, mas eu simplesmente não conseguia movê-lo para o diretório de chaves SSH. Então voltei para minha sandbox de exploração, testei novamente e veja só, funcionou bem. Então tinha que haver uma configuração diferente que me impedia de completar o método `renameTo()`. Neste ponto, é sempre uma boa ideia [verificar a documentação](https://docs.oracle.com/javase/8/docs/api/java/io/File.html#renameTo-java.io.File-) ... que claramente afirma que você não pode renomear arquivos entre diferentes sistemas de arquivos, o que eu acho que faz sentido dependendo da implementação do método, ou seja, se ele funciona a nível de inode. Arg.
Lembra do que eu disse sobre os administradores gostarem de partições? Bem, este é um caso de um administrador que, sem saber, reforçou sua configuração contra meu exploit! Então eu tive que cavar o que é essencialmente uma prisão Java para encontrar outro método que me permitisse escrever um arquivo no disco. E isso não foi nada divertido, pois eu não estou familiarizado com nada do que estava envolvido: Templates FTL, Java, Tomcat/Catalina. Rapidamente descobri que as fugas comuns de prisões Java simplesmente não funcionariam, pois instanciar novas classes era proibido. Após horas lendo a documentação das classes Java e Catalina, finalmente encontrei um método write() em um objeto ao qual eu poderia chegar. Mas ele era limitado ao caminho base da aplicação web... Então pensei em combinar a escrita em outro sistema de arquivos e o `renameTo()` através deste novo sistema de arquivos acessível para, esperançosamente, poder escrever em qualquer lugar? E meio que funcionou. Eu consegui escrever fora do diretório temporário de upload ... mas não tão longe dele, pois agora eu estava preso em outro sistema de arquivos que era o ponto de montagem para todas as coisas do artifactory: configuração, aplicativo e coisas. Então ainda não tinha chave SSH para mim.
Ok, eu poderia escrever na pasta raiz do artifactory, certamente eu poderia fazer algo aqui? Ei, o Tomcat padrão automaticamente implementa arquivos WAR escritos em seu caminho de aplicação, não é? Então usei o msfvenom para gerar um webshell JSP embalado em um arquivo WAR e testei na minha sandbox... bem, ele foi implementado, mas não me deu execução de comando. Parece que o Tomcat padrão não lida com JSPs. Ugh. Ficando cada vez mais frustrado, procurei outra maneira de executar código no Tomcat e encontrei outro método de execução usando servlets. Não consegui encontrar um payload apropriado então dane-se, estou all in neste ponto e [criei o meu próprio que você pode encontrar aqui](https://github.com/gquere/javaWebShell). Testei na sandbox, funciona, ok. Coloquei no alvo, implementa e ... nada. Acontece que havia um proxy na frente do artifactory que reescrevia todas as URLs para /artifactory. Então, mesmo que minha porta dos fundos estivesse implementada e funcionando, não havia como eu acessá-la... Se houvesse alguma execução de código remoto a ser alcançada neste ponto, teria que ser no contexto do Artifactory, não do Tomcat.
Na manhã seguinte, estou soluçando na minha mesa olhando pela última vez a documentação do Artifactory na vã esperança de uma epifania. E então as palavras mágicas "scripts Groovy" apareceram. Acontece que há uma maneira complicada de executar scripts Groovy, escrevendo-os no disco e recarregando-os através da API. Salvo no último! Então eu coloquei um reverseshell Groovy na máquina e foi o fim daquilo. Ainda desejo ter encontrado um método mais limpo que teria escrito em qualquer lugar no sistema de arquivos usando o SSTI, mas com certeza não ia voltar a desenvolver!
Felizmente, nem todos os pentests são assim :)
# Pós-Exploração <a href="#post-exploitation" id="post-exploitation"></a>
O seguinte só é útil uma vez que você tenha alcançado execução de código remoto ou leitura arbitrária de arquivo no servidor e pode ajudá-lo a pivotar para outra máquina.
2020-09-28 08:31:31 +00:00
## Armazenamento de senhas e segredos externos <a href="#storage-of-passwords-and-external-secrets" id="storage-of-passwords-and-external-secrets"></a>
2020-09-28 08:31:31 +00:00
### Senhas locais <a href="#local-passwords" id="local-passwords"></a>
2020-09-28 08:31:31 +00:00
Senhas locais do artifactory são armazenadas em forma de MD5 salgado ou bcrypt, sendo o primeiro depreciado.
2020-09-28 08:31:31 +00:00
Senhas MD5 são sempre salgadas com o valor spring codificado `{CAFEBABEEBABEFAC}`, e usam simples concatenação sem rodadas, ou seja, `hash = md5(senha + sal)`. O banco de dados diz que o sal é `CAFEBABEEBABEFAC` mas acredite em mim, é `{CAFEBABEEBABEFAC}`, eu tive dificuldade para encontrá-lo :)
2020-09-28 08:31:31 +00:00
Quebrar essas senhas MD5 requer o uso de um modo dinâmico para JtR:
```
2020-09-28 08:31:31 +00:00
cat artifactory.hashes
user:1f70548d73baca61aab8660733c7de81${CAFEBABEEBABEFAC}
john artifactory.hashes --format=dynamic_1
Loaded 1 password hash (dynamic_1 [md5($p.$s) (joomla) 256/256 AVX2 8x3])
password (user)
```
2023-06-06 18:56:34 +00:00
O outro tipo de senha bcrypt não requer nada especial, é apenas um hash bcrypt padrão:
```
2020-09-28 08:31:31 +00:00
cat artifactory_bcrypt.hashes
admin:$2a$08$EbfHSAjPLoJnG/yHS/zmi.VizaWSipUuKAo7laKt6b8LePPTfDVeW
john artifactory_bcrypt.hashes
Loaded 1 password hash (bcrypt [Blowfish 32/64 X2])
password (admin)
```
2023-06-06 18:56:34 +00:00
### Segredos remotos <a href="#remote-secrets" id="remote-secrets"></a>
2020-09-28 08:31:31 +00:00
O Artifactory pode precisar armazenar segredos para se identificar a serviços remotos. Esses segredos não são hasheados, claro, eles são armazenados criptografados no disco, com a chave ao lado deles. Existem dois tipos de segredos mencionados na [documentação oficial](https://jfrog.com/knowledge-base/what-are-the-artifactory-key-master-key-and-what-are-they-used-for/).
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
**Formato antigo (<5.9): DES-EDE**
2020-09-28 08:31:31 +00:00
TODO. [Abra uma issue se você tiver dados criptografados de exemplo](https://github.com/gquere/ArtifactoryDecryptor).
2020-09-28 08:31:31 +00:00
**Novo formato (>=5.9): Criptografia AES128-CBC, armazenada como base58**
2020-09-28 08:31:31 +00:00
Segredos externos (como senhas de servidores remotos) são encontrados nos [descritores de configuração](https://www.jfrog.com/confluence/display/JFROG/Configuration+Files#ConfigurationFiles-GlobalConfigurationDescriptor), por exemplo, `/var/opt/jfrog/artifactory/etc/artifactory.config.latest.xml` e parecem com:
```
2020-09-28 08:31:31 +00:00
<keyStorePassword>AM.25rLQ.AES128.vJMeKkaK6RBRQCUKJWvYEHUw6zs394X1CrRugvJsQGPanhMgQ5be8yjWDhJYC4BEz2KRE</keyStorePassword>
```
2023-06-06 18:56:34 +00:00
Onde:
2020-09-28 08:31:31 +00:00
* `AM` sempre denota um segredo criptografado do artifactory
2023-06-06 18:56:34 +00:00
* `25rLQ` é o identificador do segredo que deve corresponder ao identificador da chave
* `AES128` obviamente é o algoritmo utilizado
* `vJMeK...KRE` é a codificação base58 de `IV_SIZE|IV|segredo|CRC`
2020-09-28 08:31:31 +00:00
Mais segredos podem ser encontrados (tokens, backups de configuração ...) usando a seguinte expressão regular:
```
2020-09-28 08:31:31 +00:00
grep -r 'AM\..*\.AES128\.' /var/opt/jfrog/artifactory/
```
A chave está armazenada em `/var/opt/jfrog/artifactory/etc/security/artifactory.key` e parece com:
```
2020-09-28 08:31:31 +00:00
JS.25rLQ.AES128.7fcJFd3Y2ib3wi4EHnhbvZuxu
```
2023-06-06 18:56:34 +00:00
Onde:
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
* `JS` denota uma chave
* `25rLQ` é um identificador de chave único que mantém o controle de qual chave pode descriptografar quais segredos
* `AES128` obviamente é o algoritmo usado
2023-06-06 18:56:34 +00:00
* `7fcJFd3Y2ib3wi4EHnhbvZuxu` é a codificação base58 da chave e 2 bytes de CRC
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
Esta ferramenta que escrevi pode ser usada offline para descriptografar segredos do Artifactory: [ArtifactoryDecryptor](https://github.com/gquere/ArtifactoryDecryptor).
2020-09-28 08:31:31 +00:00
2023-06-06 18:56:34 +00:00
# Defendendo o Artifactory <a href="#defending-artifactory" id="defending-artifactory"></a>
2022-04-28 16:01:33 +00:00
Se você faz parte da equipe azul ou é um administrador do Artifactory, até agora você deve ter uma ideia bastante clara do que fazer:
2022-04-28 16:01:33 +00:00
* mantenha o Artifactory atualizado, especialmente quando atualizações críticas são emitidas
* implemente uma política de senha sólida (sem senhas padrão, senhas fortes obrigatórias, bloqueios), preferencialmente delegada a um LDAP externo para melhor supervisão
2023-06-06 18:56:34 +00:00
* restrinja acessos (respeite o princípio do menor privilégio), especialmente para o usuário anônimo
<details>
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>