ApacheBlaze
Atualizado
Isto foi útil?
Atualizado
Isto foi útil?
Adentre o universo ApacheBlaze, um mundo de jogos arcade de clique. Há rumores de que ao jogar certos jogos, você tem a chance de ganhar um grande prêmio. Entretanto, antes de se divertir, você precisará solucionar o puzzle.
De acordo com a descrição do desafio, aparentemente temos que encontrar um grande prêmio escondido em algum jogo.
Na página inicial, temos uma listagem de jogos disponíveis.
Repare no último jogo, Click topia. Sua descrição sugere que ele nos dará a flag. Como o desafio fornece o código-fonte, podemos analisar para tentar entender o que acontece ao clicar nesse jogo.
Perceba que a aplicação realiza uma validação utilizando o cabeçalho X-Forwarded-Host
. Caso a requisição contenha esse cabeçalho com o valor dev.apacheblaze.local
, a flag é retornada como JSON. Podemos, então, tentar realizar a requisição passando esse cabeçalho como parâmetro:
Infelizmente essa tentativa não foi bem sucedida. Podemos alterar o código-fonte e fazer a aplicação retornar os cabeçalhos após uma requisição.
E observe que o valor do cabeçalho X-Forwarded-Host
contém o valor que informamos, porém são adicionados outros dois endereços separados por vírgula. Esse comportamento se deve por conta de a aplicação ter configurado um proxy reverso através do Apache. Podemos encontrar essa configuração definida dentre os arquivos do código-fonte:
Por conta disso, a cada redirecionamento do proxy (de acordo com a documentação do mod_proxy) o Apache inclui o endereço de origem no cabeçalho X-Forwarded-Host
. Ou seja, precisamos de uma forma de contornar isso e definir o endereço do host como o endereço que a aplicação valida (dev.apacheblaze.local
).
Pesquisando um pouco, foi possível encontrar uma vulnerabilidade de HTTP Request Smuggling (CVE-2023-25690) associada ao Apache, e a versão que é utilizada na aplicação (2.4.55) ainda não recebeu a correção. Dessa forma, podemos explorar essa vulnerabilidade para definir o valor do cabeçalho Host
como dev.apacheblaze.local
. Isso é possível prefixando a URL da requisição com o payload malicioso, que seria o seguinte:
Esse payload aproveita dos caracteres CR e LF para inserir uma outra requisição junto da requisição genuína.
Prefixando a requisição genuína com o payload malicioso, obtemos o seguinte resultado:
Essa requisição é interpretada pelo back-end como duas requisições, da seguinte forma:
Perceba que ao trocarmos os caracteres URL-encoded por sua versão não codificada, obtemos o resultado acima. Isso faz com que a aplicação processe a primeira requisição injetando o valor do cabeçalho Host
no cabeçalho X-Forwarded-For
, que nesse caso fica como dev.apacheblaze.local
e retorna a flag com sucesso.