├── .DS_Store ├── .github ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── core ├── __init__.py ├── colors.py ├── repl_prompt.py ├── update_log.py └── updater.py ├── logo.png ├── plugins ├── IP2PROXY-LITE-PX8.BIN.ZIP ├── Phonenumber.py ├── Username.py ├── __init__.py ├── api.py ├── censys.py ├── dnsdump.py ├── domain.py ├── honeypot.py ├── ipaddress.py ├── macaddress.py ├── maildb.py ├── metadata.py ├── nslookup.py ├── output.csv ├── portscan.py ├── proxy.py ├── reverseimagesearch.py ├── shodan_io.py ├── torrent.py ├── webosint │ ├── cmsdetect.py │ ├── crawler.py │ ├── header.py │ ├── nslookup.py │ ├── portscan.py │ ├── reverseip.py │ ├── subdomain.py │ └── who │ │ ├── output.txt │ │ ├── whoami.py │ │ └── whois.py ├── webvuln │ ├── bruteforce.py │ ├── clickjacking.py │ ├── cors.py │ ├── hostheader.py │ └── src │ │ ├── ftp.ini │ │ └── ssh.ini └── whois.py ├── reconspider.py └── setup.py /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bhavsec/reconspider/5dae8c16b2845b5ccb73aba93e333fe308b0754a/.DS_Store -------------------------------------------------------------------------------- /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at contact@bhavkaran.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | When contributing to this repository, please first discuss the change you wish to make via issue, 4 | email, or any other method with the owners of this repository before making a change. 5 | 6 | Please note we have a code of conduct, please follow it in all your interactions with the project. 7 | 8 | ## Pull Request Process 9 | 10 | 1. Ensure any install or build dependencies are removed before the end of the layer when doing a 11 | build. 12 | 2. Update the README.md with details of changes to the interface, this includes new environment 13 | variables, exposed ports, useful file locations and container parameters. 14 | 3. Increase the version numbers in any examples files and the README.md to the new version that this 15 | Pull Request would represent. The versioning scheme we use is [SemVer](http://semver.org/). 16 | 4. You may merge the Pull Request in once you have the sign-off of two other developers, or if you 17 | do not have permission to do that, you may request the second reviewer to merge it for you. 18 | 19 | ## Code of Conduct 20 | 21 | ### Our Pledge 22 | 23 | In the interest of fostering an open and welcoming environment, we as 24 | contributors and maintainers pledge to making participation in our project and 25 | our community a harassment-free experience for everyone, regardless of age, body 26 | size, disability, ethnicity, gender identity and expression, level of experience, 27 | nationality, personal appearance, race, religion, or sexual identity and 28 | orientation. 29 | 30 | ### Our Standards 31 | 32 | Examples of behavior that contributes to creating a positive environment 33 | include: 34 | 35 | * Using welcoming and inclusive language 36 | * Being respectful of differing viewpoints and experiences 37 | * Gracefully accepting constructive criticism 38 | * Focusing on what is best for the community 39 | * Showing empathy towards other community members 40 | 41 | Examples of unacceptable behavior by participants include: 42 | 43 | * The use of sexualized language or imagery and unwelcome sexual attention or 44 | advances 45 | * Trolling, insulting/derogatory comments, and personal or political attacks 46 | * Public or private harassment 47 | * Publishing others' private information, such as a physical or electronic 48 | address, without explicit permission 49 | * Other conduct which could reasonably be considered inappropriate in a 50 | professional setting 51 | 52 | ### Our Responsibilities 53 | 54 | Project maintainers are responsible for clarifying the standards of acceptable 55 | behavior and are expected to take appropriate and fair corrective action in 56 | response to any instances of unacceptable behavior. 57 | 58 | Project maintainers have the right and responsibility to remove, edit, or 59 | reject comments, commits, code, wiki edits, issues, and other contributions 60 | that are not aligned to this Code of Conduct, or to ban temporarily or 61 | permanently any contributor for other behaviors that they deem inappropriate, 62 | threatening, offensive, or harmful. 63 | 64 | ### Scope 65 | 66 | This Code of Conduct applies both within project spaces and in public spaces 67 | when an individual is representing the project or its community. Examples of 68 | representing a project or community include using an official project e-mail 69 | address, posting via an official social media account, or acting as an appointed 70 | representative at an online or offline event. Representation of a project may be 71 | further defined and clarified by project maintainers. 72 | 73 | ### Enforcement 74 | 75 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 76 | reported by contacting the project team at [INSERT EMAIL ADDRESS]. All 77 | complaints will be reviewed and investigated and will result in a response that 78 | is deemed necessary and appropriate to the circumstances. The project team is 79 | obligated to maintain confidentiality with regard to the reporter of an incident. 80 | Further details of specific enforcement policies may be posted separately. 81 | 82 | Project maintainers who do not follow or enforce the Code of Conduct in good 83 | faith may face temporary or permanent repercussions as determined by other 84 | members of the project's leadership. 85 | 86 | ### Attribution 87 | 88 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 89 | available at [http://contributor-covenant.org/version/1/4][version] 90 | 91 | [homepage]: http://contributor-covenant.org 92 | [version]: http://contributor-covenant.org/version/1/4/ 93 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | *.pyc 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .coverage 43 | .coverage.* 44 | .cache 45 | nosetests.xml 46 | coverage.xml 47 | *.cover 48 | .hypothesis/ 49 | .pytest_cache/ 50 | 51 | # Translations 52 | *.mo 53 | *.pot 54 | 55 | # Django stuff: 56 | *.log 57 | local_settings.py 58 | db.sqlite3 59 | 60 | # Flask stuff: 61 | instance/ 62 | .webassets-cache 63 | 64 | # Scrapy stuff: 65 | .scrapy 66 | 67 | # Sphinx documentation 68 | docs/_build/ 69 | 70 | # PyBuilder 71 | target/ 72 | 73 | # Jupyter Notebook 74 | .ipynb_checkpoints 75 | 76 | # pyenv 77 | .python-version 78 | 79 | # celery beat schedule file 80 | celerybeat-schedule 81 | 82 | # SageMath parsed files 83 | *.sage.py 84 | 85 | # Environments 86 | .env 87 | .venv 88 | env/ 89 | venv/ 90 | ENV/ 91 | env.bak/ 92 | venv.bak/ 93 | 94 | # Spyder project settings 95 | .spyderproject 96 | .spyproject 97 | 98 | # Rope project settings 99 | .ropeproject 100 | 101 | # mkdocs documentation 102 | /site 103 | 104 | # mypy 105 | .mypy_cache/ 106 | 107 | # modules 108 | core/config.py 109 | 110 | # vscode settings 111 | .vscode/ 112 | 113 | plugins/IP2PROXY-LITE-PX8.BIN 114 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | os: 3 | - linux 4 | python: 5 | - 2.7.15 6 | - 3.6 7 | install: 8 | - pip install requests shodan prompt_toolkit 9 | script: 10 | - python reconspider.py 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 |

Most Advanced Open Source Intelligence (OSINT) Framework

6 | 7 |

8 | 9 | 10 | 11 | 12 | 13 |

