FTZ level3 system함수의 위험성

2017. 5. 23. 14:04SystemHacking/FTZ

 

 

 

3번 문제를 풀기에 앞서 알아두어야 할 개념들입니다


1> nslookup

도메인 서버의 IP주소를 확인하는 프로그램입니다

사용방법

- ]$ nslookup [확인하고싶은 도메인 주소]

- ]$ nslookup www.tistory.com


2> dig

nslookup과 동일하게 도메인의 IP주소를 확인하는 프로그램 

사용방법

- $] dig @[정보를받을서버] [확인하고싶은도메인주소]

- ]$ dig @100.100.100.2 www.tistory.com


< 그림 3.1 >


[level3 @ftz level3]$ nslookup www.tisory.com

Server : 100.100.100.2    : 제가 사용하는 서버의 IP주소입니다

Non-authoritative answer     : nslookup으로 요청한 도메인의 IP주소가 나옵니다


[level3 @ftz level3]$ dig @100.100.100.2 www.tistory.com

;; ANSWER SECTION

www.tistory.com. 5 IN A 61.251.98.169    


3> int argc , char *argv[]


임의의 소스코드가 다음과 같다고 하자

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

return 0;

}


=> argc    : Argument Count

- 해당 소스코드를 실행했을 때 명령어+인자의 개수가 저장된다

=> *argv[]    : Argument Vector

- 입력한 명령어+인자들이 실제 문자열로 저장되는 공간

- argv[0] , argv[1] ...


문제를 풀면서 더 자세히 설명하겠습니다.

힌트를 먼저 열어보겠습니다


< 그림 3.2 >


< autodig 소스코드 설명 >


if ( argc != 2 ){

printf("Auto Digger Version 0.9\n");

printf("Usage : %s host\n",argv[0]);

exit(0);

}

위에서 배웠던 개념이 나왔습니다 ! 명령어와 인자의 개수(argc)가 2개가 아니면 해당함수를 종료합니다


예를 들면, 

level3@ftz level3]$ /autodig                  // "/autodig" 명령어 1개                                 => argc == 1

level3@ftz level3]$ /autodig arg1           // "/autodig" 명령어 1개 + "arg1" 인자 1개         => argc == 2

level3@ftz level3]$ /autodig arg1 arg2    // "/autodig" 명령어 1개 + "arg1 , arg2 " 인자2개 => argc == 3


또한 

argv[0]는 "/autodig"

argv[1]는 "arg1"

argv[2]는 "arg2" 이 됩니다


응용해서 printf("%s",argv[1]) 이 코드는 "arg1" 이자리에 우리가 입력한 문자열이 출력됩니다



< 사용한 함수 설명 >

(1) strcpy(cmd,dig @);

strcpy( 문자열1 , 문자열2 )

문자열2의 내용을 문자열1로 복사한다

(2) strcat(cmd, argv[1] );

(3) strcat(cmd, version.bind chaos txt);

strcat( 문자열1 , 문자열2 )

문자열1에 이어서 그 뒤에 바로 문자열2를 추가한다

따라서 cmd ="dig @ [사용자가 입력한 문자열] version.bind chaos txt" 가 됩니다


< more hint >

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

동시에 여러 명령어를 전달하는 방법은 " ; " 를 사용하는 것입니다

리눅스에서 " ; " 는 and 를 뜻하며 " A ; B " 는 A명령어를 실행한 후 B명령어를 실행합니다

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

문자열 형태로 명령어 전달하는 방법은 ' "" ' 쌍따옴표 안에 명령어를 입력해서 문자열 취급을 받게하면된다


힌트에 대해 모두 파악했으니 이제 공격대상을 찾아서 공격해보겠습니다


<그림 3.3 >


find 명령어를 통해서 level4권한으로 setuid가 걸려있는 /bin/autodig 실행파일을 찾았습니다


< 그림 3.4 >


위에서 해석했던 것처럼 argc가 1일때와 2일때의 출력하는 내용이 다름을 알 수 있습니다


다음으로 코드를 직접 입력한 것과 실행파일을 실행한 출력결과를 비교해겠습니다

