본문 바로가기

새빨간거짓말

[여덟번째 거짓말]CVE-2010-3970 thumbnail image 취약점



2011년 새해가 밝았습니다.. 새해 첫 이슈는 요놈이 차지하는 군요...
해외언론과는 다르게 국내언론이나 사내에서도 크게 이슈화되지 않고 있는 건 좀 아쉽지만.. ^^;;
LNK 취약점이 처음 나왔을 때 다들 시쿤둥 했었는데.. 스턱스넷에서 LNK 취약점이 사용된다는 사실이 알려지면서 엄청 관심의 대상이 되기 시작했죠.. --;;
어쩜 모든 이슈는 악성코드보다 취약점으로부터 시작될지도 모르는데 ....
이게 워낙 복불복이다 보니 상대적으로 악성코드보다는 취약점이 덜 관심의 대상이 되는 것 같아요.. 하하하하
이제 잡담은 이제 그만 하고 본격적으로 취약점에 대해서 살펴볼까요???

취약점을 최초 발표한 Moti & Xu Hao 의 발표문건에는 매우 상세한 취약점 정보가 들어있었지만 실질적으로 POC가 공개되지 않았습니다. 곧이어, metasploit 에 관련 공격코드가 올라오더군요..
최근 metasploit 의 활동이 매우 신속하게 이루어지는 것 같습니다.. ^^;;
하지만 안타깝게도 한글은 지원을 하지 않는다는.. --;;;

처음은 문서에서 알려준 CFX를 이용해서 일반 DOC 문서에서 thumbnail 이미지가 들어간 경우를 찾고, BMP 헤더를 취약점이 발생하는 형태로 바꿔볼려고 시도했는데... 생각보다 너무 귀찮고 해야할일이 많아서 지지~~ 

 * CFX - The Compound File Explorer
   http
://www.coco.co.uk/developers/CFX.html#Download


그래서 metasploit 코드를 변형시켜서 한글버전에서 실행되는 POC(.doc) 파일을 확보할 수 있었습니다.
성공적으로 계산기 프로그램이 잘 실행되네요...

msf > use windows/fileformat/ms11_xxx_createsizeddibsection
<sizeddibsection) > set target Windows XP SP3 Korean
target => Windows XP SP3 Korean
msf exploit(ms11_xxx_createsizeddibsection) > set payload windows/exec
payload => windows/exec
msf exploit(ms11_xxx_createsizeddibsection) > set cmd calc.exe
cmd => calc.exe
msf exploit(ms11_xxx_createsizeddibsection) > exploit
[*] Creating 'msf.doc' file ...
[*] Generated output file C:/framework/msf3/data/exploits/msf.doc


테스트 환경 : Windows XP SP3 Korean + msacm32.drv(SEH overwrite주소로사용) + explore.exe ( DEP Status : ON )




헙.. 좀 위험하겠죠??? ^^;;
그래서 가능한 시나리오 하나 생각해봤어요..

1) 공격자는 취약한 thumbnail 이미지(bmp)을 삽입해서 문서파일(doc)을 하나 만들었어요
2) 연초이니 사용자를 낚을만한 메일 제목이 머가 있을까 고민하다가.... 
   “연말정산 왕창 돌려받는 법” 이라는 걸 생각해냈죠... 제목은 이걸로 하고 좀 전에 만들어두었던 (doc) 파일을 같 이 첨부해서 무작위 메일을 마구마구 발송했어요....
3) 아침에 출근한 봉씨는 "연말정산 왕창 돌려받는 법" 이라는 제목에 혹 했지만 무작정 파일을 읽는 대신 일단 폴더에 저장해 보기로 했어요..
4) 평소 보안에 좀 신경 쓴다고 자부한 봉씨는 받아 놓은 파일을 째려보면서... 열까말까 고민하다 일단 진짜 내용이 먼지 미리보기로 살펴봐야지 하면서 탐색기의 보기옵션을 “미리보기(thumbnail image)”로 바꿔버렸죠...
5) 그 순간, "당신의 컴퓨터를 접수합니다~" 라는 메시지가 떴지요.. ^^;;; 봉씨는 아이코~ 망했구낭~~~ !!!! --;;;
  
공격자가 문서파일에 숨겨놓았던 공격코드가 취약점을 통해서 실행되어 버렸습니다....

이번 취약점은 미리보기 옵션이 관건인데...
그렇다면 미리보기 옵션에 영향을 줄 수 있는 게 머가 있을까 생각해봤죠..

다음과 같이 레지스트리에 다음과 같이 디폴드 설정이 "미리보기"로 되어 있으면... 위험하겠죠???

HLM\Software\Microsoft\Windows\ShellNoRoam\Bags\AllFolders\Shell
Mode : 5
WFlags : 0
vid : {8BEBB290-52D0-11D0-B7F4-00C04FD706EC}

또한, Windows 시스템에 디폴트 설정인 폴더옵션의 “고급설정” 중 “미리 보기 캐시 안 함” 옵션이 체크되어 있지 않은 경우, 사용자가 미리보기 옵션을 설정한 폴더의 정보가 레지스트리에 캐시가 되더군요..
따라서, 한번이라도 미리보기로 본 폴더에 악성파일이 들어간다면 것도 문제가 되겠네요...
불필요한 경우, 해당 옵션을 체크하여 정보가 캐시되지 않도록 해야겠어요... 



