WARGAME/FTZ

FTZ level5 풀이

msh1307 2022. 2. 24. 23:16

*FTZ를 공부하면서 배운 것들을 정리했습니다. 틀린 정보가 있을 수 있습니다.

계정/비번: level5/what is your name?

 

힌트 먼저 봅시다.

/usr/bin/level5가 /tmp에 임시파일을 생성한다고 하네요.

실행시키고 /tmp를 확인해보겠습니다.

실행을 계속 시켜봐도 /tmp에는 임시파일이 생성되지 않네요. 

임시파일이라 프로그램이 꺼지면서 임시파일도 삭제되는 것 같네요. 

 

임시파일이 삭제되지 않게 하는 방법이 뭐가 있을까요? 

한번 /usr/bin/level5의 퍼미션을 확인해봅시다. 

level6의 권한으로 SetUID가 설정되어있네요. 

프로그램을 실행시켰을 때, 프로그램은 level6 퍼미션으로 /tmp에 level5.tmp라는 임시파일을 만들고, 삭제합니다. 

만약 level5.tmp를 미리 생성하고, 퍼미션을 적당히 변경해서 저 프로그램이 지우지 못하게 한다면, level5.tmp를 확인 할 수 있을 겁니다. 

먼저 /tmp에 level5.tmp를 생성하고 퍼미션을 확인해보겠습니다.

퍼미션을 보니, level5 유저, 그룹은 Read, Write 퍼미션이 있고, 아더는 Read 퍼미션만 있네요. 

만약 stickybit를 걸어둔다면, /usr/bin/level5를 실행시켰을 때, 그룹은 level5라서 수정은 가능하지만, setuid로 level6가 되었고 소유자가 아니기 때문에 삭제는 못할 겁니다. 결국 level5.tmp를 볼 수 있게 되는 것이죠. 

 level5.tmp파일에 sticky bit를 걸어봅시다. 

T는 eXecute 퍼미션 없을 때, 대문자로 표기되고, 있으면 소문자 t로 표기됩니다. 

이제 /usr/bin/level5를 실행시키고 확인해봅시다.

사실 굳이 파일에 stickybit를 걸지 않아도 됩니다. 안걸고 테스트를 해봐도, 내용 덮어쓰기는 되는 데, 파일 삭제는 되지 않습니다.

왜냐하면 여기서 보시다시피, /tmp 폴더엔 sticky bit가 설정되어 있어서, 하위 경로에 모두 sticky bit가 설정됩니다. 

결국 /usr/bin/level5는 RUID가 level5, EUID level6, RGID level5 EGID level5가 되고 이미 생성된 user가 level5, group이 level5인 level5.tmp파일은 수정은 그룹이 같아 가능하지만, 삭제는 user가 달라서 불가능합니다. 

 

*참고

- RUID : 프로세스를 실행시킨 사용자의 UID를 의미합니다.

- EUID : 프로세스가 실행중인 동안 실질적인 UID 액세스 권한을 의미합니다. 대부분 RUID와 일치합니다. setuid가 걸려있을 때, 이 EUID가 변경됩니다. 

- RGID : 프로세스를 실행시킨 사용자의 GID를 의미합니다.

- EGID : 프로세스가 실행중인 동안의 실질적인 GID 액세스 권한을 의미합니다.

 

원래 RUID는 변경되지 않지만, 만약 root 퍼미션이 있다면, RUID EUID 등을 변경이 가능하기는 합니다.

예를 들어보자면, setuid가 걸려있어도 shell script같은 interpreted executables는 setuid가 무시됩니다. setuid가 대부분 바이너리에 걸려있는 이유이기도 합니다. shell script를 통해 my-pass를 실행하도록 해도 EUID가 리셋되고 RUID와 같아지기 때문에 실질적으로는 RUID의 비밀번호만 알 수 있습니다. 

만약 실행한 프로세스가 루트권한을 가지고 있다면, C에서 setuid()함수를 통해서 RUID도 변경이 가능해서 my-pass같은 명령을 실행시켜도 변경된 UID로 실행한 명령의 결과를 볼 수는 있기는 합니다. 하지만, 아니라면, setuid()함수를 써도, EUID만 변경됩니다. C의 system()함수도 그냥 쉘로 넘겨주기만 하기 때문에, interpreted executables처럼 취급됩니다. 
아래 stackoverflow의 질문이 이해하는 데 도움이 될 수 있겠네요.

https://stackoverflow.com/questions/556194/calling-a-script-from-a-setuid-root-c-program-script-does-not-run-as-root

 

Calling a script from a setuid root C program - script does not run as root

I need to run a bash script as root (passwordless sudo or su not viable) and since you cannot setuid a script in Linux, I thought about calling it from an executable and making it setuid: $ cat wr...

stackoverflow.com

 

'WARGAME > FTZ' 카테고리의 다른 글

FTZ level7 풀이  (0) 2022.02.26
FTZ level6 풀이  (0) 2022.02.26
FTZ level4 풀이  (0) 2022.02.17
FTZ level3 풀이  (0) 2022.02.15
FTZ level2 풀이  (0) 2022.02.12