WAR GAME/Nebula

[Exploit-Exercises: Nebula] level02 풀이

jir4vvit 2020. 5. 20. 18:19

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

* level02

ID: level02

PW: level02

 

level02 문제

아래 프로그램에는 임의 프로그램을 실행할 수 있는 취약점이 있는데, 찾을 수 있는가?
이 단계를 수행하려면 level02 계정으로 로그인해라. 이 레벨의 파일은 /home/flag02에서 찾을 수 있다.

 

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


 

문제의 /home/flag02 로 이동하여 파일을 실행시킴

문제의 /home/flag02로 이동하여 flag02의 setUID가 걸린 flag02의 파일을 실행시켜보았다.

지금 나(level02)의 권한으로는 읽기(r)과 실행(x)권한밖에 주어져있지 않다.

 

음....... 뭔말인지 모르겠다. 코드를 살펴보도록 하겠다.


문제에서 제공 해 준 코드

일단 코드부터 살펴보도록 하겠다.

 

setresuid함수까지는 이 전 level01에서 풀었던 문제와 똑같다.

대충 보면 gid에는 level02가, uid에는 flag02가 들어가게 된다.

 

자세한 설명은 저번문제를 보고 여기서는 생략하도록 하겠다.

jiravvit.tistory.com/entry/Exploit-Exercises-Nebula-level01-%ED%92%80%EC%9D%B4

 

[Exploit-Exercises: Nebula] level01 풀이

환경설정 : iso 파일을 이용하여 서버를 연 후, cygwin을 이용하여 ssh로 서버에 접속함. * level01 ID: level01 PW: level01 아래 프로그램에는 임의의 프로그램을 실행할 수 있는 취약점이 있는데, 찾을 수 ��

jiravvit.tistory.com

 


아래 부분만 떼와서 보겠다.

  buffer = NULL; // buffer 안에 값을 비움

 

  // &buffer : buffer 변수 그 자체의 주소

  // 2번째 파라미터의 %s는 getenv("USER")의 값 : level02
  asprintf(&buffer, "/bin/echo %s is cool", getenv("USER")); 

  // asprintf는 &buffer의 위치에 2번째 파라미터 값을 출력함(저장함)

  // printf는 모니터 화면에 값을 출력함
  printf("about to call system(\"%s\")\n", buffer);

  // 2번째 파라미터 buffer에 저장된 값을 첫번째 파라미터의 %s에 넣음
   
  system(buffer); // 리눅스 쉘 명령을 실행함

 

 

getenv("USER")의 값

getenv("USER")의 값은 저기 env 명령(환경변수 출력)을 치고 나오는 환경변수의 USER에 담겨 있는 값이다.

그러면 이 문제에서는 getenv("USER")가 level02가 되겠다.

 

 

그래서 실행을 하면 이런식으로 출력이 되는 것이다.

 

flag02 파일이 실행될 때 flag02 권한으로 실행이 됨으로 USER의 값을 잘 조작해서 flag02의 권한을 계속 유지해서 getflag 명령을 입력하면 문제가 풀릴 것 같다.


 

환경변수 USER의 값 조작

USER=";/bin/bash;"

;는 명령어를 구분해 준다.

" "를 입력해 준 이유는  " "이 없으면 USER=, /bin/bash 이렇게 따로따로 명령으로 이해하기 때문이다.

 

환경변수 USER의 값을 조작해 준 뒤 env 명령을 쳐서 확인해보면 USER의 값이 잘 바뀌었다는 것을 알 수 있다.

 

 

문제해결!

그리고 마지막으로 flag02를 잘 실행시키고 계정명이 바뀐 level02에서 flag02로 바뀐 것을 확인하고 난 후 getflag 명령을 입력하면 문제해결이다.

 

아 그리고 첫번째 줄 출력된 것을 잘 보면 

/bin/echo ;/bin/bash; is cool

이렇게 되어 있는데 이것은 세미콜론(;)을 기준으로 세개의 명령을 뜻하게 된다.

 

 

[참고]

 

exit

flag02의 계정에서 exit 명령을 하게 되면 level02로 돌아오게 된다.

그 전에 sh 부분을 잘 보면 is라는 명령은 없다고 뜬다.

 

 

 

끝!