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