[2014 codeengn conference 10] 심준보 - 급전이 필요합니다

60
진짜 급하게 돈이 필요합 니다. [email protected] www.CodeEngn.com 2014 CodeEngn Conference 10

Upload: gangseok-lee

Post on 18-Nov-2014

450 views

Category:

Education


7 download

DESCRIPTION

2014 CodeEngn Conference 10 열혈 취약점 헌터들의 고분군투기! 취약점을 찾게되면 어떤 일이 벌어질까? 급전이 필요한 외롭고 찌질한 대한민국 해커들의 급전을 위한 취약점 찾기 여행기. 과연 우리는 취약점을 찾고 급전을 만들어 외롭고 찌질한 이 상황을 타개할 수 있을 것인가? http://codeengn.com/conference/10 http://codeengn.com/conference/archive

TRANSCRIPT

Page 1: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

진짜 급하게돈이 필요합니다.

[email protected]

www.CodeEngn.com2014 CodeEngn Conference 10

Page 2: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Introduction

• 소프트웨어 취약점의 정의

• 소프트웨어 취약점의 위험성– 설계한 소프트웨어의 보안 매커니즘을 파괴– 예상하지 못한 소프트웨어의 동작으로 탐지하기 어려움– 소프트웨어 개발 업체 : 기업의 신뢰성 위협– 소프트웨어 사용 업체 : 기업의 보안 매커니즘을 위협

소프트웨어의 결함이나 체계ㆍ설계상의 허점으로 인해사용자(특히 공격자)에게 허용된 권한 이상의 동작이나허용된 범위 이상의 권한을 부여하는 약점을 의미한다

Page 3: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Introduction

• 소프트웨어 취약점이 악용된 사례 : 보안사고의 핵심

Page 4: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Introduction

• 악용된 소프트웨어 취약점 : Microsoft(社)

Page 5: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Introduction

• 소프트웨어 취약점 관련 용어정리– 취약점(Vulnerability)

• 이용하여 권한을 획득할 수 있는 소프트웨어 적인 버그– 공격코드(Exploit)

• 취약점을 공격할 수 있는 코드– 개념증명 코드(PoC Code)

• 취약점을 증명할 수 있는 코드– 시스템 소유(System Pwned)

• 취약점을 이용하여 해당 시스템을 점유하였을 때 사용하는 표현– CVE : Common Vulnerabilities and Exposures

• 취약점에 대한 정보를 모아놓은 List-up

– 취약점 공개(Vulnerability Disclosure)

Page 6: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Software Bug Hunting 이란 ?

• 소프트웨어 취약점을 특정 이득을 위해 찾아내는 행위

소프트웨어의 결함이나 체계ㆍ설계상의 허점을 고의적으로 찾아내어금전적인 이득, 사이버 테러의 예방, 해커적인 명성획득 등의

특정 이득을 노리는 일련의 행위

Page 7: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Bug Bounties

• Samsung SMART TV– https://samsungtvbounty.com/

• Tipping Point ZDI– http://www.zerodayinitiative.com/about/benefits/

Page 8: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Bug Bounties

• Verisign Idefense Lab Vulnerability Management– https://www.verisigninc.com/en_US/products-and-

services/network-intelligence-availability/idefense/vulnerability-intelligence/index.xhtml

• KISA 침해대응센터 취약점 신고 포상제– http://www.krcert.or.kr/kor/consult/consult_04.jsp

Page 9: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Stories of Bug Hunters

• Pwn2Own In CanSecWest– 가장 잘 알려진 Bug Hunter들의

Exploit 기술을 선보이는 대회– 매년 캐나다 CanSenWest에서 열림– Google, Tipping Point, Adobe 등이 스폰

• The Pwnie Award– 매년 유명 Hacker들이 그 해 발견된 취약점 중 우수한 취약점에대해 시상식을 통해 포상을 하는 제도

Page 10: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Business Model

• Offensive Reserch, Security, Model

Page 11: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Business Model

• 취약점을 발견하기 어렵다– 배우기 어렵다– 정형화된 방법이 드물다

