· ~4 λεπτά ανάγνωσης
Ένας agent ανάλυσης network logs που κρατά τις αποδείξεις εντός
Εντοπισμός beaconing, DNS tunnelling, lateral movement και exfiltration σε network logs με απλή στατιστική, και μετά ένα μικρό τοπικό LLM γράφει την περίληψη.
Στόχος
Το δεύτερο project μου για το μάθημα Ψηφιακή Εγκληματολογία του μεταπτυχιακού ήταν ένα εργαλείο για την πρώτη ώρα ενός περιστατικού: παίρνεις μια δέσμη από network και host logs, βρίσκεις ό,τι δεν μοιάζει με κανονική κίνηση και βγάζεις μια περίληψη πάνω στην οποία μπορεί να δράσει ένας αναλυτής. Ο περιορισμός που έβαλα στον εαυτό μου ήταν ότι τίποτα δεν φεύγει από το μηχάνημα. Τα logs ενός πραγματικού περιστατικού είναι εμπιστευτικά, οπότε το γλωσσικό μοντέλο τρέχει τοπικά.
Η είσοδος ήταν ένα σύνολο συνθετικών datasets του μαθήματος (network flows, DNS queries, εγγραφές email και host): 12 αρχεία και 99 γεγονότα γύρω από έναν προσομοιωμένο παραβιασμένο σταθμό εργασίας.
Αρχιτεκτονική
| Κομμάτι | Ρόλος |
|---|---|
| Streamlit UI | Μαζικό upload, διάγραμμα Sankey των flows, δείκτης jitter, scatter plot εντροπίας και εξαγωγή αναφοράς |
| Backend σε FastAPI | Αναγνωρίζει CSV ή JSON, υπολογίζει τη στατιστική και πακετάρει τα ευρήματα σε συμπαγή περίληψη για το μοντέλο |
| Ollama με qwen2:0.5b | Τρέχει στη CPU και γράφει την αφήγηση του περιστατικού· χωρίς εξωτερικό API και χωρίς κόστος tokens |
Ο σημαντικός διαχωρισμός είναι ότι ο εντοπισμός είναι ντετερμινιστικός κώδικας. Το μοντέλο δεν αποφασίζει ποτέ τι είναι κακόβουλο· απλώς μετατρέπει σε κείμενο ευρήματα που έχουν ήδη υπολογιστεί.
Κανόνες εντοπισμού
| Συμπεριφορά | Κανόνας |
|---|---|
| DNS tunnelling | Subdomain μεγαλύτερο από 35 χαρακτήρες και εντροπία Shannon πάνω από 3,5 bits ανά χαρακτήρα |
| Exfiltration σε cloud storage | Πάνω από 1 MB εξερχόμενα σε μία σύνδεση προς εξωτερικό endpoint αποθήκευσης |
| C2 beaconing | Επαναλαμβανόμενες συνδέσεις στην ίδια εξωτερική διεύθυνση με σταθερό διάστημα |
| Lateral movement | Συνδέσεις από εσωτερικό σε εσωτερικό σε SMB (445), SSH (22) ή RDP (3389) |
Η εντροπία είναι αυτό που κάνει τα κωδικοποιημένα δεδομένα να ξεχωρίζουν στα ονόματα DNS. Τα συνηθισμένα ονόματα, όπως το update.microsoft.com, είναι κάτω από περίπου 2,8· τα ύποπτα queries στο dataset ήταν μεταξύ 3,9 και 4,7. Ο υπολογισμός είναι μικρός:
from collections import Counter
from math import log2
def shannon_entropy(label: str) -> float:
counts = Counter(label)
return -sum(n / len(label) * log2(n / len(label)) for n in counts.values())
Πώς ένα μικρό μοντέλο γίνεται χρήσιμο
| Έκδοση | Μοντέλο | Είσοδος | Tokens | Καθυστέρηση | Αποτέλεσμα |
|---|---|---|---|---|---|
| v1 | Gemini Flash (cloud) | Ωμό JSON κάθε flow | 1.250 | 1,85 s | Δουλεύει, αλλά είναι ακριβό και τα δεδομένα φεύγουν από το δίκτυο |
| v2 | Gemini Flash (cloud) | Προ-συγκεντρωμένες κατηγορίες | 115 | 0,92 s | Φθηνό, αλλά ακόμα cloud |
| v3 | qwen2:0.5b (τοπικό) | Ανοιχτό prompt | 95 | 32,53 s | Επαναλαμβανόμενες λέξεις |
| v4 | qwen2:0.5b (τοπικό) | Μορφή instruct, repeat_penalty 1.25 | 65 | 31,58 s | Χρήσιμο, εξ ολοκλήρου on-premises |
Δύο αλλαγές έκαναν το μεγαλύτερο μέρος της δουλειάς: να στέλνουμε στο μοντέλο πλήθη ανά κατηγορία αντί για ωμά flows, και ένα αυστηρό prompt σε στυλ instruct που ζητά executive summary δύο προτάσεων.
Τι έμαθα
- Το μοντέλο είναι ο δακτυλογράφος, όχι ο ανιχνευτής. Ακόμα και το v4 πρόσθεσε ένα κομμάτι κειμένου και ένα χρονικό παράθυρο που δεν υπήρχαν στην είσοδό του. Με μοντέλο 0.5B αυτό είναι αναμενόμενο· είναι και ο λόγος που το κείμενό του δεν πρέπει ποτέ να είναι η μόνη καταγραφή ενός ευρήματος.
- Έλεγξε τη στατιστική πριν στήσεις οτιδήποτε από πάνω της. Ξαναδιαβάζοντας την αναφορά μου, κάποιοι αριθμοί δεν συμφωνούν: τα ποσοστά ανά κατηγορία δεν ταιριάζουν με τα πλήθη των γεγονότων, και τα μέσα διαστήματα του beaconing είναι τάξεις μεγέθους μεγαλύτερα από το παράθυρο καταγραφής, κάτι που δείχνει bug στις μονάδες. Το ντετερμινιστικό κομμάτι θέλει τον ίδιο έλεγχο με το μοντέλο.
- Το beaconing θέλει καλύτερο κανόνα. Δύο συνδέσεις με σταθερό ρυθμό είναι πολύ χαμηλός πήχης. Ένας ελάχιστος αριθμός συνδέσεων μαζί με χαμηλό συντελεστή μεταβλητότητας των διαστημάτων (σ/μ) είναι πιο αξιόπιστο τεστ.
- Η εντροπία μόνη της έχει θόρυβο. Και τα CDN και οι cloud υπηρεσίες χρησιμοποιούν μεγάλα ονόματα που μοιάζουν τυχαία. Ο συνδυασμός εντροπίας με τον όγκο queries ανά domain και το ποσοστό εγγραφών TXT μειώνει τα false positives.
- Το τοπικό inference είναι αργό αλλά ιδιωτικό. Περίπου 30 δευτερόλεπτα σε CPU είναι αποδεκτά για μια περίληψη που γράφεται μία φορά ανά περιστατικό, και τα logs δεν φεύγουν ποτέ από το κτίριο.
Project μαθήματος για το MSc στην Κυβερνοασφάλεια & Επιστήμη Δεδομένων του Πανεπιστημίου Πειραιώς, σε συνθετικά datasets.
Θέλεις τα configs ή τον κώδικα από αυτό το lab, ή έχεις κάποια ερώτηση; Στείλε μου email στο kostaspapas1023@gmail.com