1. 풀이

- ls -al 명령으로 홈 디렉터리의 내용을 출력하였을 때의 결과이며, hint 파일의 내용을 확인.

- cat 명령으로 hint 파일의 내용을 확인하면, level2 권한에 setuid가 걸린 파일을 찾아야하는 것을 알 수 있음.

특수 권한
setUID - setUID가 설정된 파일을 실행하면 해당 파일이 실행되는 동안에는 파일을 실행한 사용자의 권한이 아니라 파일 소유자의 권한이 적용
- 사용법: chmod 4000 [파일명]
- 부여 후 ls로 확인 해보면 소유자의 실행권한에 s가 표시되며, 기존 권한에 실행권한이 없으면 대문자 S가 표시
- 예시 : /usr/bin/passwd
setGID - setGID가 설정된 파일을 실행하면 해당 파일이 실행되는 동안에는 파일을 실행한 사용자의 권한이 아니라 파일 소유 그룹의 권한이 적용
- 사용법: chmod 2000 [파일명]
- 부여 후 ls로 확인 해보면 그룹의 실행권한에 s가 표시되며, 기존 권한에 실행권한이 없으면 대문자 S가 표시
- 예시 : /usr/bin/wall
Sticky Bit - Sticky Bit는 디렉터리에 설정하며, 디렉터리에 스티키 비트가 설정되어 있으면 이 디렉터리에는 누구나 파일을 생성할 수 있으나, 디렉터리의 소유자 or 파일 소유자 or 관리자가 아닌 사용자들은 파일을 삭제하거나 변경할 수 없음.
- 파일은 파일을 생성한 계정으로 소유자가 설정
- 사용법: chmod 1000 [디렉터리명]
- 부여 후 ls로 확인 해보면 기타 사용자의 실행권한에 t가 표시되며, 기존 권한에 실행권한이 없으면 대문자 T가 표시
- 예시: tmp 디렉터리

- find 명령을 이용해 hint 파일의 내용에 부합하는 파일을 찾을 수 있음

- 아래의 명령을 사용하면 명령 수행 중 권한이 없는 파일에 대한 에러가 함께 출력되어 결과확인이 어려움

수행 명령 : $ find / -perm -4000 -user level2
명령어 동작 : 최상위 루트 디렉터리(/)에서부터 setUID가 설정된 파일(-perm -4000) 이면서 파일 소유자가 level2(-user level2)인 파일을 찾음(find)
find - 사용법 : find [옵션] [경로] [표현식]
- 리눅스 파일 시스템에서 파일을 검색하는 데 사용되는 명령어
- 상대 경로, 절대 경로 모두 가능
-perm - 파일의 권한으로 탐색한다.
- [-] : 설정된 권한의 모든 것이 설정된 파일을 찾는 것
- [+] : 설정된 권한 중 하나라도 설정된 파일을 찾는 것
-user - 지정한 사용자가 소유하고 있는 파일 찾기

- 표준 입출력과 리다이렉션을 활용하여 출력되는 결과를 간소화 할 수 있음.

- /dev/null은 일종의 휴지통을 의미함.

파일 디스크립터 파일 디스크립터의 이름 정의
0 stdin 명령어의 표준 입력
1 stdout 명령어의 표준 출력
2 stderr 명령어의 표준 에러
리다이렉션 기호 형태 의미
> [명령어] > [파일] 명령어의 결과를 파일에 덮어쓰기
< [명령어] < [파일] 파일의 내용을 명령어의 입력으로 사용
>> [명령어] >> [파일] 명령어의 결과를 파일에 추가

- 위 명령을 통해 level2 권한에 setuid가 걸린 파일을 찾을 수 있음.

- ls 명령을 통해 확인해보면 hint 파일에서 확인한 조건과 동일한 파일임을 알 수 있음.

- 해당 파일을 실행해 보면, 비밀번호를 확인할 수 있는 my-pass 명령어와 권한 변경 명령인 chmod를 제외한 한가지 명령을 레벨2의 권한으로 실행시켜 줌

- 명령어 해석기 역할을 수행하는 쉘(/bin/bash)를 실행시키면, level2의 권한으로 쉘이 실행되며, my-pass 명령을 통해 level2의 비밀번호를 확인할 수 있음.

 

2. GDB를 통한 의사 코드 복원

- system>chdir>print 순으로 함수 호출이 이루어지며 그 값은 다음과 같음

- clear 명령으로 화면을 초기화 한 후 level2의 홈 디렉터리로 이동 및 printf로 출력

- fgets>strstr 순으로 함수 호출이 이루어지며, 그 값은 다음과 같음

- fgets()함수를 통해 사용자로부터 값을 입력 받은 후 strstr()함수를 통해 사용자 입력값이 my-pass, chmod 검증

- printf>setreuid>system 순으로 함수 호출이 이루어지며, setreuid()의 인자값을 0xbba(10진수 3002)로 설정(level2의 권한) 및 system 함수로 사용자 입력값을 실행

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
//변수 선언
char *str1="my-pass"; 
char *str2="chmod";
char *input[30];

system("/usr/bin/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) // 사용자 입력값이 my-pass인 경우 종료
{
printf("\n\t\tmy-pass명령은 사용할 수 없습니다. \n\n");
exit(0);
}

if(strstr(input,str2) != NULL) // 사용자 입력값이 chmod인 경우 종료
{
printf("\n\t\tchmod명령은 사용할 수 없습니다. \n\n"); 
exit(0);
}

printf("\n\n");
setreuid(3002,3002); // level2의 권한 부여
system(input); // 사용자 입력값 실행
}

'문제풀이 > FTZ' 카테고리의 다른 글

FTZ Level5 풀이  (0) 2022.10.27
FTZ Level4 풀이  (0) 2022.10.27
FTZ Level3 풀이  (0) 2022.10.25
FTZ Level2 풀이  (0) 2022.10.25
FTZ 환경 구축  (0) 2022.10.23

+ Recent posts