Page 12: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Business Model

• 취약점을 알고 있어도 고치기 어렵다– 정확한 취약점의 공격원리– 프로그램의 안정성– 개발 프로세스의 부재– 취약점 관리 프로세스의 부재– 뛰어난 프로그래머의 부족– 공격 코드 작성과 프로그래밍이 가능한 인재의 부족

Page 13: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Business Model구 분 국산 소프트웨어 외산 소프트웨어

취약점 발견 능력 미비 유명 해커의 고용

취약점 패치 능력 미비 자체적인 교육

취약점 관리 능력 없음 프로그램 운용

취약점 대응/독립 팀 존재 없음 자체 팀 존재

취약점 대응 능력 국가기관에 의존 TF구성

외부 전문가 활용 미비 많음

취약점 신고 창구 운용 미비 프로그램 운용

국산 소프트웨어는 잠재적으로 많은 보안 취약점을 지니고 있음

전문적으로 소프트웨어 취약점을 관리하는 인력이나 시스템이 없음

Page 14: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

소프트웨어 취약점 점검

• White Box Testing– 소프트웨어에 대한 전권을 행사할 수 있을 때 취약점을 점검

• 소프트웨어 개발사• 적법한 절차의 소프트웨어 취약점 점검사

• Black Box Testing– 소프트웨어에 대한 일부, 혹은 전혀 권한을 행할 수 없을 때 점검

• 특수한 경우의 적법한 절차의 소프트웨어 점검사• Bug Bounty를 노리는 Bug Hunter• 악의적인 Hacker (공격자)

Page 15: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

소프트웨어 취약점 점검 방법

• 소스코드 점검 ( Source Code Auditing )– 주로 White Box Testing에 사용– 실제로 생각보다 난이도가 높음

• 소프트웨어 역공학( Reverse Code Engineering )– 주로 Black Box Testing에 사용– 취약점을 점검하는 사람에 따라 차이가 큰 편

• 퍼징 ( Fuzzing )– 주로 Black Box Testing에 사용– 자동화된 툴을 사용하여 취약점을 점검– Every Hacker Make Own Fuzzers !

• 기타

Page 16: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

취약점의 종류

• Software Bug Diagram– 소프트웨어 버그는 엄청나게 종류가 많다– 모든 버그가 모두 공격 가능한 것은 아니다

Program

Bug

Exception

Crash

Vulnerability

Page 17: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

취약점 일반론

• Untrusted Input & Object– 사용자(특히 공격자)가 조작할 수 있는 입력 혹은 객체

Program

Bug

Exception

Crash

Vulnerability

Inputs

Files,Networks,SystemObjects,KeyboardInputs,ETC

Outputs

Files,Networks,SystemObjects

HackerNeedsThis

Flows

Page 18: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Command Injection

• 프로그램에 명령어 삽입이 가능한 경우

Page 19: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Command Injection

• Case Study : CVE-2010-3847– GNU C library dynamic linker $ORIGIN expansion

Vulnerability

Page 20: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Command Injection

• Case Study : DLL Hijacking, Unsafe DLL Load– CVE-2010-3141, MS Office Power Point 2007 DLL Hijacking

Page 21: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Command Injection

• Case Study : Unsafe Object Import– CVE-2012-0013, MS Office ClickOnce Unsafe Object

Handing– http://www.cc.gatech.edu/~blee303/exploit/ms12-

005/MS12-005.ppsx

Page 22: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Information Leak

• 프로그램이 악용될 수 있는 정보를 공개하는 경우– 설치경로, 버전, 사용하는 라이브러리 버전– 심지어 주소나 객체의 동적 주소 등도 포함됨

Page 23: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Stack Based Corruption

• Stack Based Overflow

Page 24: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Heap Based Corruption

Page 25: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Microsoft Exploit Mitigation

• History of Memory Protection

Page 26: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Microsoft Exploit Mitigation

• History of Stack Corroption

Page 27: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Microsoft Exploit Mitigation

