TLS compression oracle attacks

BEAST (Browser Exploit Against SSL/TLS) (CVE-2011-3389)

Этот метод не использует сжатие, но способствует пониманию всех следующих атак. С помощью BEAST хакер не отягощенный моральными принципами субъект может расшифровать трафик между двумя сторонами. Проблема кроется в режиме шифрования CBC(cipher-block chaining), в котором каждый следующий блок открытого текста XOR’ится с предыдущим результатом шифрования.

Ci = E(Key, data xor Ci-1)

Возникает вопрос, где взять данные для первого блока. Во время шифрования первого блока исходный текст XOR’ится некоторым вектором инициализации (Initialization Vector, IV).

Схема работы cipher block chaining.

Есть два способа использовать режим CBC(cipher block chaining):

  • обрабатывать каждое сообщение как отдельный объект, генерировать новый вектор инициализации и шифровать по описанной схеме.
  • обрабатывать все сообщения, как будто они объединены в один большой объект, сохраняя CBC-режим между ними. Этого можно достичь, используя в качестве вектора инициализации для сообщения n последний блок шифрования предыдущего сообщения (n-1).

Протокол SSL 3.0/TLS 1.0 использует второй вариант, и именно в этом кроется возможность для проведения атаки. Суть заключается в следующем, перехватив сообщение, i-блок(Сi) которого, по нашим ощущениям, содержит пароль(Pi), мы выдвигаем предположение, что пароль равен P1. Слабость в протоколе дает нам возможность проверить наше предположение cформировав новое сообщение так, чтобы первый блок был равен

M1 = Ci-1 xor IV xor P1

и отправив его по тому же каналу. Если предположение верно, то первый блок нового сообщения будет равен блоку с паролем(C1 = Ci).

C1 = E(Key, M1 xor IV) 
= E(Key, (Ci-1 xor IV xor P1) xor IV) 
= E(Key, (Ci-1 xor P1)) 
= Сi

Кажется, что перебирать придется много, но на самом деле мы можем манипулировать границей блока, например, удлинняя URL-запроса. Таким образом, мы получаем возможность перебирать посимвольно. Рассмотрим стандартный http-request:

GET /index.html HTTP/1.1
Host: mysite.com
Cookie: Session=12345678
Accept-Encoding: text/html
Accept-Charset: utf-8

Здесь из переменных страница, которая легко угадывается, и значение сессии. Посмотрим на пакет:

GET /ind ex.html HTTP/1.1 \r\nHost : mysite .com\r\n Cookie: Session= 12345678

Атакующий может удалить 1 символ из названия страницы, например так:

GET /ind ex.jsp H TTP/1.1\ r\nHost: mysite. com\r\nC ookie: S ession=1 2345678

Теперь, чтобы угадать 1 символ сессии, нужно перебрать всего 10 вариантов. Вычислив первый символ, можно переходить к следующему:

GET /ind ex.js HT TP/1.1\r \nHost:m ysite.c om\r\nCo okie: Se ssion=12 345678

Стоит учитывать, что атака предполагает агента на стороне клиента, который будет слать запросы в рамках соединения, что значительно усложняет эксплуатацию.

CRIME (Compression Ratio Info-leak Made Easy) (CVE-2012-4929)

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

