메모리 보호기법 우회 연구분석보고서 -2-


By. eloi@a3sc.co.kr
(A.K.A eloi)

jtsong@a3sc.co.kr
(A.K.A trynerr)


본 문서는 Stack Overflow 보호기법과 이를 우회하는 방법에 대하여 작성하였습니다. 해당 내용과 테스트 결과가 많은 관계로아래와 같은 주제로 3회에 걸쳐 연재하도록 하겠습니다.
 

1. 'Windows/Linux 환경에서의 Stack Overflow 보호기법'
2. 'ROP(Return Oriented Programming) Exploit'
3. 'SEH(Structed Exception Handling) Overwrite' 




ROP(Return Oriented Programming) Exploit

1. ROP(Return Oriented Programming)
ROP(Return Oriented Programming)는 취약한 프로그램 내부에 있는 기계어 코드 섹션들(Gadget)을 이용하여 BOF공격 시 특정 명령을 실행시키는 방법을 말합니다. 보통 Gadget은 함수 끝에 기술되어있는 ret 명령어를 포함, 상위 몇가지 명령어들의 집합이며 이를 이용하여 단한번의 실패없이 한번에 공격을 성공할 수 있습니다

                                                          [그림 1] Gadget #1

                                                          [그림 2] Gadget #2

이러한 ROP는 ASLR, DEP/NX, ASCII-Armor 메모리 보호기법들을 우회할 수 있기 때문에 Fedora core 13(kernel 2.6.33.3-85)에서 BOF공격이 가능합니다.

ROP는 RTL, Chaining RTL calls, GOT overwrite의 3가지 특징적인 기술을 사용합니다.

(1) RTL(Return to libc)
스택에 있는 리턴 주소를 특정 라이브러리 주소와 이에 알맞은 인자 구성을 하여 공격하는 방법을 Return-to-libc 공격이라고도 부릅니다. 특정 프로그램(/bin/sh)을 실행 하기 위하여 system(), exec*() 등과 같은 함수를 사용하여 관리자 권한의 쉘을 획득합니다.

다음은 RTL 공격 전후의 스택구조를 나타낸 그림입니다.

                                                          [그림 3] RTL 개념도

DEP/NX의 보호기법으로 인해 스택영역에 코드를 삽입하여 공격하는 고전적인 쉘코드 삽입방법은 무용지물이 되었습니다. 하지만 이러한 RTL 공격기법을 이용하여 코드 삽입 방법이 아닌 함수를 직접 호출하는 RTL 방법으로 우회할 수 있습니다.
이러한 방법은 DEP/NX + ASLR 보호 기법이 적용되면서 공격이 어렵게 됩니다. 라이브러리 로딩 순서가 바뀌거나, 부팅할 때마다 이미지 적재 위치가 바뀌게 되면 임의의 리턴 주소를 찍어 맞춰야 하기 때문에 사실상 공격이 어려워집니다.

(2) Chaining RTL calls
Chaining RTL calls 기법은 RTL 공격을 연속적으로 일어나게 스택을 구성하여 공격하는 방법을 말합니다. pop-pop-ret 과 같은 명령어를 이용하여 스택의 인자 참조 영역을 지나치고 다음 함수주소로 이동, 연속적으로 함수를 호출할 수 있습니다.

다음은 Chaining RTL calls의 구성을 나타낸 화면입니다. 아래와 같이 스택이 구성된다면 연속적인 함수 호출이 가능합니다.

                                                          [그림 4] Chaining RTL calls 개념도

(3) GOT(Global Offset Table) Overwrite
GOT Overwrite는 libc.so 내에 실제 함수 주소를 저장해 놓은 공간인 GOT에 특정 함수의 GOT 값을 변경하여 원하는 함수가 실행되게 하는 방법입니다. 예를 들어 printf 함수의 GOT값(실제 함수 주소)을 execve 함수의 주소로 변경하게 된다면 printf 함수가 수행될 때 printf가 호출되는 것이 아닌 execve함수가 호출되게 되는 것을 말합니다.

다음은 PLT에서 GOT의 흐름과 실제 함수 주소를 확인하는 화면입니다.

                                                          [그림 5] PLT, GOT 흐름도

2. ROP 시나리오
ROP 시나리오는 Stage-1과 Stage-0으로 구분됩니다. Stage-1에서는 ROP 공격을 위한 Payload가 구성되며 Stage-0에서는 Stage-1에서 구성된 Payload를 특정 스택 영역에 복사하기 위한 strcpy 함수의 Chaining RTL calls가 구성됩니다.

(1) Stage-1
Stage-1은 GOT Overwrite로 실행 함수(exec* 계열)나 getreuid함수를 호출하게 합니다. 하지만 ASLR 보호기법으로 인해 직접적인 함수 주소를 overwrite를 할 수 없기 때문에 add operation gadget을 이용하여 함수간 offset을 add operation으로 계산하여 원하는 함수가 호출되게 합니다.

다음은 execve 함수와 printf 함수의 주소 그리고 이들간에 offset값을 나타낸 화면입니다.

                                                          [그림 6] execve, printf 함수 주소

offset = execve() - printf()
execve() = printf() + offset
execve() = 0x94ee40
printf() = 0x8fad30
offset = 0x54110


다음은 Stage-1애서 GOT Overwrite를 하기위한 스택구조를 나타낸 화면입니다.

                                                          [그림 7] GOT Overwrite가 일어나는 스택구조

ecx 레지스터에 해당 offset 값을 넣어두고 add operation gadget의 명령에 맞춰 5b042464를 빼준 값을 ebp에 넣어둡니다. 해당 명령이 실행될 때에 ebp와 5b042464값이 더해지게 되어 printf함수의 주소로 바뀌게 되고 이를 ecx(offset)와 더하면서 printf 함수의 GOT 값이 execve 함수의 주소로 바뀌게 됩니다. 마지막으로 printf의 PLT값이 호출되면서 execve함수가 수행되는 방식으로 진행됩니다.

(2) Stage-0
Stage-1에서는 Stage-0에서 구성된 Payload를 실행은 되지 않지만 메모리 주소가 변하지 않는 특정 custom stack영역에 복사를 수행합니다. 여기서는 앞서 설명한 Chaining RTL calls를 이용하여 반복적으로 strcpy 함수를 호출하게 되는데 이는 부분 부분 흩어져 있는 특정 문자열들을 모아서 Stage-0 Payload에 맞게 구성해야 하기 때문입니다. 이와 같은 작업을 하는 이유는 Stage-1에서 존재하는 NULL byte(0x00) 이후의 값을 strcpy 함수로 복사할 수 없기 때문이며, 원하는 기능을 수행하기 위해서 ebp의 값을 원하는 위치에 놓이게 하기 위해서 입니다.

3. ROP Exploitation
ROP Exploit은 Fedora Core 13에서 수행하였습니다. 일반적인 BOF는 수동으로 공격을 수행하기도 하지만 ROP Exploit을 수동으로 구성하는 것은 효율적이지 않습니다. 다양한 gadget들을 모아야하며 Stage-1을 구성하기 위해 사용되는 수많은 코드들 또한 모아야 하기 때문에 오랜시간이 소비됩니다. 이 때문에 ROP는 자동화된 공격도구를 사용하게 됩니다. 앞으로의 예제는 공격코드가 구성되는 gadget과 Stage-1과 Stage-0를 쉽게 구성하기 위해 BlackHat 2010에서 소개되었던 ROPEME(ROP Exploit Made Easy)를 이용하였습니다.

다음은 BOF 취약점이 존재하는 프로그램 소스코드 입니다. strcpy함수로 인해 BOF가 일어나게 됩니다.

                                                          [그림 8] BOF 취약점이 존재하는 프로그램

다음은 ROPEME에서 제공하는 ropshell을 이용하여 해당 gadget들을 찾는 화면입니다.

                                                          [그림 9] ropshell을 이용한 gadget 검색

다음은 Stage-1이 놓이게될 custom stack 영역을 찾는 화면입니다. 주소값이 변하지 않는 .bss 영역을 지정하게 됩니다. 정확한 위치는 사용하고 있는 8byte를 지난 bss+8 영역이 됩니다.

                                                          [그림 10] custom stack이 놓이게 될 위치

gadget들과 custom stack의 위치를 찾게되면 이를 이용하여 exploit합니다. 다음은 exploit 코드 화면입니다.

                                                          [그림 11] exploit #1
                                                          [그림 12] exploit #2

exploit은 지정된 gadget들을 참조하여 stage-1과 stage-0를 구성합니다. ret의 주소를 70번 삽입하고 그 이후 stage-0를 구성하는 형태로 공격이 진행됩니다.

다음은 이를 이용하여 관리자 권한을 획득하는 화면입니다.

                                                          [그림 13] exploit #3

exploit에서 구성된 공격코드를 추출하여 분석결과 ret 이후 strcpy 함수의 Chaining RTL calls로 구성합니다. 또한 stage-0을 구성할 시에 쓰이는 문자열들은 취약한 프로그램 코드를 검색하여 수집합니다.

다음은 exploit상에서 출력되는 Stage-1과 Stage-0의 구성화면입니다.

                                                          [그림 14] Stage-1 Payload
                                                          [그림 15] Stage-0 Payload

다음은 공격코드를 추출하여 Stage-0의 strcpy의 호출과 복사 위치를 확인하는 화면입니다.

                                                          [그림 16] Stage-0의 strcpy 복사 위치 확인 #1

위와 같이 Stage-1을 구성하기위해 custom stack위치에 특정 문자열을 반복적으로 복사하는 것을 확인 할 수 있습니다.

다음은 이해를 쉽게하기 위해 실제 디비거 상에서 source위치를 확인하는 화면입니다.

                                                          [그림 17] Stage-0의 strcpy 복사 위치 확인 #2

다음은 Stage-1의 Payload 입니다. 복사되는 문자열이 Stage-1의 값이라는 것을 확인할 수 있습니다.

                                                          [그림 18] Stage-0의 strcpy 복사 위치 확인 #3

Stage-1이 일어나는 액션은 다음과 같습니다. 취약한 프로그램의 getuid함수의 GOT를 Overwrite하여 setreuid() 함수로 root권한을 상속받고 setreuid() GOT를 다시 execvp함수로 Overwrite하여 shell을 실행하는 순서로 진행합니다.

                                                          [그림 19] Stage-1의 액션 확인

위에서 설명했던 액션을 대략적으로 스택에 반영하여 확인하면 다음과 같습니다.

                                                          [그림 20] Stage-1 스택 구성도

다음은 추출한 공격코드들을 수동으로 수행하는 화면입니다.

                                                          [그림 21] 추출한 Payload로 수동공격

다음은 trace 명령으로 해당 공격코드를 삽입하여 strcpy함수를 연속적으로 호출하고 있는것을 확인하는 화면입니다. 정상함수 수행 후 BOF되어 strcpy함수를 연속적으로 호출하는 것을 확인할 수 있습니다.

                                                          [그림 22] trace 명령으로 함수 호출 확인#1

                                                          [그림 23] trace 명령으로 함수 호출 확인#2




참고 URL

1.   http://msdn.microsoft.com

2.   http://x82.inetcop.org/

3.   http://nchovy.kr/forum/5/article/377

4.   http://en.wikipedia.org/wiki/Buffer_overflow_protection

5.   http://ko.wikipedia.org/wiki/버퍼 오버플로우

6.   http://lucid7.egloos.com/

7.   http://uptx.egloos.com/

 

 

참고 문헌

1.   poc09-sotirov.pdf(POC 2009 발표자료)

2.   BHUS10_Paper_Payload_already_inside_data_reuse_for_ROP_expl.pdf

(BlackHat 2010 USA 발표자료)

3.   Linux Memory Protectiion Mechanism

4.   bh08sotirovdowd.pdf(BlackHat 2008 발표자료)

5.   BOF_공격방지_매커니즘_구현의_최신_동향.pdf

6.   http://www.shell-storm.org/papers/files/732.pdf

7.   www.phreedom.org/presentations/reverse.../reverse-engineering-ani.pdf

8.   CanSecWest2010 – SEH Overwrite, Shuichiro Suzuki

9.   Windows 구조와 원리 (OS를 관통하는 프로그래밍 원리) - 정덕영



 

메모리 보호기법 우회 연구분석보고서 -1-


By. eloi@a3sc.co.kr
(A.K.A eloi)

jtsong@a3sc.co.kr
(A.K.A trynerr)


본 문서는 Stack Overflow 보호기법과 이를 우회하는 방법에 대하여 작성하였습니다. 해당 내용과 테스트 결과가 많은 관계로아래와 같은 주제로 3회에 걸쳐 연재하도록 하겠습니다.
 

1. 'Windows/Linux 환경에서의 Stack Overflow 보호기법'
2. 'ROP(Return Oriented Programming) Exploit'
3. 'SEH(Structed Exception Handling) Overwrite' 



Window
환경에서의 메모리 보호기법

1.  Window 버전별 메모리 보호기법

Window 버젼에서 실행되고 있는 메모리 보호기법입니다. 새로운 운영체제가 출시 때마다 발전된 메모리 보호기법을 확인할 있습니다.

 

XP

sp2, sp3

2003

sp1, sp2

Vista

sp0

Vista

sp1

2008

sp0

GS

Stack Cookies

Yes

Yes

yes

yes

Yes

Variable reordering

Yes

Yes

yes

yes

yes

#pragma strict_gs_check

No

No

no

yes

yes

SafeSEH

SEH handler

validation

Yes

Yes

yes

yes

yes

SEH chain

validation

No

No

no

yes

yes

Heap protection

Safe unlinking

Yes

Yes

yes

yes

yes

Safe lookaside lists

No

No

yes

yes

yes

Heap metadata

cookies

Yes

Yes

yes

yes

yes

Heap metadata

encryption

No

No

yes

yes

yes

DEP

NX support

Yes

Yes

yes

yes

yes

Permanent DEP

No

No

no

yes

yes

OptOut mode

by default

No

Yes

no

no

yes

ASLR

PEB, TEB

Yes

Yes

yes

yes

yes

Heap

No

No

yes

yes

yes

Stack

No

No

yes

yes

yes

images

No

No

yes

yes

yes

 


2.
메모리 보호기법 설명

(1) GS

GS Window 상에서 스택을 보호하는 기법으로, Visual Studio 2003버젼 이상에서 컴파일시 기본적으로 추가 되는 옵션입니다.

다음
화면은 Visual Studio 2010 상에서 확인한 GS 옵션입니다.

[그림 1] GS 옵션 설정

 ●  Stack Cookies

GS 옵션을 적용하게 되면 코드에 스택 체크 루틴이 추가됩니다. 컴파일러는 로컬 문자열 버퍼가 있는 함수의 BOF공격을 방지하기 위하여 검사를 합니다.

 

다음 화면은 BOF 공격이 발생하여 GS cookie 공격을 탐지하는 화면입니다.

[그림 2] BOF 탐지

 

GS옵션은 함수상에 로컬 문자열 버퍼가 있는경우 컴파일러는 쿠키(ret 변조를 막기위한 메모리공간) 추가하여 Buffer Ret 사이에 위치시켜 함수의 return 주소를 보호합니다.

[그림 3] stack cookie 구조

 

예를 들어 아래와 같은 코드가 있습니다. 먼저 왼쪽은 GS옵션을 사용하지 않은 경우 BOF 발생 가능한 소스코드입니다. 하지만 GS옵션을 사용할 경우 컴파일러가 자동으로 쿠키에 대한 코드를 추가로 넣습니다. 이로 인하여 RET 주소의 변조를 확인 가능합니다. 만약에 오버플로우가 일어나면 RET 앞에 위치한 cookie 값을 변조하게 됩니다.

이때 .data 영역에 저장된 cookie RET 앞에 위치한 cookie 비교하게 됩니다.  이때 쿠키가 변조된 것으로 판명되면 Abort()해서 스택오버플로를 방지하게 됩니다.

[GS 옵션 미적용]

void a3sc(char *input)

{

char buffer[256];

strcpy(buffer, input);

}

[GS 옵션 적용]

static_cookie = rand();

 

void a3sc(char *input)

{

int cookie = random_cookie;

 

char buffer[256];

strcpy(buffer, input);

 

if (cookie != random_cookie)

    abort();

}

 

(2) SafeSEH

SEH(Structured Exception Handling) Window 상에서 예외처리를 하는 기법입니다. DLL 상에 있는 SafeSEH 에서 존재하며 H/W, S/W 상에서의 예외처리가 가능합니다. 그리고 BOF 또는 메모리에 대한 손상이 발생이나 시스템이 예기치 않게 종료되는 이벤트 발생시, 프로그램에 대한 예외처리를 해주는 역할을 담당합니다.

 

SafeSEH 에러처리 레코드를 덮어쓰는 공격을 막기위한 기법입니다. SafeSEH 옵션을 지정후, 컴파일하게되면, 링커에서 안전한 예외 처리 목록을 생성하며, 이것은 헤더에 예외처리 목록에 포함됩니다. 만약 공격자가 예외처리 레코드를 덮어쓰게 되면 프로그램은 예외를 탐지하여 프로그램을 종료하게 됩니다.

 

다음 화면은 Visual Studio 2010상에서 SafeSEH 옵션을 설정하는 화면입니다.

[그림 4] SafeSEH 옵션

 

(3)  ASLR(Address Space Layout Randomization)

ASLR 프로세스내에서 매핑되는 오브젝트에 대하여 호출 실행시 실행하는 주소를 랜덤화하는 기법입니다. ASLR 매핑된 파일들을 , 스택, PEB, TEB 위치상에서   랜덤화를 적용합니다. 공격자는 BOF 공격을 시도하더라도, 오브젝트에 대한 정확한 주소를 알지 못하므로 BOF 공격을 실패하게 됩니다.

 

다음 화면은 링커의 속성에서 ASLR 옵션을 설정하는 화면입니다.

[그림 5] ASLR 옵션

 

다음은 간단한 소스를 통하여 ASLR 기능을 확인해보았습니다.

#include <stdio.h>

 

void main()

{

    char buffer[256];

    printf("buffer address: %p\n", buffer);

}

 


다음
화면은 ASLR 옵션을 적용하지 않았을 때의 프로그램 실행화면입니다. 프로그램을 실행할 때마다 Buffer 주소가 같음을 있습니다.

[그림 6] ASLR 옵션 미적용

 

다음 화면은 ASLR 옵션을 적용하여 프로그램을 실행한 화면입니다. 위의 화면과는 다르게 프로그램을 실행할 때마다, 주소값이 달라짐을 확인 가능합니다.

[그림 7] ASLR 옵션 적용

 

(4) DEP(Data Excution Prevention)

DEP 가상 메모리의 최소 단위인 페이지에 기존에 읽고 쓰는 권한 외에 실행 권한에 대해서 체크하도록하여 메모리 공격으로부터 시스템을 보호하는 방법입니다.

기본적으로 DEP 공격자가 stack, heap, data section에서 shellcode 실행하는 것을 금지합니다. 예를들어 DEP 기능이 활성화 되어 있을 , 악의적인 코드가 실행하는 시점에서 해당 영역에서 실행권한이 없으므로 예외가 발생하여 공격을 막을 있습니다.

 

다음 화면은 Window7에서 DEP 옵션을 설정하는 화면입니다.

[그림 8] DEP 옵션



Linux 환경에서의 메모리 보호기법

1. Linux 버전별 메모리 보호기법

 

ASLR

N/X(DEP)

ASCII

Armor

main()

canary

S

H

L

S

H

L

 

 

Red Hat

Linux9.0

O

X

X

X

X

X

X

X

Fedora

8 ~ 10

O

O

X

O

O

X

O

O

Fedora

11

O

O

X

O

O

O

O

X

Fedora

12

O

O

O

O

O

O

O

X

Cent OS

4.4

O

O

X

O

O

X

O

X

Cent OS

 4.5~4.8

O

O

O

O

O

X

O

X

Cent OS

5.0~5.4

O

O

O

O

O

X

O

O

Ubuntu

6.10~ 8.04.1

O

X

O

X

X

X

X

O

Ubuntu

8.10~ 9.0.4

O

O

O

X

X

X

X

O

Ubuntu

9.10

O

O

O

O

O

X

O

X

openSUSE 11.2

O

X

O

X

X

X

X

X

Gentoo 2006.0

O

X

O

X

X

X

X

X

Gentoo 2007.0

O

X

O

X

X

X

X

O

             (S : Stack, H : Heap, L : Library)

 


2.
메모리
보호 기법

(1) ASLR(Address Space Layout Randomization)

메모리상의 공격을 방어하기 위해 주소 공간배치를 난수화 시키는 기법입니다. , 스택, , 라이브러리 등의 데이터 영역 주소등을 난수화 시킨 주소로 프로세스의 주소 공간에 배치하는것입니다. Window 에서 적용되는것과 유사한 기법이며 리눅스 커널 2.6.12이후로 적용되어있습니다

 

다음은 Fedora 13에서 현재 프로세서상에서 메모리구조를 확인하는 화면입니다.

ASLR 적용으로 인하여 메모리상에 존재하는 주소가 지속적으로 변함을 있습니다.

[그림 9] ASLR

 

(2) DEP / NX(Not Excutable)

메모리상의 보호를 위해 stack heap에서 코드가 실행되는 것을 막는 기법입니다.

공격자가 BOF 공격을 일으키면 DEP 적용된 상태에서는 실행권한이 없으므로 프로그램에 대한 예외처리후, 종료가 됩니다.

 

다음은 Fedora 13에서 현재 프로세서상에서 메모리구조를 확인하는 화면입니다.

DEP 적용으로 인하여 stack, heap, libc 영역에 실행권한이 존재하지 않음을 확인 가능합니다.

[그림 10] DEP

 

(3) ASCII-Armor

Libc 영역을 보호하기 위한 기법으로 상위주소를 \x00으로 시작하게 만드는 기법으로 공격자는 라이브러리를 호출하는 BOF 공격시, NULL 바이트가 삽입된 주소로 접근 없게됩니다.

[그림 11] ASCII-Armor

 

(4) Canary

canary Window 에서의 메모리 보호 기법인 stack cookie 같은 개념으로 Buffer RET 사이에서 스택의 BOF 모니터링하는 역할을 담당합니다. BOF 발생하면 canary 데이터의 변조로 인하여 오버플로우에 대한 경고하고 프로그램을 종료시킵니다.

 

 l  Terminator canaries

문자열 끝문자를 이용하여 canary 구성하는 방법으로 canary 값으로 NULL, CR, LF, Oxff 값의 조합이 사용됩니다. 공격자는 공격시, 종료문자로 구성된 canary 값에 접근을 없게됩니다.


l  Random canary

프로그램을 실행할 때마다 임의의 canary 값을 삽입을 합니다. 이에 따라 공격자는

Canary 값을 예측불가능하므로 공격에 어려움이 발생합니다.


l  Null canary(0x00000000)

메모리상의 공격을 막기위해 canary 값을 NULL 구성합니다. 공격자는 공격코드상에 NULL 값을 삽입할 없으므고 canary 값에 접근이 불가능합니다.


 

다음 화면은 canary 적용되지 않은 프로그램을 분석한 화면입니다.

[그림 12] Canary 미적용

 

다음 화면은 canary 적용된 프로그램을 분석한 화면입니다.  GDB 분석결과 메모리상에서 canary 대한 영역이 설정된 , buffer 구조가 설정되는 것을 확인 있습니다.

[그림 13] Canary 적용

 


참고 URL

1.   http://msdn.microsoft.com

2.   http://x82.inetcop.org/

3.   http://nchovy.kr/forum/5/article/377

4.   http://en.wikipedia.org/wiki/Buffer_overflow_protection

5.   http://ko.wikipedia.org/wiki/버퍼 오버플로우

6.   http://lucid7.egloos.com/

7.   http://uptx.egloos.com/

 

 

참고 문헌

1.   poc09-sotirov.pdf(POC 2009 발표자료)

2.   BHUS10_Paper_Payload_already_inside_data_reuse_for_ROP_expl.pdf

(BlackHat 2010 USA 발표자료)

3.   Linux Memory Protectiion Mechanism

4.   bh08sotirovdowd.pdf(BlackHat 2008 발표자료)

5.   BOF_공격방지_매커니즘_구현의_최신_동향.pdf

6.   http://www.shell-storm.org/papers/files/732.pdf

7.   www.phreedom.org/presentations/reverse.../reverse-engineering-ani.pdf

8.   CanSecWest2010 – SEH Overwrite, Shuichiro Suzuki

9.   Windows 구조와 원리 (OS를 관통하는 프로그래밍 원리) - 정덕영


OWASP TOP 10에 대해서 WebGot 등을 이용하여 테스트 환경에서 보여주고 있는 동영상들입니다.

 

URL을 통해 들어가면 더 많은 동영상을 볼 수 있습니다.

 

URL : http://www.youtube.com/view_play_list?p=04732F5EE5F80FD4

 

2011년 전후로 해서 최근 잼난 동영상들 링크입니다. 학습하는데 도움 되시기 바랍니다.

http://securitytube.net/Malware-Unpacking-in-OllyDbg-video.aspx
(Malware-Unpacking-in-OllyDbg-video)
http://vimeo.com/18645356 (XSSF - Stealing ANDROID SD Card files)
http://www.youtube.com/watch?v=q31Q-nEUqok (Thumbnail Vuln Demo by 6l4ck3y3)
http://www.blip.tv/file/4640708 (PDF Advanced Forensics Analysis)
http://vimeo.com/18821178 (Reverse Engg. Demonstration)
http://vimeo.com/6089466  (The art of Exploitation )
http://vimeo.com/6431352 (exploits internal working )
http://vimeo.com/6460509 (Antivirus Bypassing )
http://vimeo.com/6473218 (bypassing Av using metasploit )
http://vimeo.com/6757328 (Social Engg. Attacks)
http://vimeo.com/6987936 (Multilevel Attack with java applet)
http://vimeo.com/7613487 (Metasploit and Antivirus )
http://vimeo.com/8561768 (Remote buffer overflow tutorial)
http://vimeo.com/14139105 (Injecting code into a process plus bypass AV)
http://vimeo.com/14404326 (DLL Hijacking Exploits )

Taint Analysis 연구분석보고서

그외 2011. 1. 17. 17:08 Posted by 알 수 없는 사용자

Taint Analysis 연구분석보고서

By. bdr@a3sc.co.kr
(A.K.A Dear.Tom)
kerz@a3sc.co.kr
(A.K.A k3rz)


I. Introduction

1. Motivation
Application이 입력 받는 외부 데이터(인자)는 어느 정도까지 “영향”을 줄 수 있는가? 라는 의문은 Information(Data) Flow, Taint Analysis 분야를 발전할 수 있게 한 동기부여가 되었습니다. 즉 외부 데이터로부터 영향을 받는 부분을 찾기 위한 방법의 발전이라고 할 수 있습니다.
“영향”을 줄 수 있는 것들에는 MP3, PDF, 네트워크 패킷 등과 같이 어플리케이션의 외부 데이터를 말할 수도 있으며, 시스템 커널에 영향을 주는 정보(Understanding Data)를 의미할 수도 있습니다.

2. 용어 정의
가. Information Flow
디버거로 어플리케이션의 내부를 보면, 실행되는 동안 Information은 복사되고, 수정되고 있습니다. 즉 Information 은 항상 움직이는 것이라고 정의할 수 있습니다.

Taint analysis는 Information Flow 분석의 한 형태라고 볼 수 있습니다.
 
상세한 정보는 “Certification of Programs for Secure Information Flow”[2]를 참고하시기 바랍니다.

나. Flow
연산이 사용되는 객체의 X와 이로부터 파생된 객체의 Y가 있을 때, “X에서 Y로 흐른다(flow)”라고 말합니다.

다음은 Flow 개념을 설명한 도식화 화면입니다.
 


[그림 1] Flow 도식도


다. Taint Analysis
Taint Analysis는 외부 입력 영향으로부터 흐름을 파악 하는 것을 말합니다. 즉 다음과 같이 정의 할 수 있습니다.

● 모든 외부 입력을 비 신뢰성(untrustworthy) 값으로 간주하며, 이들의 데이터 흐름을 추적하는 기법

Taint Analysis는 일반적으로 프로그램의 분석을 위해 사용되는 경우가 많은데, 예를 들어 메모리 퍼포먼스, footprint, 보안 TEST 목적 등이 있으며, TaintBochs와 같은 시스템 에뮬레이터를 이용하면 운영체제 동작 감시도 가능합니다.

보안적 관점으로 봤을 경우 Taint Analysis로부터 취약한 메모리 영역의 추적이 가능하므로, 0-day 취약점, 악성코드 분석 등에 응용이 가능합니다.

라. Taint 객체
“객체의 출처 값을 신뢰 할 수 없다면(untrustworthy), 그 객체 역시 Taint 되었다.” 라고 말합니다.

다음은 Taint 객체 개념을 설명한 도식화 화면입니다.
 


[그림 2] Tainted 객체

마. Taint propagation
“만약 taint 된 객체 X와 연산으로 파생된 객체인 Y가 있을 때, 객체 Y는 taint 되었으며, 객체 X로부터 객체 Y로 taint 되었다”라고 말합니다.

Taint는 t로 표시합니다. (“Taint operator t”)
위의 정의 내용은 X → t(Y) 로 표시할 수 있으며, 다음과 같은 성질을 가졌습니다.

 X → t(Y) and Y → t(Z), then X → t(Z)

다음은 Taint propagation 개념을 설명한 도식화 화면입니다.
(도식에서 나타내듯 2가지 이상의 Tainted source 들은 융합될 수 있습니다.)
 


[그림 3] Tainted propagation 도식도

 

II. Taint 여부 판별 방법

대부분의 Taint Analysis tool 은 C, C++, Java 프로그래밍 언어를 위해 사용 사용되며, 프로그램의 소스 코드가 없어도 분석됩니다. 또한 각각의 High-level 의 언어로 파싱 할 필요가 없습니다.
본문에서는 x86 아키텍처를 기준으로 설명을 주로 하겠습니다.

Taint Analysis 모듈은 x86아키텍처에서 사용하기 위해서 최소한 다음과 같은 조건을 갖춰야 합니다.

● 각각의 명령 연산의 모든 피연산자는 식별 가능하여야 합니다.
● 피연사자의 유형(source/destination)은 식별 가능하여야 합니다.
● 각각의 tainted 객체는 추적이 가능하여야 합니다.
● 각각의 명령의 의미가 명확해야 합니다.

예를 들어 전형적인 명령으로 “mov eax, 040h”을 보자면 2가지 확실한 피연산자는 eax 그리고 040h 값을 나타냅니다. Destination 피연산자는 eax, source 피연산자는 eax(register), 040h 값을 나타냅니다. (다른 명령들 중에는 함축적인 피연산자를 가지기도 합니다.) 여기에서 만약 source 피연산자인 040h 값이 taint source 피연산자라고 하면 eax 또한 Taint 피연산자 값이 되고, 이와 파생된 값들도 taint 된 값이 됩니다. 위의 내용은 단순한 명령을 예로 생각했지만, 수많은 연산, 명령을 통해서 실제로는 더 복잡할 것 입니다.

Taint Analysis tool은 x86 명령을 중간언어(IL: Intermediate Languages)로 바꿔준 후 해석하는 형태를 띄는데, 이유는 구문 분석(parse)하기 쉽고, 피연산자를 식별할 수 있기 때문입니다.

Taint 추적 매커니즘은 bit 혹은 byte 단위로 이루어질 수 있습니다.


1. Taint objects on x86
X86 아키텍처 안에서는 2가지 객체가 Taint 될 수 있는데, 다음과 같습니다.
● Memory locations
● Processor registers

가. Memory objects
● 메모리 영역의 초기 주소 값을 저장
● 메모리 영역의 크기(size)를 저장

나. Register objects
● 레지스터 식별자(이름)를 저장
● bit-level 추적 기법에서는 개별 bit를 저장

다음은 Taint object에 대한 도식화 화면입니다.
 


[그림 4] Taint objects 도식도


2. Instruction analysis
ISA(Instruction Set Architecture)는 다음과 같이 몇 가지 카테고리로 분류할 수 있습니다.
● 할당 지시자(Assignment instruction): mov, xchg 등
● 2진 지시자(Boolean instruction): AND, OR, XOR 등
● 산술 지시자(Arithmetical instruction): add, sub, mul, div 등
● 문자열 지시자(String instruction): scas, lods, cmps 등
● 분기 지시자(Branch instruction): call, jmp, jnz 등

가. 할당 지시자(Assignment instruction)
mov eax, dword ptr [4C001000h]

메모리 4C001000h 영역에 있는 값이 tainted 데이터라면, 이 값을 할당 받은 eax 또한 tainted 데이터가 됩니다.

다음은 Taint 할당 지시자 MOV개념 도식화 화면입니다.
 


[그림 5] Taint 할당지시자 MOV 도식화

나. 2진 지시자(Boolean instruction)
2진 연산(AND, OR, XOR 등) 결과의 tainted 여부는 입력된 tainted 데이터가 결과값에 어떤 영향을 주었는지를 보고 판단합니다. 단, 2개의 입력 값 모두가 taint된 경우는 제외합니다.

(1) AND 진리표(truth table)

                         A                          B                   A AND B
                         0                          0                          0 
                         0                           1                           0 
                         1                          0                          0
                         1                          1                          1 


A가 taint된 값이라고 가정했을 때,
- B가 0일 경우 그 결과는 무조건 “taint 되지 않았다.(untainted)”라고 판단
- B가 1일 경우 그 결과는 무조건 “taint 되었다.(tainted)”라고 판단

왜냐하면, AND연산의 특성(2개의 입력 값 모두가 1일 경우에만 참) 상 B가 1일 경우에만 A의 값에 영향을 받기 때문입니다.

다음은 Taint 2진 지시자 AND 개념 도식화 화면입니다.
 


                                           [그림 6] Taint 2진지시자 AND 도식화

(2) OR 진리표(truth table)

                         A                          B                    A OR B
                         0                          0                          0 
                         0                           1                           1
                         1                          0                          1
                         1                          1                          1 

