mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
184 lines
13 KiB
Markdown
184 lines
13 KiB
Markdown
# Κρυπτογραφικοί/Αλγόριθμοι Συμπίεσης
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## Αναγνώριση Αλγορίθμων
|
||
|
||
Αν καταλήγεις σε έναν κώδικα **χρησιμοποιώντας μετατοπίσεις δεξιά και αριστερά, xors και διάφορες αριθμητικές λειτουργίες** είναι πολύ πιθανό να είναι η υλοποίηση ενός **κρυπτογραφικού αλγορίθμου**. Εδώ θα παρουσιαστούν μερικοί τρόποι για να **αναγνωρίσεις τον αλγόριθμο που χρησιμοποιείται χωρίς να χρειάζεται να αναστρέψεις κάθε βήμα**.
|
||
|
||
### Λειτουργίες API
|
||
|
||
**CryptDeriveKey**
|
||
|
||
Αν αυτή η λειτουργία χρησιμοποιείται, μπορείς να βρεις ποιος **αλγόριθμος χρησιμοποιείται** ελέγχοντας την τιμή της δεύτερης παραμέτρου:
|
||
|
||
 (1) (1) (1) (1).png>)
|
||
|
||
Έλεγξε εδώ τον πίνακα των πιθανών αλγορίθμων και των ανατεθειμένων τιμών τους: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||
|
||
**RtlCompressBuffer/RtlDecompressBuffer**
|
||
|
||
Συμπιέζει και αποσυμπιέζει ένα δεδομένο buffer δεδομένων.
|
||
|
||
**CryptAcquireContext**
|
||
|
||
Από [τα docs](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Η λειτουργία **CryptAcquireContext** χρησιμοποιείται για να αποκτήσει ένα handle σε ένα συγκεκριμένο container κλειδιών μέσα σε έναν συγκεκριμένο πάροχο κρυπτογραφικών υπηρεσιών (CSP). **Αυτό το επιστρεφόμενο handle χρησιμοποιείται σε κλήσεις σε λειτουργίες CryptoAPI** που χρησιμοποιούν τον επιλεγμένο CSP.
|
||
|
||
**CryptCreateHash**
|
||
|
||
Αρχίζει την καταμέτρηση ενός ρεύματος δεδομένων. Αν αυτή η λειτουργία χρησιμοποιείται, μπορείς να βρεις ποιος **αλγόριθμος χρησιμοποιείται** ελέγχοντας την τιμή της δεύτερης παραμέτρου:
|
||
|
||
.png>)
|
||
|
||
\
|
||
Έλεγξε εδώ τον πίνακα των πιθανών αλγορίθμων και των ανατεθειμένων τιμών τους: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id)
|
||
|
||
### Σταθερές Κώδικα
|
||
|
||
Μερικές φορές είναι πολύ εύκολο να αναγνωρίσεις έναν αλγόριθμο χάρη στο γεγονός ότι χρειάζεται να χρησιμοποιήσει μια ειδική και μοναδική τιμή.
|
||
|
||
.png>)
|
||
|
||
Αν ψάξεις για την πρώτη σταθερά στο Google αυτό είναι που θα βρεις:
|
||
|
||
.png>)
|
||
|
||
Επομένως, μπορείς να υποθέσεις ότι η αποσυμπιεσμένη λειτουργία είναι ένας **υπολογιστής sha256.**\
|
||
Μπορείς να ψάξεις οποιαδήποτε από τις άλλες σταθερές και θα αποκτήσεις (πιθανώς) το ίδιο αποτέλεσμα.
|
||
|
||
### πληροφορίες δεδομένων
|
||
|
||
Αν ο κώδικας δεν έχει καμία σημαντική σταθερά μπορεί να είναι **φορτώνοντας πληροφορίες από την ενότητα .data**.\
|
||
Μπορείς να έχεις πρόσβαση σε αυτά τα δεδομένα, **ομαδοποιώντας το πρώτο dword** και ψάχνοντας το στο Google όπως κάναμε στην προηγούμενη ενότητα:
|
||
|
||
.png>)
|
||
|
||
Σε αυτή την περίπτωση, αν ψάξεις για **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)**.
|
||
|
||
> [!TIP]
|
||
> **Για να αναγνωρίσεις ένα RC4 σε έναν αποσυμπιεσμένο/αποσυμπιεσμένο κώδικα μπορείς να ελέγξεις για 2 κύκλους μεγέθους 0x100 (με τη χρήση ενός κλειδιού) και στη συνέχεια ένα XOR των δεδομένων εισόδου με τις 256 τιμές που δημιουργήθηκαν πριν στους 2 κύκλους πιθανώς χρησιμοποιώντας ένα %256 (mod 256)**
|
||
|
||
### **Στάδιο Αρχικοποίησης/Πίνακας Υποκατάστασης:** (Σημείωσε τον αριθμό 256 που χρησιμοποιείται ως μετρητής και πώς γράφεται ένα 0 σε κάθε θέση των 256 χαρακτήρων)
|
||
|
||
.png>)
|
||
|
||
### **Στάδιο Ανακατανομής:**
|
||
|
||
.png>)
|
||
|
||
### **Στάδιο XOR:**
|
||
|
||
.png>)
|
||
|
||
## **AES (Συμμετρική Κρυπτογράφηση)**
|
||
|
||
### **Χαρακτηριστικά**
|
||
|
||
- Χρήση **πινακων υποκατάστασης και πινάκων αναζήτησης**
|
||
- Είναι δυνατόν να **διακρίνεις το AES χάρη στη χρήση συγκεκριμένων τιμών πίνακα αναζήτησης** (σταθερές). _Σημείωσε ότι η **σταθερά** μπορεί να είναι **αποθηκευμένη** στο δυαδικό **ή να δημιουργείται** _**δυναμικά**._
|
||
- Το **κλειδί κρυπτογράφησης** πρέπει να είναι **διαιρέσιμο** με **16** (συνήθως 32B) και συνήθως χρησιμοποιείται ένα **IV** 16B.
|
||
|
||
### Σταθερές SBox
|
||
|
||
.png>)
|
||
|
||
## Serpent **(Συμμετρική Κρυπτογράφηση)**
|
||
|
||
### Χαρακτηριστικά
|
||
|
||
- Είναι σπάνιο να βρεις κάποιο malware που να το χρησιμοποιεί αλλά υπάρχουν παραδείγματα (Ursnif)
|
||
- Απλό να προσδιορίσεις αν ένας αλγόριθμος είναι Serpent ή όχι με βάση το μήκος του (εξαιρετικά μεγάλη λειτουργία)
|
||
|
||
### Αναγνώριση
|
||
|
||
Στην παρακάτω εικόνα παρατήρησε πώς χρησιμοποιείται η σταθερά **0x9E3779B9** (σημείωσε ότι αυτή η σταθερά χρησιμοποιείται επίσης από άλλους κρυπτογραφικούς αλγορίθμους όπως **TEA** -Tiny Encryption Algorithm).\
|
||
Επίσης σημείωσε το **μέγεθος του κύκλου** (**132**) και τον **αριθμό των λειτουργιών XOR** στις **εντολές αποσυμπίεσης** και στο **παράδειγμα κώδικα**:
|
||
|
||
.png>)
|
||
|
||
Όπως αναφέρθηκε προηγουμένως, αυτός ο κώδικας μπορεί να οπτικοποιηθεί μέσα σε οποιονδήποτε αποσυμπιεστή ως μια **πολύ μεγάλη λειτουργία** καθώς **δεν υπάρχουν άλματα** μέσα σε αυτόν. Ο αποσυμπιεσμένος κώδικας μπορεί να φαίνεται όπως το εξής:
|
||
|
||
.png>)
|
||
|
||
Επομένως, είναι δυνατόν να αναγνωρίσεις αυτόν τον αλγόριθμο ελέγχοντας τον **μαγικό αριθμό** και τους **αρχικούς XORs**, βλέποντας μια **πολύ μεγάλη λειτουργία** και **συγκρίνοντας** κάποιες **εντολές** της μεγάλης λειτουργίας **με μια υλοποίηση** (όπως η μετατόπιση αριστερά κατά 7 και η περιστροφή αριστερά κατά 22).
|
||
|
||
## RSA **(Ασύμμετρη Κρυπτογράφηση)**
|
||
|
||
### Χαρακτηριστικά
|
||
|
||
- Πιο περίπλοκος από τους συμμετρικούς αλγορίθμους
|
||
- Δεν υπάρχουν σταθερές! (οι προσαρμοσμένες υλοποιήσεις είναι δύσκολο να προσδιοριστούν)
|
||
- Ο KANAL (ένας αναλυτής κρυπτογράφησης) αποτυγχάνει να δείξει ενδείξεις για το RSA καθώς βασίζεται σε σταθερές.
|
||
|
||
### Αναγνώριση μέσω συγκρίσεων
|
||
|
||
.png>)
|
||
|
||
- Στη γραμμή 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:
|
||
|
||
.png>)
|
||
|
||
**MD5 Transform**
|
||
|
||
Σημείωσε τη χρήση περισσότερων σταθερών
|
||
|
||
 (1) (1) (1).png>)
