잘못 설정된 Sudoers 권한 악용

LinuxBeginner
지금 연습하기

소개

Linux 시스템에서 sudo 명령어를 사용하면 일반 사용자가 루트 (root) 관리자와 같은 보안 권한으로 프로그램을 실행할 수 있습니다. 시스템 관리자는 종종 /etc/sudoers 파일을 구성하여 특정 사용자가 비밀번호 입력 없이도 특정 명령어를 루트 권한으로 실행할 수 있도록 허용합니다. 이는 개발자가 웹 서버를 재시작하거나 시스템 전체에서 파일을 검색할 수 있도록 하는 등 편의를 위해 수행되는 경우가 많습니다.

여기서 얻을 수 있는 보안 교훈은 sudo 규칙이 사실상 '위임된 신뢰'라는 점입니다. 만약 위임된 바이너리가 관리자가 생각하는 것보다 더 강력한 기능을 가지고 있다면, 해당 규칙은 단순히 안전한 작업 하나를 허용하는 것이 아니라 사실상 셸 접근 권한을 부여하는 것과 다름없게 됩니다.

그러나 이러한 관리상의 편의를 위한 설정은 심각한 보안 취약점을 초래할 수 있습니다. 만약 사용자가 다른 명령어를 실행하거나 셸을 생성할 수 있는 기능 (예: find, vim, awk) 을 가진 바이너리를 실행하도록 허용되어 있다면, 공격자는 이 권한을 악용하여 제한된 명령어 환경에서 벗어나 완전한 루트 셸을 획득할 수 있습니다. 이러한 기법을 흔히 "셸 이스케이프 (shell escape)" 또는 "GTFOBins" 익스플로잇이라고 부릅니다.

이번 실습에서는 보안 감사자의 입장이 되어 현재 사용자의 sudo 권한을 열거하고, 잘못 설정된 승인된 바이너리를 식별한 뒤, 이를 악용하여 루트 권한으로 상승시키는 과정을 수행합니다.

Sudo 권한 확인 (sudo -l)

이 단계에서는 현재 사용자 계정에 할당된 sudo 권한을 열거하는 방법을 배웁니다.

Linux 시스템에서 권한 상승 기회를 찾을 때 가장 먼저 확인해야 할 사항 중 하나는 현재 사용자가 루트 권한으로 실행할 수 있는 명령어가 무엇인지 파악하는 것입니다. sudo 명령어는 호출한 사용자가 실행할 수 있거나 금지된 명령어를 표시하는 -l (list) 플래그를 제공합니다.

sudo 설정 오류는 추측할 필요 없이 직접적이고 손쉽게 권한 상승으로 이어질 수 있기 때문에 이는 매우 우선순위가 높은 점검 항목입니다.

분석 결과를 기록하기 위해 명령어의 출력을 프로젝트 디렉토리 내의 텍스트 파일로 리다이렉션하겠습니다.

다음 명령어를 실행하여 sudo 권한을 나열하고 sudo_privs.txt라는 파일에 저장하세요:

sudo -l > /home/labex/project/sudo_privs.txt

이제 방금 생성한 파일의 내용을 확인하여 권한을 분석해 보겠습니다:

cat /home/labex/project/sudo_privs.txt

다음과 유사한 출력이 나타날 것입니다:

Matching Defaults entries for labex on this host:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User labex may run the following commands on this host:
    (root) NOPASSWD: /usr/bin/find

일부 환경에서는 find 규칙 외에도 추가적인 sudo 항목이 표시될 수 있습니다. 이번 실습에서는 labex 사용자가 비밀번호 입력 없이 (NOPASSWD) /usr/bin/find를 root 권한으로 실행할 수 있도록 명시적으로 허용된 라인에 집중하십시오. 바로 이 설정이 다음 단계에서 우리가 공략할 대상입니다.

셸 이스케이프를 위한 허용된 바이너리 분석

이 단계에서는 /usr/bin/find 바이너리를 분석하여 이를 악용해 임의의 명령어를 실행하는 방법을 이해합니다.

find 명령어는 디렉토리 계층 구조에서 파일과 디렉토리를 검색하는 데 사용되는 강력한 유틸리티입니다. 하지만 이 명령어에는 -exec라는 매우 유연한 매개변수가 포함되어 있습니다. -exec 플래그를 사용하면 사용자가 find로 찾은 모든 파일에 대해 지정된 명령어를 실행할 수 있습니다.

문제는 find 자체가 악의적이라는 것이 아니라, 그 기능이 매우 강력하다는 점입니다. 루트 권한을 가질 수 있는 모든 강력한 바이너리는 제대로 제한되지 않을 경우 셸 이스케이프의 후보가 됩니다.

심각한 보안 결함은 find가 sudo와 함께 실행될 때 발생합니다. find가 루트 권한으로 실행 중이라면, -exec 매개변수에 전달된 모든 명령어 또한 루트 권한으로 실행되기 때문입니다.

-exec 매개변수를 사용하여 whoami 명령어를 실행함으로써 이 이론을 테스트해 보겠습니다. whoami 명령어는 단순히 현재 사용자의 유효 사용자 이름을 출력합니다. 실행 컨텍스트를 확인하기 위해 출력을 파일로 리다이렉션하겠습니다.

다음 명령어를 실행하세요:

sudo find . -exec whoami \; -quit > /home/labex/project/whoami.txt