14 | 15 | # ReconSpider 16 | 17 | ReconSpider is most Advanced Open Source Intelligence (OSINT) Framework for scanning IP Address, Emails, Websites, Organizations and find out information from different sources. 18 | 19 | ReconSpider can be used by Infosec Researchers, Penetration Testers, Bug Hunters and Cyber Crime Investigators to find deep information about their target. 20 | 21 | ReconSpider aggregate all the raw data, visualize it on a dashboard and facilitate alerting and monitoring on the data. 22 | 23 | Recon Spider also combines the capabilities of [Wave](https://github.com/adithyan-ak/WAVE), [Photon](https://github.com/s0md3v/Photon) and [Recon Dog](https://github.com/s0md3v/ReconDog) to do a comprehensive enumeration of attack surface. 24 | 25 | # Why it's called ReconSpider ? 26 | 27 | ```ReconSpider``` = ```Recon``` + ```Spider``` 28 | 29 | 30 | **Recon** = **Reconnaissance** 31 | 32 | Reconnaissance is a mission to obtain information by various detection methods, about the activities and resources of an enemy or potential enemy, or geographic characteristics of a particular area. 33 | 34 | 35 | **Spider = Web crawler** 36 | 37 | A Web crawler, sometimes called a spider or spiderbot and often shortened to crawler, is an Internet bot that systematically browses the World Wide Web, typically for the purpose of Web indexing (web spidering). 38 | 39 | 40 | # Table Of Contents 41 | 42 | 1. [Version (beta)](https://github.com/bhavsec/reconspider#version-beta) 43 | 2. [Overview of the tool](https://github.com/bhavsec/reconspider#overview-of-the-tool) 44 | 3. [Mind Map (v1)](https://github.com/bhavsec/reconspider#mind-map-v1) 45 | 4. [License Information](https://github.com/bhavsec/reconspider#license-information) 46 | 5. [ReconSpider Banner](https://github.com/bhavsec/reconspider#reconspider-banner) 47 | 6. [Documentation](https://github.com/bhavsec/reconspider#documentation) 48 | 7. [Setting up the environment](https://github.com/bhavsec/reconspider#setting-up-the-environment) 49 | 8. [Updating API Keys](https://github.com/bhavsec/reconspider#updating-api-keys) 50 | 9. [Usage](https://github.com/bhavsec/reconspider#usage) 51 | 10. [Contact](https://github.com/bhavsec/reconspider#contact) 52 | 11. [Wiki & How-to Guide](https://github.com/bhavsec/reconspider#reconspider-full-wiki-and-how-to-guide) 53 | 12. [Updates](https://github.com/bhavsec/reconspider#frequent--seamless-updates) 54 | 55 | 56 | # Version (beta) 57 | 58 | ReconSpider : 1.0.7 59 | 60 | 61 | # Overview of the tool: 62 | 63 | * Performs OSINT scan on a IP Address, Emails, Websites, Organizations and find out information from different sources. 64 | * Correlates and collaborate the results, show them in a consolidated manner. 65 | * Use specific script / launch automated OSINT for consolidated data. 66 | * Currently available in only Command Line Interface (CLI). 67 | 68 | 69 | # Mind Map (v1) 70 | 71 | Check out our mind map to see visually organize information of this tool regarding api, services and techniques and more. 72 | 73 | https://bhavsec.com/img/reconspider_map.png 74 | 75 | 76 | 77 | # License Information 78 | ``` 79 | ReconSpider and its documents are covered under GPL-3.0 (General Public License v3.0) 80 | ``` 81 | 82 | 83 | 84 | ## ReconSpider Banner 85 | 86 | ``` 87 | __________ _________ __ ___ 88 | \______ \ ____ ____ ____ ____ / _____/_____ |__| __| _/___________ 89 | | _// __ \_/ ___\/ _ \ / \ \_____ \\____ \| |/ __ |/ __ \_ __ \ 90 | | | \ ___/\ \__( <_> ) | \ / \ |_> > / /_/ \ ___/| | \/ 91 | |____|_ /\___ >\___ >____/|___| / /_______ / __/|__\____ |\___ >__| 92 | \/ \/ \/ \/ \/|__| \/ \/ 93 | 94 | 95 | 96 | ENTER 0 - 13 TO SELECT OPTIONS 97 | 98 | 1. IP Enumerate information from IP Address 99 | 2. DOMAIN Gather information about given DOMAIN 100 | 3. PHONENUMBER Gather information about Phonenumber 101 | 4. DNS MAP Map DNS records associated with target 102 | 5. METADATA Extract all metadata of the given file 103 | 6. REVERSE IMAGE SEARCH Obtain domain name or IP address mapping 104 | 7. HONEYPOT Check if it's honeypot or a real system 105 | 8. MAC ADDRESS LOOKUP Obtain information about give Macaddress 106 | 9. IPHEATMAP Draw out heatmap of locations of IP 107 | 10. TORRENT Gather torrent download history of IP 108 | 11. USERNAME Extract Account info. from social media 109 | 12. IP2PROXY Check whether IP uses any VPN / PROXY 110 | 13. MAIL BREACH Checks given domain has breached Mail 111 | 99. UPDATE Update ReconSpider to its latest version 112 | 113 | 0. EXIT Exit from ReconSpider to your terminal 114 | ``` 115 | 116 | 117 | 118 | # Documentation 119 | 120 | Installing and using ReconSpider is very easy. Installation process is very simple. 121 | 122 | 1. Downloading or cloning ReconSpider github repository. 123 | 2. Installing all dependencies. 124 | 3. Setting up the Database. 125 | 126 | Let's Begin !! 127 | 128 | 129 | ### Setting up the environment 130 | 131 | Step 1 - Cloning ReconSpider on your linux system. 132 | 133 | In order to download ReconSpider simply clone the github repository. Below is the command which you can use in order to clone ReconSpider repository. 134 | ``` 135 | git clone https://github.com/bhavsec/reconspider.git 136 | ``` 137 | 138 | Step 2 - Make sure python3 and python3-pip is installed on your system. 139 | 140 | You can also perform a check by typing this command in your terminal. 141 | 142 | ``` 143 | sudo apt install python3 python3-pip 144 | ``` 145 | 146 | Step 3 - Installing all dependencies. 147 | 148 | Once you clone and check python installation, you will find directory name as **reconspider**. Just go to that directory and install using these commands: 149 | ``` 150 | cd reconspider 151 | sudo python3 setup.py install 152 | ``` 153 | 154 | Step 4 - Setting up the Database. 155 | 156 | **IP2Proxy Database** 157 | 158 | ``` 159 | https://lite.ip2location.com/database/px8-ip-proxytype-country-region-city-isp-domain-usagetype-asn-lastseen 160 | ``` 161 | Download database, extract it and move to `reconspider/plugins/` directory. 162 | 163 | 164 | # Updating API Keys 165 | 166 | APIs included in ReconSpider are FREE and having limited & restricted usage per month, Please update the current APIs with New APIs in `setup.py` file, and re-install once done to reflect the changes. 167 | 168 | > Warning: Not updating the APIs can result in not showing the expected output or it may show errors. 169 | 170 | You need to create the account and get the API Keys from the following websites. 171 | 172 | * Shodan.io - https://developer.shodan.io/api 173 | * NumVerify - https://numverify.com/documentation 174 | * IP Stack - https://ipstack.com/documentation 175 | * Google Maps - https://developers.google.com/maps/documentation/places/web-service/get-api-key 176 | 177 | 178 | # Usage 179 | 180 | 181 | ReconSpider is very handy tool and easy to use. All you have to do is just have to pass values to parameter. 182 | In order to start ReconSpider just type: 183 | ``` 184 | python3 reconspider.py 185 | ``` 186 | 187 | **1. IP** 188 | 189 | This option gathers all the information of given IP Address from public resources. 190 | ``` 191 | ReconSpider >> 1 192 | IP >> 8.8.8.8 193 | ``` 194 | 195 | **2. DOMAIN** 196 | 197 | This option gathers all the information of given URL Address and check for vulneribility. 198 | ``` 199 | Reconspider >> 2 200 | HOST (URL / IP) >> vulnweb.com 201 | PORT >> 443 202 | ``` 203 | 204 | **3. PHONENUMBER** 205 | 206 | This option allows you to gather information of given phonenumber. 207 | ``` 208 | Reconspider >> 3 209 | PHONE NUMBER (919485247632) >> 210 | ``` 211 | 212 | **4. DNS MAP** 213 | 214 | This option allows you to map an organizations attack surface with a virtual DNS Map of the DNS records associated with the target organization. 215 | ``` 216 | ReconSpider >> 4 217 | DNS MAP (URL) >> vulnweb.com 218 | ``` 219 | 220 | **5. METADATA** 221 | 222 | This option allows you to extract all metadat of the file. 223 | ``` 224 | Reconspider >> 5 225 | Metadata (PATH) >> /root/Downloads/images.jpeg 226 | ``` 227 | 228 | **6. REVERSE IMAGE SEARCH** 229 | 230 | This option allows you to obtain information and similar image that are available in internet. 231 | ``` 232 | Reconspider >> 6 233 | REVERSE IMAGE SEARCH (PATH) >> /root/Downloads/images.jpeg 234 | Open Search Result in web broser? (Y/N) : y 235 | ``` 236 | 237 | **7. HONEYPOT** 238 | 239 | This option allows you to identify honeypots! The probability that an IP is a honeypot is captured in a "Honeyscore" value that can range from 0.0 to 1.0 240 | ``` 241 | ReconSpider >> 7 242 | HONEYPOT (IP) >> 1.1.1.1 243 | ``` 244 | 245 | **8. MAC ADDRESS LOOKUP** 246 | 247 | This option allows you to identify Mac address details who is manufacturer, address, country, etc. 248 | 249 | ``` 250 | Reconspider >> 8 251 | MAC ADDRESS LOOKUP (Eg:08:00:69:02:01:FC) >> 252 | ``` 253 | 254 | **9. IPHEATMAP** 255 | 256 | This option provided you heatmap of the provided ip or single ip, if connect all the provided ip location with accurate Coordinator. 257 | ``` 258 | Reconspider >> 9 259 | 260 | 1) Trace single IP 261 | 2) Trace multiple IPs 262 | OPTIONS >> 263 | ``` 264 | 265 | **10. TORRENT** 266 | 267 | This option allows you to gathers history of Torrent download history. 268 | ``` 269 | Reconspider >> 10 270 | IPADDRESS (Eg:192.168.1.1) >> 271 | ``` 272 | 273 | **11. USERNAME** 274 | 275 | This option allows you to gathers account information of the provided username from social media like Instagram, Twitter, Facebook. 276 | ``` 277 | Reconspider >> 11 278 | 279 | 1.Facebook 280 | 2.Twitter 281 | 3.Instagram 282 | 283 | Username >> 284 | ``` 285 | 286 | **12. IP2PROXY** 287 | 288 | This option allows you to identify whether IP address uses any kind of VPN / Proxy to hide his identify. 289 | ``` 290 | Reconspider >> 12 291 | IPADDRESS (Eg:192.168.1.1) >> 292 | ``` 293 | 294 | **13. MAIL BREACH** 295 | 296 | This option allows you to identify all breached mail ID from given domain. 297 | ``` 298 | Reconspider >> 13 299 | DOMAIN (Eg:intercom.io) >> 300 | ``` 301 | 302 | **99. UPDATE** 303 | 304 | This option allows you to check for updates. If a newer version will available, ReconSpider will download and merge the updates into the current directory without overwriting other files. 305 | ``` 306 | ReconSpider >> 99 307 | Checking for updates.. 308 | ``` 309 | 310 | **0. EXIT** 311 | 312 | This option allows you to exit from ReconSpider Framework to your current Operating System's terminal. 313 | ``` 314 | ReconSpider >> 0 315 | Bye, See ya again.. 316 | ``` 317 | 318 | 319 | 320 | # Contact Developer 321 | 322 | Do you want to have a conversation in private? 323 | 324 | Twitter: @bhavsec 325 | Facebook: fb.com/bhavsec 326 | Instagram: instagram.com/bhavsec 327 | LinkedIn: linkedin.com/in/bhavsec 328 | Email: bhavsec@gmail.com 329 | Website: bhavsec.com 330 | 331 | 332 | 333 | # ReconSpider Full Wiki and How-to Guide 334 | 335 | Please go through the [ReconSpider Wiki Guide](https://github.com/bhavsec/reconspider/wiki) for a detailed explanation of each and every option and feature. 336 | 337 | 338 | # Frequent & Seamless Updates 339 | ReconSpider is under development and updates for fixing bugs. optimizing performance & new features are being rolled. Custom error handling is also not implemented, and all the focus is to create required functionality. 340 | 341 | 342 | # Special Thanks & Contributors 343 | 344 | * [Aravindha](https://github.com/Aravindha1234u) 345 | * [Ishan Batish](https://www.linkedin.com/in/ishanbatish/) 346 | * [Adithyan AK](https://github.com/adithyan-ak) 347 | * [S0md3v](https://github.com/s0md3v/) 348 | * [Parshant](mailto:parshant.dhall@gmail.com) 349 | -------------------------------------------------------------------------------- /core/__init__.py: -------------------------------------------------------------------------------- 1 | from .repl_prompt import * 2 | -------------------------------------------------------------------------------- /core/colors.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | colors = True # Output should be colored 4 | machine = sys.platform # Detecting the os of current system 5 | if machine.lower().startswith(('os', 'win', 'darwin', 'ios')): 6 | colors = False # Colors shouldn't be displayed in mac & windows 7 | if not colors: 8 | end = red = white = green = yellow = run = bad = good = info = que = '' 9 | else: 10 | white = '\033[97m' 11 | green = '\033[92m' 12 | red = '\033[91m' 13 | yellow = '\033[93m' 14 | end = '\033[0m' 15 | back = '\033[7;91m' 16 | info = '\033[93m[!]\033[0m' 17 | que = '\033[94m[?]\033[0m' 18 | bad = '\033[91m[-]\033[0m' 19 | good = '\033[32m[+]\033[0m' 20 | run = '\033[97m[~]\033[0m' 21 | -------------------------------------------------------------------------------- /core/repl_prompt.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from plugins.censys import censys_ip 5 | from plugins.dnsdump import dnsmap 6 | from plugins.honeypot import honeypot 7 | from plugins.shodan_io import shodan_host 8 | from plugins.domain import domain 9 | from plugins.Phonenumber import Phonenumber 10 | from plugins.reverseimagesearch import reverseimagesearch 11 | from plugins.metadata import gps_analyzer 12 | from plugins.macaddress import MacAddressLookup 13 | from plugins.ipaddress import IPHeatmap 14 | from plugins.torrent import torrent 15 | from plugins.proxy import ip2Proxy 16 | from plugins.maildb import maildb 17 | from plugins.Username import user 18 | from core.updater import update 19 | from prompt_toolkit import prompt 20 | from reconspider import menu 21 | 22 | 23 | def repl(): # Read–eval–print loop 24 | while 1: 25 | print(menu()) 26 | user_input = prompt("\nReconspider >> ") 27 | if len(user_input)==0: 28 | print("\n") 29 | continue 30 | try: 31 | choice = int(user_input) 32 | except ValueError: 33 | print("\n") 34 | continue 35 | 36 | if choice == 1: 37 | while 1: 38 | ip = prompt("IP >> ") 39 | break 40 | shodan_host(ip) 41 | censys_ip(ip) 42 | continue 43 | 44 | elif choice == 2: 45 | while 1: 46 | host = input("HOST (URL / IP) >> ") 47 | port = input("PORT >> ") 48 | try: 49 | if port == "": 50 | port=80 51 | elif int(port) not in [80,443]: 52 | print("Invalid port - Available(80,443)") 53 | continue 54 | except ValueError: 55 | port=80 56 | break 57 | domain(host,int(port)) 58 | continue 59 | 60 | elif choice == 3: 61 | while 1: 62 | ph = prompt("PHONE NUMBER (with CountryCode example) >> ") 63 | break 64 | Phonenumber(ph) 65 | continue 66 | 67 | elif choice == 4: 68 | while 1: 69 | dnsmap_inp = prompt("DNS MAP (URL) >> ") 70 | break 71 | dnsmap(dnsmap_inp) 72 | continue 73 | 74 | elif choice == 5: 75 | while 1: 76 | img_path = prompt("Metadata (PATH) >> ") 77 | break 78 | gps_analyzer(img_path) 79 | continue 80 | 81 | elif choice == 6: 82 | while 1: 83 | img = prompt("REVERSE IMAGE SEARCH (PATH) >> ") 84 | break 85 | reverseimagesearch(img) 86 | continue 87 | 88 | elif choice == 7: 89 | while 1: 90 | hp_inp = prompt("HONEYPOT (IP) >> ") 91 | break 92 | honeypot(hp_inp) 93 | continue 94 | 95 | elif choice == 8: 96 | while 1: 97 | mac = prompt("MAC ADDRESS LOOKUP (Eg:08:00:69:02:01:FC) >> ") 98 | break 99 | MacAddressLookup(mac) 100 | continue 101 | 102 | elif choice == 9: 103 | while 1: 104 | IPHeatmap() 105 | break 106 | continue 107 | 108 | elif choice == 10: 109 | while 1: 110 | IP = prompt("IPADDRESS (Eg:192.168.1.1) >> ") 111 | break 112 | torrent(IP) 113 | continue 114 | 115 | elif choice == 11: 116 | while 1: 117 | print("\n1.Facebook \n2.Twitter \n3.Instagram\n") 118 | username = input("Username >> ") 119 | choice = input("choice >> ") 120 | break 121 | user(choice,username) 122 | continue 123 | 124 | elif choice == 12: 125 | while 1: 126 | IP = prompt("IPADDRESS (Eg:192.168.1.1) >> ") 127 | break 128 | ip2Proxy(IP) 129 | continue 130 | 131 | elif choice == 13: 132 | while 1: 133 | web = prompt("DOMAIN (Eg:intercom.io) >> ") 134 | break 135 | maildb(web) 136 | continue 137 | 138 | elif choice == 99: 139 | while 1: 140 | break 141 | update() 142 | continue 143 | 144 | elif choice == 0: 145 | exit('\nBye, See ya again..') 146 | 147 | else: 148 | pass 149 | 150 | 151 | # Handling ctrl+c 152 | try: 153 | repl() 154 | except KeyboardInterrupt: 155 | quit('\nBye, See ya again..') 156 | -------------------------------------------------------------------------------- /core/update_log.py: -------------------------------------------------------------------------------- 1 | changes = '''Added Codacy quality badge + Bug fixes;Update feature support for Python 2;Update feature Bug Fixes;New Update feature for ReconSpider;Update usage info of reconspider.py;Added link to ReconSpider Wiki Guide;Added Development board and Contact details in README.md;Rename args file to repl_prompt;DNS Map image not auto-open Fix''' 2 | -------------------------------------------------------------------------------- /core/updater.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | import sys 4 | from requests import get 5 | 6 | if sys.version_info[0] > 2: 7 | from .update_log import changes 8 | from .colors import run, que, good, bad, info, end, green 9 | 10 | else: 11 | from update_log import changes 12 | from colors import run, que, good, bad, info, end, green 13 | 14 | def update(): 15 | print('\n%s Checking for updates..' % run) 16 | latestCommit = get('https://raw.githubusercontent.com/bhavsec/reconspider/master/core/update_log.py').text 17 | 18 | if changes not in latestCommit: # just a hack to see if a new version is available 19 | changelog = re.search(r"changes = '''(.*?)'''", latestCommit) 20 | changelog = changelog.group(1).split(';') # splitting the changes to form a list 21 | print('\n%s A new version of ReconSpider is available.' % good) 22 | print('\n%s Changes:' % info) 23 | for change in changelog: # print changes 24 | print('%s>%s %s' % (green, end, change)) 25 | 26 | currentPath = os.getcwd().split('/') # if you know it, you know it 27 | folder = currentPath[-1] # current directory name 28 | path = '/'.join(currentPath) # current directory path 29 | 30 | if sys.version_info[0] > 2: 31 | choice = input('\n%s Would you like to update? [Y/n] ' % que).lower() 32 | 33 | else: 34 | choice = raw_input('\n%s Would you like to update? [Y/n] ' % que).lower() 35 | 36 | 37 | if choice == 'y': 38 | print('\n%s Updating ReconSpider..' % run) 39 | os.system('git clone --quiet https://github.com/bhavsec/reconspider %s' % (folder)) 40 | os.system('cp -r %s/%s/* %s && rm -r %s/%s/ 2>/dev/null' % (path, folder, path, path, folder)) 41 | print('\n%s Update successful!' % good) 42 | sys.exit() 43 | else: 44 | print('\n%s Update Canceled!' % bad) 45 | 46 | else: 47 | print('\n%s ReconSpider is up to date!' % good) 48 | -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bhavsec/reconspider/5dae8c16b2845b5ccb73aba93e333fe308b0754a/logo.png -------------------------------------------------------------------------------- /plugins/IP2PROXY-LITE-PX8.BIN.ZIP: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bhavsec/reconspider/5dae8c16b2845b5ccb73aba93e333fe308b0754a/plugins/IP2PROXY-LITE-PX8.BIN.ZIP -------------------------------------------------------------------------------- /plugins/Phonenumber.py: -------------------------------------------------------------------------------- 1 | from plugins.api import phoneapis 2 | import requests 3 | 4 | def Phonenumber(ph): 5 | print ('[+]' + ' Fetching Phonenumber Details...' + '\n') 6 | apikey=phoneapis() 7 | if apikey == "": 8 | print("Add NumVerify api key to plugins/api.py") 9 | exit() 10 | ph=''.join([i for i in ph if i.isdigit()]) 11 | for api_key in apikey.split(","): 12 | url = ("http://apilayer.net/api/validate?access_key="+api_key+"&number="+str(ph)) 13 | try: 14 | response=requests.get(url) 15 | if 'error' in response.json().keys(): 16 | continue 17 | elif response.json()['valid']==False: 18 | print("Error: Invalid Mobile Number") 19 | return 20 | else: 21 | get=response.json() 22 | print("Number: "+get['number']) 23 | print("Type: "+get['line_type']) 24 | print("CountryCode: "+get['country_code']) 25 | print("Country: "+get['country_name']) 26 | print("Location: "+get['location']) 27 | print("Carrier: "+get['carrier']) 28 | print("") 29 | return 30 | except: 31 | continue 32 | print(str(response.json()['error']['info']).split(".")[0]) 33 | 34 | -------------------------------------------------------------------------------- /plugins/Username.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from bs4 import BeautifulSoup 3 | import tweepy 4 | 5 | out=[] 6 | 7 | def user(choice,username): 8 | if choice == '1': 9 | pass 10 | elif choice == '2': 11 | ScrapTweets(username) 12 | return() 13 | elif choice == '3': 14 | Instagram(username) 15 | return() 16 | else: 17 | exit() 18 | 19 | search_string = "https://en-gb.facebook.com/" + username 20 | 21 | #response is stored after request is made 22 | response = requests.get(search_string) 23 | 24 | #Response is stored and parsed to implement beautifulsoup 25 | soup = BeautifulSoup(response.text, 'html.parser') 26 | 27 | #List that will store the data that is to be fetched 28 | 29 | ###Finding Name of the user 30 | #Min div element is found which contains all the information 31 | main_div = soup.div.find(id="globalContainer") 32 | 33 | #finding name of the user 34 | def find_name(): 35 | name = main_div.find(id="fb-timeline-cover-name").get_text() 36 | print("\n"+"Name:"+name) 37 | 38 | ###Finding About the user details 39 | #finding work details of the user 40 | def find_eduwork_details(): 41 | try: 42 | education = soup.find(id="pagelet_eduwork") 43 | apple=education.find(attrs={"class":"_4qm1"}) 44 | if (apple.get_text() != " "): 45 | for category in education.find_all(attrs={"class":"_4qm1"}): 46 | print(category.find('span').get_text() + " : ") 47 | for company in category.find_all(attrs={"class":"_2tdc"}): 48 | if (company.get_text() != " "): 49 | print(company.get_text()) 50 | else: 51 | continue 52 | else: 53 | print("No work details found") 54 | except Exception as e: 55 | print(str(e)) 56 | print() 57 | 58 | #finding home details of the user 59 | def find_home_details(): 60 | if(soup.find(id="pagelet_hometown") !=" "): 61 | home = soup.find(id="pagelet_hometown") 62 | for category in home.find_all(attrs={"class":"_4qm1"}): 63 | print(category.find('span').get_text() + " : ") 64 | for company in category.find_all(attrs={"class":"_42ef"}): 65 | if (company.get_text() != " "): 66 | print(company.get_text()) 67 | else: 68 | continue 69 | else: 70 | print("No Home details found") 71 | 72 | #finding contact details of the user 73 | 74 | 75 | ###Logic for finding the status of the response 76 | if ("200" in str(response)): 77 | find_name() 78 | find_eduwork_details() 79 | find_home_details() 80 | 81 | elif ("404" in str(response)): 82 | print("Error: Profile not found") 83 | else: 84 | print("Error: some other response") 85 | return() 86 | 87 | def Instagram(username): 88 | 89 | r = requests.get("https://www.instagram.com/"+ username +"/?__a=1") 90 | if r.status_code == 200: 91 | res = r.json()['graphql']['user'] 92 | print("\nUsername: " + res['username']) 93 | print("Full Name: "+res['full_name']) 94 | try: 95 | print("Business Category: "+res['edge_follow']['business_category_name']) 96 | except Exception as e: 97 | print("Account :"+" Private" + str(e)) 98 | finally: 99 | print("Biograph: " + res['biography']) 100 | print("URL: "+ str(res['external_url'])) 101 | print("Followers: "+str(res['edge_followed_by']['count'])) 102 | print("Following: "+str(res['edge_follow']['count'])) 103 | print("Profile Picture HD: " + res['profile_pic_url_hd']) 104 | elif r.status_code == 404: 105 | print("Error: Profile Not Found") 106 | else: 107 | print("Error: Something Went Wrong") 108 | 109 | def ScrapTweets(username): 110 | auth = tweepy.OAuthHandler("f0rCnr7Tln5EnIqiD6JcuMIJ8", "DmwOASEbukzltfyZx66KQGbguORJkEqpZdGMNvbiefJoIeYvWl") 111 | auth.set_access_token("884691164900737025-nTLY2Z4KVMX4IS294Ap43hPxmDZrXSW", "oDo8dV8RgPaJpa6ifYFgp5F0K7huAb1rIhhUSl2p2ewxA") 112 | api = tweepy.API(auth) 113 | screen_name = username 114 | user = api.get_user(screen_name) 115 | 116 | 117 | try: 118 | print("Full Name of the User is : " + user.screen_name) 119 | except Exception as e: 120 | print("User Name -->"+" Not Found" + str(e)) 121 | print() 122 | 123 | try: 124 | ID = user.id_str 125 | print("The ID of the user is : " + ID) 126 | except Exception as e: 127 | print("User Id--> "+"Not Found" + str(e)) 128 | print() 129 | 130 | for friend in api.friends(screen_name): 131 | print(friend.screen_name) 132 | 133 | description = api.blocks_ids(screen_name) 134 | print("This User is blocked by : " + str(description)) 135 | 136 | 137 | 138 | -------------------------------------------------------------------------------- /plugins/__init__.py: -------------------------------------------------------------------------------- 1 | from .censys import * 2 | from .dnsdump import * 3 | from .honeypot import * 4 | from .nslookup import * 5 | from .portscan import * 6 | from .shodan_io import * 7 | from .whois import * 8 | -------------------------------------------------------------------------------- /plugins/api.py: -------------------------------------------------------------------------------- 1 | def phoneapis(): 2 | api= "e01791e4d18fbbdfa0c9033bf207decd,2f8c8e865a0b25bbf4da08c4db039b8d" 3 | return str(api) 4 | def ipstack(): 5 | api="276cfee2c31729505691e515e8321a02" 6 | return str(api) 7 | def gmap(): 8 | api="AIzaSyAKGik6Fok3_mbIsgquaAnDGNy-h_AjhVw" 9 | return str(api) 10 | -------------------------------------------------------------------------------- /plugins/censys.py: -------------------------------------------------------------------------------- 1 | import json 2 | from requests import get 3 | 4 | 5 | def censys_ip(IP): 6 | try: 7 | dirty_response = get('https://censys.io/ipv4/%s/raw' % IP).text 8 | clean_response = dirty_response.replace('"', '"') 9 | x = clean_response.split('')[1].split('')[0] 10 | censys = json.loads(x) 11 | 12 | print("\n[+] Gathering Location Information from [censys]\n") 13 | print("Country -------> "+str(censys["location"]["country"])) 14 | print("Continent -----> "+str(censys["location"]["continent"])) 15 | print("Country Code --> "+str(censys["location"]["country_code"])) 16 | print("Latitude ------> "+str(censys["location"]["latitude"])) 17 | print("Longitude -----> "+str(censys["location"]["longitude"])) 18 | except: 19 | print("Unavailable") 20 | -------------------------------------------------------------------------------- /plugins/dnsdump.py: -------------------------------------------------------------------------------- 1 | import re 2 | import os 3 | import requests 4 | import platform 5 | 6 | 7 | def dnsmap(dnsmap_inp): 8 | domain = dnsmap_inp 9 | 10 | image = requests.get('https://dnsdumpster.com/static/map/%s.png' % domain) 11 | 12 | if image.status_code == 200: 13 | image_name = domain.replace(".com","") 14 | with open('%s.png' % image_name, 'wb') as f: 15 | f.write(image.content) 16 | print("\n%s.png DNS Map image stored to current reconspider directory" % image_name) 17 | 18 | if (platform.system() != "Windows"): 19 | pass 20 | else: 21 | os.startfile('%s.png' % image_name) 22 | else: 23 | print("Sorry We Would not find the dnsmap") 24 | -------------------------------------------------------------------------------- /plugins/domain.py: -------------------------------------------------------------------------------- 1 | import socket 2 | from .webosint.cmsdetect import CMSdetect 3 | from .webosint.nslookup import nsLookup 4 | from .webosint.portscan import DefaultPort,Customrange 5 | from .webosint.reverseip import ReverseIP 6 | from .webosint.subdomain import SubDomain 7 | from .webvuln.bruteforce import ssh 8 | from .webvuln.clickjacking import ClickJacking 9 | from .webvuln.cors import Cors 10 | from .webvuln.hostheader import HostHeader 11 | from .webosint.header import header 12 | from .webosint.crawler import crawler 13 | from .webosint.who.whoami import whoami 14 | from .portscan import PortScan 15 | 16 | # Checking whether the target host is alive or dead 17 | def CheckTarget(host,port): 18 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 19 | result = s.connect_ex((host, port)) 20 | 21 | if result == 0: 22 | return True 23 | else: 24 | return False 25 | 26 | # Main Method 27 | def domain(host,port): 28 | 29 | if CheckTarget(host,port)==True: 30 | print("\nTarget Alive \n") 31 | Menu(host,port) 32 | else: 33 | print("The Host is Unreachable \n") 34 | exit() 35 | 36 | 37 | NmapFunctions = { 38 | 1: DefaultPort, 39 | 2: Customrange, 40 | } 41 | 42 | 43 | def nmaprec(host,port): 44 | try: 45 | Choice = 1 46 | while True: 47 | print("1. Scan Default Ports (22-443)") 48 | print("2. Enter Custom Range") 49 | print("3. Back to Main Menu") 50 | print('') 51 | Choice = int(input(">> ")) 52 | if (Choice >= 0) and (Choice < 3): 53 | NmapFunctions[Choice](host, port) 54 | elif Choice == 3: 55 | Menu(host,port) 56 | else: 57 | print("Please choose an Appropriate option") 58 | except AttributeError: 59 | PortScan(host) 60 | 61 | 62 | BruteFunctions = {1: ssh} 63 | 64 | def BruteForce(host, port): 65 | print("\nBrute Forcing SSH") 66 | BruteFunctions[1](host,port) 67 | 68 | 69 | MainFunctions = { 70 | 1: ReverseIP, 71 | 2: SubDomain, 72 | 3: nsLookup, 73 | 4: CMSdetect, 74 | 5: nmaprec, 75 | 6: BruteForce, 76 | 7: ClickJacking, 77 | 8: Cors, 78 | 9: HostHeader, 79 | 10:header, 80 | 11:crawler, 81 | 12:whoami 82 | } 83 | 84 | def Menu(host,port): 85 | Selection = 1 86 | while True: 87 | print('') 88 | print("1."+" ReverseIP") 89 | print("2."+" SubDomain") 90 | print("3."+" nsLookup") 91 | print("4."+" CMSDetect") 92 | print("5."+" PortScan") 93 | print("6."+" Bruteforce") 94 | print("7."+" ClickJacking") 95 | print("8."+" CORS") 96 | print("9."+" Host Header Injection") 97 | print("10."+" Header") 98 | print("11."+" Crawler") 99 | print("12."+" Whoami") 100 | print("99."+" Exit") 101 | print('') 102 | Selection = int(input("Domain >> ")) 103 | if (Selection >= 0) and (Selection <=12): 104 | MainFunctions[Selection](host, port) 105 | elif Selection == 99: 106 | return 107 | else: 108 | print("Error: Please choose an Appropriate option") 109 | print('') 110 | -------------------------------------------------------------------------------- /plugins/honeypot.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from requests import get 3 | from core.config import shodan_api 4 | 5 | 6 | def honeypot(inp): 7 | honey = 'https://api.shodan.io/labs/honeyscore/%s?key=%s' % (inp, shodan_api) 8 | try: 9 | result = get(honey).text 10 | except: 11 | result = None 12 | sys.stdout.write('\n%s No information available' % bad + '\n') 13 | if "error" in result or "404" in result: 14 | print("IP Not found") 15 | return 16 | elif result: 17 | probability = str(float(result) * 10) 18 | print('\n[+] Honeypot Probabilty: %s%%' % (probability) + '\n') 19 | else: 20 | print("Something went Wrong") 21 | -------------------------------------------------------------------------------- /plugins/ipaddress.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import gmplot 3 | from plugins.api import ipstack 4 | import webbrowser 5 | import re 6 | from plugins.api import gmap 7 | from ipaddress import * 8 | from plugins.webosint.who.whois import * 9 | 10 | api_key = ipstack() 11 | if api_key == "" : 12 | print("Add you ipstack api key to plugins/api.py") 13 | exit() 14 | if gmap() == "" : 15 | print("Add you Google Heatmap api key to plugins/api.py") 16 | exit() 17 | 18 | def IPHeatmap(): 19 | print(''' 20 | 1) Trace single IP 21 | 2) Trace multiple IPs''') 22 | choice = input("OPTIONS >> ") 23 | 24 | if choice == '1': 25 | IP = input("Enter the IP : ") 26 | read_single_IP(IP) 27 | elif choice == '2': 28 | IP_file = input("Enter the IP File Location : ") 29 | read_multiple_IP(IP_file) 30 | else: 31 | print("\nError: Please choose an appropriate option") 32 | 33 | def read_single_IP(IP): 34 | print ('[+]' + "Processing IP: %s ..." %IP + '\n') 35 | if not re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",IP): 36 | print("Invalid IP Address") 37 | IPHeatmap() 38 | lats = [] 39 | lons = [] 40 | r = requests.get("http://api.IPstack.com/" + IP + "?access_key=" + api_key) 41 | response = r.json() 42 | print('') 43 | print("IP :"+response['ip']) 44 | print("Location : " + response['region_name']) 45 | print("Country : " +response['country_name']) 46 | print("Latitude :"+" {latitude}".format(**response)) 47 | print("Longitude :"+" {longitude}".format(**response)) 48 | if input("Want More Whois Details (Y/N): ") in ("Y","y"): 49 | whois_more(IP) 50 | if response['latitude'] and response['longitude']: 51 | lats = response['latitude'] 52 | lons = response['longitude'] 53 | maps_url = "https://maps.google.com/maps?q=%s,+%s" % (lats, lons) 54 | print("") 55 | openWeb = input("Open GPS location in web broser? (Y/N) ") 56 | if openWeb.upper() == 'Y': 57 | webbrowser.open(maps_url, new=2) 58 | else: 59 | pass 60 | 61 | def read_multiple_IP(IP_file): 62 | lats = [] 63 | lons = [] 64 | try: 65 | f = open(IP_file, "r") 66 | f1 = f.readlines() 67 | print ('[+]' + " Processing....." + '\n') 68 | for line in f1: 69 | IP=re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",line) 70 | IP=IP.group() 71 | r = requests.get("http://api.IPstack.com/" + IP + "?access_key=" + api_key) 72 | response = r.json() 73 | if response['latitude'] and response['longitude']: 74 | lats.append(response['latitude']) 75 | lons.append(response['longitude']) 76 | heat_map(lats,lons) 77 | except IOError: 78 | print("ERROR : File Does not Exist\n") 79 | IPHeatmap() 80 | 81 | 82 | def heat_map(lats,lons): 83 | gmap3 = gmplot.GoogleMapPlotter(20.5937, 78.9629, 5) 84 | gmap3.heatmap(lats,lons) 85 | gmap3.scatter(lats,lons, '#FF0000', size=50, marker=False) 86 | gmap3.plot(lats,lons, 'cornflowerblue', edge_width = 3.0) 87 | save_location = input("Enter the location to save file : ") 88 | gmap3.apikey = gmap() 89 | location = save_location + "/heatmap.html" 90 | gmap3.draw(location) 91 | print("Heatmap saved at " + location) 92 | openWeb = input("Open Heatmap in web broser? (Y/N) : ") 93 | if openWeb.upper() == 'Y': 94 | webbrowser.open(url=("file:///"+location)) 95 | else: 96 | pass 97 | -------------------------------------------------------------------------------- /plugins/macaddress.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | def MacAddressLookup(mac): 4 | url = ("https://macvendors.co/api/" + mac) 5 | response=requests.get(url) 6 | result=response.json() 7 | if result["result"]: 8 | final=result['result'] 9 | print("Company:" + final["company"]) 10 | print("Address:" + final["address"]) 11 | print("Country:" + final["country"]) 12 | print("") 13 | else: 14 | print("Error: Something Went Wrong") 15 | -------------------------------------------------------------------------------- /plugins/maildb.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | def maildb(emailaddress): 4 | if ("@" and ".com") or ("@" and ".in") in emailaddress: 5 | req=requests.get("https://api.hunter.io/v2/domain-search?domain="+emailaddress+"&api_key=9f189e87e011a1d2f3013ace7b14045dec60f62c") 6 | j=req.json() 7 | print("[+] Breaching from "+emailaddress+"...\n") 8 | for i in range(len(j['data']['emails'])): 9 | print("Email ID :",j['data']['emails'][i]['value']) 10 | print("First Name :",j['data']['emails'][i]['first_name']) 11 | print("Last Name :",j['data']['emails'][i]['last_name']) 12 | if j['data']['emails'][i]['position']!=None: 13 | print("Position :",j['data']['emails'][i]['position']) 14 | if j['data']['emails'][i]['linkedin']!=None: 15 | print("Linkedin :",j['data']['emails'][i]['linkedin']) 16 | if j['data']['emails'][i]['twitter']!=None: 17 | print("Twitter :",j['data']['emails'][i]['twitter']) 18 | print() 19 | else: 20 | print("Error: Invalid Email Address") 21 | -------------------------------------------------------------------------------- /plugins/metadata.py: -------------------------------------------------------------------------------- 1 | import webbrowser 2 | from PIL import Image 3 | from PIL.ExifTags import * 4 | 5 | def get_exif(fn): 6 | try: 7 | ret = {} 8 | print ('[+]' + 'Checking the Metadata...' + '\n') 9 | i = Image.open(fn) 10 | info = i._getexif() 11 | if str(info) == "None": 12 | print("Metadata is not Much Informative:") 13 | return -1 14 | for tag, value in info.items(): 15 | decoded = TAGS.get(tag, tag) 16 | ret[decoded] = value 17 | return ret 18 | except IOError: 19 | print('') 20 | print("ERROR : File not found") 21 | exit() 22 | 23 | def gps_analyzer(img_path): 24 | 25 | a = get_exif(img_path) 26 | 27 | if a==-1: 28 | return 29 | for x,y in a.items(): 30 | print("%s : %s" %(x, y)) 31 | 32 | if "GPSInfo" in a: 33 | lat = [float(x) / float(y) for x, y in a['GPSInfo'][2]] 34 | latref = a['GPSInfo'][1] 35 | lon = [float(x) / float(y) for x, y in a['GPSInfo'][4]] 36 | lonref = a['GPSInfo'][3] 37 | 38 | lat = lat[0] + lat[1] / 60 + lat[2] / 3600 39 | lon = lon[0] + lon[1] / 60 + lon[2] / 3600 40 | if latref == 'S': 41 | lat = -lat 42 | if lonref == 'W': 43 | lon = -lon 44 | map_it(lat, lon) 45 | 46 | else: 47 | print('') 48 | print("GPS location not found") 49 | 50 | 51 | def map_it(lat, lon): 52 | # Prints latitude and longitude values 53 | print('') 54 | print("Accurate Latitude : %s" % lat) 55 | print("Accurate Longitude : %s" % lon) 56 | print('') 57 | # Creates the URL for the map using the latitude and longitude values 58 | maps_url = "https://maps.google.com/maps?q=%s,+%s" % (lat, lon) 59 | # Prompts the user to launch a web browser with the map 60 | openWeb = input("Open GPS location in web broser? (Y/N) ") 61 | if openWeb.upper() == 'Y': 62 | webbrowser.open(maps_url, new=2) 63 | -------------------------------------------------------------------------------- /plugins/nslookup.py: -------------------------------------------------------------------------------- 1 | from requests import get 2 | 3 | 4 | def nslookup(inp): 5 | result = get('http://api.hackertarget.com/dnslookup/?q=' + inp).text 6 | print('\n' + result) 7 | -------------------------------------------------------------------------------- /plugins/output.csv: -------------------------------------------------------------------------------- 1 | Target,Type,Data 2 | -------------------------------------------------------------------------------- /plugins/portscan.py: -------------------------------------------------------------------------------- 1 | from requests import get 2 | 3 | 4 | def PortScan(inp): 5 | result = get('http://api.hackertarget.com/nmap/?q=' + inp).text 6 | print('\n' + result + '\n') 7 | -------------------------------------------------------------------------------- /plugins/proxy.py: -------------------------------------------------------------------------------- 1 | import IP2Proxy 2 | import re 3 | import requests 4 | from plugins.api import * 5 | from plugins.webosint.who.whois import * 6 | 7 | 8 | def ip2Proxy(IP): 9 | 10 | if re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",IP): 11 | db = IP2Proxy.IP2Proxy() 12 | db.open("./plugins/IP2PROXY-LITE-PX8.BIN") 13 | record = db.get_all(IP) 14 | db.close() 15 | if record['is_proxy']!=0: 16 | #print(record) 17 | print("Proxy: " + "Enabled") 18 | print("Proxy Type:" + record['proxy_type']) 19 | print("Country Code:" + record['country_short']) 20 | print("Country:" + record['country_long']) 21 | print("Region Name:" + record['region']) 22 | print("City:" + record['city']) 23 | print("Isp:" + record['isp']) 24 | print("Domain:" + record['domain']) 25 | print("Usage:" + record['usage_type']) 26 | print("ASN:" + record['asn']) 27 | print("Name:" + record['as_name']) 28 | api_key = ipstack() 29 | if api_key == "": 30 | print("Add you ipstack api key to plugins/api.py") 31 | exit() 32 | r = requests.get("http://api.IPstack.com/" + IP + "?access_key=" + api_key) 33 | response = r.json() 34 | print("Latitude :"+" {latitude}".format(**response)) 35 | print("Longitude :"+" {longitude}".format(**response)) 36 | if input("Want More Whois Details (Y/N):") in ["Y","y"]: 37 | whois_more(IP) 38 | if response['latitude'] and response['longitude']: 39 | lats = response['latitude'] 40 | lons = response['longitude'] 41 | url = "https://maps.google.com/maps?q=%s,+%s" % (lats, lons) 42 | print("Google Map Link :" + url) 43 | else: 44 | print("IP does not use any Proxy or VPN") 45 | else: 46 | print("\nEnter a Valid IP Address") 47 | print("") 48 | -------------------------------------------------------------------------------- /plugins/reverseimagesearch.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import webbrowser 3 | 4 | def reverseimagesearch(img): 5 | try: 6 | surl='https://www.google.co.in/searchbyimage/upload' 7 | murl={'encoded_image': (img, open(img, 'rb')), 'image_content': ''} 8 | response = requests.post(surl, files=murl, allow_redirects=False) 9 | fetchUrl = response.headers['Location'] 10 | openWeb = input("Open Search Result in web broser? (Y/N) : ") 11 | if openWeb.upper() == 'Y': 12 | webbrowser.open(fetchUrl) 13 | else: 14 | pass 15 | except IOError: 16 | print() 17 | print("ERROR : File Does not Exist\n") 18 | -------------------------------------------------------------------------------- /plugins/shodan_io.py: -------------------------------------------------------------------------------- 1 | import shodan 2 | from core.config import shodan_api 3 | 4 | api = shodan.Shodan(shodan_api) 5 | 6 | 7 | def shodan_host(IP): 8 | try: 9 | host = api.host(IP) 10 | print("\n[+] Gathering IP Address Information from [shodan]\n") 11 | print("IP Address ----> " + str(host['ip_str'])) 12 | print("Country -------> " + str(host['country_name'])) 13 | print("City ----------> " + str(host['city'])) 14 | print("Organization --> " + str(host['org'])) 15 | print("ISP -----------> " + str(host['isp'])) 16 | print("Open ports ----> " + str(host['ports'])) 17 | except: 18 | print("Unavailable") 19 | 20 | 21 | def shodan_ip(IP): 22 | try: 23 | host = api.host(IP) 24 | print("\n[+] Gathering Domain Information from [shodan]\n") 25 | print("IP Address ----> " + str(host['ip_str'])) 26 | print("Country -------> " + str(host['country_name'])) 27 | print("City ----------> " + str(host['city'])) 28 | print("Organization --> " + str(host['org'])) 29 | print("ISP -----------> " + str(host['isp'])) 30 | print("Open ports ----> " + str(host['ports'])) 31 | except: 32 | print("Unavailable") 33 | -------------------------------------------------------------------------------- /plugins/torrent.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | 4 | def torrent(IP): 5 | 6 | r = requests.get("https://api.antitor.com/history/peer/?ip="+ IP +"&key=3cd6463b477d46b79e9eeec21342e4c7") 7 | res = r.json() 8 | print ( '[+]' + " Processing Torrent....." + '\n') 9 | if len(res)>4: 10 | print("IP Address: "+res['ip']) 11 | print("ISP: "+res['isp']) 12 | print("Country: "+res['geoData']['country']) 13 | print("Latitude: "+str(res['geoData']['latitude'])) 14 | print("Longitude: "+str(res['geoData']['longitude'])+"\n") 15 | for i in res['contents']: 16 | print("Category:"+i['category']) 17 | print("Name:"+i['name']) 18 | print("Start:" + i['startDate']) 19 | print("End:" + i['endDate']) 20 | print("Size:"+str(i['torrent']['size'])) 21 | print("") 22 | else: 23 | print("Error: Something Went Wrong") 24 | -------------------------------------------------------------------------------- /plugins/webosint/cmsdetect.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | def CMSdetect(domain, port): 4 | payload = {'key': '1641c3b9f2b1c8676ceaba95d00f7cf2e3531830c5fa9a6cc5e2d922b2ed7165dcce66', 'url': domain} 5 | cms_url = "https://whatcms.org/APIEndpoint/Detect" 6 | response = requests.get(cms_url, params=payload) 7 | cms_data = response.json() 8 | cms_info = cms_data['result'] 9 | if cms_info['code'] == 200: 10 | print('Detected CMS : %s' % cms_info['name']) 11 | print('Detected Version : %s' % cms_info['version']) 12 | print('Confidence : %s' % cms_info['confidence']) 13 | else: 14 | print(cms_info['msg']) 15 | print('Detected CMS : %s' % cms_info['name']) 16 | print('Detected Version : %s' % cms_info['version']) 17 | -------------------------------------------------------------------------------- /plugins/webosint/crawler.py: -------------------------------------------------------------------------------- 1 | import os 2 | import bs4 3 | import requests 4 | 5 | user_agent = {'User-Agent' : 'Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0'} 6 | 7 | def crawler(target,port): 8 | if port == 80: 9 | port="http://" 10 | elif port == 443: 11 | port="https://" 12 | else: 13 | print("Could'nt fetch data for the given PORT") 14 | 15 | total = [] 16 | r_total = [] 17 | sm_total = [] 18 | js_total = [] 19 | css_total = [] 20 | int_total = [] 21 | ext_total = [] 22 | img_total = [] 23 | print ('\n' + '[+]' + ' Crawling Target...'+ '\n') 24 | try: 25 | target=port+target 26 | rqst = requests.get(target, headers=user_agent, verify=True, timeout=10) 27 | sc = rqst.status_code 28 | if sc == 200: 29 | domain = target.split('//') 30 | domain = domain[1] 31 | page = rqst.content 32 | soup = bs4.BeautifulSoup(page, 'lxml') 33 | file = '{}.dump'.format(domain) 34 | path = os.getcwd() 35 | r_url = 'http://{}/robots.txt'.format(domain) 36 | sm_url = 'http://{}/sitemap.xml'.format(domain) 37 | 38 | print( '[+]' + ' Looking for robots.txt' , end = '') 39 | r_rqst = requests.get(r_url, headers=user_agent, verify=True, timeout=10) 40 | r_sc = r_rqst.status_code 41 | 42 | if r_sc == 200: 43 | print('['.rjust(9, '.') + ' Found ]' ) 44 | print('[+]' + ' Extracting robots Links', end = '') 45 | r_page = r_rqst.text 46 | r_scrape = r_page.split('\n') 47 | for entry in r_scrape: 48 | if 'Disallow' in entry: 49 | url = entry.split(':') 50 | try: 51 | url = url[1] 52 | url = url.strip() 53 | total.append(url) 54 | r_total.append(target + url) 55 | except Exception as e: 56 | print(e) 57 | elif 'Allow' in entry: 58 | url = entry.split(':') 59 | try: 60 | url = url[1] 61 | url = url.strip() 62 | total.append(url) 63 | r_total.append(target + url) 64 | except Exception as e: 65 | print(e) 66 | r_total = set(r_total) 67 | print('['.rjust(8, '.') + ' {} ]'.format(str(len(r_total)))) 68 | 69 | elif r_sc == 404: 70 | print( '['.rjust(9, '.') + ' Not Found ]' ) 71 | else: 72 | print( '['.rjust(9, '.') + ' {} ]'.format(r_sc) ) 73 | 74 | print('[+]' + ' Looking for sitemap.xml' , end = '') 75 | sm_rqst = requests.get(sm_url, headers=user_agent, verify=True, timeout=10) 76 | sm_sc = sm_rqst.status_code 77 | if sm_sc == 200: 78 | print('['.rjust(8, '.') + ' Found ]' ) 79 | print('[+]' + ' Extracting sitemap Links', end = '') 80 | sm_page = sm_rqst.content 81 | sm_soup = bs4.BeautifulSoup(sm_page, 'xml') 82 | links = sm_soup.find_all('loc') 83 | for url in links: 84 | url = url.get_text() 85 | if url is not None: 86 | total.append(url) 87 | sm_total.append(url) 88 | sm_total = set(sm_total) 89 | print('['.rjust(7, '.') + ' {} ]'.format(str(len(sm_total)))) 90 | 91 | elif sm_sc == 404: 92 | print( '['.rjust(8, '.') + ' Not Found ]' ) 93 | else: 94 | print( '['.rjust(8, '.') + ' {} ]'.format(sm_sc) ) 95 | 96 | print('[+]' + ' Extracting CSS Links' , end = '') 97 | css = soup.find_all('link') 98 | for link in css: 99 | url = link.get('href') 100 | if url is not None and '.css' in url: 101 | total.append(url) 102 | css_total.append(url) 103 | css_total = set(css_total) 104 | print('['.rjust(11, '.') + ' {} ]'.format(str(len(css_total)))) 105 | 106 | print('[+]' + ' Extracting Javascript Links' , end = '') 107 | js = soup.find_all('script') 108 | for link in js: 109 | url = link.get('src') 110 | if url is not None and '.js' in url: 111 | total.append(url) 112 | js_total.append(url) 113 | js_total = set(js_total) 114 | print('['.rjust(4, '.') + ' {} ]'.format(str(len(js_total)))) 115 | 116 | print('[+]' + ' Extracting Internal Links' , end = '') 117 | links = soup.find_all('a') 118 | for link in links: 119 | url = link.get('href') 120 | if url is not None: 121 | if domain in url: 122 | total.append(url) 123 | int_total.append(url) 124 | int_total = set(int_total) 125 | print('['.rjust(6, '.') + ' {} ]'.format(str(len(int_total)))) 126 | 127 | print('[+]' + ' Extracting External Links' , end = '') 128 | for link in links: 129 | url = link.get('href') 130 | if url is not None: 131 | if domain not in url and 'http' in url: 132 | total.append(url) 133 | ext_total.append(url) 134 | ext_total = set(ext_total) 135 | print('['.rjust(6, '.') + ' {} ]'.format(str(len(ext_total)))) 136 | 137 | print('[+]' + ' Extracting Images' , end = '') 138 | images = soup.find_all('img') 139 | for link in images: 140 | src = link.get('src') 141 | if src is not None and len(src) > 1: 142 | total.append(src) 143 | img_total.append(src) 144 | img_total = set(img_total) 145 | print('['.rjust(14, '.') + ' {} ]'.format(str(len(img_total)))) 146 | 147 | total = set(total) 148 | print('\n' + '[+]' + ' Total Links Extracted : ' + str(len(total)) + '\n') 149 | 150 | if len(total) is not 0: 151 | print('[+]' + ' Dumping Links in ' + '{}/dumps/{}'.format(path, file)) 152 | with open(path+'/dumps/{}'.format('{}.dump'.format(domain)), 'w') as dumpfile: 153 | dumpfile.write('URL : {}'.format(target) + '\n\n') 154 | try: 155 | dumpfile.write('Title : {}'.format(soup.title.string) + '\n') 156 | except AttributeError as e: 157 | dumpfile.write('Title : None' + '\n') 158 | dumpfile.write('\nrobots Links : ' + str(len(r_total))) 159 | dumpfile.write('\nsitemap Links : ' + str(len(sm_total))) 160 | dumpfile.write('\nCSS Links : ' + str(len(css_total))) 161 | dumpfile.write('\nJS Links : ' + str(len(js_total))) 162 | dumpfile.write('\nInternal Links : ' + str(len(int_total))) 163 | dumpfile.write('\nExternal Links : ' + str(len(ext_total))) 164 | dumpfile.write('\nImages Links : ' + str(len(img_total))) 165 | dumpfile.write('\nTotal Links Found : ' + str(len(total)) + '\n') 166 | print(str(e)) 167 | 168 | if len(r_total) is not 0: 169 | dumpfile.write('\nrobots :\n\n') 170 | for item in r_total: 171 | dumpfile.write(str(item) + '\n') 172 | if len(sm_total) is not 0: 173 | dumpfile.write('\nsitemap :\n\n') 174 | for item in sm_total: 175 | dumpfile.write(str(item) + '\n') 176 | if len(css_total) is not 0: 177 | dumpfile.write('\nCSS :\n\n') 178 | for item in css_total: 179 | dumpfile.write(str(item) + '\n') 180 | if len(js_total) is not 0: 181 | dumpfile.write('\nJavascript :\n\n') 182 | for item in js_total: 183 | dumpfile.write(str(item) + '\n') 184 | if len(int_total) is not 0: 185 | dumpfile.write('\nInternal Links :\n\n') 186 | for item in int_total: 187 | dumpfile.write(str(item) + '\n') 188 | if len(ext_total) is not 0: 189 | dumpfile.write('\nExternal Links :\n\n') 190 | for item in ext_total: 191 | dumpfile.write(str(item) + '\n') 192 | if len(img_total) is not 0: 193 | dumpfile.write('\nImages :\n\n') 194 | for item in img_total: 195 | dumpfile.write(str(item) + '\n') 196 | 197 | else: 198 | print ( '[-]' + ' Error : ' + str(sc)) 199 | except Exception as e: 200 | print( '[-] Error : ' + str(e)) 201 | -------------------------------------------------------------------------------- /plugins/webosint/header.py: -------------------------------------------------------------------------------- 1 | import requests 2 | requests.packages.urllib3.disable_warnings() 3 | 4 | def header(target,port): 5 | if port == 80: 6 | port="http://" 7 | elif port == 443: 8 | port="https://" 9 | else: 10 | print("Could'nt fetch data for the given PORT") 11 | exit() 12 | print ('\n' + '[+]' + ' Headers :' + '\n') 13 | rqst = requests.get(port+target, verify=True, timeout=10) 14 | for k, v in rqst.headers.items(): 15 | print ('[+]' + ' {} : '.format(k) + v) 16 | -------------------------------------------------------------------------------- /plugins/webosint/nslookup.py: -------------------------------------------------------------------------------- 1 | from requests import get 2 | 3 | R = '\033[31m' # red 4 | G = '\033[32m' # green 5 | C = '\033[36m' # cyan 6 | W = '\033[0m' # white 7 | 8 | def nsLookup(host, port): 9 | print ( '[+]' + 'Fetching Details...' + '\n') 10 | result = get('http://api.hackertarget.com/dnslookup/?q=' + host).text 11 | print(result) 12 | -------------------------------------------------------------------------------- /plugins/webosint/portscan.py: -------------------------------------------------------------------------------- 1 | import nmap 2 | import json 3 | 4 | def DefaultPort(Xhost, Yport): 5 | print('') 6 | print("Starting port scan with range 22-443") 7 | nm = nmap.PortScanner() 8 | result = nm.scan(Xhost, '22-443') 9 | display(result) 10 | 11 | def Customrange(Xhost, Yport): 12 | print('') 13 | port_range = input("Enter the range : ") 14 | print('') 15 | print("Starting port scan with range %s"%port_range) 16 | nm = nmap.PortScanner() 17 | result = nm.scan(Xhost, port_range) 18 | display(result) 19 | 20 | def display(result): 21 | new = next(iter(result['scan'].values())) 22 | ip_add = new['addresses'] 23 | print('') 24 | print("IP Address : %s" % ip_add['ipv4']) 25 | hosting = new['hostnames'] 26 | hostname0 = hosting[0] 27 | hostname1 = hosting[1] 28 | print('') 29 | print("Hostname 1 : %s" % hostname0['name']) 30 | print("Hostname 2 : %s" % hostname1['name']) 31 | print('') 32 | print("Open Ports : ") 33 | print('') 34 | ports = new['tcp'] 35 | json_scan = json.dumps(ports) 36 | parsed = json.loads(json_scan) 37 | print(json.dumps(parsed, indent=4, sort_keys=True)) 38 | print('') 39 | -------------------------------------------------------------------------------- /plugins/webosint/reverseip.py: -------------------------------------------------------------------------------- 1 | from requests import get 2 | 3 | 4 | def ReverseIP(host, port): 5 | print ( '[+]' + 'Checking whether the Target is reachable ...' + '\n') 6 | lookup = 'https://api.hackertarget.com/reverseiplookup/?q=%s' % host 7 | try: 8 | result = get(lookup).text 9 | print(result) 10 | except Exception as e: 11 | print('Error: Invalid IP address '+e) 12 | -------------------------------------------------------------------------------- /plugins/webosint/subdomain.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | def SubDomain(host, port): 4 | print ('[+]' + 'Fetching Subdomains of Target...' + '\n') 5 | url = 'https://www.virustotal.com/vtapi/v2/domain/report' 6 | 7 | params = {'apikey':'1af37bfeb7b1628ba10695fb187987a6651793e37df006a5cdf8786b0e4f6453','domain':host} 8 | 9 | response = requests.get(url, params=params) 10 | 11 | subdomains = response.json() 12 | 13 | for x in subdomains['domain_siblings']: 14 | print(x) 15 | -------------------------------------------------------------------------------- /plugins/webosint/who/output.txt: -------------------------------------------------------------------------------- 1 | % [whois.apnic.net] 2 | % Whois data copyright terms http://www.apnic.net/db/dbcopyright.html 3 | 4 | % Information related to '182.72.162.0 - 182.72.162.63' 5 | 6 | % Abuse contact for '182.72.162.0 - 182.72.162.63' is 'ipspamsupport@airtel.com' 7 | 8 | inetnum: 182.72.162.0 - 182.72.162.63 9 | netname: KRCF-1933857-Coimbatore 10 | descr: KUMARAGURU COLLEGE OF TEC 11 | descr: n/a 12 | descr: KUMARAGURU COLLEGE OF TECHNOLOGY THUDIYALUR 13 | descr: ROAD SARAVANAMPATTI COIMBATORE-641035 14 | descr: Coimbatore 15 | descr: TAMIL NADU 16 | descr: India 17 | descr: Contact Person: N SIVARAMAKRISHNAN 18 | descr: Email: sivaramakrishnan.n.support@kct.ac.in 19 | descr: Phone: 9789559327 20 | country: IN 21 | admin-c: NA40-AP 22 | tech-c: NA40-AP 23 | mnt-by: MAINT-IN-BBIL 24 | mnt-irt: IRT-BHARTI-IN 25 | status: ASSIGNED NON-PORTABLE 26 | last-modified: 2017-02-27T10:46:40Z 27 | source: APNIC 28 | 29 | irt: IRT-BHARTI-IN 30 | address: Bharti Airtel Ltd. 31 | address: ISP Division - Transport Network Group 32 | address: 234 , Okhla Industrial Estate, 33 | address: Phase III, New Delhi-110020, INDIA 34 | e-mail: ipspamsupport@airtel.com 35 | abuse-mailbox: ipspamsupport@airtel.com 36 | admin-c: NA40-AP 37 | tech-c: NA40-AP 38 | auth: # Filtered 39 | remarks: ipspamsupport@airtel.com was validated on 2019-12-14 40 | mnt-by: MAINT-IN-BBIL 41 | last-modified: 2019-12-14T08:39:37Z 42 | source: APNIC 43 | 44 | person: Network Administrator 45 | nic-hdl: NA40-AP 46 | e-mail: noc-dataprov@airtel.com 47 | address: Bharti Airtel Ltd. 48 | address: ISP Division - Transport Network Group 49 | address: Plot no.16 , Udyog Vihar , Phase -IV , Gurgaon - 122015 , Haryana , INDIA 50 | address: Phase III, New Delhi-110020, INDIA 51 | phone: +91-124-4222222 52 | fax-no: +91-124-4244017 53 | country: IN 54 | mnt-by: MAINT-IN-BBIL 55 | last-modified: 2018-12-18T12:52:19Z 56 | source: APNIC 57 | 58 | % Information related to '182.72.162.0/24AS9498' 59 | 60 | route: 182.72.162.0/24 61 | descr: BHARTI-IN 62 | descr: Bharti Airtel Limited 63 | descr: Class A ISP in INDIA . 64 | descr: Plot No. CP-5,sector-8, 65 | descr: IMT Manesar 66 | descr: INDIA 67 | country: IN 68 | origin: AS9498 69 | mnt-by: MAINT-IN-BBIL 70 | last-modified: 2010-05-15T09:59:58Z 71 | source: APNIC 72 | 73 | % This query was served by the APNIC Whois Service version 1.88.15-46 (WHOIS-JP3) 74 | 75 | 76 | -------------------------------------------------------------------------------- /plugins/webosint/who/whoami.py: -------------------------------------------------------------------------------- 1 | import whois 2 | from pythonping import ping 3 | import re 4 | 5 | def whoami(target,post): 6 | #target=input("Enter the IP Address/Domain:") 7 | getweb=str(ping(target)) 8 | ip = re.compile('(([2][5][0-5]\.)|([2][0-4][0-9]\.)|([0-1]?[0-9]?[0-9]\.)){3}' 9 | +'(([2][5][0-5])|([2][0-4][0-9])|([0-1]?[0-9]?[0-9]))') 10 | match = ip.search(getweb) 11 | if match: 12 | #target=match.group() 13 | w = whois.whois(target) 14 | print("Domain Name:"+ str(w['domain_name'])) 15 | print("Register:"+str(w['registrar'])) 16 | try: 17 | print("Whois Server:"+str(w['whois_server'])) 18 | except Exception as e: 19 | print(e) 20 | print("Server:"+str(w['name_servers'])) 21 | print("Emails:"+str(w['emails'])) 22 | try: 23 | print("Organisation:"+str(w['org'])) 24 | except Exception as e: 25 | print("Organisation:"+str(w['organization'])) 26 | print(e) 27 | try: 28 | print("Address:"+str(w['address'])) 29 | print("City:"+str(w['city'])) 30 | print("State:"+str(w['state'])) 31 | print("Zipcode:"+str(w['zipcode'])) 32 | except Exception as e: 33 | print(e) 34 | print("Country:"+str(w['country'])) 35 | -------------------------------------------------------------------------------- /plugins/webosint/who/whois.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | def whois_more(IP): 4 | result = requests.get('http://api.hackertarget.com/whois/?q=' + IP).text 5 | print('\n'+ result + '\n') 6 | -------------------------------------------------------------------------------- /plugins/webvuln/bruteforce.py: -------------------------------------------------------------------------------- 1 | import paramiko 2 | import socket 3 | 4 | def ssh(host, port): 5 | print("1. Default Port (22)") 6 | print("2. Custom Port") 7 | choice = int(input("BruteForce >>")) 8 | if choice == 2: 9 | port = int(input("Enter the Custom Telnet Port : ")) 10 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 11 | s.settimeout(10) 12 | try: 13 | connect = s.connect_ex((host, port)) 14 | if connect != 0: 15 | print("[+] Port %s: Closed" %port) 16 | s.close() 17 | 18 | elif connect == 0: 19 | print("[+] Port %s: Open" %port) 20 | s.close() 21 | wordlist = input("Enter Wordlist location (Press Enter for Default Wordlist) : ") 22 | if wordlist == '': 23 | f = open("src/telnet.ini", "r") 24 | f1 = f.readlines() 25 | else: 26 | f = open(wordlist, "r") 27 | f1 = f.readlines() 28 | for x in f1: 29 | y = x.split(':') 30 | username = y[0].strip(":") 31 | password = y[1].strip("\n") 32 | ssh = paramiko.SSHClient() 33 | ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 34 | print("Checking with Username : %s , Password : %s" % (username, password)) 35 | try: 36 | ssh.connect(host, port=port, username=username, password=password, timeout=10) 37 | flag = 0 38 | 39 | except paramiko.AuthenticationException: 40 | flag = 1 41 | 42 | except socket.error as e: 43 | flag = 2 44 | print(e) 45 | 46 | except KeyboardInterrupt: 47 | print("\n User Interrupt! Exitting...") 48 | exit() 49 | 50 | ssh.close() 51 | 52 | if flag == 0: 53 | print('') 54 | print("Credentials Found") 55 | print("Username : %s" % username) 56 | print(("Password : %s") % password) 57 | print('') 58 | elif flag == 1: 59 | print("Invalid Credentials") 60 | except socket.error as e: 61 | print("Error : %s" %e) 62 | 63 | elif choice == 1 | choice!= 2: 64 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 65 | s.settimeout(10) 66 | try: 67 | connect = s.connect_ex((host, 22)) 68 | if connect != 0: 69 | print("[+] Port 22: Closed") 70 | s.close() 71 | 72 | elif connect == 0: 73 | print("[+] Port 22: Open") 74 | s.close() 75 | wordlist = input("Enter Wordlist location (Press Enter for Default Wordlist) : ") 76 | if wordlist == '': 77 | f = open("src/ssh.ini", "r") 78 | f1 = f.readlines() 79 | else: 80 | f = open(wordlist, "r") 81 | f1 = f.readlines() 82 | for x in f1: 83 | y = x.split(':') 84 | username = y[0].strip(":") 85 | password = y[1].strip("\n") 86 | ssh = paramiko.SSHClient() 87 | ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 88 | print("Checking with Username : %s , Password : %s" % (username, password)) 89 | try: 90 | ssh.connect(host, port=22, username=username, password=password, timeout=10) 91 | flag = 0 92 | 93 | except paramiko.AuthenticationException: 94 | flag = 1 95 | 96 | except socket.error as e: 97 | flag = 2 98 | print(e) 99 | 100 | except KeyboardInterrupt: 101 | print("\n User Interrupt! Exitting...") 102 | exit() 103 | 104 | ssh.close() 105 | 106 | if flag == 0: 107 | print('') 108 | print("Credentials Found") 109 | print("Username : %s" % username) 110 | print(("Password : %s") % password) 111 | print('') 112 | elif flag == 1: 113 | print("Invalid Credentials") 114 | except socket.error as e: 115 | print("Error : %s" % e) 116 | -------------------------------------------------------------------------------- /plugins/webvuln/clickjacking.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | def ClickJacking(host, port): 4 | 5 | if port == 80: 6 | port = 'http://' 7 | elif port == 443: 8 | port = 'https://' 9 | else: 10 | print("Could'nt fetch data for the given PORT") 11 | 12 | 13 | url = (port+host) 14 | page=requests.get(url) 15 | headers=page.headers 16 | if not "X-Frame-Options" in headers: 17 | print("Website is vulnerable to ClickJacking") 18 | 19 | else: 20 | print("Website is not Vulnerable to ClickJacking") 21 | -------------------------------------------------------------------------------- /plugins/webvuln/cors.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | 4 | header1 = None 5 | domain2 = None 6 | header2 = None 7 | domain3 = None 8 | header3 = None 9 | 10 | 11 | def Cors(host, port): 12 | if port == 80: 13 | port = 'http://' 14 | elif port == 443: 15 | port = 'https://' 16 | else: 17 | print("Could'nt fetch data for the given PORT") 18 | exit() 19 | print("1. CORS check in Default Host") 20 | print("2. CORS check in Host's Custom Endpoint") 21 | print('') 22 | choice = int(input('CORS >>')) 23 | print('') 24 | cookies = input("Paste the Cookies (If None,then hit enter) : ") 25 | global header1 26 | global domain2 27 | global header2 28 | global domain3 29 | global header3 30 | if cookies == '': 31 | 32 | header1 = {'Origin': 'http://evil.com'} 33 | 34 | domain2 = host + '.evil.com' 35 | 36 | header2 = {'Origin': port + domain2} 37 | 38 | domain3 = host + '%60cdl.evil.com' 39 | 40 | header3 = {'Origin': port + domain3} 41 | 42 | Choices(host, port, choice) 43 | else: 44 | 45 | header1 = {'Origin': 'http://evil.com', 'Cookie': cookies} 46 | 47 | domain2 = host + '.evil.com' 48 | 49 | header2 = {'Origin': port + domain2,'Cookie': cookies} 50 | 51 | domain3 = host + '%60cdl.evil.com' 52 | 53 | header3 = {'Origin': port + domain3,'Cookie': cookies} 54 | 55 | Choices(host, port, choice) 56 | 57 | 58 | def Choices(host, port, choice): 59 | if choice == 2: 60 | endpoint = input("Enter the Custom Endpoint : ") 61 | host = endpoint 62 | WrongChoice(host, port) 63 | 64 | elif choice == 1: 65 | print("Checking Default Host ") 66 | url = (port + host) 67 | print("Testing with Payload %s" % header1) 68 | response = requests.get(url, headers=header1) 69 | if 'evil.com' in response.headers: 70 | print("Vulnerable to Cross Origin Resource Sharing") 71 | else: 72 | print("Not Vulnerable to Cross Origin Resource Sharing") 73 | print('') 74 | 75 | print("Testing with Payload %s" % header2) 76 | response = requests.get(url, headers=header2) 77 | 78 | if domain2 in response.headers: 79 | print("Vulnerable to Cross Origin Resource Sharing") 80 | else: 81 | print("Not Vulnerable to Cross Origin Resource Sharing") 82 | print('') 83 | 84 | print("Testing with Payload %s" % header3) 85 | response = requests.get(url, headers=header3) 86 | if domain2 in response.headers: 87 | print("Vulnerable to Cross Origin Resource Sharing") 88 | else: 89 | print("Not Vulnerable to Cross Origin Resource Sharing") 90 | print('') 91 | else: 92 | print("Wrong Choice") 93 | print("Checking Default Host") 94 | WrongChoice(host, port) 95 | 96 | def WrongChoice(host, port): 97 | url = (port + host) 98 | print("Testing with Payload %s" % header1) 99 | response = requests.get(url, headers=header1) 100 | if 'evil.com' in response.headers: 101 | print("Vulnerable to Cross Origin Resource Sharing") 102 | else: 103 | print("Not Vulnerable to Cross Origin Resource Sharing") 104 | print('') 105 | 106 | print("Testing with Payload %s" % header2) 107 | response = requests.get(url, headers=header2) 108 | 109 | if domain2 in response.headers: 110 | print("Vulnerable to Cross Origin Resource Sharing") 111 | else: 112 | print("Not Vulnerable to Cross Origin Resource Sharing") 113 | print('') 114 | 115 | print("Testing with Payload %s" % header3) 116 | response = requests.get(url, headers=header3) 117 | if domain2 in response.headers: 118 | print("Vulnerable to Cross Origin Resource Sharing") 119 | else: 120 | print("Not Vulnerable to Cross Origin Resource Sharing") 121 | print('') 122 | -------------------------------------------------------------------------------- /plugins/webvuln/hostheader.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | def HostHeader(host, port): 4 | if port == 80: 5 | port = 'http://' 6 | elif port == 443: 7 | port = 'https://' 8 | else: 9 | print("Could'nt fetch data for the given PORT") 10 | return 11 | url = (port + host) 12 | headers = {'Host': 'http://evil.com'} 13 | response = requests.get(url, headers=headers) 14 | if 'evil.com' in response.headers: 15 | print("Vulnerable to Host Header Injection") 16 | else: 17 | print("Not Vulnerable to Host header injection") 18 | -------------------------------------------------------------------------------- /plugins/webvuln/src/ftp.ini: -------------------------------------------------------------------------------- 1 | anonymous:anonymous 2 | root:rootpasswd 3 | root:12hrs37 4 | ftp:b1uRR3 5 | admin:admin 6 | localadmin:localadmin 7 | admin:1234 8 | apc:apc 9 | admin:nas 10 | Root:wago 11 | Admin:wago 12 | User:user 13 | Guest:guest 14 | ftp:ftp 15 | admin:password 16 | a:avery 17 | admin:123456 18 | adtec:none 19 | admin:admin12345 20 | none:dpstelecom 21 | instrument:instrument 22 | user:password 23 | root:password 24 | default:default 25 | admin:default 26 | nmt:1234 27 | admin:Janitza 28 | supervisor:supervisor 29 | user1:pass1 30 | avery:avery 31 | IEIeMerge:eMerge 32 | ADMIN:12345 33 | beijer:beijer 34 | Admin:admin 35 | admin:1234 36 | admin:1111 37 | root:admin 38 | se:1234 39 | admin:stingray 40 | device:apc 41 | apc:apc 42 | dm:ftp 43 | dmftp:ftp 44 | httpadmin:fhttpadmin 45 | user:system 46 | MELSEC:MELSEC 47 | QNUDECPU:QNUDECPU 48 | ftp_boot:ftp_boot 49 | uploader:ZYPCOM 50 | ftpuser:password 51 | USER:USER 52 | qbf77101:hexakisoctahedron 53 | ntpupdate:ntpupdate 54 | sysdiag:factorycast@schneider 55 | wsupgrade:wsupgrade 56 | pcfactory:pcfactory 57 | loader:fwdownload 58 | test:testingpw 59 | webserver:webpages 60 | fdrusers:sresurdf 61 | nic2212:poiuypoiuy 62 | user:user00 63 | su:ko2003wa 64 | MayGion:maygion.com 65 | admin:9999 66 | PlcmSpIp:PlcmSpIp -------------------------------------------------------------------------------- /plugins/webvuln/src/ssh.ini: -------------------------------------------------------------------------------- 1 | root:calvin 2 | root:root 3 | adithya:toor 4 | root:toor 5 | administrator:password 6 | NetLinx:password 7 | administrator:Amx1234! 8 | adithya:toor 9 | amx:password 10 | amx:Amx1234! 11 | admin:1988 12 | admin:admin 13 | Administrator:Vision2 14 | cisco:cisco 15 | c-comatic:xrtwk318 16 | root:qwasyx21 17 | admin:insecure 18 | pi:raspberry 19 | user:user 20 | root:default 21 | root:leostream 22 | leo:leo 23 | localadmin:localadmin 24 | fwupgrade:fwupgrade 25 | root:rootpasswd 26 | admin:password 27 | root:timeserver 28 | admin:password 29 | admin:motorola 30 | cloudera:cloudera 31 | root:p@ck3tf3nc3 32 | apc:apc 33 | device:apc 34 | eurek:eurek 35 | netscreen:netscreen 36 | admin:avocent 37 | root:linux 38 | sconsole:12345 39 | root:5up 40 | cirros:cubswin:) 41 | root:uClinux 42 | root:alpine 43 | root:dottie 44 | root:arcsight 45 | root:unitrends1 46 | vagrant:vagrant 47 | root:vagrant 48 | m202:m202 49 | demo:fai 50 | root:fai 51 | root:ceadmin 52 | maint:password 53 | root:palosanto 54 | root:ubuntu1404 55 | root:cubox-i 56 | debian:debian 57 | root:debian 58 | root:xoa 59 | root:sipwise 60 | debian:temppwd 61 | root:sixaola 62 | debian:sixaola 63 | myshake:shakeme 64 | stackato:stackato 65 | root:screencast 66 | root:stxadmin 67 | root:nosoup4u 68 | root:indigo 69 | root:video 70 | default:video 71 | default: 72 | ftp:video 73 | nexthink:123456 74 | ubnt:ubnt 75 | root:ubnt 76 | sansforensics:forensics 77 | elk_user:forensics 78 | osboxes:osboxes.org 79 | root:osboxes.org 80 | sans:training 81 | user:password 82 | misp:Password1234 83 | hxeadm:HXEHana1 84 | acitoolkit:acitoolkit 85 | osbash:osbash 86 | enisa:enisa 87 | geosolutions:Geos 88 | pyimagesearch:deeplearning 89 | root:NM1$88 90 | remnux:malware 91 | hunter:hunter 92 | plexuser:rasplex 93 | root:openelec 94 | root:rasplex 95 | root:plex 96 | root:openmediavault 97 | root:ys123456 98 | root:libreelec 99 | openhabian:openhabian 100 | admin:ManagementConsole2015 101 | public:publicpass 102 | admin:hipchat 103 | nao:nao 104 | support:symantec 105 | root:max2play 106 | admin:pfsense 107 | root:root01 108 | root:nas4free 109 | USERID:PASSW0RD 110 | Administrator:p@ssw0rd 111 | root:freenas 112 | root:cxlinux 113 | admin:symbol 114 | admin:Symbol 115 | admin:superuser 116 | admin:admin123 117 | root:D13HH[ 118 | root:blackarch 119 | root:dasdec1 120 | root:7ujMko0admin 121 | root:7ujMko0vizxv 122 | root:Zte521 123 | root:zlxx -------------------------------------------------------------------------------- /plugins/whois.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | def whois(wh): 4 | url = wh 5 | result = requests.get('http://api.hackertarget.com/whois/?q=' + url).text 6 | print('\n'+ result + '\n') 7 | -------------------------------------------------------------------------------- /reconspider.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | def banner(): 4 | return (""" 5 | __________ _________ __ ___ 6 | \______ \ ____ ____ ____ ____ / _____/_____ |__| __| _/___________ 7 | | _// __ \_/ ___\/ _ \ / \ \_____ \\\____ \| |/ __ |/ __ \_ __ \\ 8 | | | \ ___/\ \__( <_> ) | \ / \ |_> > / /_/ \ ___/| | \/ 9 | |____|_ /\___ >\___ >____/|___| / /_______ / __/|__\____ |\___ >__| 10 | \/ \/ \/ \/ \/|__| \/ \/ 11 | """) 12 | def menu(): 13 | return (""" 14 | ENTER 0 - 13 TO SELECT OPTIONS 15 | 16 | 1. IP Enumerate information from IP Address 17 | 2. DOMAIN Gather information about given DOMAIN 18 | 3. PHONENUMBER Gather information about Phonenumber 19 | 4. DNS MAP Map DNS records associated with target 20 | 5. METADATA Extract all metadata of the given file 21 | 6. REVERSE IMAGE SEARCH Obtain domain name or IP address mapping 22 | 7. HONEYPOT Check if it's honeypot or a real system 23 | 8. MAC ADDRESS LOOKUP Obtain information about give Macaddress 24 | 9. IPHEATMAP Draw out heatmap of locations of IP 25 | 10. TORRENT Gather torrent download history of IP 26 | 11. USERNAME Extract Account info. from social media 27 | 12. IP2PROXY Check whether IP uses any VPN / PROXY 28 | 13. MAIL BREACH Checks given domain has breached Mail 29 | 99. UPDATE Update ReconSpider to its latest version 30 | 31 | 0. EXIT Exit from ReconSpider to your terminal 32 | """) 33 | 34 | if __name__ == '__main__': 35 | if sys.version_info[0] > 2: 36 | try: 37 | print(banner()) 38 | from core import repl_prompt 39 | except ModuleNotFoundError: 40 | print('\nSeems like you haven\'t installed Requirements or You are not using python3 version, Please install using: python3 setup.py install') 41 | quit() 42 | else: 43 | try: 44 | from core import repl_prompt 45 | except ImportError: 46 | print('\nSeems like you haven\'t installed Requirements or You are not using python3 version,, Please install using: python3 setup.py install') 47 | quit() 48 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | import os 3 | import pip 4 | 5 | fout = open("core/config.py", "w") 6 | 7 | # Shodan.io API (https://developer.shodan.io/api) 8 | fout.write("shodan_api = " + '"' + "e9SxSRCE1xDNS4CzyWzOQTUoE55KB9HX" + '"' + "\n") 9 | fout.close() 10 | 11 | fout = open("plugins/api.py", "w") 12 | 13 | # NumVerify API (https://numverify.com/documentation) 14 | fout.write("def phoneapis():"+ "\n") 15 | fout.write(" api= "+ '"' + "ecf584dd7bccdf2c152fdf3f5595ba20" + '"' + "\n") 16 | 17 | # IP Stack API (https://ipstack.com/documentation) 18 | fout.write(" return str(api)"+ "\n") 19 | fout.write("def ipstack():"+ "\n") 20 | fout.write(" api="+ '"' +"406792616a740641c6a0588a0ee1c509"+ '"' + "\n") 21 | fout.write(" return str(api)"+ "\n") 22 | 23 | # Google Maps API (hhttps://developers.google.com/maps/documentation/places/web-service/get-api-key) 24 | fout.write("def gmap():"+ "\n") 25 | fout.write(" api="+ '"' +"AIzaSyBY9Rfnjo3UWHddicUrwHCHY37OoqxI478"+ '"' + "\n") 26 | fout.write(" return str(api)"+ "\n") 27 | fout.close() 28 | 29 | setup( 30 | name="ReconSpider", 31 | version="1.0.7", 32 | description="Most Advanced OSINT Framework", 33 | url="https://github.com/bhavsec/reconspider/", 34 | author="BhavKaran (bhavsec.com)", 35 | author_email="bhavsec@gmail.com", 36 | license="GPL-3.0", 37 | install_requires=["shodan", "requests", "prompt_toolkit","wget","beautifulsoup4","click","urllib3","IP2proxy","wget","paramiko","h8mail","nmap","pythonping","whois","gmplot","pillow","lxml","tweepy"], 38 | console=["reconspider.py"], 39 | ) 40 | 41 | try: 42 | import wget 43 | except Exception as e: 44 | print(e) 45 | pip.main(['install','wget']) 46 | import wget 47 | 48 | # ip2 Location Database (https://lite.ip2location.com/database/px8-ip-proxytype-country-region-city-isp-domain-usagetype-asn-lastseen?lang=en_US) 49 | url="https://www.ip2location.com/download?token=hg5uYe2Jvri4R7P1j8b71Pk8dnvIU2M6A9jz2tvcVtGx8ZK2UPQgzr6Hk3cV68oH&file=PX8LITEBIN" 50 | print('\nDownloading IP2PROXY-IP-PROXYTYPE-COUNTRY-REGION-CITY-ISP-DOMAIN-USAGETYPE-ASN-LASTSEEN.BIN...') 51 | filepath=os.getcwd()+"/plugins/" 52 | wget.download(url,out=filepath) 53 | print('\nDownload Finished') 54 | 55 | import zipfile 56 | print('\nExtracting Files') 57 | with zipfile.ZipFile(filepath+"IP2PROXY-LITE-PX8.BIN.ZIP","r") as zip_ref: 58 | zip_ref.extract("IP2PROXY-LITE-PX8.BIN",filepath) 59 | 60 | print("\nInstallation Successfull") 61 | print("\n\nNote: APIs included in ReconSpider are FREE and having limited & restricted usage per month, Please update the current APIs with New APIs in setup.py file, and re-install once done.") 62 | print("\nWarning: Not updating the APIs can result in not showing the expected output or it may show errors.") --------------------------------------------------------------------------------