패스트터틀

보안취약점 (19.5.28) 본문

Cyber Security(undergraduate)/security vulnerability

보안취약점 (19.5.28)

SudekY 2019. 5. 28. 17:01

보안 취약점

 

0-day security 는 변하지않지만, 전체적인 보안 취약점은 점점 수가 많아지고있음.

원래있던것이 드러나는것인지 아니면 새로운것에 대해서 새롭게 발견하는것인지 잘모르겠음

 

CWE문서를 보는것은 용어나 이런것을 아는데 필요하다고함

 

보안 취약점의 영향은

 

1. Denial of service(Dos) 서비스 부정

2. code execution 코드실행

3. Bypass something 바이패스 

4. Gain information 정보얻기

5. Gain privileges 권한얻기

 

취약점별 Price (모바일말고 데스크탑도 도표가 있음)

안드로이드는 OpenSource여서 취약점이 많다. 그리고 이상하게도 취약점이 많이 발견되면 가격이 더 내려감

 

취약점이 존재하는 근본 원인

 

1. 너무 복잡해지고있다 > 개발자들도 복잡해진다.

2. 너무 많은 연결성 

 

Integer Overflow and Underflow

 

Overflow란 컴퓨터세계에서는 255 + 1 = 256 이 아닐수도있다.

왜냐하면 Integer overflow는 Integer는 4바이트임 그리고 0 부터 하나씩 증가시킨다고 할때 

2,147,483,647까지 가서 +1을 한번 더하면 갑자기 -2,147,483,648로 변하고 다시 0까지 내려가 순환하는 형식

Unsigned overflow는 4,294,967,295까지 가다가 +1 되면 0 이 되어버림

 

Underflow는 overflow반대적인 개념으로 생각하면된다.

 

그럼 어떤 Integer값이 이런 under,over에 상태에 놓여있을때 그 값이 if,while,malloc함수에 들어간다면 취약점으로 변환을한다.

 

버퍼검사를 할때 index값을 21억으로 설정한다고 할때 +1 하면 -가 되어서 true가 됨 이렇게 버퍼를 벗어나는것을

Out of Bounds라고 한다.

 

이런것으로 무한루프를 이용할때는 일반프로그램보다는 ddos공격에 이용가능성이 있음

 

Memory Allocation

response라는 버퍼를 length만큼 줄려고했는데 length가 오버플로우가 나와서 적당한만큼만 받으려고했는데

버퍼를 줄어버리면 오버플로우가 나온다.

 

CVE-2015-3864

안드로이드에서 MMS 문자를 보내면 그때 처리되는 로직이 libstagefright라는것임(제로클릭이였음,제로데이?)

할당을 받는 버퍼가 생각보다 작게 할당받아서 된다는것인데 갤럭시 5? 까지는 통했다고함

 

Buffer Overflow

 

취약점중에서 가장 많이 나오는 취약점이다.

어떤 버퍼가 있고 취약점으로 오버플로우가 나왔다고친다면 원래 채우려던 버퍼보다 더 넣어서 옆에 버퍼까지 채워버리는것을 말함

dst버퍼가 src버퍼보다 작을때 memcpy,strcpy,strncpy썻을때 이런취약점이 나온다.

생각보다 많은 원인에 의해서 버퍼 오버플로우가 나올수있다.

Heap overflow,Stack overflow,Global buffer overflow 이런 세가지 종류가있다.

char buf_global[1024];  // <-- global memory

int main()
{
	char *buf_heap = malloc(1024); // <-- buf_heap memory
    char buf_stack[1024]; // <-- stack memory
	char srcbuf[2048];
    memcpy(이곳에 무엇이 쓰냐에따라 글로버 힙 스택 오버플로우가 달라짐(ex,buf_global), srcbuf, 2048); 
    
}

용어가 전부 해커들마다 다르지만 학술적으로는 위의 세가지 용어를 쓴다.

Heap은 문자를 복사하다가

stack은 함수를 짤때 일어남 

int foo(int param1,int parma2)
{
	char buf[1024];
    return param1 + param2;
}
    
int main()
{
	char buf[1024];
    int ret_value = foo(1,2);
}

 

