hacktricks/crypto-and-stego/cryptographic-algorithms
2024-04-07 00:09:03 +00:00
..
README.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 00:09:03 +00:00
unpacking-binaries.md Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/REA 2024-04-07 00:09:03 +00:00

Algorytmy kryptograficzne/kompresji

Algorytmy kryptograficzne/kompresji

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Identyfikacja algorytmów

Jeśli natrafisz na kod korzystający z przesunięć bitowych, operacji XOR i kilku operacji arytmetycznych, jest bardzo prawdopodobne, że jest to implementacja algorytmu kryptograficznego. Tutaj zostaną przedstawione sposoby identyfikacji użytego algorytmu bez konieczności odwracania każdego kroku.

Funkcje API

CryptDeriveKey

Jeśli jest używana 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 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, które korzystają z wybranego CSP.

CryptCreateHash

Inicjuje haszowanie strumienia danych. Jeśli jest używana 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 przypisane wartości: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

Stałe kodu

Czasami łatwo 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.

Informacje o danych

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.

RC4 (Szyfrowanie symetryczne)

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, 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).

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

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

Etap mieszania:

Etap XOR:

AES (Szyfrowanie symetryczne)

Charakterystyka

  • Użycie skrzynek substytucji i tabel przeglądania
  • Możliwe jest rozróżnienie AES dzięki użyciu określonych wartości tabel przeglądania (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.

Stałe SBox

Wąż (Szyfrowanie symetryczne)

Charakterystyka

  • 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)

Identyfikacja

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 i w przykładzie kodu:

Jak wspomniano wcześniej, ten kod można zobaczyć w dowolnym dekompilatorze jako bardzo długa funkcja, ponieważ wewnątrz nie ma skoków. Zdekompilowany kod może wyglądać tak:

Dlatego możliwe jest zidentyfikowanie tego algorytmu, sprawdzając numer magiczny 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).

RSA (Szyfrowanie asymetryczne)

Charakterystyka

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

Identyfikacja poprzez porównania

  • 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

MD5 & SHA (funkcje skrótu)

Charakterystyka

  • 3 funkcje: Inicjalizacja, Aktualizacja, Końcowa
  • Podobne funkcje inicjalizacji

Identyfikacja

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

CRC (funkcja skrótu)

  • Mniejsza i bardziej wydajna, ponieważ jej funkcją jest znalezienie przypadkowych zmian w danych
  • Korzysta z tabel poszukiwań (dzięki czemu można zidentyfikować stałe)

Identyfikacja

Sprawdź stałe tabeli poszukiwań:

Algorytm funkcji skrótu CRC wygląda tak:

APLib (Kompresja)

Charakterystyka

  • Stałe nie są rozpoznawalne
  • Możesz spróbować napisać algorytm w języku Python i szukać podobnych rzeczy online

Identyfikacja

Graf jest dość duży:

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