OSINT para rastrear pegadas digitais e senhas vazadas em redes sociais
GitHub: https://github.com/ibnaleem/gosearch
Este projeto depende muito de colaboradores. Veja Contribuiçþes para mais detalhes.git clone https://github.com/ibnaleem/gosearch.git && cd gosearch && go build && ./gosearch [username]
O que ĂŠ GoSearch
?



GoSearch
ĂŠ uma ferramenta OSINT eficiente e confiĂĄvel, projetada para descobrir pegadas digitais associadas a um determinado nome de usuĂĄrio. Ă rĂĄpido, direto e confiĂĄvel, permitindo que os usuĂĄrios rastreiem a presença online de um indivĂduo em vĂĄrias plataformas. GoSearch
tambÊm integra dados do Banco de Dados de Inteligência de Crimes CibernÊticos da HudsonRock para fornecer insights sobre informaçþes relacionadas a crimes cibernÊticos. Ele tambÊm acessa BreachDirectory.org
o banco de dados do oferecendo acesso a uma lista abrangente de violaçþes de dados, senhas em texto simples e com hash vinculadas ao nome de usuårio. Esta ferramenta Ê ideal para aqueles que precisam de resultados precisos e sem frescuras ao investigar identidades online.
Instalação e uso
$ git clone https://github.com/ibnaleem/gosearch.git && cd gosearch
$ go build
Para Unix:
$ ./gosearch <username>
Recomendo adicionar o gosearch
binĂĄrio ao seu /bin
para uso universal:
$ sudo mv gosearch ~/usr/bin
Para Windows:
C:\Users\***\gosearch> gosearch.exe <username>
Casos de uso
O GoSearch permite que vocĂŞ pesquise no breachdirectory.org por senhas comprometidas associadas a um nome de usuĂĄrio especĂfico. Para utilizar totalmente o GoSearch, siga estas etapas:
- Obtenha uma chave de API gratuita
https://rapidapi.com/rohan-patra/api/breachdirectory
em . - Inclua a chave da API nos argumentos do comando como este:
$ gosearch [username] [api-key]
O GoSearch gerarå automaticamente endereços de e-mail populares para um determinado nome de usuårio.
Por que GoSearch
?
GoSearch
ĂŠ inspirado por Sherlock , uma ferramenta popular de busca de nome de usuĂĄrio. No entanto, GoSearch
melhora Sherlock ao abordar vårias de suas principais limitaçþes:
- Sherlock ĂŠ baseado em Python, o que o torna mais lento quando comparado ao Go.
- Sherlock estå desatualizado e carece de atualizaçþes.
- Ăs vezes, Sherlock relata falsos positivos como resultados vĂĄlidos.
- Sherlock frequentemente deixa passar nomes de usuĂĄrios reais, o que leva a falsos negativos.
O problema principal com Sherlock sĂŁo os falsos negativos â quando um nome de usuĂĄrio existe em uma plataforma, mas nĂŁo ĂŠ detectado. O problema secundĂĄrio sĂŁo os falsos positivos, quando um nome de usuĂĄrio ĂŠ incorretamente sinalizado como disponĂvel. GoSearch
aborda esses problemas codificando por cores os resultados incertos como amarelo, o que indica potenciais falsos positivos. Isso permite que os usuårios filtrem facilmente links irrelevantes. Se houver demanda suficiente, podemos implementar uma opção para relatar apenas resultados confirmados ou focar apenas na detecção de falsos negativos.
Contribuindo
GoSearch
depende do arquivo data.json que contÊm uma lista de sites para pesquisar. Os usuårios podem contribuir adicionando novos sites para expandir os recursos de pesquisa da ferramenta. à aqui que a maioria das contribuiçþes são necessårias. O formato para adicionar novos sites Ê o seguinte:
{
"name": "Nome do site",
"base_url": "https://www.website.com/profiles/{}",
"url_probe": "opcional, veja abaixo",
"errorType": "errorMsg/status_code/profilePresence/unknown",
"errorMsg/errorCode": "errorMsg",
"cookies": [
{
"name": "nome do cookie",
"value": "valor do cookie"
}
]
}
Cada entrada deve incluir um nome de site claro e conciso para facilitar pesquisas manuais, ajudando a evitar envios duplicados.
base_url
O base_url
ĂŠ o URL GoSearch
usado para pesquisar nomes de usuĂĄrios, a menos que a url_probe
seja especificado (veja url_probe
). Sua primeira tarefa Ê identificar a localização dos perfis de usuårio em um site. Por exemplo, no Twitter, os perfis de usuårio estão localizados no caminho raiz /
, entĂŁo vocĂŞ definiria "base_url": "https://twitter.com/{}"
. O {}
Ê um espaço reservado que GoSearch
serĂĄ substituĂdo automaticamente pelo nome de usuĂĄrio ao executar a pesquisa.
Por exemplo, se vocĂŞ executar a consulta ./gosearch ibnaleem
, GoSearch
substituirĂĄ o {}
placeholder por "ibnaleem", resultando na URL https://shaffan.dev/user/ibnaleem
, assumindo que o base_url
esteja definido como https://shaffan.dev/user/{}
. Isso permite GoSearch
gerar automaticamente a URL correta para verificar o perfil do usuĂĄrio.
url_probe
Em alguns casos, os sites podem bloquear solicitaçþes diretas por motivos de segurança, mas oferecem uma API ou serviço alternativo para recuperar as mesmas informaçþes. O url_probe
campo Ê usado para especificar uma API ou URL de serviço que verifica a disponibilidade do nome de usuårio. Ao contrårio do base_url
, que ĂŠ usado para pesquisar diretamente URLs de perfil, o url_probe
gera uma solicitação de API diferente, e o GoSearch exibirå a URL da API no terminal em vez da URL do perfil.
Por exemplo, os perfis do Duolingo estĂŁo disponĂveis em https://duolingo.com/profile/{}
, mas para verificar se um nome de usuĂĄrio estĂĄ disponĂvel, o Duolingo fornece uma URL de API: https://www.duolingo.com/2017-06-30/users?username={}
. Se usĂĄssemos o url_probe
como base_url
, o terminal mostraria algo como https://www.duolingo.com/2017-06-30/users?username=ibnaleem
em vez da URL do perfil do usuĂĄrio https://duolingo.com/profile/ibnaleem
, o que poderia confundir os usuårios. Essa distinção ajuda a manter o processo mais claro e intuitivo, especialmente para aqueles que podem estar menos familiarizados com programação.
errorType
Existem 4 tipos de erro
status_code
- um cĂłdigo de status especĂfico que ĂŠ retornado se um nome de usuĂĄrio nĂŁo existir (normalmente404
)errorMsg
- uma mensagem de erro personalizada que o site exibe e que ĂŠ exclusiva para nomes de usuĂĄrios que nĂŁo existemprofilePresence
uma mensagem personalizada que o site exibe e que ĂŠ exclusiva para nomes de usuĂĄrios existentes.unknown
- quando não hå como verificar a diferença entre um nome de usuårio que existe e um que não existe no site
status_code
A maneira mais fåcil de contribuir Ê simplesmente encontrar um perfil existente e fazer uma solicitação com o seguinte código:
pacote principal
importação (
"fmt"
"log"
"net/http"
"os"
)
func MakeRequest(url string) {
resp, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
adiar resp.Body.Close()
fmt.Println("Resposta:", resp.Status)
}
func main() {
var url string = os.Args[1]
MakeRequest(url)
}
$ go build
$ ./request https://yourwebsite.com/username
Response: 200 OK
Onde username Ê o nome de usuårio existente no site. Então, faça a mesma solicitação com um nome de usuårio que não existe no site:
$ ./request https://yourwebsite.com/usernamedoesnotexist
Response: 404 Not Found
Copie e defina errorCode
, o campo abaixo errorType
, como o cĂłdigo que serĂĄ impresso no terminal (neste caso ĂŠ 404
).
errorMsg
Isso ĂŠ mais complicado, entĂŁo o que vocĂŞ precisa fazer ĂŠ baixar o corpo da resposta para um arquivo. Felizmente, eu jĂĄ escrevi o cĂłdigo para vocĂŞ:
pacote principal
importação (
"fmt"
"io"
"log"
"net/http"
"os"
)
func MakeRequest(url string) {
resp, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
corpo, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(corpo))
os.WriteFile("response.txt", []byte(corpo), 0644)
}
func main() {
url := os.Args[1] // Pega URL como argumento da linha de comando
MakeRequest(url)
}
$ go build
./test https://website.com/username
Mais uma vez, o primeiro nome de usuĂĄrio corresponde a uma conta existente, enquanto o segundo nome de usuĂĄrio ĂŠ para uma conta que nĂŁo existe. Certifique-se de renomear response.txt
para evitar que meu cĂłdigo o sobrescreva.
$ mv response.txt username_found.txt
$ ./test https://website.com/username_does_not_exist
$ mv response.txt username_not_found.txt
VocĂŞ precisarĂĄ analisar o corpo da resposta de username_not_found.txt
e comparĂĄ-lo com username_found.txt
. Procure por qualquer palavra, frase, tag HTML ou outro elemento exclusivo que apareça somente em username_not_found.txt
. Depois de identificar algo distinto, adicione-o ao errorMsg
campo abaixo do errorType
campo. Lembre-se de que errorType
sĂł pode ter um campo abaixo dele: ou errorCode
, errorMsg
mas nĂŁo ambos . Abaixo estĂĄ incorreto :
{
"errorType": "status_code",
"errorCode": 404,
"errorMsg": "<title>OlĂĄ, Mundo</title>"
}
errorMsg
O exato oposto de errorMsg
; em vez de analisar o username_not_found.txt
corpo de resposta do , analise o username_found.txt
corpo de resposta do para encontrar qualquer palavra, frase, tag HTML ou outro elemento exclusivo que apareça somente em username_found.txt
. Defina errorType: profilePresence
e defina o errorMsg
para o que vocĂŞ encontrou.
"unknown"
Ocasionalmente, o corpo da resposta pode estar vazio ou nĂŁo ter nenhum conteĂşdo exclusivo nos arquivos username_not_found.txt
e username_found.txt
. ApĂłs tentar cookies, usando o www.
subdomĂnio, vocĂŞ fica sem respostas. Nesses casos, defina o errorType
para "unknown"
(como uma string) e inclua um 404
errorCode
campo abaixo dele.
cookies
Alguns sites podem exigir cookies para recuperar dados especĂficos, como cĂłdigos de erro ou informaçþes de sessĂŁo. Por exemplo, o site dzen.ru
exige o cookie zen_sso_checked=1
, que ĂŠ incluĂdo nos cabeçalhos de solicitação ao fazer uma solicitação do navegador. Para testar cookies e analisar a resposta, vocĂŞ pode usar o seguinte cĂłdigo Go:
pacote principal
import (
"fmt"
"log"
"net/http"
"os"
)
func MakeRequest(url string) {
client := &http.Client{}
// Cria uma nova solicitação HTTP GET
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatalf("Erro ao criar solicitação: %v", err)
}
// Cria o cookie cookie
:= &http.Cookie{
Nome: "cookie_name",
Valor: "cookie_value",
}
// Adiciona o cookie à solicitação
req.AddCookie(cookie)
// Envia a solicitação
resp, err := client.Do(req)
if err != nil {
log.Fatalf("Erro ao fazer solicitação: %v", err)
}
defer resp.Body.Close()
// Exibe o status da resposta
fmt.Println("Status da resposta:", resp.Status)
}
func main() {
// Garanta que a URL seja fornecida como o primeiro argumento
se len(os.Args) < 2 {
log.Fatal("A URL ĂŠ necessĂĄria como o primeiro argumento.")
}
url := os.Args[1]
MakeRequest(url)
}
Ao testar cookies, verifique o status e o corpo da resposta. Por exemplo, se vocĂŞ sempre recebe uma 200 OK
resposta, tente adicionar www.
antes da URL, pois alguns sites redirecionam com base nisso:
$ curl -I https://pinterest.com/username
HTTP/2 308
...
location: https://www.pinterest.com/username
$ curl -I https://www.pinterest.com/username
HTTP/2 200
AlĂŠm disso, certifique-se de usar o cĂłdigo acima para analisar o corpo da resposta ao incluir o www.
subdomĂnio e os cookies relevantes.
Para contribuir, siga o modelo acima, abra um PR e eu o mesclarei se GoSearch
conseguir detectar as contas com sucesso.
LICENĂA
Este projeto estĂĄ licenciado sob a GNU General Public License - veja o arquivo LICENSE para mais detalhes.
ComentĂĄrios
Postar um comentĂĄrio