티스토리 뷰

 

-목차-

1. SUID/SGID

2. STID

3. 실제사용자(Real User ID)와 유효 사용자(Effective User ID)

4. setreuid

 

SUID/SGID

 

루트가 아닌 사용자들이 잠깐 루트의 사용권한을 써서 프로그램을 실행해야 할 필요가 있을때 주는 권한입니다. S*ID가 설정된 파일은 특정 명령어를 실행하여 root권한 획득 및 정상 서비스 장애를 발생시킬 수 있으며, 로컬 공격에 많이 이용되므로 보안상 철저한 관리가 필요합니다.

 

SUID의 절대표기값은 4000입니다. 일반사용자가 소유자 권한으로 실행할 수 있도록 하며, 보안상 문제가 생길 확률이 높기 때문에 조심해서 사용하여야 합니다.

 

SGID의 절대표기값은 2000입니다. 일반사용자가 소유 그룹의 권한을 실행할 수 있도록 합니다. 

 

 

 

 


 

STID

STICKY BIT는 모든 사용자가 쓸 수 있는 디렉토리를 적용하여 디렉토리 내에 있는 파일을 임의대로 삭제할수 없고, 오직 소유자에게만 삭제, 변경 권한이있습니다. 리눅스에서는 /tmp 디렉토리가 대표적인 sticky bit로 설정이 되어있습니다.

 

 

 


 

 

실제 사용자 ID 와 유효사용자 ID

유닉스 계열 운영체제의 커널은 사용자를 식별할 때 사용자 식별자(UID)라 불리는 양의 정수를 사용합니다. UID로 사용되는 정수의 범위는 시스템에 따라 상이합니다. UID는 최소한 다음과 같은 제약하의 15비트 정수(0 ~ 32767)로 표현됩니다.

 

실제 사용자ID(ruid)

프로세스의 실제 소유자는 실제 UID(ruid)와 실제 GID(rgid)로 정해지고, 프로세스간 시그널 전송에 영향을 줍니다. 슈퍼유저가 아닌 권한으로 실행중인 프로세스가 다른 프로세스에 시그널을 보내기 위해서는 시그널을 보내는 프로세스의 실제 혹은 유효 UID가 시그널을 받는 프로세스의 실제 혹은 저장된 UID와 같아야합니다. 자식 프로세스는 부모 프로세스로 부터 자격증명을 이어받기 때문에 상호간의 시그널 전송이 가능합니다.

 

유효 사용자 ID(euid)

어떤 프로세스가 생성한 파일의 소유자는 그 프로세스의 유효 사용자 ID로 정해집니다. 커널과 마운트 옵션에 따라 유효 GID(egid)또한 파일 생성에 영향을 주기도 합니다. 파일에 접근시 커널은 프로세스의 유효 UID와 GID를 통해 파일접근을 허용할지 말지를 결정합니다.

 

 


 

setreuid

int setreuid(uid_t ruid, uid_t euid) 이며 성공시 0, 실패시 -1을 return한다.

 

 


실험

우선 level2로 SUID와 SGID가 걸린 파일을 find 명령어로 찾습니다. 위에 나온 find 명령어의 옵션 방식은 현재 사용되지 않습니다. 하지만 서버를 만들 당시에 환경이 오래되었으므로 위의 명령어를 사용합니다.(위 환경은 docker로 구축된 서버입니다.) 최근 버전에서는 다음과 같이 명령어를 사용할 수 있습니다.

 

 

위에서 find 옵션을 통해 /bin/ExecuteMe에 level2 계정 소유이고, level1 계정 그룹 권한으로 SGID가 걸려있는 파일을 찾았습니다. 앞부분에 s표시를 통해 다시한번 확인합니다.

파일을 실행합니다.

'level2의 권한으로'라고 되어있어 사실인지 확인합니다.

 uid가 level2인 것을 확인하였습니다.

 

또한 완전한 쉘을 얻기위해 다음과 같이 입력후 확인합니다.

 

 

위와 같은 방식으로 쉘을 얻을 수 있고 vim에서 쉘을 실행하는 부가기능을 이용해서 또한 얻을 수 있습니다.

 

반응형