1. 풀이

- level4 홈 디렉터리의 hint 파일 내용확인

- /etc/xinetd.d에 백도어가 있음을 유추가능

데몬 동작 방식
xinetd.d 방식 구분 standalone 방식
xinetd 데몬에 의해 실행 및 종료 동작 각각의 데몬이 독립적으로 실행 및 종료
xinetd에 의해 호출 된 경우에만 메모리 상주 메모리 상주 항상 메모리에 상주하여 독릭접으로 존재
상대적으로 느림 응답 속도 상대적으로 빠름
/etc/xinetd.d 설정 파일 /etc 디렉터리에 독립적인 설정파일 존재
tcp_wrapper (/etc/host.allow, /etc/host.deny) 접근 제어 설정 파일 독립적 설정을 통해 제어
통합관리, 자원절약, 접근제어 장점 빠른 응답
느린 응답 단점 개별관리, 자원낭비
비교적 서비스 요청이 많지 않은 서비스 적용 비교적 서비스 요청이 빈번히 발생하는 서비스
telnet, ftp 등 예시 httpd, mysql, sshd 등

* xinetd.d 서비스 방식을 standalone 서비스 방식으로 변경이 가능하며, 그 반대 또한 가능함(단, 지원하지 않는 서비스도 존재)

- /etc/xinetd.d 내용을 확인하면 backdoor 파일을 확일할 수 있음

- backdoor 파일의 내용을 정리하면 다음과 같음

① service finger : 서비스 이름

② disable = no : 서비스의 사용 가능 유무(no=서비스 사용가능, yes=서비스 사용 불가)

③ flags = REUSE : 서비스 포트가 사용중인 경우 해당 포트의 재사용 허가
④ socket_type = stream : TCP/IP 프로토콜 사용
⑤ wait = no : 해당 서비스가 이미 연결된 상태에서 또 다른 요청이 올 경우 대기 없이 응답
⑥ user = level5 : 해당 데몬은 level5의 권한으로 실행
⑦ server= /home/level4/tmp/backdoor : xinetd에 의해 실행될 데몬 파일
⑧ log_on_failure  += USERID : 로그인 실패에 대한 USERID를 로그에 기록

- finger 서비스는 level5의 권한으로 /home/level4/tmp/backdoor 파일을 이용해 서비스를 제공하는 것을 알 수 있음

- 하지만, /home/level4/tmp/backdoor 파일은 존재하지 않음.

- 해당 파일이 level5의 권한으로 실행됨을 확인 했으므로(user = level5), level5의 비밀번호를 알 수 있는 backdoor 파일을 해당 경로에 작성 후 finger 서비스를 수행하면 level5의 비밀번호를 알 수 있음

- 해당 파일을 컴파일한 후 finger 서비스를 실행하면 level5의 비밀번호를 알 수 있음

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

- 공격을 위해 작성한 backdoor 분석

- system() 함수로 my-pass 명령을 실행함

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

FTZ Level6 풀이  (1) 2022.10.28
FTZ Level5 풀이  (0) 2022.10.27
FTZ Level3 풀이  (0) 2022.10.25
FTZ Level2 풀이  (0) 2022.10.25
FTZ Level1 풀이  (0) 2022.10.24

1. 풀이

- level3 홈 디렉터리의 내용 확인 및 hint 파일 내용 확인

- autodig의 소스와 more hints가 출력됨.

- autodig 소스와 more hints를 종합해 보면 다음과 같음

① argc 값, 즉 전달받은 인자의 갯수가 2개가 아니어야함

② 동시에 여러 명령을 사용하기 위해 리눅스에서는 ;(세미콜론)을 사용함

③ 문자열 형태로 명령을 전달하기 위해 "명령어" 형식을 사용

dig
- 윈도우의 nslookup과 유사한 프로그램
- 도메인을 입력할 경우 해당 도메인의 IP주소를 알 수 있음
- 양식 : dig [@DNS server IP] [Domain] [Query Type]

- level4의 쉘 명령을 수행하기 위해 level4 권한이면서, setUID가 설정된 파일을 찾아봄.

- 해당 파일을 /bin/autodig "명령어1;명령어2"로 실행시키면 autodig 소스에 의해 수행 순서는 다음과 같음

① argc=2, argv[0]=/bin/autodig, argv[1]="명령어1;명령어2"

② argc=2 이므로 if문이 수행되지 않음

