본문 바로가기

Pwnable/FTZ

[ProjectH4C] [Write-up] 해커스쿨 FTZ Level 5

Level5로 로그인한 후, 역시나 가장 먼저 ls -al과 find / -group level5 2>/dev/null을 실행해보았다. ls -al은 별거 없었고, find의 결과는 다음과 같았다.

 

proc 디렉토리와 home 디렉토리를 제외하고 /usr/bin/level5가 존재한다. ls -al을 통해 확인해보았다.

 

level6의 권한을 얻어서 비밀번호를 출력해내면 되는 것 같아서 일단 어떤 프로그램인지 알아보기 위해 실행시켜보았다.

아무일도 일어나지 않았다. 디버깅을 하려했더니 권한이 없어서 못한다고 하고 복사를 해오려했더니 그것도 권한이 없다고 나온다.

혹시 어떠한 파일을 만들어내는 프로그램인가 싶어서 find를 이용해 생성됐을만한 파일을 검색해보려 했지만 단서라고 할만한 것을 찾아내지 못했다.

한참을 아무것도 못하다가, 결국 힌트를 보기로 했다.

 

level5.tmp 라는 파일이 /tmp 디렉토리에 생성된다고 한다. 그런데, /tmp에 가서 보면 파일이 tmp 파일이 존재하지 않는다. 혹시나 /home/level5/tmp일까 싶어 확인해봤지만, 이 곳에도 생성되어 있지 않았다.

혹시 프로그램이 실행되면서 level5.tmp 파일이 만들어지고, 종료되면서 level5.tmp가 삭제되는건 아닐까 싶은 의문이 들었다. 만약 그런 과정이 실행된다면, level5.tmp 라는 파일을 미리 만들어두면 어떻게 될까라는 생각이 들어서 /tmp의 권한을 보았더니, drwxrwxrwt라고 나온다. t라는 권한을 처음봐서 구글링 해보았더니 스티키 비트(Sticky bit) 설정이라고 한다.

 


※ Sticky bit란?

하나의 서버에 여러 사용자가 동시에 사용하는 유닉스의 특성 상, 파일의 소유자가 아니면 해당 파일을 지우거나 수정하지 못하도록 권한을 설정 할 수 있다. 하지만, 서버 내의 딱 두 군데가 모든 사용자에 대해 읽기, 쓰기, 실행 권한이 주어지는데, /tmp와 /var/tmp이다. 해당 디렉토리의 권한은 777(rwxrwxrwx)이기 때문에, 디렉토리 아래에 777권한의 파일들이 무분별하게 생성되었고, 사용자가 해당 디렉토리를 이용할 때  존재하는 파일들 중 꼭 필요한 파일들이 무엇인지 구분하기가 어려워서 무분별하게 삭제하게 되었고, 사용중인 파일을 삭제하게 되면서 서비스 장애를 일으키는 문제점이 생겼다. 이러한 경우를 방지하기 위해 생겨난 개념이 바로 Sticky bit이다. Sticky bit의 설정은 다음과 같다.

Sticky bit가 설정된 디렉토리 내에서는

  • 권한이 777인 파일에 대해서는 파일의 소유자만 삭제 가능.(수정, 실행, 읽기는 모두가 가능)
  • Sticky bit 설정된 디렉토리 자체도 소유자만 삭제 가능.
  • root는 전부 다 맘대로 삭제할 수 있음.

SetUID, SetGID를 숫자로 표현할 때 각각 4000, 2000으로 표현하듯이, Sticky bit는 1000으로써 표현되며, 권한 설정을 해줄 땐 

chmod o+t 또는 chmod 1777과 같이 사용해준다. 이 때, 스티키 비트가 설정된 디렉토리는 아더(Other)의 실행권한 부분에 x가 아닌 t가 표시되는데, 아더의 실행권한이 존재하면 소문자 t, 실행권한이 존재하지 않으면 대문자 T로 표현된다.

 


 

sticky bit의 특성을 이용하면 될 것 같은 느낌이 든다. /usr/bin/level5의 소유자는 level6이다. 그러니, 만약 해당 프로그램이 level5.tmp를 만들고, 무언가 내용을 작성하고, 삭제하는 과정을 거치는 프로그램이라면 level5 소유의 level5.tmp 파일을 미리 만들어두면 삭제하는 과정을 실행할 때 level6 유저가 level5 유저의 파일을 삭제하려 하기 때문에 삭제되지 않을 것이다. 그렇다면 level5.tmp 파일은 그대로 남아있을 거고, 안의 내용을 확인할 수 있을 것이란 생각이 들었다.

/tmp 디렉토리 내에 level5.tmp 파일을 생성한 후에 /usr/bin/level5를 실행해보았다.

 

일단 오류는 발생하지 않았다. cat level5.tmp 를 실행했다.

 

예상한 것처럼 내용이 출력되었다! 뭔가 다른 내용이 나와서 그걸 또 해석해야할 줄 알았는데, 비밀번호가 바로 나와서 놀랐다.

생각보다 깔끔히 풀린 것 같으니 바로 level6으로 고고~!