EMET 5.0이 얼마 전에 출시 되었습니다.

새로운 기능이 추가되었는데 ASR이라고 하는 기능입니다.

EMET 공식 가이드 문서를 참조하자면,

Attack Surface Reduction (ASR)
The Attack Surface Reduction (ASR) helps reduce the exposure of applications at risk for attacks by blocking the usage of specific modules or plugins within the target application. For example, EMET can be configured to prevent Microsoft Word from loading the Adobe Flash plugin, or, with the support of Security Zones, can be configured to prevent Internet Explorer from loading the Oracle Java plugin on a website in the Internet Zone while continuing to allow Java on Intranet Zone websites. The mechanism simply prevents DLL loading on a per-process base, and it essentially adds the benefit to “killbit” specific modules in specific applications.

쉽게 설명하면 공격을 사전에 방지하기 위해 DLL을 안 올라가게 한다, 그런 내용 같습니다.

 

<iexplore.exe에서 차단하는 DLL - 제품마다 다르게 적용됩니다>

 

자바 취약점의 경우도 우선 애플릿을 호출하기 위해 JRE 모듈을 브라우저에 끌어다 씁니다.

 

위 그림은 자바 애플릿을 호출하기 위한 DLL 목록입니다.

ASR기능을 사용하면,

 

위에서 설정한 jp2iexp.dll 이 로드되지 않습니다. 즉, 애플릿이 동작하지 않게 됩니다. 

악성 페이지에서 효과가 있는 것을 확인 하였습니다.

혹 정상 페이지의 경우 어떻게 되는지 궁금해서 확인을 해보았습니다.

 

http://www.javakode.com/applets/03-color/

오진이 발생하면서 애플릿이 동작하지 않습니다. 위의 사이트에서 정상적으로 애플릿이 동작하는 것을 확인할 수 있습니다.

MS에서 자바 애플릿은 필요가 없다고 생각한 것인지, 아니면 확인하지 못한 오진인지 문득 궁금해집니다.

 

이번에는 zip 파일 퍼징하는 방법을 포스팅 하겠습니다.

아래의 사이트를 토대로 테스트 하였습니다.

http://www.flinkd.org/2011/07/fuzzing-with-peach-part-1/

준비물 :

1. Peach 2.3.9 

작성된 plt이 2.3.9에서만 동작합니다. 이 버전에는 소스만 제공됩니다.

http://sourceforge.net/projects/peachfuzz/files/Peach/2.3.9/

2. Actice Python 2.7

http://www.activestate.com/activepython/downloads

3. 의존성 패키지

아래 파일들을 전부 다운로드합니다.

http://svn.code.sf.net/p/peachfuzz/svn/branches/Peach2.3/dependencies/py2.7-win32/

4. zip plt 파일

zip을 퍼징하기 위한 plt 파일입니다. 주요 경로 및 프로그램을 자신의 환경에 맞게 설정합니다. 

zip.xml

5. 타겟 프로그램

command 명령이 가능한 zip 프로그램을 사용하시면 됩니다.

 


 

Active Python 2.7을 설치 후, 의존성 패키지의 install.bat을 실행하면 패키지들이 한 번에 설치됩니다.

퍼징 전에 유효성 검사를 해보아야 합니다.

peach.bat -t zip.xml

만약 SEED 문제가 발생한다면,

<Strategy class="rand.RandomMutationStrategy" switchCount="1500" maxFieldsToMutate="7"/>

해당 라인을 제거해 주세요. 제거하지 않아도 퍼징은 가능합니다.

Peach Fuzzer는 매우 강력한 퍼징 프레임워크 입니다.

wav/pdf/doc 등 다양한 포맷을 퍼징할 수 있고, WinDbg와 연동하여 상세한 크래쉬 정보를 볼 수 있습니다.

본 포스팅을 따라하면  wav 포맷을 가지고 간단한 퍼징을 실습할 수 있습니다.

우선 .NET Framework 4와 WinDbg, Peach Fuzzer가 필요합니다.

저는 Windows 7 x64에서 테스트했으므로 WinDbg x64를 설치하였습니다. 정상 동작하기 위해선 반드시 64비트엔 64비트 디버거를 설치하여야 합니다.

다운로드 ::

Debugging Tools for Windows (x86) version 6.12.2.633

Debugging Tools for Windows (x64) version 6.12.2.633

http://peachfuzzer.com/ 


퍼징 준비물

1. WAV 플레이어

퍼징 타겟은 Sounder라는 프로그램으로 Command Line에서 재생 가능하고, 심플합니다.

http://www.elifulkerson.com/projects/commandline-wav-player.php

 

2. WAV 파일

