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.txtnã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
BlindVamos tentar pelo
/submit_feedbacktécnicas focadas em XSS BlindPara 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
GETno 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:8080e tentar ler a flag.Vamos criar um script em javascript, para que ele possa fazer um GET em localhost 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 doflag.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.txtObserve que ele esta em
URL Encodegraças a função nativa do javascriptencodeURIComponentque 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