hacktricks/reversing/cryptographic-algorithms/README.md

16 KiB
Raw Blame History

Κρυπτογραφικοί/Συμπιεστικοί Αλγόριθμοι

Κρυπτογραφικοί/Συμπιεστικοί Αλγόριθμοι

{% hint style="success" %} Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Υποστήριξη HackTricks
{% endhint %}

Αναγνώριση Αλγορίθμων

Αν καταλήξετε σε έναν κώδικα χρησιμοποιώντας shift rights και lefts, xors και διάφορες αριθμητικές λειτουργίες είναι πολύ πιθανό ότι είναι η υλοποίηση ενός κρυπτογραφικού αλγορίθμου. Εδώ θα παρουσιαστούν μερικοί τρόποι για να αναγνωρίσετε τον αλγόριθμο που χρησιμοποιείται χωρίς να χρειάζεται να αναστρέψετε κάθε βήμα.

Λειτουργίες API

CryptDeriveKey

Αν αυτή η λειτουργία χρησιμοποιείται, μπορείτε να βρείτε ποιος αλγόριθμος χρησιμοποιείται ελέγχοντας την τιμή της δεύτερης παραμέτρου:

Ελέγξτε εδώ τον πίνακα των πιθανών αλγορίθμων και των ανατεθειμένων τιμών τους: https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id

RtlCompressBuffer/RtlDecompressBuffer

Συμπιέζει και αποσυμπιέζει ένα δεδομένο buffer δεδομένων.

CryptAcquireContext

Από τα docs: Η CryptAcquireContext λειτουργία χρησιμοποιείται για να αποκτήσει ένα handle σε ένα συγκεκριμένο key container μέσα σε έναν συγκεκριμένο κρυπτογραφικό πάροχο υπηρεσιών (CSP). Αυτό το επιστρεφόμενο handle χρησιμοποιείται σε κλήσεις προς τις λειτουργίες 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 (256bytes συνολικά, 0x100). Αυτός ο πίνακας ονομάζεται συνήθως Substitution Box (ή SBox).
  • Στάδιο ανακατανομής: Θα περνάει μέσα από τον πίνακα που δημιουργήθηκε πριν (βρόχος 0x100 επαναλήψεων, ξανά) δημιουργώντας τροποποιώντας κάθε τιμή με ημι-τυχαία bytes. Για να δημιουργηθούν αυτά τα ημι-τυχαία bytes, χρησιμοποιείται το κλειδί RC4. Τα κλειδιά RC4 μπορούν να είναι μεταξύ 1 και 256 bytes σε μήκος, ωστόσο συνήθως συνιστάται να είναι πάνω από 5 bytes. Συνήθως, τα κλειδιά RC4 είναι 16 bytes σε μήκος.
  • Στάδιο XOR: Τέλος, το απλό κείμενο ή το κρυπτογραφημένο κείμενο είναι XORed με τις τιμές που δημιουργήθηκαν πριν. Η λειτουργία για την κρυπτογράφηση και την αποκρυπτογράφηση είναι η ίδια. Για αυτό, θα εκτελείται ένας βρόχος μέσα από τα 256 bytes που δημιουργήθηκαν όσες φορές είναι απαραίτητο. Αυτό συνήθως αναγνωρίζεται σε έναν αποσυμπιεσμένο κώδικα με ένα %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 (Συμμετρική Κρυπτογράφηση)

Χαρακτηριστικά

  • Είναι σπάνιο να βρείτε κάποιο malware που να το χρησιμοποιεί αλλά υπάρχουν παραδείγματα (Ursnif)
  • Απλό να προσδιορίσετε αν ένας αλγόριθμος είναι Serpent ή όχι με βάση το μήκος του (εξαιρετικά μεγάλη λειτουργία)

Αναγνώριση

Στην παρακάτω εικόνα παρατηρήστε πώς χρησιμοποιείται η σταθερά 0x9E3779B9 (σημειώστε ότι αυτή η σταθερά χρησιμοποιείται επίσης από άλλους κρυπτογραφικούς αλγόριθμους όπως TEA -Tiny Encryption Algorithm).
Επίσης σημειώστε το μέγεθος του βρόχου (132) και τον αριθμό των λειτουργιών XOR στις εντολές αποσυμπίεσης και στο παράδειγμα κώδικα:

Όπως αναφέρθηκε προηγουμένως, αυτός ο κώδικας μπορεί να οπτικοποιηθεί μέσα σε οποιονδήποτε αποσυμπιεστή ως μια πολύ μεγάλη λειτουργία καθώς δεν υπάρχουν άλματα μέσα σε αυτόν. Ο αποσυμπιεσμένος κώδικας μπορεί να φαίνεται όπως το εξής:

Επομένως, είναι δυνατόν να αναγνωρίσετε αυτόν τον αλγόριθμο ελέγχοντας τον μαγικό αριθμό και τους αρχικούς XORs, βλέποντας μια πολύ μεγάλη λειτουργία και συγκρίνοντας κάποιες εντολές της μεγάλης λειτουργίας με μια υλοποίηση (όπως το shift left κατά 7 και το rotate left κατά 22).

RSA (Ασύμμετρη Κρυπτογράφηση)

Χαρακτηριστικά

  • Πιο περίπλοκος από τους συμμετρικούς αλγόριθμους
  • Δεν υπάρχουν σταθερές! (οι προσαρμοσμένες υλοποιήσεις είναι δύσκολο να προσδιοριστούν)
  • KANAL (ένας αναλυτής κρυπτογράφησης) αποτυγχάνει να δείξει ενδείξεις για το RSA καθώς βασίζεται σε σταθερές.

Αναγνώριση μέσω συγκρίσεων

  • Στη γραμμή 11 (αριστερά) υπάρχει ένα +7) >> 3 που είναι το ίδιο με τη γραμμή 35 (δεξιά): +7) / 8
  • Η γραμμή 12 (αριστερά) ελέγχει αν modulus_len < 0x040 και στη γραμμή 36 (δεξιά) ελέγχει αν inputLen+11 > modulusLen

MD5 & SHA (hash)

Χαρακτηριστικά

  • 3 λειτουργίες: Init, Update, Final
  • Παρόμοιες λειτουργίες αρχικοποίησης

Αναγνώριση

Init

Μπορείτε να αναγνωρίσετε και τους δύο ελέγχοντας τις σταθερές. Σημειώστε ότι η sha_init έχει 1 σταθερά που δεν έχει το MD5:

MD5 Transform

Σημειώστε τη χρήση περισσότερων σταθερών

CRC (hash)

  • Μικρότερος και πιο αποδοτικός καθώς η λειτουργία του είναι να βρίσκει τυχαίες αλλαγές στα δεδομένα
  • Χρησιμοποιεί πίνακες αναζήτησης (έτσι μπορείτε να αναγνωρίσετε σταθερές)

Αναγνώριση

Ελέγξτε σταθερές πίνακα αναζήτησης:

Ένας αλγόριθμος hash CRC μοιάζει με:

APLib (Συμπίεση)

Χαρακτηριστικά

  • Μη αναγνωρίσιμες σταθερές
  • Μπορείτε να προσπαθήσετε να γράψετε τον αλγόριθμο σε python και να αναζητήσετε παρόμοια πράγματα online

Αναγνώριση

Ο γραφικός πίνακας είναι αρκετά μεγάλος:

Ελέγξτε 3 συγκρίσεις για να τον αναγνωρίσετε:

{% hint style="success" %} Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Υποστήριξη HackTricks
{% endhint %}