위와 같을때 이런식으로 메모리 영역이 만들어진다.

 

-------------- foo : stack memory region
[1024 ..... ] 메모리영역이 만들어지고 1024바이트
return address 리턴주소 4바이트
param1 ....  4바이트
param2 ....  4바이트
-------------- main : stack memory region

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

 

위와 같이 만들어질때 스택 오버플로우가 걸리면 위에서부터 전부 다 덮혀쓰여질수있다.

return address에다가 malcode영역으로 하면은 해킹에 악용될수있다.

쉽게 설명해서

 

메모리구조

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

Process영역

Internet Explorer.exe

  -관련 dll

  -기타 등등..

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

Kernel영역

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

 

이런식으로 되어있는데 중간에 원래 exe의 메인 메모리 주소로 가야되지만 다른 메모리로 가게 하는것임

 

 

global은 전역을 쓸때 

 

int buf1[1024];
int xxx;

int main()
{
	char buf[2048] = 'AAAAAA...'
    memcpy(buf1, buf, 2047);
}

 

-----------0x00000000

user process

--

xxx 가 AAA

--

yy가 AAA 로 전부 덮힐수있다.

--

-----------0x80000000

kernel

 

 

CVE-2018-5721

Asus라우터 취약점 in http server

 

우리가 url을 입력을 할때 http://도메인/z?파라미터 이런식으로 되어있는데 ( 물음표(?)는 get이라는것임)( 제트(z)는 url 패스임)

 

http://x.y.com/zzz?action_script=xxxx ( xxxx를 받아오는 url )

여기서 개발자는 _wan_if (wan 인터페이스 명령어) 를 넣는데 여하튼 명령어를 입력하는데 그 방식이 

버퍼오버플로우가 날수있게끔 되어있음

버퍼에다가 긴 문자열을 넣어버리면은 p1 - action_script가 굉장히 커져버리기때문에 버퍼 오버플로우가 나왔다고 생각하면된다.

 

Use - after - free

말그대로 free후에 사용되었다는 뜻임. 우리가 malloc으로 할당을 받았는데 그거를 free로 선언했는데 다시 사용할수있다는 취약점임

free가 되어있는 포인터(오브젝트를가르키는것)를 Dangling Pointer(Deleted Object를 가르키는것)인데 여기서 댕글링 포인터를 다시 사용하는것임

 

new를 통해서 *array = int[100]를 만들고 delete [] array; 를 하면 하면 delete했는데 return으로 해서 다시 use를 해버리는것을 말함 삭제하고 return한다는것은 use-after-free가능성이라는것임

 

compress함수로 버퍼 데이터를 압축하고 중간에 버퍼를 뭉개서 임의의 값을 쓰는것임 그리고 나서 bytearray를 도메인 메모리로 하나의 버퍼를 두개의 포인터를 만들고 uncompress 한다고 하면은 free가 use되는 경우가 생기는 취약점?

 

자바에서는 gabage collect로 알아서 메모리를 할당해주는데 1-2-3-4-5-6 그리고 7-8 따로있을때 가비지 컬렉터가

7-8을 free해야되는데 잘못하고 5를 free하게됨

 

Failure to reference count

refcount가 두개인데 1로할경우 ( refcount는 참조하는 영역의 개수 ) 발생할수있음

 

 

Insecure Compiler Optimization

 

바이너리를 만들어주는것을 컴파일러라고 하는데 그런데 여기서 최적화를 해주는데 그 과정에서 안전하지 않게 동작하는 경우 생기는데 대표적으로 3가지가 있음

1. Dead store removal elimination => pwd데이터를 memset(pwd,0,sizeof(pwd)); 할때 컴파일러가 패스워드를 초기화시키려는 의도를 모르고 의미없다고 생각하여 삭제해버리고 컴파일을함

2. Bounds-checking elimination 컴파일러가 바운더리 검사를할때(out of bounds) 전부다 검사 안하고 가장 큰 값만 검사하는취약점, 그러니까 미니엄값 맥시멈값 둘다 해줘야되는데 하나만 해서 이런경우가 발생하는것임

