Атака на реализацию протокола Диффи-Хеллмана в эксплойт-паке Angler

Содержание 

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

Несколько дней назад исследователи обнаружили в Angler Exploit Kit, одном из наиболее распространенных в настоящее время эксплойт-паков, использование криптографического протокола Диффи-Хеллмана. Этот протокол был разработан более 40 лет назад, однако это первый известный случай его использования в эксплойт-паке.

В Angler злоумышленники применили протокол Диффи-Хеллмана для получения структуры с шеллкодом одного из последних эксплойтов к уязвимости CVE-2015-2419 для браузера Internet Explorer 11, а потом и для эксплойта к уязвимости CVE-2015-5560 для Adobe Flash. Целью злоумышленников скорее всего являлось затруднение обнаружения эксплойта различными сетевыми экранами (которые не смогут расшифровать шеллкод и эксплойт путем анализа перехваченного трафика), а также усложнение получения кода эксплойта исследователями. Однако экспертам «Лаборатории Касперского» удалось провести успешную атаку на данную реализацию протокола Диффи-Хеллмана и расшифровать шеллкод.

Angler против исследователей

Для усложнения работы исследователей помимо протокола Диффи-Хеллмана использовались многократная обфускация JavaScript-кода и ActionScript-кода во Flash, а также блокировка IP пользователя после отдачи ему зашифрованной структуры с шеллкодом. Получив структуру с шелкодом таким способом (зашифрованную одноразовым ключом с помощью протокола Диффи-Хеллмана), образец эксплойт-пака после первой отработки становится нерабочим – исследователь не сможет понять, что делает конкретный файл, воспроизвести атаку и зачастую вообще идентифицировать эксплойт и уязвимость.

Атака на реализацию протокола Диффи-Хеллмана в эксплойт-паке Angler

Обмен ключами и получение шеллкода для эксплойта CVE-2015-2419

На рисунке мы видим запрос с обменом ключами, и в ответ браузер получает от сервера злоумышленников зашифрованный массив, содержащий шеллкод для эксплуатации уязвимости. Такой же запрос в трафике использовался для загрузки эксплойта к уязвимости Flash.

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

Особенности реализации протокола Диффи-Хеллмана

Используемая реализация протокола Диффи-Хеллмана заключается в следующем:

  1. Сервер генерирует случайное число g (16 байт) и отдает браузеру пользователя HTML-страницу с числом g и JavaScript-реализацией алгоритма Диффи-Хеллмана.

  2. JavaScript в браузере пользователя генерирует случайный модуль p (16 байт) и случайный закрытый ключ Ka (16 байт), после чего вычисляет открытый ключ A = gKa mod p и отправляет на сервер тройку чисел (g, A, p) в JSON-объекте вместе с версией интернет-браузера.

  3. Сервер генерирует свой случайный закрытый ключ Kb, случайный ключ шифрования Kx (16 байт) и находит общий секрет Диффи-Хеллмана Kdh = AKb mod p. После этого сервер зашифровывает шеллкод алгоритмом XTEA с ключом Kx, затем base64_encode и urlencode, получая в итоге строку b. Затем ключ Kx также шифруется XTEA с ключом Kdh, base64_encode и urlencode, в итоге получается строка k. И, наконец, сервер вычисляет свой открытый ключ B = gKb mod p и отправляет браузеру Base64-закодированный JSON-объект, содержащий B, k и b:

    eyJCIjoiMDJhYTY1MjZlNmVkYzAwNDIzOTRiN2VhODFlYzViNzUiLCJrIj1k1dnVNYWY1UlVXZjYxSSUzRCJ9

    После снятия Base64-кодировки:

    {B:02aa6526e6edc0042394b7ea81ec5b75,k:I5nkiFBk3LALF%2BnfkR7%2FYQ%3D%3D,b:to0ShZH3Y5vuMaf5RUWf61I%3D}

  4. Браузер пользователя вычисляет общий секрет Диффи-Хеллмана Kdh = BKa mod p, расшифровывает k urldecode, base64_decode и XTEA с ключом Kdh, получая ключ Kx, и, наконец, расшифровывает шеллкод urldecode, base64_decode и XTEA с ключом Kx.

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

Согласно оригинальному алгоритму, для случая, когда известно разложение функции Эйлера модуля p на простые множители qi (взаимнопростые множители Qi)

Атака на реализацию протокола Диффи-Хеллмана в эксплойт-паке Angler

сложность нахождения закрытого ключа Ka и общего секрета Диффи-Хеллмана Kdh по перехваченным открытым ключам A и B составляет

breaking_angler_rus_3

Мы использовали оптимизированный алгоритм дискретного логарифмирования в кольце вычетов по простому модулю, при этом учитывали малость logp по сравнению с qi, а также низкую вероятность вхождения больших простых множителей в степенях больших единицы в функцию Эйлера φ(p), т.е. αi с большой вероятностью будут равны единице для больших qi. В связи с этим, сложность модифицированного алгоритма составила

Атака на реализацию протокола Диффи-Хеллмана в эксплойт-паке Angler