• History of Heap Corroption

Page 28: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Use After Free

• Use After Free 취약점

Error ??

Page 29: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Use After Free

• Use After Free 취약점

Free 한 이후에도Buf를 사용함

Page 30: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Use After Free

• Use – After – Free 취약점– C++ 에서 Class 생성자인 new와 delete 연산에서도같은 문제가 존재

– C++은 객체의 Use-after-free가 일어날 경우 Method의 함수포인터를 조작할 수 있는 경우가 있음

멤버변수number

Count()함수포인터(접근가능)

Page 31: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Use After Free• Use – After – Free 취약점

– C++ 에서 생성자와 소멸자 기본 등록되는 경우Use-After-Free와 만나면 매우 위험함

Constructor

MemberVariable

MemberFunction

Destructor

•생성자•함수 포인터

•멤버 변수•number

•멤버 함수•count()

•소멸자•함수 포인터

접근가능

Page 32: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Use After Free• Use – After – Free in Javascript

객체 생성

객체 소멸

2개의 Event동시 발생

Page 33: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Type Confusion

• 객체의 Instance가 Type을 혼동하여 나는 오류• Flash Player Case : Action Script

Action Script Source Code

SWF file(Bytecode)

Machine Code(Assembly)

Trace( “AAAAA” );Findpropstric <q>[public]::tracePush string “AAAAAA”Callpropvoid <q>[public]::trace, 1 params

AVM JIT

Page 34: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Type Confusion: Flash Player Case

• Action Script Bytecode는 3단계를 거쳐서 실행된다

검증단계(Verification

Process)

생성단계(Generation

Process)

실행단계(ExecutionProcess)

Bytecode가 안전한지 검사

Bytecode => Machine Code

Machine Code 를 실행

Page 35: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Type Confusion: Flash Player Case

• Action Script Bytecode는 3단계를 거쳐서 실행된다

검증단계(Verification

Process)

생성단계(Generation

Process)

실행단계(ExecutionProcess)

Verification Flow수행흐름에 따라

안정성을 검증

Execution Flow수행흐름에 따라안정성을 검증

Page 36: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Type Confusion: Flash Player Case

• Action Script Bytecode 검증은 Block 을 기반으로 계산된다• Block의 구분은 jump와 같은 Branch 류의 명령을 기반한다

Page 37: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Type Confusion: Flash Player Case

• 검증실패 1 : callpropvoid는 Object type을 필요하는데,Integer type의 인자가 같이 들어감

• 검증실패 2 : “1 params”로 하나의 인자를 명시했는데,2개의 인자가 들어감

Page 38: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Type Confusion: Flash Player Case

BLOCK 1

BLOCK 2

BLOCK 3

• BLOCK 1,2,3 모두 검증 성공

Page 39: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Type Confusion: Flash Player Case

• Action Script 는 모든 Object 를 Atomic Type으로 표현한다

2BC5732 : Atomic type

Trace( “AAAAA” );

Page 40: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Type Confusion: Flash Player Case

Page 41: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Type Confusion: Flash Player Case

Page 42: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Type Confusion: Flash Player Case

Page 43: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Type Confusion: Flash Player Case

137CC3FC

137CC3FF

100 - undefined

111 - Double

Page 44: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Type Confusion: Flash Player Case

• Verification Process 를 우회• Atomic Confusion 을 통해 Crash 유발

Page 45: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Type Confusion

Class ACall A.a()

Class BFunction B.a() : return int

Class CFunction C.a(): return string

Confusion

[Class B의 주소] -> [a() 함수의 주소] -> [함수 호출]

[Class B ? C ?의 주소] -> [???????] -> [Crash]

Page 46: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Bug Hunting 방법론

• Method 1 : Using Information or Open Vulnerbility– 공개된 취약점을 재 조합하여 취약점을 찾아냄– 일반적으로 프로그래머의 실수는 다시 재발하는 경우가 많음

• Method 2 : Source Code Auditing– 활용할 수 있는 소스코드들을 Program이 Import했는지 확인– 그 뒤 Source Code를 활용하여 취약점을 검색