A가 taint된 값이라고 가정했을 때,
- B가 1일 경우 그 결과는 무조건 “taint 되지 않았다.(untainted)”라고 판단
- B가 0일 경우 그 결과는 무조건 “taint 되었다.(tainted)”라고 판단

왜냐하면, OR 연산의 특성(1이 하나라도 있을 경우 무조건 참) 상 B가 0일 경우에만 A의 값에 영향을 받기 때문입니다.

(3) XOR 진리표(truth table)

                         A                          B                    A XOR B
                         0                       0                       0 
                         0                        1                        1 
                         1                       0                       1
                         1                       1                       0 


A가 taint된 값이라고 가정했을 때,
- B의 값에 상관없이 모든 결과는 “taint 되었다.(tainted)”라고 판단

왜냐하면, XOR 연산의 특성(둘 중 하나만 1일 경우에만 참) 상 B가 어떤 값이든 A의 값에 영향을 받기 때문입니다. 단, A xor A의 연산처럼 A값이 어떤 값이든 그 결과가 무조건 0이 되는 경우는 “taint되지 않았다.(untainted)”라고 판단합니다.

다음은 Taint XOR 개념 도식화 화면입니다.
 


                                                                [그림 7] Taint XOR 개념 도식화

(4) 항진 명제(tautology)와 모순 명제(contradiction)
- 항진 명제는 입력 값과 상관없이 항상 결과가 참인 경우
- 모순 명제는 입력 값과 상관없이 항상 결과가 거짓인 경우
- 그러므로, taint 된 입력 값이 들어왔다 하더라도 무조건 “taint되지 않았다(untainted)”라고 판단

(5) 상수(constant)를 이용한 연산
- 무조건 “taint 되지 않았다(untainted)”라고 판단

다. 산술 지시자(Arithmetical instruction)
sub, add, mul 등의 산술 지시자는 내부적으로 2진 연산을 이용합니다. 예를 들어, ADD 연산은 AND 및 XOR의 연산으로 이루어져 있습니다. 그러므로 “하나의 피연산자가 taint 되어 있을 경우에는 그 결과 또한 taint 되었다.”라고 판단합니다. 그리고 이 결과에 영향 받는 EFLAGS(ZF, OF, DF, CF 등) 레지스터 또한 “taint 되었다”라고 판단합니다.

라. 문자열 지시자(String instruction)
tainted 문자열은 어떤 문자열 지시자가 적용되더라도 생성된 객체는 “taint 되었다.(tainted)”라고 판단합니다.

● taint된 문자열에 대한 크기(size) 값 또한 taint 되었다고 판단
● taint된 문자를 검색한 값과, 그 결과로flag(found/not found)를 설정하는 경우에도 taint 되었다고 판단

마. Taint 된 객체의 수명(Lifetime)
다음은 taint된 객체가 생성/유지 되는 경우와 제거되는 경우를 설명한 내용입니다.

(1) 생성/유지
- 신뢰하지 못할(untrusted) 객체로부터 할당 받은 경우
- tainted 객체로부터 할당 받은 경우

(2) 삭제
- untainted 객체로부터 할당 받은 경우
- tainted 객체로부터 할당을 받았지만, 그 결과가 상수인 경우

 

III. 응용

1. Exploit 검출

Taint Analysis를 통해 Exploit 검출 할 수 있는데, 사용자 데이터의 추적이 가능하다면, 신뢰할 수 없는(nontrusted) 데이터가 privileged location에서 사용되었는지 검출이 가능합니다. 이를 통해 위험한 부분을 찾을 수 있으므로 패치하여 위험성을 낮출 수 있을 것 입니다.

Privileged location에 대해 설명하자면, 조금 작은 그림으로 생각하면 특정 OS상에서 특권 레벨(privileged level), 사용자 레벨(unprivileged level)로 구분하여 생각할 수 있는데, 신뢰할 수 없는(nontrusted) 데이터가 어떤 위치에서 사용되고 있는지 검출한다는 의미로 보시면 됩니다.

Taint Analysis - Exploit detection 으로 SQL Injection, XSS, BoF(Buffer overflows) 검출이 가능하며, 심지어 Unkown Attack 검출도 가능합니다.


2. 데이터 수명(lifetime) 분석
Taint Analysis를 통해 데이터 수명을 분석하면 가상 머신 메모리 안에 저장된 민감한 정보(비밀번호, 신용카드 정보) 데이터 수명을 추적 할 수 있습니다. 그리고 대부분의 Application 의 경우 민감한 정보 데이터의 수명을 최소화하기 위해 어떠한 조치도 하지 않습니다.

상세한 내용은 “Understanding data lifetime via whole system Simulation”[3]를 참고하시길 바랍니다
 

IV. 활용방안

1. DBI(Dynamic Binary Instrumentation)
가. 용어 정의
(1) Instrumentation
실행정보를 수집하기 위해 프로그램에 임의의 코드를 삽입하는 기술을 의미합니다.

(2) Dynamic Binary Instrumentation
실행중인 어떤 프로그램(프로세스)에 특수한 목적(모니터링, 통계 등)으로 사용될 임의의 코드를 삽입하는 방법입니다.

나. DBI의 유용성
● Recompile 및 Relink가 필요 없어 작업 효율성을 높일 수 있다.
● 실행중에 특정 코드를 발견할 수 있다.
● 동적으로 생성된 코드를 처리할 수 있다.
● 기존에 실행중인 프로세스를 불러와(attatch) 분석 할 수 있다.

다. 주요 목적
(1) 컴퓨터 구조 연구
● Trace Generation
● Branch Predictor and Cache Modeling
● Fault Tolerance Studies
● Emulating Speculation
● Emulating New Instructions

(2) 프로그램 분석
● Code Coverage
● Call-graph generation
● Memory-leak detection
● Instruction profiling

(3) 스레드 분석
● Thread profiling
● Race detection

라. DBI Tools
다음은 DBI 관련 Tool들을 간략하게 정리한 내용입니다.

 Tool 이름  실행환경  특징
 WIN  LINUX  MAC 다양한 플랫폼 지원
 Pin  O  O  O Intermediate Language(Vex) 기반
 DynamicRIO  O  O  O -
 TEMU  O  O  - Virtual Machine(QEMU) 기반
- 시스템 전체를 분석 가능


2. PIN
PIN은 대표적인 DBI 도구로써, 다양한 플랫폼(Linux, Windows, MacOS)에서 사용가능합니다. C 혹은 C++로 작성된 임의의 코드를 실행코드의 한 부분으로 삽입시킬 수 있으며, 이미 실행중이던 프로세스를 attach 시키는 일도 가능합니다. 특히, 방대한 API를 제공하여 사용자가 원하는 툴을 직접 제작하기 쉽도록 도와주며, 기본적으로 제공되는 툴 또한 많이 있습니다.

PIN은 일종의 “Just In Time”(JIT) 컴파일러입니다. 하지만, 해당 컴파일러에 입력되는 값은 바이트코드가 아닌 일반적인 실행파일입니다. 하나의 명령어가 실행될 때마다 그 흐름을 가로채어PIN 내부적으로 새로 생성(컴파일)한 코드를 실행하며, 이때 사용자가 원하는 코드를 삽입(Instrumentation) 할 수 있습니다.
 

                                                                [그림 8] PIN’s Software Architecture


가. 사용법
기본적인 PIN의 사용법은 다음과 같습니다.
$ pin [pin-option]... –t pintool [tool-options]... -- application

● pin ← Instrumentation Engine
● pintool ← Instrumentation Tool
● application ← Target Program(or process)

나. Tools
PIN에서 제공하는 기본적인 Tool에는 다음과 같습니다.

Tool Name: 기능

inscount0: Simple Instruction Count
itrace: Instruction Address Trace
pinatrace: Memory Reference Trace
imageload: Detecting the Loading and Unloading of Images
proccount: Procedure Instruction Count
malloctrace: Finding the Value of Function Arguments
malloc_mt: Instrumenting Threaded Application
buffer-lin: Using the Fast Buffering APIs
follow_child_tool: Instrumenting Child Process

(1) pinatrace
대상 프로그램에서 메모리에 접근(Read or Write)하는 내역을 기록하여 출력해줍니다.

다음은 cmd.exe를 대상으로 pinatrace 툴을 실행한 화면입니다.

 D:\_PIN_>pin.bat -t .\source\tools\SimpleExamples\obj-ia32\pinatrace.dll -- cmd
\d dir
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

D:\_PIN_>
                                                                [그림 9] pinatrace 실행화면

다음은 cmd.exe 에서 메모리에 접근 한 결과를 보여주는 화면입니다.
 


                                                                [그림 10] pinatrace 결과화면

위의 화면에서 결과값은 다음을 의미합니다.

IP(Instrumentation Points): Access(R or W) &Addr (R or W)Size *Addr