что позволяет успешно проводить атаку в случае, если все qi < 1018. Эксперимент показал, что данное условие соблюдается более чем в половине случаев использования описанной выше реализации протокола Диффи-Хеллмана (случай случайно сгенерированных g, p, Ka и Kb без дополнительных проверок на их безопасность).

Описание модифицированного алгоритма Полига-Хеллмана

  1. Найдем разложение числа p на простые множители (факторизацию удобно осуществлять с помощью Cryptool):

    p = 0x1b0b5c6e6b0b5b7e6c6d0b1b0a8c3c7e = 35948145881546650497425055363061529726 = 2 * 101 * 521 * 195197 * 7138079603 * 245150552958961933

  2. Найдем функцию Эйлера числа p:

    φ(p) = (2-1) * (101-1) * (521-1) * (195197-1) * (7138079603-1) * (245150552958961933-1) = 17761863220777184249809368812124288000

  3. Найдем разложение функции Эйлера на простые множители:

    φ(p) = 2^10 * 3^2 * 5^3 * 13 * 19 * 79 * 167 * 383 * 48799 * 45177719 * 5603527793

  4. Для нахождения закрытого ключа браузера Ka необходимо найди дискретный логарифм:

    A = gKa mod p
    A = 0x5eff90f1c48342f5d519cd02b5dfd8b = 7892150445281019518426774740123123083
    g = 0x40a262b1360a6a16612ca8251161a9a5 = 14017453774474660607531272629759062185 (mod p)

    Т.к. искать Ka сразу по модулю φ(p) довольно трудоемко, найдем Ka по очереди для каждого из взаимнопростых множителей Qi функции Эйлера φ(p)

    [1024, 9, 125, 13, 19, 79, 167, 383, 48799, 45177719, 5603527793],

    а с помощью полученных результатов и «Китайской теоремы об остатках» найдем Ka сразу по модулю φ(p).

  5. Для нахождения Ka по модулю Qi необходимо найти дискретный логарифм

    Атака на реализацию протокола Диффи-Хеллмана в эксплойт-паке Angler

    Для этого:

    5.1. Возьмем число H=⌊√(Q_i )⌋+1;
    5.2. Вычислим Dc = DaHmod p;
    5.3. Составим отсортированную таблицу значений Dcumod p для 1 ≤ uH;
    5.4. Найдем такое значение 0 ≤ vH, что элемент DbDavmod p содержится в таблице
    5.5. Значение Ka по модулю Qi равняется Hu-v.

    Реализация описанного алгоритма на языке Java приведена в Приложении A. Так как в рассматриваемом примере максимальное значение Qi составило всего несколько миллиардов, то время работы программы не превысило нескольких секунд.

    Для некоторых множителей Qi функции Эйлера φ(p) получилось несколько возможных значений Kai-ой строке приведены возможные значения Ka по модулю Qi):

  6. Перебирая все возможные комбинации полученных значений Ka с помощью «Китайской теоремы об остатках» находим несколько десятков возможных значений Ka по модулю φ(p):

    0x8ae47b27ebdbcbe1b78c4a67de5b78a
    0x5ef6ad7b83c6e7e0442ac5f5dc7f9a
    0x1ed2c9a202ac327647ba12cf06ac3a

    0x1dfce04948a67285c2ecef8dedf73da
    0x3509c62b730c0bb7d9a56fefe2cf342
    0xb5518dde7541768bd286d63d8e75f42
    0x60776871627621379c91be922e40fd2
    0x9e44a7fc4adbdd59bbce55db999dfda
    0x98ec54ff8019a390e6c4f1985d21b5a

  7. Все полученные значения закрытого ключа Ka приводят к одному и тому же значению общего секрета Диффи-Хеллмана Kdh = BKa mod p:

    0x0eb034f99e33e17df058de5b448b7241

  8. Зная Kdh, можно расшифровать ключ шифрования Kx из k и шеллкод с помощью Kx. PHP-скрипт для расшифровки перехваченного шеллкода с использованием известного общего секрета Диффи-Хеллмана приведен в Приложении B, а сам расшифрованный шеллкод приведен в Приложении C.

Тестирование атаки на реализацию протокола Диффи-Хеллмана в эксплойт-паке Angler

