write-up/pwnable

[ftz] level1: find local shell backdoor

여니두 2019. 7. 25.

시스템해킹 스터디 준비를 위하여 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에 확보하는 과정

procedure prelude 과정

- <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

댓글