Lojinha da HawkSec

A HawkSec resolveu entrar no ramo do varejo e abriu a Lojinha da HawkSec, cheia de swags exclusivos pra quem curte um estilo hacker. De brinde, jogamos a flag desse desafio no catálogo. Mas não se engane: não é só clicar e comprar. A loja tem seus truques, e só os mais espertos vão conseguir colocar a flag no carrinho. Seu dinheiro chega lá? Ou vai precisar de algo a mais pra levar esse item pra casa?

  • Autor: @jackskelt

  • O desafio foi inspirado no Shopping Time do TUCTF24. Temos writeup aqui

Ao acessar o site, vemos que é uma loja online da HawkSec, onde podemos buscar por produtos.

Página principal

Entretanto, temos o produto "Flag do Desafio", que ao ser acessado, recebemos o erro de Termo Proibido. O site acessa a rota /review?item=Flag do Desafio.

Produto Flag do Desafio
Termo Proibido

Analisando o código provido no desafio, temos o arquivo server.js:

Analisando o código, achamos algumas informações importantes:

  • A variável BLOCKLIST contém os itens que não podem ser acessados. No caso, o item "Flag do Desafio" está nessa lista.

  • Caso o item esteja na BLOCKLIST, a rota retorna o erro Termo Proibido.

  • A rota /review é responsável por mostrar os detalhes do produto. Ela utiliza o md5 do nome do item como id para buscar no banco de dados. O md5 é cortado para os 6 primeiros caracteres, e esse valor é utilizado para buscar o item no banco de dados.

  • Caso o item seja encontrado, a rota retorna os detalhes do produto, como nome, preço, descrição e imagem.

O md5 é uma função de hash, que transforma uma string em um valor fixo de 32 caracteres. Porém o servidor só utiliza os 6 primeiros caracteres do hash. Isso significa que existem várias strings diferentes que podem gerar o mesmo hash. Esse tipo de ataque é conhecido como collision attack.

Então por mais que o item "Flag do Desafio" esteja na BLOCKLIST, podemos ter uma string que gere os mesmos 6 primeiros caracteres do hash. Para isso, podemos utilizar o código:

Rodando o código, encontramos a colisão:

Você não precisa fazer a string começar com hawk e nem ser incremental. Basta apenas gerar uma string que tenha o mesmo hash. O código acima é apenas um exemplo de como fazer isso.

Com isso, conseguimos acessar a rota /review?item=hawk90435475, e conseguimos ver os detalhes do produto, onde a flag está localizada.

hawk{th4l3s_j0g0u_0_sh0rt_f0r4}

Flag do desafio

Atualizado