3. Type-checking elimination 인테져 어레이에 1,2,3,4,5 말고 1,2,object,4,5 도 들어갈수도있는데 type검사를 모든 엘리메인터를 하기에는 시간이 오래걸리니 전부다 인테져로 통일되게 취급되어 발생하는것

	short int *a = malloc();
    int *b = a; 
    // 이런식으로 접근할때 

원래 오리지날 타입이 있는데 엑세스하는 타입이 다른타입일때 취약점이 발생하는 상황임

엑세스 타입이 오리지날보다 더많은것을 접근할경우 해당 메모리 이상의 접근함

그러니까 미스매치일경우 이런 취약점이 발생함

대표적인 원인으로는 Casting문제가 발생하게되면 type confusing 이 발생해 유효하지 않는 공간에 접근가능하게 됨

메인 함수에서 count를 3번호출할때

count();

count();

count();

 

count()

{

     int k 

     ...

}

 

k값이 초기화 되지 않을경우 k값을 계속해서 증가하게됨

이럴때 k값이 초기화되어있지 않기때문에 임의의 값으로 변경될수있다는 가능성이 있는 취약점

 

Visual Studio Code

무료임 개발자들이 많이 쓴다고함

 

ProcessHacker는 중국놈이 만든것이지만 아주 유용함

 

 

 

윈도우 디버거(Window Debugger)

 

exe가 만들어질때에는 compact한 정보가 들어가있음. exe랑 심볼파일이 같이 있어야 정확한 정보를 알수있음

배포는 exe만 배포함

 

https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/

 

Free Virtual Machines from IE8 to MS Edge - Microsoft Edge Development

Download virtual machinesTest Microsoft Edge (EdgeHTML) and versions of IE8 through IE11 using free virtual machines you download and manage locally. Select a downloadVirtual machineSelect oneIE8 on Win7 (x86)IE9 on Win7 (x86)IE10 on Win7 (x86)IE11 on Win7

developer.microsoft.com

가상머신은 위에서 받을수있다.

 

Windbg(윈도우 디버거)

 

윈도우상에서 가장 강력한 디버거이다. 강력한 기능을 가지고있고 VS보다 훨씬 좋다.

윈도우는 확장기능을 제공하고있는데 그렇기 때문에 강력하다.

일단 기본적인 개념으로는 디버거,디버그의 차이가있다.

 

Debuggee ==> 프로세스 

attach하는거는 디버깅

Debugger ==> 디버거

 

attach를 하는방법은 Invasive는 실행중에 Non-Invaisve는 시작을 같이 하는것

 

디버깅 심볼정보란 함수의 이름 변수의 이름 소스코드에 대한 정보 현재 이 코드는 소스코드의 몇번째 라인에 대한 구조체 정보등..

 

symbol파일은 바이너리가 실행될 때 꼭 필요하진 않지만, 디버깅 과정에서 아주 유용하게 사용되는 다양한 정보들을 가지고있다.

보통 심볼파일들은 전역변수,지역변수,함수이름,entrypoint,FPO data,source-line번호가있음

 

 

 

 

우선 크래쉬가 뜨는 exe프로그램을 실행시킨다.

 

디버거시 Windbg 자동실행

 

디버거에다가 다른 디버거 하면 자동 실행, 1(자동), 0(수동)

 

이런식으로 설정을할수있다.

CurrentUser는 나만 Localmachine은 전부(관리자권한필요) 를 말하는것임

여하튼 이렇게 크래쉬가 났을때 소프트웨어 개발하는사람들은 이것이 굉장한 단서가 됨

 

인터페이스

 

디스어셈블리코드, 메모리뷰창도 추가할수있음

 

 

워크스페이스 저장(GUI 구성,인터페이스 설정저장 가능하다는뜻)

 

윈디버거의 명령어에는 총 3가지 명령어가있다.

Regular(일반, 알파벳으로 구성되어있는) > 디버기에 명령어를 주입하는것

Meta or Dot ( . , < 메타커멘드)라고함) > 디버그에 명령어를 실행하라는것

Extension( ! < 느낌표가 들어가있는거) > 확장기능 dll을 실행하는것, 

 

 

