Cryptographic/Compression Algorithms
Last updated
Last updated
Dowiedz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Dowiedz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Jeśli znajdziesz kod korzystający z przesunięć bitowych, operacji XOR i kilku operacji arytmetycznych, jest bardzo prawdopodobne, że jest to implementacja algorytmu kryptograficznego. Poniżej zostaną przedstawione sposoby identyfikacji użytego algorytmu bez konieczności odwracania każdego kroku.
CryptDeriveKey
Jeśli jest używana ta funkcja, można sprawdzić, który algorytm jest używany, sprawdzając wartość drugiego parametru:
Sprawdź tutaj tabelę możliwych algorytmów i ich przypisane 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 korzystających z wybranego CSP.
CryptCreateHash
Inicjuje haszowanie strumienia danych. Jeśli jest używana ta funkcja, można sprawdzić, który algorytm jest używany, sprawdzając wartość drugiego parametru:
Sprawdź tutaj tabelę możliwych algorytmów i ich przypisane wartości: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id
Czasami łatwo jest zidentyfikować algorytm dzięki konieczności użycia specjalnej i unikalnej wartości.
Jeśli wyszukasz pierwszą stałą w Google, otrzymasz:
Dlatego można założyć, że zdekompilowana funkcja to kalkulator sha256. Możesz wyszukać dowolną inną stałą i prawdopodobnie otrzymasz ten sam wynik.
Jeśli kod nie zawiera 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 wcześniej:
W tym przypadku, jeśli wyszukasz 0xA56363C6, dowiesz się, że jest to związane z tabelami algorytmu AES.
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 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, jednak zazwyczaj zaleca się, aby były one powyżej 5 bajtów. Zazwyczaj klucze RC4 mają długość 16 bajtów.
Etap XOR: Wreszcie, tekst jawnie lub zaszyfrowany jest XORowany z utworzonymi wcześniej wartościami. Funkcja do szyfrowania i deszyfrowania jest taka sama. W tym celu zostanie wykonana pętla przez utworzone 256 bajtów tak wiele razy, ile jest to konieczne. Zazwyczaj jest to rozpoznawane w zdekompilowanym kodzie za pomocą %256 (mod 256).
Aby zidentyfikować RC4 w kodzie disassembly/dekompilowanym, można sprawdzić 2 pętle o rozmiarze 0x100 (z użyciem klucza) oraz XOR danych wejściowych z 256 wartościami utworzonymi wcześniej w tych 2 pętlach, prawdopodobnie z użyciem %256 (mod 256)
Użycie skrzynek substytucji i tabel przeglądowych
Możliwe jest rozróżnienie AES dzięki użyciu określonych wartości tabeli przeglądowej (stałych). Zauważ, że stała może być przechowywana w pliku binarnym lub tworzona dynamicznie.
Klucz szyfrowania musi być podzielny przez 16 (zwykle 32B), a zazwyczaj używany jest IV o długości 16B.
Rzadko można znaleźć złośliwe oprogramowanie używające go, ale istnieją przykłady (Ursnif)
Łatwo określić, czy algorytm to Serpent, na podstawie jego długości (bardzo długa funkcja)
Na poniższym obrazku zauważ, jak używana jest stała 0x9E3779B9 (zauważ, że ta stała jest również używana przez inne algorytmy kryptograficzne, takie jak TEA -Tiny Encryption Algorithm). Zauważ również rozmiar pętli (132) i liczbę operacji XOR w instrukcjach disassembly oraz w przykładzie kodu:
Jak wspomniano wcześniej, ten kod może być zobrazowany w dowolnym dekompilatorze jako bardzo długa funkcja, ponieważ wewnątrz niej nie ma skoków. Zdekompilowany kod może wyglądać tak jak poniżej:
Dlatego możliwe jest zidentyfikowanie tego algorytmu, sprawdzając magiczną liczbę i początkowe XORy, widząc bardzo długą funkcję i porównując niektóre instrukcje z długiej funkcji z implementacją (taką jak przesunięcie w lewo o 7 i obrót w lewo o 22).
Bardziej złożony niż algorytmy symetryczne
Brak stałych! (trudne określenie niestandardowej implementacji)
KANAL (analizator kryptograficzny) nie wykazuje wskazówek dotyczących RSA, ponieważ polega na stałych.
W linii 11 (lewa) jest +7) >> 3
, co jest takie samo jak w linii 35 (prawa): +7) / 8
Linia 12 (lewa) sprawdza, czy modulus_len < 0x040
, a w linii 36 (prawa) sprawdza, czy inputLen+11 > modulusLen
3 funkcje: Inicjalizacja, Aktualizacja, Końcowa
Podobne funkcje inicjalizacji
Inicjalizacja
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
Mniejsza i bardziej wydajna, ponieważ jej funkcją jest znajdowanie przypadkowych zmian w danych
Wykorzystuje tablice poszukiwań (dzięki czemu można zidentyfikować stałe)
Sprawdź stałe tablicy poszukiwań:
Algorytm funkcji skrótu CRC wygląda tak:
Stałe nie do rozpoznania
Możesz spróbować napisać algorytm w języku Python i szukać podobnych rzeczy online
Graf jest dość duży:
Sprawdź 3 porównania, aby go rozpoznać: