Post

(setuid) ruid, euid

passwd 등 내부적으로 ruid를 체크하는 작업을 수행하려면 ruid를 변경해 주어야 한다.

setuid bit가 설정 되어있는 바이너리를 실행하면 euid가 변경된다. ruideuid가 변경된 상태에서 직접 setuid()를 호출해줄 때 변경된다.

때문에 setuid()를 호출하지 않는 바이너리를 이용해 쉘을 실행하더라도 euid만 변경되고 ruid는 그대로인 상태다. 이런 경우,

  1. 쉘을 실행하기 전에 setuid()도 실행하도록 하면 ruid == euid인 쉘을 얻을 수 있다.
  2. euid만 변경된 쉘에서 setuid(geteuid()) / system("/bin/sh")를 새로 컴파일해서 실행하면 ruid == euid인 쉘을 얻을 수 있다. 일단 euid가 변경되고 나면 그 이후 실행되는 subprocess는 모두 그 euid로 실행되기 때문에 가능하다.
This post is licensed under CC BY 4.0 by the author.