안녕하세요 Triumph 입니다.

Hackerschool의 워게임인 FTZ에서 level3단계 풀이를 하고자 합니다.


level3으로 로그인 후 힌트를 확인합니다.

 

 힌트1 : autodig의 소스를 이용하여 level4의 권한을 얻어라

 힌트2 : 동시에 여러 명령어 사용하는법

 힌트3 : 문자열 형태로 명령어를 전달하는법

level1, level2 대비 힌트가 기네요..게다가 소스코드도 등장했습니다. 부족할까봐 추가힌트도 줬네요.

아마 autodig를 이용하여 level4의 권한을 얻으라는 것을 보니, level1, level2와 마찬가지로 setuid가 걸려 있을 것으로 추측됩니다.

autodig가 실행 중 쉘을 실행하려면 일단 autodig부터 분석 해야겠죠?

 

소스코드를 분석하기 이전에 소스코드에 등장하는 내용을 먼저 설명하겠습니다.

 argc : 프로그램을 실행할 때 지정해 준 명령행 옵션의 개수

 argv : 인자벡터

  ex) [level3@ftz level3]$test.exe test2 //test.exe와 test가 실행되므로 argc는 2, argv[0]=test.exe, argv[1]=test 이다.

 strcpy : 문자열 복사

 strcat : 문자열 붙이기

 system : 해당 명령 실행

 dig : DNS 질의응답 확인

 

이제 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 );

}

//헤더파일 include

 


//메인함수 선언
//cmd 문자형 배열변수 선언

//명령줄 라인개수가 2개가 아닐경우
//내용 출력
//argv[0] 출력
//종료


//cmd변수에 dig @문자열 복사(cmd="dig @"
//cmd변수 뒤에 argv[1] 붙임(cmd="dig @" argv[1])
//cmd변수 뒤에 문자열 붙임(cmd="dig @" argv[1] " version.bind chaos txt")
//cmd 변수 실행

 

 

소스코드를 분석한 내용을 바탕으로 유추할 수 있는 것들은 아래와 같습니다.

1. audodig 뒤에 인자가 1개여야 합니다.(인자가 1개가 아니면 argc!=2가 되어 종료됨)

2. argv[1]에 서버주소가 들어가면 해당 서버의 bind버전을 조회합니다.

 

autodig는 인자 값을 받아 해당 서버의 bind버전을 확인하는 프로그램인 것을 확인했습니다.

확인 해 봐야겠죠? 일단 autodig를 찾고, 실행해 봅니다.

 

인자 0, 1, 2개를 넣고 실행해본 결과, 1개인 경우 bind버전을 조회하고 다른 경우는 예상한 대로 메시지 출력 후 종료됩니다.

(localhost에 bind가 설치되어 있지 않아 인자 1개실행 했을 때 connection timed out 발생함)

 

이제 추가 힌트를 분석해 봅시다.

힌트2 : 동시에 여러 명령어 사용하는법

동시에 여러 명령어를 사용하는 법은 &입니다. &를 사용하여 여러 명령어를 한번에 전달해 보겠습니다.

 

&를 사용하여 echo test1과 echo test2가 동시에 실행된 것을 확인했습니다.

 

힌트3 : 문자열 형태로 명령어를 전달하는법

문자열 형태로 명령어를 전달하는법..문자열에서 감이 오시지 않나요? 답은 "(더블쿼터)입니다.

위처럼 &로 여러가지 명령을 사용하면 빈칸(space)이 생길 수 있습니다.

하지만 audodig는 하나의 인자 값만 입력 가능하기 때문에 "(더블쿼터)로 묶어 주어 여러 명령어를 실행하더라도

하나의 인자값으로 인식하도록 할 수 있습니다.

 

그럼 이제 답이 나왔죠 ? &를 사용하여 my-pass명령을 실행해 보겠습니다.

level4의 패스워드를 획득했습니다.

 

감사합니다.

'War Game > FTZ' 카테고리의 다른 글

Hackerschool FTZ 풀이 - LEVEL4  (0) 2017.03.09
Hackerschool FTZ 풀이 - LEVEL2  (0) 2017.03.07
Hackerschool FTZ 풀이 - LEVEL1  (0) 2017.03.07
Hackerschool FTZ 구축  (0) 2017.02.15

+ Recent posts