[ftz] level1: find local shell backdoor
시스템해킹 스터디 준비를 위하여 ftz 문제를 풀어볼 것이다.
제대로 공부를 하기 위해 「문제풀이로 배우는 시스템 해킹 테크닉」 책을 참고하였다.
01_백도어란 무엇인가
hint를 보아 어떤 문제인지 판단한다.
level2 소유자에 setuid가 걸린 파일을 찾는 것이다.
√ level2 권한의 백도어?
- level2 계정의 소유이고, 다른 계정으로 그룹 권한이 부여돼 있는 SetUID, SetGID가 설정돼 있어야 한다는 의미
- SetUID = 4
- SetGID = 2
: 기존의 허가권 앞에 4, 2를 붙인다. ex. 4754
√ find 명령어
find [찾을 디렉토리 경로] [찾기옵션]
ex) find / -user level2 -perm -4000
4000의 의미: -(최소한) 4(SetUID)가 걸려있는 000(모든 파일)
-perm mode: 정확히 같은 권한 가진 파일
-perm -mode: 부여한 권한을 모두 만족하는 파일
-perm /mode OR +mode: 부여한 권한을 하나라도 만족하는 파일
* -exec 옵션
기억을 되살려 보다가 find 명령어가 생각났다. setuid가 걸렸으면 4xxx일 것이다.
쓰레기값(표준에러. STDERR)은 /dev/null (윈도우 OS의 휴지통) 으로 들어가게 옵션을 걸어주었다.
Execute Me 해달라기에 해 주었다.
bash쉘을 실행시켜 보기로 하였더니 성공하였다.
sh, bash, /bin/sh, /bin/bash와 같은 셸 실행 명령어를 입력해주면 level2 계정의 권한을 지속적으로 유지 가능하다.
Level 2 Password = "hacker or cracker"
√ 다른 방법으로 셸 실행시키기 (about vi)
- 명령어 입력 시, vi 편집기를 연다.
- vi 편집기의 명령창에 :sh를 입력한다.
- level2 권한이 된 것을 확인 가능하다.
.
.
.
● 백도어 (Backdoor) 란?
- 우리는 인증(authentication)과 인가(authorization)가 체계화된 세계에서 살고 있다.
- 실생활에서 개구멍을 만들어 이용하는 이유는 인증과 인가를 회피하기 위함이다.
- 컴퓨터 세계에서 통용되는 대표적 인증 방법은 아이디와 패스워드 인증이다.
정상적인 아이디, 패스워드를 입력한 후 서버에서 본인이 맞는지 확인하는 과정을 회피하는 접근 경로를 백도어(개구멍)라고 한다.
- tmp 디렉토리는 공격에 필요한 소스코드를 작성하거나 메모를 남기는 것과 같이 개인적인 작업을 하는 공간
√ gdb 이용한 소스코드 분석
√√ Aleph One 「Smashing The Stack For Fun And Profit」 문서의 "procedure prelude" 읽고 이해하기
: procedure prelude 함수로 진입하면서 진입 전의 SP(스택 포인터) 위치를 저장한 후, 다음 지역변수에서 사용할 공간을 Stack에 확보하는 과정
- <main+0> main() 진입 전 EBP 주소를 스택에 저장
- <main+1> 현재 ESP를 EBP에 저장 (다음 단계에서 ESP를 사용하므로 값을 보관하기 위함)
- <main+3 ~+16>: main()에서 사용할 변수 공간 확보
- "/usr/bin/clear" 문자열을 Stack에 올리고, system() 함수 호출함
>> system("/usr/bin/clear")
>> chdir("/home/level2")
>> printf("\n\n\n\t\t레벨2~")
.
.
.
>> fgets(배열주소, 0x1e(30): 사이즈, STDIN)
- 배열 주소에 입력값이 정확히 들어가는지 확인해보았다.
- 입력한 명령어가 my-pass인지 비교해서 같으면 main+201로 분기, 같지 않다면 my-pass 명령을 사용할 수 없다는 error 메시지를 출력하고 exit(0) 함수를 통해 실행 종료시킨다.
- 입력한 명령어가 chmod인지 비교해서 같으면 main+251로 분기, 같지 않다면 chmod 명령을 사용할 수 없다는 error 메시지를 출력하고 exit(0) 함수를 통해 실행 종료시킨다.
- 이 부분은 입력했던 명령어(fgets)의 결과를 보여주기 위해 두 줄을 띄우는 부분.
** 일반적인 shell에서는 실행 결과가 별도의 줄바꿈 없이 바로 출력된다.
>> setreuid(3002, 3002)
3002 = level2의 GID
- 입력받은 부분을 실행하는 부분이다.
>> system("명령어")
- my-pass, chmod도 아닐 경우 level2의 GID 권한으로 명령을 실행하는 부분
* 리버싱 결과, 패스워드를 확인할 my-pass 명령어는 금지되어 있다.
√ 문제 의도: 리눅스 OS의 권한 체계를 이해하고 있는가?
- 문제의 ExecuteMe를 실행하여 잠시 level2의 권한을 얻은 일시적인 순간에, 이 권한을 유지하는 방법은?
>> bash shell 실행시키기!
: 이 순간 셸을 실행시키면, level2 소유의 정상적인 셸에 머무르게 되므로 완전한 level2 권한을 얻게 된다.
√√ SetUID, SetGID, 스티키 비트
- SUID, SGID는 유닉스 시스템에서 파일에 다른 계정과 그룹의 권한을 일시적으로 빌려주는 개념
- SUID, SGID 개념과 스티키 비트(디렉토리에 적용됨)의 차이점은?
.
.
√√ 스티키 비트
- 디렉토리에 OR +t 옵션으로 설정 가능
: drwxrwxrwt와 같이 마지막이 t로 설정된 것을 확인 가능
: 스티키 비트가 설정된 디렉토리는 공용 디렉토리로 활용할 수 있다.
: 스티키 비트가 설정된 디렉토리의 소유자 계정이 아닌 다른 계정은 수정, 삭제 불가
'write-up > pwnable' 카테고리의 다른 글
[ftz] level5: what is your name? (0) | 2019.08.12 |
---|---|
[ftz] level4: suck my brain (0) | 2019.07.28 |
[ftz] level3: can you fly? (0) | 2019.07.28 |
[ftz] level2: hacker or cracker (0) | 2019.07.25 |
메모리 레이아웃 기초 (0) | 2019.07.24 |
댓글