Breaking Grad

Breaking grad

Breaking grad é uma challenge medium, da categoria web do hackthe box​

Baixei o código fonte da aplicação, mas antes disso, vamos dar uma olhada na página web:Basicamente temos uma view com uma única ação, onde enviamos um nome via json e recebemos uma resposta se passamos ou não:

Tentei mudar o nome para nomes aleatórios, como "Portas", "", "teste", e todos retornam o mesmo response Vamos olhar o código fonte então:​Temos uma aplicação NodeJS em um container, e a flag com um nome aleatório na raíz, nada demais na configuração do container:

Vamos olhar então o index.js em routes, que tem os endpoints da aplicação e podemos ver quais ações podemos fazer no app

Podemos ver aqui as rotas e como elas executam as nossas requisições, inclusive a requisção principal do site, em /api/calculate​

Uma rota que me chamou atenção foi a /debug/:action/ vamos ver o que essa função DebugHelper.execute faz:

Basicamente, a função verifica qual comando foi escolhido (version/ram), e dependendo de qual comando for, abre um processo no sistema operacional e executa um comando pré definido, seria o alvo perfeito para um RCE ou command injection, mas não temos controle sobre nenhum parâmetro da execução do processo, então sem problema de segurança aqui😢

Vamos olhar a rota api/calculate, como ela define se passamos ou não no exame, começando pelas funções de studentHelper

Basicamente verifica por nomes e se a grade é maior ou igual a 10, nesse `if` aqui:

Então, se enviarmos um nome que não tenha Baker ou Purvis, e um "paper" maior ou igual a 10, a resposta será que passamos, como vemos aqui:

​Mas ainda nenhum problema de segurança grave aqui, vamos olhar em ObjectHelper.clone:

Essa função faz um merge de um objeto passado por parâmetro para outro, copiando todas as chaves e valores, porém o objeto copiado é um objeto controlado pelo atacante, então temos um possível Prototype Pollution aqui!! Porém a aplicação implementou um mecanismo de segurança contra esse ataque, validando as chaves e removendo os "__proto__".

Prototype pollution não é uma vulnerabilidade que tenho muito conhecimento, então li esses 3 links para entender melhor como funciona e como posso explorar:

Com esse entendimento melhor sobre a vulnerabilidade, vi que existem outras formas de sobrescrever uma propriedade, sem ser usando o __proto__, podemos sobrescrever o objeto global Object.prototype.SomeThing, que fará com que todos os objetos possuam o atributo "SomeThing"

Para validar essa ideia, eu pensei que se eu pudesse adicionar um atributo "paper = 10" em todos os objetos, e fizer um post para /api/calculate, sem passar o valor de paper, a resposta irá ser "Passed", já que esse objeto student vai herdar o "paper" de object.prototype.paper, que podemos sobrescrever, usei como referência esse link: https://book.hacktricks.xyz/pentesting-web/deserialization/nodejs-proto-prototype-pollution/prototype-pollution-to-rce#poisoning-constructor.prototype

aqui temos os testes:

E funcionou!! Passamos um student sem o atributo paper, e mesmo assim o resultado foi "Passed", pois agora conseguimos criar ou sobrescrever métodos e atributos globalmente!

Agora tenho duas hipóteses em mente:

  • Usar alguma payload de RCE para conseguir alguma reverse shell e ler a flag

  • Achar algum atributo ou método do objeto Response do express para criar ou sobrescrever, já que esse objeto é usado em um processo do sistema, e talvez consiga algum RCE com isso:​

​A primeira ideia parece menos complexa, então vou tentar ela primeiro, lendo algumas referências sobre RCE com prototype pollution, podemos fazer um poisoning na variável env quando o node abre um processo no sistema operacional, que é exatamente o que temos no debug! Então podemos fazer o seguinte, coloquei a seguinte payload no post request

E entrando em /debug/version (para ativar o process que envenenamos via env) , recebo como response `curl: not found`

Isso quer dizer que conseguimos um RCE, mas o binário curl não existe no sistema operacional, mas tendo o RCE podemos pegar a flag!

Achei o desafio bem legal, achei mais fácil do que médium como está descrito. Depois que percebemos a possibilidade do prototype pollution, as pesquisas que fazemos sobre essa falha retornam ótimos materiais para aprendermos como se explora ela e a partir daí não é tão difícil aplicar no desafio, mas é bem divertido de fazer!

Last updated