본문으로 바로가기

해커스쿨 FTZ level3

category Wargame/FTZ 2017. 7. 31. 14:23

level3 --- can you fly?

 

 

우선 level3 디렉토리의 hint 파일을 보자.

 

 

 

 

 

우선 hint를 보면 dig라는 명령어가 나온다. 만일 dig를 처음 접한다면 nslookup을 생각해보자.

 

nslookup에 대하여 알아보자. nslookup은 도메인 서버의 IP주소를 확인하는 프로그램으로, 윈도우 운영체제에도 있다.

nslookup의 사용법은 크게 두가지로 나누어 진다.

nslookup <IP를 알고 싶은 도메인 주소>의 형태가 첫번째 방법이다.

 

 

 

 

위와 같이 www.naver.com의 IP 주소가 125.209.222.142와 125.209.222.141 이라는 것은 뽑아올 수 있다.

 

nslookup을 입력한후 IP를 알고 싶은 도메인 주소를 입력하는 형태가 두번째 방법이다.

 

 

 

dig에 대해서 알아보자. dig는 nslookup처럼 도메인의 IP주소를 확인할 수 있는 명령어이다. nslookup보다 더욱 상세하고 자세한 정보를 알 수 있다. dig은 사용법은 dig @<쿼리할 DNS> <서버의 IP>와 같이 사용하면 된다.

 

 

 

간단히 dig와 nslookup의 사용법에 대하여 알아보았으니 이제 hint의 소스코드를 분석해 보자.

 

소스코드의 흐름을 보면 아래와 같다.

 

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

2. "dig @"라는 문자열 뒤에 autodig 다음에 입력된 문자열을 붙여 넣는다.

3. "dig @<입력된 문자열>" 뒤에 "version.bind chaos txt"라는 문자열을 붙여 넣는다.

 

즉 autodig는 입력받은 문자열에 해당하는 DNS서버에서 운영 중인 BIND 프로그램의 버전을 확인하는 명령을 실행하는것이다. 즉, 해당 서버가 취약학 버전을 운영중인지 확인할 수 있는 것이다. 그러나 요즘  BIND 설정에서 autodig와 같은 버전 요청에 회신을 하지 않도록 설정되어 있어서 취약한 DNS 서버가 아니라면 BIND 버전에 대한 회신이 없다.

 

이제 문제를 풀어보자.

 

우리가 공격할 대상을 찾아야 하는데 autodig라는 파일명으로 찾을 수 있고 파일의 권한으로도 찾을 수 있다.

 

 

공격할 대상 파일을 찾았다. 따라서 소스코드 분석을 바탕으로 파일을 실행해 보자.

 

우리의 예상의 정확하다면 /bin/autodig 168.126.63.1 과 dig @168.126.63.1 version.bind chaos txt를 입력한 결과가 같아야 한다.

 

 

 

위와같이 결과값이 일치하는것을 알 수 있다.

 

소스코드가 hint에 제시되어 있지만 공부해 나가는 과정이므로 gdb를 통한 소스코드 분석을 해보자.

 

 

 

 

이제 자세히 살펴보자.

 

 

breakpoint를 0x0804856f로 지정한다. 이 주소는 위에 빨갛게 표시한 strcat() 함수를 호출하는 주소로서 입력한 문자열을 "dig @"뒤에 붙이는 역할을 한다.

run 168.126.63.1은 /bin/autodig 168.126.63.1을 입력한 것과 같다.

 

 

EPB + 8의 위치에 있는 값이 0x02인지 비교하고, 2가 맞으면 0x804854c <main+60>으로 점프하는 부분이다. 만일 2가 아니면 바로 다음줄을 실행한다.

 

다음 분기에서 argc의 값이 2이면 정상적으로 처리하고, 2가 아니면 에러로 처리한다.

 

지금 우리는 인자 두개를 잘 넘겨서 argc가 2로 입력되어 에러가 무시되었다. 하지만 에러가 났을때 실행과정을 확인해볼 필요가 있다.

 

 

위와 같이 Auto Digger Vesion0.9\n 라는 문자열을 스택에 올리고 printf() 함수를 호출한다.

 

 

이어서 위처럼 Usage : %s host\n라는 문자열도 스택에 올리고 printf() 함수를 호출한다.

 

마지막으로 위와같이 exit(0)을 실행하여 /bin/autodig를 종료한다.

 

금까지 분석한 내용을 가지고 /bin/autodig를 실행 해보자.

 

 

 

위와같이 argc가 2가 아닌 경우에서는 인자 호스트 IP 하나만 입력하라는 사용법이 출력된다.

 

