모든 프로세스는 유저 ID와 그룹 ID를 가짐.
모든 파일과 디렉토리는 유저와 그룹에 의해 소유됨.
child 프로세스의 경우도 부모 프로세스로부터 이를 상속받음.
UID가 0인 경우는 관리자 권한, 즉 루트 권한을 뜻함.
사용자의 UID가 1000인 경우에 루트 권한을 획득하려면 권한을 상승시켜야 함.
SUID를 실행하게 됨으로써 권한 상승이 가능해짐.
SUID : 부모 프로세스의 UID 대신 파일 소유자의 eUID로 실행
SGID : 부모 프로세스의 GID 대신 파일 소유자의 eGID로 실행
Sticky : 파일 소유주에게 파일 삭제를 제한하기 위한 공유 디렉토리에 사용됨
eUID, eGID : 대부분의 접근 확인에 쓰이는 UID/GID
Real(UID, GID) : 프로세스 소유쥬의 실제 UID/GID로, 시그널 확인 등에 사용됨.
Saved : 프로세스가 프로세스의 eUID/eGID로 전활한 수 있는 UID/GID. 일시적 권한 하락에 사용.
eUID가 0인 경우에 매우 강력한 권한 존재.
모든 파일을 열 수 있고, 실행하며, 모든 UID/GID를 취할 수 있고, 모든 프로그램을 디버깅 할 수 있음.
이는 보안에 있어 치명적일 수 있음.
Privilege Escalation은 익스플로잇의 일종으로 공격자가 권한을 루트 레벨로 상승시키는 데 사용.
취약점을 찾아 권한 상승 취약점을 가지고 있는 프로그램을 실행함으로써
Privilege Escalation을 일으킬 수 있음.
1주차와 마찬가지로 문제 수가 많기 때문에 몇 가지만 풀이를 작성했다.
1. babysuid28
SUID를 통해 timeout 프로그램을 실행하면 root 권한을 얻게 되어있다.
timeout은 timeout [시간] [커맨드] 형태로 사용하며
해당 시간이 지나면 입력된 커맨드를 통해 실행 중인 프로세스를 종료한다.
flag 파일의 권한은 루트 유저만 읽을 수 있게 설정되었기 때문에
단순한 cat 명령어로는 읽을 수 없지만
timeout을 사용하는 동안은 UID가 루트로 설정되기 때문에
timeout [시간] cat flag 명령을 통해 플래그를 획득할 수 있다.
2. babysuid31
SUID를 통해 watch 프로그램을 실행하면 root 권한을 얻게 설정되어있다.
watch는 임의의 명령을 정기적으로 실행하고
해당 명령의 출력을 터미널에 표시한다.
명령을 반복적으로 실행하며 출력의 변화를 시간에 따라 확인해야 하는 경우에 유용하다.
watch는 watch [옵션] [커맨드] 형태로 사용할 수 있고
-x 옵션의 경우 다음 커맨드 실행을 위해 pass하는 기능을 가지고 있다.
마찬가지로 watch 사용중엔 UID가 루트로 설정되기 때문에
watch -x cat flag 명령을 통해 플래그를 획득할 수 있다.
3. babysuid33
SUID를 통해 whiptail 프로그램을 실행하면 root 권한을 얻게 설정되어있다.
whiptail은 CLI로 구성되어 있는 리눅스 터미널이나 서버 OS 등에서
GUI에서와 같은 대화 상자를 표현할 수 있는 프로그램이다.
whiptail의 경우 여러 가지 형태의 대화 상자를 표현할 수 있는데
팝업창, 선택창, 메시지 박스 등 여러 가지 형태가 옵션에 포함된다.
whiptail [옵션] [입력/파일] [옵션에 따른 크기 등의 부가 옵션]의 형태로 구성된
명령을 통해 whiptail을 사용할 수 있다.
옵션 중 --textbox같은 경우 텍스트를 메시지 박스 안에 띄우는 형태이다.
textbox 옵션 사용시 옵션 뒤에 입력 내용과 높이와 너비가 부가 옵션으로 사용된다.
따라서 whiptail --textbox flag 10 50 명령으로
50*10 크기의 메시지 박스에 flag 파일의 내용을 출력하여 플래그를 획득할 수 있다.