Analisa imagens e PDFs em busca de coordenadas GPS e nomes de usuários.
Contexto
A engenharia social é frequentemente o elo mais fraco de uma empresa. Um Pentester utiliza um scraper de redes sociais para:
- Mapear Organogramas: Descobrir quem é o CEO, o gerente de TI e os estagiários (alvos comuns por terem menos treinamento de segurança).
- Identificar Padrões de E-mail: Com nomes e sobrenomes, é fácil prever o formato de e-mail corporativo (
nome.sobrenome@empresa.com). - Criar Pretextos: Saber que um funcionário participou de uma conferência específica permite criar um e-mail de phishing muito mais convincente (Spear Phishing).
Possibilidades de Implementação
- Selenium/Playwright: Simula um navegador real. É lento, mas ignora proteções básicas de JavaScript.
- BeautifulSoup/Scrapy: Faz o parsing do HTML estático. É extremamente rápido, mas fácil de ser bloqueado.
- APIs de Busca (Google/Bing): Em vez de acessar a rede social diretamente (que exige login), você busca o perfil indexado nos motores de busca para evitar detecção.
Código
Nesta lição, criaremos um scraper que utiliza a biblioteca requests e BeautifulSoup para buscar menções a funcionários em páginas públicas ou resultados de busca, focando em extrair nomes e cargos.
Requisito: pip install requests beautifulsoup4
import requests
from bs4 import BeautifulSoup
def social_media_recon(company_name):
print(f"{'='*60}")
print(f" 30 LESSONS IN PYTHON FOR PENTEST - LIÇÃO 05")
print(f" FERRAMENTA: SOCIAL MEDIA SCRAPER")
print(f"{'='*60}")
print(f"[*] Alvo: {company_name}")
print(f"[*] Coletando informações de perfis públicos...\n")
# Simulando uma busca por perfis no LinkedIn via Google (OSINT passivo)
# site:linkedin.com/in/ "Nome da Empresa"
query = f"site:linkedin.com/in/ \"{company_name}\""
url = f"https://www.google.com/search?q={query}"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
# Busca por títulos de resultados que geralmente contêm Nome e Cargo
results = soup.find_all('h3')
for idx, result in enumerate(results, 1):
clean_text = result.get_text()
if " - " in clean_text:
print(f"[+] Alvo em potencial {idx}: {clean_text}")
elif response.status_code == 429:
print("[!] Erro: Bloqueio por excesso de requisições (CAPTCHA).")
except Exception as e:
print(f"[!] Erro durante o scraping: {e}")
if __name__ == "__main__":
# Exemplo: Buscando funcionários da Tesla indexados
social_media_recon("Tesla")