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 |