Cryptographic/Compression Algorithms
Last updated
Last updated
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training 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. Ви можете отримати доступ до цих даних, згрупувати перший dword і шукати його в Google, як ми робили в попередньому розділі:
У цьому випадку, якщо ви шукаєте 0xA56363C6, ви можете знайти, що це пов'язано з таблицями алгоритму AES.
Він складається з 3 основних частин:
Стадія ініціалізації/: Створює таблицю значень від 0x00 до 0xFF (всього 256 байт, 0x100). Цю таблицю зазвичай називають Substitution Box (або SBox).
Стадія перемішування: Буде проходити через таблицю, створену раніше (цикл 0x100 ітерацій, знову) модифікуючи кожне значення з напіввипадковими байтами. Для створення цих напіввипадкових байтів використовується ключ RC4. Ключі RC4 можуть бути від 1 до 256 байт в довжину, однак зазвичай рекомендується, щоб вони були більше 5 байт. Зазвичай ключі RC4 мають довжину 16 байт.
Стадія XOR: Нарешті, відкритий текст або шифротекст XORed з значеннями, створеними раніше. Функція для шифрування та дешифрування є однаковою. Для цього буде виконано проходження через створені 256 байт стільки разів, скільки необхідно. Це зазвичай розпізнається в декомпільованому коді з %256 (mod 256).
Щоб ідентифікувати RC4 у дизасембльованому/декомпільованому коді, ви можете перевірити 2 цикли розміру 0x100 (з використанням ключа), а потім XOR вхідних даних з 256 значеннями, створеними раніше в 2 циклах, ймовірно, використовуючи %256 (mod 256)
Використання підстановочних таблиць та таблиць пошуку
Можливо відрізнити AES завдяки використанню специфічних значень таблиць пошуку (констант). _Зверніть увагу, що константа може бути збережена в бінарному або створена динамічно.
Ключ шифрування повинен бути дільним на 16 (зазвичай 32B) і зазвичай використовується IV довжиною 16B.
Рідко можна знайти деяке шкідливе ПЗ, яке його використовує, але є приклади (Ursnif)
Легко визначити, чи є алгоритм Serpent, чи ні, на основі його довжини (надзвичайно довга функція)
На наступному зображенні зверніть увагу, як константа 0x9E3779B9 використовується (зверніть увагу, що ця константа також використовується іншими криптоалгоритмами, такими як TEA - Tiny Encryption Algorithm). Також зверніть увагу на розмір циклу (132) та кількість операцій XOR в інструкціях дизасемблювання та в прикладі коду:
Як було згадано раніше, цей код можна візуалізувати в будь-якому декомпілері як дуже довгу функцію, оскільки немає стрибків всередині неї. Декомпільований код може виглядати наступним чином:
Отже, можливо ідентифікувати цей алгоритм, перевіривши магічне число та початкові XOR, бачачи дуже довгу функцію та порівнюючи деякі інструкції довгої функції з реалізацією (наприклад, зсув вліво на 7 та обертання вліво на 22).
Складніший, ніж симетричні алгоритми
Немає констант! (кастомні реалізації важко визначити)
KANAL (криптоаналізатор) не може показати підказки щодо RSA, оскільки покладається на константи.
У рядку 11 (ліворуч) є +7) >> 3
, що таке ж, як у рядку 35 (праворуч): +7) / 8
Рядок 12 (ліворуч) перевіряє, чи modulus_len < 0x040
, а в рядку 36 (праворуч) перевіряє, чи inputLen+11 > modulusLen
3 функції: Init, Update, Final
Схожі функції ініціалізації
Init
Ви можете ідентифікувати обидва, перевіривши константи. Зверніть увагу, що sha_init має 1 константу, якої MD5 не має:
MD5 Transform
Зверніть увагу на використання більшої кількості констант
Менший і більш ефективний, оскільки його функція полягає в знаходженні випадкових змін у даних
Використовує таблиці пошуку (тому ви можете ідентифікувати константи)
Перевірте константи таблиці пошуку:
Алгоритм хешування CRC виглядає так:
Не впізнавані константи
Ви можете спробувати написати алгоритм на Python і шукати подібні речі в Інтернеті
Графік досить великий:
Перевірте 3 порівняння, щоб його розпізнати:
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)