Для проверки эффективности и работоспособности атаки было проведено несколько тестов.

  1. Тест с дампом трафика с malware.dontneedcoffee.com с эксплойтом для CVE-2015-2419.

    {g:538c40fc6ec04c7a5e0790564b2afe33,A:25d9508418493284da024712a41a29a1,p:6e2e5c0b4c4d8d3c7a5d1e3d8a5d7c3e,v:17728}

    {B:481dbc66fe90ded2eb8d027395abe4fd,

    p = 146455792068641286704746413745292278846 = 2 * 2269 * 1057223 * 1292823547 * 23612186462182360807

    φ(p) = 73195553541542938096767116236244889696 = 2^5 * 3^6 * 7^3 * 17 * 617 * 7127 * 528611 * 231492024139042753

    Из-за достаточно большого множителя φ(p) (порядка 1018), нахождение общего секрета Диффи-Хеллмана заняло несколько часов:

    0x568f7a306bf07e999ba881befc615c73

    Расшифрованный шеллкод приведен в Приложении D.

  2. Тест с дампом трафика с malware.dontneedcoffee.com с эксплойтом для CVE-2015-2419 и CVE-2015-5560.

    В более новой версии Angler Exploit Kit немного поменялся протокол общения скрипта с сервером:

    {6860:false,47da:47dadcbd7c8351a26860da263ca8e0af,dcbd:5d1b0d5d5c4a8c5d1d5b4d6a3b5d7e3b,7c83»:5757a0b79bb137a77f87d554d1559274,51a2:17937}

    {47da:3db7b45576c08f61feb454ece94762d3,dcbd:4yIse5uSjsJXBZrbBMrpcA%3D%3D,7c83»:6r28v2n7UPlLTbsCIxhg%3D}7

    По сравнению с предыдущей версией, в качестве индексов «g», «A», «p», «B», «b», «k» стали использовать части числа g, поменялся порядок отсылаемых на север чисел (теперь g, p, A, а не g, A, p как раньше), кроме того, в алгоритме XTEA модифицировали две константы и битовые операции, использующиеся при расшифровке шеллкода:

    Было (оригинальная реализация XTEA) Стало
    for(var h=g[0],k=g[1],l=84941944608;0!=l;)
    k-=(h<<4^h>>>5)+h^l+d[l>>>11&3],
    l-=2654435769,
    h-=(k<<4^k>>>5)+k^l+d[l&3];
    for(var h=g[0],k=g[1],l=433284421593;0!=l;)
    k-=(h<<4^h>>5)+h^l+d[l>>11&3],
    l-=3411688359,
    h-=(k<<4^k>>5)+k^l+d[l&3];

    Для данного трафика также удалось факторизовать функцию Эйлера φ(p)

    p = 123758666691284322087508686576379854395 = 5 * 11 * 47 * 73 * 83 * 173 * 1055371 * 43277569507162384847671

    φ(p) = 85339058418474058501009217357034700800 = 2^14 * 3^6 * 5^2 * 23 * 41 * 43 * 127 * 277 * 1949 * 102798053917762603

    найти общий секрет Диффи-Хеллмана

    0x04db8bd5b7abc90fa8409989af532531

    и расшифровать шеллкод для CVE-2015-2419 (приведен в Приложении E).

    Помимо всего прочего, в новой версии эксплойт-пака Angler злоумышленники стали использовать схему обмена ключами Диффи-Хеллмана и для Flash-эксплойтов (т.е. создатели эксплойт-пака запрограммировали одинаковые алгоритмы на PHP, JavaScript и ActionScript). Формат протокола для скачивания эксплойта и шеллкода для Flash-уязвимости такой же, как и для шеллкода уязвимости для Internet Explorer:

    {4256:425667992b18942d377eff0218961ce7»,6799:3d0d6c3b4a5b5e2c2d5d6d6e1a5a2e1a,942d:18,0,0,209,377e:false,2b18:0339b845ae35e9d7af629fa2d0d0fed3}

    {4256:014b170e00b46fd3fc35ce8766293c69,6799:YZfySNTEMcSWl8QqrgSuGA%3D%3D,2b18:ZEQNbPzH5Uk%3D}

    Множители модуля p и функции Эйлера φ(p):

    p = 81152602799751951422044316006212054554 = 2 * 3 * 36329424479 * 10983441260369 * 33896452871009

    φ(p) = 27050867599169456821145398677392574464 = 2^11 * 7 * 13 * 199 * 91279961 * 11640265409 * 686465078773

    общий секрет Диффи-Хеллмана:

    0x16f6f645b5993dde0be2f5c1e2c367f1

    Расшифрованный эксплойт и шеллкод для CVE-2015-5560 приведен в Приложении F.

    Приложение A. Реализация атаки на протокол Диффи-Хеллмана на языке Java

    Приложение B. PHP-скрипт для расшифровки перехваченного зашифрованного шеллкода с помощью известного общего секрета Диффи-Хеллмана

    Приложение C. Расшифрованный шеллкод

    Приложение D. Расшифрованный шеллкод для уязвимости CVE-2015-2419 из дампа трафика старой версии Angler

    Приложение E. Расшифрованный шеллкод для уязвимости CVE-2015-2419 из дампа трафика новой версии Angler

    Приложение F. Расшифрованный эксплойт и шеллкод для уязвимости CVE-2015-5560 из дампа трафика новой версии Angler

Публикации на схожие темы

Всего комментариев: 2
  1. Игорь

    Молодцы! Отличная работа !

  2. Игорь

    Работа отличная, но реализация как говорится, хромает. Ребята, не могли бы вы опубликовать проверенный и работающий код Приложение A ? В том, что лежит сейчас полно ошибок или опечаток типа таких » for(int u_part = 1;u_part u_size) «, со скобками явно напутали что-то и ещё моменты есть. Не компилится.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *