
Snoopy v2.0 - framework modular de rastreamento terrestre digital
A SensePost apresenta:
/$$$$$$
/$$__ $$
| $$ \__/ /$$$$$$$ /$$$$$$ /$$$$$$ /$$$$$$ /$$ /$$
| $$$$$$ | $$__ $$ /$$__ $$ /$$__ $$ /$$__ $$| $$ | $$
\____ $$| $$ \ $$| $$ \ $$| $$ \ $$| $$ \ $$| $$ | $$
/$$ \ $$| $$ | $$| $$ | $$| $$ | $$| $$ | $$| $$ | $$
| $$$$$$/| $$ | $$| $$$$$$/| $$$$$$/| $$$$$$$/| $$$$$$$
\______/ |__/ |__/ \______/ \______/ | $$____/ \____ $$
| $$ /$$ | $$
| $$ | $$$$$$/
|__/ \______/
Versão: 2.0
Código: [email protected] // @glennzw
Visite: www.sensepost.com // @sensepost
Licença: Utilização não comercial
Bem-vindo ao Snoopy Versão 2.0!
Para instalar e configurar o Snoopy:
bash install.sh
Para guardar localmente os dados dos plugins wireless, sysinfo e heartbeat:
snoopy -v -m wifi:mon=True -m sysinfo -m heartbeat -d myDrone -l London
Para sincronizar dados de um cliente para um servidor:
Servidor:
snoopy_auth --create myDrone # Create account
snoopy -v -m server # Start server plugin
Cliente:
snoopy -v -m wifi:mon=True -s http://<server>:9001/ -d myDrone -l London -k <key>
INTRODUÇÃO E VISÃO GERAL ============================= O Snoopy é um framework distribuído de sensores, recolha de dados, interceção, análise e visualização. Está escrito num formato modular, permitindo a recolha de dados arbitrários de várias fontes através de plugins Python.
Arquitetura
Cada instância do Snoopy pode executar vários plugins em simultâneo. Um plugin recolhe dados, que são consultados pelo processo principal do Snoopy e gravados numa base de dados local. O Snoopy consegue sincronizar dados entre clientes (drones) e um servidor, e os clientes (drones) também podem obter réplicas de dados de um servidor. Cada instância do Snoopy pode executar plugins adequados à sua posição no panorama geral. Eis um diagrama que representa uma possível configuração:
Drone01 Server01
+---------------+ +--------------+
| Plugins: | | Plugins: |
| * WiFi | | *Server |
| * Bluetooth |====3G====>| |<=========================\
| * GSM | | | ||
| * FitBit | | | ||
+---------------+ +--------------+ ||
||
Drone02 Server02 Server03 ||
+---------------+ +--------------+ +-------------+ ||
| Plugins: | | Plugins: | | Plugins: | ||
| * WiFi | | * Server | | * Server | ||
| * Cookie |=====Xbee==>| * Heartbeat |==3G==>| * Wigle |<==\
| thief | || | | | * DataViz | ||
| * GPS | || | | | | ||
+---------------+ || +--------------+ +-------------+ ||
|| Internet
Drone03 || Laptop01 ||
+---------------+ || +--------------+ ||
| Plugins: | || | Plugins: | ||
| * Thermal | || | *RemotePull | ||
| * Camera |===/ | |====/
| * Heat | | Run: |
| | | *Maltego |
+---------------+ +--------------+
Na ilustração acima, existem três drones em execução a sincronizar os seus dados para dois servidores distintos. Um sincroniza via 3G, os outros dois via Xbee. O segundo servidor sincroniza os seus dados para um terceiro servidor. Por fim, um cliente (portátil) obtém todos os dados do primeiro e do terceiro servidores e executa o Maltego para explorar os dados.
Executar 'sh install.sh' dentro do diretório snoopy-ng.git instalará todos os pacotes necessários. Oferece a opção de instalar o aircrack a partir do código-fonte, o que é necessário para distribuições sem este pacote (a suíte aircrack é usada pelos plugins wireless). Não podemos recomendar o Maltego o suficiente para exploração de dados; uma edição comunitária (com algumas restrições) pode ser descarregada gratuitamente do site da Paterva em http://paterva.com.
Para ver todas as flags e opções disponíveis, criámos dois comandos para si:
root@kali:~# snoopy --help (shorthand -h)
Este comando mostra-lhe todas as opções de execução, como o servidor para o qual sincronizar, o nome do drone e a sua localização. Além disso, também explica como executar os vários plugins.
root@kali:~# snoopy --list (shorthand -i)
Este comando lista todos os plugins disponíveis e os parâmetros necessários para cada plugin funcionar corretamente. Para obter informações mais detalhadas sobre cada plugin, use '-ii' ou '-iii'. Para obter informações sobre um plugin específico, use '-i -m '.
Os plugins podem ser especificados com a opção --plugin (ou a forma abreviada -m). Podem ser especificados vários plugins, que serão iniciados pela ordem introduzida. Cada plugin terá 60 segundos para indicar o seu estado de prontidão, após os quais ocorre timeout e o plugin seguinte é iniciado. Isto pode ser útil se os plugins subsequentes dependerem de ações dos anteriores.
Cada plugin pode aceitar vários parâmetros (conforme indicado na saída do --list) na forma de pares chave/valor separados por vírgulas. Abaixo usamos o plugin 'example', que simplesmente gera números aleatórios.
snoopy --plugin example:x=1,v=True
Se as opções de drone/localização não forem fornecidas, são usados valores predefinidos. Em alternativa, podem ser especificadas como abaixo.
snoopy --plugin example:x=1,v=True --drone myDrone --location Cansas
Os dados podem ser sincronizados para uma máquina remota fornecendo a opção --server (-s). A máquina remota deve estar a executar o plugin de servidor (--plugin server). Deve ser gerada uma chave para um nome de drone antecipadamente. O exemplo abaixo ilustra isto.
Servidor
root@server:~# snoopy_auth --create myDrone01 --verbose
[+] Creating new Snoopy server sync account
[+] Key for 'myDrone01' is 'GWWVF'
[+] Use this value in client mode to sync data to a remote server.
root@kali:~# snoopy --plugin server
[+] Running webserver on '0.0.0.0:9001'
[+] Plugin server caught data for 2 tables.
Cliente
root@client:~# snoopy --plugin example:x=1 --drone myDrone --key GWWVF --server http://<server_ip>:9001/ --verbose
[+] Starting Snoopy with plugins: example
[+] Plugin example created new random number: 21
[+] Snoopy successfully sunc 2 elements over 2 tables.
Obtenção Remota de Dados
Os dados podem ser obtidos de um servidor usando o plugin local_sync. Por exemplo, supondo que o servidor acima está em execução, execute esta operação a partir do cliente:
root@client:~# snoopy --plugin local_sync:server_url=http://<server_ip>:9001/ --drone myDrone --key GWWVF
[+] Plugin local_sync pulled 888 records from remote server.
O comportamento predefinido é armazenar todos os dados num ficheiro SQLITE snoopy.db. Isto pode ser substituído com o parâmetro --dbms. Consulte a documentação do SQL Alchemy sobre como especificar diferentes motores de base de dados (http://docs.sqlalchemy.org/en/rel_0_9/dialects/index.html). Como exemplo, abaixo usamos MySQL:
root@client:~# snoopy -v --plugin example --dbms=mysql://glenn:secret@localhost/snoopy_db
[+] Capturing local only. Saving to 'mysql://glenn:secret@localhost/snoopy_db'
Pode ser útil usar armazenamento SQLITE em dispositivos mais pequenos e fazer com que o plugin de servidor guarde em MySQL (ou semelhante). Outro exemplo pode ser útil quando especificamos a localização do ficheiro para armazenar dados, como em suporte amovível:
root@client:~# snoopy -v --plugin example --dbms=sqlite:////media/USB01/snoopy.db
Existe uma opção --flush (-f) para 'limpar' os dados do armazenamento local depois de estes serem sincronizados com um servidor upstream.
O Snoopy pode ser iniciado com um script upstart (consulte a pasta ./setup/upstarts). Outros scripts upstart de exemplo são fornecidos no mesmo diretório - por exemplo, um para estabelecer uma ligação PPP a partir de um modem 3G e outro para criar um canal remoto de comandos SSH.
Os sistemas baseados em Debian (ex.: Kali) parecem não suportar upstart. Entretanto, o ficheiro rc.local fornecido pode ser usado para iniciar o Snoopy e serviços relacionados no arranque.
O Maltego é a ferramenta preferida para fazer a visualização. As instruções estão abaixo:
Isto deverá importar tanto as entidades como os transforms. Para começar, arraste a entidade 'Base of Operations' do separador Snoopy no menu Palette para um gráfico em branco. Como exemplo, execute as seguintes operações sobre a entidade:
Existem transforms para obter domínios e cookies (a partir de monitorização passiva), consultar endereços de rua de SSIDs, e vários são bidirecionais (por exemplo, é possível consultar clientes a partir de Localização, ou Localizações a partir de cliente). O melhor é explorar.
Se não estiver a usar o formato sqlite predefinido, edite o seguinte ficheiro para especificar a localização dos dados:
snoopy_ng/transforms/db_path.conf
O gráfico do Snoopy pode ser partilhado por vários analistas em simultâneo usando a função de colaboração do Maltego. Selecione Collaboration e 'Share Current Graph'.
UTILIZAÇÃO COMERCIAL =================== A licença sob a qual o Snoopy é distribuído proíbe obter ganho financeiro (ou de outra forma) com a sua utilização (ver LICENSE.txt). Temos uma licença separada disponível para uso comercial, que inclui funcionalidades adicionais como:
Entre em contacto ([email protected] / [email protected]) se quiser colaborar connosco.
Consulte o ficheiro plugins/example.py para compreender como os plugins devem ser escritos. Qualquer ficheiro colocado na pasta plugins será tratado como um plugin e deve ter as seguintes propriedades:
Caso contrário, o plugin pode fazer o que quiser.
O Snoopy funciona em qualquer dispositivo Linux com suporte suficiente para instalar os ficheiros do ficheiro install.sh, ou seja, Python e pacotes relacionados. O suporte de hardware varia consoante os plugins necessários, mas para o cenário mais comum de recolher dados WiFi e enviá-los via 3G, é recomendado o seguinte:
Foram testados o Kali 1.05 e o Ubuntu 12.04. Sistemas semelhantes deverão funcionar.
Ocorre uma condição de erro ao recolher dados localmente, sincronizar para um servidor remoto e depois obter uma réplica do servidor. Ex.:
Servidor
root@kali:~# snoopy -m server -m wigle:username=u,password=p,[email protected]
[+] Running webserver on '0.0.0.0:9001'
[+] Plugin server caught data for 2 tables.
Cliente
root@client:~# snoopy -m wifi -m local_sync:server_url=http://1.1.1.1:9001/ -d myDrone -l London -k secretkey -s http://1.1.1.1:9001/