This was written as a simple test for hammering a URL using GET or POST. The threading works pretty well (for Python) because the GIL can context-switch during the net calls.
Using a c4.2xlarge (8 vCPU, 15GB vRAM) instance in Amazon and 20 threads you can use this tool to generate 20K-30K RPM (or 330-500 requests per second).
On my VPS (1 vCPU, 2GB vRAM) I was able to generate 2.2K-2.5K RPM (or 38-39 requests per second) using PyDoS.
|--help||Print this help||N/A|
|-u, --url||url to DoS||N/A||Should include the protocol|
|--timeout-http||Timeout for HTTP(S) socket connections||0.5 seconds (500ms)||Minimum is 0.1 seconds|
|--time-to-run||Time in total to run||600 seconds||Minimum is 1 second|
|--num-threads||Number of threads to use||1 thread||Minimum is 1 thread|
|--method||Method to use||GET||Must be one of 'POST' or 'GET'|
|--verbose||Turn on verbose information about things happening in each thread||Off||Takes no arguments|
python pydos.py -u https://yourdomain.com/somepath --time-to-run=600 # Run against your domain for 600 seconds python pydos.py -u https://yourdomain.com/somepath --method=POST # Run POST calls python pydos.py -u https://yourdomain.com/somepath --verbose # Enable verbose mode python pydos.py -u https://yourdomain.com/somepath?somearg=somevalue --method=POST # Run POST called against endpoint with payload somearg=somevalue
- Transitioned the project to Python3, cleaning up a lot of the code in the process
- Fixed payload support for values that contain the "=" sign
- Fixed payload in URL for POST requests to protect integrity of request
- Benchmarked using larger machine against production service(s)
- Added support for GET or POST payloads (simply append the parameters to the URL as though it were a GET request)