{ "info": { "author": "Patrik Hudak", "author_email": "pato.hudak@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "\n# :cyclone: dnsgen (DNS generator)\n\nThis tool generates a combination of domain names from the provided input. Combinations are created based on wordlist. Custom words are extracted per execution. Refer to [Techniques](#techniques) section to learn more.\n\n`dnsgen` is very similar to [altdns](https://github.com/infosec-au/altdns). It does not contain DNS resolver. You should use [massdns](https://github.com/blechschmidt/massdns) for DNS resolution.\n\n![dnsgen](https://0xpatrik.com/content/images/2019/09/dnsgen-1.png)\n\n## Installation\n\n```pip3 install dnsgen```\n\n..or from GitHub:\n\n```\ngit clone https://github.com/ProjectAnte/dnsgen\ncd dnsgen\npip3 install -r requirements.txt\npython3 setup.py install\n```\n\n## Usage\n\n```$ dnsgen domains.txt``` (`domains.txt` contains a list of active domain names)\n\n* `-l` / `--wordlen`: minimum size of custom words to be extracted\n* `-w` / `--wordlist`: path to custom wordlist\n* `filename`: required parameter for an input list of domains. The input file should contain domain names separated by newline character (`\\n`). You can also use STDIN as an input method, providing `-` to this argument.\n\n**Combination with massdns:**\n\n`$ cat domains.txt | dnsgen - | massdns -r /path/to/resolvers.txt -t A -o J --flush 2>/dev/null`\n\n## Techniques\n\n*(For demo purposes, let's say that wordlist contains just one word: `stage`)*\n\n* **Insert word on every index** \u2014 Creates new subdomain levels by inserting the words between existing levels. `foo.example.com` -> `stage.foo.example.com`, `foo.stage.example.com`\n\n* **Insert num on every index** \u2014 Creates new subdomain levels by inserting the numbers between existing levels. `foo.bar.example.com` -> `1.foo.bar.example.com`, `foo.1.bar.example.com`, `01.foo.bar.example.com`, `...`\n\n* **Increase/Decrease num found** \u2014 *(In development)* If number is found in an existing subdomain, increase/decrease this number without any other alteration. `foo01.example.com` -> `foo02.example.com`, `foo03.example.com`, `...`\n\n* **Prepend word on every index** \u2014 On every subdomain level, prepend existing content with `WORD` and `WORD-`. `foo.example.com` -> `stagefoo.example.com`, `stage-foo.example.com`\n\n* **Append word on every index** \u2014 On every subdomain level, append existing content with `WORD` and `WORD-`. `foo.example.com` -> `foostage.example.com`, `foo-stage.example.com`\n\n* **Replace the word with word** \u2014 If word longer than 3 is found in an existing subdomain, replace it with other words from the wordlist. *(If we have more words than one in our wordlist)*. `stage.foo.example.com` -> `otherword.foo.example.com`, `anotherword.foo.example.com`, `...`\n\n* **Extract custom words** \u2014 Extend the wordlist based on target's domain naming conventions. Such words are either whole subdomain levels, or `-` is used for a split on some subdomain level. For instance `mapp1-current.datastream.example.com` has `mapp1`, `current`, `datastream` words. To prevent the overflow, user-defined *word length* is used for word extraction. The default value is set to **6**. This means that only words strictly longer than **5** characters are included (from the previous example, `mapp1` does not satisfy this condition). \n\n## Resources\n\n- [Subdomain Enumeration: 2019 Workflow](https://0xpatrik.com/subdomain-enumeration-2019/)\n- [Subdomain Enumeration: Doing it a Bit Smarter](https://0xpatrik.com/subdomain-enumeration-smarter/)\n\n## TO DO\n\n- Improve README\n- Tests\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/me/myproject", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "dnsgen", "package_url": "https://pypi.org/project/dnsgen/", "platform": "", "project_url": "https://pypi.org/project/dnsgen/", "project_urls": { "Homepage": "https://github.com/me/myproject" }, "release_url": "https://pypi.org/project/dnsgen/1.0.1/", "requires_dist": [ "Click", "tldextract" ], "requires_python": ">=3.6.0", "summary": "Generates DNS possibilities from existing domain names.", "version": "1.0.1" }, "last_serial": 5907993, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "70e6807b7642553de717dfcfc3293395", "sha256": "7ee2447cfde4dc0811823d336213a0f584e43cda80ed96c79d4ba4fca5c49053" }, "downloads": -1, "filename": "dnsgen-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "70e6807b7642553de717dfcfc3293395", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 6572, "upload_time": "2019-09-29T16:10:30", "url": "https://files.pythonhosted.org/packages/bd/9a/c21730cb94a29c9cf98ae7cb80ccaca3e10e58bac5c7f3f11428dc2423db/dnsgen-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c1a349afff2b4bf3fa1cde34abe5043b", "sha256": "d90497ba3f13c2f60332e29731b78d9a6c957531ede4e22fda93576a3a10424e" }, "downloads": -1, "filename": "dnsgen-1.0.0.tar.gz", "has_sig": false, "md5_digest": "c1a349afff2b4bf3fa1cde34abe5043b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 6606, "upload_time": "2019-09-29T16:10:32", "url": "https://files.pythonhosted.org/packages/91/0e/c58b2d3a87700e46cbcaf980cb82e16f72780e1cf3f8f54ae91aac2c86a3/dnsgen-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "e6400f0be9adc3d80b9fa3718b2cde78", "sha256": "924adfa3408862722c29ba853ee9e174cf9ac975645c1990f21ef83ed62a5313" }, "downloads": -1, "filename": "dnsgen-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e6400f0be9adc3d80b9fa3718b2cde78", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 6686, "upload_time": "2019-09-30T17:05:23", "url": "https://files.pythonhosted.org/packages/8b/0c/d2bd60d61561f46030519cf7ada16b9becc34cceb85314b9ca0fd4867980/dnsgen-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5c665ac03154a49306ebbd7a4904e790", "sha256": "d74f872fea4be5e56aa490d614372a7676ddf3797fbcc41335d4dfca790d262b" }, "downloads": -1, "filename": "dnsgen-1.0.1.tar.gz", "has_sig": false, "md5_digest": "5c665ac03154a49306ebbd7a4904e790", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 6718, "upload_time": "2019-09-30T17:05:26", "url": "https://files.pythonhosted.org/packages/e1/27/d131ac4fb53db1d988862728d0a192da7f1df0b4c2bcb892709348be9aed/dnsgen-1.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e6400f0be9adc3d80b9fa3718b2cde78", "sha256": "924adfa3408862722c29ba853ee9e174cf9ac975645c1990f21ef83ed62a5313" }, "downloads": -1, "filename": "dnsgen-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e6400f0be9adc3d80b9fa3718b2cde78", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=3.6.0", "size": 6686, "upload_time": "2019-09-30T17:05:23", "url": "https://files.pythonhosted.org/packages/8b/0c/d2bd60d61561f46030519cf7ada16b9becc34cceb85314b9ca0fd4867980/dnsgen-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5c665ac03154a49306ebbd7a4904e790", "sha256": "d74f872fea4be5e56aa490d614372a7676ddf3797fbcc41335d4dfca790d262b" }, "downloads": -1, "filename": "dnsgen-1.0.1.tar.gz", "has_sig": false, "md5_digest": "5c665ac03154a49306ebbd7a4904e790", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 6718, "upload_time": "2019-09-30T17:05:26", "url": "https://files.pythonhosted.org/packages/e1/27/d131ac4fb53db1d988862728d0a192da7f1df0b4c2bcb892709348be9aed/dnsgen-1.0.1.tar.gz" } ] }