WAR GAME/Nebula

[Exploit-Exercises: Nebula] level04 풀이

jir4vvit 2020. 6. 11. 19:00

환경설정 : iso 파일을 이용하여 서버를 연 후, cygwin을 이용하여 ssh로 서버에 접속함.

* level04

ID: level04

PW: level04

 

문제04

이 level에서는 토큰 파일을 읽어야 한다.

하지만 주어진 코드는 읽을 수 있는 파일을 제한한다.(읽지 못하게 한다.) 이것을 우회할 수 있는 방법을 찾아라 :)

이 level을 수행하려면 level04 계정으로 로그인해라. 이 level의 파일은 /home/flag04에서 찾을 수 있다.

 

문제에서 제공해주는 소스파일

 

문제를 푸는 방법 : 다음 레벨의 패스워드를 얻는 것이 아니라 flag03의 권한을 획득하여 getflag를 실행시키는 것


일단 문제를 풀어보도록 하겠다. 

flag04 파일을 보면 level04인 우리가 읽고 실행시킬 수 있다.

 

 

일단 내 입맛(?)대로 실행시켜보았다. 소스코드의 첫번째 if문과 두번째 if문에 걸렸다. 

 

 

소스코드의 fd 부분과 open 함수 부분을 확인해보겠다. (빨간색 네모)

fd인 파일디스크립터에 대하여는 다른 포스팅으로 정리해뒀다. 혹시나 잘 모른다면 참고하길 바란다!

jiravvit.tistory.com/entry/%ED%8C%8C%EC%9D%BC-%EB%94%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%84%B0-File-Descriptor

 

파일 디스크립터 (File Descriptor)

시스템 문제를 풀다보면 파일 디스크립터, 일명 fd라는 것이 자주 등장한다. 난 이걸 오래전부터 봐왔지만 볼 때마다 헷갈려 했었다. 요즘 푸는 nebula 워게임 문제에 나타나 이참에 정리 해보려고

jiravvit.tistory.com

 

open 함수를 이용하여 파일을 열면 성공하면 파일디스크립터를 반환하고 실패하면 음수를 반환한다.

그럼 바로 아래 if문은 파일을 여는데 실패한 경우를 뜻한다.

 

파란색 네모 read함수를 살펴보겠다.

read함수는 파일을 읽어들였을때 성공한 경우 읽어들인 바이트 수를 반환하고 실패할 경우는 음수를 반환한다.

바로 아래 if문은 파일을 읽어들이는데 실패한 경우를 뜻한다.

 

노란색 네모write함수를 살펴보겠다.

write함수는 파일을 버퍼에 쓰는데, 성공한 경우 쓴 바이트 수를 반환하고 실패한 경우는 역시 음수를 반환한다.

 

 

사실 open, read, write함수를 계속 찾아봤으나 이해가 잘 되지않는다. (내가 이해한 부분만 기술하였다...) 더 공부해서 블로그에 포스팅하도록 하겠다 ㅜㅜ

 

문제를 푸는데는 이정도의 지식만 있어도 괜찮다.

 


다시 문제를 풀어보도록 하겠다.

문제의 핵심은 token 파일을 읽어들여야하는데 token이라는 것 문자 자체를 쓰지 못한다는 것이다.

우리는 이것을 우회해야한다.

 

나는 여기서 세가지 방법을 생각해보았다.

  1. cp 명령어 사용 (token 파일을 복사하면서 다른이름으로 저장)
  2. 심볼릭링크 (Symbolic Link)
  3. 하드링크 (Hard Link)

(심볼릭링크와 하드링크의 차이는 다음에 포스팅하겠다...)

 

첫번째 방법은 일단 flag04 파일의 권한이 600 이여서 건들 수가 없었다.

세번째 방법도 권한이 없었다.

 

여기서는 두번째 방법인 심볼릭링크로 풀어야한다. 

 

심볼릭 링크를 사용하여 문제를 푸는 모습

 

심볼릭 링크는 간단하게 '윈도우의 바로가기'라고 생각하면 된다.

 

위의 사진처럼 문제를 풀게되면 flag04의 패스워드값처럼 보이는 것(token파일을 읽음)이 출력된다. 이것으로 flag04에 로그인 하고 getflag를 발동시키면 문제가 풀리게 된다.

 

 

getflag

su 명령어를 통해서 flag04의 계정으로 로그인하는데 성공했다.