Uma ferramenta de inteligência de fontes abertas (OSINT) desenvolvida em Go para buscar contas ativas de forma extremamente rápida em centenas de redes sociais e websites simultaneamente.
Inspirado no clássico Sherlock em Python, o Sherlock-Go aproveita todo o poder do modelo de concorrência nativo do Go para realizar buscas centenas de vezes mais rápidas.
O Sherlock-Go foi projetado para analistas de segurança, pesquisadores e curiosos que precisam verificar a presença digital de um nome de usuário.
- Concorrência Nativa (Goroutines): Em vez de usar threads pesadas ou bibliotecas assíncronas complexas, o Go utiliza goroutines leves. Isso permite disparar mais de 400 consultas de rede simultâneas gastando o mínimo de memória.
- Binário Único Compilado: Diferente do Python, que exige a instalação de dependências como
pipe interpretadores no sistema, o Sherlock-Go é compilado em um único executável sem dependências externas. - Velocidade de Execução: Menor tempo de CPU e inicialização imediata.
O funcionamento interno do Sherlock-Go é estruturado em fases de validação inteligente para garantir precisão e velocidade.
graph TD
A[Início: Username] --> B[Carregar Banco de Dados JSON]
B --> C[Pré-Validação de Regex por Site]
C -- Inválido --> D[Descartar/Marcar Inexistente]
C -- Válido --> E[Adicionar ao Pool de Concorrência]
E --> F[Disparar Goroutine]
F --> G{Executar Requisição HTTP}
G -- Sucesso --> H{Analisar Tipo de Erro/Validação}
G -- Falha de Rede --> I[Registrar Erro / Ignorar]
H -- Status Code 2xx --> J[Confirmar Existência]
H -- Mensagem no Body --> K[Confirmar Existência/Inexistência]
H -- URL de Resposta/Redirect --> L[Confirmar Existência/Inexistência]
J & K & L -- Encontrado --> M[Acumular Resultados]
M --> N[Ordenar Alfabeticamente A-Z]
N --> O[Imprimir no Terminal e Salvar Relatórios]
Para evitar sobrecarga de rede e banimento de IPs pelos servidores das redes sociais, a concorrência é limitada usando um semáforo de canais:
sem := make(chan struct{}, 100) // Limite de 100 requisições simultâneasAntes de fazer qualquer requisição à internet, o programa valida o formato do nome do usuário de acordo com as regras de cada site (se cadastrado no banco de dados):
- Se o site exige caracteres específicos (ex: apenas letras e números) ou um limite de tamanho (ex: de 4 a 12 caracteres), e o username fornecido descumprir essas regras, o site é ignorado localmente de imediato.
Como cada site se comporta de forma diferente quando um perfil não existe, o Sherlock-Go suporta três técnicas de validação:
status_code: Verifica se a resposta HTTP é de sucesso (família2xx). Se retornar404 Not Found, o perfil é classificado como inexistente.message: A busca lê o conteúdo HTML retornado pelo site e procura por mensagens de erro cadastradas (ex: "Esta conta não existe", "Usuário não encontrado"). Se a mensagem for encontrada no corpo, a conta é classificada como inexistente.response_url: Alguns sites redirecionam requisições de contas inexistentes para uma página genérica (ex: página inicial ou login). O programa analisa a URL final após os redirecionamentos. Se ela coincidir com a URL de erro padrão do site, a conta não existe.
Para compilar e rodar o programa localmente informando um username:
go run main.go <username>| Flag | Atalho | Tipo | Descrição | Padrão |
|---|---|---|---|---|
--database |
-d |
string | Caminho do arquivo de banco de dados JSON. | date.json |
--proxy |
-p |
string | URL do proxy único (Ex: http://127.0.0.1:8080). |
"" |
--proxy-list |
-pl |
string | Arquivo com lista de proxies (um por linha) para rotação. | "" |
--tor |
-t |
bool | Usa o proxy local da rede Tor (socks5://127.0.0.1:9050). |
false |
--json |
-j |
string | Caminho para salvar os resultados encontrados em formato JSON. | "" |
--verbose |
-v |
bool | Habilita logs detalhados (exibe erros de conexão nos testes). | false |
Busca o usuário samuel em todas as redes configuradas no banco padrão:
go run main.go samuelIdeal para automatizações e integrações com outros sistemas. Salva a lista de perfis encontrados em resultados.json:
go run main.go -j resultados.json samuelPara evitar bloqueios por limites de requisição (Rate Limiting), você pode passar um arquivo contendo vários proxies. O Sherlock-Go alternará automaticamente entre eles em sistema Round-Robin:
go run main.go --proxy-list proxies.txt samuelSe você tiver o serviço do Tor rodando localmente (na porta padrão 9050), pode encapsular todo o tráfego do Sherlock-Go através da rede Tor:
go run main.go --tor samuelÚtil se quiser ver o motivo de cada site falhar (como erros de timeout ou bloqueios SSL/Cloudflare):
go run main.go -v samuelAo final de cada execução, o Sherlock-Go:
- Imprime os sites encontrados ordenados alfabeticamente (A-Z) no terminal.
- Salva um arquivo de relatório em Markdown nomeado com o próprio nome do usuário (ex:
samuel.md) contendo a lista completa de links ativos. Isso preserva a documentação principal do projeto (README.md).
Você pode expandir a lista de sites adicionando novas regras ao arquivo date.json. Cada entrada segue a seguinte estrutura:
"Nome_Da_Rede_Social": {
"url": "https://nomedaurl.com/{}",
"urlProbe": "https://url_de_teste.com/{}",
"errorType": "status_code",
"regexCheck": "^[a-zA-Z0-9_-]{3,15}$"
}{}: Representa onde o nome do usuário será injetado.urlProbe(opcional): URL usada para testes de requisição (caso o site exiba o perfil sob uma URL diferente da de visualização).regexCheck(opcional): Expressão regular para validar o formato do nome de usuário antes de enviar a requisição de rede.