
🐩 Атака Poodle (Padding Oracle On Downgraded Legacy Encryption) CVE-2014-3566 🐩
Доказательство концепции атаки Poodle (Padding Oracle On Downgraded Legacy Encryption):
атака типа «человек посередине», использующая понижение версии протокола до SSL 3.0 в интернет- и программных клиентах безопасности.
Атака Poodle позволяет извлечь зашифрованные данные, отправленные клиентом серверу, если используется протокол SSLv3. Она не позволяет получить закрытый ключ, используемый для шифрования запроса.

SSLv3 — это протокол для шифрования/дешифрования и защиты данных. В нашем случае он использует режим сцепления блоков CBC. Открытый текст делится на блоки в зависимости от алгоритма шифрования (AES, DES, 3DES), а длина кратна 8 или 16. Если открытый текст не заполняет длину, в конце добавляется padding для заполнения недостающего пространства. Настоятельно рекомендую открыть изображения шифрования и дешифрования для чтения этого readme.
| Шифрование | Дешифрование |
|---|---|
| Ci = Ek(Pi ⊕ Ci-1), and C0 = IV | Pi = Dk(Ci) ⊕ Ci-1, and C0 = IV |
По сути, это простое XOR, вы также можете посмотреть это видео (не моё) https://www.youtube.com/watch?v=0D7OwYp6ZEc.
Запрос, отправленный по HTTPS с использованием SSLv3, шифруется с помощью AES/DES в режиме CBC. Особенность SSLv3 по сравнению с TLS1.x заключается в padding. В SSLv3 padding заполняется случайными байтами, за исключением последнего байта, равного длине padding.
Пример:
T|E|X|T|0xab|0x10|0x02, где 0xab|0x10|0x02 — это padding.
T|E|X|T|E|0x5c|0x01, где 0x5c|0x01 — это padding.
Также последний блок может быть полностью заполнен padding, то есть последний блок может состоять из случайных байтов, за исключением последнего.
T|E|X|T|E|0x5c|0x01|0x3c|0x09|0x5d|0x08|0x04|0x07, где |0x5c|0x01|0x3c|0x09|0x5d|0x08|0x04|0x07 — это padding, и только 0x07 известен атакующему. Таким образом, если атакующий может влиять на блок padding, он сможет узнать, что последний байт последнего блока равен длине блока.
Атакующий должен иметь возможность заставить жертву отправлять запросы (например, с помощью JavaScript, используя XSS). Тогда он может контролировать путь и данные каждого запроса:
Пример: добавление байта "A" в путь запроса
GET / HTTP/1.1\r\nSECRET COOKIE\r\n\r\n
GET /AAA HTTP/1.1\r\nSECRET COOKIE\r\n\r\nDATA
С помощью этой техники он может влиять на padding.
SSLv3 также использует HMAC для проверки целостности и подлинности открытого текста.
keyed-hash message authentication code (HMAC) — это конкретный тип кода аутентификации сообщения (MAC), включающий криптографическую хеш-функцию (отсюда 'H') в сочетании с секретным криптографическим ключом.
Благодаря этому атакующий не может перехватить и изменить запрос, а затем отправить его обратно. Если сервер обнаружит проблему, он отправит ошибку HMAC.
Протокол SSLv3 использует следующую процедуру: он получает данные от клиента, расшифровывает данные, проверяет целостность с помощью HMAC.
MAC-затем-шифрование: Не обеспечивает никакой целостности шифротекста, так как мы не можем знать до расшифровки сообщения, является ли оно подлинным или поддельным. Целостность открытого текста. Если схема шифрования является изменяемой, возможно изменить сообщение так, чтобы оно казалось валидным и имело валидный MAC. Это теоретический момент, конечно, так как на практике секрет MAC должен обеспечивать защиту. Здесь MAC не может предоставить никакой информации об открытом тексте, так как он зашифрован.
https://crypto.stackexchange.com/questions/202/should-we-mac-then-encrypt-or-encrypt-then-mac
Это означает, что мы можем изменить зашифрованный текст без ведома сервера. Это здорово, правда :)
Сначала последний блок должен быть полностью заполнен padding, как мы видели ранее, атакующий использует путь запроса и проверяет длину запроса.
Поскольку последний блок, за исключением последнего байта, заполнен случайными байтами, он может заменить этот последний блок Cn на блок, который хочет расшифровать Ci. Изменённый запрос отправляется на сервер.
Сервер:
Заменяя последний блок, атакующий также изменяет последний байт последнего блока (длину padding). Существует вероятность 1/256, что заменённый последний байт в блоке padding совпадёт с оригинальным. В этом случае ошибки padding не возникнет, и атакующий сможет использовать эту операцию XOR для восстановления последнего байта блока Ci, выполнив следующую операцию:
Pn = Dk(Cn) ⊕ Cn-1
Pn = Dk(Ci) ⊕ Cn-1
Pn = Dk(Ci) ⊕ Cn-1
xxxxxxx7 = Dk(Ci) ⊕ Cn-1
Dk(Ci) = xxxxxxx7 ⊕ Cn-1
Pi ⊕ Ci-1 = xxxxxxx7 ⊕ Cn-1
Pi = Ci-1 ⊕ xxxxxxx7 ⊕ Cn-1
(xxxxxxx7 или xxxxxxx15 и x — случайный байт)
Последний байт блока может быть получен: Pi[7] = Ci-1[7] ⊕ xxxxxxx7 ⊕ Cn-1[7] В случае padding атакующему нужно закрыть SSL-сессию, чтобы выполнить новое рукопожатие (новый ключ AES) и получить новый шифротекст, затем заменить последний блок и т.д. (обычно требуется более 300 рукопожатий).
После получения одного байта он получит все остальные байты блока, добавляя один байт в путь и удаляя один байт из данных:
| Запрос для получения байтов E, I, K, O |
|---|
| GET /a SECRET_COOKIE dataazerty PADDING_7 |
| GET /aa SECRET_COOKIE dataazert PADDING_7 |
| GET /aaa SECRET_COOKIE dataazer PADDING_7 |
| GET /aaaa SECRET_COOKIE dataaze PADDING_7 |
Несмотря на то, что спецификации TLS требуют от серверов проверки padding, некоторые реализации не выполняют её должным образом, что делает некоторые серверы уязвимыми к POODLE, даже если они отключают SSL 3.0.
TLS обычно безопасен против Poodle, но некоторые реализации не проверяют padding — это как если бы мы использовали SSLv3. Именно поэтому некоторые версии TLS уязвимы.
В этом репозитории три файла:
Этот PoC исследует криптографию, лежащую в основе атаки. Этот файл позволяет нам простым способом понять, как работает атака.
python3 poodle-poc.py
Файл parallelization-poodle.py — это проект и идея :) см. https://github.com/mpgn/poodle-PoC/issues/1
python3 parallelization-poodle.py
Это настоящий эксплойт. Очень полезен, если вы хотите продемонстрировать доказательство концепции атаки Poodle клиенту во время пентеста, если он использует старый сервер и браузер. Просто укажите IP вашего вредоносного прокси в настройках браузера с правильным портом, прокси позаботится обо всём остальном.
Требования:
security.tls.version.min: 0, например. Альтернативно, если клиент также использует TLS, вы можете принудительно понизить версию.
💀 Если у вас есть эти предварительные условия, вы можете начать атаку 💀:
Для этого эксплойта доступны два варианта:
Установите IP-адрес и порт прокси непосредственно на стороне клиента и запустите эксплойт (перейдите к части 3).
Настройте атаку ARP-спуфинга, чтобы перенаправить весь трафик между клиентом и сервером на ваш компьютер.
$> echo 1 > /proc/sys/net/ipv4/ip_forward
$> iptables -i vmnet1 -t nat -A PREROUTING -p tcp --dport 1337 -j REDIRECT --to-ports 1337
arpspoof, ettercap или bettercap для выполнения атаки ARP-спуфинга.$> bettercap -iface vmnet1
net.show
set arp.spoof.internal true
arp.spoof on
⋊> ~/T/poodle-Poc on master ⨯ python3 poodle-exploit.py -h 13:10:24
usage: poodle-exploit.py [-h] [--start-block START_BLOCK]
[--stop-block STOP_BLOCK] [--simpleProxy SIMPLEPROXY]
proxy port server rport
Poodle Exploit by @mpgn_x64
positional arguments:
proxy ip of the proxy
port port of the proxy
server ip of the remote server
rport port of the remote server
optional arguments:
-h, --help show this help message and exit
--start-block START_BLOCK
start the attack at this block
--stop-block STOP_BLOCK
stop the attack at this block
--simpleProxy SIMPLEPROXY
Direct proxy, no ARP spoofing attack
$> python3 poodle-exploit.py 192.168.13.1 4443 192.168.13.133 443 --start-block 46 --stop-block 50
Выбор блока: если вы не укажете опцию блока, будут расшифрованы все блоки, но это может занять много времени. Настоятельно советую «знать», как будет отформатирован запрос, и использовать скрипт request-splitter.py, чтобы узнать блок, который вы хотите расшифровать (в идеале блок cookie!).
Затем вставьте вредоносный JavaScript-код (poodle.js) на уязвимый веб-сайт, используя, например, XSS. Запустите скрипт Python и введите help, затем search и, наконец, active. В это время потребуется только два взаимодействия с JavaScript (команды search и active).
Обновление от 01.04.2018: в эксплойт добавлена опция понижения версии. Когда эксплойт обнаруживает протокол TLS, введите команду downgrade, чтобы понизить до SSLv3.0.
Как это работает? Во время рукопожатия (после hello client) эксплойт отправляет handshake_failure 15030000020228, затем браузер должен повторно отправить hello client с SSLv3.0 в качестве протокола по умолчанию. Тестировалось на Chrome версии 15, но не работает в Firefox (думаю, он не поддерживает пересогласование протокола), проверьте #4
Полное видео эксплуатации:

Asciinema: