Linux Privilege Escalation
Linux 권한 상승 기법 레퍼런스
Linux Privilege Escalation 소개
Linux 권한 상승 치트시트는 SUID/SGID, 커널 익스플로잇, 크론 작업, 서비스, 환경변수, 컨테이너 6개 카테고리의 28가지 권한 상승 기법을 다루는 보안 레퍼런스입니다. 각 항목은 명령어 구문, 설명, 즉시 사용 가능한 예제 명령을 침투 테스터와 보안 전문가를 위해 제공합니다.
SUID 항목은 find -perm -4000/-2000으로 setuid/setgid 바이너리를 찾고, nmap(인터랙티브 모드 쉘 이스케이프), find(-exec /bin/sh), vim(:!/bin/sh) 등 구체적인 악용 기법을 다룹니다. 커널 익스플로잇은 DirtyPipe(CVE-2022-0847, Linux 5.8+ 파이프 덮어쓰기)와 DirtyCow(CVE-2016-5195, Copy-on-Write 경쟁 조건)의 컴파일 및 실행 명령을 수록합니다.
크론 작업 악용(쓰기 가능 스크립트, PATH 하이재킹, tar 와일드카드 인젝션), 서비스 악용(쓰기 가능 systemd 유닛 파일, MySQL UDF), 환경변수 공격(LD_PRELOAD 공유 라이브러리 인젝션, LD_LIBRARY_PATH 하이재킹, PATH 변수 조작), 컨테이너 탈출(Docker 소켓 마운트, docker 그룹 멤버십, CAP_SYS_ADMIN capability 악용, 특권 컨테이너 탈출)도 포함합니다.
주요 기능
- find / -perm -4000/-2000으로 SUID/SGID 바이너리 탐색 및 nmap, find, vim 쉘 접근 악용
- 커널 익스플로잇: DirtyPipe(CVE-2022-0847) 파이프 덮어쓰기, DirtyCow(CVE-2016-5195) 경쟁 조건
- 크론 작업 악용: 쓰기 가능 크론 스크립트, crontab PATH 하이재킹, tar 와일드카드 checkpoint-action 인젝션
- 서비스 악용: ExecStart 수정을 통한 쓰기 가능 systemd 유닛 파일, MySQL UDF sys_exec()
- LD_PRELOAD 권한 상승: _init() 함수와 setuid(0)을 사용한 공유 라이브러리 인젝션
- SUID 바이너리가 절대 경로 없이 명령 실행 시 PATH 환경변수 하이재킹
- Docker 컨테이너 탈출: 소켓 마운트, docker 그룹 악용, CAP_SYS_ADMIN capability, 특권 모드 탈출
- SUID, 커널, 크론, 서비스, 환경변수, 컨테이너 6개 카테고리별 정리 및 검색 기능
자주 묻는 질문
SUID 권한 상승이란 무엇인가요?
SUID(Set User ID)는 프로그램이 파일 소유자(보통 root)의 권한으로 실행되도록 하는 파일 권한입니다. SUID 바이너리에 악용 가능한 기능(nmap 인터랙티브 모드, find -exec, vim :!sh 등)이 있으면 root 쉘을 얻을 수 있습니다. find / -perm -4000 -type f 2>/dev/null로 시스템의 SUID 바이너리를 탐색합니다.
DirtyPipe 익스플로잇(CVE-2022-0847)은 어떻게 작동하나요?
DirtyPipe는 Linux 커널 5.8 이상에 영향을 미칩니다. 파이프 메커니즘의 취약점을 악용하여 비권한 사용자가 읽기 전용 파일(SUID 바이너리, /etc/passwd 포함)의 데이터를 덮어쓸 수 있습니다. C 프로그램을 컴파일하여 정상적으로는 수정할 수 없는 파일에 임의 데이터를 써서 비밀번호 변경이나 바이너리 수정으로 root 접근을 획득합니다.
LD_PRELOAD 권한 상승이란 무엇인가요?
LD_PRELOAD는 다른 모든 라이브러리보다 먼저 로드할 공유 라이브러리를 지정하는 환경변수입니다. sudo가 LD_PRELOAD를 보존하도록 설정되어 있으면(env_keep), setuid(0)과 system("/bin/bash -p")을 호출하는 _init() 함수가 포함된 악성 공유 라이브러리를 컴파일하고, 허용된 sudo 명령에 LD_PRELOAD를 지정하여 root 쉘을 획득합니다.
크론 작업 PATH 하이재킹은 어떻게 작동하나요?
크론 작업이 절대 경로 없이 명령을 실행하고(예: "/usr/sbin/service" 대신 "service"), crontab의 PATH에 쓰기 가능한 디렉토리가 포함되어 있으면, 해당 디렉토리에 같은 이름의 악성 스크립트를 만들 수 있습니다. 크론 작업 실행 시 공격자 스크립트가 대신 실행되어 보통 SUID bash 복사본(/tmp/rootbash)을 생성합니다.
tar 와일드카드 인젝션이란 무엇인가요?
크론 작업이 와일드카드로 tar를 실행할 때(예: tar czf backup.tar.gz *), 대상 디렉토리에 --checkpoint=1과 --checkpoint-action=exec=sh shell.sh라는 이름의 파일을 생성합니다. tar가 이 파일명을 명령줄 옵션으로 해석하여 크론 작업의 권한(보통 root)으로 공격자 쉘 스크립트를 실행합니다.
Docker 그룹 멤버십이 어떻게 root 접근으로 이어지나요?
사용자가 docker 그룹에 속해 있으면(id 명령에서 groups=999(docker)) Docker 컨테이너를 실행할 수 있습니다. 호스트 루트 파일시스템을 컨테이너에 마운트(docker run -v /:/mnt -it alpine sh)한 후 chroot /mnt를 사용하면 호스트 파일시스템에 대한 완전한 root 접근을 획득하여 사실상 호스트에서 root 권한으로 상승합니다.
LD_PRELOAD와 LD_LIBRARY_PATH 공격의 차이는 무엇인가요?
LD_PRELOAD는 특정 공유 라이브러리를 먼저 로드하여 함수 후킹이나 _init() 코드 실행을 허용합니다. LD_LIBRARY_PATH는 공유 라이브러리 검색 경로를 변경하여 정상 라이브러리를 악성으로 대체합니다. 둘 다 sudo env_keep이나 SUID 바이너리가 필요하지만, LD_LIBRARY_PATH는 대상 바이너리가 로드하는 라이브러리(ldd로 확인)를 알아야 합니다.
특권 Docker 컨테이너에서 어떻게 탈출하나요?
특권 컨테이너(--privileged 플래그)는 모든 호스트 장치에 접근할 수 있습니다. fdisk -l로 호스트 디스크를 나열하고, mount /dev/sda1 /mnt로 호스트 루트 파티션을 마운트합니다. chroot /mnt로 호스트 파일시스템으로 전환하여 root로 접근합니다. 또는 CAP_SYS_ADMIN capability(capsh --print로 확인)가 있으면 호스트 파일시스템 마운트가 가능합니다.