Level01의 문제는 다음과 같다.

About

There is a vulnerability in the below program that allows arbitrary programs to be executed, can you find it?

To do this level, log in as the level01 account with the password level01 . Files for this level can be found in /home/flag01.

Source code

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>

int main(int argc, char **argv, char **envp)
{
gid_t gid;
uid_t uid;
gid = getegid();
uid = geteuid();

setresgid(gid, gid, gid);
setresuid(uid, uid, uid);

system("/usr/bin/env echo and now what?");
}


문제의 핵심은 다음과 같다.

위 소스코드로 컴파일 된 프로그램을 이용해 다른 프로그램을 실행 시킬 수 있는가?


[그림 1 - 문제 프로그램의 권한과 소유자 정보]


결국 목적은 위 프로그램의 취약한 부분을 이용 해 flag00의 쉘을 띄우는 것이다. 소스코드를 보면 정말 간단한 소스코드라는 것을 알 수 있다. 프로그램의 SUID, GUID를 얻어와 얻어온 SUID, GUID로 설정 한 후 system() 함수를 실행 시킨다. 시스템 해킹에서 자주 볼 수 있는 패턴이다. 일단 우리가 공략 할 수 있는 부분은 system() 함수 부분밖에 보이지 않을 것이다. 일단 system() 함수에 인자로 들어가 있는 명령을 일반 쉘에서 실행시켜 보자.


[그림 2 - 일반 쉘에서의 명령 실행]


정상적으로 echo 명령이 실행 되는 것을 볼 수 있다. 그럼 echo 명령이 실행 될 때 쉘을 띄어주는 /bin/bash 명령이 실행 되면 어떻게 될까? flag01 계정의 쉘이 띄어지지 않을까? 충분히 가능한 일이다. echo 명령이 실행 될 때 /bin/bash 명령을 어떻게 실행해주어야 할까? 기본적으로 생각나는 방법은 심볼릭 링크가 있다. 명령이 실행 될 때 리눅스는 기본적으로 $PATH 환경변수에 설정 된 디렉토리 경로들을 검색하여 명령을 찾아 실행한다. 이때 echo 명령에 심볼릭 링크를 걸어두고 $PATH 환경 변수에 이 명령의 디렉토리 경로를 설정해 둔다면 echo 명령을 찾고 그 심볼릭 링크를 찾아 system() 함수가 최종적으로 찾은 명령을 실행 할 것이다. 


[그림 3 - /bin/echo의 권한과 사용자 정보]


한눈에 보더라도 심볼릭 링크를 현재 상황에서는 걸어 줄 수 없다는 것을 알 수 있을 것이다. 즉 우리는 새로운 echo를 만들어야 한다. 지금의 계정이 손쉽게 접근 할 수 있는 곳은 /tmp 이다. /tmp 디렉토리는 기본적으로 누구나 접근이 가능하도록 설정 되어 있기 때문이다. /tmp 디렉토리에 가짜 echo 프로그램을 만들고 시스템이 명령을 검색 할 시 /tmp 디렉토리에 echo 프로그램이 먼저 검색되도록 $PATH 환경변수 값을 수정하도록 하자.


[그림 4 - 환경 변수 설정]


지금까지는 완벽한 것처럼 보인다. 하지만 문제를 다시보면 and now what? 이라는 문자열이 존재한다. 해당 문자열을 어떻게 처리해주어야 하는 것일까? 만약에 지금까지의 시나리오대로 문제를 진행한다면 추후 system에서 수행되는 명령은 /usr/bin/env /bin/bash and now what? 이 되어버릴 것이다. 이는 맞지 않는 명령이다. 결국 echo 안에서 /bin/bash 명령을 실행해주어야 한다. 

[그림 5 - 부정확한 명령어]


여기서 필자는 간단한 쉘프로그래밍을 이용해 우리가 사용하려하는 echo 프로그램 내에서 /bin/bash 프로그램이 실행 되도록 하였다.


[그림 6 - 쉘 프로그래밍과 권한의 적절한 사용]


echo가 실행되게 되면 /bin/bash가 실행되고 실행 된 /bin/bash는 /tmp/echo2를 실행하도록 쉘 프로그래밍을 하였다. 또 /tmp/echo2 프로그램이 /bin/bash 프로그램을 가리키도록 하여 결국 system() 함수가 최종적으로 실행하는 명령은 /bin/bash 가 된다.


[그림 7 - flag01 쉘 획득]


'[+] Hacking > [-] Challenge Report' 카테고리의 다른 글

exploit-exercises Nebula - Level03  (0) 2012.07.26
exploit-exercises Nebula - Level02  (0) 2012.07.26
exploit-exercises Nebula - Level01  (0) 2012.07.25
exploit-exercises Nebula - Level00  (0) 2012.07.25
GitS CTF Packet 200 풀이  (1) 2012.06.29

+ Recent posts