The Sticker Shop

Difficulty: Easy


Tryhackme Room


Walkthrough - Youtube Habemus Shell


  • Em breve.

Introduction


  • O desafio consiste em conseguirmos ler a flag que fica em:

    • http://10.10.50.176:8080/flag.txt

Exploration


Port 8080 - http


  • A página é bem simples, contendo apenas um menu para a Home (/) e Feedback(/submit_feedback)

  • O caminho para leitura da flag.txt não temos permissão de acessar

  • Vamos focar no único caminho que temos um INPUT de dados, que é o /submit_feedback

  • Sempre que enviamos qualquer coisa, ele retorna a mesma mensagem.

  • Tentamos algumas técnicas de XSS mas não tivemos muito sucesso.

  • Se não há mudança e nenhuma vulnerabilidade aparente, talvez estejamos em um cenário de Blind

  • Vamos tentar pelo /submit_feedback técnicas focadas em XSS Blind

  • Para isso, vou precisar prover um servidor web na minha máquina, uma forma rápida e simples de fazer isso é com o python

  • Agora podemos tentar uma abordagem simples de XSS Blind, tentando fazer ele trigar nesse servidor web

  • Observe que conseguimos com sucesso que o servidor alvo, realizasse um GET no nosso servidor web. E com isso confirmamos que esta vulnerável a XSS Blind.

Crafting Javascript Exploit


  • Agora precisamos ler o conteúdo da flag.txt

  • Temos uma informação importante da descrição do desafio:

  • Se tudo esta rodando no mesmo host, então podemos tentar acessar internamente como 127.0.0.1:8080 e tentar ler a flag.

  • Vamos criar um script em javascript, para que ele possa fazer um GET em localhostarrow-up-right nesse endpoint e enviar o conteúdo para o nosso servidor web python, pela vulnerabilidade de XSS Blind que descobrimos.

  • Há diversas formas de criar esse payload, uma das que eu mais gosto é com o XMLHttpRequest() , ela é uma API Nativa do javascript, que serve basicamente para permitir a comunicação com servidores Web.

Explicação Simples sobre o payload


  • Instanciar:

    • A primeira linha, var xhr = new XMLHttpRequest();, cria um "mensageiro". Ele será usado para buscar informações de algum lugar.

  • Configurar o mensageiro:

    • A função xhr.open() diz para onde o mensageiro deve ir, o que ele deve fazer e se deve esperar a resposta.

    • Os argumentos de xhr.open() são como as instruções para o mensageiro:

      • 'GET': Diga para o mensageiro "vá buscar algo".

      • 'http://127.0.0.1:8080/flag.txt': Esse é o endereço onde o mensageiro vai buscar a informação.

      • true: Isso significa "vá buscar, mas não precisa esperar parado para a resposta, continue fazendo outras coisas". Isso é chamado de pedido assíncrono.

  • O que fazer quando ele voltar:

    • O código em xhr.onload é como dizer: "Quando você voltar com a resposta, aqui está o que deve fazer com ela."

    • Nesse caso, ele pega a resposta (xhr.responseText), que seria o conteúdo do flag.txt, e manda para o servidor do atacante (10.13.74.92:8888).

  • Enviar o mensageiro:

    • xhr.send() é o comando final que manda o mensageiro sair para buscar os dados.

Flag.txt


  • Quando enviamos conseguimos o resultado da Flag.txt

  • Observe que ele esta em URL Encode graças a função nativa do javascript encodeURIComponent que inserimos no nosso código. Isso nos garante que qualquer caractere especial no conteúdo da flag(espaços ou símbolos) seja transformado em algo que possa ser enviado na URL, ou seja, URL ENCODE.

  • Se decodarmos vamos ter o valor da flag correto, vamos usar o CyberChef para nos ajudar:

Last updated