Github avatar

GyeongSu Han's Github Pages

FTZ Level1

May 19, 2015 · Wargame

FTZ에 접속하실 분들은 telnet ftz.hackerschool.org 으로 접속하여 하시면 되겠습니다. level1 / level1 으로 접속하여 진행하도록 하겠습니다.

[level1@ftz level1]$ ls
hint  public_html  tmp

접속을 하여 파일을 확인해 보면 hint라는 파일이 있습니다.

[level1@ftz level1]$ cat hint
level2 권한에 setuid가 걸린 파일을 찾는다.

setuid뿐만 아니라 setgid, sticky bit라는게 존재합니다. 3가지 모두 알아봅시다.

  • setuid

    • 해당 프로그램을 실행시킬 경우 프로그램이 작동하는 동안 소유자의 권한을 가지는 권한 입니다.
    • 만약 user1의 파일에 setuid가 걸려있는 상태로 user2가 실행을 하게될 경우, user2가 일시적으로 user1이 될 수 있습니다.
  • setgid

    • setuid와 비슷하지만 소유자가 아닌 소유그룹이 대상입니다.
  • sticky bit

    • sticky bit가 설정되었을 경우 수정이나 실행, 읽기의 경우는 허용이 되지만, 삭제의 경우에는 소유자만 할 수 있습니다. 하지만 root의 경우는 예외적으로 삭제를 할 수 있습니다.

해당 권한이 걸려있는 경우를 확인하기 쉬운 방법은 ls -l을 이용하여 확인할 수 있습니다.

[level1@ftz tmp]$ ls -l test
-rwsrwsrwt    1 level1   level1      11435 Mar  2 00:49 test

앞에서부터 s는 setuid가 걸려있는 경우, 가운데 s는 setgid가 걸려있는 경우, 마지막 t는 sticky bit가 걸려있는 경우입니다. test파일은 현재 rwx의 권한을 모두 가지고 있는 상태입니다. 여기서 보아야 할 점은 특수한 권한인 setuid, setgid, sticky bit가 설정된 경우에는 x의 부분에 표시가 된다는 점입니다. 그럼 만약 x가 걸려있는 상태가 아니라면 어떻게 나올까요?

[level1@ftz tmp]$ ls -l test
-rwSrwSrwT    1 level1   level1      11435 Mar  2 00:49 test

아까와 마찬가지로 x의 부분에 나타나기는 하지만 차이점으로는 x의 권한이 존재한다면 소문자로 출력이 되었지만, 만약 권한이 없는 상태라면 대문자로 차이점을 표현하였습니다.

그럼 이 권한을 어떻게 부여 할까요? 방법은 chmod를 이용하여 권한을 부여하게 됩니다. chmod를 사용하면 단순히 rwx뿐만 아니라 setuid, setgid, sticky bit의 권한도 부여가 가능합니다.

[level1@ftz tmp]$ ls -l test
----------    1 level1   level1          5 May 17 07:55 test

현재 권한이 설정되어 있지 않은 상태입니다. 이 상태에서 chmod명령어를 이용하여 권한을 설정해 보겠습니다.

[level1@ftz tmp]$ chmod 1000 test
[level1@ftz tmp]$ ls -l test
---------T    1 level1   level1          5 May 17 07:55 test

1000을 주었더니 sticky bit가 걸리게 되었습니다. 그럼 다른 권한도 입력해 보겠습니다.

[level1@ftz tmp]$ chmod 2000 test
[level1@ftz tmp]$ ls -l test
------S---    1 level1   level1          5 May 17 07:55 test

2000을 주게되니 setgid가 걸렸습니다. 마지막인 setuid도 해보겠습니다.

[level1@ftz tmp]$ chmod 4000 test
[level1@ftz tmp]$ ls -l test
---S------    1 level1   level1          5 May 17 07:55 test

4000을 이용하여 권한을 부여하였습니다. 이뿐만 아니라 한번에 여러개를 부여할수도 있습니다.

