2016. 4. 25. 19:58 :: 문제풀이/Hacker School

 

 ||| Chapter 01 :: 백도어란 무엇인가? |||

 

안녕하세요. Message입니다.

시스템해킹에 대해서 배우고자 해커스쿨의 FTZ를 이용한 문제풀이를 포스팅하려 합니다.

Unix 계열 운영체제는 잠시 손을 놓으면 어색해지지만... 이번 기회를 통해 다시 친숙해지려 합니다.

실습환경 : FTZ 로컬 서버(RedHat Linux) + Vmwre 12.1.0 build

참고서적 : 문제풀이로 배우는 시스템 해킹 테크닉 / 여동기님 / 위키북스

 

 

------------------------------------------------------------------------------------------------------------------------------------------

00. 준비

------------------------------------------------------------------------------------------------------------------------------------------

 

무언가 하려고 하면 항상 환경 세팅에서 진이 빠지는 경우가 많은듯 합니다.

저같은 경우 한글깨짐 현상과 telnet 접속 시 자꾸 오류가 발생하더군요.

 

1) 한글깨짐

만약 한글이 깨진다면 아래와 같이 putty의 translation 속성을 Use font encoding을 바꿔줍니다.

 

2) Telnet 접속 안될 때

FTZ서버에 ping은 가지만 Telnet 접속이 안되더군요

방화벽과 백신도 꺼보고, 기능추가에서 telnet 활성화도 해보고.. 로컬 환경도 구축해봤지만 안됐습니다.

그래서 Telnet 접속을 포기하고 22번 포트로 SSH 접속했습니다. 실습하는데 지장은 없으니

안되시는 분들은 이렇게라도...

 

 

------------------------------------------------------------------------------------------------------------------------------------------

01. 문제파악

------------------------------------------------------------------------------------------------------------------------------------------

 

Level1에 접속하여 주어진 문제환경을 파악합니다.

1개의 파일과 2개의 폴더가 존재합니다.

 

레벨마다 주어지는 hint 파일의 내용을 확인합니다.

hint 파일의 내용은 아래와 같고, Level2 권한에 setuid가 걸린 파일을 찾는 내용입니다.

Tip. SETUID

setuid가 설정되면 소유자가 아니더라도 실행 시 일시적으로 소유자의 권한으로 실행됩니다.

파일을 실행할 때 사용자의 UID를 사용하는 것이 아니라 파일의 inode 정보로부터 파일 소유자의 UID를 받아서 실행합니다. 

 

 

------------------------------------------------------------------------------------------------------------------------------------------

02. 문제분석

------------------------------------------------------------------------------------------------------------------------------------------

 

무언가를 찾는 명령어는 find 입니다.

하지만 우리가 찾는 파일은 setuid가 걸린 파일이므로 -perm 옵션과 -user 옵션을 사용합니다.

옵션1  :  -perm +6000  -->  setuid or setgid가 걸린 파일 찾기

옵션2  :  -user level2    -->  level2 or level1의 권한

해당 옵션을 이용하여 검색한 결과는 아래와 같습니다.

 

 

하지만 오류가 많이 떠서 한번에 식별하기가 어렵습니다.

검색 결과 중에서 에러가 발생한 결과를 제외하는 옵션 2> /dev/null을 사용해줍니다.

여기서 숫자 2는 표준에러(STDERR)를 뜻하고, /dev/null은 휴지통을 뜻합니다. (에러를 휴지통에 슝~)

해당 옵션을 사용한 결과는 아래와 같습니다.

 

파일의 허가권(Permission)과 소유권(Ownership)을 살펴보면 주목해야할 점이 있습니다.

1) 허가권 : SUID가 설정되어 있으므로 해당 파일을 실행하면 파일의 소유자 권한으로 실행됩니다 --> -rwsr-x---

2) 소유권 : 그룹 Level1이 해당 파일을 소유하므로 Level1인 우리도 저 파일을 실행시킬 수 있습니다. -rwsr-x--- 1 level2 level1

정리하면, 우리는 저파일을 실행시킬 수 있으며 실행시킬경우 Level2의 권한으로 실행할 수 있다는 점입니다.

 

찾아낸 파일을 실행해보면 아래와 같은 메세지를 볼 수 있습니다.

 

my-pass와 chmod는 제외하라고 되어 있으므로, bash 명령어로 Level2의 권한을 획득합니다.

그럼 1회성 권한이 아닌, 지속적인 Level2 권한으로 원하는 행위를 할 수 있습니다.

FTZ에서 제공하는 my-pass명령어를 이용하여 Level2의 암호를 알아냅니다.

답 : hacker or cracker

 

 

Tip. PERM의 플러스(+), 마이너스(-) 차이

find 명령어의 perm 옵션에 달린 플러스(+)와 마이너스(-)의 차이는

입력하는 숫자에 해당하는 퍼미션을 완벽하게 만족하느냐? 아니면 일부만 만족해도 되느냐? 입니다.

이해하기 어려우니 해커스쿨에 있는 글에 따라 저도 테스트해보았습니다.

먼저 아래와 같이 touch 명령어를 이용하여 7개의 파일을 만듭니다.

그리고 ls -al 명령어로 퍼미션을 확인합니다.

 

이후 마이너스(-) 옵션으로 find 명령어를 수행하면

아래와 같이 300옵션에 해당하는 wx(쓰기, 실행) 권한이 모두 설정되어 있는 파일만 검색이 되었습니다.

한마디로 깐깐한 검색이 되겠죠.

 

이후 플러스(+) 옵션으로 find 명령어를 수행하면

아래와 같이 300옵션에 걸려있는 w(쓰기), x(실행) 권한중 한개라도 설정되어 있으면 검색이 됩니다.

한마디로 너그러운(?) 검색이 되겠네요.

 

 

------------------------------------------------------------------------------------------------------------------------------------------

03. GDB 이용한 상세분석

------------------------------------------------------------------------------------------------------------------------------------------

 

원래 bash쉘을 획득하여 my-pass를 알아내면 다음 단계로 넘어가지만,

GDB를 이용하여 ExcuteMe 파일의 상세 동작원리를 분석합니다.

 

1) GDB 실행

아래 옵션들을 이용하여 gdb를 실행시킵니다.

------------------------------------------------------------------------------------------------------------------------

옵션1)  실행 시 출력되는 도움말을 생략  -->  -q

옵션2)  AT&T 어셈블리어 명령어를 intel 어셈블리어 명령어로 변경  :  set disassembly-flavor intel

------------------------------------------------------------------------------------------------------------------------

 

2) 흐름파악

disas main의 출력결과를 통해 프로그램의 실행 흐름을 파악할 수 있습니다.

system 함수로 명령어를 실행

chdir 함수로 디렉터리를 이동

printf 함수로 문자열을 출력

fgets 함수를 이용한 사용자 입력

strstr 함수를 이용하여 금지문자열과 입력 받은 사용자 문자열 비교 : my-pass, chmod

금지명령어가 아닌경우 실행 루틴으로 이동

setreuid(3002, 3002) 함수를 이용해 실행되는 파일의 User ID 권한을 Level2 계정으로 설정

system 함수를 이용해서 입력받은 문자열을 리눅스의 명령어로 실행

 

 

3) 주요 함수 분석

① printf

disas main 명령어를 이용하여 아래로 내려가다 보면 printf 함수가 많이 나옵니다.

내용은 아까 우리가 보았던 "레벨 2의권한으로 당신이 원하는...." 을 화면에 찍는 용도입니다.

마지막 printf 함수에 push 되는 인자값들을 x/s 명령어를 이용하여 살펴보면,

아래와 같이 level2의 쉘처럼 "[level2@ftz level2]$" 를 프린트 하는것을 볼 수 있습니다.

한마디로 실제 쉘이 아니라, 프로그램이 의도적으로 printf 한 내용이라는 것을 알 수 있습니다.

 

setreuid + system

프로그램의 마지막 부분을 보면 setreuid와 system 함수를 볼 수 있습니다.

setreuid 함수에 들어가는 인자값은 UID와 GID값이고, 둘다 0xbba(3002) 입니다.

 

3002는 Level2의 UID값입니다. 참고로 Level1은 3001입니다.

해당사항은 id명령어나 /etc/password 를 확인하면 알 수 있습니다.

Tip. UID란?

시스템 내에서 사용자를 식별할 수 있는 유일한 값입니다. GID는 UID들이 소속되어 있는 그룹ID 입니다.

 

 

4) 결과정리

정리하면, setreuid 함수를 이용하여 Level2의 권한을 획득한 뒤, 

뒤에 따라나오는 system 함수를 실행하는 것이 프로그램의 주요 기능입니다.

 

':: 문제풀이 > Hacker School' 카테고리의 다른 글

해커스쿨 FTZ Level3 풀이  (1) 2016.07.21
해커스쿨 FTZ Level2 풀이  (0) 2016.07.21
posted by Red_Message