Race Condition
Використовуйте Trickest, щоб легко створювати та автоматизувати робочі процеси, які підтримуються найсучаснішими інструментами спільноти. Отримайте доступ сьогодні:
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Для отримання глибокого розуміння цієї техніки перевірте оригінальний звіт за адресою https://portswigger.net/research/smashing-the-state-machine
Покращення атак на Race Condition
Основною перешкодою для використання race conditions є забезпечення одночасної обробки кількох запитів з дуже незначною різницею в їх часі обробки — ідеально, менше 1 мс.
Тут ви можете знайти деякі техніки для синхронізації запитів:
HTTP/2 Однопакетна атака проти HTTP/1.1 Синхронізація останнього байта
HTTP/2: Підтримує надсилання двох запитів через одне TCP-з'єднання, зменшуючи вплив мережевого джиттера. Однак через варіації на стороні сервера два запити можуть бути недостатніми для послідовної експлуатації race condition.
HTTP/1.1 'Синхронізація останнього байта': Дозволяє попередньо надсилати більшість частин 20-30 запитів, утримуючи невеликий фрагмент, який потім надсилається разом, досягаючи одночасного прибуття на сервер.
Підготовка до синхронізації останнього байта включає:
Надсилання заголовків та даних тіла без останнього байта без завершення потоку.
Пауза на 100 мс після початкового надсилання.
Вимкнення TCP_NODELAY для використання алгоритму Нейгла для пакетування фінальних кадрів.
Пінг для розігріву з'єднання.
Наступне надсилання утримуваних кадрів має призвести до їх прибуття в одному пакеті, що можна перевірити за допомогою Wireshark. Цей метод не застосовується до статичних файлів, які зазвичай не беруть участі в атаках RC.
Адаптація до архітектури сервера
Розуміння архітектури цілі важливе. Фронтальні сервери можуть по-різному маршрутизувати запити, що впливає на час. Попереднє розігрівання з'єднання на стороні сервера через незначні запити може нормалізувати час запитів.
Обробка блокування на основі сесій
Фреймворки, такі як обробник сесій PHP, серіалізують запити за сесією, що може приховувати вразливості. Використання різних токенів сесії для кожного запиту може обійти цю проблему.
Подолання обмежень швидкості або ресурсів
Якщо розігрів з'єднання неефективний, навмисне викликання затримок обмежень швидкості або ресурсів веб-серверів через потік фальшивих запитів може полегшити однопакетну атаку, викликавши затримку на стороні сервера, сприятливу для race conditions.
Приклади атак
Tubo Intruder - однопакетна атака HTTP2 (1 кінцева точка): Ви можете надіслати запит до Turbo intruder (
Extensions
->Turbo Intruder
->Send to Turbo Intruder
), ви можете змінити в запиті значення, яке хочете брутфорсити для%s
, як уcsrf=Bn9VQB8OyefIs3ShR2fPESR0FzzulI1d&username=carlos&password=%s
, а потім вибратиexamples/race-single-packer-attack.py
з випадаючого списку:
Якщо ви збираєтеся надіслати різні значення, ви можете змінити код на цей, який використовує словник з буфера обміну:
Якщо веб не підтримує HTTP2 (тільки HTTP1.1), використовуйте Engine.THREADED
або Engine.BURP
замість Engine.BURP2
.
Tubo Intruder - HTTP2 атака з одним пакетом (Кілька кінцевих точок): У випадку, якщо вам потрібно надіслати запит до 1 кінцевої точки, а потім кілька до інших кінцевих точок, щоб активувати RCE, ви можете змінити скрипт
race-single-packet-attack.py
на щось на зразок:
Він також доступний у Repeater через нову опцію 'Send group in parallel' у Burp Suite.
Для limit-overrun ви можете просто додати один і той же запит 50 разів у групу.
Для connection warming ви можете додати на початку групи кілька запитів до деякої нестатичної частини веб-сервера.
Для delaying процесу між обробкою одного запиту та іншого в 2 підстанах, ви можете додати додаткові запити між обома запитами.
Для multi-endpoint RC ви можете почати надсилати запит, який перейде в прихований стан, а потім 50 запитів одразу після нього, які використовують прихований стан.
Автоматизований python-скрипт: Мета цього скрипта полягає в тому, щоб змінити електронну пошту користувача, постійно перевіряючи її, поки токен підтвердження нової електронної пошти не надійде на останню електронну пошту (це пов'язано з тим, що в коді спостерігалася RC, де було можливо змінити електронну пошту, але підтвердження надсилалося на стару, оскільки змінна, що вказує на електронну пошту, вже була заповнена першою). Коли слово "objetivo" знаходиться в отриманих електронних листах, ми знаємо, що отримали токен підтвердження зміненої електронної пошти, і ми закінчуємо атаку.
Поліпшення атаки з одного пакета
У початковому дослідженні пояснюється, що ця атака має обмеження в 1,500 байт. Однак у цьому пості пояснюється, як можливо розширити обмеження в 1,500 байт атаки з одного пакета до 65,535 B віконного обмеження TCP, використовуючи фрагментацію на рівні IP (розділення одного пакета на кілька IP-пакетів) і надсилання їх у різному порядку, що дозволяє запобігти повторній збірці пакета, поки всі фрагменти не досягнуть сервера. Ця техніка дозволила досліднику надіслати 10,000 запитів приблизно за 166 мс.
Зверніть увагу, що хоча це поліпшення робить атаку більш надійною в RC, яка вимагає, щоб сотні/тисячі пакетів прибули одночасно, це також може мати деякі програмні обмеження. Деякі популярні HTTP-сервери, такі як Apache, Nginx і Go, мають суворе налаштування SETTINGS_MAX_CONCURRENT_STREAMS
на 100, 128 і 250. Однак інші, такі як NodeJS і nghttp2, мають його без обмежень.
Це в основному означає, що Apache буде враховувати лише 100 HTTP-з'єднань з одного TCP-з'єднання (обмежуючи цю атаку RC).
Ви можете знайти деякі приклади використання цієї техніки в репозиторії https://github.com/Ry0taK/first-sequence-sync/tree/main.
Сировинний BF
Перед попереднім дослідженням були деякі корисні навантаження, які просто намагалися надсилати пакети якомога швидше, щоб викликати RC.
Повторювач: Перегляньте приклади з попереднього розділу.
Зловмисник: Надішліть запит до Зловмисника, встановіть кількість потоків на 30 у меню параметрів і виберіть як навантаження Null payloads та згенеруйте 30.
Turbo Intruder
Python - asyncio
RC Methodology
Limit-overrun / TOCTOU
Це найосновніший тип гонки, де вразливості з'являються в місцях, які обмежують кількість разів, коли ви можете виконати дію. Наприклад, використання одного й того ж коду знижки в інтернет-магазині кілька разів. Дуже простий приклад можна знайти в цьому звіті або в цьому багу.
Існує багато варіацій цього типу атаки, включаючи:
Використання подарункової картки кілька разів
Оцінка продукту кілька разів
Виведення або переказ готівки понад залишок на рахунку
Повторне використання одного рішення CAPTCHA
Обхід обмеження швидкості анти-брутфорсу
Hidden substates
Експлуатація складних гонок часто передбачає використання коротких можливостей для взаємодії з прихованими або непередбаченими підстанціями машини. Ось як підійти до цього:
Визначте потенційні приховані підстанції
Почніть з визначення кінцевих точок, які змінюють або взаємодіють з критичними даними, такими як профілі користувачів або процеси скидання паролів. Зосередьтеся на:
Зберігання: Віддавайте перевагу кінцевим точкам, які маніпулюють постійними даними на стороні сервера, а не тими, що обробляють дані на стороні клієнта.
Дія: Шукайте операції, які змінюють існуючі дані, оскільки вони більш імовірно створюють експлуатовані умови в порівнянні з тими, що додають нові дані.
Ключування: Успішні атаки зазвичай включають операції, які ключуються на одному й тому ж ідентифікаторі, наприклад, ім'я користувача або токен скидання.
Проведіть початкове тестування
Тестуйте визначені кінцеві точки з атаками гонки, спостерігаючи за будь-якими відхиленнями від очікуваних результатів. Несподівані відповіді або зміни в поведінці програми можуть сигналізувати про вразливість.
Демонструйте вразливість
Звузьте атаку до мінімальної кількості запитів, необхідних для експлуатації вразливості, часто всього до двох. Цей етап може вимагати кількох спроб або автоматизації через точний таймінг.
Time Sensitive Attacks
Точність у таймінгу запитів може виявити вразливості, особливо коли використовуються передбачувані методи, такі як мітки часу, для безпекових токенів. Наприклад, генерація токенів скидання паролів на основі міток часу може дозволити ідентичні токени для одночасних запитів.
Для експлуатації:
Використовуйте точний таймінг, наприклад, атаку з одного пакета, щоб зробити одночасні запити на скидання пароля. Ідентичні токени вказують на вразливість.
Приклад:
Запросіть два токени скидання пароля одночасно та порівняйте їх. Співпадіння токенів вказує на недолік у генерації токенів.
Перевірте це PortSwigger Lab щоб спробувати це.
Hidden substates case studies
Pay & add an Item
Перевірте це PortSwigger Lab, щоб дізнатися, як платити в магазині та додати додатковий товар, за який не потрібно платити.
Confirm other emails
Ідея полягає в тому, щоб перевірити електронну адресу та змінити її на іншу одночасно, щоб дізнатися, чи платформа перевіряє нову змінену.
Change email to 2 emails addresses Cookie based
Згідно з цим дослідженням, Gitlab був вразливий до захоплення таким чином, оскільки він міг надіслати токен перевірки електронної пошти однієї електронної адреси на іншу електронну адресу.
Перевірте це PortSwigger Lab щоб спробувати це.
Hidden Database states / Confirmation Bypass
Якщо використовуються 2 різні записи для додавання інформації в базу даних, існує невеликий проміжок часу, коли лише перші дані були записані в базу даних. Наприклад, при створенні користувача ім'я користувача та пароль можуть бути записані, а потім записується токен для підтвердження новоствореного облікового запису. Це означає, що протягом короткого часу токен для підтвердження облікового запису є нульовим.
Отже, реєстрація облікового запису та надсилання кількох запитів з порожнім токеном (token=
або token[]=
або будь-яка інша варіація) для негайного підтвердження облікового запису може дозволити підтвердити обліковий запис, де ви не контролюєте електронну пошту.
Перевірте це PortSwigger Lab щоб спробувати це.
Bypass 2FA
Наступний псевдокод вразливий до гонки, оскільки протягом дуже короткого часу 2FA не застосовується, поки створюється сесія:
OAuth2 вічна постійність
Є кілька постачальників OAUth. Ці сервіси дозволять вам створити додаток і аутентифікувати користувачів, яких зареєстрував постачальник. Для цього клієнт повинен дозволити вашому додатку отримати доступ до деяких їхніх даних у постачальника OAUth. Отже, до цього моменту це просто звичайний вхід через google/linkedin/github..., де вам пропонують сторінку з повідомленням: "Додаток <InsertCoolName> хоче отримати доступ до вашої інформації, чи хочете ви це дозволити?"
Умова гонки в authorization_code
authorization_code
Проблема виникає, коли ви приймаєте це і автоматично надсилаєте authorization_code
зловмисному додатку. Потім цей додаток зловживає умовою гонки в сервісі OAUth, щоб згенерувати більше ніж один AT/RT (Токен аутентифікації/Токен оновлення) з authorization_code
для вашого облікового запису. В основному, він зловживає тим фактом, що ви прийняли додаток для доступу до ваших даних, щоб створити кілька облікових записів. Потім, якщо ви припините дозволяти додатку доступ до ваших даних, одна пара AT/RT буде видалена, але інші залишаться дійсними.
Умова гонки в Refresh Token
Refresh Token
Якщо ви отримали дійсний RT, ви можете спробувати зловживати ним для генерації кількох AT/RT, і навіть якщо користувач скасовує дозволи для зловмисного додатку на доступ до його даних, кілька RT залишаться дійсними.
Умова гонки в WebSockets
У WS_RaceCondition_PoC ви можете знайти PoC на Java для надсилання вебсокетних повідомлень паралельно, щоб зловживати умовами гонки також у вебсокетах.
Посилання
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Use Trickest to easily build and automate workflows powered by the world's most advanced community tools. Get Access Today:
Last updated