(2) Imageload
프로그램에서 불러들이는 이미지 정보를 기록하여 출력합니다.

다음은 cmd.exe를 대상으로 imageload 툴을 실행한 화면입니다.

 D:\_PIN_>pin.bat -t .\source\tools\ManualExamples\obj-ia32\imageload.dll -- cmd
\d dir
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

D:\_PIN_>dir

                                                                [그림 11] imageload 실행화면

다음은 cmd.exe 에서 불러들이는 이미지 정보를 보여주는 화면입니다.

 

                                                                [그림 12] imageload 결과화면

(3) proccount
프로그램에서 실행되는 프로시저를 기록하여 출력합니다.

다음은 cmd.exe를 대상으로 proccount 툴을 실행한 화면입니다.

 D:\_PIN_>pin.bat -t .\source\tools\ManualExamples\obj-ia32\proccount.dll -- cmd
\d dir
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

D:\_PIN_>dir

                                                                [그림 13] proccount 실행화면

다음은 cmd.exe 에서 실행되는 프로시저 정보를 보여주는 화면입니다.

 
                                                                [그림 14] proccount 결과화면

(4) malloctrace
함수로 전달되거나, 함수에서 반환되는 인자 값을 찾아 출력해 줍니다.

다음은 cmd.exe를 대상으로 malloctrace 툴을 실행한 화면입니다.

 D:\_PIN_>pin.bat -t .\source\tools\SimpleExamples\obj-ia32\malloctrace.dll -- cm
d \d dir
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

D:\_PIN_>


                                                                [그림 15] malloctrace 실행화면

다음은 malloc(), free()를 위한 인자 값 및 malloc()으로부터 반환되는 값을 보여주는 화면입니다.
 


                                                                [그림 16] malloctrace 결과화면

(5) Debugging
Linux의 GDB나 Windows의 Visual Studio를 이용하여 Pin에서 실행되고 있는 프로그램을 Attach 시켜 디버깅을 할 수 있습니다.

다음은 [터미널1]에서 pintool(inscount0.so)을 gdb로 넘겨준 화면입니다.
 

                                                                [그림 17] GDB 실행

다음은 [터미널2]에서 –pause_tool 옵션을 이용하여 pid를 확인하는 화면입니다.
 

                                                                [그림 18] pid 확인

다음은 [터미널1]에서 PIN에서 실행되고 있는 프로세스를 Attach 시키는 화면입니다.
 

                                                                [그림 19] attach

이후로는 일반적인 상황과 마찬가지로 디버깅을 하시면 됩니다.

다. Routines
pintools의 코드에는 2가지 중요한 루틴이 포함되어 있습니다.

다음은 중요 루틴을 설명하기 위한 예제코드로써, 프로그램에서 사용되는 Instruction의 갯수를 파악하는 모듈입니다.

 inscount0.cpp
(...)
void docount() { icount++; }  //analysis routine

void Instruction(INS ins, void *v) //instrumentation routine
{
 INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)docount, IARG_END);
}
(...)


(1) Instrumentation routines
Instrumentation 코드를 “어디에 삽입” 할 것인지를 정의하는 루틴입니다. 위의 예제 코드에서는 프로그램에서 사용되는 instruction의 갯수를 파악하기 위해 instruction이 실행되기 바로 전에 counting 함수를 위치시킵니다.

(2) Analysis routines
instumentation 코드가 활성화 될 때, “무엇을 할 것인지”를 정의하는 루틴입니다. 위의 예제를 이어서 생각해 보면, 프로그램에서 Instruction이 실행될 때 마다 해당 루틴이 호출되어 카운팅 변수의 값을 늘리게 됩니다.


3. Valgrind
Valgrind는 실행 파일의 디버깅과 프로파일링을 위한 Open-source 입니다. 주로 Memory-leak, Thead profiling, Race detection 에 사용되며, --tool 옵션으로 tool 사용이 가능합니다.

가. 사용법
기본적인 Valgrind의 사용법은 다음과 같습니다.
$ valgrind –-tool=<name> Prog-and-args

● valgrind ← Instrumentation Engine
● <name> ← Instrumentation Tool
● Prog-and-args ← Target Program(or process)

나. Tools
valgrind에서 제공하는 기본적인 Tool에는 다음과 같습니다.
Tool Name 기능
Memcheck memory error detector
Cachegrind cache and branch-prediction profiler
Callgrind call-graph generating cache profiler
Helgrind thread error detector
DRD thread error detector (similar helgrind)
Massif Heap profiler
DHAT different kind of heap profiler
Ptrcheck experimental heap, stack and global array overrun detector
BBV experimental SimPoint basic block vector generator

(1) Cachegrind
프로그램의 캐시 프로파일링을 합니다.

다음은 cachegrind를 사용한 결과 화면입니다.
 


                                                                [그림 20] Cachegrind 결과화면

(2) memcheck
Valgrind 사용시 일반적으로 사용되는 tool이며, 다음과 같은 경우를 알려줍니다.

• 초기화되지 않은 메모리 사용
• free된 메모리에 Read/Write를 시도한 경우
• malloc된 메모리 블록 외에 Read/Write 를 시도하는 경우
• stack의 부적절한 지역에 Read/Write 가 시도되는 경우
• 메모리 노출(leak) - malloc되고 free되지 않은 메모리
• 초기화되지 않거나 주소를 알 수 없는 메모리가 시스템 호출로 넘겨지는 경우
• memcpy()와 관련된 함수에서 SRC, DST의 포인터가 겹치는 경우
• 몇 가지의 POSIX pthreads API의 잘못된 사용

다음은 memcheck를 사용한 결과 화면입니다.
 


                                                                [그림 21] memcheck 결과화면

(3) helgrind
helgrind는 멀티 쓰레드 프로그램에서 데이터의 경쟁 상태를 알려줍니다.

다음은 helgrind를 사용한 결과 화면입니다.
 


                                                                [그림 22] helgrind 결과화면

(4) callgrind && (kcachegrind || callgrind_annotate)
callgrind 프로파일링을 위해 사용되며, 출력 파일(filename.out.pid)을 생성합니다. 호출의 호출 관계를 보여줍니다.
생성된 출력 파일은 kcachegrind, callgrind_annotate 를 통해 보기 편하게 변환이 가능합니다.

다음은 출력된 파일을 확인한 화면입니다.
 


                                                                [그림 23] callgrind 출력파일 확인

다음은 callgrind를 사용한 결과 화면입니다.
 


                                                                [그림 24] callgrind 결과

[kcachegrind]
다음은 kcachegrind를 실행한 화면입니다.
 


                                                                [그림 25] kcachegrind 실행 화면

다음은 kcachegrind를 실행한 결과 화면입니다.
 


                                                                [그림 26] kcachegrind 결과화면(1)

다음은 kcachegrind를 실행한 결과 화면입니다.
 

                                                                [그림 27] kcachegrind 결과화면(2)

[callgrind_annotate]
다음은 callgrind_annotate를 실행한 화면입니다.
 


                                                                [그림 28] callgrind_annotate 실행화면

다음은 callgrind_annotate를 통해 생성된 파일을 확인한 화면입니다.

 
                                                                [그림 29] callgrind_annotate 출력파일 확인

(5) tainter
Cambridge 의 컴퓨터 연구소(Computer Laboratory)에서 만든 valgrind taint analysis tool 이며, Opensource 입니다.

URL) http://www.cl.cam.ac.uk/~wmk26/tainter/

다음은 tainter를 실행한 화면입니다.
 


                                                                [그림 30] tainter 실행화면

다음은 tainter를 사용한 결과 화면입니다.
 


                                                                [그림 31] tainter 결과 화면

 

V. 결론

Taint Analysis는 보안적인 입장에서 보면 외부 입력에 대한 데이터의 흐름을 분석하여 취약한 부분을 추적하는 기법입니다. 다양한 방식으로 Taint Analysis는 적용될 수 있습니다. 예를 들어 디버거를 이용하여 디버깅된 모든 코드를 한 줄씩 확인하는 방법으로 취약점을 찾을 수 있습니다. 하지만 파일의 크기가 커지게 되면 이 방법으로 찾기에는 한계가 있을 수 있습니다. 그럴 때, Taint analysis 단계를 걸치면 취약할 수 있는 메모리 위치 등을 조금 더 수월하게 찾을 수 있습니다. 특히, 공격자의 입장에서 보면 공격 대상(Target)의 취약한 부분(예를 들어, BOF나 SQL Injection이 발생하는 부분)을 찾아 공격할 수 있을 것 입니다.
Taint analysis는 보안 컨설턴트 입장에서는 취약점을 찾기 위한 준비단계라고 볼 수 있으며, 응용방법에 따라서 만족스런 결과 창출이 가능합니다.

 

