FTZ level1 문제풀이 및 gdb분석

2017. 5. 23. 11:25SystemHacking/FTZ

 

 

1번 문제 입니다 !


먼저 hint를 확인합니다


" level2 권한에 setuid가 걸린 파일을 찾는다."


setuid란?

실행파일에 한해서 설정이 가능하다

setuid가 설정된 실행파일을 실행하면 누구든지 해당 실행파일의 소유자 권한으로 프로세스가 실행된다

따라서 해당 실행파일을 실행중일 때 level2권한으로 명령어를 실행할 수 있음을 뜻합니다


find명령어

find [검색위치][조건]

]$ find / -perm -4000 -user level2 2> /dev/null

=>조건은 허가권 -perm 과 -user 소유자명을 걸어주었다

=> "/" 에서 -4000 -> 파일의 허가권이 --s------ 을 포함하는 모든 파일을 검색한다  

=> 2> dev/null    오류가 일어난 값들은 모두 /dev/null 파일로 보내고 화면에 출력하지 않는다


"/bin/ExecuteMe" 파일이 검색되었고 이를 실행한 화면은 아래 그림1-1 에 나와있습니다


< 그림 1.1 >


위에서 말했다시피 해당 실행파일은 level2권한으로 setuid가 걸려있습니다

따라서 해당 실행파일을 실행중일때에는 level2권한으로 가지게 됩니다

my-pass를 이용해 level2의 비밀번호를 알 수 있지만 단 하나의 명령어로 완벽한 쉘을 얻기 위한 방법은 쉘을 실행하는 

"sh" , "/bin/sh" 명령어를 입력하면 level2의 쉘이 작동하게 됩니다


문제풀이는 완료했고 gdb를 통한 디버깅을 시작하겠습니다

gdb실행 후 /bin/ExecuteMe파일을 불러온다음 "disas main" main함수를 디스어셈블합니다

실행결과는 다음과 같습니다


< 그림 1.2 >


[ Procedure Prelude ]

함수의 시작부분 , 지역변수의 공간을 할당해주는 역할을 합니다

$0x28 = 40byte만큼의 공간을 할당해준다


[ 명령어 x ]

x 명령어(examine)를 통해서 해당 주소의 값이 무엇인지 알 수 있다

(gdb) x/s [주소값]    => 해당 주소값을 s(string) 문자로 표현

(gdb) x/x [주소값]    => 해당 주소값을 x(hex) 16진수로 표현


그림 1.2를 통해서

system("clear") 와 chdir("/home/level2") 함수가 실행되고 printf함수를 통해서 문장들이 출력됨을 확인 할 수 있다


다음 소스를 확인해보자


그림 1.3 >


1. fget( 입력을 저장할 공간 , 입력할 문자 길이 , STDIN )

키보드로 문자길이인수만큼의 문자를 입력받아서 해당공간에 저장합니다


2. strstr( 문자열1 , 문자열2 )

문자열1안에 문자열2가 존재한다면 그 위치를 반환한다


3. 코드의 흐름

fget()함수에 인자3개를 push한다 -> strstr함수로 입력값에 "my-pass" 문자의 존재 여부 확인  

-> 해당 조건에 걸리지않으면(해당문자없음) "je" 해당주소로 점프 

-> 조건에 걸린다면(해당문자있음) 점프하지않고 그대로 코드 진행


strstr함수로 입력값에 "chmod" 문자의 존재 여부 확인 

-> 해당 조건에 걸리지않는다면(해당문자없음) "je" 해당주소로 점프한다

-> 조건에 걸린다면(해당문자있음) 점프하지않고 그대로 코드가 진행된다


"'my-pass" or "chmod" 입력시 exit(0) 함수를 통해 해당 실행파일 종료


그림 1.4 >


setreuid(3002,3002)    => setuid와 비슷하다

해당 실행파일의 권한을 level2 로 바꿔준다

그 다음 system("command")함수를 통해서 명령어를 입력하여 실행한다

하나의 명령어 실행 후 해당 실행파일은 종료된다


gdb가 정말 어렵습니다! 저도처음에 완전 멘붕이였는데 매 문제마다 따라서 쳐본다면 금방 이해할 수 있을겁니다


< 복원된 소스코드 >



#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
int main(){
char *str1 = "my-pass"
char *str2 = "chmod"
char *input[29];

system("clear");
chdir("/home/level2");

printf("\n\n\n\t\t레벨2의 권한으로 당신이 원하는 명령어를\n");
printf("\t\t한가지 실행시켜 드리겠습니다. \n");
printf("\t\t(단, my-pass 와 chmod는 제외)\n");
printf("\n\t\t어떤 명령을 실행시키겠습니까?\n");
printf("\n\n\t\t[level2@ftz level2]$ ");

fgets(input, sizeof(input),STDIN);                                                  // 문자열(명령어) 입력
if ( strstr(input,str1) != NULL ){                                                    // test , 입력값에 "my-pass"가 존재한다면
printf("\n\t\tmy-pass명령은 사용할 수 없습니다. \n\n");
exit(0);
}

if ( strstr(input,str2) != NULL ){                                                    // test , 입력값에 "chmod"가 존재한다면
printf("\n\t\tchmod명령은 사용할 수 없습니다. \n\n");
exit(0);                                                                           // 실행파일 종료
}
printf("\n\n");
setreuid(3002,3002);                                                                  // level2권한부여
system(input);                                                                          // 명령어 실행

}



부족하거나 이상한게 있다면 댓글로 알려주세요




'SystemHacking > FTZ' 카테고리의 다른 글

FTZ level4 xinetd백도어  (0) 2017.05.23
FTZ level3 system함수의 위험성  (0) 2017.05.23
FTZ level2 VI편집기의 고급기능  (0) 2017.05.23
FTZ 문제 풀기에 앞서  (0) 2017.05.23
gdb 명령어  (0) 2017.05.10