본문 바로가기
Wargame/FTZ

FTZ level3 풀이 복기

by 맑은청이 2020. 11. 17.
728x90
반응형

1. 문제 파악

 

이 문제 에서는 system() 함수에 대한 기본 지식이 필요하다. 

system() 함수는 시스템에 명령을 실행할 때 사용하는 함수이다. 

이 함수는 또 대부분의 프로그래밍 언어에 존재한다. 

즉 반드시 필요한 함수라고 볼 수 있다. 

 

일단 dig와 nslookup에 대해 알아보자.

nslookup은 도메인 서버의 IP 주소를 확인하는 프로그램이다. 

nslookup의 기본 사용 법은 크게 두 가지로 이루어진다.

 

1) nslookup <IP를 알고 싶은 도메인 주소>

2) nslookup IP를 입력한 후IP를 알고 싶은  도메인 주소 입력

 

dig 는 nslookup과 동일하게 IP주소를 확인하는 프로그램이지만 기본적으로 유닉스 계열 운영체제에 탑재되어 있다. 

 

dig는 "@쿼리할 DNS 서버의 IP"옵션을 명령어 사용 시 입력해야한다는 점이다. 최신 버전 dig 에서는 삭제해도 된다.

nslookup과의 차이는 조금 더 자세하다는 것이다 .

 

힌트에 제공된 소스코드의 흐름은 다음과 같다.

1. 먼저 "dig@" 라는 문자열을 cmd 배열에 넣는다.

2. "dig@" 문자열 뒤에 autodig 명령어 다음에 입력된 문자열을 붙인다. 

3. 두번째 strcat 으로 해당 문자열을 명령에 옵션으로 집어넣는다. 

 

-> 입력받은 문자열에 해당하는 DNS서버에서 운영중인 BIND 프로그램 버전을 확인

-> 하지만 요즘에서 BIND 설정에서 이와 같은 버전 요청을 회신하지 않게 설정한다. 즉 취약하지 않은 서버가 아니라면 회신이 없을 것. 

 

 

 


2. 문제 분석 

 

일단 취약한 파일을 찾아야하는데 여기서는 두가지 방법이 있다. 일단 autodig 라는 파일명을 알고 있으니 이걸로 검색하거나 이때까지 했던 거 처럼 파일의 권한으로도 찾을 수 있다. 

 

두 개 다 똑같은 결과가 나온다. 

 

 

자 이제 공격해야 할 파일을 찾았으니 앞에서 이야기 한 내용들로 파일을 실행해보자.

 

동일한 값이 나오는 걸 볼 수 있다. 

 

그럼 GDB로 리버싱을 통해 소스코드를 분석해보자.

 

 

 

스택을 구성하고 argc 가 2 가 아니면 에러 메시지 출력 

프린트하는 문자열을 보면 아래와 같이 나오는데 이는 힌트로 준 소스코드를 보면 if 안이라는 걸 알 수 있다. 

 

 

2랑 비교 한다는 걸 볼 수 있다. 

브레이크 포인트를 걸고 strcat 안에 들어가는 값을 보면 "dig @192.168.169.2" 가 들어가있다.  이게 시스템 값으로 들어가게 된다. 

 

 

setreuid(3004,3004) 로 호출한다. 그럼 이 /bin/autodig가 실행되는 동안에 level4가 되게 만드는 거다. 

즉 system("dig @168.126.63.1 version.bind chaos txt")라는 코드가 실행되면서 해당 주소에 대한 BIND 프로그램의 버전을 조회한다. 

 

리버싱을 통해 분석한 결과 코드는 힌트로 준 원본 C 소스코드와 동일한 걸 알 수 있다.

 

 


3. 공격해보기

 

hint 를 보면 더 많은 힌트에 '더 많은 명령어' 부분이 있다. 리눅스 셸에서 문자열을 어떻게 전달하는지 생각해보면 쉽게 풀어볼 수 있다. 

 

두개 이상의 명령어를 보내야하는데 argc 의 인자가 첫번째만 처리하기 때문이다. 

그러면 두개의 인자를 동시에 전달할 수 있는 방법은 무엇일까? 

 

"" 로 묶어주면 하나의 인자로 전달하고 이를 내부적으로 문자열 조합 과정을 거치면서 두 개 다 보이는 걸 알 수 있다.

 

또 입력값이 안니 유닉스 계열 서버에서 실제로 실행될 수 있는 명령어를 연속해서 전달하려면 ';' 을 사용하면 된다. 셸에서 명령어를 한줄에 연속해서 적을 때 이용가능하고 system() 에도 동일하게 적용된다.

 

  권한을 통해 이 파일이 우리의 목적에 부합하는 파일이라는 것을 알 수 있다. 

자 답을 찾았다!

 

하지만 셸을 따는 게 최종 해킹 목적이기 때문에 sh 명령어를 사용해보자 

 

 

좋다. 하지만 매번 autodig 를 이용해야한다는 번거로움이 있다. 그래서 오늘은 백도어 셸을 만드는 방법도 소개한다. 


해당 코드를 작성해준다.

 

 

보면 여전히 동일하게 level4의 권한을 얻을 수 없는 것을 볼 수 있다. 이는 SUID 를 해주지 않았기 때문이다.

 

권한이 변한것을 확인 할 수 있다. 

 

 

아래를 보면 level1 에서도 level4 권한으로 셸을 실행하는 것을 볼 수 있다. 백도어는 굉장히 유용하다. 

   

728x90
반응형

'Wargame > FTZ' 카테고리의 다른 글

FTZ level4 복기  (0) 2020.11.18
FTZ level2 풀이 복기  (0) 2020.11.12
해커스쿨 FTZ trainer1~10 정리  (0) 2020.08.05