Cross-Site Scripting

Anotações e resumos dos meus estudos pessoais para a eWPTX

O XSS acontece quando o browser renderiza conteúdos não confiáveis em um ambiente confiável. Se o conteúdo enviado contém uma linguagem dinâmica como HTML, JavaScript ou outro, o conteúdo vai ser executado

XSS pode ser dividido em duas categorias principais:

  • Server-side

  • Client-side (impacta somente o cliente)

Reflected XSS

Ocorre quando dados não confiáveis são enviados pelo usuário para uma aplicação web e a resposta é imediatamente mostrada na tela

Exemplo de um código PHP com esse tipo de vulnerabilidade:

Normalmente para explorar essa vulnerabilidade é preciso criar links e envolve um pouco de engenharia social

Persistent XSS

Também conhecido como Stored XSS, é similar ao reflected mas o seu conteúdo fica armazenado na aplicação web, dessa forma todos os visitantes da página são atingidos

Exemplo de um código PHP com esse tipo de vulnerabilidade:

DOM XSS

É um tipo de XSS que acontece somente do lado do cliente. É muito similar ao Reflected XSS mas não interage com o servidor

Exemplo de um código vulnerável:

https://code.google.com/archive/p/domxsswiki/

Universal XSS

Diferente dos outros 3 tipos de XSS o universal XSS não explora falhas em códigos, mas em browsers, extensões e plugins

XSS Attacks

Para que o XSS pode ser usado?

O XSS pode ser usado para obter cookies de usuários, afim de obter informações sensíveis ou realizar um roubo de sessão

Normalmente o roubo de cookies possui 3 passos:

  • Script Injection

  • Cookie recording

  • Logging

Script Injection

Onde é injetado o payload malicioso que vai enviar os cookies para o nosso servidor. O DOM nos permite acessar os cookies usando o document.cookie

Para realizar o roubo do cookie, é preciso enviar o conteúdo do document.cookie para algum lugar onde temos controle, isso pode ser feito usando um script como:

Opções para diferentes cenários:

São os próximos passos, nesse momento já temos uma requisição sendo feita enviando as informações para o nosso servidor, então é necessário tratar e armazenar essa informação

Seguindo o exemplo anterior, podemos supor que temos um script PHP escutando no nosso servidor e esse script vai armazenar as informações em um arquivo

Uma forma simples se fazer esse script é:

Em um cenário onde temos um único servidor recebendo informações de múltiplas páginas web que foram exploradas, é necessário deixar o código um pouco mais complexo, adicionando algumas informações a mais que ajudaram a identificar a origem

Uma forma mais avançada:

Netcat

Se precisa de uma solução rápida para receber os cookies, pode ser usado o netcat

Bypassing HTTPOnly Flag

XST (antiga)

Até agora os ataques vistos só funcionam se o cookie não estiver com a flag HTTPOnly setada.

Para burlar essa proteção foi inventado uma técnica chamada de XST (Cross-Site Tracing), mas ela não funciona mais hoje

Basicamente, essa técnica utiliza o método TRACE para enviar uma requisição contendo o cookie. Ela está descrita nesse paper: https://www.cgisecurity.com/whitehat-mirros/wh-whitepaper_xst_ebook.pdf

CVE-2012-0053

Outra forma de conseguir cookies com HTTPOnly é explorando uma vulnerabilidade no servidor. Um exemplo disso ocorre com o Apache HTTP Server 2.2.x

Essa vulnerabilidade pode ser explorada usando ferramentas como o BeEF ou a POC: https://gist.github.com/pilate/1955a1c28324d4724b7b

BeEF's Tunneling Proxy

Uma alternativa é usar o browser da vitima como um proxy. Basicamente, explorando o XSS podemos usar o browser da vitima para fazer requisições para a aplicação

Para criar esse proxy, podemos usar a ferramenta BeEF, que nos ajuda a realizar hookes no browser. Essa técnica é interessante pois nos permite bypassar não só o HTTPOnly mas todas as proteções de validações usadas pelo servidor

Defacements

O XSS também pode ser usado para fazer defacements em sites. Podemos dividir esse tipo de ataque em 2 categorias: Persistente e Não persistente. Ele também pode ser usado como parte de ataques mais sofisticados

Phishing

É possível utilizar o XSS para fazer ataques de phishing

Normalmente em um ataque de phishing, precisamos criar um site fake ou clonar algum site que será o alvo do ataque, e dentro desse site fake o atacante coloca o código que ele quer executar. Porém, se um site é vulnerável a XSS isso não é necessário, porque é possível colocar o código malicioso no próprio site alvo

Como exemplo, podemos imaginar cenário onde queremos pegar informações de um site. Esse site possui um formulário onde os usuários enviam suas informações, então podemos usar o XSS para modificar o comportamento desse formulário para enviar as informações para o atacante

Cloning a Website

Se quiser clonar um site para colocar o payload podemos usar algumas ferramentas:

  • Wget

  • BeEF

  • Site Cloner

Um ponto muito importante para o sucesso no ataque de phishing após clonar um site é a escolha do domínio que será usado. Quanto mais parecido com o original melhor. Um exemplo de escolha pode ser o seguinte:

Para ajudar na escolha do domínio, podemos usar a ferramenta URLCrazy

Keylogging

As vezes é interessante saber o que a vitima está digitando no site, com isso podemos, por exemplo, ler conversas, senhas, número de cartão de crédito, etc...

Existem diversas formas de se fazer isso. Podemos fazer isso com um simples JavaScript

Também é possível criar um keylogging usando ferramentas como:

  • BeEF (Event logger)

  • Metasploit (http_javascript_keylogger)

Keylogging with Metasploit

O metasploit possui o módulo auxiliar "http_javascript_keylogger", que é um script mais avançado que o mostrado acima. Ele cria o payload para ser injetado na página vulnerável

Ele também tem a opção de criar uma página demo para teste usando o:

Keylogging with BeEF

O Event Logger do BeEF é uma versão melhorada dos exemplos acima, pois ele consegue mostrar teclas especiais. Para entender a diferença, vamos imaginar que um usuário tem o login e senha iguais, então ele escreve o login copia e cola no campo de senha, normalmente no keylogger veríamos somente as teclas: acv.

Já com o BeEF conseguimos ver [Ctrl] a - [Ctrl] c - [Ctrl] v

Network Attacks

Com XSS é possível descobrir informações da rede interna explorando o navegador da vitima

IP Detection

Antes de realizar qualquer atividade na rede interna, é interessante levantar informações sobre o ambiente, como por exemplo IPs da rede interna

Existe uma abordagem usada para isso que utiliza o WebRTC do HTML5 para descobrir o endereço de IP local. Uma POC dessa técnica está aqui: http://net.ipcalf.com

Outra POC também foi criada adicionando algumas informações a mais, e pode ser encontrada aqui: https://web.archive.org/web/20160406083801/https://dl.dropboxusercontent.com/u/1878671/enumhosts.html

Essa técnica não funciona em todos os navegadores, para saber se o navegador alvo pode executar essa funcionalidade você pode fazer uma consulta aqui: http://caniuse.com/#feat=rtcpeerconnection

Ainda é possível realizar outras atividades como: descobrir hosts na rede, enumerar portas abertas nos hosts, entre outros. Porém as técnicas utilizadas variam bastante quanto a certeza do resultado

Last updated