• 🚨 29 мая стартует курс «Пентест Active Directory: от теории к практике» от Академии Кодебай

    🔍 Изучите реальные техники атак на инфраструктуру Active Directory: от первоначального доступа до полной компрометации.
    🛠️ Освойте инструменты, такие как BloodHound, Mimikatz, CrackMapExec и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальные сценарии атак.
    🧠 Получите знания, которые помогут вам стать востребованным специалистом в области информационной безопасности.

    После старта курса запись открыта еще 10 дней Подробнее о курсе ...

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

Writeup Веселый RSA [Writeup]

M4x

Green Team
20.05.2024
19
32
Без лишних предисловий перейдем к делу.

У нас есть три шифртекста, которые на самом деле представляют одно и то же сообщение. Подсказка намекает на то, что Боб не слишком хорошо разбирается в RSA и допустил серьезную ошибку при шифровании. Мы видим, что вместо стандартной экспоненты e = 65537 он использовал значения 5, 7 и 13. А модули n1, n2 и n3 такие маленькие, что их легко разложить на множители. Это можно назвать критической уязвимостью.

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

Если мы возьмем первое сообщение и попытаемся вычислить приватную экспоненту d, то у нас ничего не выйдет:
Python:
>>> e1 = 5
>>> p1 = 181
>>> q1 = 331
>>> n1 = 181 * 331  # 59911
>>> phi_n1 = (p1 - 1) * (q1 - 1)
>>> d = pow(e1, -1, phi_n1)

# Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: base is not invertible for the given modulus
На простом языке это означает, что Боб допустил фатальную ошибку в процессе шифрования.

Пробуем второе сообщение — и снова та же история:
Python:
>>> e2 = 7
>>> p2 = 449
>>> q2 = 809
>>> n2 = 449 * 809  # 363241
>>> phi_n2 = (p2 - 1) * (q2 - 1)
>>> d = pow(e2, -1, phi_n2)

# Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: base is not invertible for the given modulus
Но вот третье сообщение, по-видимому, зашифровали правильно, и мы можем вычислить d:
Python:
>>> e3 = 13
>>> p3 = 647
>>> q3 = 727
>>> n3 = 647 * 727  # 470369
>>> phi_n3 = (p3 - 1) * (q3 - 1)
>>> d = pow(e3, -1, phi_n3)
Теперь, когда у нас есть d, расшифровать флаг — проще простого:
Python:
>>> С3 = 76794
>>> message = pow(С3, d, n3)
В итоге мы получаем трехзначное число, которое, разумеется, я вам не покажу, чтобы вы не жульничали, а решили таск самостоятельно и научились чему-нибудь новому.

Вернемся к условию задачки:
Код:
Боб шифрует для трех сторон одно и то же сообщение с помощью RSA.
Узнайте сообщение, отправленное Бобом. Во флаге укажите SHA256 от сообщения.
Нас просят указать SHA256 от расшифрованного сообщения. Это делается очень просто:
Python:
>>> from hashlib import sha256
>>> result = sha256(str(message).encode()).hexdigest()
Получившуюся строку оборачиваем в CODEBY и сдаем флаг.
 
  • Нравится
Реакции: blackwine
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!

Курс AD