Cryptographic/Compression Algorithms
Last updated
Last updated
Вивчайте та практикуйте Хакінг AWS: Навчання HackTricks AWS Red Team Expert (ARTE) Вивчайте та практикуйте Хакінг GCP: Навчання HackTricks GCP Red Team Expert (GRTE)
Якщо ви зустрілися з кодом, де використовуються зсуви вправо та вліво, XOR та кілька арифметичних операцій, велика ймовірність, що це реалізація криптографічного алгоритму. Тут будуть показані деякі способи визначення використаного алгоритму без необхідності розгортання кожного кроку.
CryptDeriveKey
Якщо використовується ця функція, ви можете знайти, який алгоритм використовується, перевіривши значення другого параметра:
Перевірте тут таблицю можливих алгоритмів та їх призначені значення: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
RtlCompressBuffer/RtlDecompressBuffer
Стискає та розстискує заданий буфер даних.
CryptAcquireContext
З документації: Функція CryptAcquireContext використовується для отримання дескриптора певного контейнера ключів у певному постачальнику криптослужб (CSP). Цей отриманий дескриптор використовується в викликах функцій CryptoAPI, які використовують вибраний CSP.
CryptCreateHash
Ініціює хешування потоку даних. Якщо використовується ця функція, ви можете знайти, який алгоритм використовується, перевіривши значення другого параметра:
Перевірте тут таблицю можливих алгоритмів та їх призначені значення: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
Іноді дуже легко визначити алгоритм завдяки тому, що він потребує використання спеціального та унікального значення.
Якщо ви шукаєте першу константу в Google, отримаєте наступне:
Отже, можна припустити, що розгорнута функція - це калькулятор sha256. Ви можете шукати будь-яку іншу константу і, ймовірно, отримаєте той самий результат.
Якщо код не має значущої константи, можливо, він завантажує інформацію з розділу .data. Ви можете отримати доступ до цих даних, згрупувати перше слово та шукати його в Google, як ми робили в попередньому розділі:
У цьому випадку, якщо ви шукаєте 0xA56363C6, ви можете дізнатися, що це пов'язано з таблицями алгоритму AES.
Складається з 3 основних частин:
Етап ініціалізації/: Створює таблицю значень від 0x00 до 0xFF (всього 256 байтів, 0x100). Цю таблицю зазвичай називають Таблицею Заміни (або SBox).
Етап перемішування: Пройде по таблиці, створеній раніше (цикл з 0x100 ітерацій, знову) змінюючи кожне значення за допомогою пів-випадкових байтів. Для створення цих пів-випадкових байтів використовується ключ RC4. Ключі RC4 можуть бути від 1 до 256 байтів у довжину, проте зазвичай рекомендується, щоб він був більше 5 байтів. Зазвичай ключі RC4 мають довжину 16 байтів.
Етап XOR: Нарешті, відкритий текст або шифротекст XORується зі створеними значеннями раніше. Функція для шифрування та дешифрування однакова. Для цього буде виконано цикл через створені 256 байтів стільки разів, скільки потрібно. Це зазвичай визначається в розгорнутому коді з %256 (mod 256).
Для визначення RC4 в розкладці/розгорнутому коді можна перевірити наявність 2 циклів розміром 0x100 (з використанням ключа) та потім XOR вхідних даних зі 256 значеннями, створеними раніше в цих 2 циклах, ймовірно, використовуючи %256 (mod 256)
Використання таблиць заміни та таблиць пошуку
Можливо відрізнити AES завдяки використанню конкретних значень таблиць пошуку (констант). Зауважте, що константа може бути збережена в бінарному файлі або створена динамічно.
Ключ шифрування повинен бути кратним 16 (зазвичай 32 байти), і зазвичай використовується IV довжиною 16 байтів.
Рідко зустрічається віруси, які використовують його, але є приклади (Ursnif)
Просто визначити, чи алгоритм є Serpent або ні за його довжиною (дуже довга функція)
На наступному зображенні зверніть увагу, як використовується константа 0x9E3779B9 (зверніть увагу, що ця константа також використовується іншими криптографічними алгоритмами, наприклад TEA -Tiny Encryption Algorithm). Також зверніть увагу на розмір циклу (132) та кількість операцій XOR в інструкціях розкладки та в прикладі коду:
Як було зазначено раніше, цей код можна візуалізувати всередині будь-якого декомпілятора як дуже довгу функцію, оскільки всередині неї немає стрибків. Розгорнутий код може виглядати наступним чином:
Складніший, ніж симетричні алгоритми
Немає постійних значень! (визначення власних реалізацій ускладнене)
KANAL (криптоаналізатор) не показує підказок щодо RSA, оскільки він ґрунтується на постійних значеннях.
У рядку 11 (ліворуч) є +7) >> 3
, що є таким самим, як у рядку 35 (праворуч): +7) / 8
Рядок 12 (ліворуч) перевіряє, чи modulus_len < 0x040
, а в рядку 36 (праворуч) перевіряється, чи inputLen+11 > modulusLen
3 функції: Ініціалізація, Оновлення, Фіналізація
Схожі функції ініціалізації
Ініціалізація
Ви можете ідентифікувати обидва, перевіряючи постійні значення. Зверніть увагу, що sha_init має 1 постійне значення, якого немає у MD5:
MD5 Transform
Зверніть увагу на використання більше постійних значень
Менший та ефективніший, оскільки його функція полягає в виявленні випадкових змін у даних
Використовує таблиці пошуку (тому ви можете ідентифікувати постійні значення)
Перевірте постійні значення таблиці пошуку:
Алгоритм хешування CRC виглядає так:
Нерозпізнавані постійні значення
Ви можете спробувати написати алгоритм на Python та шукати схожі речі в Інтернеті
Графік досить великий:
Перевірте 3 порівняння для його визначення: