Μια πλήρης, ρεαλιστική αλυσίδα ανάκτησης κωδικών — από την ανακάλυψη μιας υπηρεσίας SSH με το nmap, στο online brute force ενός αδύναμου κωδικού με το Hydra, και από εκεί στο offline σπάσιμο hashes δύο διαφορετικών τύπων (unsalted raw-MD5 και salted sha512crypt) με τον John the Ripper και το hashcat. Δείχνουμε καθαρά τη διαφορά online και offline, ανακτούμε πραγματικούς κωδικούς, φτάνουμε στον στόχο — και αφήνουμε επίτηδες έναν ισχυρό κωδικό να αντισταθεί. Όλα σε υλικό που κατέχουμε εξ ολοκλήρου.

TL;DR (EN): Online and offline password cracking in an isolated lab: nmap, Hydra (online SSH), John the Ripper and hashcat (offline). The headline result — raw-MD5 at 798 MH/s vs sha512crypt at 1,848 H/s (~430,000x) — makes the case for slow, salted KDFs, MFA and lockout.

Νομική σημείωση / Authorization. Όλη η δραστηριότητα που περιγράφεται εκτελέστηκε αποκλειστικά σε ένα απομονωμένο εργαστήριο που κατέχουμε εξ ολοκλήρου. Η υπηρεσία SSH-στόχος τρέχει τοπικά σε μια απομονωμένη διεύθυνση loopback (127.0.0.100:2222), χωρίς καμία έκθεση προς το δίκτυο ή το Internet και χωρίς δημοσιευμένες πόρτες. Τα αρχεία hash (shadow.bak, appdb_users) είναι συνθετικά, τα φτιάξαμε εμείς με εργαστηριακούς κωδικούς. Δεν χρησιμοποιήθηκε, δεν σαρώθηκε και δεν στοχοποιήθηκε κανένα πραγματικό, τρίτο ή παραγωγικό σύστημα, ούτε πραγματικά credentials ή δεδομένα πελατών. Οι τεχνικές password guessing και password cracking είναι παράνομες όταν εφαρμόζονται χωρίς ρητή γραπτή εξουσιοδότηση. Χρησιμοποιήστε τις μόνο σε δικά σας ή ρητά εξουσιοδοτημένα συστήματα, στο πλαίσιο νόμιμου penetration testing.

Εισαγωγή: γιατί οι κωδικοί εξακολουθούν να είναι το πιο αδύναμο σημείο

Παρά τα δεκαετή προειδοποιήσεων, ο κωδικός πρόσβασης παραμένει το πιο συχνά εκμεταλλεύσιμο σημείο ενός οργανισμού. Δεν είναι θέμα «αν» θα διαρρεύσει ένα hash — είναι θέμα «πότε», και κυρίως «τι συμβαίνει μετά». Ένα κλεμμένο backup, ένα SQL injection, ένα παλιό shadow.bak σε έναν λησμονημένο server, ένα dump από τρίτο πάροχο: όλα αυτά καταλήγουν σε αρχεία hashes στα χέρια ενός επιτιθέμενου. Και εκεί ξεκινά η πραγματική κούρσα.

Η κρίσιμη διάκριση που κάθε επαγγελματίας — offensive ή defensive — πρέπει να έχει εσωτερικεύσει είναι αυτή ανάμεσα σε online και offline επίθεση κωδικού. Στην online επίθεση, ο επιτιθέμενος δοκιμάζει κωδικούς απευθείας εναντίον της ζωντανής υπηρεσίας (ένα SSH login, ένα web form, ένα RDP). Είναι αργή, θορυβώδης και — το σημαντικότερο — σταματάει με μηχανισμούς όπως account lockout, rate limiting και MFA. Στην offline επίθεση, ο επιτιθέμενος έχει ήδη τα hashes και δοκιμάζει κωδικούς τοπικά, στο δικό του μηχάνημα, χωρίς να στέλνει ούτε ένα πακέτο στο θύμα. Εδώ η ταχύτητα εκτοξεύεται — εκατομμύρια ή δισεκατομμύρια δοκιμές ανά δευτερόλεπτο — και ο αμυνόμενος δεν βλέπει τίποτα. Η μόνη άμυνα είναι προληπτική: αργό, salted hashing και ισχυροί κωδικοί.

Σε αυτό το flagship άρθρο των Audax Labs στήνουμε μια ολοκληρωμένη αλυσίδα που δείχνει και τις δύο πλευρές, με τέσσερα εργαλεία που κάθε σοβαρός επαγγελματίας κυβερνοασφάλειας οφείλει να γνωρίζει σε βάθος:

  1. nmap — για να ανακαλύψουμε την υπηρεσία SSH στο εργαστηριακό μας box.
  2. Hydra — για online brute force ενός αδύναμου κωδικού SSH, ώστε να αποκτήσουμε foothold.
  3. John the Ripper — για offline σπάσιμο των hashes που βρίσκουμε στο box (raw-MD5 και sha512crypt), με wordlist και rules.
  4. hashcat — για offline σπάσιμο με masks και rules, δείχνοντας την ωμή ταχύτητα του GPU/CPU cracking.

Και σε όλη τη διαδρομή κρατάμε μια ρεαλιστική λεπτομέρεια που τα «tutorials» συνήθως αποκρύπτουν: ένας ισχυρός κωδικός αντιστέκεται. Δεν σπάνε όλα. Και το γιατί σπάνε τα υπόλοιπα είναι ολόκληρο το μάθημα.


Το σενάριο και το εργαστήριο

Ο στόχος μας είναι ένα μικρό «lab box» — μια υπηρεσία SSH που φτιάξαμε εμείς, με έναν λογαριασμό labadmin που έχει σκόπιμα αδύναμο κωδικό. Αφού αποκτήσουμε πρόσβαση (foothold), «βρίσκουμε» πάνω στο box δύο πηγές hashes που επίσης δημιουργήσαμε εμείς:

  • ένα shadow.bak — αντίγραφο τύπου /etc/shadow με sha512crypt ($6$) hashes, δηλαδή αργό και salted hashing.
  • ένα dump μιας εφαρμογής (appdb_users) με κωδικούς αποθηκευμένους ως unsalted raw-MD5 — η κλασική, νεκρή εδώ και μια δεκαετία κακή πρακτική που όμως εξακολουθεί να εμφανίζεται σε παλιό κώδικα.

