{"id":13541787,"url":"https://github.com/projectdiscovery/shuffledns","last_synced_at":"2025-04-10T16:22:21.423Z","repository":{"id":38334338,"uuid":"243079190","full_name":"projectdiscovery/shuffledns","owner":"projectdiscovery","description":"MassDNS wrapper written in go to enumerate valid subdomains using active bruteforce as well as resolve subdomains with wildcard filtering and easy input-output support.","archived":false,"fork":false,"pushed_at":"2025-03-31T20:03:30.000Z","size":1901,"stargazers_count":1404,"open_issues_count":5,"forks_count":196,"subscribers_count":37,"default_branch":"main","last_synced_at":"2025-04-03T11:41:43.590Z","etag":null,"topics":["dns","dns-bruteforcer","dns-resolution","dns-resolver","hacktoberfest","massdns","reconnaissance","subdomain-bruteforcing"],"latest_commit_sha":null,"homepage":"https://projectdiscovery.io","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/projectdiscovery.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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}},"created_at":"2020-02-25T19:04:25.000Z","updated_at":"2025-04-02T12:55:43.000Z","dependencies_parsed_at":"2024-02-16T15:46:32.664Z","dependency_job_id":"7ab5b57c-6e9b-4bbd-bd2f-0d4de65192b4","html_url":"https://github.com/projectdiscovery/shuffledns","commit_stats":{"total_commits":226,"total_committers":19,"mean_commits":"11.894736842105264","dds":0.6106194690265487,"last_synced_commit":"1e45a1b42a7910fa6af00bf6071e107af73fab48"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/projectdiscovery%2Fshuffledns","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/projectdiscovery%2Fshuffledns/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/projectdiscovery%2Fshuffledns/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/projectdiscovery%2Fshuffledns/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/projectdiscovery","download_url":"https://codeload.github.com/projectdiscovery/shuffledns/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248252660,"owners_count":21072699,"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","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":["dns","dns-bruteforcer","dns-resolution","dns-resolver","hacktoberfest","massdns","reconnaissance","subdomain-bruteforcing"],"created_at":"2024-08-01T10:00:57.080Z","updated_at":"2025-04-10T16:22:21.377Z","avatar_url":"https://github.com/projectdiscovery.png","language":"Go","readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\"static/shuffledns-logo.png\" alt=\"shuffledns\" width=\"200px\"\u003e\n  \u003cbr\u003e\n\u003c/h1\u003e\n\n\u003ch4 align=\"center\"\u003emassDNS wrapper to bruteforce and resolve the subdomains with wildcard handling support\u003c/h4\u003e\n\n\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://goreportcard.com/report/github.com/projectdiscovery/shuffledns\"\u003e\u003cimg src=\"https://goreportcard.com/badge/github.com/projectdiscovery/shuffledns\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/projectdiscovery/shuffledns/issues\"\u003e\u003cimg src=\"https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat\"\u003e\u003c/a\u003e\n\u003ca href=\"https://github.com/projectdiscovery/shuffledns/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/release/projectdiscovery/shuffledns\"\u003e\u003c/a\u003e\n\u003ca href=\"https://twitter.com/pdiscoveryio\"\u003e\u003cimg src=\"https://img.shields.io/twitter/follow/pdiscoveryio.svg?logo=twitter\"\u003e\u003c/a\u003e\n\u003ca href=\"https://discord.gg/projectdiscovery\"\u003e\u003cimg src=\"https://img.shields.io/discord/695645237418131507.svg?logo=discord\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n      \n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#features\"\u003eFeature\u003c/a\u003e •\n  \u003ca href=\"#installation-instructions\"\u003eInstall\u003c/a\u003e •\n  \u003ca href=\"#running-shuffledns\"\u003eRun\u003c/a\u003e •\n  \u003ca href=\"#handling-wildcards\"\u003eWildcard\u003c/a\u003e •\n  \u003ca href=\"#license\"\u003eLicense\u003c/a\u003e •\n  \u003ca href=\"https://discord.gg/projectdiscovery\"\u003eDiscord\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n\n`shuffleDNS` is a wrapper around `massdns`, written in go, that allows you to enumerate valid subdomains using active bruteforce, as well as resolve subdomains with wildcard handling and easy input-output support.\n\nBased on the work on `massdns` project by [@blechschmidt](https://github.com/blechschmidt).\n\n # Features\n\n\u003ch1 align=\"left\"\u003e\n  \u003cimg src=\"static/shuffledns-run.png\" alt=\"shuffledns\" width=\"700px\"\u003e\n  \u003cbr\u003e\n\u003c/h1\u003e\n\n - Simple and modular code base making it easy to contribute.\n - Fast And Simple active subdomain scanning.\n - Handles wildcard subdomains in a smart manner.\n - Optimized for **ease of use**\n - **Stdin** and **stdout** support for integrating in workflows\n\n# Usage\n\n```bash\nshuffledns -h\n```\nThis will display help for the tool. Here are all the switches it supports.\n\n```yaml\nshuffleDNS is a wrapper around massdns written in go that allows you to enumerate valid subdomains using active bruteforce as well as resolve subdomains with wildcard handling and easy input-output support.\n\nUsage:\n  ./shuffledns [flags]\n\nFlags:\nFlags:\nINPUT:\n   -d, -domain string[]           Domain to find or resolve subdomains for\n   -l, -list string               File containing list of subdomains to resolve\n   -w, -wordlist string           File containing words to bruteforce for domain\n   -r, -resolver string           File containing list of resolvers for enumeration\n   -tr, -trusted-resolver string  File containing list of trusted resolvers\n   -ri, -raw-input string         Validate raw full massdns output\n   -mode string                   Execution mode (bruteforce, resolve, filter)\n\nRATE-LIMIT:\n   -t int  Number of concurrent massdns resolves (default 10000)\n\nUPDATE:\n   -up, -update                 update shuffledns to latest version\n   -duc, -disable-update-check  disable automatic shuffledns update check\n\nOUTPUT:\n   -o, -output string            File to write output to (optional)\n   -j, -json                     Make output format as ndjson\n   -wo, -wildcard-output string  Dump wildcard ips to output file\n\nCONFIGURATIONS:\n   -m, -massdns string         Path to the massdns binary\n   -mcmd, -massdns-cmd string  Optional massdns commands to run (example '-i 10')\n   -directory string           Temporary directory for enumeration\n\nOPTIMIZATIONS:\n   -retries int           Number of retries for dns enumeration (default 5)\n   -sw, -strict-wildcard  Perform wildcard check on all found subdomains\n   -wt int                Number of concurrent wildcard checks (default 250)\n\nDEBUG:\n   -silent         Show only subdomains in output\n   -version        Show version of shuffledns\n   -v              Show Verbose output\n   -nc, -no-color  Don't Use colors in output\n```\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd\u003e  \n\n## Prerequisite\n\n`shuffledns` requires `massdns` to be installed in order to perform its operations. You can see the installation instructions at [massdns project](https://github.com/blechschmidt/massdns#compilation). If you place the binary in `/usr/bin/massdns` or `/usr/local/bin/massdns`, the tool will auto-detect the presence of the binary and use it. On Windows, you need to supply the path to the binary for the tool to work.\n\nThe tool also needs a list of valid resolvers. The [dnsvalidator](https://github.com/vortexau/dnsvalidator) project can be used to generate these lists. You also need to provide wordlist, you can use a custom wordlist or use the [commonspeak2-wordlist](https://wordlists-cdn.assetnote.io/data/manual/best-dns-wordlist.txt).\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n## Installation Instructions\n\n`shuffledns` requires `go1.21+` to install successfully. Run the following command to install the latest version: \n\n```bash\ngo install -v github.com/projectdiscovery/shuffledns/cmd/shuffledns@latest\n```\n\n## Running shuffledns\n\n`shuffledns` supports two types of operations:\n\n\u003cins\u003e**Subdomain resolving**\u003c/ins\u003e\n\nTo resolve a list of subdomains, you can pass the list of subdomains via the `-list` option.\n\n```bash\nshuffledns -d example.com -list example-subdomains.txt -r resolvers.txt -mode resolve\n```\n\nThis will run the tool against subdomains in `example-subdomains.txt` and returns the results. The tool uses the resolvers specified with `-r` flag to do the resolving.\n\nYou can also pass the list of subdomains at standard input (STDIN). This allows for easy integration in automation pipelines.\n\n```bash\nsubfinder -d example.com | shuffledns -d example.com -r resolvers.txt -mode resolve\n```\n\nThis uses the subdomains found passively by `subfinder` and resolves them with `shuffledns` returning only the unique and valid subdomains.\n\n\u003cins\u003e**Subdomain Bruteforcing**\u003c/ins\u003e\n\n`shuffledns` also supports bruteforce of a target with a given wordlist. You can use the `w` flag to pass a wordlist which will be used to generate permutations that will be resolved using massdns.\n\n```bash\nshuffledns -d hackerone.com -w wordlist.txt -r resolvers.txt -mode bruteforce\n```\n\nThis will run the tool against `hackerone.com` with the wordlist `wordlist.txt`. The domain bruteforce can also be done with standard input as in previous example for resolving the subdomains.\n\n```bash\necho hackerone.com | shuffledns -w wordlist.txt -r resolvers.txt -mode bruteforce\n```\n\n---\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd\u003e\n\n## Handling Wildcards\n\nA special feature of `shuffleDNS` is its ability to handle multi-level DNS based wildcards, and do it so with a very reduced number of DNS requests. Sometimes all the subdomains would resolve, leading to lots of garbage in the results. The way `shuffleDNS` handles this is by keeping track of how many subdomains point to an IP, and if the number of subdomains increase beyond a certain small threshold, it checks for wildcard on all the levels of the hosts for that IP iteratively.\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n### Notes\n\n- Wildcard filter feature works with domain (`-d`) input only.\n- Resolving or Brute-forcing only one operation can be done at a time. \n\n### License\n\n`shuffledns` is distributed under [GPL v3 License](https://github.com/projectdiscovery/shuffledns/blob/main/LICENSE.md)\n","funding_links":[],"categories":["Recon","Weapons","Go","Go (531)","扫描器、资产收集、子域名","BUG BOUNTY / SECURITY RESEARCH"],"sub_categories":["Subdomain Enumeration","Tools","网络服务_其他","Reconnaissance \u0026 Enumeration"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprojectdiscovery%2Fshuffledns","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprojectdiscovery%2Fshuffledns","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprojectdiscovery%2Fshuffledns/lists"}