githubEditar

Precious

https://app.hackthebox.com/machines/Precious

Summary

Precious é um alvo baseado em Linux que hospeda um utilitário de conversão de "Web para PDF" alimentado por Ruby on Rails. A avaliação identificou uma vulnerabilidade crítica de Injeção de Comando (CVE-2022-25765) na biblioteca subjacente pdfkit, permitindo a Execução Remota de Código (RCE) não autenticada.

A enumeração pós-exploração descobriu credenciais em texto claro armazenadas na configuração do Bundler de um usuário, facilitando a movimentação lateral via SSH. A escalação final de privilégios para root foi alcançada explorando uma falha de Desserialização Insegura em um script Ruby com permissões sudo que utilizava YAML.load em entradas não confiáveis.

MITRE Kill Chain

1

Reconnaissance

A enumeração de rede identificou um servidor web na porta TCP 80 e SSH na porta 22.

2

Resource Development

Um servidor HTTP local foi preparado para hospedar payloads maliciosos para a aplicação alvo recuperar.

3

Initial Access

Uma vulnerabilidade de Injeção de Comando no pdfkit v0.8.6 foi explorada via um parâmetro de URL modificado para executar código arbitrário.

4

Execution

Um reverse shell baseado em Ruby foi executado para estabelecer uma sessão interativa como o usuário ruby.

5

Credential Access

Credenciais em texto claro para um usuário secundário foram coletadas do arquivo .bundle/config.

6

Lateral Movement

As credenciais comprometidas foram usadas para autenticação via SSH como o usuário henry.

7

Privilege Escalation

Um script Ruby rodando com privilégios sudo foi explorado via Desserialização Insegura (YAML), resultando no comprometimento total como root.


Reconnaissance

#attack/T1018 #attack/T1595_001 #attack/T1592

Initial Connectivity & Host Discovery

A avaliação começou com uma verificação de conectividade com o host alvo. Uma solicitação de eco ICMP foi transmitida para verificar o status do ativo e estimar o sistema operacional subjacente.

attacker> ping -c 1 10.10.11.189
PING 10.10.11.189 (10.10.11.189) 56(84) bytes of data.
64 bytes from 10.10.11.189: icmp_seq=1 ttl=63 time=208 ms

--- 10.10.11.189 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 208.190/208.190/208.190/0.000 ms
circle-info

O valor TTL (Time to Live) de 63 indica que o alvo é provavelmente um sistema baseado em Linux, considerando um salto único no trânsito.

Network Service Enumeration

Para mapear a superfície de ataque, uma varredura completa de portas TCP foi realizada utilizando o nmap. A varredura visou todas as 65.535 portas para identificar listeners abertos.

Após a identificação das portas abertas, uma varredura de serviço direcionada foi executada para determinar informações de versão e a saída de scripts padrão para os serviços descobertos nas portas 22 e 80.

A enumeração de serviços revelou o seguinte:

  • Port 22: Executando OpenSSH 8.4p1 no Debian Bullseye.

  • Port 80: Executando nginx 1.18.0. O servidor web respondeu com um redirecionamento 302 Found para http://precious.htb/, indicando uma configuração baseada em virtual host.

Virtual Host Configuration

Para interagir com a aplicação web, o arquivo local /etc/hosts foi atualizado para mapear o endereço IP 10.10.11.189 para o domínio precious.htb.


Web Exploitation

#attack/T1592 #attack/T1593

O perfilamento tecnológico inicial foi realizado em http://precious.htb para identificar a stack web subjacente e potenciais pontos de interesse.

circle-info

O alvo é uma aplicação Ruby on Rails servida via Phusion Passenger 6.0.15 por trás de um Nginx 1.18.0.

A aplicação é um utilitário "Convert Web Page to PDF" rodando em Ruby-on-Rails e servido pelo Phusion Passenger 6.0.15. Uma busca por vulnerabilidades conhecidas no Phusion Passenger foi conduzida; no entanto, os resultados foram principalmente exploits legados para Windows e não se alinharam com o ambiente alvo.

Functional Analysis: PDF Conversion

A interface web apresenta um único campo de entrada solicitando uma URL para ser convertida em um documento PDF.

Para testar o comportamento da aplicação e verificar sua capacidade de alcançar recursos externos, um servidor HTTP local foi iniciado, e uma requisição foi iniciada a partir da interface web.

A aplicação recuperou com sucesso o conteúdo do servidor controlado pelo atacante e renderizou um PDF.