Στόχος: να ανακτήσουμε όσο το δυνατόν περισσότερους κωδικούς σε καθαρό κείμενο και να φτάσουμε στο εργαστηριακό flag.

Τοπολογία

Ολόκληρο το σενάριο τρέχει σε έναν μόνο host. Η υπηρεσία SSH-στόχος υλοποιείται με μια μικρή εφαρμογή Python (paramiko) που δέχεται έναν λογαριασμό με έναν αδύναμο κωδικό, δεσμευμένη στο 127.0.0.100:2222. Η μηχανή επίθεσης είναι ο ίδιος host, με ταυτότητα χειριστή απόλυτα ουδέτερη (kali@lab). Δεν υπάρχει καμία γέφυρα προς LAN ή Internet.

Τοπολογία απομονωμένου εργαστηρίου
Τοπολογία απομονωμένου εργαστηρίου
Ειλικρινής διευκρίνιση για το Docker. Η αρχική πρόθεση ήταν ο στόχος να τρέξει σε ένα Docker container πάνω σε ένα internal: true bridge χωρίς δημοσιευμένες πόρτες. Στο συγκεκριμένο περιβάλλον ο Docker daemon ήταν inactive και δεν υπήρχε δικαίωμα εκκίνησής του χωρίς sudo. Ακολουθήσαμε λοιπόν την τίμια εναλλακτική: η υπηρεσία SSH δεσμεύτηκε σε μια απομονωμένη διεύθυνση loopback (127.0.0.100). Το αποτέλεσμα είναι ισοδύναμο από άποψη απομόνωσης — τίποτα δεν εκτίθεται εκτός host — και το δηλώνουμε ρητά αντί να το κρύψουμε. Παρόμοια ειλικρίνεια οφείλουμε και για το hashcat: το μηχάνημα δεν διαθέτει GPU, οπότε το hashcat έτρεξε CPU-only μέσω του OpenCL runtime pocl. Οι αριθμοί ταχύτητας που παραθέτουμε είναι πραγματικοί για CPU· σε πραγματικό GPU rig θα ήταν τάξεις μεγέθους υψηλότεροι.

Το εργαστήριο περιλαμβάνει επίσης:

  • lab-wordlist.txt — ένα μικρό wordlist τύπου rockyou, που περιέχει σκόπιμα τους «αδύναμους» κωδικούς (ώστε τα cracking εργαλεία να έχουν τι να βρουν), αλλά όχι τον ισχυρό κωδικό (ώστε να δείξουμε ρεαλιστικά ότι δεν σπάνε όλα).
  • lab-rules.rule — ένα μικρό σύνολο κανόνων μετασχηματισμού, για να δείξουμε πώς οι rules «γεφυρώνουν» ένα wordlist με τους πραγματικούς, ελαφρώς παραλλαγμένους κωδικούς.

Εργαλείο 1 — nmap: ανακάλυψη της υπηρεσίας-στόχου

Τι είναι και πού ταιριάζει

Το nmap (Network Mapper) είναι το de facto εργαλείο ανακάλυψης δικτύου και υπηρεσιών. Πριν επιτεθείς σε μια υπηρεσία, πρέπει να ξέρεις ότι υπάρχει και τι είναι. Το nmap σαρώνει πόρτες, αναγνωρίζει ποιες είναι ανοιχτές και — με service/version detection (-sV) — προσπαθεί να ταυτοποιήσει το πρωτόκολλο και την έκδοση της υπηρεσίας πίσω από κάθε πόρτα, διαβάζοντας banners και ταιριάζοντας fingerprints. Σε μια αλυσίδα password cracking, το nmap είναι το βήμα που μας λέει «εδώ τρέχει SSH — αξίζει να δοκιμάσουμε credentials».

Σημαντικές παράμετροι / flags

FlagΤι κάνει
-sVService/version detection — ταυτοποιεί πρωτόκολλο και έκδοση υπηρεσίας
-pΚαθορισμός πορτών (π.χ. -p 2222 ή -p- για όλες)
-PnΠαράλειψη host discovery (θεωρεί τον host up· χρήσιμο σε loopback/φιλτραρισμένα)
-sSSYN («half-open») scan — γρήγορο, αλλά απαιτεί root
-sTTCP connect scan — δεν απαιτεί root, ολοκληρώνει το handshake
-sCΕκτέλεση των default NSE scripts
-AAggressive: -sV + OS detection + scripts + traceroute
-T0..T5Timing template (0 = πολύ αργό/stealth, 5 = πολύ επιθετικό)
-oN/-oX/-oGΈξοδος σε normal / XML / grepable μορφή
🔒Κατεβάστε το Credential & Password Security Checklist (PDF)

Πώς να μη σπάνε οι κωδικοί σας — αποθήκευση (bcrypt/Argon2), πολιτική και άμυνα σε brute/spraying. Αφήστε εταιρικό email.

Η εντολή που τρέξαμε

Στοχεύουμε το εργαστηριακό box και ζητάμε service detection στην πόρτα-στόχο:

nmap -sV -p 2222 -Pn 127.0.0.100

Το nmap επιβεβαίωσε ότι στην 2222/tcp απαντά μια υπηρεσία SSH (protocol 2.0), διαβάζοντας το banner SSH-2.0-OpenSSH_8.9p1. Δεν αναγνώρισε πλήρως το version fingerprint (γι’ αυτό το «unrecognized» μήνυμα) — κάτι απόλυτα φυσιολογικό για μια custom υπηρεσία — αλλά η ταυτοποίηση του πρωτοκόλλου SSH είναι ξεκάθαρη.

nmap: ανακάλυψη της υπηρεσίας SSH στο lab box
nmap: ανακάλυψη της υπηρεσίας SSH στο lab box

Αυτό είναι το πραγματικό output από την εκτέλεση στο εργαστήριο. Με την υπηρεσία SSH επιβεβαιωμένη, το επόμενο λογικό βήμα ενός επιτιθέμενου είναι να δοκιμάσει credentials — και εδώ μπαίνει το Hydra.


Εργαλείο 2 — Hydra: ONLINE brute force για foothold

Τι είναι και πού ταιριάζει

