환경설정 : iso 파일을 이용하여 서버를 연 후, cygwin을 이용하여 ssh로 서버에 접속함. * level02 ID: level02 PW: level02 |
아래 프로그램에는 임의 프로그램을 실행할 수 있는 취약점이 있는데, 찾을 수 있는가?
이 단계를 수행하려면 level02 계정으로 로그인해라. 이 레벨의 파일은 /home/flag02에서 찾을 수 있다.
문제를 푸는 방법 : 다음 레벨의 패스워드를 얻는 것이 아니라 flag01의 권한을 획득하여 getflag를 실행시키는 것
문제의 /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
아래 부분만 떼와서 보겠다.
buffer = NULL; // buffer 안에 값을 비움
// &buffer : buffer 변수 그 자체의 주소 // 2번째 파라미터의 %s는 getenv("USER")의 값 : level02 // asprintf는 &buffer의 위치에 2번째 파라미터 값을 출력함(저장함) // printf는 모니터 화면에 값을 출력함 // 2번째 파라미터 buffer에 저장된 값을 첫번째 파라미터의 %s에 넣음 |
getenv("USER")의 값은 저기 env 명령(환경변수 출력)을 치고 나오는 환경변수의 USER에 담겨 있는 값이다.
그러면 이 문제에서는 getenv("USER")가 level02가 되겠다.
그래서 실행을 하면 이런식으로 출력이 되는 것이다.
flag02 파일이 실행될 때 flag02 권한으로 실행이 됨으로 USER의 값을 잘 조작해서 flag02의 권한을 계속 유지해서 getflag 명령을 입력하면 문제가 풀릴 것 같다.
USER=";/bin/bash;"
;는 명령어를 구분해 준다.
" "를 입력해 준 이유는 " "이 없으면 USER=, /bin/bash 이렇게 따로따로 명령으로 이해하기 때문이다.
환경변수 USER의 값을 조작해 준 뒤 env 명령을 쳐서 확인해보면 USER의 값이 잘 바뀌었다는 것을 알 수 있다.
그리고 마지막으로 flag02를 잘 실행시키고 계정명이 바뀐 level02에서 flag02로 바뀐 것을 확인하고 난 후 getflag 명령을 입력하면 문제해결이다.
아 그리고 첫번째 줄 출력된 것을 잘 보면
/bin/echo ;/bin/bash; is cool
이렇게 되어 있는데 이것은 세미콜론(;)을 기준으로 세개의 명령을 뜻하게 된다.
[참고]
flag02의 계정에서 exit 명령을 하게 되면 level02로 돌아오게 된다.
그 전에 sh 부분을 잘 보면 is라는 명령은 없다고 뜬다.
끝!
'WAR GAME > Nebula' 카테고리의 다른 글
[Exploit-Exercises: Nebula] level04 풀이 (0) | 2020.06.11 |
---|---|
[Exploit-Exercises: Nebula] level03 풀이 (0) | 2020.05.21 |
[Exploit-Exercises: Nebula] level01 풀이 (0) | 2020.05.14 |
[Exploit-Exercises: Nebula] level00 풀이 (0) | 2020.03.24 |
[Exploit-Exercises: Nebula] Nebula wargame 소개 (0) | 2020.03.16 |