Identificando vulnerabilidade em um ambiente web, controlando o painel VESTA, elevação de privilégio e evoluindo para AWS.
Seja bem vindo! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Este é um writeup da Semana do Web Hacking (SWH), evento realizado em 03/05/2021 à 09/05/2021 - um evento criado e organizado pela Crowsec que, precedeu as inscrições para o curso "Web Hacking na Prática 2.0". Neste evento o criador e instrutor Carlos Vieira ("Cadu"), lança uma série de videos (free) durante uma semana ensinando sobre a base do web hacking e como os ataques funcionam. Nesta versão da "Semana do Web Hacking" foi voltada a prática de um pentest web, onde o Cadu produziu uma "box" pública simulando um ambiente real alocado na nuvem, para a prática junto aos vídeos da SWH conduzindo um pentest. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Como foi produzido um ambiente real e público, com o propósito de servir para um teste de invasão (pentest) e autorizado pelo proprietário, podemos praticar e tentar ownar o host seguindo passo a passo junto ao vídeo de cada dia da semana ou também para testar os conhecimentos. Decidi seguir pelo método de "quebrar a cabeça" antes de assistir aos vídeos. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Segue um pouco de como foi chegar à "nuvem"... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
O nosso alvo para este evento em questão é: https://cshosting.crowsec.com.br/. De acordo com o nome do site e seu conteúdo, o host se apresenta como uma empresa provedora de servidores virtuais. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Utilizando as ferramentas host, dig, whois e nslookup, foi possível identificar o seu IP e através dele foi identificado que está hospedado na AWS. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Enumeração | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
NMAP | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Algumas informações apresentadas no scan foram removidas [...] para esta publicação com o intuito de uma visualização menos "poluída" do scan | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Analizando o resultado do scan, podemos checar manualmente o que está sendo servido em cada porta. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Às porta padrões de serviços de e-mail (25 e 2525) retornam o IP interno na AWS. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
...ip-172-31-40-185.ec2.internal... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
A porta 8083 (http) leva para área de administração, solicitando credenciais e apresentando também a logo da VESTA: https://cshosting.crowsec.com.br:8083/login/ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Pesquisando sobre a VESTA, em seu site oficial, é possível observar que provêm um painel de controle grátis para CS apresentando integração com a AWS e outros serviços utilizados, apresentados em sua página principal. Com isso, podemos nos atentar aos serviços e tecnologias utilizadas pela VESTA que podem estar em produção em nosso alvo. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Interagindo com alguns serviços apresentados no scan, foi constatado que: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Navegando pela "Área do Cliente", foi possível encontrar algumas páginas para interagir: https://cshosting.crowsec.com.br/login/public/ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Após realizar um registro, o site redireciona para a página https://cshosting.crowsec.com.br/login/public/home e apresenta a seguinte mensagem: "Bem vindo ao portal do cliente, o administrador irá liberar o seu acesso em breve!". Observando então, que o registro do usuário é verificado pelo administrador ou outro usuário com mais privilégios. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Levantando mais informações sobre o funcionamento da página web, foi encontrado e observado que pela página server.php (https://cshosting.crowsec.com.br/login/server.php) também é possível seguir para área de autenticação e registro, porém a página se apresenta "quebrada". Também foi possível enumerar outras páginas através de seu código fonte. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Através do brute force de diretórios, foram encontradas algumas páginas interessantes como: phpmyadmin, .git e .gitignore. O que possibilitou mapear outras páginas existentes no serviço web. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Verificando as páginas apresentadas na lista ".gitignore", foi encontrado em produção a página /vendor (retornou código 403) e .env (cod. 200). Através da página .env (https://cshosting.crowsec.com.br/login/.env) foram expostos o usuário, a senha do banco de dados e também dados da API, indicando através desta estrutura o uso do framework Laravel: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Utilizando também a ferramenta/scanner de vulnerabilidades "Larasploit" voltado para o Framework Laravel - codada pelo criador deste lab - é positivado a vulnerabilidade no Laravel que também identificou a página .env (que já encontramos anteriormente) trazendo a key da API e os cookies recebidos. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Utilizando a opção "inspecionar" do navegador, também podemos identificar estes Cookies atribuídos. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Testando os dados obtidos do banco de dados em alguns serviços enumerados anteriormente, foi possível acessar o bd remotamente com sucesso através da porta padrão do mysql. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Foi possível realizar um dump da tabela "users" da base de dados "admin_cliente" e encontramos os 2 primeiros usuários que pareciam "oficiais/propositais", pois os usuários restantes eram provavelmente de outros atacantes desta semana SWH e os 2 primeiros continham crowsec/cshosting como domínio de e-mail... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Apesar de comprometer o banco de dados obtendo um acesso remoto com credenciais válidas, o que não deveria ser possível de forma alguma em um ambiente real, não consegui avanços por aqui. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Buscando por formas de exploração, foi encontrado um exploit público para exploração do Laravel utilizando o API Token exposto no .env - CVE-2018-15133 -> https://github.com/aljavier/exploit_laravel_cve-2018-15133 Através deste exploit foi obtido um RCE. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tentando evoluir para uma shell reversa, foi identificado a existencia do netcat, porém não mantinha uma reverse shell estável. Utilizado então, o próprio bash para a conexão reversa. Mas para isso, foi utilizado a ferramenta netcat para aguardar a conexão reversa através da porta 6666: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ao receber a shell reversa, foi utilizado alguns comandos para melhorar a interatividade da shell e, obter assim, mais eficiência durante a exploração | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Neste momento, comandos como clear,setas e atalhos do teclado funcionarão nesta shell no alvo. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Acessando o painel de controle VESTA: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
============ Dica das aulas | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Buscando por alteração de senhas do usuário administrativo do painel de controle VESTA, foi encontrado um tutorial com alguns métodos para alteração da senha atual. Como não temos a senha do usuário "admin", podemos utilizar o método 2 descrito no tutorial com o comando: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visualizado com sudo -l é possível a execução como root para os arquivos existentes em /usr/local/vesta/bin/ e dentro deste diretório do VESTA, há diversos comandos/scripts para execução, dentre eles o "v-change-user-password". | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Executado como root e alterado a senha do usuário admin com sucesso. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Dessa forma, foi possível acessar o painel de controle administrativo via web utilizando a nova senha. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Obs.: interessante observar também que, este comando não altera somente a senha do painel de controle, mas sim do usuário existente na máquina. Contudo, podemos assumir que o painel de controle do VESTA utiliza-se das informações do usuário na máquina. ============ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mesmo com shell no servidor, o nível de acesso ainda é restrito e podemos ir além! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Escalação de privilégio | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Rodando o comando sudo -l, podemos observar as permissões de execução em nível root (através do sudo) configuradas para este usuário atual. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Conforme o retorno do comando, todos os arquivos existentes no diretório /usr/local/vesta/bin/ (da VESTA) podem ser executados com sudo. Criado então, um script em bash (napo.sh) chamando o binário /bin/bash no diretório usr/local/vesta/bin/. Através desse script, quando executado, será retornado uma shell bash com privilégios a nível do usuário que o executou. O que se encaixa perfeitamente em nosso cenário, pois o comando sudo é permitido para este diretório, então conseguiremos executar este script como um usuário de nível root. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Atribuído permissão de execução com chmod e em seguida foi executado o script napo.sh utilizando o comando sudo. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Escalado privilégio para root com sucesso! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Agora com privilégio elevado para root, podemos acessar o banco de dados como root e, com isso dumpar o BD completamente, diferente do acesso "restrito" ao banco de dados que obtivemos anteriormente. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Neste momento estamos com o nível de usuário administrador (root) deste servidor. Uma situação grave, pois com este nível de acesso qualquer tarefa pode ser realizada, comprometendo gravemente o servidor. Apesar de imaginar já ter chegado ao fim, ainda não chegamos lá... | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ownando na nuvem | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
============ -- Aprendido com Kadu - Aula 04 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Por meio da faze de recon, foi observado que o site está hospedado na AWS. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
A AWS por padrão, utiliza-se do endereço IP local 169.254.169.254 válido somente a partir da instância) para acesso aos metadados. Por meio disso, com o acesso a máquina ownada, podemos acessar estes dados existentes da instância na AWS. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Utilizado o cURL para testar a comunicação e acesso as versões da API. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Normalmente, a versão mais interessante a ser consultada é a "latest" - curl 169.254.169.254/latest/ - para acessar as últimas alterações da máquina. Ao realizar a requisição para 169.254.169.254/latest/ apresentaram 2 opções de acesso aos dados atuais: "meta-data" e "user-data" - user-data: referente aos dados/permissionamento dos usuários na instância - meta-data: referente aos dados/permissionamentos da instância/máquina. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Por padrão, as "funções" configuradas da instância se localizam no diretóro "iam/" e explorando este diretório é encontrado a função "CSHOSTING" contendo os tokens de acesso de API. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Com estes dados em mãos, foi utilizado a cli da AWS (pip3 install awscli) para comunicar diretamente com a AWS utilizando os tokens. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mas antes desse acesso à AWS, é necessário a configuração dos tokens na cli para que consigamos comunicar. Para isso, podemos seguir algumas instruções disponibilizadas pela AWS para esta configuração. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Utilizado os comandos a seguir para configurar os tokens na awscli: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Esta chave não tem privilégio para comunicar com o IAM. Mas a AWS é composta por outros serviços que podemos testar o privilégio desta chave que já temos. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Dessa forma, executamos o comando "ls" diretamente na Amazon S3 listando os buckets ("pastas/diretórios") existentes nesta conta (dos tokens configurados). | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Levando em conta o nosso alvo, o bucket "cshosting-privatebucket" tem um nome bem instigante, correto? Que tal checar o seu conteúdo?! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Pudemos encontrar somente o arquivo "swh.txt" neste bucket, sigla que se remete ao evento "Semana do Web Hacking". | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Será o "grand finale"? | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Copiado o arquivo para minha máquina e visualizado o seu conteúdo! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Sim, foi o "grand finale" o/ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Conclusão | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Hoje muitos dados e ambientes são hospedados em nuvem, o que proporciona mais praticidade por contornar a necessidade de recursos físicos/locais, porém além da praticidade é necessário uma atenção a mais voltada para a sua configuração e proteção destes dados armazenados e disponibilizados em nuvem, pois uma falha pode comprometer todo o ambiente, podendo por exemplo, comprometer mais de um domínio existente. O que ressalta a importância destas skills para o Blue Team, como também para o Red Team/pentesters - "root pode não ser o limite". | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Como sempre, a Semana do Web Hacking foi demais, mas esta versão foi a melhor com certeza (em minha opinião) e pude aprender com ela! Se você curte e se interessa pela área de Web Hacking, recomendo não perder a Semana do Web Hacking o/ | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Obrigado por ter chegado até aqui! | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Espero que tenha gostado e sinta-se livre para pingar um café :D | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
naP0 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Give a Pingback | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Referênciais: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
https://www.interserver.net/tips/kb/reset-vestacp-admin-password | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html |