시작하며
권한 이라는것은 운영체제가 시스템을 안전하게 운용하고, 또 사용자에게 제한된 안전한 기능만을 제공하기 위한 필수적인 안전장치다.
예를 들어보자.
리눅스 시스템에서 일반 사용자에게 root권한이 부여되면 어떻게 될까?
리눅스 시스템에서 root이란 무불소위의 권력을 의미한다. 즉 이 시스템에서 나는 왕이며 황제가 되는것이다.
행여나 실수로 중요한 설정 파일을 변경하거나, 삭제하기라도 한다면? 또는 rm -rf 명령을 엉뚱한 경로에서 수행한다면?
심각한 문제가 아닐 수 없다.
윈도우 운영체제에서 한번 생각해보자.
윈도우 운영체제에도 root과 비슷한 레벨의 권한이 있다.
바로 system 권한인데, 아마 윈도우 운영체제를 깊게 공부해보지 않은 사람은 처음보는 권한 레벨일 것이다.
윈도우 운영체제에 아무런 지식이 없는 사용자가 windows/system32 아래 경로를 마음대로 수정할 수 있다 생각해보자.
끔찍하지 않을 수 없다. 따라서 이렇게 권한을 나누고 적절한 권한을 부여하는 것은 시스템의 운용과 유지에 필수적인 과정이다.
이러한 이유로 공격자들은 시스템 침투 후 권한 상승을 수행하려 한다. 권한 상승이 기반이 되어야 정보 탈취든, lateral movement든 persistance든 이후 공격을 수행하는데 별 지장이 없이 때문이다.
1. 리눅스의 권한
리눅스 시스템의 권한 체계는 생각보다 단순하다.
기본적으로 root 계정과 root 그룹이 존재하고 거기서 이제 사용자 커스텀 계정들이 존재한다.
이러한 정보는 /etc/passwd, /etc/group 파일에서 확인할 수 있다.
root계정은 위에서도 말했지만 유닉스 계열 시스템의 신이자 황제다. 모든 것을 수행할 수 있는 특권 계정이기 때문에 기본 계정으로 생성되어 있으며, 많은 중요한 시스템 파일들이 root의 소유로 지정되어 있다.
1-1. 리눅스의 파일 권한(ls, ll, stat)
리눅스 시스템에서 파일의 상세 정보를 볼 때 우리는 몇 가지 명령을 사용해볼 수 있다.
바로 ls, ll, stat 등이다. 다음 그림을 보자
처음에 ll로 privilege 파일의 정보를 확인하고 있다. 우리가 알 수 있는 것은 다음과 같다.
파일 권한: -rw-r–r–
소 유 자: buntutiger
소유 그룹: buntutiger
그 뒤에 chmod 777 명령을 통해 privilege 파일의 권한을 수정하고 있다. 수정된 정보는 다음과 같다.
파일 권한: -rwxrwxrwx
소 유 자: buntutiger
소유 그룹: buntutiger
그리고 chown root:root 명렁을 통해 privilege 파일의 소유자를 변경하고 있다.
파일 권한: -rwxrwxrwx 소 유 자: root 소유 그룹: root
그 다음 stat 명령을 사용해보자.
파일 소유 정보 뿐만 아니라 Inode 번호, 크기, 파일 생성, 변경, 수정 시각 등 다양한 메타데이터를 확인할 수 있다.
자 그렇다면 이 파일 권한이란 과연 무슨 뜻일까?
1-2. 리눅스 파일 권한 분석
자 앞서 우리는 privilege 파일의 권한과 소유자가 변경되는 과정을 확인했다. 파일의 최초 상태는 다음과 같았다.
파일 권한: -rw-r–r–
소 유 자: buntutiger
소유 그룹: buntutiger
자 그렇다면 파일 권한인 -rw-r–r– 의 의미는 무엇일까? 다음 표를 보고 다시 생각해보자.
기호 | 권한 |
---|---|
r | 읽기 권한 |
w | 쓰기 권한 |
x | 실행 권한 |
이 표에 의하면 privilege 파일은 읽기-쓰기권한, 읽기 권한, 읽기 권한이 부여되었다고 볼 수 있다.
그런데 이상하지 않은가? 왜 읽기 권한이 여러번 부여된 것일까?
이제 사용자와 그룹의 개념이 필요해진다.
자 위 10자리 -rw-r–r– 를 제일 앞자리 빼고 3자리씩 나누어 보자. 그러면
- (rw-) (r- -) (r- -) 가 된다. 이들 순서로 각각 소유자, 소유 그룹, 그외 모든 사용자 에 대한 권한이 된다.
즉 다시 해석하보자면 소유자는 읽기-쓰기 권한이 있고, 소유 그룹은 읽기 권한, 그 외 사용자도 읽기 권한이 주어진 것이다.
자 이를 또 다르게 표현할 수 있는데, 각 3자리를 이진수의 bit라고 생각해볼 수 있다. 그렇다면 다음과 같은 표를 만들어볼 수 있다.
기호 | 권한 | 숫자 |
---|---|---|
- - x | 실행 권한 | $ 2^0 = 1 $ |
- w - | 쓰기 권한 | $ 2^1 = 2 $ |
- w x | 쓰기 실행 권한 | $ 2^1 + 2^0 = 3 $ |
r - - | 읽기 권한 | $2^2 = 4$ |
r - x | 읽기 실행 권한 | $ 2^2 + 2^1 = 5 $ |
r w - | 읽기 쓰기 권한 | $ 2^2 + 2^1 = 6 $ |
r w x | 읽기 쓰기 권한 | $ 2^2 + 2^1 + 2^0 = 7 $ |
즉 chmod 777은 소유자, 소유 그룹, 그외 사용자 에게 777 권한을부여하기때문에 -rwxrwxrwx가 된 것이다.
1-3. 파일 유형을 나타내는 제일 앞 비트
그렇다면 - 로 표현된 제일 앞 비트는 무슨 의미인지 당연히 궁금할 것이다.
다음 표를 보자.
기호 | 의미 | 설명 |
---|---|---|
- | 일반 파일 | 텍스트, 바이너리 등 보통의 파일 |
d | 디렉터리 | 폴더 |
l | 심볼릭 링크 | 다른 파일/디렉터리를 가리키는 링크 |
c | 문자 장치 파일 (character) | 터미널, 시리얼 포트 등 (예: /dev/tty ) |
b | 블록 장치 파일 (block) | 디스크, USB 등 블록 기반 장치 (예: /dev/sda ) |
s | 소켓 파일 (socket) | 프로세스 간 통신용 (예: /var/run/docker.sock ) |
p | 명명된 파이프 (FIFO) | 단방향 파이프 (예: mkfifo 로 생성한 파이프) |
1-4. 리눅스 시스템의 특수 권한
리눅스에는 이 외에도 특수한 권한을 할당할 수 있는 기능이 있다. 바로 setUID, setGID, Sticky Bit 등이다. 각 의미는 다음과 같다.
setUID: 권한이 설정된 파일을 실행할 때 소유자의 권한으로 실행 setGID: 권한이 설정된 파일을 실행할 때 소유 그룹의 권한으로 실행 Sticky Bit: 디렉토리 권한, 파일 권한과 관계 없이 파일 소유자만 삭제 가능
이러한 특수권한을 할당하기 위해서는 다음과 같은 방법을 사용할 수 있다.
특수 권한 | 추가 명령 | 제거 명령 |
---|---|---|
SetUID | chmod u+s chmod 4xxxx | chmod u-s |
SetGUD | chmod g+s chmod 2xxx | chmod g-s |
Sticky Bit | chmod +t chmod 1xxx | chmod -t |
다음 그림을 보자
아무 권한이 없는 파일에 chmod u+s, chmod 4644 등 명령으로 setUID권한을 주고있다.
권한을 제거할때도 비슷하게 할 수 있다. setUID 권한만을 제거하고 싶다면 chmod u-s 명령을 사용할 수 있다.
응용으로 +x등의 옵션을 사용할수도 있는데 chmod 명령에서 + 기호는 권한을 주는것, - 기호는 권한을 뺏는 것으로 이해하면 된다.
모든 권한과 특수권한을 주고싶다면 7777 옵션을 사용할 수 있다.
파일의 권한을 보면 (rws) (rws) (rwt) 로 모든 권한이 할당된 것을 볼 수 있다.
2. 권한과 권한상승. 권한 상승의 위험성
필자는 이쯤에서 한 번 더 강조하고싶다. 유닉스 계열 운영체제에서 root는 곧 그 시스템의 신이자 황제이며 모든 특권을 누릴수 있다는 말과 같다.
여기는 정보보안 블로그이므로 이제 공격자의 관점으로 넘어가보자.
2-1. 권한 상승
권한상승은 영어로 Privilege Escalation이다. 말대로 권한이 상승한다는 의미다.(껄껄)
취약점을 알려주는 사이트에서는 보통 LPE라고도 하는데, 이는 Local Privilege Escalation이라 해서 Local 이 붙은 것 뿐이다.
일반적으로 공격자는 서버에 침투한 후(계정탈취, 웹셸, SQL인젝션 등) 정보 수집, 지속성 확보, 권한 상승 등을 수행한다. 각 항목의 의미를 잘 생각해보자. 위 항목들은 MITRE ATT&CK에 각각 tactic으로 분류되어 있을 만큼 중요한 과정들이다.
🕵️♂️ 정보 수집 (Information Gathering)
공격자가 시스템에 침투한 직후 가장 먼저 수행하는 단계다.
중요한 기밀 정보, 계정 자격 증명, 열려 있는 포트, 내부 네트워크 구성, 실행 중인 서비스, 소스코드 등이 수집 대상이다.
🔎 이 단계는 침투 후 목표 달성 여부를 결정짓는 핵심 조사 과정이다.
🔐 지속성 확보 (Persistence)
공격자가 일시적으로 침투한 뒤, 시스템 관리자에 의해 계정이 폐기되거나 취약점이 패치될 경우 접근이 차단될 수 있다. 이를 방지하기 위해 공격자는 다음과 같은 **지속적 접근 수단(백도어)**을 구축한다:
- 사용자 정의 서비스 등록
- 스케줄러(cron)에 악성 작업 추가
- 정적 바이너리 백도어 설치
- 커널 레벨 필터(BPF 등) 활용
🧬 BPFDoor와 같은 고급 백도어는 이 단계의 대표적 사례다.
⚙️ 권한 상승 (Privilege Escalation)
많은 침해 활동은 일반 사용자 권한만으로는 충분하지 않다.
예를 들어, 다음 작업을 하려면 root 권한이 필요하다:
- 시스템 스케줄러(cron)에 작업 등록
- init 프로세스에 백도어 서비스 삽입
- 보안 정책 우회(BPF 필터 조작 등)
🔺 공격자는 침투 후 거의 반드시 권한 상승을 시도한다.
이는 침투의 “완성 단계"라고 볼 수 있다.
자 이제 이 권한이 왜 중요한지 좀 알것같은가? 보통 이러한 권한상승은 소프트웨어의 메모리 취약점, 잘못 부여된 권한 설정 등으로 인해 트리거 된다. 자 다음과 같은 다양한 권한상승 루트를 생각해보자.
2-2. 실제 권한상승 공격 시나리오
공격자가 시스테메 침투했다. 당연한 수순이지만 공격자는 권한 상승을 시도하려 한다. 발생할 수 있는 다양한 시나리오는 다음과 같다.
공격자는 sql 인젝션 공격으로 관리자 계정정보를 탈취했고, 웹 관리자 페이지의 업로드 기능을 통해 웹셸을 업로드했다.
1. 웹 관리자 계정과 시스템 관리자 계정이 같음
공격자는 웹셸을 통해 /etc/passwd 파일을 확인, 관리자가 사용하는 계정정보를 확인했다.
그리고 ssh를 통해 리눅스 관리자 계정정보 + 웹 관리자 비밀번호 를 사용해 로그인을 시도했는데
곧바로 로그인을 성공했다. 즉 credential stuffing이 성공한것이다.
그리고 sudo 같은 유틸리티가 존재한다면, 비밀번호를 사용해 root 권한을 손에 넣는 것은 식은죽먹기다.
2. 잘못된 apache process 권한 설정
웹셸을 통해 프로세스 정보와 계정정보를 확인해봤는데, apache 프로세스가 root 권한으로 돌고있다.
원래는 보안을 위해 이러한 웹 서비스 데몬은 nobody 권한으로 돌아야 하는것이 맞지만, 여기는 잘못 설정이 되어있다.
따라서 웹셸을 통해 실행되는 모든 명령은 root 권한으로 동작한다. 공격자느 시스템을 손에 넣을 수 있다.
3. 잘못된 setUID 권한 설정
웹셸을 통해 시스템에 존재하는 파일들을 스캔해봤는데,
마침 setUID가 올바르지 않게 설정되어 취약점을 유발하는 바이너리를 찾았고,
Path Hijacking을 통해 가짜 쉘 파일을 실행하도록 설정, root 권한을 확보했다.
등 정말 다양한 공격 시나리오로 진행가능하다.
2-3. 권한상승 공격 실습
다음 순서를 잘 따라해 보자.
1. 취약한 바이너리 컴파일
우선 다음과 같은 c 코드를 작성한 후 바이너리로 빌드하자
|
|
빌드 후 /usr/bin 경로로 바이너리를 이동, chmod u+s, chmod +x, chown root:root 명령을 차례대로 수행해 setUID권한과, 실행권한을 변경하고 소유자를 변경해주자.
그런다음 sudo 권한이 없는 계정으로 로그온후 root 권한 탈취 테스트를 수행할 수 있다.
2. 익스플로잇
|
|
명령을 실행하면 setUID가 설정된 바이너리 경로를 확인할 수 있다.
자 우리는 이 취약한 바이너리 소스코드를 알고있기때문에, 연구가 다 되었다고 가정하고 익스플로잇을 진행할 것이다.
해당 바이너리는 getenv 함수를 사용해 환경 변수에서 EDITOR라는 값을 읽어오고 있다.
만약 그냥 평범하게 실행할 경우 vim으로 /etc/vuln-config 파일을 수정하는 평범한 프로그램이다.
하지만 환경변수를 다음과 같이 변조하면 곧바로 root 권한을 획득할 수 있다.
잘못된 권한설정과 또 시큐어코딩을 하지않은 결과 공격자는 취약점을 사용해 손쉽게 LPE를 달성할 수 있게 되는 것이다.
3. 윈도우 시스템의 권한상승
앞서 윈도우 시스템의 권한에 대해서도 간단하게 언급했었다.
윈도우 시스템에는 세 종류의 계정이 존재한다.
- system : 시스템 권한
- administrator : 관리자 권한
- user : 일반 사용자 권한
우리는 보통 adminisrator 계정을 사용하거나, 또는 관리자 권한이 부여된 일반 사용자 권한의 계정을 사용한다.
system 권한은 일반 사용자가 사용할 목적으로 생성되지 않았다. 운영체제가 시스템 관리를 위한 목적으로 만들어둔 권한인데
말만 들어도 벌써 여러가지 공격을 할 수 있을것 같은 위험한 느낌이 들지 않는가?
실제로 윈도우 운영체제는 이 system 권한 탈취로 인해 수많은 취약점들이 발생한다.
3-1. system 권한
사실 일반 사용자 입장에서는 administrator 권한만으로 의도하는 거의 모든 작업들을 수행할 수 있다. 다만 우리와 같은 보안쟁이들 입장에서는 system 권한을 획득하는것이 또 중요한 과정 중의 하나가 된다.
대표적인 예시로 윈도우 운영체제의 여러 레지스트리 하이브 중 SAM이라는 레지스트리가 있다.
이 SAM이라는 레지스트리에는 사용자 계정정보와 비밀번호가 암호화되어 저장되는데, 일반 관리자 권한으로는 접근할 수 없다.
아무튼, 리눅스 시스템의 root 계정에 대응되는 권한이 바로 이 system 권한이 된다고 생각하면 좋겠다.
3-2. system 권한 획득하기
는 필자가 다른 포스팅에서 잠깐 다룬적이 있으므로 링크로 대체하겠다.
psexec 외에도 정말 다양한 방법으로 system 권한을 획득할 수 있다.
https://darkest.tistory.com/83
위 링크를 참고해 보시라.