VI. 참고문헌

[1] Barbosa. Edgar. COSEINC Solid Security. Taint Analysis. In H2HC 2009
[2] D. E. Denning and P. J. Denning. Certification of programs for secure information flow. Communications of the ACM, 1977
[3] J. Chow, B. Pfaff, T. Garfinkel, K. Christopher, and M. Rosenblum. Understanding data lifetime via whole system simulation. In USENIX Security, 2004
[4] BSDaemon. Dynamic Program Analysis and Software Exploitation. In Phrack issue#67-10, August 14 2010
[5] Valgrind Project. http://www.valgrind.org
[6] Pintool. http://www.pintool.org/
[7] Wei Ming Khoo. Tainter. http://www.cl.cam.ac.uk/~wmk26/tainter/
[8] Bitblaze Project. http://bitblaze.cs.berkeley.edu/temu.html

[툴 소개] Wifite - mass WEP & WPA Cracking Tool

(무선)네트워크 2011. 1. 17. 14:55 Posted by 알 수 없는 사용자

 

Backtrack4 에서 무선랜점검을 위해 사용하는 툴인 aircrack-ng 툴을 좀 더 편하게 사용할 수 있는 툴이 있어서 소개하려고 합니다.

Wifite 라는 대량의 WEP & WPA 암호화를 사용하는 AP에 공격을 수행할 수 있는 툴입니다.수행을 직접한다기 보다는 파이썬 스크립트를 사용하여 aircrack-ng 를 좀 자동화(?) 및 시각화를 해준 툴이 아닐까 생각합니다.

직접 사용해보면 40일동안 무선랜 점검만 한 장인이 터미널창에 한줄 한줄 입력한 것보다는 못하겠지만, 사용자 측면에서 불필요한 고민(?)이나 작업에 대한 수고를 덜어줌으로써 시간절약이 된다는 면이 좋았습니다.
 
해당 툴의 홈페이지는 http://code.google.com/p/wifite/ 입니다.

실행을 위해 필요한 내용은 아래와 같습니다.
 - Linux 환경(Backtrack4 의 경우 Ubuntu 기반)
 - Python 2.4.5 와 2.5.2 버전에서 테스트 되었음.(홈페이지 정보) : 그 상위버전이면 모두 가능할거라 생각됩니다.
 - 모니터모드와 Injection이 가능한 무선랜카드 사용
 - aircrack-ng Suite 설치(v1.1 이상)
 - python-tk (초기설정 시 GUI 사용), xterm(설정 완료 시 실행화면)
 - macchanger (실행 중 필요에 의해 자동으로 mac주소 변환을 하는데 사용.)
 - pyrit : cap파일에서 WPA 핸드쉐이크를 originally strip 하는데 사용하는데 (이건 옵션이라고 합니다.)
   정확한 용도가 궁금하신 분은 http://code.google.com/p/pyrit/ 여기를 ^^;; 사용해본 게 아니라서 이게 더 정확할 거 같습니다.
   공부를 해서 훗날을 기약해보는것도...(언제쯤?ㅎㅎ)

Backtrack 4 사용 시 LiveCD이지만, USB사용할 것을 개인적으로 권장드리는 바인데, 이유는 속도차이입니다.
CD가 윙 돌고 그러는 시간을 무시를 못하겠더라구요 그냥 USB는 실행이 되는데 CD 그 딜레이를 전 못참겠습니다..후훗

1) 인터넷 연결되고 wifite.py를 받고 싶으시다 그러시면
#wget -O wifite.py http://wifite.googlecode.com/svn/trunk/wifite.py

전 USB에 파일 넣어 놓고 USB부팅해서 /media/cdrom0/ 에서 꺼내서 사용합니다.

2) 받은 파일 실행합니다.
#./wifite.py

3) GUI가 등장을 합니다.
가장 최근 버전으로 보이는 wifite_r54.py 의 GUI 화면입니다.


- interface : 선택가능함 (선택안할 경우 실행화면에서 선택하도록 되어 있음..)
- Encryption Type : 암호화방식 WEP / WPA / WEP & WPA 세가지 방식. 이 세가지 타입에 해당이 되는 AP를 검색하도록 함.
- channel : 미리 알고 있는 경우가 아니라면 all channels 선택
select targets from list 또는 everyone
- dictionary : Backtrack4 라면 디폴트로 경로 정해져있음. 전 한번도 건드린 적 없음.
- WEP/WPA timeout(min) : 각각의 암호화 방식에 대해 공격 제한 시간.
- WEP options : WEP 공격기법 종류 다중선택. (ignore Fake-Auth 선택할 경우에는 Fake-Auth가 실패한 경우에도 바로 공격으로  넘어감.

아래 부분의 400 은 적절하게 잡아서 해주면 됩니다.

GUI 설정이 끝나고 아래 빨간색 버튼 h4x0r 1t n40 버튼을 눌러주면 실행됩니다.



4) 실행화면 확인.
이후 부분은 직관적으로  확인 및 선택 등이 가능하며, 직접 해보실 것을 권해드립니다.
홈페이지에 여러가지 옵션을 써가며 설명이 되어 있는데요

Example ) 아래의 명령어들은 옵션에 대한 설명을 위해 존재하는 부분입니다. GUI 설정에서 지정해주면 실행하게 되면 아래의 명령어가 자동으로 생성되어 xterm 에서 실행되게 됩니다.

to crack all WEP access points:
./wifite.py -all -nowpa

to crack all WEP access points with signal strength greater than (or equal to) 50dB:
./wifite.py -p 50 -nowpa

to attack all access points, use 'darkc0de.lst' for cracking WPA handshakes:
./wifite.py -all --dict /pentest/passwords/wordlists/darkc0de.lst

to attack all WPA access points, but do not try to crack -- any captured handshakes are saved automatically:
./wifite.py -all -nowpa --dict none

to crack all WEP access points greater than 50dB in strength, giving 15 minutes for each WEP attack method, and send packets at 600 packets/sec:
./wifite.py --power 50 -wepw 15 -pps 600

to attempt to crack WEP-encrypted access point "2WIRE752" endlessly -- program will not stop until key is cracked or user interrrupts with ^C):
./wifite.py -e "2WIRE752" -wepw 0
 
실행화면은 홈페이지의 스냅샷 이미지로 대체합니다. 
스냅샷 URL 경로 http://wifite.googlecode.com/files/snapshot-gui-r39.png


좋은 하루 되세요. 스크롤의 압박속에 읽느라 고생하셨습니다. ^^

주말 사이 Exploit-DB 문서들

보안 소식/주간 이슈 2011. 1. 10. 09:28 Posted by TEAMCR@K

[스크랩] Nmap Cheat Sheet

서버/WAS/DBMS 2011. 1. 7. 10:42 Posted by TEAMCR@K
Nmap 옵션별 사용법이 아주 잘 정리된 블로그 문서입니다.

원문 URL : http://www.hacktoolrepository.com/article/13/Nmap%205%20%20cheat%20sheet%20and%20howto?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+HackToolUpdate+%28Hack+Tool+Update%29

Basic Scanning Techniques

Goal command example
Scan a Single Target nmap [target] nmap 192.168.1.1
Scan Multiple Targets nmap [target1, target2, etc] nmap 192.168.1.1, 192.168.1.2
Scan a List of Targets nmap -iL [list.txt] nmap -iL targets.txt
Scan a Range of Hosts nmap [range of ip addresses] nmap 192.168.1.1-10
Scan an Entire Subnet nmap [ip address/cdir] nmap 192.168.1.1/24
Scan Random Hosts nmap -iR [number] nmap -iR 0
Excluding Targets from a Scan nmap [targets] --exclude [targets] nmap 192.168.1.1/24 --exclude 192.168.1.0, 192.168.1.255
Excluding Targets Using a List nmap [targets] --excludefile [list.txt] nmap 192.168.1.1/24 --excludefile notargets.txt
Perform an Aggressive Scan nmap -A [target] nmap -A 192.168.1.1
Scan an IPv6 Target nmap -6 [target] nmap -6 3ffe:6a88:85a3:08d3:1319:8a2e:0370:7344

Discovery Options

