{"id":25407004,"url":"https://github.com/helviojunior/webfinder","last_synced_at":"2025-09-15T14:39:58.248Z","repository":{"id":136452636,"uuid":"377345180","full_name":"helviojunior/webfinder","owner":"helviojunior","description":null,"archived":false,"fork":false,"pushed_at":"2025-06-19T18:31:56.000Z","size":120,"stargazers_count":19,"open_issues_count":0,"forks_count":5,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-24T15:12:32.012Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/helviojunior.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2021-06-16T02:14:11.000Z","updated_at":"2025-08-01T11:36:56.000Z","dependencies_parsed_at":"2024-01-29T09:19:19.941Z","dependency_job_id":"8337b597-c63f-4cc4-8cda-f5ab226a7699","html_url":"https://github.com/helviojunior/webfinder","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/helviojunior/webfinder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helviojunior%2Fwebfinder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helviojunior%2Fwebfinder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helviojunior%2Fwebfinder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helviojunior%2Fwebfinder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/helviojunior","download_url":"https://codeload.github.com/helviojunior/webfinder/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/helviojunior%2Fwebfinder/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275271318,"owners_count":25435367,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-15T02:00:09.272Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-16T06:19:54.171Z","updated_at":"2025-09-15T14:39:58.193Z","avatar_url":"https://github.com/helviojunior.png","language":"Python","readme":"# Web Finder (PT-BR)\r\n\r\nEsta é uma ferramenta para busca de endereços IP que respondam por uma URL específica.\r\n\r\n## Instalação\r\n\r\n\u003e :information_source: Recomendamos a utilização do `pipx` ao invés do `pip` para instalação no sistema.\r\n\r\n```\r\npython3 -m pipx install wafwebfinder\r\n```\r\n\r\n\u003e :information_source: Verifique a necessidade de executar também o comando `python3 -m pipx ensurepath`\r\n\r\n## Conceito técnico\r\n\r\nAo realizar uma requisição HTTP/S para um host a primeira fase a ser realizada pelo cliente é a resolução de nome para IP e posteriormente conexão direta para este IP. Este procedimento se refere até a camada de Transporte do modelo OSI (camada 4) onde temos apenas IP e porta. Após a conexão TCP ocorrer com sucesso o cliente monta um cabeçalho de requisição HTTP e envia ao servidor, veja o exemplo a seguir:\r\n\r\nSupondo que em um navegador seja digitado https://www.helviojunior.com.br (conforme o comando curl abaixo), primeiramente o cliente resolverá o nome DNS para o IP (cujo resultado será 54.244.151.52) e posteriormente enviará o cabeçalho conforme abaixo:\r\n\r\n```bash\r\ncurl -k https://www.helviojunior.com.br\r\n```\r\n\r\nCabeçalho:\r\n```\r\nGET / HTTP/1.1\r\nHost: www.helviojunior.com.br\r\nUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:89.0) Gecko/20100101 Firefox/89.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Language: pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3\r\nAccept-Encoding: gzip, deflate\r\nUpgrade-Insecure-Requests: 1\r\nTe: trailers\r\nConnection: close\r\n```\r\n\r\nComo podemos observar no cabeçalho `Host` temos o nome completo do servidor. Com o advento do HTTP 1.1 em diante o servidor leva em consideração este campo para rotear internamente em qual site deve responder, sendo que se o servidor estiver preparado para responder por este host (www.helviojunior.com.br) o mesmo o fará.\r\n\r\nPorém, nós podemos realizar o mesmo processo de forma diferente, onde direcionamos o cliente em qual endereço IP o mesmo deve conectar e forçamos o host no cabeçalho do HTTP conforme o comando abaixo:\r\n\r\n```bash\r\ncurl -k -H 'Host: www.helviojunior.com.br' https://54.244.151.52\r\n```\r\n\r\nDeste modo obrigatoriamente a conexão TCP ocorrerá para o IP 54.244.151.52 independente da resolução DNS, porém no cabeçalho http será enviado o host www.helviojunior.com.br. Desta forma iremos obter o mesmo resultado como resposta.\r\n\r\nDeste modo podemos alterar o endereço IP para qualquer outro, como por exemplo 10.10.10.10 que de o servidor deste IP existir e tiver preparado para responder ao site www.helviojunior.com.br a resposta (HTTP Status code e tamanho) será a mesma.\r\n\r\n```bash\r\ncurl -k -H 'Host: www.helviojunior.com.br' https://10.10.10.10\r\n```\r\n\r\n\u003e :information_source: Porém, no cenário acima o `Subject Name` informado via `SNI` será o IP ao invés do `host`, sendo assim em cenários onde o TLS exige SNI o comando acima não irá funcionar, desta forma precisaremos utilizar outra estratégia.\r\n\r\nPara isso utilizaremos o parâmetro `--resolve [DOMAIN]:[PORT]:[IP]` do CURL\r\n\r\n```bash\r\ncurl -k --resolve www.helviojunior.com.br:443:54.244.151.52 https://www.helviojunior.com.br\r\n```\r\n\r\nDeste modo, igualmente no cenário anterior, obrigatoriamente a conexão TCP ocorrerá para o IP 54.244.151.52 pois o parâmetro `--resolve` ignora a resolução de nome via DNS. Adicionalmente desta forma o cabeçalho `host` e o `Subject Name` do `SNI` serão definidos corretamente.\r\n\r\nSendo assim podemos utilizar essa técnica para passar uma lista de IPs e verificar se eles estão configurados para responder por um determinado site.\r\n\r\n\r\n## Utilização\r\n\r\nRecomendamos a utilização dessa ferramenta seguindo os seguintes passos:\r\n- Busca de todos os endereços IP atrelados ao cliente\r\n- Criação de um arquivo TXT com todos os IPs\r\n- Utilização do `WebFinder` para identificar em quais endereços IP o site é acessível\r\n\r\n### Endereços IP\r\n\r\nSupondo que em processo de enumeração encontrei para o cliente (dono do site helviojunior.com.br) os seguintes endereços IP:\r\n\r\n```\r\n13.77.161.179\r\n104.215.148.63\r\n40.76.4.15\r\n54.244.151.52\r\n172.217.1.99\r\n```\r\n\r\n### Executando o WebFinder\r\n\r\nAo executar o `WebFinder` temos o resultado abaixo, onde podemos observar que somente o servidor no IP 54.244.151.52 é capaz de responder pela URL www.helviojunior.com.br\r\n\r\n```\r\n#webfinder -t https://www.helviojunior.com.br/ -ip /tmp/ips.txt --check-both\r\n\r\n       Web Finder v0.1.2 by Helvio Junior\r\n       automated web server finder\r\n       https://github.com/helviojunior/webfinder\r\n\r\n\r\n [+] Startup parameters\r\n     command line: /usr/local/bin/webfinder -t https://www.helviojunior.com.br/ -ip /tmp/ips.txt --check-both\r\n     target: https://www.helviojunior.com.br\r\n     host: www.helviojunior.com.br\r\n     tasks: 16\r\n     request method: GET\r\n     ip address list: /tmp/ips.txt\r\n     start time 2021-06-16 10:31:16\r\n\r\n [+] Conectivity checker\r\n [+] Connection test againt https://www.helviojunior.com.br OK! (IP:54.244.151.52|CODE:200|SIZE:72826)\r\n\r\n [+] Scanning IP address for https://www.helviojunior.com.br\r\n+ https://54.244.151.52 (CODE:200|SIZE:72826)\r\n+ http://54.244.151.52 (CODE:200|SIZE:72826)\r\n\r\n [+] End time 2021-06-16 10:31:24\r\n [+] Finished tests against https://www.helviojunior.com.br, exiting\r\n```\r\n\r\n### Utilização com outras ferramentas\r\n\r\n#### Enumeração DNS\r\n\r\nDownload da wordlist e script de recon DNS\r\n```\r\ngit clone https://github.com/danielmiessler/SecLists\r\nwget https://raw.githubusercontent.com/helviojunior/libs/master/python/enumdns.py\r\n```\r\n\r\nEnumeração\r\n```\r\npython3 enumdns.py -d helviojunior.com.br -w ./SecLists/Discovery/DNS/subdomains-top1million-110000.txt -o dns_enum.txt\r\n```\r\n\r\n#### Filtrando endereços IP\r\n\r\nAgora vamos extrair somente os endereços IPs (v4) únicos da enumeração do DNS\r\n\r\n```\r\ncat dns_enum.txt | grep -oE '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}' | sort -u \u003e ips.txt\r\n```\r\n\r\n#### Localizando servidores web\r\n\r\nUtilize o `WebFinder` nos endereços IP listados para verificar quais detém a capacidade de responder pelo site desejado\r\n\r\n```\r\nwebfinder -t https://www.helviojunior.com.br/ -ip ips.txt --check-both\r\n```","funding_links":[],"categories":["Pentesting"],"sub_categories":["Payloads"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhelviojunior%2Fwebfinder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhelviojunior%2Fwebfinder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhelviojunior%2Fwebfinder/lists"}