이제 다시 에러처리가 아닌 argc가 2인 경우에 대해서 계속 분석을 해보자.

 

 

"dig @"를 스택에 올리고 strcpy() 함수를 호출한다. 즉, strcpy(cmd, "dig @")라는 코드가 실행된다.

 

앞에서 입력한 "168.126.63.1"이라는 문자열과 "dig @"라는 문자열이 저장된 주소를 스택에 푸시하고, strcat() 함수를 호출한다.

즉, strcat(cmd, "168.126.63.1")이라는 코드가 실행되어 cmd 배열에 "dig @168.126.63.1"이라는 문자열이 저장된다.

 

 

다음으로 "version.bind chaos txt"라는 문자열과 앞에서 cmd 배열에 있는 "dig @168.126.63.1"라는 문자열을 스택에 올리고 strcat() 함수를 호출한다.

strcat(cmd, "version.bind chaos txt")라는 코드가 실행되어 cmd 배열에 "dig @168.126.63.1 version.bind chaos txt"라는 문자열을 저장한다.

 

 

0xbbc(3004)를 두 번 스택에 올리고, setreuid() 함수를 호출한다. 따라서 /bin/autodig가 실행되는 동안 level4의 권한을 얻을 수 있다.

 

 

마지막으로 지금까지 cmd 배열에 저장된 문자열 "dig @168.126.63.1 version.bind chaos txt"의 주소를 스택에 올리수 system() 함수를 호출한다.

따러서 system("dig @168.126.63.1 version.bind chaos txt")가 실행되면 "168.126.63.1"에 대한 BIND 프로그램의 버전을 조회한다.

이제 gdb 분석을 마쳤다. 이제 공격을 해보자

 

힌트를 다시 생각해보자. 힌트는 우리에게 두가지 힌트를 주었다.

- 동시에 여러 명령어를 사용하려면?

- 문자열 형태로 명령어를 전달하려면?

 

첫번째 힌트부터 공략해보자.

 

동시에 여러 명령어를 사용하려면 어떻게 해야할까?

 

 

위와 같이 168.126.63.1과 www.naver.com을 한번에 전달하고 싶지만 www.naver.com이 제대로 전달되지 않는다.

www.naver.com이 제대로 전달되지 않는 이유는 소스코드에 argv[1]에 해당하는 첫 번째 인자만 처리하기 때문에 두 번째 인자를 처리할 수 없다.

 

168.126.63.1과 www.naver.com을 한번에 전달하고 싶다면 문자열 형식의 입력을 이용하여 하나의 인자로 전달할 수 있다.

 

 

위 결과를 보면 www.naver.com에 대한 질의 결과도 있고, KT 서버에 대한 BIND 버젼조회 결과도 있다.

이처럼 쌍따옴표를 이용해 인자값 2개를 하나로 묶어줌으로써 /bind/autodig 프로그램에 하나의 인자를 전달한 것처럼 할 수 있다.

문자열을 조합해 사용한 명령어는 실제로 아래와 같이 실행 된다.

 

 

또한 유닉스 계얼 서버에서 실제로 실행될 수 있는 명령어를 연속해서 전달하려면 ";"을 이용하면 된다.

";"은 셸에서 명령어를 한 줄에 연속해서 적을 때 이용할 수 있으며, system( ) 함수에도 동일하게 적용된다.

 

명령어의 실행순서를 보자. 아래와 같은 순서대로 실행된다.

 

1. dig @168.126.63.1 www.naver.com

2. id

3. version.bind chaos txt

 

이제 level4의 passwd를 알아보자.

 

 

이번에는 level4의 셸을 획득한 후 패스워드를 알아내자.

 

level1과 같은 백도어 공격을 해서 level4의 권한을 얻을 수 있다. level4의 백도어 셸을 만들어보자.

 

 

위와 같이 백도어를 만들어줄 소스코드를 작성한다. 생성된 소스코드를 컴파일하면 level4 계정의 사용자 ID와 level3 계정의 그룹 ID를 가진 실행파일이 만들어진다.

 

위와 같이 SUID를 설정해야한다. 그 후 해당파일을 실행하면 level4 계정의 사용자 ID 권한으로 셸이 실행되는것을 확인할 수 있다.

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

해커스쿨 FTZ level5  (0) 2017.08.11
해커스쿨 FTZ level4  (0) 2017.08.01
해커스쿨 FTZ level2  (0) 2017.07.28
해커스쿨 FTZ level1  (4) 2017.07.23
해커스쿨 FTZ trainer6~trainer10  (0) 2017.07.21