## PyMultiTor
[](https://pypi.org/project/pymultitor/)
[](https://pepy.tech/project/pymultitor)

Python Multi Threaded Tor Proxy,
Did you ever want to be at two different places at the same time?
When I asked myself this question, I actually started developing this solution in my mind.
While performing penetration tests there are often problems caused by security devices that block the "attacking" IP.
This really annoyed me, so I wrote a script to supply a solution for this problem.
With a large number of IP addresses performing the attacks, better results are guaranteed - especially when attempting
attacks to bypass Web Application Firewalls, Brute-Force type attacks and many more.
[Blackhat Asia] https://www.blackhat.com/asia-17/arsenal.html#pymultitor
[Owasp-IL Presentation] https://www.owasp.org/images/3/3d/OWASPIL-2016-02-02_PyMultiTor_TomerZait.pdf
[DigitalWhisper Article (Hebrew)] http://www.digitalwhisper.co.il/files/Zines/0x2E/DW46-3-PyMultitor.pdf

## Installation
### Prerequisites
* Python 3.10+.
* mitmproxy (https://mitmproxy.org/).
* tor.
* On Ubuntu / Kali, `sudo apt install -y tor`
* On Centos, `sudo yum install -y tor`
* On Fedora, `sudo dnf install -y tor`
* On Windows,
* download tor expert bundle: https://www.torproject.org/download/tor/
* insert tor to your path environment: `{tor-win32-*_path}\Tor`
* if you don't know how remember tor.exe path and use `--tor-cmd` argument on pymultitor (for
example: `pymultitor --tor-cmd "c:\Pentest\Web\tor-win32-0.2.9.9\Tor\tor.exe"`)
* On MacOS, `brew install tor`
### From pip
```shell
pip3 install pymultitor
```
### From Docker
```shell
docker pull realgam3/pymultitor
```
### From Source
```shell
git clone https://github.com/realgam3/pymultitor.git
cd pymultitor
# Install python dependencies.
# Depending on your setup, one or both of these may require sudo.
pip3 install -r requirements.txt
python3 setup.py install
# Confirm that everything works
pymultitor --help
```
Bug reports on installation issues are welcome!
## Usage
### Basic Usage
1. Run `pymultitor --on-string "Your IP Address Blocked"`.
2. On your script use proxy (`http://127.0.0.1:8080`).
When the string `Your IP Address Blocked` will present in the response content, you will exit from another IP address.
### Docker Usage
1. Run `docker run --rm -p 8080:8080 realgam3/pymultitor --on-string "Your IP Address Blocked"`.
2. On your script use proxy (`http://127.0.0.1:8080`).
When the string `Your IP Address Blocked` will present in the response content, you will exit from another IP address.
### Command Line Arguments
```shell
pymultitor --help
```
```text
usage: pymultitor [-h] [-v] [-lh LISTEN_HOST] [-lp LISTEN_PORT] [-s] [-a AUTH] [-i] [-d] [-p PROCESSES] [-c CMD] [-e CONFIG] [-t TIMEOUT] [-r TRIES] [--on-count ON_COUNT] [--on-string ON_STRING] [--on-regex ON_REGEX] [--on-rst] [--on-status-code ON_STATUS_CODE]
options:
-h, --help show this help message and exit
-v, --version show program's version number and exit
-lh LISTEN_HOST, --host LISTEN_HOST
proxy listen host. (default: 127.0.0.1)
-lp LISTEN_PORT, --port LISTEN_PORT
proxy listen port (default: 8080)
-s, --socks use as socks proxy (not http proxy) (default: False)
-a AUTH, --auth AUTH set proxy authentication (format: 'username:pass') (default: )
-i, --insecure insecure ssl (default: False)
-d, --debug Debug Log. (default: False)
-p PROCESSES, --tor-processes PROCESSES
number of tor processes in the cycle (default: 2)
-c CMD, --tor-cmd CMD
tor cmd (executable path + arguments) (default: tor)
-e CONFIG, --tor-config CONFIG
tor extended json configuration (default: {})
-t TIMEOUT, --tor-timeout TIMEOUT
number of seconds before our attempt to start a tor instance timed out (default: 90)
-r TRIES, --tor-tries TRIES
number tries to start a tor instance before it fails (default: 5)
--on-count ON_COUNT change ip every x requests (resources also counted) (default: 0)
--on-string ON_STRING
change ip when string found in the response content (default: )
--on-regex ON_REGEX change ip when regex found in The response content (default: )
--on-rst change ip when connection closed with tcp rst (default: False)
--on-status-code ON_STATUS_CODE
change ip when a specific status code returned (default: 0)
```
Raw data
{
"_id": null,
"home_page": "https://github.com/realgam3/pymultitor",
"name": "PyMultitor",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": "",
"keywords": "",
"author": "Tomer Zait (realgam3)",
"author_email": "realgam3@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/75/fb/adc9e0ae38ab1bbbc13f6b4c2e991a14372091f51a637a6342d4430bf377/PyMultitor-4.0.0.tar.gz",
"platform": "any",
"description": "## PyMultiTor\n\n[](https://pypi.org/project/pymultitor/)\n[](https://pepy.tech/project/pymultitor)\n \n\nPython Multi Threaded Tor Proxy, \nDid you ever want to be at two different places at the same time? \nWhen I asked myself this question, I actually started developing this solution in my mind. \nWhile performing penetration tests there are often problems caused by security devices that block the \"attacking\" IP. \nThis really annoyed me, so I wrote a script to supply a solution for this problem. \nWith a large number of IP addresses performing the attacks, better results are guaranteed - especially when attempting\nattacks to bypass Web Application Firewalls, Brute-Force type attacks and many more.\n\n[Blackhat Asia] https://www.blackhat.com/asia-17/arsenal.html#pymultitor \n[Owasp-IL Presentation] https://www.owasp.org/images/3/3d/OWASPIL-2016-02-02_PyMultiTor_TomerZait.pdf \n[DigitalWhisper Article (Hebrew)] http://www.digitalwhisper.co.il/files/Zines/0x2E/DW46-3-PyMultitor.pdf\n\n\n\n## Installation\n\n### Prerequisites\n\n* Python 3.10+.\n* mitmproxy (https://mitmproxy.org/).\n* tor.\n * On Ubuntu / Kali, `sudo apt install -y tor`\n * On Centos, `sudo yum install -y tor`\n * On Fedora, `sudo dnf install -y tor`\n * On Windows,\n * download tor expert bundle: https://www.torproject.org/download/tor/\n * insert tor to your path environment: `{tor-win32-*_path}\\Tor`\n * if you don't know how remember tor.exe path and use `--tor-cmd` argument on pymultitor (for\n example: `pymultitor --tor-cmd \"c:\\Pentest\\Web\\tor-win32-0.2.9.9\\Tor\\tor.exe\"`)\n * On MacOS, `brew install tor`\n\n### From pip\n\n```shell\npip3 install pymultitor\n```\n\n### From Docker\n\n```shell\ndocker pull realgam3/pymultitor\n```\n\n### From Source\n\n```shell\ngit clone https://github.com/realgam3/pymultitor.git\ncd pymultitor\n\n# Install python dependencies.\n# Depending on your setup, one or both of these may require sudo.\npip3 install -r requirements.txt\npython3 setup.py install\n\n# Confirm that everything works\npymultitor --help\n```\n\nBug reports on installation issues are welcome!\n\n## Usage\n\n### Basic Usage\n\n1. Run `pymultitor --on-string \"Your IP Address Blocked\"`. \n2. On your script use proxy (`http://127.0.0.1:8080`). \n When the string `Your IP Address Blocked` will present in the response content, you will exit from another IP address. \n\n### Docker Usage\n\n1. Run `docker run --rm -p 8080:8080 realgam3/pymultitor --on-string \"Your IP Address Blocked\"`. \n2. On your script use proxy (`http://127.0.0.1:8080`). \n When the string `Your IP Address Blocked` will present in the response content, you will exit from another IP address. \n\n\n### Command Line Arguments\n\n```shell\npymultitor --help\n```\n\n```text\nusage: pymultitor [-h] [-v] [-lh LISTEN_HOST] [-lp LISTEN_PORT] [-s] [-a AUTH] [-i] [-d] [-p PROCESSES] [-c CMD] [-e CONFIG] [-t TIMEOUT] [-r TRIES] [--on-count ON_COUNT] [--on-string ON_STRING] [--on-regex ON_REGEX] [--on-rst] [--on-status-code ON_STATUS_CODE]\n\noptions:\n -h, --help show this help message and exit\n -v, --version show program's version number and exit\n -lh LISTEN_HOST, --host LISTEN_HOST\n proxy listen host. (default: 127.0.0.1)\n -lp LISTEN_PORT, --port LISTEN_PORT\n proxy listen port (default: 8080)\n -s, --socks use as socks proxy (not http proxy) (default: False)\n -a AUTH, --auth AUTH set proxy authentication (format: 'username:pass') (default: )\n -i, --insecure insecure ssl (default: False)\n -d, --debug Debug Log. (default: False)\n -p PROCESSES, --tor-processes PROCESSES\n number of tor processes in the cycle (default: 2)\n -c CMD, --tor-cmd CMD\n tor cmd (executable path + arguments) (default: tor)\n -e CONFIG, --tor-config CONFIG\n tor extended json configuration (default: {})\n -t TIMEOUT, --tor-timeout TIMEOUT\n number of seconds before our attempt to start a tor instance timed out (default: 90)\n -r TRIES, --tor-tries TRIES\n number tries to start a tor instance before it fails (default: 5)\n --on-count ON_COUNT change ip every x requests (resources also counted) (default: 0)\n --on-string ON_STRING\n change ip when string found in the response content (default: )\n --on-regex ON_REGEX change ip when regex found in The response content (default: )\n --on-rst change ip when connection closed with tcp rst (default: False)\n --on-status-code ON_STATUS_CODE\n change ip when a specific status code returned (default: 0)\n```\n",
"bugtrack_url": null,
"license": "GPLv3",
"summary": "PyMultitor - Never Stop Even If Your IP Dropped.",
"version": "4.0.0",
"project_urls": {
"Homepage": "https://github.com/realgam3/pymultitor",
"Source": "https://github.com/realgam3/pymultitor"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "0078ce69646e3e90ef8b1554ef5461e911e87614f56541309880261fed6cdda2",
"md5": "69c7a9b83600ec856d357f5c21aa2d1a",
"sha256": "45d11a25cced2c7545cc5739f7b5b19bb5bca949c84c4a0eade7e2263d385efb"
},
"downloads": -1,
"filename": "PyMultitor-4.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "69c7a9b83600ec856d357f5c21aa2d1a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 21043,
"upload_time": "2024-01-06T10:46:08",
"upload_time_iso_8601": "2024-01-06T10:46:08.236380Z",
"url": "https://files.pythonhosted.org/packages/00/78/ce69646e3e90ef8b1554ef5461e911e87614f56541309880261fed6cdda2/PyMultitor-4.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "75fbadc9e0ae38ab1bbbc13f6b4c2e991a14372091f51a637a6342d4430bf377",
"md5": "b0a9c7497d0c2b47b99995a2a4a33c87",
"sha256": "7d87ee9230911b323d9313f6482c13911c3c2f480e0c76750242beabcc3523ef"
},
"downloads": -1,
"filename": "PyMultitor-4.0.0.tar.gz",
"has_sig": false,
"md5_digest": "b0a9c7497d0c2b47b99995a2a4a33c87",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 21031,
"upload_time": "2024-01-06T10:46:09",
"upload_time_iso_8601": "2024-01-06T10:46:09.941253Z",
"url": "https://files.pythonhosted.org/packages/75/fb/adc9e0ae38ab1bbbc13f6b4c2e991a14372091f51a637a6342d4430bf377/PyMultitor-4.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-01-06 10:46:09",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "realgam3",
"github_project": "pymultitor",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "stem",
"specs": [
[
">=",
"1.8.2"
]
]
},
{
"name": "mitmproxy",
"specs": [
[
">=",
"10.1.6"
]
]
},
{
"name": "requests",
"specs": [
[
">=",
"2.31.0"
]
]
}
],
"lcname": "pymultitor"
}