Process가 해킹을 당하면 Low권한이 당하는건데 

Ie.exe

 -ie.exe

 

저기능을 쓰면 이걸 더 낮은권한으로 해준다고함

크롬은 실행시키면 엉청많고 거의 아무권한없는것도 많음

 

sandbox(서로에게 영향을 미치지 못하게 box화 하는것)

 

.logopen [파일]

입력한것들을 전부 로그로 파일로 기록할것임

 

.sympath 

디버깅할때 필요한 심볼 정보를 마이크로소프트에서부터 받아와서 c드라이브에 저장해

 

 

실습상에서는 심볼파일들을 이미 c드라이브에 받아놨었음

 

lm 명령어를 치면 dll들을 볼수있음

 

일부는 kernel에서 제공해주기도 일부는 ie에서 하기도함

 

ld kernel32

 

특정 커널(ex kernel32) 올리기

 

kernel32 보기

 

u 772fd85e 이런식으로 명령어를 보면 심볼이있기때문에 함수정보들을 쉽게 볼수있음

dt ntdll!*  언더바(_) 로시작하는것들이 나오는데 구조체

(수업시간에 나왔던것 struct ___AAAA{

                                     int a;

                                     double b

                               };                          <<< 이 구조체 이름

 

dt ntdll! HEAP ENTRY EXTRA > ?? 

여하튼 심볼이 있기 때문에 해석이 가능하다.

CHROME형 브라우저도 파이어폭스도 심볼 서버를 유지한다.

우리가 디버깅을 한다고 했을때는 심볼이 있느냐 심볼서버에서 받아온다. 소스가 있냐? > 디버거 연결해준다.

프로그램을 실행하면 peb process env론먼트 블럭에 저장된다.

lm(list module) > 적재된 모듈정보,적재되었던것도 포함된

하나의 프로세스에는 여러개의 쓰레드가 있는데

그 쓰레드 갯수를 보는것은 물결표(~) 이다.

 

윈도우에서의 프로세스는 peb로 프로세스를 관리하고 하나의 프로세스에는 여러개 스레드가 있고

그런 각각 스레드는 teb로 관리되고 설정된다. 라고 정리할수있음

 

!teb < 활성화된 쓰레드 정보보기

~0 < 특정 스레드 정보보기 (~1,~2..)

~0s < 디버그 커멘드 주체 스레드 활성화(~1s,~2s..)

 

k < 현재 우리가 0번 스레드 콜스택을 본다면 ie를 실행을 하면 윈도우 프로그램 로더 ie.exe를 실행하고 그놈의 엔트리포인트를 로드하는데(최초시점) 쭉 실행되다가 얘가 얘를 호출하고.. 이런식으로 여기까지 호출 되어있고 디버거가 멈춰있다는 내용이다.

 

dc 0x00000000 = dc 00000000 (기본적으로 16이기때문에)

 << 해당 메모리 명령어 보기 물음표(?)는 메모리가 없다는뜻

 

dw > 2바이트씩, db > 1바이트씩,dq > 8바이트,da > 아스키만,du > 유니코드로

 

dds esp 는 dd로 보여주는데 그 주소값이 심볼상에 존재하면 같이 보여달라는것 esp는 레지스터 

 

프로세스가 실행되면 여러개의 스레드가 나오는데 cpu에 직접가는거는 주체는 스레드가 됨

각각의 스레드는 각각의 범용레지스트정보를 가지고있고 a라는 cpu가 a를 실행시키다가 b를 실행시킬때

a를 내리고 b를 올리고 내리는거를 contact switch 이런 스레드의 기억 소자라고 이해하면됨

esp레지스터는 스텍포인터를 의미함 현재 프로세스 현재 스레드의 가장 위를 가르키는것

~0s 를할때 맨위에 현재 스택주소를 의미?한다.? 잘모르겠다.

 

ed esp 41414141 > esp

 

메모리영역 한번에 보기 !address

TYPE 에서 PRIVATE 는 오직 나만 접근할수있는영역!!

STATE는 RESERVE 쓰고 있는데 잠깐 안쓰는 영역 (메모리영역은 잡혀있음)(피지컬메모리에는 아직 할당안했음, 가상메모리에서만 할당되어있음)

COMMIT 는 피지컬메모리를 직접쓰고 있는 경우임 (실제 우리가 알고있는 영역인 램에 해당 데이터에 그대로 올라가져있다)

READWRTIE > 읽고쓸수있다. 땡땡ONLY >> 그것만 가능함

EXECUTE_READ 는 실행도 가능함 

 

MappedFile > 파일이 맵핑된것, Heap영역, Image > 모듈이야 ,Stack이있다.

이렇게 나누고 나누고 나눠져서 메모리가 올라와있고 스택도구들도 많이 있고 이런것들이 메모리에 쭈욱 올라가져있다.

 

나는 HEAP 만 보고싶을때에는 !address /f:heap

스택은 함수를 짯을때 int main, int c 등 이 할당되는 메모리 블럭이

이미지는 이미지만, !address /f:mem_commint,mem_private,page_execute_read

이런식으로 입력하면 분류해서 볼수있음,

????? > 이주소는 쓰고있는데 무엇인지 모르겠다. 무엇인지 모르겠지만 현재 쓰고있어(Virutal Alloc?? 이라고함)

 

!vport 23f0000  > 이 주소를 간단하게 볼수있는것?인지 잘은 모르겠다.

 

dc esp (esp : 스택메모리) 을 f명령어(fill: 채우다) 

f esp L10000 41 10000번 41로 채우라는것임

 

이거를 치면 스택메모리를 뭉개버리는건데 이렇게하고

g(Go: 시작) 하면은 메모리가 죽어서 프로세스가 죽어버려야하지만 ie.exe가 꺼지지 않았음

 

s 00000000 L?80000000 "Internet Explorer" < 주소의 0 부터 80000000까지 User영역에서 Internet Explorer를 찾겠다라는 뜻임 s는 Search의 약자이다. 해당 문자가 들어간 것을 싹다 찾는것임

s 00000000 L?80000000 49 6e 74 65 72...  이런식으로 찾아볼수도있다.

 

Breakpoint Commands

디버그의 핵심은 브레이크 포인트이다.

 

u kernel32!CreateFileA (kernel32 영역에서 CreateFile을 보여줘라는 명령어이다.)

여기서 kernel32의 CreateFileA에 BreakPoint에 브레이크 포인터를 걸어보기

bp kernel32!CreateFileA 

후에 g(go)입력

그리고 bl을 하면 브레이크포인트가 어디에 걸려있는지 확인

bp kernel32!virutalProtect

bp Kernel32!virutalAlloc

이렇게 해서 총 3개를 브레이크포인터를 걸어놓고 

3개의 브레이크 포인터가 있는데 0(브레이크포인터 숫자번호)은 안쓸꺼야 할때는

bd 0 bd * 

bc > 브레이크포인터 클리어 bc * > 브레이크포인터 다지우기

 

포인터로 따라가고 따라가는 과정이 상당히 귀찮으므로 포인터를 따라가서 보여달라는 명령어는

dc poi(esp)

혹시나 포인트이면 또 포인터 포인터 해서 계속해서 감싸서 쓸수있음

dc poi(poi(esp))

??sizeof(ntdll!_PEB)

??sizeof(int)

??sizeof(short)

??sizeof(dword)

??sizeof(char)

타입 구조체의 크기를 보고자 할때 위의 명령어를 쓰면된다.

 

지금까지 봐왔던것은 명령어로 그냥 해봤던것임

 

이제는 파이썬이랑 연결해서 하는방법을 할것이다.

 

이제 이 안에서 파이썬을 실행할수있다. 
.load pykd

chain
!py

 

그리고 

 

from pykd import *

from os.path import expanduser

res = pykd.dbgCommand("lm")

dprintln(res[:400])

 

명령어를 실습상에서 입력을 했다. 그러니까 이걸 하는이유는 명령어 노가다를 줄이기위해서 파이썬을 쓰는것이라고 생각하면된다.

 

교수님 책추천 effective modern c++

 

!analyze -v 왜 오류가 났나 분석 

 

실습상에서는 문제점을 찾아서 double free 문제로 free한영역을 또 free한것이 문제였음

.dump는 크래쉬가 발생했을때 파일로 저장하는것임(크래쉬의 메모리 정보 저장)(.hh .dump로 확인)

 

.writemem 0 L?10000 "a.bin"  으로 저장하라는명령어 

.read "a.bin" 어디에 올려

 

악성코드를 실행했더니 악성코드가 여기에 저장되어있는것같으면

.writemem 1c0000 a50000 c:\users\ieuser\desktop\malmem.bin 으로 (bin은 exe로 바꿀수있음)

저장해서 실행시키거나 분석할수있음

 

 

실습자료들

 

https://github.com/jaeseolee/IS571-ACSP-Fall-2018

 

jaeseolee/IS571-ACSP-Fall-2018

Contribute to jaeseolee/IS571-ACSP-Fall-2018 development by creating an account on GitHub.

github.com

 

 

윈도우 힙 구조

 

윈도우는 메모리구조가 복잡한데 stack이나 이런거 말고 순수하게 heap영역만 본다.

Heap Manager, Low Fragmentation등 볼것이다.

메모리를 할당하고 해지하는영역은 malloc(), new, and HeapAlloc() << malloc,new호출하면 자동으로 호출

Win32 Virutal Memory Map

 

Heap vs Stack

heap은 동적으로 사용자가 코드를 짜놓는거임,개발자가 개발코드에 malloc코드를 집어넣어서 하고있음

이런것들로는 objects,buffer등등. 스택보다느리다. 메뉴얼(손수)적이다.

 

stack은 컴파일 타임에 형성이됨, 빠르고, 자동으로 됨

 

heap vs Virutal Memory

우리가 메모리를 할당받고자 할때 heap말고 virutal alloc으로도 할당을 받을수도있음

가장큰차이는 virtual alloc은 1000을 할당하면 얘는 무조건 페이지 단위로 할당을하는데 페이지(피지컬 메모리,램)

 

할당하면 윈도우 커널에 들어갔다 와야됨(커널한테 가서 할당을 받아와야된다.)(단편화발생)

heap alloc은 "굳이 커널에다가 물어볼 필요가있어?"라고 하는식으로해서 0x8이든 0x1000이든 상관없이 할당하게 되면 외부적으로 전용으로 쓸거니까 한번 요청 ..... 까먹음

 

0부터 512KB까지 메모리 를 요청하면은 Virutal Alloc에서는 느렸지만 heapalloc에서는 빨랐다. 등등 빠른속도라는 도표가있다.

 

heap 는 1000단위로 할당하기때문에 단편화가 많이 발생한다. Heap 단편화가 적어진다.

그러면 윈도우 운영체제에는 메모리 관리를 이 두가지밖에 없는것은 아니고 더 있다. 

 

결과적으로 메모리를 할당하게 되면 결론적으로 Heap과 Vitual 둘다 거친다는것임

 

Windows Heap Manager

???

 

 

Front End Manager Types는 두가지로 나눠진다.

 

HeapCreate를 할때 size fixed 고정됨

globableheap 은 무제한 

지금 윈도우는 두개를 병행해서 쓴다고함

 

Size-fixed로 HeapCreate(0,0,0x10000000) 하면은 매니저가 0x1000 만 하고 나머지는 Reserved 로 주는데 그 이유는 피지컬 메모리가 제한적이기때문에 보호할필요가있기때문에이다.

 

구조체중에서 _HEAP이라는것이 있는데 그부분이 앞부분?

 

그리고나서는 HeapAlloc으로 할당 받을수있음 핵심은 Heapalloc이 발생하면 Freelist로부터 가져다 쓴다.

늘리고 할당 늘리고 할당 늘리고 할당.... 이렇게 해서 이만큼쓰라고 주고주고주고 해서하는것

 

heap은 단편화 발생이 가장 큰 단점

 

 

 

 

'Cyber Security(undergraduate) > security vulnerability' 카테고리의 다른 글

보안취약점(19.5.29)  (0) 2019.05.30
보안 취약점(19.5.29)  (0) 2019.05.29
Comments