14 KiB
Криптографічні/Стислі алгоритми
Криптографічні/Стислі алгоритми
{% hint style="success" %}
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
Ідентифікація алгоритмів
Якщо ви натрапили на код з використанням зсувів вправо та вліво, XOR та кількох арифметичних операцій, є велика ймовірність, що це реалізація криптографічного алгоритму. Тут будуть показані деякі способи ідентифікації алгоритму, який використовується, без необхідності реверсувати кожен крок.
API функції
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.
RC4 (Симетричний крипт)
Характеристики
Він складається з 3 основних частин:
- Стадія ініціалізації/: Створює таблицю значень від 0x00 до 0xFF (всього 256 байт, 0x100). Цю таблицю зазвичай називають Substitution Box (або SBox).
- Стадія перемішування: Буде проходити через таблицю, створену раніше (цикл 0x100 ітерацій, знову) модифікуючи кожне значення з напіввипадковими байтами. Для створення цих напіввипадкових байтів використовується ключ RC4. Ключі RC4 можуть бути від 1 до 256 байт в довжину, однак зазвичай рекомендується, щоб вони були більше 5 байт. Зазвичай ключі RC4 мають довжину 16 байт.
- Стадія XOR: Нарешті, відкритий текст або шифротекст XOR-яться з значеннями, створеними раніше. Функція для шифрування та дешифрування є однаковою. Для цього буде виконано проходження через створені 256 байт стільки разів, скільки необхідно. Це зазвичай розпізнається в декомпільованому коді з %256 (mod 256).
{% hint style="info" %} Щоб ідентифікувати RC4 у дизасембльованому/декомпільованому коді, ви можете перевірити 2 цикли розміру 0x100 (з використанням ключа), а потім XOR вхідних даних з 256 значеннями, створеними раніше в 2 циклах, ймовірно, використовуючи %256 (mod 256) {% endhint %}
Стадія ініціалізації/Субституційна таблиця: (Зверніть увагу на число 256, яке використовується як лічильник, і як 0 записується в кожному місці з 256 символів)
Стадія перемішування:
Стадія XOR:
AES (Симетричний крипт)
Характеристики
- Використання субституційних таблиць та таблиць пошуку
- Можливо відрізнити AES завдяки використанню специфічних значень таблиць пошуку (констант). _Зверніть увагу, що константа може бути збережена в бінарному або створена динамічно.
- Ключ шифрування повинен бути дільним на 16 (зазвичай 32B) і зазвичай використовується IV довжиною 16B.
Константи SBox
Serpent (Симетричний крипт)
Характеристики
- Рідко можна знайти деяке шкідливе ПЗ, яке його використовує, але є приклади (Ursnif)
- Легко визначити, чи є алгоритм Serpent, чи ні, на основі його довжини (надзвичайно довга функція)
Ідентифікація
На наступному зображенні зверніть увагу, як використовується константа 0x9E3779B9 (зверніть увагу, що ця константа також використовується іншими криптоалгоритмами, такими як TEA - Tiny Encryption Algorithm).
Також зверніть увагу на розмір циклу (132) та кількість операцій XOR в інструкціях дизасемблювання та в прикладі коду:
Як було згадано раніше, цей код можна візуалізувати в будь-якому декомпілері як дуже довгу функцію, оскільки немає стрибків всередині неї. Декомпільований код може виглядати наступним чином:
Отже, можливо ідентифікувати цей алгоритм, перевіривши магічне число та початкові XOR, бачачи дуже довгу функцію та порівнюючи деякі інструкції довгої функції з реалізацією (наприклад, зсув вліво на 7 та обертання вліво на 22).
RSA (Асиметричний крипт)
Характеристики
- Складніший, ніж симетричні алгоритми
- Немає констант! (кастомні реалізації важко визначити)
- KANAL (криптоаналізатор) не може показати підказки щодо RSA, оскільки покладається на константи.
Ідентифікація за допомогою порівнянь
- У рядку 11 (ліворуч) є
+7) >> 3
, що таке ж, як у рядку 35 (праворуч):+7) / 8
- Рядок 12 (ліворуч) перевіряє, чи
modulus_len < 0x040
, а в рядку 36 (праворуч) перевіряє, чиinputLen+11 > modulusLen
MD5 & SHA (хеш)
Характеристики
- 3 функції: Init, Update, Final
- Схожі функції ініціалізації
Ідентифікація
Init
Ви можете ідентифікувати обидва, перевіривши константи. Зверніть увагу, що sha_init має 1 константу, якої MD5 не має:
MD5 Transform
Зверніть увагу на використання більшої кількості констант
CRC (хеш)
- Менший і більш ефективний, оскільки його функція полягає в знаходженні випадкових змін у даних
- Використовує таблиці пошуку (тому ви можете ідентифікувати константи)
Ідентифікація
Перевірте константи таблиці пошуку:
Алгоритм хешування CRC виглядає так:
APLib (Стиснення)
Характеристики
- Непізнавані константи
- Ви можете спробувати написати алгоритм на Python і шукати подібні речі в Інтернеті
Ідентифікація
Графік досить великий:
Перевірте 3 порівняння для його розпізнавання:
{% hint style="success" %}
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.