<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* 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).
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.
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.
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.
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:
[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).
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.
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`.
## 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>
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)
* 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!
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.
## Armazenamento de senhas e segredos externos <a href="#storage-of-passwords-and-external-secrets" id="storage-of-passwords-and-external-secrets"></a>
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 :)
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/).
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:
Esta ferramenta que escrevi pode ser usada offline para descriptografar segredos do Artifactory: [ArtifactoryDecryptor](https://github.com/gquere/ArtifactoryDecryptor).
* 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
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong><ahref="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).