[level3@ftz level3]$ dig@100.100.100.2 version.bind chaos txt 

[level3@ftz level3]$ /bin/autodig 100.100.100.2


< 그림 3.5 >


그림3.5 를 보시면 두 코드가 출력한 내용이 같음을 알 수 있습니다

분석한 내용이 옳음을 확인 할 수 있고 이제 공격을 시작합시다


< 공격할 방식 >

명령어를 문자열 형태로 어떻게 보낼것인지 ? 또한, 동시에 여러 명령어를 사용하는 방식을 통해서 공격해야합니다

코드 작동 원리를 봐보자

[level3@ftz level3 ]$ /bin/autodig 100.100.100.2 

=> cmd = "dig @100.100.100.2 version.bind chaos txt"    =>    system(cmd);


여기서 " ; " 를 사용해보자 ! ( 그림 3.6 확인 )


< 그림 3.6 >


언뜻보면 system 함수를 명령어 두개를 실행해서 공격에 성공한 것처럼 보인다!

하지만, 자세히봐보면 uid부터 모든게 level3임을 알 수있다.

왜일까? /bin/autodig 코드를 보면 " strcat(cmd,argv[1]) " 에서 확인할 수 있다 argv[1] 은 100.100.100.2 를 가르키고 있다

id명령어는 argv[2] 이므로 /bin/autodig에서 사용되어지지 않는다

따라서 위의 실행코드는 level4의 권한으로 system("dig @100.100.100.2 version.bind chaos txt") 가 실행된 후

level3쉘에서 "id" 명령어를 친 것이다


어떻게하면 level4의 비밀번호를 얻을 수 있을까 ?

level4의 권한으로 setuid가 걸려있는 /bin/autodig에서 실행하는 system함수의 인자로 "my-pass" 명령어를 넣어주면 된다!

이 때 바로 ' "" ' 를 사용한다


[level3 @ftz level3]$ /bin/autodig "100.100.100.2 www.tistory.com ; my-pass ;"

=> "100.100.100.2 www.tistory.com ; my-pass; " 를 하나의 문자열로 인식해서 argv[1] 이 된다


< 그림 3.7 >


코드 작동 원리는 다음과 같습니다

sytem("dig @100.100.100.2 www.tistory.com ; my-pass ; version.bind chaos txt");

1> dig @100.100.100.2 www.tistory.com

2> my-pass

3> version.bind chaos txt

세개의 명령어가 실행됩니다. 단! 여기서 system함수를 실행시킨 파일은 /bin/autodig 입니다

따라서 level4의 권한을 가지고 명령어가 실행됩니다



문제가 풀렸습니다

마지막으로 gdb로 해당 코드를 분석해봅시다!


< 그림 3.8 >


<main+16>:    cmpl    $0x02,0x8($ebp)        argc 와 '2' 를 비교한다

일치하면 <main+69>로 jump , 그렇지 않다면 그대로 코드를 진행해 나간다

printf() 두번 실행한 후 exit(0) 함수에 의해서 프로세스가 종료된다


< 그림 3.8 >

argc 가 2일 때 점프해서 넘어왔을 때의 코드이다


[1] <main+81>
    strcpy( cmd , "dig @")


[2]<main+104>

strcat( cmd, "사용자가 입력할 인자")


[3]<main+124>

strcat( cmd,"version.bind chaos txt")


[4]<main+145>                                // 해당 명령어로 인해 system함수가 level4의 권한으로 실행된다

setreuid(3004,3004)


[5]<main+160>

system(cmd)


마지막으로 leave , ret => main함수는 종료 됩니다


부족하거나 이상한 점 있으시면 말씀해주세요 




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

FTZ level5 레이스 컨디션 ( Race Condition )  (0) 2017.05.23
FTZ level4 xinetd백도어  (0) 2017.05.23
FTZ level2 VI편집기의 고급기능  (0) 2017.05.23
FTZ level1 문제풀이 및 gdb분석  (0) 2017.05.23
FTZ 문제 풀기에 앞서  (0) 2017.05.23