sudo에 SUID 비트 있고, 실행권한(o+x)도 있는데, 명령어 실행해도 쉘이 안 뜨거나 권한이 안 올라간다.
→ 이거 원래 그런 건가? 왜 그런 거야?
SUID가 있다고 해서 무조건 권한 상승이 가능한 건 아닙니다.
이유는 다음과 같습니다.
SUID는 "해당 프로그램을 실행할 때 소유자의 권한으로 실행하라"는 의미.sudo가 root 소유이고 SUID면, sudo가 실행될 때만 루트 권한이 생김.sudo는 내부적으로 자체 검증 (sudoers 등) 없이 무조건 쉘을 주지 않음.🔒 예시:
-rwsr-xr-x 1 root root 186584 /usr/bin/sudo
✅ 실행은 루트 권한으로 됨
❌ sudo는 policy check (sudoers, 패스워드 등) 통과 못 하면 쉘 안 줌
sudo 자체는 루트 권한으로 실행되지만,sudo 명령어를 단순 실행한다고 권한 상승 안 됨.sudo, passwd, su, mount, ping 등은 SUID지만 쉘 안 열려요.
왜냐면 내부적으로:
/bin/bash 등 최신 쉘들은 보안상 setuid 설정을 무시하게 설계됨SUID 바이너리라고 해도, bash -p 같은 특수 옵션 없으면 쉘 권한이 안 올라감./bash -p # <- 이렇게 해야 SUID 쉘이 뜸
AppArmor, SELinux, seccomp, capabilities 등| 조건 | 기대 결과 |
|---|---|
| SUID + 실행 가능 | 해당 프로그램을 소유자 권한으로 실행 |
| 내부 검증 우회 필요 | sudo 자체 쉘 안 열면 GTFOBins 루틴 필요 |
| 쉘 바이너리의 보안 옵션 무시 | bash -p 등으로 setuid 효과 유지 필요 |
| 시스템 보안 정책 존재 가능 | AppArmor/SELinux 등에서 실행 제한될 수 있음 |
ls -l 확인 – SUID가 있는지, 누구 소유인지file / which로 실행파일 맞는지 확인id 확인 – uid=0이 뜨는지bash -p, sh -p, python, perl, awk 등 다른 방법 시도SUID + 실행 권한만 있다고 쉘이 뜨는 건 아니고, 내부 로직이나 시스템 보안 설정, 쉘 자체의 제한 등 여러 조건이 맞아야 실제 권한 상승이 됩니다.