접속 정보
ID : level3
PW : (level2의 결과)
문제 해결 과정
우선 level1과 level2를 해보면서 전체적으로 현재의 레벨에서 다음 레벨 권한의 쉘을 획득해 비밀번호를 알아내는 방식으로 파악했다. 그래서 이번엔 힌트를 먼저 보지 않고 해보기로 했다.
앞에서의 방식처럼 우선 setuid가 level4권한으로 설정된 파일을 찾아본다.
find / -perm -4000 -user level4 2> /dev/null
역시나 존재한다. 이 실행파일을 실행해본다.
이제 이게 어떤 파일인지 파악해보려 했으나 방법을 잘 모르겠다. 이제 힌트를 볼 차례이다.
#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 @" ); // cmd = "dig @"
strcat( cmd, argv[1] ); // cmd = "dig @" + argv[1]
strcat( cmd, " version.bind chaos txt");
//cmd = "dig @" +argv[1]+ " version.bind chaos txt"
system( cmd ); //cmd 실행
}
그럼 이제 autodig가 무슨 일을 하는 실행파일인지 알았다. autodig는 level4권한에서 인자(argv[1])를 받아 cmd 문자열을 만들고 실행하는 파일이다.
more hint를 보고 다음의 내용을 알 수 있다.
동시에 여러 명령어를 사용하려면? - ";"을 이용한다
문자열 형태로 명령어를 전달하려면 - "전달하고자하는 명령어" (""를 이용한다")
그럼 이제 인자로 ";my-pass"를 줘 실행해본다.
끄읕.
my-pass 실행할 수 있었던 이유
인자(argv[1])로 ";my-pass"를 주게되면 cmd는 "dig @;my-pass version.bind chaos txt"가 된다.
따라서 dig @명령과 my-pass 명령을 실행하게된다.
dig @ 실행 결과 서버의 이름을 제대로 주지 않았기 때문(argv[1]가 서버 이름 자리)에 dig는 오류가 출력되고,
my-pass는 제대로 실행되어 level4의 권한으로 쉘명령이 실행되어 level4의 비밀번호가 나오게 된다.
원인
strcat(cmd, argv[1])을 할 때, argv[1]에 대한 검증을 하지않아 ";"이 들어간 문자열을 그대로 cmd에 이어붙이게 된다. 그로인해 의도하지 않은 쉘 명령을 실행할 수 있게 된다.
'wargame - system > FTZ' 카테고리의 다른 글
[FTZ] 해커스쿨 FTZ Level5 - Write Up (0) | 2022.05.08 |
---|---|
[FTZ] 해커스쿨 FTZ level4 - Write Up (0) | 2022.05.07 |
[FTZ] 해커스쿨 Level2 - Write Up (0) | 2022.05.03 |
[FTZ] 해커스쿨 Level1 - Write Up (0) | 2022.05.03 |