퍼징을 위한 wav 샘플 파일입니다. 다운로드 한 뒤 Sounder.exe와 같은 디렉토리에 넣어주세요.

 sample.zip

 

3. PIT 파일

퍼징을 하기 위한 Peach XML 파일입니다. 뮤테이션 할 오프셋을 설정할 수 있습니다. 다운로드 한 뒤 peach 설치 디렉토리에 넣어주세요.

1.xml

본 파일을 다운로드 한 뒤 약간의 수정이 필요합니다.

<Data fileName="d:\\sample_fuzzer\\sample.wav"/>

<Param name="CommandLine" value="D:\\sample_fuzzer\\sounder.exe fuzzed.wav" />

<Param name="Executable" value="D:\\sample_fuzzer\\sounder.exe"/>

<Param name="WinDbgPath" value="C:\\Program Files\\Debugging Tools for Windows (x64)" />

빨간 부분을 자신의 경로에 맞게 수정합니다. WinDbgPath는 두 군데 수정하여야 합니다. 


이제 퍼징을 할 차례입니다.

cmd.exe를 관리자 권한으로 실행합니다.

d:\peach> peach 1.xml

이렇게 한 줄 입력하면 퍼징이 시작됩니다.

 

각종 로그는 logs 디렉토리에서 확인하면 됩니다.

자세한 튜토리얼은 http://old.peachfuzzer.com/v3/TutorialFileFuzzing.html 에서 확인하실 수 있습니다.

 

 

 

 

MiniFuzz는 마이크로소프트에서 제작된 파일 퍼징 툴입니다.

매우 단순한 툴이므로, ZIP/HWP/PDF 와 같이 정형화 된 파일 포맷을 가진 경우는 이 툴을 사용하여 만족할 만한 결과를 얻어낼 수 없습니다.

가장 심플한 버퍼 오버플로우 유발 예제를 가지고 퍼징 테스트를 해보겠습니다.

 target_fuzzer.exe

return 시 address를 덮어 씌우는 전형적인 BoF 예제입니다.

 

사용방법은 매우 간단합니다.

Browse로 타겟을 선택하고, Start Fuzzing 을 누르면 끝입니다.

퍼징 중 Access Violation을 잡아내면 로그가 남게 됩니다.

 

보다 자세한 사항은 로그파일에 남게 되는데, 그림의 logs 디렉토리에 로그가 남습니다.

 

<클릭하면 확대됩니다>

크래쉬 당시의 다양한 정보가 로그에 남게됩니다. 어느 파일을 가지고 퍼징을 했는지도 기록되는데요, 해당 샘플은 crashes 디렉토리에 있습니다.

 

 

 

 

windows 용으로 포팅한 zlib입니다. 

zlib-x86..zip

visual studio 2010 에서 테스트 하였습니다.

zconf.h 와 zlib.h 을 프로젝트에 추가한 후,

소스에 zlib.h을 include합니다.

라이브러리를 추가 종속성에 추가해 주세요.

 

빌드 시 아래와 같이 에러가 나는 경우, 특정 기본 라이브러리 무시에서 libcmt.lib을 입력해 주세요.

 

 

본 포스팅은 기존 제작된 익스플로잇을 무작정 따라하는 내용을 담고 있습니다.

(천만 스크립트 키드 양성을 위한 그날까지..!) 

 


 

유형 : Stack Buffer Overflow

타겟 프로그램 : BlazeDVD Pro Player 6.1

테스트 환경 : Windows XP SP3 Eng

링크 : http://www.exploit-db.com/exploits/32737/ (제작자 : Deepak Rathore)

설명 : Playlist를 열때 Stack Buffer Overflow를 일으킵니다.


[재현]

  

[그림1 - 프로그램 실행 화면]

 

링크에서 타겟 프로그램과 Exploit을 다운로드 합니다.

Perl 설치가 귀찮으신 분은blazeExpl.plf<-- 이것을 다운로드 해 주세요.

 

[그림2 - Playlist Exploit 파일]

해당 파일을 Hex Editor로 열면 위의 그림과 같이 나옵니다.

위의 박스친 부분의 주소를 사용자PC에 맞게 고쳐줘야 하는데, ASLR이 적용되지 않은 모듈에서 jmp esp를 찾으면 됩니다.

 

[그림3 - JMP ESP 찾기]

저는 0x7C86467B에 있는 jmp esp를 사용했습니다.

 

[그림4 - Exploit 성공]

Playlist 를 열어서 그림4와 같이 나오면 성공입니다.

[분석] 

[그림5 - 버퍼를 스택에 복사]

Playlist를 로드하면 위의 코드에서 스택에 Playlist의 버퍼를 복사합니다. 