그럼 이제부터 취약점 분석 쪽으로 넘어가볼까요????

문서에서 밝히고 있듯이 취약점은 다음과 같은 경우에 발생한다고 하는군요..

BMP 헤더 구조체 : 이 헤더정보는 010 에디터 BMPTemplete 에서 확인가능합니다...

typedef struct { // bmih
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;

취약한 BMP 파일 구조
 + biBitCount = 8
 + biClrUsed = 음수
 + width/height < 96


이번 취약점처럼 explore.exe 와 관련되어 디버깅해야하는 경우는 작업환경이 먹통이되거나 ... 암튼 좀 디버깅과정이 귀찮아질 수 있겠죠???
그래서 이번에는 windbg를 이용해서 원격디버깅을 시도해보도록 해보아요~~.

Server 는 디버깅할  explore.exe 가 있는 시스템이라고 생각하면 되구요..
Client 는 실제 디버깅을 수행할 시스템이라고 생각하시면 됩니다...

간단해요... 양쪽 시스템에 Windbg를 설치하시고~~~ 아래과 같은 명령으로 실행하시면 됩니다...

Server: > cdb -server tcp:port=[사용할포트] -p [explore.exe 프로세스ID]
Client : > windbg -remote tcp:server=[Server 이름 또는 IP주소],port=[서버에오픈된 포트]

실제 디버깅을 하다보니 cdb(windbg cli 버전정도...?) 만으로도 특별한 불편 없이 디버깅이 가능하더라구요.. 
물론, windbg 명령에 좀 숙달되신분... ^^;;; 

[참고] 
http://www.viper.pe.kr/cgi-bin/moin.cgi/%EC%9C%88%EB%8F%84%EC%9A%B0%EC%A6%88%EC%97%90%EC%84%9C_%EB%94%94%EB%B2%84%EA%B9%85%ED%95%98%EA%B8%B0

취약점 발생 시점

biClrUsed 값이 100h보다 작은 경우, biClrUsed 값만큼 스택에 존재하는 버퍼로 데이터를 복사하도록 되어 있으나, 실제 biClrUsed 값이 음수인 경우, 검사를 우회하고 매우 큰 값(80000001h) 만큼 데이터를 복사하게 되어 스택 오버플로우를 발생하게 되네요...

Shimgvw.dll : CreateSizedDIBSECTION 에서
5c28fc27 3bcb cmp ecx,ebx
5c28fc29 7502 jne shimgvw!CreateSizedDIBSECTION+0xcf (5c28fc2d)
5c28fc2b 8bc8 mov ecx,eax 5c28fc2d 81f900010000 cmp ecx, 100h (ecx=80000001)
5c28fc33 0f8fb7000000 jg shimgvw!CreateSizedDIBSECTION+0x192 (5c28fcf0)
5c28fc39 8d7228 lea esi,[edx+28h]
5c28fc3c 8dbdf8fbffff lea edi,[ebp-408h] 5c28fc42 f3a5 rep movs dword ptr es:[edi],dword ptr [esi]

해당 코드의 공격컨셉은 데이터를 왕창 복사해서... 복사하는 과정에 SEH 를 덮어쓰고.... Stack의 끝까지 왕창 복사하면 Exception(Access Violation)이 발생하니깐 그 때 덮어쓴 SEH가 실행되도록 하는 거군요...
 
일단 위의 데이터 복사코드에 BP를 걸고 데이터를 덮기 전후의 모습을 비교해볼까요????

데이터를 복사하기 전 fs:[0]의 값을 통해 SEH 값을 확인해보아요... 왜 이 값을 확인하는 지는 아시죠????
정상적으로 ntdll!_except_handler3를 가리키고 있군요...... 매우 정상적이예요.. ^^;;;;



그럼 이번에는 데이터 복사 코드를 실행한 후 다시 SEH 값을 확인해볼까요??
우리가 SEH 를 덮기 위해 사용하려고 했던 msacm32.drv 상의 주소값이 들어갔군요.. ^^;;;



이제 달려봅시다. SEH 주소에 BP 를 걸고 정말 이 주소가 실행되는지 볼까요???
Exception(Access Violation)이 발생하면서 SEH 주소 72c61676 에서 멈추네요.. ^^;;
이제부터는 우리가 원하는 컨트롤이 가능하겠군요....
Stack 상에 존재하는 쉘코드로 콜흐름을 바꾸기 위해서 복잡한 ROP 코드가 필요합니다....
ROP 코드의 widget 를 쉽게 만드는 방법을 좀 공부하거나 찾아봐야겠어욤.. ㅋㅋㅋㅋ


 

----------------------------
^^
휴~~ 역시 글 하나 쓰는데
시간이 오래걸리네요...
이미 아시는 분들도 있지만
오늘은 원격디버깅에 대해서 언급했습니다.
하나를 더 배웠다고 생각하시는 분들이 있었으면 좋겠습니다.
결과를 완성하지 못하더라도
과정에서 배움을 찾길 바랍니다...
저도 그렇구요... 바바이~~ ^^V
...
----------------------------