Goal command example
Perform a Ping Only Scan nmap -sP [target] nmap -sP 192.168.1.1
Don’t Ping nmap -PN [target] nmap -PN 192.168.1.1
TCP SYN Ping nmap -PS [target] nmap -PS 192.168.1.1
TCP ACK Ping nmap -PA [target] nmap -PA 192.168.1.1
UDP Ping nmap -PU [target] nmap -PU 192.168.1.1
SCTP INIT Ping nmap -PY [target] nmap -PY 192.168.1.1
ICMP Echo Ping nmap -PE [target] nmap -PE 192.168.1.1
ICMP Timestamp Ping nmap -PP [target] nmap -PP 192.168.1.1
ICMP Address Mask Ping nmap -PM [target] nmap -PM 192.168.1.1
IP Protocol Ping nmap -PO [target] nmap -PO 192.168.1.1
ARP Ping nmap -PR [target] nmap -PR 192.168.1.1
Traceroute nmap --traceroute [target] nmap --traceroute 192.168.1.1
Force Reverse DNS Resolution nmap -R [target] nmap -R 192.168.1.1
Disable Reverse DNS Resolution nmap -n [target] nmap -n 192.168.1.1
Alternative DNS Lookup nmap --system-dns [target] nmap --system-dns 192.168.1.1
Manually Specify DNS Server(s) nmap --dns-servers [servers] [target] nmap --dns-servers 194.109.9.99 192.168.1.1
Create a Host List nmap -sL [targets] nmap -sL 192.168.1.1/24

Advanced Scanning Options

Goal command example
TCP SYN Scan nmap -sS [target] nmap -sS 192.168.1.1
TCP Connect Scan nmap -sT [target] nmap -sT 192.168.1.1
UDP Scan nmap -sU [target] nmap -sU 192.168.1.1
TCP NULL Scan nmap -sN [target] nmap -sN 192.168.1.1
TCP FIN Scan nmap -sF [target] nmap -sF 192.168.1.1
Xmas Scan nmap -sX [target] nmap -sX 192.168.1.1
TCP ACK Scan nmap -sA [target] nmap -sA 192.168.1.1
Custom TCP Scan nmap --scanflags [flags] [target] nmap --scanflags SYNFIN 192.168.1.1
IP Protocol Scan nmap -sO [target] nmap -sO 192.168.1.1
Send Raw Ethernet Packets nmap --send-eth [target] nmap --send-eth 192.168.1.1
Send IP Packets nmap --send-ip [target] nmap --send-ip 192.168.1.1

Port Scanning Options

Goal command example
Perform a Fast Scan nmap -F [target] nmap -F 192.168.1.1
Scan Specific Ports nmap -p [port(s)] [target] nmap -p 21-25,80,139,8080 192.168.1.1
Scan Ports by Name nmap -p [port name(s)] [target] nmap -p ftp,http* 192.168.1.1
Scan Ports by Protocol nmap -sU -sT -p U:[ports],T:[ports] [target] nmap -sU -sT -p U:53,111,137,T:21-25,80,139,8080 192.168.1.1
Scan All Ports nmap -p '*' [target] nmap -p '*' 192.168.1.1
Scan Top Ports nmap --top-ports [number] [target] nmap --top-ports 10 192.168.1.1
Perform a Sequential Port Scan nmap -r [target] nmap -r 192.168.1.1

Version Detection

Goal command example
Operating System Detection nmap -O [target] nmap -O 192.168.1.1
Submit TCP/IP Fingerprints www.nmap.org/submit/
Attempt to Guess an Unknown OS nmap -O --osscan-guess [target] nmap -O --osscan-guess 192.168.1.1
Service Version Detection nmap -sV [target] nmap -sV 192.168.1.1
Troubleshooting Version Scans nmap -sV --version-trace [target] nmap -sV --version-trace 192.168.1.1
Perform a RPC Scan nmap -sR [target] nmap -sR 192.168.1.1

Timing Options

Goal command example
Timing Templates nmap -T[0-5] [target] nmap -T3 192.168.1.1
Set the Packet TTL nmap --ttl [time] [target] nmap --ttl 64 192.168.1.1
Minimum # of Parallel Operations nmap --min-parallelism [number] [target] nmap --min-parallelism 10 192.168.1.1
Maximum # of Parallel Operations nmap --max-parallelism [number] [target] nmap --max-parallelism 1 192.168.1.1
Minimum Host Group Size nmap --min-hostgroup [number] [targets] nmap --min-hostgroup 50 192.168.1.1
Maximum Host Group Size nmap --max-hostgroup [number] [targets] nmap --max-hostgroup 1 192.168.1.1
Maximum RTT Timeout nmap --initial-rtt-timeout [time] [target] nmap --initial-rtt-timeout 100ms 192.168.1.1
Initial RTT Timeout nmap --max-rtt-timeout [TTL] [target] nmap --max-rtt-timeout 100ms 192.168.1.1
Maximum Retries nmap --max-retries [number] [target] nmap --max-retries 10 192.168.1.1
Host Timeout nmap --host-timeout [time] [target] nmap --host-timeout 30m 192.168.1.1
Minimum Scan Delay nmap --scan-delay [time] [target] nmap --scan-delay 1s 192.168.1.1
Maximum Scan Delay nmap --max-scan-delay [time] [target] nmap --max-scan-delay 10s 192.168.1.1
Minimum Packet Rate nmap --min-rate [number] [target] nmap --min-rate 50 192.168.1.1
Maximum Packet Rate nmap --max-rate [number] [target] nmap --max-rate 100 192.168.1.1
Defeat Reset Rate Limits nmap --defeat-rst-ratelimit [target] nmap --defeat-rst-ratelimit 192.168.1.1

Firewall Evasion Techniques

Goal command example
Fragment Packets nmap -f [target] nmap -f 192.168.1.1
Specify a Specific MTU nmap --mtu [MTU] [target] nmap --mtu 32 192.168.1.1
Use a Decoy nmap -D RND:[number] [target] nmap -D RND:10 192.168.1.1
Idle Zombie Scan nmap -sI [zombie] [target] nmap -sI 192.168.1.23 192.168.1.1
Manually Specify a Source Port nmap --source-port [port] [target] nmap --source-port 1025 192.168.1.1
Append Random Data nmap --data-length [size] [target] nmap --data-length 20 192.168.1.1
Randomize Target Scan Order nmap --randomize-hosts [target] nmap --randomize-hosts 192.168.1.1-20
Spoof MAC Address nmap --spoof-mac [MAC|0|vendor] [target] nmap --spoof-mac Cisco 192.168.1.1
Send Bad Checksums nmap --badsum [target] nmap --badsum 192.168.1.1

Output Options

Goal command example
Save Output to a Text File nmap -oN [scan.txt] [target] nmap -oN output.txt 192.168.1.1
Save Output to a XML File nmap -oX [scan.xml] [target] nmap -oX output.xml 192.168.1.1
Grepable Output nmap -oG [scan.txt] [targets] nmap -oG output.txt 192.168.1.1
Output All Supported File Types nmap -oA [path/filename] [target] nmap -oA ./output 192.168.1.1
Periodically Display Statistics nmap --stats-every [time] [target] nmap --stats-every 10s 192.168.1.1
133t Output nmap -oS [scan.txt] [target] nmap -oS output.txt 192.168.1.1

Troubleshooting and Debugging

Goal command example
Getting Help nmap -h nmap -h
Display Nmap Version nmap -V nmap -V
Verbose Output nmap -v [target] nmap -v 192.168.1.1
Debugging nmap -d [target] nmap -d 192.168.1.1
Display Port State Reason nmap --reason [target] nmap --reason 192.168.1.1
Only Display Open Ports nmap --open [target] nmap --open 192.168.1.1
Trace Packets nmap --packet-trace [target] nmap --packet-trace 192.168.1.1
Display Host Networking nmap --iflist nmap --iflist
Specify a Network Interface nmap -e [interface] [target] nmap -e eth0 192.168.1.1

Nmap Scripting Engine

Goal command example
Execute Individual Scripts nmap --script [script.nse] [target] nmap --script banner.nse 192.168.1.1
Execute Multiple Scripts nmap --script [expression] [target] nmap --script 'http-*' 192.168.1.1
Script Categories all, auth, default, discovery, external, intrusive, malware, safe, vuln
Execute Scripts by Category nmap --script [category] [target] nmap --script 'not intrusive' 192.168.1.1
Execute Multiple Script Categories nmap --script [category1,category2,etc] nmap --script 'default or safe' 192.168.1.1
Troubleshoot Scripts nmap --script [script] --script-trace [target] nmap --script banner.nse --script-trace 192.168.1.1
Update the Script Database nmap --script-updatedb nmap --script-updatedb

Ndiff

Goal command example
Comparison Using Ndiff ndiff [scan1.xml] [scan2.xml] ndiff scan_output1.xml scan_output2.xml
Ndiff Verbose Mode ndiff -v [scan1.xml] [scan2.xml] ndiff -v scan_output1.xml scan_output2.xml
XML Output Mode ndiff --xml [scan1.xml] [scan2.xml] ndiff --xml scan_output1.xml scan_output2.xml



Hits: 274
Added: 2010-12-28 13:06:21
Updated: 2010-12-28 13:12:02