[level1@ftz tmp]$ chmod 5000 test
[level1@ftz tmp]$ ls -l test
---S-----T    1 level1   level1          5 May 17 07:55 test

5(4 + 1)000을 사용하니 sticky bit와 setuid가 함께 걸리게 되었습니다. 이런식으로 여러 조합을 이용하여 원하는 권한을 설정할 수 있습니다.

이제 본론으로 들어가서 문제를 해결해 보겠습니다.

find는 find [path...] [expression] 이런식으로 사용할 수 있습니다.

찾고자 하는 파일이 어디에 있는지 모르기 때문에, /폴더부터 검색을 시작하도록 하겠습니다. 먼저 find명령의 -perm옵션을 통하여 setuid가 걸려있는 파일을 검색하도록 하겠습니다.

[level1@ftz level1]$ find / -perm -4000
find: /lost+found: Permission denied
... 생략 ...
/sbin/unix_chkpwd
[level1@ftz level1]$

-perm옵션에 -4000으로 주었는데, 이는 4(setuid), 2(setgid), 1(sticky bit)중 setuid를 검색하는 옵션입니다.

여기서 +6000으로 주는 방법도 있는데, -와 +의 차이점은 and와 or의 차이점이라 보시면 될 것 같습니다.

-6000을 하게 되면 4 and 2라 생각하시면 될 것 같고, +6000을 하게 되면 4 or 2라 생각하시면 됩니다. 4와 2의 권한중 한개만 걸려있어도 권한을 상승시켜 사용할 수 있기 때문에 이중 한개만 걸려있어도 검색하는 +6000을 사용하는 경우가 많습니다.

이렇게 결과가 나오긴 했는데 매우 많이 나오게 됩니다. 이 내용중 permission denied가 나오는데 이는 접근할 수 없는 공간을 검색을 위하여 접근하려 하니 권한이 없다고 출력을 해주는 부분 입니다. 이렇게 에러가 많이 나오는데 이 에러를 제거하기 위해서 옵션을 넣어 줍니다.

[level1@ftz level1]$ find / -perm -4000 2>/dev/null
/usr/bin/chage
... 생략 ...
/sbin/unix_chkpwd
[level1@ftz level1]$

2>/dev/null이라는 옵션은 2(표준에러)를 >(리다이렉션) 해주는데, /dev/null(휴지통과 같은 공간)으로 보내겠다. 라는 의미로 생각하시면 될 것 같습니다. 권한이 없다는 출력은 표준에러를 통해서 출력해 주는데, “표준에러를 휴지통으로 보내버리겠다.”는 옵션을 주어 많은 결과물을 줄이게 되었습니다. 하지만 아직도 많은 파일이 뜨게 되는데, 이중 우리에게 필요한 것은 level2의 파일이므로, 옵션을 한개 더 주도록 하겠습니다.

[level1@ftz level1]$ find / -user level2 -perm -4000 2>/dev/null
/bin/ExecuteMe
[level1@ftz level1]$ 

옵션으로 -user옵션이 추가되었는데, 해당 소유자의 파일을 검색해 주는 옵션입니다. 이 옵션을 통해 level2의 소유 파일을 검색하여 정확이 원하는 파일을 검색할 수 있게 되었습니다. 이 파일을 실행시켜 보도록 하겠습니다.

레벨2의 권한으로 당신이 원하는 명령어를
한가지 실행시켜 드리겠습니다.
(단, my-pass 와 chmod는 제외)

어떤 명령을 실행시키겠습니까?


[level2@ftz level2]$

다음 레벨의 패스워드를 알 수 있는 my-pass를 실행시킬 수 없고, chmod를 사용하지도 못합니다. 하지만 쉘을 실행시킬수 있으므로 쉘을 실행시켜 해당 파일의 명령을 우회할 수 있습니다.

[level2@ftz level2]$ bash

[level2@ftz level2]$ id
uid=3002(level2) gid=3001(level1) groups=3001(level1)
[level2@ftz level2]$ my-pass

Level2 Password is "               "

[level2@ftz level2]$