③ strcpy(), strcat()에 의해 완성되는 cmd 배열은 "dig @명령어1;명령어2 version~"

④ system()으로 cmd 값 실행

- 즉, dig @명령어1이 수행된 이후 명령어2가 수행되어 결과를 반환하는 것을 알 수 있음.

- level4의 비밀번호를 확인할 수 있음.

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

- if(argc != 2) 조건문을 만족하는 경우 출력되는 printf 구문

- strcpy()를 통해 dig @ 복사하고, 사용자 입력값을 strcat()를 통해 문자열을 붙임

- setreuid(3004,3004)로 level4의 권한 부여 후 system() 함수로 명령을 실행

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

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

1. 풀이

- level2 홈 디렉터리의 내용이며, hint 파일의 내용 확인

- 텍스트 파일 편집, 즉 vi 편집기의 명령모드를 통해 쉘의 명령을 수행할 수 있음

VI(Visual Editor)
- 유닉스 환경에서 가장 많이 쓰이는 문서 편집기
- 마우스 입력 장치가 필요 없으며, 키보드 입력으로 모든 기능을 사용할 수 있기 때문에 터미널 환경에서 주로 사용되는 프로그램

모드 설명
명령 모드 - vi를 실행시키면 가장 먼저 접하는 기본 모드 
- 커서의 이동, 수정, 삭제, 복사 붙이기, 탐색 등 가능
- i,a,o,I,A,O 등을 입력하면 입력 모드로 전환되며, shift + : 입력 시 ex 명령 모드로 전환됨
입력 모드 - 글자를 입력하는 문서를 만드는 모드
- 명령 모드에서 입력 전환키를 입력해 전환시 화면 아래에 '-- INSERT --' 표시 
- [ESC]를 입력해 명령 모드로 전환
ex 명령 모드 - 명령 모드에서 ':'키를 입력했을 때 화면 맨 아랫줄에서 명령을 수행하는 모드
- 저장, 종료, 탐색, 치환 및 vi 환경 설정 등의 역할을 하는 모드
- [ESC]를 입력해 명령 모드로 전환

- ex 명령 모드에서 ":!명령어" 형식을 통해 쉘 명령 수행이 가능

- ex 명령 모드를 통해 :!/bin/bash 수행 결과 반응이 없으며, :!my-pass 수행level2의 비밀번호가 출력됨.

- level3의 쉘 명령을 수행하기 위해 level3 권한이면서, setUID가 설정된 파일을 찾아봄.

- /usr/bin/editor 파일이 해당 조건을 만족하는 파일인것을 알 수 있음.

- 해당 파일을 실행 시켜보면 vi 에디터인 것을 알 수 있으며, ex 명령모드를 통해 :!/bin/bash를 수행할 경우 setUID가 설정되어 있어, level3의 권한으로 쉘이 실행됨.

- my-pass 명령을 통해 level3의 비밀번호를 확인할 수 있음.

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

- setreuid>system 순으로 함수가 호출

- level3의 권한으로 system 함수를 통해 /bin/vi를 실행

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

int main()
{
setreuid(3003,3003) // level3의 권한 부여

system("/bin/vi") // vi 실행

return 0;
}

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

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

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

1. 가상머신 설치

- 아래 사이트를 통해 가상머신 설치

https://www.vmware.com/kr/products/workstation-player/workstation-player-evaluation.html

https://www.virtualbox.org/wiki/Downloads

 

2. 해커스쿨 FTZ 이미지 파일 설치

- 해커스쿨 FTZ 파일 다운로드(관련 파일은 구글 조회 시 다운로드 가능)

- 다운 파일 압축 해제 후 'Red Hat Linux.vmx' 파일 실행

- 가상머신 실행

-  I Copied It

- ID : root / PW : hackerschool 로그인 후 IP 확인

3. PUTTY 설치

- 아래 링크에서 PUTTY 설치 및 실행

https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html

- 한글 설정

    Window>Translation>Remote character set : Use font encoding 
    Window>Apperence>Font settings>Change : 글꼴 설정 

- Host Name에 'FTZ 서버 IP'를 입력하고, Save Sessions에 '서버 명'을 입력한 후 Save 시 세션이 저장됨.

- ID/PW에 level1/level1을 입력하여 로그인하여 정상 접근을 확인

'문제풀이 > 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 Level1 풀이  (0) 2022.10.24

+ Recent posts