Ο THC-Hydra είναι ο πιο γνωστός online password brute-forcer / cracker. «Online» σημαίνει ότι το Hydra μιλάει απευθείας με τη ζωντανή υπηρεσία: για κάθε ζεύγος username/password που δοκιμάζει, ανοίγει μια πραγματική σύνδεση (εδώ, ένα SSH handshake) και ελέγχει αν η αυθεντικοποίηση πετυχαίνει. Υποστηρίζει δεκάδες πρωτόκολλα (SSH, FTP, HTTP(S) forms, RDP, SMB, MySQL, VNC, κ.λπ.), παραλληλισμό με tasks, και λίστες χρηστών/κωδικών.

Πού ταιριάζει: όταν έχεις ανακαλύψει μια υπηρεσία αυθεντικοποίησης και θέλεις να δοκιμάσεις αδύναμα ή προβλέψιμα credentials. Είναι ισχυρό — και ακριβώς γι’ αυτό θορυβώδες: κάθε προσπάθεια αφήνει ίχνος στα logs της υπηρεσίας. Αυτό είναι κρίσιμο σημείο, στο οποίο θα επιστρέψουμε στην άμυνα.

Σημαντικές παράμετροι / flags

FlagΤι κάνει
-l / -LΈνα username / λίστα usernames από αρχείο
-p / -PΈνας κωδικός / λίστα κωδικών από αρχείο
-CΑρχείο με ζεύγη user:pass (colon-separated)
-tΠλήθος παράλληλων tasks ανά host
-fΣταμάτημα μόλις βρεθεί έγκυρο ζεύγος για τον host
-sΚαθορισμός μη-τυπικής πόρτας
-V / -IVerbose (κάθε δοκιμή) / αγνόησε προηγούμενο restore file
-wTimeout ανά σύνδεση
service://targetΣτόχος και πρωτόκολλο (π.χ. ssh://127.0.0.100:2222)

Η εντολή που τρέξαμε

Δοκιμάζουμε μια μικρή λίστα από πιθανά usernames και μια μικρή λίστα κοινών κωδικών εναντίον της υπηρεσίας SSH, με 4 παράλληλα tasks και σταμάτημα στο πρώτο εύρημα:

hydra -L ssh-users.txt -P ssh-passwords.txt -t 4 -f ssh://127.0.0.100:2222

Μέσα σε 32 δοκιμές, το Hydra βρήκε το έγκυρο ζεύγος:

Hydra: online brute force του αδύναμου κωδικού SSH
Hydra: online brute force του αδύναμου κωδικού SSH
[2222][ssh] host: 127.0.0.100   login: labadmin   password: autumn2021
1 of 1 target successfully completed, 1 valid password found

Ο κωδικός autumn2021 είναι το χαρακτηριστικό «εποχή + έτος» μοτίβο — προβλέψιμο, μικρό keyspace, και υπαρκτό σε κάθε κοινό wordlist. Επαληθεύσαμε το foothold συνδεόμενοι με τα ίδια credentials και εκτελώντας μια εντολή στο lab box (η υπηρεσία μας επιστρέφει ένα εργαστηριακό flag ως απόδειξη πρόσβασης).

Το ουσιαστικό σημείο εδώ δεν είναι μόνο ότι «ο κωδικός ήταν αδύναμος». Είναι ότι αυτή η επίθεση ήταν online: κάθε μία από τις 32 δοκιμές ήταν μια πραγματική απόπειρα σύνδεσης, ορατή σε οποιοδήποτε σύστημα καταγραφής. Ένα απλό account lockout στις 5 αποτυχίες, ή ένα fail2ban, θα είχε σταματήσει το Hydra πριν φτάσει στην επιτυχία. Κρατήστε το: η online επίθεση είναι σταματήσιμη.


Online vs Offline: η πιο σημαντική διάκριση

Πριν προχωρήσουμε στα εργαλεία offline, ας παγιώσουμε τη διάκριση, γιατί είναι ο πυρήνας ολόκληρου του άρθρου.

Online vs Offline password attacks
Online vs Offline password attacks

Στην online επίθεση (Hydra), κάθε δοκιμή ταξιδεύει στο δίκτυο προς τη ζωντανή υπηρεσία. Η ταχύτητα περιορίζεται από τη latency, τα timeouts και τους ρυθμούς που επιτρέπει η υπηρεσία. Είναι θορυβώδης (φαίνεται στα auth logs) και — κρίσιμα — αναχαιτίζεται σε πραγματικό χρόνο: lockout, rate limiting, fail2ban, MFA. Αντιστοιχεί στην τεχνική T1110.001 – Password Guessing του MITRE ATT&CK.

Στην offline επίθεση (John, hashcat), ο επιτιθέμενος έχει ήδη αποκτήσει τα hashes και δοκιμάζει κωδικούς τοπικά. Δεν φεύγει ούτε ένα πακέτο προς το θύμα. Η ταχύτητα εκτοξεύεται — και εξαρτάται αποκλειστικά από τον τύπο του hash. Αν το hashing είναι γρήγορο και unsalted (raw-MD5), μιλάμε για εκατοντάδες εκατομμύρια ή δισεκατομμύρια δοκιμές ανά δευτερόλεπτο. Αν είναι αργό και salted (bcrypt, sha512crypt, Argon2), η ταχύτητα καταρρέει σε λίγες χιλιάδες ή δεκάδες δοκιμές ανά δευτερόλεπτο. Αυτή είναι η τεχνική T1110.002 – Password Cracking. Ο αμυνόμενος δεν βλέπει τίποτα στο δίκτυο· η άμυνα είναι καθαρά προληπτική.

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


Εργαλείο 3 — John the Ripper: το κλασικό offline cracking

Τι είναι και πού ταιριάζει

Ο John the Ripper (john, στην έκδοση «jumbo») είναι ο πιο διαδεδομένος offline password cracker ανοιχτού κώδικα. Δουλεύει πάνω σε hashes που έχεις ήδη αποκτήσει, δοκιμάζοντας υποψήφιους κωδικούς τοπικά. Υποστηρίζει εκατοντάδες μορφές (raw-MD5, SHA-family, bcrypt, sha512crypt, NTLM, Kerberos, ZIP/RAR, κ.λπ.) και πολλαπλές λειτουργίες: wordlist, wordlist+rules, incremental (brute force βάσει στατιστικών), και mask. Ο John ξεχωρίζει για την ευκολία του, το έξυπνο --single mode, και το .pot/--show workflow που κρατά ό,τι έχεις σπάσει.

Πού ταιριάζει: αμέσως μετά από κάθε στιγμή που αποκτάς hashes — από SQL injection dump, από /etc/shadow, από NTDS.dit, από ένα κλεμμένο backup. Είναι το βήμα που μετατρέπει τα «hashes» σε πραγματική πρόσβαση.

Σημαντικές παράμετροι / flags

FlagΤι κάνει
--formatΡητή δήλωση τύπου hash (π.χ. raw-md5, sha512crypt, NT, bcrypt)
--wordlistΑρχείο υποψήφιων κωδικών
--rulesΚανόνες μετασχηματισμού (π.χ. --rules=Jumbo)
--incrementalBrute-force mode βάσει στατιστικών χαρακτήρων
--maskΣτοχευμένο brute force με πρότυπο (π.χ. ?u?l?l?l?d?d)
--single«Single crack» mode (usernames/GECOS ως υποψήφιοι)
--showΕμφάνιση ήδη σπασμένων κωδικών από το .pot
--forkΠαραλληλισμός σε πολλαπλά processes
--potΚαθορισμός αρχείου .pot (αποθήκη σπασμένων)

Η εντολή που τρέξαμε — μέρος Α: raw-MD5 (γρήγορο, unsalted)

Πρώτα επιτιθέμαστε στο dump της εφαρμογής, όπου οι κωδικοί είναι αποθηκευμένοι ως unsalted MD5:

john --format=raw-md5 --wordlist=lab-wordlist.txt appdb_md5.txt
john --show --format=raw-md5 appdb_md5.txt

Ο John έσπασε δύο από τους τρεις κωδικούς σχεδόν ακαριαία (appadmin:iloveyou, k.nikolaou:dragon123). Ο τρίτος λογαριασμός (api-svc) παρέμεινε άσπαστος, γιατί ο κωδικός του (9xQ!vProwl$42) δεν υπάρχει στο wordlist.

Η εντολή που τρέξαμε — μέρος Β: sha512crypt (αργό, salted) + rules

Στη συνέχεια στρεφόμαστε στο shadow.bak, όπου το hashing είναι sha512crypt ($6$) — αργό και με ξεχωριστό salt ανά χρήστη:

john --format=sha512crypt --wordlist=lab-wordlist.txt shadow.bak
john --format=sha512crypt --wordlist=lab-wordlist.txt --rules=Jumbo shadow.bak

Με σκέτο wordlist, ο John βρήκε αμέσως το root:sunshine. Ο δεύτερος χρήστης όμως, m.dimitriou, είχε κωδικό Sunshine1 — μια παραλλαγή που δεν υπάρχει αυτούσια στο wordlist. Εδώ φαίνεται η αξία των rules: με --rules=Jumbo, ο John παίρνει τη λέξη sunshine του wordlist και εφαρμόζει μετασχηματισμούς (capitalize, append digit, leetspeak κ.λπ.) — και ένας από αυτούς παράγει το Sunshine1, σπάζοντάς το. Ο τρίτος χρήστης, svc-backup, με τον ισχυρό κωδικό, αντιστάθηκε ακόμη και μετά την εξάντληση όλων των κανόνων.

John the Ripper: σπάσιμο raw-MD5 και sha512crypt με wordlist + rules
John the Ripper: σπάσιμο raw-MD5 και sha512crypt με wordlist + rules

Το δίδαγμα είναι διπλό. Πρώτον, το unsalted MD5 δεν έχει καμία απολύτως αντίσταση: ο John δοκίμασε δεκάδες υποψήφιους ανά δευτερόλεπτο σε ένα μικρό wordlist και τελείωσε πριν προλάβετε να διαβάσετε την εντολή. Δεύτερον, οι rules είναι αυτό που κάνει το cracking επικίνδυνο στον πραγματικό κόσμο: οι άνθρωποι δεν βάζουν password, βάζουν Password1! — και ακριβώς αυτούς τους «έξυπνους» μετασχηματισμούς αναπαράγουν τα rulesets. Ο μόνος λόγος που ο svc-backup επέζησε είναι η ποιότητα του κωδικού, όχι του hashing.


Εργαλείο 4 — hashcat: ωμή ταχύτητα με masks και rules

Τι είναι και πού ταιριάζει

Το hashcat αυτοαποκαλείται «the world’s fastest password cracker», και δικαίως. Είναι ένα εργαλείο offline cracking σχεδιασμένο να αξιοποιεί το μαζικό parallelism των GPU (μέσω OpenCL/CUDA/HIP), αλλά τρέχει και σε CPU. Υποστηρίζει εκατοντάδες hash modes (-m), και τέσσερις βασικές λειτουργίες επίθεσης (-a): straight/wordlist, combination, brute-force/mask, και hybrid. Η δύναμή του βρίσκεται στους mask attacks (στοχευμένο brute force με πρότυπα χαρακτήρων) και στα rules που εφαρμόζονται σε επίπεδο GPU, με ταχύτητες που για γρήγορα hashes φτάνουν σε δισεκατομμύρια δοκιμές το δευτερόλεπτο σε καλό hardware.

Πού ταιριάζει: όταν έχεις hashes και θέλεις τη μέγιστη δυνατή απόδοση — είτε με μεγάλα wordlists + rules, είτε με masks όταν γνωρίζεις το «σχήμα» του κωδικού (π.χ. 8 πεζά, ή λέξη + 4 ψηφία). John και hashcat είναι συμπληρωματικά: πολλοί επαγγελματίες κάνουν γρήγορο triage με John και μετά ρίχνουν το βαρύ πυροβολικό του hashcat σε GPU rig.

Σημαντικές παράμετροι / flags

FlagΤι κάνει
-mHash mode (π.χ. 0 = MD5, 1800 = sha512crypt, 1000 = NTLM, 3200 = bcrypt)
-aAttack mode (0 straight/wordlist, 1 combination, 3 mask, 6/7 hybrid)
-rΑρχείο κανόνων (rules) που εφαρμόζεται στο wordlist
-oΑρχείο εξόδου για τα σπασμένα
--potfile-pathΚαθορισμός potfile (αποθήκη σπασμένων)
-OOptimized kernels (γρηγορότερα, με όριο μήκους κωδικού)
-wWorkload profile (1 = low … 4 = nightmare)
-DΕπιλογή backend device (CPU/GPU)
?l ?u ?d ?s ?aCharsets για masks: πεζά / κεφαλαία / ψηφία / σύμβολα / όλα
--show / --usernameΕμφάνιση σπασμένων / χειρισμός μορφής user:hash

Η εντολή που τρέξαμε — wordlist, mask, και salted

Πρώτα, straight wordlist attack στα raw-MD5 (mode 0):

hashcat -m 0 -a 0 appdb_md5_bare.txt lab-wordlist.txt

Όπως και ο John, το hashcat έσπασε τα δύο αδύναμα (iloveyou, dragon123) και σταμάτησε ως Exhausted με το ισχυρό να αντιστέκεται. Στη συνέχεια, ένα mask attack (mode -a 3) για να δείξουμε την ταχύτητα σε γνωστό σχήμα — εδώ, 8 πεζοί χαρακτήρες (?l?l?l?l?l?l?l?l), που ταιριάζει στο iloveyou:

hashcat -m 0 -a 3 iloveyou.hash '?l?l?l?l?l?l?l?l'

Το αποτέλεσμα είναι εντυπωσιακό ακόμη και χωρίς GPU: 798,1 MH/s — σχεδόν 800 εκατομμύρια δοκιμές MD5 ανά δευτερόλεπτο σε CPU. Τέλος, το salted sha512crypt (mode 1800) με wordlist + rules:

hashcat -m 1800 -a 0 shadow_hashes.txt lab-wordlist.txt -r lab-rules.rule

Εδώ το hashcat έσπασε sunshine και, χάρη στο rule c $1 (capitalize + append «1»), και το Sunshine1 — με τον ισχυρό κωδικό να αντιστέκεται ξανά.

hashcat: wordlist, mask attack, και salted cracking με τους πραγματικούς αριθμούς ταχύτητας
hashcat: wordlist, mask attack, και salted cracking με τους πραγματικούς αριθμούς ταχύτητας

Και εδώ κρύβεται ο πιο σημαντικός αριθμός ολόκληρου του άρθρου. Στο ίδιο μηχάνημα, το raw-MD5 έτρεξε στα 798.000.000 δοκιμές/δευτερόλεπτο, ενώ το sha512crypt στα 1.848 δοκιμές/δευτερόλεπτο. Αυτό είναι διαφορά περίπου 430.000 φορές. Το salted, αργό KDF δεν κάνει τον κωδικό «άσπαστο» — τον κάνει οικονομικά ασύμφορο να σπάσει με brute force. Αυτή η μία γραμμή αριθμών είναι όλο το επιχείρημα υπέρ του bcrypt/Argon2 απέναντι στο MD5.


Ενώνοντας την αλυσίδα: από το nmap στον στόχο

Ας δούμε ολόκληρη την αλυσίδα ως ενιαία αφήγηση. Κάθε βήμα τροφοδοτεί το επόμενο:

  1. discover (nmap): Εντοπίσαμε την υπηρεσία SSH στο 127.0.0.100:2222.
  2. online crack (Hydra): Με online brute force βρήκαμε το labadmin:autumn2021 και αποκτήσαμε foothold.
  3. loot: Πάνω στο box «βρήκαμε» δύο πηγές hashes — shadow.bak (sha512crypt) και το app DB dump (raw-MD5).
  4. offline crack (John + hashcat): Σπάσαμε πέντε από τους επτά κωδικούς offline, με wordlist και rules, δείχνοντας ταυτόχρονα την τεράστια διαφορά ταχύτητας μεταξύ fast/unsalted και slow/salted.
  5. objective: Με τα ανακτημένα credentials επιβεβαιώσαμε την πρόσβαση και πήραμε το εργαστηριακό flag.
Objective: ανακτημένα credentials, οι δύο που αντιστάθηκαν, και το flag
Objective: ανακτημένα credentials, οι δύο που αντιστάθηκαν, και το flag

Το αποτέλεσμα, συνοπτικά — τι έσπασε και τι όχι:

Πίνακας αποτελεσμάτων: τι σπάστηκε και τι αντιστάθηκε
Πίνακας αποτελεσμάτων: τι σπάστηκε και τι αντιστάθηκε

Πέντε στους επτά κωδικούς ανακτήθηκαν. Οι δύο επιζώντες μοιράζονται έναν ισχυρό κωδικό (9xQ!vProwl$42) — και το αντιστάθηκαν τόσο ως raw-MD5 όσο και ως sha512crypt. Αυτό αποδεικνύει το κρίσιμο σημείο: μόλις ένα hash διαρρεύσει, η τελευταία γραμμή άμυνας είναι η ισχύς του ίδιου του κωδικού. Το fast unsalted MD5 δεν πρόσφερε καμία προστασία· ο ισχυρός κωδικός επέζησε ακόμη και εκεί.

Χρειάζεστε στοχευμένο έλεγχο τώρα; Το να τρέξετε ένα εργαλείο μόνοι σας είναι το εύκολο κομμάτι. Η ομάδα της Audax εκτελεί penetration testing και offensive assessment που αποδεικνύουν στην πράξη τι πραγματικά σας εκθέτει — με τεκμηριωμένα ευρήματα και προτεραιοποίηση.

MITRE ATT&CK: mini-mapping της αλυσίδας

Η αντιστοίχιση της αλυσίδας σε τεχνικές του MITRE ATT&CK βοηθά τις blue teams να καταλάβουν τι να ανιχνεύσουν σε κάθε στάδιο:

MITRE ATT&CK mapping της αλυσίδας
MITRE ATT&CK mapping της αλυσίδας
ΣτάδιοΕργαλείοΤεχνική ATT&CKΠεριγραφή
DiscoverynmapT1046 – Network Service DiscoveryΑνακάλυψη της υπηρεσίας SSH στον στόχο
Credential AccessHydraT1110.001 – Brute Force: Password GuessingOnline μαντέψιμο του αδύναμου κωδικού SSH
Credential Accessloot (shadow/app DB)T1003 / T1552 – Credential Dumping / Unsecured CredentialsΑπόκτηση αρχείων hash από το box
Credential AccessJohn / hashcatT1110.002 – Brute Force: Password CrackingOffline σπάσιμο των hashes σε plaintext
Persistence / AccessloginT1078 – Valid AccountsΧρήση των ανακτημένων credentials για πρόσβαση

Η ουσία της χαρτογράφησης: η online τεχνική (T1110.001) είναι θορυβώδης και ανιχνεύσιμη — spikes αποτυχημένων SSH auth, lockouts, ενεργοποιήσεις fail2ban. Η offline τεχνική (T1110.002) είναι αόρατη στο δίκτυο — δεν φτάνει τίποτα στον αμυνόμενο. Γι’ αυτό η ανίχνευση μετατοπίζεται στη χρήση των credentials (T1078): impossible travel, νέα συσκευή, login εκτός ωραρίου. Και το MFA είναι αυτό που σπάει τον τελικό κρίκο ακόμη και μετά από επιτυχημένο crack.


Επαλήθευση

Για να είναι το αποτέλεσμα αξιόπιστο και όχι «τυχαίο», εφαρμόσαμε επαληθεύσεις σε κάθε στάδιο:

  • nmap: Επιβεβαιώσαμε χειροκίνητα το SSH banner με μια απευθείας σύνδεση TCP (SSH-2.0-OpenSSH_8.9p1 Lab), ταιριάζοντας ό,τι ανέφερε το -sV.
  • Hydra: Πήραμε το εύρημα labadmin:autumn2021 και το επαληθεύσαμε ανεξάρτητα συνδεόμενοι με SSH με αυτά τα credentials και εκτελώντας εντολή στο box (θετικό control). Ένα λάθος ζεύγος απορρίπτεται (αρνητικό control).
  • John / hashcat: Τα δύο εργαλεία, ανεξάρτητα, κατέληξαν στο ίδιο σύνολο σπασμένων κωδικών (raw-MD5: 2/3, sha512crypt: 2/3) και στους ίδιους δύο επιζώντες — αποδεικνύοντας ότι κανένα δεν «εφευρίσκει» αποτελέσματα. Επιβεβαιώσαμε επίσης τα plaintext ξαναϋπολογίζοντας τα hashes.
  • Ισχυρός κωδικός: Ο 9xQ!vProwl$42 έμεινε άσπαστος και στους δύο τύπους hash και στα δύο εργαλεία — σκόπιμα εκτός wordlist, για ρεαλισμό.

Αντιμετώπιση προβλημάτων (troubleshooting)

Κατά το στήσιμο συναντήσαμε αρκετά πραγματικά εμπόδια, τα οποία καταγράφουμε με ειλικρίνεια:

  • Δεν υπήρχαν έτοιμα τα Hydra/hashcat. Το σύστημα δεν είχε ούτε sudo/apt. Χτίσαμε από πηγαίο κώδικα: το Hydra χρειάστηκε τα headers του libssh (και libssl/libgcrypt) — τα κατεβάσαμε ως .deb και τα εξαγάγαμε σε τοπικό sysroot. Το configure του Hydra απέτυχε αρχικά επειδή το path του sysroot περιείχε κενό· το μετακινήσαμε σε path χωρίς κενά. Χρειάστηκε επίσης ρητό -lgpg-error στο linking.
  • Docker inactive. Ο daemon ήταν ανενεργός και δεν υπήρχε δικαίωμα εκκίνησης. Λύση: απομονωμένο loopback (127.0.0.100:2222) — δηλωμένο ρητά.
  • hashcat χωρίς GPU/OpenCL device. Το μηχάνημα δεν έχει GPU ούτε OpenCL runtime εγκατεστημένο. Εγκαταστήσαμε τοπικά (χωρίς sudo) το pocl (Portable Computing Language), έναν CPU OpenCL runtime, δείχνοντάς τον στο hashcat μέσω OCL_ICD_VENDORS. Έτσι το hashcat έτρεξε CPU-only — το δηλώνουμε καθαρά, και οι αριθμοί ταχύτητας πρέπει να διαβάζονται με αυτό υπόψη.
  • best64.rule vs best66.rule. Η εντολή απέτυχε γιατί το build είχε best66.rule. Επιπλέον, το best66 δεν παρήγαγε το Sunshine1· φτιάξαμε ένα μικρό, στοχευμένο lab-rules.rule (capitalize + append digit) — ακριβώς όπως θα έκανε ένας pentester που «διαβάζει» τη λογική των κωδικών ενός οργανισμού.
  • ANSI χρώματα στην έξοδο. John και hashcat παράγουν ANSI escape codes. Για καθαρά, αναγνώσιμα screenshots, φιλτράραμε τα escape sequences και αναπαραστήσαμε την έξοδο σε ASCII, με ουδέτερη ταυτότητα χειριστή (kali@lab).

Πόσο γρήγορα σπάνε οι κωδικοί του οργανισμού σας;

Αδύναμοι κωδικοί και γρήγορα hashes σπάνε σε δευτερόλεπτα. Η Audax δοκιμάζει στην πράξη την αντοχή των credentials και της πολιτικής σας με πραγματικό offensive assessment.

Ζητήστε offensive assessment →

Άμυνα: γιατί σπάει (και πώς να μη σπάει)

Εδώ βρίσκεται η πραγματική αξία ενός offensive άρθρου για έναν οργανισμό. Είδαμε πώς σπάνε οι κωδικοί· τώρα δείχνουμε πώς να μη σπάνε. Κάθε κρίκος έχει συγκεκριμένη, εφαρμόσιμη άμυνα.

1. Αργό, salted hashing — το θεμέλιο

Το πιο σημαντικό μάθημα του άρθρου συμπυκνώνεται σε δύο αριθμούς: raw-MD5 στα 798 MH/s, sha512crypt στα 1.848 H/s, στο ίδιο CPU. Η επιλογή αλγορίθμου hashing είναι η διαφορά ανάμεσα στο «σπάει ακαριαία» και στο «οικονομικά ασύμφορο».

  • Ποτέ fast, γενικού σκοπού hashes (MD5, SHA-1, SHA-256) για αποθήκευση κωδικών. Είναι σχεδιασμένοι να είναι γρήγοροι — ακριβώς το αντίθετο απ’ ό,τι θέλετε.
  • Χρησιμοποιήστε σχεδιασμένους για κωδικούς αλγορίθμους: Argon2id (προτιμώμενος σήμερα), scrypt, ή bcrypt. Το sha512crypt ($6$) είναι αποδεκτό ως legacy, αλλά όχι η πρώτη επιλογή.
  • Salt ανά χρήστη (μοναδικό, τυχαίο) — καταργεί τα rainbow tables και εξαναγκάζει τον επιτιθέμενο να σπάσει κάθε hash ξεχωριστά. (Στο lab, το sha512crypt είχε ξεχωριστό salt ανά χρήστη· το MD5 κανένα.)
  • KDF cost factors: ρυθμίστε το κόστος (bcrypt work factor, Argon2 memory/time/parallelism) ώστε ένα μόνο hash να παίρνει ~100–250 ms στο δικό σας hardware. Αυτό είναι αδιόρατο για τον νόμιμο χρήστη, αλλά καταστροφικό για τον επιτιθέμενο. Επανεξετάστε τα cost factors κάθε χρόνο καθώς το hardware βελτιώνεται.

2. Ισχυρή πολιτική κωδικών + έλεγχος breach lists

Ο λόγος που ο svc-backup και ο api-svc επέζησαν είναι ένας κωδικός εκτός λεξικού.

  • Επιβάλετε μήκος (12+ χαρακτήρες, ιδανικά passphrases) πάνω από πολυπλοκότητα-για-χάρη-της-πολυπλοκότητας.
  • Αποθαρρύνετε προβλέψιμα μοτίβα: εποχή+έτος (autumn2021), λέξη+ψηφίο (Sunshine1), leetspeak. Αυτά ακριβώς αναπαράγουν τα rules.
  • Ελέγξτε κάθε νέο/αλλαγμένο κωδικό έναντι breach lists. Το Have I Been Pwned Passwords API επιτρέπει έλεγχο με k-anonymity (στέλνετε μόνο τα 5 πρώτα ψηφία του SHA-1, ποτέ τον κωδικό). Αν ένας κωδικός έχει ήδη διαρρεύσει, είναι ήδη σε κάθε wordlist — απορρίψτε τον.

3. Ενάντια στην ONLINE επίθεση (Hydra)

Η online επίθεση είναι σταματήσιμη — εκμεταλλευτείτε το:

  • Account lockout / throttling: μετά από N αποτυχίες, κλειδώστε ή επιβάλετε αυξανόμενη καθυστέρηση. Το Hydra μας έκανε 32 δοκιμές· ένα lockout στις 5 θα το είχε σταματήσει.
  • Rate limiting & fail2ban: εντοπίστε ριπές αποτυχημένων auth ανά IP/λογαριασμό και μπλοκάρετε.
  • MFA παντού: ακόμη κι αν ο κωδικός μαντευτεί, ο δεύτερος παράγοντας αναχαιτίζει τη χρήση. Το MFA σπάει τον κρίκο «Valid Accounts».
  • SSH hardening: προτιμήστε key-based authentication και απενεργοποιήστε το PasswordAuthentication· περιορίστε την πρόσβαση με allowlists/bastion.
  • Detection & logging: high-cardinality αποτυχημένα logins, γνωστά User-Agents/patterns εργαλείων, spikes σε auth rate.

4. Ενάντια στην OFFLINE επίθεση (John / hashcat)

Η offline επίθεση είναι αόρατη — γι’ αυτό η άμυνα είναι προληπτική:

  • Όλα τα παραπάνω (slow salted KDF + ισχυρή πολιτική) είναι η ουσιαστική άμυνα, γιατί δεν υπάρχει ανίχνευση τη στιγμή του cracking.
  • Προστατέψτε τα ίδια τα hashes: least-privilege πρόσβαση σε /etc/shadow, DBs και backups· κρυπτογράφηση backups· καμία αποθήκευση password hashes σε logs ή σε πίνακες που δεν τα χρειάζονται.
  • Η ανίχνευση μετατοπίζεται στη χρήση των credentials: impossible travel, νέα συσκευή/IP, login εκτός ωραρίου, ασυνήθιστα service-account logins.
  • Rotation ευαίσθητων credentials μετά από κάθε υποψία διαρροής — ένα hash που δεν είναι πια έγκυρο δεν αξίζει να σπαστεί.

Οριζόντια μέτρα

Πάνω από τα επιμέρους, ένας οργανισμός χρειάζεται συνεχή ορατότητα: continuous exposure management ώστε εκτεθειμένες υπηρεσίες (ένα ξεχασμένο SSH), αδύναμα credentials και διαρρεύσαντα hashes να εντοπίζονται πριν τα βρει ο επιτιθέμενος· τακτικό adversary validation που δοκιμάζει ολόκληρες αλυσίδες (όχι μεμονωμένα ευρήματα)· και ευθυγράμμιση με NIS2 & DORA, που πλέον απαιτούν αποδεδειγμένη, τεκμηριωμένη ανθεκτικότητα και όχι απλώς checkbox compliance.

Θέλετε αυτό το επίπεδο ελέγχου συνεχώς, στο δικό σας περιβάλλον; Το Erevos AI είναι η ετήσια managed υπηρεσία Continuous Threat Exposure Management (CTEM) της Audax — human-led, machine-scaled, με τεκμηριωμένη απόδειξη ανθεκτικότητας για NIS2 & DORA.

Δυνατά σημεία των τεσσάρων εργαλείων

  • nmap: Ο απόλυτος standard για ανακάλυψη. Αξιόπιστο service detection, τεράστια ευελιξία (NSE scripts), πολλαπλά output formats. Το πρώτο εργαλείο σε κάθε engagement.
  • Hydra: Ώριμο, γρήγορο, με υποστήριξη δεκάδων πρωτοκόλλων. Ιδανικό για να αποδείξεις σε ένα report ότι υπάρχουν αδύναμα credentials σε εκτεθειμένες υπηρεσίες.
  • John the Ripper: Το «ελβετικό μαχαίρι» του offline cracking. Απίστευτη υποστήριξη μορφών, έξυπνο --single και rules, εξαιρετικό για γρήγορο triage. Χτίζεται εύκολα από πηγαίο κώδικα.
  • hashcat: Η απόλυτη ταχύτητα. Ισχυρότατοι mask/rule attacks, τεράστια λίστα hash modes, GPU acceleration. Όταν θέλεις να σπάσεις πολλά, γρήγορα, το hashcat σε GPU rig είναι αξεπέραστο.

Περιορισμοί και προσοχή

  • Τα εργαλεία είναι θορυβώδη ή/και επιθετικά αν χρησιμοποιηθούν αλόγιστα. Ένα ασύνετο Hydra μπορεί να κλειδώσει λογαριασμούς παραγωγής· ένα ανεξέλεγκτο cracking μπορεί να «κάψει» ώρες υπολογιστικών πόρων χωρίς αποτέλεσμα.
  • John/hashcat βρίσκουν μόνο ό,τι επιτρέπει η στρατηγική τους (wordlist/rules/mask). Ένας πραγματικά ισχυρός, μοναδικός κωδικός με σωστό KDF παραμένει πρακτικά άσπαστος — όπως αποδείχθηκε στο lab.
  • Οι αριθμοί ταχύτητας εξαρτώνται δραματικά από το hardware. Οι δικοί μας είναι CPU-only· ένα σύγχρονο GPU θα ήταν τάξεις μεγέθους ταχύτερο στο MD5 — κάτι που κάνει το επιχείρημα υπέρ των slow KDFs ακόμη πιο ισχυρό.

Πού χρησιμοποιείται επαγγελματικά

Αυτή η αλυσίδα είναι το ψωμοτύρι πολλών engagements: internal penetration testing (εκτεθειμένες υπηρεσίες με αδύναμα credentials), password audits (πόσο ανθεκτικοί είναι πραγματικά οι κωδικοί του οργανισμού, με νόμιμο cracking των δικών σας hashes), Active Directory assessments (crack NTLM/Kerberos hashes), red team operations και purple teaming (δοκιμή detection σε online brute force). Είναι επίσης θεμελιώδης βάση εκπαίδευσης για blue teams: αν καταλάβεις πώς σπάει ένας κωδικός, καταλαβαίνεις γιατί το bcrypt και το MFA δεν είναι προαιρετικά.

Πότε δεν πρέπει να χρησιμοποιηθεί

Ποτέ εναντίον συστήματος που δεν σας ανήκει ή για το οποίο δεν έχετε ρητή γραπτή εξουσιοδότηση. Ποτέ online brute force σε παραγωγικές υπηρεσίες χωρίς συνεννόηση — μπορεί να κλειδώσετε λογαριασμούς πραγματικών χρηστών ή να προκαλέσετε άρνηση υπηρεσίας. Ποτέ με πραγματικά credentials/δεδομένα πελατών σε ένα lab. Και ποτέ να μη «σπάτε» hashes που αποκτήθηκαν παράνομα. Η γραμμή μεταξύ νόμιμου penetration testing και ποινικού αδικήματος είναι η εξουσιοδότηση.


Τελική αξιολόγηση

Ως αλυσίδα, το κουαρτέτο nmap + Hydra + John the Ripper + hashcat είναι από τα πιο διδακτικά και ρεαλιστικά μονοπάτια για να κατανοήσει κανείς την ασφάλεια κωδικών — και από τις δύο πλευρές. Το κάθε εργαλείο είναι κορυφαίο στην κατηγορία του, ώριμο και ανοιχτού κώδικα. Μαζί αφηγούνται μια πλήρη ιστορία: από το «τι τρέχει εκεί έξω», στο online foothold, και στο offline cracking που ξεχωρίζει τους αδύναμους κωδικούς από τους ισχυρούς. Η πιο πολύτιμη στιγμή του πειράματος δεν ήταν οι κωδικοί που σπάσαμε — ήταν οι δύο που δεν σπάσαμε, και οι αριθμοί ταχύτητας που εξηγούν γιατί.

Βαθμολογία εργαστηριακής άσκησης: 9.5/10 για διδακτική αξία και ρεαλισμό. Ο μόνος αστερίσκος είναι ότι, όπως κάθε ισχυρό offensive tooling, απαιτεί ώριμη κρίση και αυστηρό πλαίσιο εξουσιοδότησης.

Συμπέρασμα

Οι κωδικοί δεν «σπάνε» επειδή τα εργαλεία είναι μαγικά. Σπάνε επειδή είναι αδύναμοι και επειδή αποθηκεύονται λάθος. Ένα unsalted MD5 και ένα «autumn2021» είναι όλα όσα χρειάζεται ένας επιτιθέμενος. Αντίθετα, ένα σωστό Argon2/bcrypt με salt, μια πολιτική που απορρίπτει διαρρεύσαντες κωδικούς, ένα account lockout και το MFA κάνουν ολόκληρη αυτή την αλυσίδα να καταρρεύσει. Ο μόνος τρόπος να ξέρετε πού στέκεστε είναι να δοκιμάσετε ολόκληρη την αλυσίδα με τη λογική του επιτιθέμενου — και μετά να θωρακίσετε κάθε κρίκο.


Από το εργαστήριο, στο δικό σας περιβάλλον

Αυτό που είδατε εδώ ήταν μια ελεγχόμενη, εργαστηριακή αναπαράσταση. Στον πραγματικό κόσμο, οι ίδιες αλυσίδες τρέχουν εναντίον της δικής σας επιφάνειας επίθεσης — συνεχώς, χωρίς προειδοποίηση.

Η Audax Cybersecurity μεταφράζει αυτή τη λογική σε υπηρεσία: δομημένο penetration testing και offensive security validation που δοκιμάζουν ολόκληρες αλυσίδες επίθεσης, όχι μεμονωμένα ευρήματα. Και με το Erevos AI, την ετήσια managed υπηρεσία Continuous Threat Exposure Management (CTEM), αυτός ο έλεγχος γίνεται συνεχής: human-led, machine-scaled, με τεκμηριωμένη απόδειξη ανθεκτικότητας για τις απαιτήσεις NIS2 & DORA.

Human-led. Machine-scaled. Technically proven.

Αν θέλετε να δείτε τι πραγματικά σας εκθέτει — και να το αποδείξετε πριν το κάνει κάποιος άλλος — επισκεφθείτε το https://www.audax.gr και μιλήστε με την ομάδα μας.

Erevos AI · Managed CTEM

Θέλετε συνεχή επικύρωση της ασφάλειάς σας — όχι έλεγχο μία φορά τον χρόνο;

Το Erevos AI είναι η ετήσια, managed υπηρεσία CTEM της Audax — ενοποιεί exposure mapping, penetration testing, adversary emulation, detection validation & remediation σε έναν συνεχή, αποδεικτικό κύκλο. Human-led. Machine-scaled. Technically proven. Ευθυγραμμισμένο με NIS2 & DORA.

Ανακαλύψτε το Erevos AI →
Offensive Security · Penetration Testing

Χρειάζεστε Penetration Testing για τον οργανισμό σας;

Περιγράψτε το scope του ελέγχου μέσα από το δομημένο ερωτηματολόγιο και λάβετε εξατομικευμένη τεχνική & οικονομική προσφορά από την ομάδα Offensive Security της Audax. Χωρίς αυτόματη τιμή ή δέσμευση — η προσφορά αποστέλλεται μετά από τεχνική αξιολόγηση του scope.

Ζητήστε προσφορά Penetration Testing →