Compartilhe

OSINT Data Science — Coletando e Analisando Fontes Abertas com Python e R

Mini Curso OSINT Data Science: Coleta e Análise de Fontes Abertas com Python e R | RDS @RDSWEB

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ênciaEtapa de Data ScienceFerramentas típicas
Direção (o que preciso saber?)Definição do escopo/variáveisRequisitos da investigação, escopo legal
ColetaData collection / scraping / APIsPython (requests, BeautifulSoup, Scrapy, APIs)
ProcessamentoData cleaning / structuringPython (pandas), OpenRefine
AnáliseModelagem estatística / visualizaçãoR (ggplot2, igraph, tidytext)
DisseminaçãoRelatório / dashboardR 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.
Toda coleta descrita aqui é passiva e deve respeitar LGPD, Marco Civil da Internet e os Termos de Uso das plataformas consultadas. OSINT não é acesso não autorizado — é leitura inteligente do que já é público.

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:

  1. Coleta (Python): Google Dorks automatizadas + Sherlock/Maigret para username + verificação Hudson Rock/HaveIBeenPwned para exposição de credenciais.
  2. Estruturação (Python/pandas): consolidar tudo em um único DataFrame com origem, tipo de dado, timestamp e confiabilidade da fonte.
  3. Análise (R): grafo de relacionamento (igraph), timeline de atividade (ggplot2), análise textual de conteúdo público (tidytext).
  4. 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

Centralidade de grau: C_D(v) = deg(v) / (n - 1)
Centralidade de intermediação: C_B(v) = Σ_(s≠v≠t) [σ_st(v) / σ_st]
Centralidade de proximidade: C_C(v) = (n - 1) / Σ_u d(v, u)
PageRank: PR(v) = (1-d)/N + d · Σ_(u∈In(v)) [PR(u) / L(u)]
Predição de vínculo (Jaccard): J(x,y) = |N(x) ∩ N(y)| / |N(x) ∪ N(y)|
Predição de vínculo (Adamic-Adar): AA(x,y) = Σ_(z∈N(x)∩N(y)) [1 / log(deg(z))]
Score de decisão (soma ponderada, pesos definidos pelo analista): Score(v) = w1·C_D(v) + w2·C_B(v) + w3·PR(v), com w1+w2+w3 = 1
Regressão logística para probabilidade de risco: P(y=1|x) = 1 / (1 + e^-(β0 + β1x1 + ... + βnxn))
Correlação de Pearson (relação entre duas variáveis coletadas): r = Σ(xi-x̄)(yi-ȳ) / √[Σ(xi-x̄)² · Σ(yi-ȳ)²]

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))
Regra de saída para qualquer gráfico gerado neste fluxo: sempre tema claro, fundo branco — nunca fundo/tema escuro, mesmo que o restante do material siga a estética dark do blog.

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).

  1. 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).
  2. Peça o mapa: "Transforme esta planilha em um mapa de vínculos (grafo), mostrando quem se conecta com quem."
  3. Peça o ranking: "Aponte os 3 nomes que mais conectam pessoas diferentes nessa rede — esses são os pontos centrais para investigar primeiro."
  4. 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?"
  5. 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."
Essas cinco perguntas, nessa ordem, entregam praticamente o mesmo resultado da versão técnica — a diferença é que aqui quem conduz é a pergunta em linguagem natural, e a IA cuida do cálculo por trás.

Módulo 8 — Limites Éticos e Legais

Toda coleta e análise descrita neste curso pressupõe: (1) apenas fontes públicas, sem burlar login, paywall ou controle de acesso; (2) conformidade com a LGPD e o Marco Civil da Internet; (3) preservação de cadeia de custódia quando o objetivo é uso probatório (CPP); (4) nunca investigar menores ou por motivação de perseguição/assédio; (5) documentação e origem de cada dado coletado, para permitir auditoria posterior.

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

Conteúdo gerado com apoio de IA, com base em pesquisa online de artigos e relatórios técnicos de terceiros sobre cibersegurança. Não nos responsabilizamos pela precisão de fontes externas. Nada neste material tem caráter ofensivo ou instrucional para reprodução de ataques — o objetivo é estritamente defensivo e educacional, apoiando profissionais, empresas e equipes de segurança a se manterem atualizados sobre modus operandi reais e a fortalecer uma cultura de segurança da informação, prevenção e resposta a incidentes.

RDS ; Professor de Open Source Intelligence, entusiasta da Segurança da Informação e datascience — RDS @RDSWEB · OSINT Brasil

Apoie o blog via PIX: 47988618255

WA

Comentários

Manual de Fontes Abertas

CLICA

Pericia Digital

Como usar um Agente OSINT IA

Postagens mais visitadas