패스트터틀

보안취약점(19.5.29) 본문

Cyber Security(undergraduate)/security vulnerability

보안취약점(19.5.29)

SudekY 2019. 5. 30. 15:28

Basic Concept of Heap Exploitation

Heap spray = 메모리 영역에 Heap을 쏴악 뿌리듯 메모리를 많이 쓰는것 -> 느려짐

HeapFeng-Shui(풍수지리할때 풍수 - 중국놈의 감성)

free로 구멍하나 뚫고 overwrite로 뚫는것 Heap hole puching, Heap 풍수(명당이기때문에)

D라는 객체를 해킹할때는 같은 객체가 필요하다고함 

그래서 그런 객체를 동일한 프로그램에서 찾아야될때 매우 어렵기때문에 버퍼처럼 가변적인 공간을 사용하는것을 사용한다고함

 

그래서 길이가 가변적인 객체들은 vector bytearray이다.

 

스프레이로 값을 막 집어넣고

 

move,ecx, [0x4141414] 일때 스프레이로 막 값을 메모리에 뿌려서 41414141에 42424242라는값이 들어있을때

call ecx 에서 42424242라는 임의의 이상한값을 호출하는(의도될수도있지만)것을

임의의 어떤 객체로 함수가 호출되는것(controll flwo 하이젝킹) 

이때 하이젝킹이 되면 0x42424242가 되면서 

 

근데 이러면 길이제한이 걸리는데 그곳에도 이렇게 해버리면 버퍼가 사실상 무한정으로 늘어나기때문에 모든메모리 주소에 접근이 가능하다고 볼수있음 (산술적으로)

 

RW primitives(Read/Write)

 

-(마이너스) 산술값을 사용하여 메모리 전으로 접근하는방법?

Heap의 시작이 0c0c0c0일때 0c0c0c

해킹을할때 메모리 주소공간중에 버퍼의 주소를 알아야됨 malloc을 통해서 userbloc(...buffer),userblock(buffer,buffer,buffer,),userblock(buffer,....) 을 많이 만들고 버퍼를 프리시킴(하나빼고)

근데 여기서 유저블럭은 포인터로 연결되어있는데 그래서 뒤의 버퍼를 읽으면 다른 버퍼 앞부분을 읽을수 있다는것을 알수있음

그리고 유저블럭은 +offset으로 늘어나고 +userblocksize을 해서 하면은 나의 주소를 알수있다고 함(나의 버퍼의 주소)

그리고 나의 주소를 알아냈다.면 방금전에 얻어낸 버퍼주소를 0x0c0c0c0c에서 빼고 나누기 4를 하면 Heap의 주소가 된다고 함

 