|
||
|
||
## CRC (hash)
|
||
|
||
- Μικρότερος και πιο αποδοτικός καθώς η λειτουργία του είναι να βρίσκει τυχαίες αλλαγές στα δεδομένα
|
||
- Χρησιμοποιεί πίνακες αναζήτησης (έτσι μπορείς να αναγνωρίσεις σταθερές)
|
||
|
||
### Αναγνώριση
|
||
|
||
Έλεγξε **σταθερές πίνακα αναζήτησης**:
|
||
|
||
.png>)
|
||
|
||
Ένας αλγόριθμος hash CRC μοιάζει με:
|
||
|
||
.png>)
|
||
|
||
## APLib (Συμπίεση)
|
||
|
||
### Χαρακτηριστικά
|
||
|
||
- Μη αναγνωρίσιμες σταθερές
|
||
- Μπορείς να προσπαθήσεις να γράψεις τον αλγόριθμο σε python και να ψάξεις για παρόμοια πράγματα online
|
||
|
||
### Αναγνώριση
|
||
|
||
Ο γραφικός πίνακας είναι αρκετά μεγάλος:
|
||
|
||
 (2) (1).png>)
|
||
|
||
Έλεγξε **3 συγκρίσεις για να τον αναγνωρίσεις**:
|
||
|
||
.png>)
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|