hacktricks/reversing/cryptographic-algorithms/README.md
2024-02-11 01:46:25 +00:00

9.1 KiB

Algorytmy kryptograficzne/kompresji

Algorytmy kryptograficzne/kompresji

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Identyfikowanie algorytmów

Jeśli natrafisz na kod używający przesunięć w prawo i w lewo, operacji XOR i kilku operacji arytmetycznych, bardzo możliwe, że jest to implementacja algorytmu kryptograficznego. W tym miejscu zostaną przedstawione sposoby identyfikacji używanego algorytmu bez konieczności odwracania każdego kroku.

Funkcje API

CryptDeriveKey

Jeśli używana jest ta funkcja, można znaleźć, który algorytm jest używany, sprawdzając wartość drugiego parametru:

Sprawdź tutaj tabelę możliwych algorytmów i ich przypisanych wartości: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

RtlCompressBuffer/RtlDecompressBuffer

Kompresuje i dekompresuje dany bufor danych.

CryptAcquireContext

Z dokumentacji: Funkcja CryptAcquireContext służy do uzyskania uchwytu do określonego kontenera kluczy w określonym dostawcy usług kryptograficznych (CSP). Ten zwrócony uchwyt jest używany w wywołaniach funkcji CryptoAPI, które używają wybranego CSP.

CryptCreateHash

Inicjuje hashowanie strumienia danych. Jeśli używana jest ta funkcja, można znaleźć, który algorytm jest używany, sprawdzając wartość drugiego parametru:

Sprawdź tutaj tabelę możliwych algorytmów i ich przypisanych wartości: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

Stałe kodu

Czasami bardzo łatwo jest zidentyfikować algorytm dzięki temu, że musi używać specjalnej i unikalnej wartości.

Jeśli wyszukasz pierwszą stałą w Google, otrzymasz to:

Dlatego można przypuszczać, że zdekompilowana funkcja to kalkulator sha256.
Możesz wyszukać dowolną inną stałą i prawdopodobnie otrzymasz ten sam wynik.

Informacje o danych

Jeśli kod nie ma żadnej istotnej stałej, może wczytywać informacje z sekcji .data.
Możesz uzyskać dostęp do tych danych, zgrupować pierwsze słowo i wyszukać je w Google, tak jak zrobiliśmy to wcześniej w sekcji:

W tym przypadku, jeśli wyszukasz 0xA56363C6, dowiesz się, że jest to związane z tabelami algorytmu AES.

RC4 (Symetryczne szyfrowanie)

Charakterystyka

Składa się z 3 głównych części:

  • Etap inicjalizacji/: Tworzy tabelę wartości od 0x00 do 0xFF (łącznie 256 bajtów, 0x100). Ta tabela jest zwykle nazywana Substitution Box (lub SBox).
  • Etap mieszania: Przejdzie pętlą przez tabelę utworzoną wcześniej (pętla 0x100 iteracji, ponownie) modyfikując każdą wartość za pomocą półlosowych bajtów. Aby utworzyć te półlosowe bajty, używany jest klucz RC4. Klucze RC4 mogą mieć długość od 1 do 256 bajtów, ale zwykle zaleca się, aby były powyżej 5 bajtów. Zazwyczaj klucze RC4 mają długość 16 bajtów.
  • Etap XOR: Na koniec, tekst jawny lub tekst szyfrowany jest XORowany z wartościami utworzonymi wcześniej. Funkcja szyfrowania i deszyfrowania jest taka sama. W tym celu zostanie wykonana pętla przez utworzone 256 bajtów tak wiele razy, jak to konieczne. Zwykle jest to rozpoznawane w zdekompilowanym kodzie za pomocą %256 (mod 256).

{% hint style="info" %} Aby zidentyfikować RC4 w kodzie disassembly/zdekompilowanym, można sprawdzić, czy istnieją 2 pętle o rozmiarze 0x100 (z użyciem klucza), a następnie XOR danych wejściowych z 256 wartościami utworzonymi wcześniej w tych 2 pętlach, prawdopodobnie używając %256 (mod 256) {% endhint %}

Etap inicjalizacji/Substitution Box: (Zauważ liczbę 256 używaną jako licznik i jak 0 jest zapisywane na każdym miejscu z 256 znaków)

Etap mieszania:

Etap XOR:

AES (Symetryczne szyfrowanie)

Charakterystyka

  • Używa skrzynek substytucji i tablic wyszukiwania
  • Można rozróżnić AES dzięki użyciu konkretnych wartości tablicy wyszukiwania (stałych). Zauważ, że stała może być przechowywana w postaci binarnej lub tworzona dynamicznie.
  • Klucz szyfrowania musi być podzielny przez 16 (zwykle 32B), a zwykle używany jest również wektor inicjalizacyjny (IV) o długości 16B.

Stałe SBox

Serpent (Symetryczne szyfrowanie)

Charakterystyka

  • Rzadko spotyka się złośliwe oprogramowanie używające tego algorytmu, ale są przykłady (Ursnif)
  • Łatwo jest określić, czy algorytm jest Serpentem, na podstawie jego długości (bardzo długa funkcja)

Identyfikacja

RSA (Szyfrowanie asymetryczne)

Charakterystyka

  • Bardziej skomplikowany niż algorytmy symetryczne
  • Brak stałych! (trudno określić niestandardowe implementacje)
  • KANAL (kryptoanalizator) nie wykazuje wskazówek dotyczących RSA, ponieważ polega on na stałych.

Identyfikacja przez porównania

  • W linii 11 (lewa strona) jest +7) >> 3, co jest takie samo jak w linii 35 (prawa strona): +7) / 8
  • Linia 12 (lewa strona) sprawdza, czy modulus_len < 0x040, a w linii 36 (prawa strona) sprawdza, czy inputLen+11 > modulusLen

MD5 & SHA (funkcje skrótu)

Charakterystyka

  • 3 funkcje: Init, Update, Final
  • Podobne funkcje inicjalizujące

Identyfikacja

Init

Możesz je zidentyfikować, sprawdzając stałe. Zauważ, że sha_init ma 1 stałą, której MD5 nie ma:

Transformacja MD5

Zauważ użycie większej liczby stałych

CRC (funkcja skrótu)

  • Mniejsza i bardziej wydajna, ponieważ jej funkcją jest wykrywanie przypadkowych zmian w danych
  • Używa tabel przeglądowych (dzięki czemu można zidentyfikować stałe)

Identyfikacja

Sprawdź stałe tabel przeglądowych:

Algorytm skrótu CRC wygląda tak:

APLib (Kompresja)

Charakterystyka

  • Brak rozpoznawalnych stałych
  • Możesz spróbować napisać algorytm w Pythonie i szukać podobnych rzeczy online

Identyfikacja

Graf jest dość duży:

Sprawdź 3 porównania, aby go rozpoznać:

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: