(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.