(setuid) ruid, euid
passwd 등 내부적으로 ruid
를 체크하는 작업을 수행하려면 ruid
를 변경해 주어야 한다.
setuid
bit가 설정 되어있는 바이너리를 실행하면 euid
가 변경된다. ruid
는 euid
가 변경된 상태에서 직접 setuid()
를 호출해줄 때 변경된다.
때문에 setuid()
를 호출하지 않는 바이너리를 이용해 쉘을 실행하더라도 euid
만 변경되고 ruid
는 그대로인 상태다. 이런 경우,
- 쉘을 실행하기 전에
setuid()
도 실행하도록 하면ruid == euid
인 쉘을 얻을 수 있다. euid
만 변경된 쉘에서setuid(geteuid()) / system("/bin/sh")
를 새로 컴파일해서 실행하면ruid == euid
인 쉘을 얻을 수 있다. 일단euid
가 변경되고 나면 그 이후 실행되는 subprocess는 모두 그euid
로 실행되기 때문에 가능하다.
This post is licensed under CC BY 4.0 by the author.