OSINT Data Science — Coletando e Analisando Fontes Abertas com Python e R
Mini Curso: OSINT Data Science — Coletando e Analisando Fontes Abertas com Python e R
Um roteiro prático para transformar dados públicos dispersos em inteligência estruturada, usando o mesmo ciclo que times de CTI e investigação defensiva aplicam todos os dias: coletar melhor, organizar melhor, analisar melhor.
OSINT (Open Source Intelligence) deixou de ser apenas "buscar no Google". Hoje, a diferença entre um analista iniciante e um analista sênior está na engenharia de dados por trás da coleta: como você estrutura o que encontra, como automatiza a repetição e como extrai padrões que um olhar manual não vê. Este mini curso conecta OSINT clássico a Data Science aplicada, com foco em Python (coleta) e R (análise/visualização).
Módulo 1 — O Ciclo OSINT como Pipeline de Dados
Pense no ciclo de inteligência clássico (Direção → Coleta → Processamento → Análise → Disseminação) como um pipeline de dados:
| Etapa do ciclo de inteligência | Etapa de Data Science | Ferramentas típicas |
|---|---|---|
| Direção (o que preciso saber?) | Definição do escopo/variáveis | Requisitos da investigação, escopo legal |
| Coleta | Data collection / scraping / APIs | Python (requests, BeautifulSoup, Scrapy, APIs) |
| Processamento | Data cleaning / structuring | Python (pandas), OpenRefine |
| Análise | Modelagem estatística / visualização | R (ggplot2, igraph, tidytext) |
| Disseminação | Relatório / dashboard | R Markdown, HTML, PDF |
É essa costura — Python entrando forte na coleta e automação, R assumindo a análise estatística mais fina e visualizações complexas — que separa um levantamento manual de uma verdadeira operação de inteligência.
Módulo 2 — Ferramentas de Coleta que Todo Analista Deveria Conhecer
Antes de programar qualquer coisa, vale mapear o que já existe pronto. Abaixo, uma curadoria combinando ferramentas amplamente documentadas na comunidade OSINT/CTI com o arsenal de reconhecimento passivo.
Reconhecimento geral e infraestrutura
- OSINT Framework — diretório de recursos organizado por tipo de dado (username, domínio, imagem, telefone).
- theHarvester — coleta subdomínios, e-mails e hosts a partir de mecanismos de busca e servidores PGP; nativo do Kali Linux.
- SpiderFoot — automatiza reconhecimento cruzando mais de 100 fontes públicas a partir de um nome, domínio, e-mail ou IP.
- Maltego — lógica de entidade → transform → pivot → grafo; referência para visualizar relações entre pessoas, domínios e infraestrutura.
- Shodan e BuiltWith — mapeiam dispositivos expostos e a stack tecnológica de um alvo.
- SecurityTrails e DNSDumpster — histórico de DNS, WHOIS e domínios associados.
Credenciais comprometidas e Infostealers
- Have I Been Pwned — verifica exposição de contas em vazamentos conhecidos.
- Hudson Rock (free tools / Cavalier) — ferramentas gratuitas para consultar domínio, e-mail ou IP contra sua base de máquinas comprometidas por Infostealers, útil para avaliar exposição de credenciais corporativas em due diligence e resposta a incidentes.
Username, pessoa e identidade
- Sherlock / Maigret — varredura de username em centenas de plataformas.
- whatsmyname.app — versão web da mesma lógica, sem instalar nada.
Módulo 3 — Google Dorks: a Coleta Mais Barata que Existe
Antes de escrever uma linha de código, os operadores de busca avançada (Google Dorks) já entregam grande parte do trabalho — funcionam desde 2002 e continuam sendo a forma mais rápida de restringir resultados por tipo de arquivo, domínio ou termo exato.
site:empresa.com.br filetype:pdf "confidencial"
site:linkedin.com "Nome Completo" "Cidade"
intitle:"index of" "backup" site:empresa.com.br
"Nome" ("handle" OR "username" OR "@") -site:linkedin.com
"Nome" ("married" OR "son of" OR "director") site:*.com.br
Regra prática: sempre replicar a mesma dork em Google, Bing, Brave Search, Yandex e DuckDuckGo — cada motor indexa de forma diferente, e o Yandex em particular costuma revelar resultados de imagem que o Google filtra.
Módulo 4 — Python para Coleta: Prompts e Scripts
Python domina a etapa de coleta porque tem bibliotecas maduras para scraping, requisições HTTP e automação. Abaixo, prompts prontos para usar com um assistente de IA + os scripts que eles geram.
Prompt 1 — Scraper básico e ético
Escreva um script em Python usando requests e BeautifulSoup que: 1. Acesse uma página pública (definir URL) 2. Respeite o robots.txt do domínio antes de coletar 3. Extraia título, texto principal e links 4. Salve o resultado em JSON com timestamp de coleta 5. Inclua delay de 2 a 4 segundos entre requisições (rate limiting)
Prompt 2 — Verificação de username em massa
Escreva um script em Python que receba uma lista de usernames de um arquivo .txt, verifique a existência de cada um em uma lista de plataformas (ex.: Instagram, GitHub, Reddit) via requisição HTTP, e exporte um CSV com colunas: username, plataforma, status_code, existe (True/False), url_verificada.
Exemplo de código — estrutura de coleta OSINT em pandas
import pandas as pd
import requests
from time import sleep
resultados = []
for termo in lista_termos:
resp = requests.get(f"https://api.exemplo.com/search?q={termo}", timeout=10)
resultados.append({
"termo": termo,
"status": resp.status_code,
"coletado_em": pd.Timestamp.now()
})
sleep(3) # rate limiting responsável
df = pd.DataFrame(resultados)
df.to_csv("coleta_osint.csv", index=False)
Prompt 3 — Grafo de entidades com NetworkX
Escreva um script em Python com NetworkX que construa um grafo dirigido a partir de um CSV com colunas "origem" e "destino" (ex.: pessoa -> empresa, pessoa -> username), calcule centralidade de grau e centralidade de intermediação (betweenness), e exporte uma imagem PNG do grafo destacando os 3 nós mais centrais.
Prompt 4 — Coleta de metadados de imagem/documento
Escreva um script em Python usando exiftool (via subprocess) que percorra uma pasta de imagens, extraia GPS, data de criação, modelo de câmera e software usado, e consolide tudo em um DataFrame do pandas, sinalizando arquivos sem metadados de geolocalização.
Módulo 5 — R para Análise e Visualização
Depois que os dados estão coletados e estruturados (via Python), R entra para modelagem estatística e visualizações de qualidade editorial — especialmente útil para relatórios de inteligência e apresentações a clientes/tribunais.
Prompt 5 — Visualização de séries temporais de atividade
Escreva um script em R com ggplot2 que leia um CSV com colunas "data" e "evento", agregue a contagem de eventos por semana, e gere um gráfico de linha com tema escuro, destacando picos de atividade acima de 2 desvios-padrão da média.
Exemplo de código — timeline de atividade em R
library(tidyverse)
library(lubridate)
dados <- read_csv("coleta_osint.csv") %>%
mutate(semana = floor_date(as_date(coletado_em), "week")) %>%
count(semana)
media <- mean(dados$n)
desvio <- sd(dados$n)
ggplot(dados, aes(x = semana, y = n)) +
geom_line(color = "#39ff6a", linewidth = 1) +
geom_hline(yintercept = media + 2*desvio, linetype = "dashed", color = "#e8b04b") +
labs(title = "Atividade coletada por semana", x = NULL, y = "Eventos") +
theme_minimal()
Prompt 6 — Grafo social com igraph
Escreva um script em R com igraph que leia uma edgelist (origem, destino) de um caso de investigação, calcule grau e intermediação de cada nó, identifique comunidades com o algoritmo de Louvain, e plote o grafo colorindo os nós por comunidade.
Prompt 7 — Mineração de texto de conteúdo público (SOCMINT)
Escreva um script em R com tidytext que receba um conjunto de posts públicos (coluna "texto"), remova stopwords em português, extraia as 20 palavras mais frequentes, calcule análise de sentimento léxico e gere uma nuvem de palavras e um gráfico de frequência.
Boas práticas de prompt para coleta/análise OSINT
- Sempre peça ao modelo para incluir rate limiting e checagem de robots.txt em scrapers.
- Peça saída estruturada (CSV/JSON com colunas nomeadas) — nunca texto livre — para alimentar a etapa seguinte do pipeline.
- Peça explicitamente "apenas fontes públicas, sem burlar autenticação" — trava o modelo em coleta ética.
- Separe prompts de coleta (Python) dos prompts de análise (R): misturar as duas linguagens no mesmo prompt reduz a qualidade do código gerado.
- Peça sempre logging de data/hora de coleta — essencial para cadeia de custódia em investigação defensiva.
Módulo 6 — Pipeline Integrado (Python + R) para um Caso Real
Um fluxo típico de um caso de due diligence ou investigação defensiva:
- Coleta (Python): Google Dorks automatizadas + Sherlock/Maigret para username + verificação Hudson Rock/HaveIBeenPwned para exposição de credenciais.
- Estruturação (Python/pandas): consolidar tudo em um único DataFrame com origem, tipo de dado, timestamp e confiabilidade da fonte.
- Análise (R): grafo de relacionamento (igraph), timeline de atividade (ggplot2), análise textual de conteúdo público (tidytext).
- Relatório: estrutura de relatório com Case Information, Entities, Investigation Scope, Findings, Evidence e Risk Assessment.
Módulo 7 — Análise de Vínculos, Decisão e Predição
Depois de coletar e estruturar dados de fontes públicas (registros societários, redes sociais, domínios, processos), o próximo passo é transformar essa lista de "quem está ligado a quem" em algo que ajude a decidir: quem investigar primeiro, qual vínculo é mais provável de existir mesmo sem confirmação direta, e qual nó concentra mais risco ou relevância na rede.
Prompt 8 — Grafo de vínculos com predição e ranking de decisão
Escreva um script em Python (pandas + networkx) que: 1. Carregue um CSV com colunas "origem", "destino" e "tipo_vinculo" (ex.: sócio, endereço, telefone, username) coletado de fontes públicas 2. Construa um grafo dirigido e calcule: centralidade de grau, centralidade de intermediação (betweenness), centralidade de proximidade (closeness) e PageRank para cada nó 3. Aplique link prediction (índice de Jaccard e Adamic-Adar) para apontar pares de nós sem vínculo direto registrado, mas com alta probabilidade de conexão, com base em vizinhos em comum 4. Combine as métricas em um "score de relevância" normalizado (0-1) para ranquear os nós que merecem investigação prioritária 5. Exporte um CSV com o ranking e um gráfico de barras em tema claro (fundo branco, sem tema escuro) mostrando os 10 nós de maior score
Fórmulas e métricas usadas
Exemplo de código — Python (networkx + link prediction)
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
df = pd.read_csv("vinculos_osint.csv")
G = nx.from_pandas_edgelist(df, "origem", "destino", create_using=nx.DiGraph())
grau = nx.degree_centrality(G)
intermediacao = nx.betweenness_centrality(G)
proximidade = nx.closeness_centrality(G)
pagerank = nx.pagerank(G)
ranking = pd.DataFrame({
"no": list(grau.keys()),
"grau": list(grau.values()),
"intermediacao": list(intermediacao.values()),
"pagerank": list(pagerank.values()),
})
ranking["score"] = (0.4*ranking["grau"] + 0.3*ranking["intermediacao"] + 0.3*ranking["pagerank"])
ranking = ranking.sort_values("score", ascending=False)
ranking.to_csv("ranking_decisao.csv", index=False)
# Predição de vínculos ainda não confirmados (grafo não-dirigido para Jaccard)
Gu = G.to_undirected()
predicoes = list(nx.jaccard_coefficient(Gu))
pd.DataFrame(predicoes, columns=["no1", "no2", "prob_jaccard"]).sort_values(
"prob_jaccard", ascending=False
).to_csv("predicao_vinculos.csv", index=False)
# Gráfico em tema claro (fundo branco), nunca escuro
plt.style.use("default")
top10 = ranking.head(10)
plt.figure(figsize=(8, 5), facecolor="white")
plt.barh(top10["no"], top10["score"], color="#2c6e49")
plt.gca().set_facecolor("white")
plt.xlabel("Score de relevância")
plt.title("Top 10 nós por score de decisão")
plt.gca().invert_yaxis()
plt.tight_layout()
plt.savefig("ranking_top10.png", facecolor="white")
Exemplo de código — R (igraph + regressão logística)
library(igraph)
library(ggplot2)
library(dplyr)
dados <- read.csv("vinculos_osint.csv")
g <- graph_from_data_frame(dados, directed = TRUE)
metricas <- data.frame(
no = V(g)$name,
grau = degree(g, normalized = TRUE),
intermediacao = betweenness(g, normalized = TRUE),
pagerank = page_rank(g)$vector
) %>%
mutate(score = 0.4*grau + 0.3*intermediacao + 0.3*pagerank) %>%
arrange(desc(score))
# Regressão logística: probabilidade de um nó ser "relevante"
# (ex.: 1 = confirmado como parte do núcleo investigado)
modelo <- glm(relevante ~ grau + intermediacao + pagerank,
data = metricas_com_rotulo, family = binomial)
summary(modelo)
# Gráfico SEMPRE em tema claro
ggplot(head(metricas, 10), aes(x = reorder(no, score), y = score)) +
geom_col(fill = "#2c6e49") +
coord_flip() +
labs(title = "Top 10 nós por score de decisão", x = NULL, y = "Score") +
theme_minimal(base_size = 12) +
theme(panel.background = element_rect(fill = "white", color = NA),
plot.background = element_rect(fill = "white", color = NA))
Treinamento Fácil — sem programar, direto ao ponto
Para quem não escreve código, mas já tem os dados soltos numa planilha (nomes, empresas, telefones, endereços coletados no processo ou na investigação).
- Organize em duas colunas: "Quem" e "Está ligado a quem" (uma linha por vínculo — pode ser sócio, telefone em comum, mesmo endereço, mesmo e-mail).
- Peça o mapa: "Transforme esta planilha em um mapa de vínculos (grafo), mostrando quem se conecta com quem."
- Peça o ranking: "Aponte os 3 nomes que mais conectam pessoas diferentes nessa rede — esses são os pontos centrais para investigar primeiro."
- Peça a previsão: "Com base nos vínculos que já existem, quais duas pessoas/empresas provavelmente têm uma ligação que ainda não está confirmada na minha planilha?"
- Peça o gráfico para o relatório: "Gere um gráfico de barras simples, com fundo branco, mostrando os nomes mais centrais — quero anexar ao relatório/petição."
Módulo 8 — Limites Éticos e Legais
Conclusão
Dominar Python para coleta e R para análise não substitui o julgamento do analista — mas multiplica seu alcance. O mesmo levantamento que levaria horas manualmente pode ser estruturado, replicado e auditado em minutos, com muito mais consistência entre casos.
Precisa de uma investigação defensiva conduzida com essa mesma metodologia — coleta estruturada, análise de dados e relatório pericial?
Falar no WhatsApp
Comentários
Postar um comentário