· ~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 tunnellingSubdomain μεγαλύτερο από 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ΚαθυστέρησηΑποτέλεσμα
v1Gemini Flash (cloud)Ωμό JSON κάθε flow1.2501,85 sΔουλεύει, αλλά είναι ακριβό και τα δεδομένα φεύγουν από το δίκτυο
v2Gemini Flash (cloud)Προ-συγκεντρωμένες κατηγορίες1150,92 sΦθηνό, αλλά ακόμα cloud
v3qwen2:0.5b (τοπικό)Ανοιχτό prompt9532,53 sΕπαναλαμβανόμενες λέξεις
v4qwen2:0.5b (τοπικό)Μορφή instruct, repeat_penalty 1.256531,58 sΧρήσιμο, εξ ολοκλήρου on-premises

Δύο αλλαγές έκαναν το μεγαλύτερο μέρος της δουλειάς: να στέλνουμε στο μοντέλο πλήθη ανά κατηγορία αντί για ωμά flows, και ένα αυστηρό prompt σε στυλ instruct που ζητά executive summary δύο προτάσεων.

Τι έμαθα

Project μαθήματος για το MSc στην Κυβερνοασφάλεια & Επιστήμη Δεδομένων του Πανεπιστημίου Πειραιώς, σε συνθετικά datasets.

Θέλεις τα configs ή τον κώδικα από αυτό το lab, ή έχεις κάποια ερώτηση; Στείλε μου email στο kostaspapas1023@gmail.com

← όλα τα άρθρα