
💪 Доказательство концепции атаки BEAST против SSL/TLS CVE-2011-3389 💪
Этот PoC посвящён криптографии, лежащей в основе атаки BEAST (Browser Exploit Against SSL/TLS), представленной Тай Дуонгом и Джулиано Риццо 23 сентября 2011 года. Это атака с выбранным открытым текстом, и она позволяет извлекать конфиденциальную информацию, если используется протокол Transport Layer Security версии TLS1.0 или SSLv3. Оригинальный PoC можно найти здесь: Here come the Ninjas
Примечание: Это также реализация уязвимости, изначально обнаруженной Филлипом Рогавеем. Уязвимость была обнаружена в 2002 году, но до BEAST в 2011 году не было выпущено ни одного эксплойта. OpenSSL уже знал о проблеме, и именно поэтому в апреле 2006 года они обновили TLS1.0 до TLS1.1.
2 CBC IV для каждой записи, кроме первой, является последним блоком шифротекста предыдущей записи. Таким образом, шифрование не является безопасным для противников, которые могут адаптивно выбирать открытые тексты;
SSLv3/TLS1.0 — это протоколы для шифрования/дешифрования и защиты ваших данных. В нашем случае оба используют режим сцепления блоков CBC. Открытый текст делится на блоки в зависимости от алгоритма шифрования (AES, DES, 3DES), а длина кратна 8 или 16. Если открытый текст не заполняет длину, в конец добавляется padding для заполнения недостающего места. Я настоятельно рекомендую открыть изображения шифрования и дешифрования, чтобы читать этот readme.
По сути, это простое XOR, вы также можете посмотреть это видео (не моё) https://www.youtube.com/watch?v=0D7OwYp6ZEc.
Я расскажу об IV в следующем пункте. Помните, что все эти свойства помогут нам провести нашу атаку.
При использовании CBC нам нужен вектор инициализации, называемый IV. Этот IV случаен (или фиксирован), но в любом случае он не должен быть предсказуем для кого-либо. В TLS1.0 и SSLv3 первый IV запроса случаен, это хорошо. Но чтобы сэкономить время и не генерировать каждый раз новый случайный IV, реализация TLS1.0 и SSLv3 использовала последний блок предыдущего шифротекста в качестве IV. Другими словами, теперь IV можно угадать. Будем считать, что длина каждого блока равна 8 (DES), а у атакующего есть MiTM, чтобы перехватывать весь шифротекст.
Пример :
C0 | C... | Ci-1 | Ci | Ci+1 |Cn
Теперь самое интересное: вот различные криптографические шаги атаки для получения одного байта:
bbbbbbbTHIS_IS_A_SECRET_COOKIE через жертву.Вы можете заметить семь b перед секретным cookie. Если длина блока равна 8, нам нужно поместить 7 известных байт. Эта информация очень важна: атакующий знает первые 7 байт первого блока.
Но зачем? Это позволяет нам иметь всего 256 вариантов, чтобы найти один байт, а не 256^8, чтобы найти 8 байт!
Теперь жертва отправляет запрос, и он будет зашифрован так:
C0 | C1 | C2 | C3 | C4
Где C0 = Ek(IV ⊕ bbbbbbbT) = Ek(C²n ⊕ bbbbbbbT)
P'0 = C²n ⊕ C4 ⊕ bbbbbbbX
Единственный неизвестный элемент — X, есть 256 возможностей, поэтому он переберёт максимум 256 символов.
Запрос отправляется и шифруется так:
C'0 = Ek(P'0 ⊕ IV')
C'0 = Ek(C²n ⊕ C4 ⊕ bbbbbbbX ⊕ IV') или C4 ⊕ IV' = 0
C'0 = Ek(C²n ⊕ bbbbbbbX)
C'0 = Ek(IV ⊕ bbbbbbbX)
Теперь он сравнивает C'0 и C0: если они равны, значит, он только что нашёл байт X в позиции 8. Если не совпадает, он пробует другой символ и снова сравнивает, и т. д.
Теперь, когда у нас есть один байт, мы можем получить следующий, сдвинув предыдущий запрос на один влево: bbbbbbTHIS_IS_A_SECRET_COOKIE. Теперь у него шесть b, и мы также знаем T, так что у нас есть один неизвестный символ. Мы строим новый P'0 = C0 ⊕ C4 ⊕ bbbbbbTX и т. д.
Примечание: другой способ всего с двумя запросами — установить первый блок открытого текста и использовать эту информацию для трёх XOR. Нам больше не нужен последний блок C². C1 = Ek(C0 ⊕ bbbbbbbT), а затем P'0 = C0 ⊕ C4 ⊕ bbbbbbbX. Ему также нужно сравнить C'0 и C1. Это ещё один способ сделать это; вы можете заметить, что в PoC я закодировал оба варианта :)
Теперь мы можем получить все символы!
python BEAST-poc.py
Атакующий не может использовать HTTP-протокол, потому что первый блок будет заполнен строкой GET / HTTP/1.1\r\n.
... не может контролировать первые несколько байт каждого запроса, потому что они всегда задаются как фиксированная строка, такая как GET /, POST / и т. д. Вместо этого он может использовать сокет.
Ему также нужно внедрить некий javascript на вредоносную страницу. Жертва должна быть подключена к этой странице и оставаться на ней, пока атака не будет завершена. Это атака с выбранным открытым текстом, поэтому атакующий может отправлять через javascript-код любой открытый текст, какой захочет, и перехватывать результат с помощью Man in The Middle. Вот диаграмма атаки:

Для успешности этой атаки необходимо соблюдение важных условий (TLS1.0 или ниже, режим шифрования CBC, MiTM, вредоносный javascript). Но Тай Дуонг и Джулиано Риццо доказали, что это возможно, и продемонстрировали свой эксплойт, украв cookie на сайте Paypal.
Всё уже исправлено, и вероятность реализации этой атаки мала.
| Шифрование | Дешифрование |
|---|
| Ci = Ek(Pi ⊕ Ci-1), и C0 = IV | Pi = Dk(Ci) ⊕ Ci-1, и C0 = IV |