연구보고서 작성 취약점분석을위한퍼징 (Fuzzing) 부경대학교 CERT-IS 김연재, 최종학, 신명재 이인회, 이재호, 최자운, 박지환 * 본문서는대학정보보호동아리연합회 (

Similar documents
The Pocket Guide to TCP/IP Sockets: C Version

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

Observational Determinism for Concurrent Program Security

Secure Programming Lecture1 : Introduction

게시판 스팸 실시간 차단 시스템

PowerPoint 프레젠테이션

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

슬라이드 1

Chapter #01 Subject

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

BMP 파일 처리

0. 들어가기 전

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft Word - src.doc

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

PowerPoint Template

제목 레이아웃

bn2019_2

** 5 개이발생한주요소프트웨어별취약점세 EDB 번호취약점종류공격난이도공격위험도취약점이름소프트웨어이름

2009년 상반기 사업계획

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

1217 WebTrafMon II

Microsoft PowerPoint - 04-UDP Programming.ppt

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint 웹 연동 기술.pptx

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft Word - MSOffice_WPS_analysis.doc

untitled

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

API 매뉴얼

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

Network Security - Wired Sniffing 실습 ICNS Lab. Kyung Hee University

[Brochure] KOR_TunA

PowerPoint Presentation

PowerPoint Template

DocsPin_Korean.pages

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

JUNIT 실습및발표

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap01-C언어개요.pptx

11장 포인터

PowerPoint 프레젠테이션

(SW3704) Gingerbread Source Build & Working Guide

Microsoft PowerPoint - 03-TCP Programming.ppt

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

Oracle hacking 작성자 : 임동현 작성일 2008 년 10 월 11 일 ~ 2008 년 10 월 19 일 신규작성 작성내용

XSS Attack - Real-World XSS Attacks, Chaining XSS and Other Attacks, Payloads for XSS Attacks

vi 사용법

PowerPoint 프레젠테이션

취약점분석보고서 Simple Web Server 2.2 rc2 Remote Buffer Overflow Exploit RedAlert Team 안상환

Research & Technique Apache Tomcat RCE 취약점 (CVE ) 취약점개요 지난 4월 15일전세계적으로가장많이사용되는웹애플리케이션서버인 Apache Tomcat에서 RCE 취약점이공개되었다. CVE 취약점은 W

chap 5: Trees

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

6주차.key

SMB_ICMP_UDP(huichang).PDF

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

Remote UI Guide

기술문서 작성 XXE Attacks 작성자 : 인천대학교 OneScore 김영성 I. 소개 2 II. 본문 2 가. XML external entities 2 나. XXE Attack 3 다. 점검방법 3 라.

Windows Server 2012

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

USER GUIDE

13주-14주proc.PDF

PowerPoint 프레젠테이션

< FC8A8C6E4C0CCC1F620B0B3B9DF20BAB8BEC8B0A1C0CCB5E5C3D6C1BE28C0FAC0DBB1C7BBE8C1A6292E687770>

로거 자료실

untitled

일반적인 네트워크의 구성은 다음과 같다

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

강의 개요

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Windows 8에서 BioStar 1 설치하기

03_queue

Microsoft Word - SKINFOSEC-CHR-026- Mass SQL Injection 탐지 우회분석 보고서.doc

HLS(HTTP Live Streaming) 이용가이드 1. HLS 소개 Apple iphone, ipad, ipod의운영체제인 ios에서사용하는표준 HTTP 기반스트리밍프로토콜입니다. 2. HLS 지원대상 - 디바이스 : iphone/ipad/ipod - 운영체제 :

슬라이드 1

Install stm32cubemx and st-link utility

PowerPoint 프레젠테이션

10.ppt

EDB 분석보고서 (04.06) ~ Exploit-DB( 에공개된별로분류한정보입니다. Directory Traversal users-x.php 4.0 -support-x.php 4.0 time-

1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation

Microsoft PowerPoint - chap06-2pointer.ppt

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

강의10

제1장 Unix란 무엇인가?

Microsoft PowerPoint - web-part03-ch20-XMLHttpRequest기본.pptx

Microsoft Word - Armjtag_문서1.doc

슬라이드 1

Microsoft Word doc

Microsoft PowerPoint APUE(Intro).ppt

커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서

hd1300_k_v1r2_Final_.PDF

Transcription:

연구보고서 10. 10. 31. 작성 취약점분석을위한퍼징 (Fuzzing) 부경대학교 CERT-IS 김연재, 최종학, 신명재 이인회, 이재호, 최자운, 박지환 * 본문서는대학정보보호동아리연합회 (http://www.kucis.org) 의지원을얻어작성된문서입니다. Page 1

Table of Content 1. 서론...4 1.1. Fuzzing 이란?...4 1.2. 연구의배경및목적...5 2. Web Fuzzing...7 2.1. 웹퍼징이란무엇인가?...7 2.2. 공격의유형...7 2.2.a. XSS (Cross Site Script)...7 2.2.b. Injection SQL, parameter...8 2.2.c. Directory Traversal...8 2.2.d. 서버인증우회...9 2.3. 유형별퍼징방법...10 2.3.a. XSS, Injection SQL, parameter...10 2.3.b. Directory Traversal...11 2.3.c. 서버인증우회...12 3. Network Protocol Fuzzing...13 3.1. 네트워크프로토콜퍼징이란무엇인가?...13 3.2. 네이트온프로토콜...13 3.2.a. Notification Server 인증...13 3.2.b. 쪽지전송...15 3.2.c. Session Server 인증...16 3.2.d. 대화...16 3.3. 퍼징방법...17 3.3.a. 메시지조작...17 3.3.b. fuzznateon.py 구현...17 4. File Format Fuzzing...21 4.1. 파일퍼징이란무엇인가?...21 4.2. 퍼징방법...21 4.2.a. FileFuzzer 설계...21 4.2.b. FileFuzzer 구현...22 4.2.c. Info.fdb 분석...24 5. Memory Fuzzing...26 5.1. 메모리퍼징이란무엇인가?...26 Page 2

5.2. 메모리구조...26 5.2.a. Microsoft Windows 메모리모델...26 5.3. 퍼징방법...27 5.3.a. 메모리퍼징을위한방법들...27 5.3.b. 메모리퍼징도구...29 6. 결론...33 6.1. 연구결과...33 6.2. 기대효과및의견...33 7. Reference...34 Page 3

1. 서론 1.1. Fuzzing 이란? 영단어 fuzzing 을사전에서찾으면다음과같다. n., (pl. ~) U 잔털, 솜털, ( 섬유등의 ) 보풀 the fuzz on a peach 복숭아의잔털 구어 고수머리 ; 상고머리 흐림 사진등 미 속어 마약 vi., vt. 보풀이나다 [ 나게하다 ], 부드럽게되다 [ 만들다 ], 훨훨날아흩어지다, 어물거리다, 애매하게하다 ; 미 속어 술취하다 Wisconsin-Madison 대학의연구프로젝트에서처음사용되었으며, 정보보안에서의퍼징은사전에정의되어있지않다. 영단어 fuzzing 으로부터애플리케이션에입력된데이터가보풀을일으키어어떠한특정상태를만든다는의미로해석할수있다. 그래서일반적으로비정상적인데이터를애플리케이션에전달하여에러를유도하는방법을퍼징이라말한다. 비슷한의미의용어로 Blackbox Testing, Taint Analysis, BVA(Boundary Value Analysis) 등이있다. 이중 에서퍼징을가장잘설명하는용어는 Taint Analysis 이다. 이분석방법은오염된데이터가애플리케이 션에입력되어서애플리케이션에서의처리단계별로데이터들을오염시킨다는개념이다. Page 4

그림 1: 퍼징의역사 1.2. 연구의배경및목적 웹과스마트폰의보급이활발해지면서수많은웹 / 응용애플리케이션들이범람하게되었고사용자들은어떠한의심도없이애플리케이션들을사용하고있다. 그래서네트워크 / 시스템해킹이주를이루던과거와는달리, 최근의정보보안은웹 / 응용애플리케이션의취약점을파고드는공격이대세가되었다. 그러나많은애플리케이션개발자들은자신이만든프로그램에어떠한취약점이있는지를완전히파악하지못하고있어서사용자들은여러위험에노출되었거나이미피해를입고있다. 다음의 [ 그림 2] 는트위터와국내보안커뮤니티인버그트럭과보안인, 그리고개발자커뮤니티인 all of software 에서 퍼징을이용하여보안취약점을점검해본적이있으신가요? 라는질문으로설문을한결 과이다. Page 5

그림 2: 퍼징에대한설문결과 (http://hisjournal.net/blog/340) 설문결과에서퍼징을이용하여취약점을점검해본적이없다고응답한비율이전체의 79% 를차지하 고있다. 퍼징은소스검증과더불어취약점을찾는강력한기법중의하나이지만, 아직국내에서는많이 이용되는것같지는않다. 개발자입장에서는퍼징을이용하여개발중인애플리케이션의취약점을미리찾아예방하는게아주중요하다. 이로소제품의신뢰도를잃지않을수있기때문이다. 그리고퍼징에대하여연구함으로써시스템의메모리구조와각종파일들의포맷구조, 애플리케이션의구동과정등을상세히알수있다. 그래서우리는웹, 네트워크, 파일포맷, 메모리에대한퍼징을연구하고가능하면직접퍼징툴을만들어서취약점을점검하는것을목표로삼았다. Page 6

2. Web Fuzzing 2.1. 웹퍼징이란무엇인가? 퍼징은공격대상시스템의보안취약점을탐지하기위하여목표애플리케이션에대한다양한입력값을전송하는결함주입에근거한다. 이기술을사용할때목표애플리케이션의입력값검증을우회하며동시에보안취약점을탐지할수있도록입력값을변경하는것이중요하다. 퍼징기술은 SQL injection, Cross Site Scripting(XSS) 등과같은보안취약점의유형을탐지한다. 2.2. 공격의유형 2.2.a. XSS (Cross Site Script) XSS는다른사용자의정보를추출하기위해사용되는공격기법이다. 간단히예를들면게시판이나검색부분, 즉사용자의입력을받아들이는부분에스크립트코드를필터링하지않음으로써공격자가스크립트코드를실행할수있게되는것이다. 그림 3: XSS 공격기법 [ 그림 3] 은실제 XSS 취약점을이용하여다른사용자의쿠키값을훔쳐그사용자로로그인하는과정을 순차적으로표현한것이다. Page 7

2.2.b. Injection SQL, parameter SQL Injection은웹페이지를통해입력된파라미터값을이용하여쿼리를재구성하는방법이다. 많은웹페이지들은사용자나프로그램이생성한파라미터값을이용해쿼리를만들고실행하는데, 이때정상적인값이아닌파라미터값이입력될때비정상적인쿼리가실행되며, 따라서원하지않는결과가나올수있다. String param1 = request.getparameter ("user_id"); String param2 = request.getparameter ("user_pass"); rs = stmt.excutequery ("SELECT count(*) FROM user_t WHERE userid = '"+param1+"' AND userpw = '"+param2+"'"); rs.next (); if (rs.getint (1) == 1) { // 로그인성공 } else { // 로그인실패 } 예제 1: SQL Injection에취약한로그인인증코드 [ 예제 1] 에서입력된데이터가 ' or 1=1 'or 1=1 이라면, 1=1 은무조건참이므로 SQL 문은항상참이 다. 2.2.c. Directory Traversal 경로를거슬러올라가서관리자가유저에게보일생각이없는파일이나디렉터리를열람하거나실행 시키는공격이다. [ 그림 4] 처럼 httpd.conf 파일에서 Indexes 옵션을제거하지않고디렉토리리스팅을허용할경우, 사 용자에게노출되서는안될파일들이노출된다. Page 8

그림 4: Directory Traversal 2.2.d. 서버인증우회 인증설정중에 Limit 속성으로메소드를제한할수있는데, 일반적으로 GET 메소드와 POST 메소드만을설정한다. 이럴경우인증이 GET, POST 메소드만적용이되므로그이외의메소드를사용하면인증을우회할수있게된다. 메소드종류 OPTIONS - 서버에서어떤메소드를지원하는지볼수있다. HEAD - 웹서버의 HEADER을보여준다. PUT - 지정된 URL에전달된자료를저장한다. DELETE - 지정된리소스를삭제한다. TRACE - 클라이언트가송신한 request를그대로리턴한다. Page 9

그림 5: GET -> OPTIONS 메소드로로그인인증우회 2.3. 유형별퍼징방법 2.3.a. XSS, Injection SQL, parameter (1) 해당서버의 80 번포트에접속하여 form 태그를 parsing 하여전송할파라미터의이름 (Parameter_name) 과목적지페이지 (DEST), 전송방법 (GET/POST) 을찾아낸다. <FORM method=[get/post] action=[dest]> <input type=text name=[parameter_name]> </FORM> 예제 2: 페이지내의 FORM 태그 (2) GET 방식의경우는아래와같은형식으로패킷을생성한뒤목적지페이지를 GET 방식으로요청한 다. 각파라미터의값은 sql 이나 >XSS 와같은에러가발생할만한데이터를넣는다. GET DEST?[Parameter_name]= sql /HTTP/1.1 HOST : DEST 예제 3: GET 방식요청 Page 10

(3) POST 방식은미리생성한아래와같은형식으로패킷을생성하며, [BODY] 부분의길이를구하여 Content-Length 에명시하고 POST 방식을써서웹서버에 DEST 페이지를요청한다. 각파라미터의값은 GET 방식처럼 sql 이나 >XSS 와같은에러가발생할만한데이터를넣는다. <HEADER> POST DEST HOST : DEST Content-Length : 00 <BODY> [Parmeter_name]= sql... 예제 4: POST 방식요청 (4) 요청후전송되어온패킷을분석하여 HTTP 헤더가 200 OK 를포함하면적절한에러핸들링이된 것이고 400, 403, 500 에러를포함하면취약점이있다고판단한다. 혹은응답받은페이지내에 XSS 와같은삽입한데이터가포함되면 XSS 취약점이있다고판단한다. 2.3.b. Directory Traversal 요청홈페이지에서보내온데이터를분석하여 [ 표 1] 의문자열을포함하면취약점이있다고판단한다. 혹은 Google 에서해당홈페이지의 URL 을 intitle 옵션으로 [ 표 1] 의문자열을검색하여판단할수있다. 웹서버 IIS Tomcat Apache 기타 디렉토리노출패턴 Parent Directory, Directory Listing Directory Listing Index of/ 표 1: 웹서버별디렉토리노출패턴 Page 11

2.3.c. 서버인증우회 (1) POST, GET 이외의메소드 (PUT, OPTIONS, HEAD 등 ) 로해당페이지를요청해본다. (2) 요청후전송되어온패킷을분석하여 HTTP 헤더가 200 OK 를포함하면해당메소드로요청시인 증우회가가능할것으로판단한다. Page 12

3. Network Protocol Fuzzing 3.1. 네트워크프로토콜퍼징이란무엇인가? 네트워크프로토콜퍼징은서버의데몬을대상으로하여조작된패킷을전송하는것을말한다. 서버의데몬은소켓을통하여클라이언트와통신을하는어플리케이션이다. 클라이언트에서서버로보낸메시지는데몬에서받아서파싱을한후, 연산처리가된다. 그리고필요에따라서데몬은다시클라이언트에게메시지를보내기도한다. 클라이언트 서버데몬 GET / HTTP%n%n%n%n1.1 파싱 연산 응답 그림 6: 클라이언트와서버데몬 데몬역시사람이만든어플리케이션인데다, 클라이언트로부터받은메시지를파싱하는과정, 즉사용 자의입력이라는과정을거치므로취약점이존재할수있다. 그렇기때문에네트워크프로토콜퍼저는 클라이언트의입장에서메시지를조작하여소켓을통해서버로전송한다. 3.2. 네이트온프로토콜 3.2.a. Notification Server 인증 네이트온은 Update Server, Dispatch Server, Notification Server 와 Session Server 이렇게 4개의서버를통해 TCP 통신이이루어진다. Update Server 는네이트온메신저가실행될때처음접속되는서버로, 메신저의버전확인과업데이트를처리한다. Dispatch Server 는네이트온의서버에과부하가걸리는것을방지하기위해사용자들을분산시키는역할을한다. 실제로네이트온에접속하기위해서는 Notification Server( 이하 NS) 를통해야한다. NS 를통해인증을받기위해서는먼저 ssh 티켓을받아야한다. https://nsl.nate.com/clien t/login.do?id=[id]&pwd=[passwd] 으로접속하면응답메시지로받을수있다. Page 13

메시지 LSIN [ 트렌젝션번호 ] [id] [ticket] [ 기타정보들 ]\r\n GLST [ 트렌젝션번호 ] [ 그룹번호 ]\r\n LIST [ 트렌젝션번호 ]\r\n INFY [ 트렌젝션번호 ] [ 친구 id] [ 친구상태 ]\r\n PING [ 트렌젝션번호 ]\r\n 설명사용자인증그룹리스트요청친구리스트요청접속중인친구알림연결상태확인 표 2: 인증에필요한메시지들 [ 표 2] 는인증을위해서버와클라이언트간에주고받는메시지들이다. 이들메시지는 TCP 소켓으로 통신이이루어진다. LSIN 은실제사용자인증을위한메시지이다. 파라미터로트렌젝션번호, 사용자계정의 ID, 방금전 받은 ssh 티켓, 인코딩방식정보, 클라이언트의빌드넘버, 문자열인코딩방식정보등이넘겨진다. 인 증이제대로이루어지면아래와같은응답메시지를받을수있다. LSIN [ 트렌젝션번호 ] [ 클라이언트 ID] [ 실명 ] [ 대화명 ] [ 휴대폰번호 ] [unknown] [SMS 인증코드 ] [ 미니홈 ID] [unknown] [unknown] [unknown] [unknown] [ 사용자계정 ID] [email] [unknown] [ 통서비스사용여부 ] [unknown] [ 국가 ] [unknown] [unknown] [unknown]\r\n 예제 5: NS에접속하기위한 LSIN 메시지 GLST 는그룹리스트를요청하는메시지이고, LIST 는친구리스트를요청하는메시지이다. 사실상그 룹리스트는필요없고, 유저리스트를받아야실제로인증이이루어진다. 인증이이루어지면, INFY 응답 메시지를받을수있다. 인증이완료되면서버는클라이언트에게 10 초주기로 PING 메시지를보낸다. 서버가 PING 메시지를 8 번보내는동안클라이언트에서응답이없으면, 서버가강제로소켓을닫아서연결이끊어지게되어있 다. Page 14

3.2.b. 쪽지전송 메시지 CMSG [ 트렌젝션번호 ] N [ 쪽지의길이 ]\r\n [ 친구의계정 ID]\r\n IMSG\r\n title:[ 쪽지의제목 ]\r\n from:[ 사용자의계정 ID]\r\n ref:[ 친구의계정 ID]\r\n data:[ 현재연도, 날짜, 시간 ]\r\n session_id:\r\n uuid:\r\n contenttype:\r\n length:[ 쪽지내용의길이 ]\r\n font-name:\r\n font-style:\r\n font-size:\r\n font-color:\r\n ref-uuid:\r\n cookie:\r\n event:nw\r\n \r\n [ 쪽지의내용 ]\r\n 설명 쪽지전송 표 3: 쪽지전송에필요한 CMSG 메시지 쪽지를전송하기위해서는 [ 표 3] 과같이 CMSG 메시지 NS 소켓으로보낸다. 쪽지의전송이성공적으 로이루어지면, 아래와같은응답메시지를받을수있다. CMSG [ 트렌젝션번호 ]\r\n 예제 6: 쪽지전송이성공적일때의응답메시지 Page 15

3.2.c. Session Server 인증그룹 / 유저리스트를받아오거나쪽지를보내는것은 NS에서처리되지만, 대화와파일전송은 Session Server( 이하 SS) 에서통신이이루어진다. SS에접속하려면 NS에서 RESS 메시지를전송해 야한다. RESS [ 트렌젝션번호 ]\r\n 예제 7: NS 에접속하기위한 RESS 메시지 [ 예제 7] 과같이 RESS 메시지를 NS 로보내면서버로부터 RESS 메시지를응답받는다. 메시지 RESS [ 트렌젝션번호 ] [ip] [port] [ticket]\r\n 설명 사용자인증 표 4: 서버로부터응답받은 RESS 메시지 서버로부터응답받은 RESS 메시지에는 [ 표 4] 처럼 SS 의 IP 와 Port, 대화에필요한티켓이있다. 3.2.d. 대화 SS 는사용자와사용자사이에세션을연결해주는역할을한다. 다른사용자와대화 (Chatting) 를하기 위해서는이 SS 에접속하고상대방을초대해서세션을연결해야한다. 메시지 ENTR [ 트렌젝션번호 ] [account] [nickname] [ticket] [ 기타정보들 ]\r\n CTOC [ 트렌젝션번호 ] [target] [unknown] [payload 길이 ]\r\n INVT [account] [ip] [port] [ticket]\r\n MESG [ 트렌젝션번호 ] [state] [ 메시지 ]\r\n QUIT [ 트렌젝션번호 ]\r\n 설명대화세션입장데이터전송대화세션초청메시지전달대화세션종료 표 5: 대화에필요한메시지들 Page 16

먼저, 사용자는 ENTR 메시지로대화세션에입장을해야한다. 이때필요한것이 RESS 메시지로부터받은티켓이다. 대화세션에입장했으면상대방을초청하기위해서 CTOC 메시지로상대방에게 INVT 데이터를전송한다. CTOC 메시지는상대방에게데이터를전송하는메시지로데이터의길이를알아야한다. INVT 는메시지가아니라데이터이다. 그래서트렌잭션번호는필요없다. INVT 데이터에도 RESS 메시지로부터받은티켓이필요하다. 상대방과대화세션이연결되면 MESG 메시지로메시지를전달할수있고, QUIT 메시지로대화세션을 닫을수도있다. 3.3. 퍼징방법 3.3.a. 메시지조작 메시지의조작, 즉패킷의조작은여러가지방법으로이루어진다. (1) 단순히메시지의순서를무작위로섞거나 null 문자를삽입하거나 % 인코딩을이용하기도한다. 이러한방법은흔히 TCP 나 UDP 윗단의애플리케이션계층의프로토콜을퍼징할때이용된다. 실상, 대부분의서버데몬들은어플리케이션층에서동작하므로이러한방법들만으로도퍼징의효과를볼수있다. TCP, UDP 소켓을이용하여퍼징을할때는퍼징의대상으로삼을서버의프로토콜에대한이해정도가가장중요하다. 프로토콜의이해가없으면퍼징은무의미하기때문이다. 예를들어서서버의데몬은 MESG 라는메시지만을파싱하여연산처리를한다고가정을한다면, 퍼저가아무리수많은종류의패킷을보내더라도 MESG 라는단어가포함되어있지않아서데몬은이패킷을무시할수있기때문이다. (2) 더깊이들어가기위해서는로우소켓을이용하여 TCP, UDP 헤더를직접조작하거나 IP 계층까지도조작하여퍼징을해야한다. 로우소켓을이용하는방법은 TCP, UDP 소켓을이용하는방법보다더까다롭고네트워크장치를직접다루기때문에 OS의권한문제도해결해야하지만, 어플리케이션계층의프로토콜이아닌패킷그자체를직접퍼징하기때문에더좋은결과를낼수있다. 하지만이방법은프로토콜퍼징이라기보다는네트워크자체에대한퍼징으로간주해야한다. 3.3.b. fuzznateon.py 구현 #!/usr/bin/python # -*- coding:utf-8 -*- import sys Page 17

import urllib import getpass from protofuzz import * ns_host = "211.234.240.140" ns_port = 5004 print "==================================================================" print "" print "[+] Fuzzing NateOn" print "[+] This script was written by 6l4ck3y3 (@6l4ck3y3)" print "" account = raw_input ("[+] account: ") passwd = getpass.getpass ("[+] passwd: ") target = raw_input ("[+] target: ") print "" print "==================================================================" print "" # Authentication for NS u = urllib.urlopen ("https://nsl.nate.com/client/login.do?id=" + account + "&pwd=" + passwd) ns_ticket = u.read ().split ('\r\n')[1] ns = protofuzz (ns_host, ns_port) ns.sendmsg ("LSIN 0 " + account + " " + ns_ticket + " SSL") ns.sendmsg ("LIST 0") # Authentication for SS ns.sendmsg ("RESS 0") recv = ns.getmsg ().split ('\r\n')[0].split (' ') ss_host = recv[2] ss_port = recv[3] ss_ticket = recv[4] ss = protofuzz (ss_host, int (ss_port)) # Chat ss.sendmsg ("ENTR 0 " + account + " %00 %00 " + ss_ticket + " UTF8 P") ns.fuzzmsg ("CTOC 0 " + target + " A 4096\r\nINVT " + account + " " + ss_host + " " + ss_port + " " + ss_ticket) Page 18

ss.close () ns.close () 예제 8: fuzznateon.py [ 예제 8] 은분석한네이트온프로토콜을바탕으로 whitespace 나 \r\n 등을기준으로메시지내용을 쪼개어서각데이터에에러가발생할만한쓰레기데이터를삽입하는방법을이용하는예다. 그림 7: CTOC + INVT 에대한퍼징수행 [ 예제 8] 에서는 CTOC 메시지와 INVT 데이터조합에대해서만퍼징을시도하지만, 통신에이용되는모 든메시지에대해서 fuzzmsg() 메소드를적용할수있다. Page 19

그림 8: 퍼징중에소켓에러발생 Fuzzer 를돌리면서서버로부터에러코드가반환되거나소켓에러가발생하면퍼징이성공하였다고판 단한다. 그러나그것이바로취약점이라고단정할수는없다. 네이트온의경우는메시지가부정확하다 고서버가판단하면자동으로소켓을닫아버리기때문에그런경우에도소켓에러가발생한다. Page 20

4. File Format Fuzzing 4.1. 파일퍼징이란무엇인가? 문서편집기, 동영상재생기, 압축프로그램, 토렌트클라이언트등등의많은애플리케이션들은파일을읽고파싱하고메모리에읽어들여서처리한다. 각파일들은자체의포맷을가지고있고애플리케이션은그포맷에맞추어서파싱을한다. 이런과정에서애플리케이션은취약점을가질수있다. 포맷만봐서는정상적인파일이지만, 그내부에에러를발생할만한쓰레기코드가숨을수있다. 파일퍼징은이러한취약점을유발할수있는쓰레기코드가존재할수있는지를검사하는작업이다. 4.2. 퍼징방법 4.2.a. FileFuzzer 설계 그림 9: FileFuzzer Prototype [ 그림 9] 와같이 FileFuzzer 는여러개의프로세스를만들고그자식프로세스들은 User_dll.dll 의몇 가지의함수로파일을변경하면서타겟프로세스를디버거로동작함으로써예외상황의발생을감지하 고예외가발생하였을경우그때의파일과정보를저장한다. Page 21

4.2.b. FileFuzzer 구현 int main( int argc, char **argv ) { if( argc < 2 ) return 0; FILE *fs; fs = fopen( argv[1], "r" ); char buf[ 64 ]; fgets( buf, 1024, fs ); printf( buf ); } fclose( fs ); return 0; 예제 9: test.exe 퍼징프로그램을테스트하기위해 [ 예제 9] 와같은프로그램을설계한다. 물론의도적으로 buf 의크기 는 64byte 로, 읽어들이는크기는 1024byte 로설정하여버퍼오버플로우가일어날수있도록한다. 그림 10: test.exe 파일이정상적이라면 [ 그림 10] 처럼동작을할것이다. extern "C" declspec(dllexport) int ChangeFile() { /* at this time you can change file for attack */ /* return value is used for time to die */ Page 22

/* if return 0, fuzzer is end other is wait return value and die */ HANDLE hattackfile; DWORD dwwrited; char data[] = "0123456789"; hattackfile = CreateFileA( attackfilepath, GENERIC_READ GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL FILE_FLAG_WRITE_THROUGH, NULL ); } SetFilePointer( hattackfile, 0, 0, FILE_END ); WriteFile( hattackfile, data, sizeof(data)-1, &dwwrited, NULL ); CloseHandle( hattackfile ); if( count-- ) return (2000); return 0; 예제 10: Default_dll.dll 그리고 [ 예제 10] 과같이 dll 에함수를 export 한다. 반환되는값은프로그램을실행시키고얼마나대기 할것인가를나타낸다. 따라서 2 초동안대기하고그시간안에예외가발생하지않는다면정상실행으 로판단하고종료시킨다. count 는초기값이 5 로정해져있고저값으로인해서 5 번만반복하고종료한다. 그림 11: FileFuzzer 실행화면 Page 23

[ 그림 11] 처럼퍼저가실행되면 info.fdb 라는파일이생성되고 info.fdb 에간단한정보가기록된다. typedef struct _SAVE_INFO{ char dllinfo[ MAX_PATH ]; unsigned int info_size; } SAVE_INFO, *PSAVE_INFO; typedef struct _DEFAULT_INFO{ unsigned int result; unsigned int file_size; } DEFAULT_INFO, *PDEFAULT_INFO; typedef struct _CUSTOM_INFO{ int cbsize; } CUSTOM_INFO, *PCUSTOM_INFO; 표 6: info.fdb 의구조 info.fdb 의구조는 [ 표 6] 과같다. CUSTOM_INFO 값은 dll 에서제공해야지만, 제공하지않을것이기때 문에그크기는항상 0 으로정해져있다고볼수있다. 4.2.c. Info.fdb 분석 그림 12: HexEditor 이용해서본 info.fdb 의내용의일부 [ 그림 12] 는 Filefuzzer 가수행되고생성된 info.fdb 의데이터이다. 0x104 에서 dll 이름이끝나고, 그다음값인 info_size의값이항상 8byte 라는것을확인할수있다. 그다음은 DEFAULT_INFO 구조체이고, 첫번째값인 result 는 0xC0000005 로서메모리접근위반으로프로그램이죽었다는것을알수있다. 그리고그때의파일크기는 0x0000004B ( = 75d ) 이고, 이파일은 DEFAULT_INFO 구조체가끝나고 CUSTOM_INFO.cbSize 다음에위치해있다. 따라서 75byte 만큼의크기라는것을알수있다. Page 24

"Hello World!!"012345678901234567890123456789012345678901234567890123456789 예제 11: 에러를발생할만한데이터 따라서 [ 예제 11] 의데이터로파일을만들어준후실행을해보면 [ 그림 13] 과같은결과를볼수있다. 그림 13: 에러발생확인 Page 25

5. Memory Fuzzing 5.1. 메모리퍼징이란무엇인가? 프로토콜이나파일포맷과달리좀더기본적인소스코드에초점을맞춘작업이며, 보통소스검증과병행되는작업이다. Taint Analysis라고도불리우고, 데이터통신보다타겟프로그램의메모리에존재하는변이되어생성되는데이터들에초점을맞추어작업을진행해나가야한다. 5.2. 메모리구조 5.2.a. Microsoft Windows 메모리모델 그림 14: Windows 메모리맵 Windows 95 이래로 32-bit 플랫폼에서는총 4GB 의주소메모리를제공하고있다. 이 4GB 의메모리는 Kernel 영역과 User 영역으로나뉘어져있으며일반적으로 3:1 의비율로 3GB 는 User 영역, 1GB 는 Page 26

Kernel 영역으로나누어진다. 이에대한자세한설정은 boot.ini 에서설정이가능하다. 이러한메모리에는각각의권한이존재하는데, Windows 에서는다음과같은권한을제공한다. PAGE_EXECUTE PAGE_EXECUTE_READ PAGE_EXECUTE_READWRITE PAGE_NOACCESS PAGE_READONLY PAGE_READWRITE PAGE_GUARD 5.3. 퍼징방법 5.3.a. 메모리퍼징을위한방법들 메모리의퍼징을위해서크게두가지의방법론이존재한다. 변조된반복문의삽입 (Mutation Loop Insertion) 그림 15: Method: Mutation Loop Insertion Page 27

스냅샷과변조된영역의복구 (Snapshot Restoration Mutation) 그림 16: Method: Snapshot Restoration Mutation 메모리에서의퍼징을위해서다음과같은단계가필요하다. 디버거 (debugger) 변수들의초기화 프로세스를디버거에붙임 후킹을설정 Entry point에서의메모리상태를저장 프로세스에존재하는함수인자값들의메모리접근을모니터하고주소를저장 프로그램이종료지점에도달했을경우저장된상태로되돌림 virtual_alloc() 을이용하여 fuzz 문자열이나버퍼의공간을할당한다. 함수인자값들을 fuzz data로변경한다. 스택을관찰한다. 기다린다... [ 그림 17] 은 Fuzzing Routine 을개략적으로나타낸그림이다. Page 28

그림 17: Fuzzing Routine 5.3.b. 메모리퍼징도구 (1) Linux 의 /dev/urandom 을이용하여임의랜덤값으로퍼징을수행할수있다. (2) python 을이용한프레임워크인 PyDbg 로퍼징을수행할수있다. #!c:\python25\python.exe from pydbg import * from pydbg.defines import * import time import random snapshot_hook = 0x77143540 restore_hook = 0x77143540 snapshot_taken = False hit_count = 0 Page 29

address = 0 def set_entry(pydbg): return 1 def handle_bp(pydbg): global snapshot_hook, restore_hook global snapshot_taken, hit_count, address if pydbg.first_breakpoint: return DBG_CONTINUE print "ws2_32.recv() called from thread %d @%08x" % (pydbg.dbg.dwthreadid, \ pydbg.exception_address) context_dump = dbg.dump_context(stack_depth=4, print_dots=false) print context_dump if pydbg.exception_address == snapshot_hook: hit_count += 1 print "hit the snapshot address" start = time.time() print "taking snapshot..." pydbg.process_snapshot() end = time.time() - start print "snapshot took: %.03f seconds\n" % end if hit_count >= 1: if address: print "freeing last chunk" print "%08x" % address pydbg.virtual_free(address, 1000, MEM_DECOMMIT) print "allocating memory for mutated data" address = pydbg.virtual_alloc( None, 1000, MEM_COMMIT, PAGE_READWRITE) print "Allocated 1000 bytes at: %08x" % address return DBG_CONTINUE def handle_av (pydbg, dbg, context): Page 30

''' As we are mucking around with process state and calling potentially unknown subroutines, it is likely that we may cause an access violation. We register this handler to provide some useful information about the cause. ''' crash_bin = utils.crash_binning.crash_binning() crash_bin.record_crash(dbg) print crash_bin.crash_synopsis() dbg.terminate_process() if name == ' main ': dbg = pydbg() dbg.set_callback(exception_breakpoint,handle_bp) dbg.set_callback(exception_access_violation, handle_av) found_target = False for (pid, proc_name) in dbg.enumerate_processes(): #print proc_name.lower() if proc_name.lower() == "nateonmain.exe": found_target = True print "[+] Found Target:\"%s" %proc_name.lower() break if found_target: dbg.attach(pid) print "[+] Attached to :" + str(pid) dbg.bp_set(snapshot_hook) dbg.bp_set(restore_hook) print "[+] Hooks set, entering debug loop..." dbg.debug_event_loop() else: print "Target not found\n" 예제 12: PyDbg (3) 보안연구자들은 2007 년에드라이버의많은취약점들을발견했다. 그중하나가 IOCTL 드라이버 Page 31

핸들러의취약점이다. 이문제는디바이스드라이버의 IOCTL 핸들러내부에충분하지못한주소공간검 사에의해발생한다. 이러한취약점들을퍼징을통해서점검할수있다. 현재까지 ioctlizer, Win32 IOCTL fuzzer 들이공개되었다. HANDLE WINAPI CreateFileW( LPCTSTRlpFileName, DWORD dwdesiredaccess, // GENERIC_READ(0x80000000) or GENERIC_WRITE(0x40000000) DWORD dwsharemode, // Set to 0 LPSECURITY_ATTRIBUTES lpsecurityattributes, // Set to NULL DWORD dwcreationdisposition, // OPEN_EXISTING(0x3) DWORD dwflagandattrinutes, // Set to 0 HANDLE htemplatefile // Set to NULL ); 예제 13: CreateFileW 와입력될파라미터들 BOOL WINAPI DeviceIoControl ( HANDLE hdevice, // CreateFileW 에서구한 Handle DWORD dwiocontrolcode, // IOCTL code LPVOID lpinbuffer, // buffer DWORD ninbuffersize, LPVOID lpoutbuffer, DWORD noutbuffersize, LPDWORD lpbytereturned, LPOVERLAPPED lpoverlapped // Set to NULL ); 예제 14: DeviceIoControl 과입력될파라미터들 CreateFileW 를이용하여 kernel32.dll 의핸들을구하고, DeviceIoControl 를이용하여핸들을 IOCTL 아 래로보낸다. 해당작업을수행할디바이스에게 Device Driver 제어코드를직접전송한다. Page 32

6. 결론 6.1. 연구결과 퍼징은두가지형태로수행될수있다. 첫째는무작위랜덤으로값을애플리케이션에입력하는방법이다. 가장확실한방법이지만, 그만큼비효율적인방법이기도하다. 두번째는포맷에맞는데이터를부분씩수정하여애플리케이션에입력하는방법이다. 이방법은앞의방법보다효율적이지만, 놓칠수있는패턴이존재할수있고, 우선적으로포맷에대한분석이수행되어야한다. 애플리케이션에에러가발생할만한데이터가입력되면데이터처리중에에러가발생한다. 애플리케이션은시스템에에러메시지를보낼것이고, Fuzzer는이에러메시지를얻어서퍼징의성공여부를판단한다. 퍼징의자세한결과를확인하기위해서는시스템의메모리를덤핑하여서분석해볼수있다. 만약애플리케이션이서버와클라이언트로구성된다면, 클라이언트측에 Fuzzer를, 서버측에 Analyser 를두어서퍼징을수행하는환경을구축할수도있을것이다. 6.2. 기대효과및의견 서론에서밝혔듯이국내에서의퍼징의활용도는저조한편이었다. 그래서인지퍼징에대한자료가국내에너무부족하였다. 대부분의자료들은영문문서이고, 공개된퍼징툴들역시외국에서개발된것들이대부분이었다. 그래서이문서가퍼징 (Fuzzing) 에처음입문하는이들에게자그마한도움이되기를바란다. 그리고원래우리동아리가퍼징을주제로프로젝트를시작한것이아니었다. 처음에는 CUDA를이용한병렬화와암호공격 이주제였다. 그러나 CUDA를이용하기위한환경을구축할수없어서난관에봉착하였고 KUCIS 측에지원이가능한가에대하여문의를하였지만, 하드웨어에대한지원이어려운형편이었다. 그래서늦게나마 취약점을찾기위한 fuzzing 기술의구현 이라는주제로변경하게되었다. 앞으로는하드웨어에대한지원이확충되어서이후다른동아리에서도작업환경때문에프로젝트주제가변경되는일이없어졌으면한다. Page 33

7. Reference Windows Internals 5th Edithon - Russinovich, Solomon Gray hat Python -Justin Seitz Fuzzing, Brute Force Vulnerability Discovery - Michael Sutton, Adam Greene, Pedram Amini Attacking Antivirus - Feng Xue, 번역 Vangelis 열혈강의웹헵킹과방어 - 최경철 Taint analysis for vulnerability discovery - passket Fuzzing for software vulnerability discovery - Toby Clarke Building Secure Software using Fuzzing and Static Code Analysis - Anna-Maija Juuso In Memory Fuzzing :: http://thatsbroken.com/?p=282 - jrichards Automated Penetration Testing with White-Box Fuzzing :: http://msdn.microsoft.com/enus/library/cc162782.aspx - John Neystadt MSDN Library :: http://msdn.microsoft.com/en-us/library Page 34