Lenth = len(encrypt(compress(input + public + secret))

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

POST /target HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1
Cookie: sessionid=d8e8fca2dc0f896fd7cb4cb0031ba249

sessionid=a

Это сообщение занимает 195 байт и будет сжато до 187 из-за повторяющейся последовательности “sessionid=”. Но если мы угадаем первую букву сессии:

POST /target HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1
Cookie: sessionid=d8e8fca2dc0f896fd7cb4cb0031ba249

sessionid=d

то сообщение уменьшится с 195 до 186 байт. Атакующий может использовать эту технику, перебирая символ за символом(hollywood-style decryption), чтобы узнать точное значение sessionid.

Crime attack.

Для успешного проведения атаки злоумышленник должен контролировать открытый текст и перехватывать зашифрованный.

BREACH (Browser Reconnaissance and Exfiltration via Adaptive Compression of Hypertext) (CVE-2013-3587)

Уязвимость идентична CRIME, с тем лишь отличием, что использует http-compression для расшифровки данных переданных в http-response. Это значит, что для эксплуатации не важно наличие TLS-compression. Кроме того, атака не зависит от версии TLS, а так же работает против любого шифронабора. Чтобы эксплуатировать эту уязвимость нужны:

  • сервер, использующий http-compression
  • веб-приложение, отображающее пользовательский ввод в ответах
  • статичный секрет в ответе

Атакующему нужно вставлять по одному символу в запросы и смотреть в размер ответов. Если размер уменьшился, то можно переходить к следующему символу. Рассмотрим следующий пример запроса на сервер:

GET /message/new.php?text=qwerty

сервер вернет нам следующее:

<form action="https://test.com/message/send.php?csrf=bad02792a3285252e524ccadeeda3401" method="POST">
  <textarea name="message">qwerty</textarea>
</form>
...

мы видим, что строка qwerty вернулась обратно в ответе. Злоумышленник может использовать параметр text, если значение переданное этому параметру совпадает с токеном, то длинна ответа уменьшится на длину повторяющихся символов. Изначатьно Атакующему известна только строка csrf=. Атакующий начинает атаку с отправки запроса:

GET /message/new.php?text=csrf=a

ответ будет таким

<form action="https://test.com/message/send.php?csrf=bad02792a3285252e524ccadeeda3401" method="POST">
  <textarea name="message">csrf=a</textarea>
</form>
...

длина запроса сократилась на 5, то есть длину строки “csrf=”. Это значит, что мы не угадали с первым символом токена. Следующим запросом будет:

GET /message/new.php?text=csrf=b

и ответ

<form action="https://test.com/message/send.php?csrf=bad02792a3285252e524ccadeeda3401" method="POST">
  <textarea name="message">csrf=b</textarea>
</form>
...

Так как первый символ догадки совпадает с первым символом токена, то длина ответа уменьшится уже на 6 символов. Это значит, что можно переходить к следующему символу и повторять процесс до полного восстановления токена. Статистика говорит, что для успешной атаки нужно несколько тысяч запросов и менее 60 секунд.

TIME

Еще одна атака основанная на сжатии. Суть в том, что сжатие уменьшает размер данных, следовательно и время передачи данных. Основным преимуществом этого метода является то, что замер времени можно производить на стороне js, который генерит запросы, не заморачиваясь с mitm. Обычно небольшие изменения в размере дают небольшие изменения по времени, но в некоторых случаях клиенту нужно дождаться подтверждения(tcp ack) от сервера, прежде чем он сможет отправить следующий пакет. Так как атакующий контролирует размер данных, он может установить его точно на границе так, что изменение 1 байта будет приводить к задержке.

HEIST (HTTP Encrypted Information can be Stolen Through TCP-Windows)

Данная атака представляет собой набор методов для получения информации о длине данных, в соединении TLS, путем анализа TCP-windows. Атака может быть выполнена исключительно на стороне js, что выводит атаки вроде BREACH и CRIME на новый уровень, так как mitm уже не нужен. Метод использует API браузера(fetch), с помощью которого можно четко установить время отправки запроса, время получения первого байта и время получения последнего байта. Атакующий, манипулируя пользовательским вводом, может найти границу, когда ответ все еще будет умещаться в 1 TCP-window. Найдя эту границу хацкер может вычислить размер неизвестной части по формуле:

size = <TCP-window> - <reflected input> - <http-response headers> - <TLS-overhead>

получится, что-то вроде:

size = (10 * 1460) - 708 - 529 - 26
size = 13337

Используя эти знания можно абузить BREACH/CRIME используя только браузер жертвы.

ПОЛЕЗНЫЕ ССЫЛКИ:

BEAST vs HTTPS – BEAST POC.
Tool that runs the BREACH attack – BREACH POC.
CRIME attack – CRIME explanation.
HEIST attack – HEIST explanation.

Если вам нравятся мои статьи, можете следить за обновлениями с помощью E-Mail, Twitter, Facebook, а также канала в Telegram.

Share on VKTweet about this on TwitterShare on FacebookShare on Google+Share on LinkedInEmail this to someone