HackerSchool FTZ Level 3 Write-Up

HackerSchool FTZ Level 3 Write-Up

in

이번에 풀어볼 문제는 HackerSchoolFTZ Level 3 입니다.
간단한 C 프로그래밍 언어를 읽을 수 있으면 어렵지 않게 풀 수 있는 문제 입니다.

Level 3 Write-Up

level3 계정에 접속해 hint 파일을 봅니다.
이전에 풀었던 문제들과는 달리 이번에는 hint파일의 내용이 꽤 많아 보입니다.

$ cat hint

image cat hint

autodig의 소스코드에 취약점을 찾아서 level4 계정으로 접속하는 것 같습니다. 즉, autodig의 소스코드만 읽을 수 있다면 문제풀이는 굉장히 간단합니다.

일단 분석에 앞서 autodig 파일의 위치를 확인한 후, setuid가 걸려있는지 확인 합니다.

$ which autodig

image which autodig

예상한대로 소유주가 level4로 setuid가 걸려져 있는것을 확인 했습니다.
hint 로 autodig의 소스코드를 알려준 덕분에 바이너리 분석을 하지않고 클리어 할 수 있겠군요.

autodig은 마지막에 완성된 cmd 문자열을 system 함수로 실행하는 기능을 합니다.

// /bin/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 함수로 실행되는 명령어: "dig@" + argv[1] + " version.bind chaos txt"
    system( cmd );

}

autodig은 사용자가 입력한 문자열이 system 함수의 명령어에 포함이 되는 취약점이 존재합니다. 힌트에서 알려준 대로, 동시에 여러 명령어를 사용하는, 그리고 문자열 형태로 명령어를 전달하는 방법을 활용하면 적절한 값을 넣어 level4의 권한으로 bash를 실행시킬 수 있습니다.

간단하게, 동시에 여러 명령어를 사용하려면 명령어 사이에 ‘&&’ 혹은 ‘||’ 혹은 ‘;’ 문자를 활용할 수 있고, 인자를 문자열 형태로 전달하려면 ‘"’ 혹은 ‘'‘로 감싸주면 됩니다.

만약 인자로 ;bash;를 넣게되면 최종적으로 system 함수로 “dig@;bash; version.bind chaos txt” 명령어가 실행될 것 입니다. 한번 실행해 보겠습니다.

$ autodig ';bash;'

image autodig ‘;bash;’

성공적으로 level4 계정에 접근했습니다.
my-pass 커맨드를 입력해 level4 계정의 패스워드를 확인해 줍니다.

$ my-pass

image my-pass

level4 계정의 패스워드가 “suck my brain” 인 것을 확인했습니다.

실무에서는 개발자들이 저렇게 악용의 여지가 다분한 코드를 짤 이유가 없지만 어쨋든 코딩을 할때는 보안에 신경써야 된다(?)는 것을 깨우치게 해주는 문제였던 것 같습니다.

index.html

level3의 ’~/public_html/index.html’ 파일에서 아래와 같은 내용을 확인할 수 있습니다.

$ cat public_html/index.html

image cat public_html/index.html