(스샷을 연속적으로 찍지 않아서 스택의 주소가 그림마다 다릅니다. 양해를..)

[그림6 - 스택 비교]

위의 그림은 스택 버퍼가 쓰여지기 전과 후의 모습입니다.

 [그림7 - RETN]

계속해서 Step over를 하면 최종적으로 그림7과 같은 코드를 만나게 되어 리턴합니다.

 

[그림 8 - RETN 시 스택]

RETN 직전 스택을 보면 ESP가 0x7C86467B를 가리키고 있는데 해당 주소는 JMP ESP 를 담고 있습니다.

말 그대로 ESP로 점프하라는 것이며, 한번 더 Step over 하면 스택에 0x10이 더해진 0x12F0D0으로 이동합니다.

 

[그림 9 - 쉘코드]

NOP후 쉘코드가 실행됩니다.

테스트 환경 : Windows XP SP3 Eng / Python 2.7.1

관련 링크 : http://www.exploit-db.com/exploits/32585/

취약점 유발 파일 :victim.m3u

 

해당 취약점은 Read Only 영역에 Writing을 시도할 때 발생합니다. (즉, stack limit를 뚫고 입력하는 상황)

PoC를 실행시키면 victim.m3u가 생성되는데, 이것을 AudioCoder에 넣고 돌리면 계산기가 실행됩니다.

정크 코드 'A'에 걸려서 메모리가 뻑난(?) 모습입니다. 해당 영역은 Read Only 입니다.

 

SEH 를 확인해보니 Overwrite 되었습니다. 바로 쉘코드로 점프합니다.

 

 

Internet Explorer 전용 DLL 인젝터입니다.

Internet Explorer 7.0 이상의 경우 iexplore.exe가 iexplore.exe를 실행하는 구조로 되어있는데

부모 프로세스가 iexplore.exe인 경우에만 인젝션을 합니다.

사용 방법 : 폴더를 하나 생성한 뒤 Injector.exe와 인젝션 할 DLL 한 개를 같이 넣습니다.

그럼 인젝터가 자동으로 dll을 인식합니다.

 

 Injector.zip

 

버그는 댓글로 남겨주세요.

 

작업 히스토리

Version 1.0 [2014/04/17]

Internet Explorer 7.0 이상 지원

32비트 iexplore.exe 지원 (64비트 동작 안함)

 

 

 VC++에서는 문자열을 다룰 때 char나 wchar_t 로 선언합니다.

그러나 드라이버 개발을 하다보면 STRING이나 UNICODE_STRING 로 선언된 것을 많이 볼 수 있는데요.

특이하게도 문자열을 구조체로 표현합니다.

각각 길이, 최대 길이(NULL을 포함하는), 문자열 포인터를 표현합니다.

DbgPrint에서 구조체를 직접 출력할 수 있는 특이점이 있습니다. 아래 %wZ 출력을 확인해 주세요.

문자열의 초기화는 RtlInitUnicodeString()를 사용하며, 아래와 같이 PSEUDO 코드를 작성할 수 있습니다.

UnicodeString->Buffer = 초기화 문자열;

UnicodeString->Length = wcslen(초기화 문자열) ;
UnicodeString->MaximumLength = UnicodeString->Length + sizeof(UNICODE_NULL) ;

아래 코드는 동적으로 할당 및 해제 하는 방법입니다. Buffer만 동적으로 할당하니 결국 malloc()과 같다고 볼 수 있습니다.

이번에는 메모리 동적 할당에 대해 알아보겠습니다.

Ring3에서는 동적으로 메모리를 할당할 때 malloc이나 HeapAlloc 같은 함수를 사용해보셨을겁니다.

그러나 드라이버에서는 이 함수를 사용할 수 없습니다.

그럼 어떻게 동적 메모리를 생성할 수 있을까요?

커널엔 메모리 풀이라는 것이 있는데 이것이 커널모드 힙입니다.

커널에서 힙을 할당하기 위해선 ExAllocatePool 이라는 함수를 사용합니다.

주목해볼만한건 인자로 NonPagedPool을 주었는데요. 인자 값으로 아래 두가지가 있습니다.

NonPagedPool : 항상 메모리에 존재

PagedPool : 페이지 아웃 혹은 인이 될 수 있음

페이지 아웃이 되면 공포의 BSoD가 뜨겠죠? 그것을 방지하기 위해서 NonPagedPool을 인자로 주어야 합니다.

 

잘 뜹니다~

주의하실 점은 동적 메모리를 반드시 해제해 주어야 합니다. 안그러면 커널 메모리에서 둥둥 떠다닙니다~

+ Recent posts