(targetAddress = 0x2000000 일고 bufferaddress = 0x1000000 일때 0x1000000/4 = 0x400000 이되는데 

move ecx, [esi + eax*4]일때 

== move ecx, [0x1000000 + 0x4000000*4] == 20000000 이됨

0c0c0c0c로 하여도 똑같음 

어쨋든 이런 식이(공식) 여서 값을 할수있음

이런것들을 돕는것을 Helper Functions 이라고함 

 

해킹 프로그램들은 이런것들을 전부다 구현되어있음 

 

어쨋든 공격자들은 Length를 덮어쓰여서 해킹을 하려고함.

그래서 소프트웨어 개발회사들은 이런것들을 너무 많이 공격을 하려고하는시도들에 대해서 보안성을 계속해서 높아지게 하려고함

 

그래서 기존에는 대책으로 checklength도 넣었는데 전부 

Length , check_length ptr.. => 여기는 항상 00000이란(모든 윈도우에서)이라고해서

ptr length xor 해서 check_length하는 방법이였는데 이것을 바꿔서

ptr을 따로 빼서 넣어버려서 ptr은 변경 못하게끔 했다고함

그리고 vector의 length를 덮어쓰지 못하게 접근 못하게끔 바꿔놓음(따로 떼어놓았다고함)

그래서 bytearray로 해킹을 할려고 하자 byte array로 또 따로 떼워놓아버림

근데 vector도 떼어놓았는데 해킹당하자 vector자체도 무결성 검증도 해버림그리고 Flash Heap도

따로 다 떼어버렸음

이런과정은 15년 ~16년사이에 6개월정도에 일어난 일임

 

Return Oriented Programming

 

해커가 해킹하려고 만든프로그램이다. 

 

Calling Convention

 

어떻게 call 로 대화할것인가에 대한 협약

 

_cdecl 파라미터가 있을때 ex 3,4개 c로 할때는 stack and push로 동작을한다.

_stdcall and thiscall 똑같이 파라미터를 하지만 ECX를 추가적으로 this를 넣어서 쓴다.

_fastcall ECX,EDX를 두개? 정도 넣어서 쓰고 한다.

Microsoft x64 RCX RDX r8 r9 (4개까지는 이것 4개) 5번째부터는 stack에 넣어서 쓴다.

 

Calling Convention정보는 어셈블리를 이해하기위한 기초적인것이기에 필수적

 

Stack Frame Structure

메인에서 foo함수를 전달한다고 했을때 z y x returnaddress SavedEBP gsCookie buffer 순으로 (아래서 위순)

으로 스텍에 쌓임 이외에도 더 복잡함

 

1.만약에 스텍을 AAAAAA로 전부 덮어쓰면은 ( EIP 조정 )

2.덮어쓸때 Exception Handler를 예외 발생을 덮어쓰여버림

3.버퍼가 덮어쓰이면서 오버플로우를 발생시키면 포인터값이 바뀌면서 실행흐름EIP가 이상하게 흘러간다.

 

(이해하기는 힘들지만)

 

ROP

 

move eax, 14

move ecx, 0x2500000

push 3

push 4

call 77fe3210

 

를 주입하고 싶을때 

Stack을 AAAAAAAAAAAA로 주입할수있는 취약점이 있다고 할떄 

return할때 주소의 명령이 실행이 될때 

수많은 메모리를 다 뒤져서 함수의 주소들을 다 뒤져서 어셈블리코드중에서 pop ebx,pop eax,ret(eax에 어떤값을 넣어라는 의미) 쌍을 찾음

그리고 리턴할때 해당주소를 바꿈 그리고 미리 eax에 미리 수를 넣었놓으면 

mov eax, 14기능을 구현한것임

 

그다음에 ecx를 하고싶을때는 

esp주소값이 뛴다는것을 찾고 pop ecx를 찾고 해당주소를 esp에 넣고 ecx에다가 0x250000을 넣고 실행함

이기능은 mov, ecx, 0x250000과 같은 기능을 구현했음

이 상태에서 push 3: push4: call 77fe3210해야되는데 리턴을 해야하는순간에 

행위를 하고 return하고 행위를 하고 return 할때 이용한다고해서 ROP 을 할수있음

 

Bufferoverflow를 발생시킬때 AAAAA로 할때 그 뒤에서부터는 방금한것들로 다 채워넣어버리는것임

Commonly required gadgets << 이런 기법들을 할때 하는것들 하나하나를 gadgets이라고함(단위의 명령어)

 

Gadget Dictionary를 구성해서 API설명서처럼 해놓는것임

msf(metasploit)이라는 자동화된 해킹도구로 많은 기능들이 있어서 웹 해킹을 해주는 기능들이 많음

 

PE(Portable Executable) structure

 

공격자는 메모리에서 실행파일을 찾은다음에 파싱을 하고 구조화된 부분도 파싱을 해서 뒤지고 뒤져서 만들어야됨

(악성코드 분석할때 필요)

 

Shellcodes databse 

 

exe말고 binray( 00 6e 62 AA ...) 로 만들어진것을

shellcode = malloc(0x1000); // 할당하고 shellcode를 

memcpy(shellcode,"e9 ba 00 00 ........................

............................................., 0x1000) 이걸로 엉청 많이 뿌려서 하면 목적에 달성하는것?

 

Exploit Database Shellcodes에 가면은 Linux용으로 엉청 많이 만들어놓아졌음 (공격자들이 만든것)

앞서말한 metasploit에도 있다고함

 

여기에는 1801개의 해킹코드 등 여러가지가 있음

이걸로 네트워크공격등 다 할수있음

 

실습상에서는 use로 뒤져보다가 ie objectcreated를썻음

 

그리고 setup 후에 exploit을 했음 근데 ie업데이트로인해 실행이되지는않았지만 여하튼 된다고함

 

후에다른걸 사용해보기로함

use windows/exec

set cmd 'notepad.exe'

generate ( control flow hijacking )

generate -b '\xff\x00' > x00은 strcpy에서 끝문자로 인식하기때문에 빼져야해서 써야하는기능이라고함

 

shell code in c++

 

쉘코드를 c++로 짤수있는 기술임 

 

위에꺼

 

 

beep소리가남

인터넷 익스폴로러 띄우고 pid찾은다음에

 

실행가능한 메모리를 할당을 받고 방금 생성한 bin파일(code.exe를 cmd로 실행시켜서 나온결과물)

 

 

bin을 176만큼 여기다가 붙히기

 

 

이렇게 하고 g로 디버그하면 beep소리가나온다.

 

 

아래꺼

 

빌드하기

 

 

7kb > 3kb 로 만들어보기

 

 

개발배포시에는

 

이 옵션을 설정해야지 런타임 라이브러리가 포함된다고함

 

 

 

7kb > 68kb 로 런타임 라이브러리가 포함되어서 증가됨

 

해커관점에서는 작아야지 무언가 집어넣을수있는데 용이하다고 함 그렇기 때문에 용량을 줄이는것이 중요한데

 

해당 옵션으로 모든라이브러리를 쓰지않겠다고 선언함

그리고 빌드를 하면 에러가난다.

 

 

wmainCRTStartup이 없길래 추가되어서 
계속해서 함수추가

 

에러 싹다 없애게 만들어버림, strcpy는 move [edi], [edi] 로 바꿔버린다고함 (너무 간단하기때문에)

messagebox는 윈도우 api이기때문에 노상관

 

 

3kb로 줄었는데

 

이런식으로 자동으로 해주는것은 Tiny libc 라고함

 

그리고 x64 비트 Shellcode는 map shellcode? 라는 사이트에 있음

 

공개되어있는 취약점은 CVE - 이런형태로 아이디가 시작이 되고 2014 (날짜) 그리고 0569 번호를 부여하는식으로 되어있음

 

https://www.exploit-db.com/

 

Offensive Security’s Exploit Database Archive

 

www.exploit-db.com

 

해커들이 자기가 찾은 취약점을 자랑하려고 올려놓는곳

 

https://bugs.chromium.org/p/v8/issues/list

 

Issues - v8 - V8 JavaScript Engine - Monorail

  9152 FeatureRequest Assigned 2 gsat...@chromium.org Lookup constructor.resolve only once in PerformPromise{All, Race, AllSettled} Performance Harmony All All Language 4 link

bugs.chromium.org

원래 크롬취약점이 올라오는곳인데 다른것도 많이 올라옴

 

https://www.bugcrowd.com/

 

#1 Crowdsourced Cybersecurity Platform | Bugcrowd

With a powerful platform and team of experts, Bugcrowd connects organizations to a global crowd of trusted security researchers.

www.bugcrowd.com

버그바운트해서 명예훈장이나 돈주는 회사같은곳 정보

 

Google Hacking Database  In google-hacking-database on exploit-db.com

 

software security + .edu 이런식으로하면 우리나라나 외국교수들이 영어로쓴 수업들을 볼수있음

 

가급적 학교 교수들중에서 공개한 자료를 본것이 좋음

 

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

보안 취약점(19.5.29)  (0) 2019.05.29
보안취약점 (19.5.28)  (0) 2019.05.28
Comments