Vulnerability Discovery: PDFKit Command Injection

#attack/T1190 #owasp/A05_2025 #owasp/A03_2025

A análise do PDF gerado foi realizada utilizando exiftool para identificar o mecanismo de processamento no backend.

circle-info

A aplicação utiliza pdfkit v0.8.6 para a geração de documentos.

Pesquisas adicionais sobre esta versão revelaram a CVE-2022-25765arrow-up-right, uma vulnerabilidade crítica de injeção de comando (command injection). A falha existe porque a biblioteca não higieniza adequadamente os parâmetros de URL. Se uma URL contiver uma query string com um comando shell codificado (por exemplo, usando crases ou $( )), o pdfkit executa o comando durante o processo de conversão.

triangle-exclamation

Exploit Verification

Uma prova de conceito foi executada para confirmar a vulnerabilidade tentando ecoar o usuário atual dentro do conteúdo do PDF. Ao passar o comando como um parâmetro de URL, o backend executou a instrução e incorporou a saída no documento resultante.

O PDF resultante confirmou a execução bem-sucedida, exibindo o nome de usuário ruby.

Remote Code Execution (RCE)

A vulnerabilidade no pdfkit v0.8.6 foi aproveitada para obter execução arbitrária de código. Ao injetar comandos shell nos parâmetros de URL passados para o gerador de PDF, o sistema subjacente executou os comandos sob o contexto do usuário ruby.

A validação inicial foi realizada executando os comandos id e hostname -I. O payload foi estruturado para satisfazer o requisito de URL enquanto escapava da lógica pretendida pela aplicação.

O documento PDF resultante renderizou a saída dos comandos, confirmando o contexto de execução e a configuração de rede.

circle-check

Reverse Shell Establishment

Para obter uma sessão interativa, um payload de reverse shell baseado em Ruby foi criado. Um listener HTTP não foi necessário para o payload final; em vez disso, um listener Netcat foi preparado na máquina do atacante para interceptar a conexão de saída.

O listener capturou a conexão com sucesso, fornecendo um shell remoto.

Shell Stabilization

O shell inicial foi atualizado para um TTY totalmente interativo para suportar recursos avançados de terminal e controle de jobs.


Lateral Movement

#attack/T1552_001 #attack/T1021_004

Internal Enumeration

Após o estabelecimento do acesso inicial, o sistema foi enumerado em busca de arquivos sensíveis e contas de usuário adicionais.

A enumeração identificou um usuário secundário, henry. A investigação do diretório home do usuário ruby revelou um diretório oculto .bundle contendo um arquivo de configuração.

circle-exclamation

As credenciais descobertas foram utilizadas para autenticar como henry via SSH, garantindo acesso mais persistente e acesso aos dados do usuário.

Após o login bem-sucedido, a flag de usuário foi recuperada do diretório home.


Privilege Escalation

#attack/T1548_003 #attack/T1210 #owasp/A08_2025

Sudo Rights Enumeration

O usuário henry foi encontrado com privilégios sudo específicos que permitiam a execução de um script Ruby como o usuário root sem fornecer uma senha.

O script alvo, /opt/update_dependencies.rb, pertence ao root e não pode ser escrito pelo usuário atual.

Vulnerability Analysis: Insecure Deserialization

A análise do código-fonte Ruby revelou uma falha de segurança crítica na maneira como o script lida com arquivos de configuração externos.

O script utiliza o método YAML.load para processar um arquivo chamado dependencies.yml. Como o script usa um caminho relativo e o método inseguro load (ao contrário de safe_load), um atacante pode controlar o fluxo de execução colocando um arquivo YAML malicioso no diretório de trabalho atual.

triangle-exclamation

Vulnerability Verification (PoC)

Para verificar a vulnerabilidade, um dependencies.yml malicioso foi criado usando uma conhecida gadget chain de desserialização Ruby YAMLarrow-up-right. O primeiro teste visou executar o comando id como root.

A saída confirmou que o comando foi executado com sucesso com privilégios de root.

Root Access Acquisition

O payload foi modificado para estabelecer um ponto de acesso persistente de nível root. Especificamente, o binário bash foi copiado para o diretório /tmp e recebeu permissões SUID.

Executar o script novamente acionou o payload:

Ao executar o binário bash SUID com a flag -p (preservar permissões), um shell root foi obtido.

circle-check

Atualizado