• Method 3 : Top-Down Analysis– 상위 High-level의 관점에서 부터 가장 낮은 Low-Level까지– 데이터의 흐름이나 시스템의 약점을 조사하는 방법

Page 47: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Bug Hunting 방법론

• Method 4 : Reverse Engineering– 소프트웨어 역공학을 통해 프로그램의 취약점을 조사– 디버거나 디스어셈블러의 도움을 활용함

• Method 5 : Fuzzing ( Brute Force Testing )– 프로그램의 입/출력부의 랜덤한 값을 입력하여 취약점을 조사– 자동화하기 매우 편리함

• Method 6 : Dynamic Analysis– 프로그램의 동작방식을 이용하여 취약점을 조사– Dynamic Binary Instrumentation 이나 Debugger를 이용

Page 48: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Method 1(Practice 1): Using Information or Open Vulns• 공개된 취약점의 정보를 조합하여 취약점 발견

GomplayerExploit Code

KMPlayer

Pot Player

Choco Player

Page 49: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Method 1(Practice 2): Using Information or Open Vulns• 공개된 Open Library의 Version 확인

Page 50: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Method 2: Source Code Auditing

• 공개된 Open Source를 Code Level에서 취약점 발견– 취약점의 종류를 노려서 하는 것이 일반적

• Step 1 : 변수 정보 수집

Page 51: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Method 2(Practice 3): Source Code Auditing

• Step 2 : 사용자로 부터 조작가능한 변수파악

Page 52: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Method 2: Source Code Auditing

• Step 3 : 실행 흐름을 따라 취약점 조사

Page 53: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Method 3(Practice 4): Top-Down Analysis

• 프로그램의 취약점을 설계자 관점으로 분석하는 방법

Page 54: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Method 4(Practice 5): Reverse Engineering

• 소프트웨어 역공학을 통해 취약점을 조사하는 방법– 가장 중요한 것은 조작할 수 있는 값을 찾아내는 것

Page 55: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Method 5: Fuzzing

• 프로그램이 받아들이는 Input을 랜덤하게 발생기켜프로그램의 취약점을 찾아내는 방법

• 현재 매우 인기있는 취약점 발견 방법론

• 대부분 Memory와 관련한 취약점을 찾는데 집중

• 매우 다양한 Fuzzing Framework들이 구성되어 있음

Page 56: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Method 6: Dynamic Analysis

• Dynamic Taint Analysis

Page 57: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Taint Analysis

• Dynamic Taint Analysis

Page 58: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Taint Analysis

• Taint Analysis 의 효과 : Bug Hunting에 대한 응용– Find Tainted EIP Register– Find Tainted Function Pointers– Find Tainted Stack Arguments– Find Tainted Data Structure Using System

• Taint Analysis 의 효과 : Exploit detection– Preprocessing : 0-day Exploit detection

• Rechability Problem의 해결– How can I make PDF File to execute code block #937

• Mov [edi * 2], esi– Packet으로부터

Memory Access가 edi, esi로이어지는지를 판단

Page 59: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Dynamic Binary Instrumental

• Binary 실행시 원하는 Code를 삽입하는 기술

• 프로그램을 다시 컴파일하거나 링킹하지 않음• 실행하는 동안 원하는 루틴을 찾을 수 있음• 실행중인 프로그램을 분석하는데 탁월함

Mov eax, ebxCode 1 Code 2

Page 60: [2014 CodeEngn Conference 10] 심준보 -  급전이 필요합니다

Method 3

Putting All

• 취약점을 찾는데 정형화된 Flow는 없음• 주의할 점

– 프로그램마다 특성이 있고 그 특성을 파악하는 것– 공격자의 입장에서 생각하는 것– 개발자는 사람이다 : 실수를 반드시 한다– 모든 버그는 공격할 수 있다고 가정한다

Method1 Method2

Method 4

Method 5

Method 6

www.CodeEngn.com2014 CodeEngn Conference 10