
Snoopy: Um framework distribuído de rastreamento e interceptação de dados
| || | | || || || || | | |
| _____|| |_| || _ || _ || _ || |_| |
| |_____ | || | | || | | || |_| || |
|_____ || _ || |_| || |_| || ___||_ _|
_____| || | | || || || | | |
|_______||_| |__||_______||_______||___| |___|
V0.1
"Amy, tecnologia não é intrinsecamente boa ou má. É como ela é usada. Como o Raio da Morte."
-Professor Farnsworth
Bem-vindo ao Snoopy; uma estrutura distribuída de rastreamento e perfilamento. O Snoopy é um trabalho em andamento, então sinta-se à vontade para enviar sugestões e/ou correções. Este documento descreve o uso básico. Para entender um pouco mais do histórico, dê uma olhada no seguinte:
O software do lado cliente é executado no que chamamos de "Drones". Um Drone pode ser qualquer dispositivo baseado em Linux que possua interface WiFi (com drivers de injeção) e conectividade de internet de saída. O Snoopy foi testado em um Nokia N900 e em um laptop rodando BackTrack. Os Drones realizam as duas operações a seguir:
As solicitações de sonda coletadas (ex.: o iPhone do Bob procurando por BTHomeHub-4123) são enviadas ao servidor Snoopy em intervalos regulares. Todos os dispositivos que se associam ao Rogue AP têm sua Internet servida através do Servidor Snoopy.
O servidor armazena todas as solicitações de sonda em um banco de dados, e usa o Wigle para determinar coordenadas GPS, e o Google Maps para determinar endereços (e fotografias do Street View). Isso significa que, se você estiver sondando sua rede doméstica, eu posso obter uma fotografia da sua casa.
Cada Drone se conecta ao servidor via OpenVPN e possui sua própria sub-rede. Os clientes associados recebem um endereço IP do Drone e roteiam o tráfego através dele. Isso significa que, no servidor, podemos associar endereços IP de clientes (e portanto endereços MAC) à atividade de internet.
No servidor, acontece o seguinte:
O diagrama de rede é o seguinte:
Client1 Drone1 Snoopy Server
+----------+ +-----------------------+ +-----------------------+
| wlan0-|<---WiFi--->|-at0 | | eth0|<-squid-sslstrip-mitmproxy->Internet
| | | | 10.2.0.1 | | 11.22.33.44| |
| dhclient | | | | | | Traffic inspection
| | | | tap0-|<-openvpn----->|-tap0 | Social media analysis
+----------+ | | 192.168.42.2 | +--/| 192.168.42.1 |
10.2.0.2 | +-----------------------+ | +-----------------------+
| |
| | route 10.2.0.0 via 192.168.42.2
| | route 10.3.0.0 via 192.168.42.3
Client2 | |
+----------+ | |
| wlan0-|<---+ |
| | |
| dhclient | |
| | |
+----------+ |
10.2.0.3 |
|
|
|
Client3 Drone2 |
+----------+ +-----------------------+ |
| wlan0-|<---WiFi--->|-at0 | |
| | | | 10.3.0.1 | |
| dhclient | | | | |
| | | | tap0-|<-openvpn--+
+----------+ | | 192.168.42.3 |
10.3.0.2 | +-----------------------+
|
|
|
Client4 |
+----------+ |
| wlan0-|<---+
| |
| dhclient |
| |
+----------+
10.3.0.3
Walter escreveu uma interface web para o Snoopy. Ela pode ser acessada em http://your-snoopy-server.com:5000/
Existem vários transforms do Maltego para explorar graficamente os dados coletados (veja abaixo para mais informações).
INSTALAÇÃO ================ A instalação do servidor deve ser simples. Ela só foi testada em uma instalação padrão do Ubuntu 12.04 LTS 32bit. São feitas alterações em vários componentes do servidor, portanto é altamente recomendável executar o script de instalação em uma instalação base, e não rodar muitas outras coisas nessa máquina (se é que algo). Em caso de dúvida, percorra o arquivo install.sh e faça as alterações manualmente. Caso contrário, basta executar o instalador (./install.sh).
USO ======== Quando a instalação terminar, você deve conseguir digitar 'snoopy' para carregar o menu do servidor. Se não funcionar (ou em caso de dúvida), vá para o diretório home do usuário criado durante a instalação. Dentro do diretório 'snoopy/server/' há um arquivo 'snoopy.sh' que você pode executar. Abaixo está o menu:
+---------------------------------------------------------------+
| Welcome to Snoopy V0.1 |
| SERVER SIDE |
| |
| SensePost Information Security |
| [email protected] / www.sensepost.com |
+---------------------------------------------------------------+
Date: Thu Nov 1 16:37:08 CET 2012
Snoopy Server Status: Stopped
Connected Drones: 0
Wigle User: setYourWigleAccount
Would you like to:
[1] (Re)Start Snoopy server components
[2] Stop Snoopy server components
[3] Manage drone configuration packs
[4] Configure server options
[5] Set web traffic injection string
[6] Observe logs
[X] Exit
[?] Help
Criando pacotes de drones A opção [3] no menu permitirá que você crie 'pacotes' do lado do cliente para seus dispositivos Drone. Cada Drone recebe suas próprias chaves OpenVPN e SSH, faixas DHCP e tabelas de roteamento. Você receberá uma URL de download por dispositivo Drone. Certifique-se de que o servidor e o drone tenham a hora configurada corretamente, caso contrário a conexão VPN não será estabelecida.
Cada entidade do Snoopy pode ter diferentes transforms aplicados a ela. Arraste a entidade 'Snoopy' para o seu gráfico para começar. Se você não especificar uma data de início ou término nas propriedades da entidade, ela buscará resultados dos últimos 5 minutos por padrão (esse valor pode ser alterado no menu de configuração do servidor).
As máquinas do Snoopy permitem sequenciar transforms automaticamente e filtrar/excluir nós com base em requisitos. O código-fonte/comentários devem descrever suficientemente como elas funcionam.
CONSIDERAÇÕES LEGAIS ======================= Todos ou alguns dos componentes do Snoopy podem ser ilegais onde você mora. Informe-se antes de usar o software. No Reino Unido, o componente de coleta de sondas é legal devido à natureza de transmissão do tráfego. No entanto, o componente de ponto de acesso rogue provavelmente é ilegal na maioria das regiões. A SensePost não se responsabiliza se você tiver problemas por usar esta ferramenta.
CONSIDERAÇÕES DE SEGURANÇA ========================== Cada 'pacote de Drone' contém chaves OpenVPN e SSH. Se um Drone for comprometido (por roubo ou qualquer outro meio), isso pode representar um risco de segurança para o seu servidor. É altamente recomendável que o seu servidor Snoopy seja dedicado à sua finalidade. O usuário criado no servidor tem o seguinte adicionado automaticamente ao .ssh/authorized_hosts file, para um pouco mais de segurança:
"no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/usr/bin/rsync ${SSH_ORIGINAL_COMMAND#* }""
TRABALHO FUTURO =============== Ainda há muitas coisas a serem feitas/adicionadas. Esta versão é mais um PoC.
Agradecimentos pela ajuda/conselhos/contribuições de:
P. Sabemos que um espião estrangeiro chega a Heathrow em 11 de novembro, mas não sabemos quando nem em qual voo. Nossa inteligência sugere que ele ficará no Hilton após chegar e pegará um voo do aeroporto de Luton no dia 14 (novamente, não sabemos a hora nem o destino). Ele é um mestre do disfarce. Como podemos identificá-lo?
R. Implante drones Snoopy em Heathrow, no Hilton e em Luton. O transform 'CommonLocation' do Maltego observará a interseção de todos os dispositivos presentes nesses três locais. Esperamos que apenas um resultado apareça - nosso alvo humano. Uma vez descoberto, podemos examinar o Google Maps e fotografias do Street View dos lugares para onde nosso espião viajou. A identidade dele pode ser revelada se o(s) dispositivo(s) dele for(em) enganado(s) para conectar(em) ao ponto de acesso rogue do Snoopy (como Facebook, Twitter ou e-mail dele).
Peça ao Snoopy para anotar todos os indivíduos que se conectaram a um ponto WiFi em certos países arenosos^W indesejáveis.
Implante o Snoopy em suas 10 lojas de departamento. Observe o tráfego de pessoas, clientes recorrentes, tipos de clientes.
Injete código malicioso para assumir o controle dos dispositivos clientes e instalar malware. Exploits podem ser disparados diretamente do servidor para as vítimas conectadas, devido às tabelas de roteamento.
A TFL poderia implantar um Drone Snoopy em cada estação do Metrô de Londres. Eles poderiam monitorar o tráfego de pessoas, observando horários/dias de pico e de baixa, e alocar/reduzir a equipe de acordo.
Implante 500 Drones Snoopy por toda Londres. Monitore os movimentos das pessoas quando passarem por um Drone. Padrões interessantes de movimento humano certamente se manifestarão se aplicado ao longo de semanas/meses.
Para um Desktop/Laptop baseado em Linux, a placa Alfa AWUS036H tem desempenho mediano. Uma placa mais confiável é a Ubiquity SR-71. Qualquer retorno sobre o que funciona/não funciona para você em relação ao suporte a drivers de injeção seria apreciado.
Para o N900, você notará que o carregamento dos drivers de injeção reduz severamente a vida útil da bateria. O pacote de bateria TecNet 6600mAh proporcionou cerca de 6 a 8 horas nos testes. Você, no entanto, precisará de um adaptador para conectar o N900 a qualquer pacote de bateria. Reduzir (ou desativar) a frequência de consulta ao GPS também ajudará a prolongar a vida útil da bateria.
Dicas sobre como conectar seu N900 ao laptop via USB (para fins de SSH) podem ser encontradas aqui
Atualmente estou testando no RaspberryPi, Alfa R36 mini AP e SheevaPlug. Resultados em breve.
Você pode criar seus próprios transforms do Maltego para explorar os dados coletados. Os fornecidos servem principalmente para demonstrar o que pode ser feito. Verifique o código-fonte e leia:
Entre em contato com [email protected] se tiver alguma dúvida (ou pergunte ao pessoal incrível do Maltego).
O código da interface web é acessível em ~user/snoopy/server/bin/snoopy/src/snoopy/
Os plug-ins consistem em duas partes:
Um plug-in é um chamável que é carregado dinamicamente pela aplicação Snoopy. Vamos começar com um exemplo:
from snoopy import db, pluginregistry
@pluginregistry.add('client-data', 'ssidlist', 'SSID List', js='/static/js/ssidlist.js')
def ssid_list(mac):
with db.SessionCtx() as session:
query = session.query(
distinct(db.Probe.probe_ssid) # SELECT DISTINCT probe_ssid FROM probes
).filter_by(
device_mac=mac # WHERE device_mac=$mac
).order_by(
db.Probe.probe_ssid # ORDER BY probe_ssid
)
return query.all()
Agora, o detalhamento...
from snoopy import db, pluginregistry
Precisamos de db para acessar o banco de dados do Snoopy e de pluginregistry para registrar nosso plug-in.
@pluginregistry.add('client-data', 'ssidlist', 'SSID List', js='/static/js/ssidlist.js')
É assim que registramos nosso plug-in (que pode ser qualquer chamável). O primeiro argumento especifica o nome do grupo ao qual este plug-in pertence. Especificamos client-data, pois este plug-in aceita um endereço MAC e retorna dados a serem exibidos em uma janela de dados do cliente. Além de client-data, existe também o grupo de plug-ins session-data, que opera em sessões de proximidade. O segundo parâmetro é o nome do plug-in. Esse nome é apenas para uso interno e deve ser compatível com JSON. O terceiro parâmetro é o título do plug-in. Essencialmente, é o mesmo que o nome, mas o título é exibido na GUI. Mais especificamente, este é o título da seção de dados na janela de dados do cliente.
Todos os argumentos de palavra-chave após o título são salvos como opções. Embora o sistema de plug-ins não exija nenhuma opção, o Snoopy suporta a opção js. Esta opção especifica a URL (do lado do navegador, não do lado do Snoopy/servidor) do componente JavaScript deste plug-in.
def ssid_list(mac):
Este plug-in é uma função simples. Ele aceita uma string de endereço MAC, conforme a definição de plug-ins client-data. O nome do chamável não é usado.O corpo deste plug-in de exemplo simplesmente executa uma consulta SQLAlchemy que
basicamente faz SELECT DISTINCT probe_ssid FROM probes WHERE device_mac=$mac
e retorna os resultados como uma lista. Os valores de retorno dos plug-ins são
geralmente adicionados como parte de uma resposta JSON. Portanto, os resultados
têm a limitação de que precisam ser compatíveis com JSON (como suportado pela
função jsonify() do Flask).
Simples assim!
Os plug-ins de front-end para dados de cliente são chamados de manipuladores de dados
do cliente. Eles são registrados por meio da função
Snoopy.registerPlugin(sectionName, dataHandler). sectionName é o nome da seção
de dados que o manipulador de dados deseja manipular. Esse nome é o mesmo do plug-in
de back-end que gerou os dados. O dataHandler deve ser uma função com a seguinte
assinatura: function($section, clientData) {...}. $section é um objeto jQuery
do elemento div onde o manipulador de dados pode exibir dados ou efetuar alterações.
Os dados do cliente (gerados pelo plug-in de back-end) são fornecidos no parâmetro
clientData.
Como a única saída permitida do manipulador de dados são alterações no div fornecido
($section), nenhum valor de retorno é necessário.
Instalando e executando o Snoopy no Drone Você pode ter até 100 drones (se quiser mais, verifique o código-fonte ou me envie um e-mail; não há limitação real). A instalação consiste em baixar o pacote de configuração da etapa anterior e executar o script de configuração relevante. Para o Nokia N900, um ícone será colocado na sua Área de Trabalho. Por exemplo:
haxor@drone001# wget http://snoopy-server.com/secretdir/drone001.tar.gz
haxor@drone001# tar xzvf drone001.tar.gz
haxor@drone001# cd snoopy && ./setup_n900.sh
Consultando localizações de SSID Crie uma conta em www.wigle.net e defina suas credenciais em 'Configure server options'
Interface Web Você pode acessar a interface web via http://your-snoopy-server:5000/. Você pode escrever seus próprios plugins para percorrer e exibir dados. Walter facilitou isso para você (veja o apêndice deste documento).
Explorando Dados com o Maltego No menu do servidor Snoopy, vá em 'Configure Server Options' > 'Maltego'. Aqui você verá URLs para baixar entidades, máquinas e URLs dos transforms do Snoopy. Para usar os transforms do Maltego, você precisará de: