Το repository αυτό περιέχει μια παλιά και μη ασφαλή έκδοση του eclass. Προορίζεται για χρήση στα πλαίσια του μαθήματος Προστασία & Ασφάλεια Υπολογιστικών Συστημάτων (ΥΣ13), μην τη χρησιμοποιήσετε για κάνενα άλλο σκοπό.
# create and start (the first run takes time to build the image)
docker-compose up -d
# stop/restart
docker-compose stop
docker-compose start
# stop and remove
docker-compose down -v
To site είναι διαθέσιμο στο http://localhost:8001/. Την πρώτη φορά θα πρέπει να τρέξετε τον οδηγό εγκατάστασης.
- Database
- Host :
db
- User :
root
- Password :
1234
- Host :
- Ρυθμίσεις συστήματος
- URL του Open eClass :
http://localhost:8001/
(προσοχή στο τελικό/
) - Όνομα Χρήστη του Διαχειριστή :
drunkadmin
- URL του Open eClass :
Εκφώνηση: https://ys13.chatzi.org/assets/projects/project1.pdf
- 1115201700028, Ιωάννης Δαρίδης
- 1115201600268, Παντελεήμων Μαλέκας
Συμπληρώστε εδώ ένα report που
- Να εξηγεί τι είδους αλλαγές κάνατε στον κώδικα για να προστατέψετε το site σας (από την κάθε επίθεση).
Για να προστατέψουμε το site μας από SQL injections, εστιάσαμε στα δυο παραδείγματα που είδαμε στην τάξη. Από τα SQL injections της πρώτης μορφής, δηλαδή τα σημεία όπου μπορεί ένας attacker να προσθέσει SQL κώδικα μέσω user input, βρήκαμε ελάχιστες περιπτώσεις. Αυτό διότι από ό,τι είδαμε τα σημεία αυτά ήταν συνήθως ήδη προστατευμένα. Τα ελάχιστα μέρη όπου δεν ίσχυε αυτό προστατεύθηκαν από εμάς. Από τα SQL injections της δεύτερης μορφής, δηλαδή τα σημεία όπου μπορεί κάποιος να προσθέσει SQL κώδικα μέσω παραμέτρων του URL, βρήκαμε πολύ περισσότερες ευπάθειες τις οποίες και διορθώσαμε. Γενικά, παρατηρήσαμε οι πιο πολλές παράμετροι ήταν αριθμητικού τύπου και παρατηρήσαμε μάλιστα ότι σε ορισμένες σελίδες είχαν ήδη προστατευθεί μετατρέποντας το input σε ακέραια μορφή μέσω της συνάρτησης intval. Στα σημεία όπου δεν ίσχυε αυτό, την προσθέσαμε εμείς. Υπήρχαν βέβαια και κάποιες παράμετροι μη-αριθητικές. Σε αυτές επιλέξαμε να χρησιμοποιήσουμε prepare statements με την βοήθεια από τo mysqli extension. Όπως έχουμε αναφέρει και στο μάθημα, το non-executable context είναι γενικά η προτιμότερη επιλογή για άμυνα, για αυτό και το προτιμήσαμε για τις μη-αριθητικές παραμέτρους. Στις αριθμητικές περιπτώσεις, αν και η intval συνάρτηση παραπέμπει σε escaping μέθοδο, ουσιαστικά 'ακυρώνει' οποιοδήποτε executable context οπότε θεωρήσαμε ότι ήταν αρκετή.
Για τα CSRF εστιάσαμε σε όλες τις φόρμες του site, μιας και όπως είδαμε στο μάθημα τα CSRF εκτελούνται σχεδόν αποκλειστικά μέσα από html forms. Για να εντοπίσουμε τις φόρμες που επηρεάζονταν από την επίθεση αυτή, χρησιμοποιήσαμε κάποια βοηθητικά html αρχεία όπου τοποθετήσαμε τις πιο πολλές φόρμες από το site και εκτελέσαμε την σχετική επίθεση. Γρήγορα συνειδητοποίησαμε ότι οι περισσότερες αν όχι όλες οι περισσότερες φόρμες επηρεάζονταν, για αυτό και διορθώσαμε όσες περισσότερες φόρμες βρήκαμε. Ως άμυνα για τα CSRF προσθέσαμε ένα token ως hidden input και υλοποιήσαμε και τους σχετικούς ελέγχους στην PHP. Επίσης όποιος πάει να επιτεθεί σε μια φόρμα μέσω CSRF θα ανακατευθηνθεί αυτόματα στην αρχική σελίδα του site.
Για τις XSS επιθέσεις εστιάσαμε σε επιθέσεις δύο είδων. Η πρώτη μορφή αφορούσε user input που ερχόταν μέσα από φόρμες και η δεύτερη για την τοποθέτηση Javascript κώδικα μέσα από παραμέτρους του URL, όπως και στα SQL injections. Γενικά και για τις δύο μορφές ως άμυνα επιλέξαμε να κάνουμε escape τους ειδικούς χαρακτήρες της HTML, έτσι ώστε να μην αποθηκεύονται στην βάση inputs που να περιέχουν scripts. Για αυτό παρέχεται η htmlspecialchars συνάρτηση από την PHP, η οποία χρησιμοποιείται και από τον έτοιμο κώδικα του open eclass ως 'q'. Γενικά σκεφτήκαμε και την άμυνα του non-executable context μέσω Content Security Policy. Διαπιστώσαμε βέβαια ότι το site χρησιμοποιεί από μόνο του πολλά inline script, οπότε για να χρησιμοποιησούμε το CSP 'ανενόχλητοι' θα έπρεπε να βάλουμε nonce σε όλα τα script που υπάρχουν ήδη το οποίο θεωρήσαμε ότι θα μας έχανε αρκετό χρόνο. Αν μπορούσαμε βέβαια να κάνουμε το site από την αρχή θα επιλέγαμε αυτήν την άμυνα, μιας και όπως έχουμε πει στο μάθημα το non-executable context είναι γενικά η προτιμότερη επιλογή. Ωστόσο σε κάποια σήμεια επιλέξαμε να το βάλουμε μιας και είδαμε ότι δεν χρησιμοποιούνται inline scripts. Να σημειώσουμε επίσης ότι σε κάποια σημεία είδαμε να γίνεται χρήση από την strip_tags της PHP (δηλαδή filtering). Αυτά τα σημεία ΔΕΝ τα τροποιήσαμε με κάποιο τρόπο. Και γενικά οποιαδήποτε άμυνα υπήρχε ήδη από το site δεν την αλλάξαμε, είτε για XSS είτε για τις άλλες επιθέσεις.
Στις RFI επιθέσεις, εστιάσαμε στις επιλογές που έχουν ανέβασμα αρχείου, δηλαδή στην Ανταλλαγή Αρχείων και στις Εργασίες. Παρατηρήσαμε ότι από μόνο του, το site δεν δέχεται ορισμένους τύπους αρχείων, στις Εργασίες συγκεκριμένα. Επίσης είδαμε στον κώδικα για την Ανταλλαγή Αρχείων σχολιασμένη την κλήση μιας συνάρτησης php2phps, η οποία μορφοποίει ένα php αρχείο σε ασφαλή μορφή (phps), 'εκτυπώνοντας' ουσιαστικά τον κώδικα χωρίς να μπορεί να εκτελεστεί. Επιλέξαμε να επεκτείνουμε αυτή την συνάρτηση υλοποιώντας μια αντίστοιχη λειτουργία για τα html αρχεία να μετατρέπονται σε txt. Αυτό αποτρέπει την εκτέλεση πιθανού malicious Javascript κώδικα που μπορεί να εμπεριέχεται σε ένα ανεβασμένο html αρχείο. Οπότε προσθέσαμε την updated php2phps συνάρτηση για το ανέβασμα αρχείου στην Ανταλλαγή Αρχείων και στις Εργασίες. Ως entry point για τα RFI βρήκαμε ότι στο URL της αρχικης του μαθηματος (http://localhost:8001/courses/<course_code>/) αν προσθέσει κανείς την λέξη dropbox ή work μεταφέρεται στον αντίστοιχο χώρο όπου αποθηκεύονται τα αρχεία από την Ανταλλαγή Αρχείων ή των Εργασίων και εκεί μπορεί να εκτελέσει πιθανά επικίνδυνα αρχεία. Αυτή η ευπάθεια διορθώθηκε προσθέτοντας ένα .htaccess αρχείο με την εντολή Options -Indexes, καθώς και μια ανάλογη μικρή αλλαγή στο αρχείο με τα default configurations του Apache. Έχουμε φροντίσει βέβαια να ανεβαίνουν σε ασφαλή μορφή τα php και html αρχεία, οπότε ακόμη και να περιηγηθεί κανείς σε αυτούς τους χώρους δεν θα μπορεί να δει πιθανά επικίνδυνα αρχεία ή να τα εκτελέσει μέσα από τον browser.
- Να εξηγεί τι είδους επιθέσεις δοκιμάσατε στο αντίπαλο site και αν αυτές πέτυχαν.
Τα πρώτα είδη επιθέσεων που εστιάσαμε ήταν τα SQL injections. Από τα SQL injections της πρώτης μορφής, δηλαδή τα σημεία όπου μπορεί να προσθεθεί SQL κώδικας μέσω user input, δεν βρήκαμε καμία ευπάθεια στο αντίπαλο site. Από τα SQL injections της δεύτερης μορφής, δηλαδή τα σημεία όπου μπορεί κάποιος να προσθέσει SQL κώδικα μέσω παραμέτρων του URL, είδαμε ότι τα περισσότερα σχετικά σημεία είχαν προστατευθεί.
- Αποτυχημένες προσπάθειες:
http://underscorepapakia.csec.chatzi.org/modules/unreguser/unregcours.php?cid=
http://underscorepapakia.csec.chatzi.org/modules/work/work.php?id=
http://underscorepapakia.csec.chatzi.org/modules/agenda/myagenda.php?month=6&year=
http://underscorepapakia.csec.chatzi.org/modules/phpbb/newtopic.php?forum=
http://underscorepapakia.csec.chatzi.org/modules/phpbb/index.php?forumnotify=&forum_id=
Από όσα είχαμε σημειώσει είχε ξεφύγει μόνο ένα σημείο το οποίο χρησιμοποιήθηκε και ως entry point για να συνεχίσουμε τις υπόλοιπες επιθέσεις μας. Συγκεκριμένα, στις Περιοχές Συζητήσεων μπορούσε κάποιος να προσθέσει SQL κώδικα μέσω της παραμέτρου forum στην σελίδα viewtopic.php. Μέσα από αυτήν την ευπάθεια καταφέραμε μέσω UNION να εκτελέσουμε ένα SQL ερώτημα το οποίο μας έδινε τον hashed κωδικό του drunkadmin του αντίπαλου site και να τον εμφανίσουμε στο breadcrumb της σελίδας, ολοκληρώνοντας έτσι το πρώτο ζητούμενο από την εκφώνηση.
-
Επιτυχημενη προσπάθεια:
http://underscorepapakia.csec.chatzi.org/modules/phpbb/viewtopic.php?topic=1&forum= ') union select am,password from eclass.user where user_id = '1' union SELECT f.forum_type, f.forum_name FROM forums f, topics t WHERE (f.forum_id = '
Εκμεταλλευόμενοι το γεγονός ότι στο breadcrumb μπορεί να εμφανιστεί σχεδόν οτιδήποτε, εστιάσαμε στο να πάρουμε το file path όπου αποθηκεύονται οι εργασίες που ανεβαίνουν στο site με σκοπό να εκτελέσουμε ένα RFI attack. Έτσι λοιπόν ανεβάσαμε ένα αρχείο το οποίο αποκτά πρόσβαση στο config.php και εμφανίζει τα credentials του drunkadmin (/puppies/yoink.php).
Μετά εκτελέσαμε ένα SQL ερώτημα όπου μας έδινε το file path από το malicious αρχείο μας και το προσθέσαμε κατάλληλως στο URL για να εκτελεστεί η RFI επίθεση μας.
http://underscorepapakia.csec.chatzi.org/modules/phpbb/viewtopic.php?topic=1&forum= ') union select uid,file_path from TMA100.assignment_submit where uid = '3' union SELECT f.forum_type, f.forum_name FROM forums f, topics t WHERE (f.forum_id = '
Έτσι πήραμε τον κωδικό της βάσης, ο οποίος είναι και ο κωδικός του drunkadmin για το site.
Πριν προχωρήσουμε, κάποια σχόλια για τα RFI attacks. Παρατηρήσαμε ότι η αντίπαλη ομάδα είχε αποτρέψει τα directory listings των Εργασιών και των Αρχείων που ανταλλάσονται. Αυτό δυσκόλευε τις RFI επιθέσεις, οπότε θεωρήσαμε ότι θα ήταν σωστό να σημειωθεί. Παρατηρήσαμε επίσης ότι στην Ανταλλαγή Αρχείων δεν υπήρχε άμυνα από πιθανά επικίνδυνα HTML αρχεία αλλά δεν εστιάσαμε στο να βρούμε κάποια επίθεση εκεί πέρα μιας και είχε ήδη πετύχει η επίθεση με το file path που αναφέραμε.
Αφού λοιπόν αποκτήσαμε τον κωδικό του drunkadmin, επιλέξαμε να κάνουμε μια αλλαγή σε admin level για να ολοκληρώσουμε και το δεύτερο ερώτημα για το defacement. Οπότε επιλέξαμε να πρόσθεσουμε μια Ανακοίνωση Διαχειριστή με JavaScript κώδικα για να ελέγξουμε ταυτόχρονα για XSS vulnerabilities. Είδαμε ότι μόνο τα σχόλια δεν προστατεύονται από XSS οπότε προσθέσαμε μια Ανακoίνωση και στα σχόλια βάλαμε έναν JavaScript κώδικα ο οποίος πρόσθετε ένα meme image με τον Edward Snowden για να τιμήσουμε και το όνομα της ομάδας μας. Οι Ανακοινώσεις Διαχειριστή εμφανίζονται στην αρχική σελίδα ενός μη-συνδεδεμένου χρήστη οπότε είδαμε το attack μας εκεί πέρα άρα ολοκληρώσαμε έτσι και το δεύτερο ερώτημα. Ωστόσο ελέγξαμε και άλλα σημεία για XSS επιθέσεις αλλά δεν καταφέραμε να βρούμε κάτι. Βέβαια σε αυτό το σημείο είχαμε ήδη εκτελέσει και SQL injection και RFI και XSS οπότε θεωρήσαμε ότι καλό είναι να ελέγξουμε και για CSRF επιθέσεις.
Εφόσων είχαμε ήδη αποκτήσει τον κωδικό του drunkadmin επιλέξαμε να εκτελέσουμε τις CSRF επιθέσεις μας, χωρίς την αποστολή email, με χρήση βοηθητικών αρχείων που είχαμε για testing (τα csrf named αρχεία στον φάκελο puppies).
- Επιτυχημενες προσπάθειες:
http://underscorepapakia.csec.chatzi.org/modules/phpbb/reply.php (Προσθήκη δικού μας κειμένου και XSS attack, το οποίο αντανακλάται στο αναλυτικό προφίλ του χρήστη)
http://underscorepapakia.csec.chatzi.org/modules/work/work.php (Με χρήση της φόρμας grade_comments)
Στο δεύτερο CSRF παρατηρήσαμε ότι θα μπορούσε να τρέξει και sql injection στο input του comment, το οπίο μπορεί να χρησιμοποιηθεί για να πάρουμε το file path των εργασιών και έτσι να επαναληφθεί το πρώτο attack.
(query = ', comments=file_path, grade = '10)
Οι υπόλοιπες δοκιμές έγιναν στις περισσότερες φόρμες του site και είχαν προστατευτεί με CSRF token.
Τέλος προσθέσαμε μια σελίδα που κάνει ολική αλλαγή στη αρχική σελίδα, χρησιμοποιώντας το αρχικό rfi attack και δημιουργώντας ενα δικό μας αρχείο html στο root του site. Όλα τα αρχεία μας βρίσκονται στο φάκελο puppies.