이 명령어를 분석해 보겠습니다. sudo find . 부분은 현재 디렉토리 (.) 에서 검색을 시작하여 find 명령어를 루트 권한으로 실행합니다. -exec whoami \; 부분은 find에게 whoami 명령어를 실행하도록 지시하며, \;는 -exec 문을 종료하기 위해 필요합니다. 마지막으로 -quit 플래그는 첫 번째 일치 항목을 처리한 직후 find를 즉시 종료하도록 지시하여, 디렉토리 내의 모든 파일에 대해 whoami가 여러 번 실행되는 것을 방지합니다.

이제 출력 파일의 내용을 확인하세요:

cat /home/labex/project/whoami.txt

다음과 같은 출력이 나타나야 합니다:

root

이는 -exec에 전달된 명령어가 루트 권한으로 성공적으로 실행되었음을 확인해 줍니다.

Sudo 를 이용한 바이너리 실행

이 단계에서는 -exec 취약점을 활용하여 일반적으로 루트 사용자에게만 제한된 민감한 시스템 파일에 접근합니다.

Linux 시스템에서 가장 민감한 파일 중 하나는 /etc/shadow입니다. 이 파일에는 시스템의 모든 사용자 계정에 대한 암호화된 비밀번호 해시가 포함되어 있습니다. 일반 사용자는 이 파일에 대한 읽기 권한이 없습니다. 공격자가 이 파일을 읽을 수 있다면 오프라인에서 비밀번호 해시를 크랙하려고 시도할 수 있습니다.

우리는 sudo find를 사용하여 루트 권한으로 임의의 명령어를 실행할 수 있음을 증명했으므로, 이 기법을 사용하여 /etc/shadow의 내용을 읽을 수 있습니다.

-exec 문 내에서 head 명령어를 사용하여 shadow 파일의 첫 번째 줄 (일반적으로 루트 사용자의 해시가 포함됨) 만 읽어 프로젝트 디렉토리에 저장하겠습니다.

다음 명령어를 실행하세요:

sudo find /etc/shadow -exec head -n 1 {} \; -quit > /home/labex/project/shadow_head.txt

이 명령어에서 {}는 find가 현재 처리 중인 파일 이름 (이 경우 /etc/shadow) 으로 대체하는 자리 표시자 역할을 합니다.

출력 파일을 읽어 민감한 정보를 성공적으로 추출했는지 확인하세요:

cat /home/labex/project/shadow_head.txt

shadow 파일에서 루트 사용자의 항목이 표시되는 다음과 유사한 출력이 나타나야 합니다:

root:*:19711:0:99999:7:::

잘못 설정된 sudo 항목을 악용하여 파일 시스템 권한을 성공적으로 우회했습니다.

루트 셸 생성

이 단계에서는 루트 셸을 생성하여 시스템을 완전히 장악하는 마지막 단계를 수행합니다.

민감한 파일을 읽는 것도 위험하지만, 권한 상승의 궁극적인 목표는 루트 권한으로 실행되는 대화형 셸을 획득하는 것입니다. 이는 공격자에게 시스템 전체에 대한 무제한 접근 권한을 부여합니다.

이를 달성하기 위해 -exec 매개변수에 whoami나 head와 같은 간단한 명령어를 전달하는 대신, /bin/bash와 같은 셸 실행 파일의 경로를 전달할 수 있습니다.

실제 시나리오라면 공격자는 sudo find . -exec /bin/bash \; -quit를 실행하여 대화형 루트 터미널로 바로 진입할 것입니다. 하지만 이 자동화된 실습 환경에서는 대화형 셸로 진입하면 실습 실행이 일시 중지될 수 있습니다.

대신 -c 플래그를 사용하여 비대화형 모드에서 루트 bash 셸을 생성하겠습니다. 이를 통해 새 루트 셸에 명령어를 직접 전달하고 실행하여 시스템 장악을 증명할 수 있습니다. 현재 사용자의 신원과 그룹 멤버십에 대한 자세한 정보를 제공하는 id 명령어를 사용하겠습니다.

다음 명령어를 실행하여 루트 셸을 생성하고 신원을 기록하세요:

sudo find . -exec /bin/bash -c "id > /home/labex/project/pwned.txt" \; -quit

마지막으로 pwned.txt 파일을 읽어 권한 상승이 성공했는지 확인하세요:

cat /home/labex/project/pwned.txt

출력 결과는 셸이 루트 사용자 및 그룹 ID 로 실행되고 있음을 명확히 보여줄 것입니다:

uid=0(root) gid=0(root) groups=0(root)

축하합니다! 잘못 설정된 sudoers 파일을 성공적으로 악용하여 일반 사용자에서 루트 권한으로 상승시켰습니다.

요약

이번 실습에서는 Linux 환경에서 잘못 설정된 sudoers 파일과 관련된 보안 위험을 살펴보았습니다. 사용자 계정의 sudo 권한을 열거하는 것으로 시작하여, find 바이너리를 비밀번호 없이 루트 권한으로 실행할 수 있음을 확인했습니다. find 명령어의 -exec 매개변수 기능을 이해함으로써 루트 권한으로 임의의 명령어를 실행할 수 있었습니다. 제한된 시스템 파일을 읽고 최종적으로 루트 셸을 생성하여 시스템을 완전히 장악함으로써 이 취약점의 영향력을 입증했습니다. 이번 실습은 최소 권한의 원칙을 준수하고 sudo 구성을 철저히 감사하여 무단 권한 상승을 방지하는 것이 얼마나 중요한지 강조합니다.