setuid
TinyCore Linux 라이브 CD를 사용하여 프로그램의 취약점을 보여주고 싶습니다 . 즉, 실행 사용자가 아닌 파일 소유자로 실행되도록 특수 권한을 갖는 특수 프로그램을 만들었습니다. 내 단계는 다음과 같습니다.
보안 취약점이 있는 프로그램을 만들고(아래 참조), 내 홈 시스템(Ubuntu)에서 컴파일합니다.
우분투에서 여전히 프로그램 생성
setuid
및 파일 소유자 설정Tiny Core 라이브 CD의 압축을 풀고 취약한 프로그램을 복사하세요
chroot
.
문제는 프로그램이 환경이나 완성된 리마스터 이미지 setuid
모두에서 작동하지 않는 것 같다는 것입니다. chroot
Ubuntu에서는 작동하지만 Tiny Core에서 작동하려면 필요합니다. 프로그램은 Tiny Core에서 실행되지만 소유자로는 실행되지 않습니다 setuid
.
프로그램 소스 코드:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
printf("Current time: ");
fflush(stdout);
system("date");
return 0;
}
빌드 명령:
gcc -o prog prog.c
setuid로 만드세요:
sudo chown 1200.1200 prog
sudo chmod 4755 prog
date
취약점을 보여주는 스크립트 를 작성하세요 .
#!/bin/sh
echo hello > /tmp/test.txt
ls -l /tmp/test.txt
조작된 date
스크립트를 실행 가능하게 만들고 취약점을 노출시킵니다.
chmod +x date
PATH=.:$PATH ./prog
우분투에서는 예상대로 /tmp/test.txt
소유자 1200 을 생성합니다. 하지만 chroot
라이브 CD 환경에 들어가면 작동하지 않고 실행 파일이 실행되지만 파일 소유자로는 실행되지 않습니다. 리마스터를 완료하고 라이브 CD를 만들고 부팅하면 파일에 올바른 소유자, 그룹 및 권한이 있어도 작동하지 않습니다 4755
. 내가 무엇을 놓치고 있나요?
환경을 생성하려면 chroot
다음에서 8MB 라이브 CD를 다운로드하세요.http://distro.ibiblio.org/tinycorelinux/downloads.html다음 단계를 따르세요.
sudo mount Core-current.iso /mnt
mkdir /tmp/extract
cd /tmp/extract
zcat /mnt/boot/core.gz | sudo cpio -i -H newc -d
chroot
다음 명령을 사용하여 취약한 프로그램을 환경에 복사합니다 .
sudo cp -a /path/to/prog /tmp/extract/tmp
sudo cp /path/to/date /tmp/extract/tmp
chroot
그곳에서 취약점을 테스트합니다.
sudo chroot /tmp/extract /bin/sh
su - tc
cd /tmp
PATH=.:$PATH ./prog
나의 궁극적인 목표는 물론 라이브 CD에서 실행되도록 하는 것입니다. 에서 작동하지 않아도 괜찮습니다 chroot
. 이는 이미지를 다시 패키징하고 부팅하지 않고도 적절한 첫 번째 테스트처럼 보입니다.
답변1
setuid
TinyCore에는 문제가 없습니다. 그러나 문제의 간단한 프로그램은 TinyCore에서 활용하기가 그리 간단하지 않습니다.
호출 system
은 호출에 지정된 명령을 사용합니다 /bin/sh -c
. TinyCore에서는 /bin/sh
심볼릭 링크에 대해 권한을 busybox ash
포기합니다 setuid
. 따라서 쉘 스크립트나 악의적인 작업을 수행하는 바이너리를 작성하고 date
취약한 프로그램이 실행되도록 속이기 위해 이름을 지정하더라도 setuid
원래 프로그램 setuid
은 실행되지 않습니다 system
.
그런데 버전 2부터 표준은 bash
호출 시 권한도 제거합니다. 그러나 질문에 설명된 취약점은 Debian 및 그 파생 제품에서 입증될 수 있습니다. 왜냐하면 분명히 Debian 버전은 권한을 제거하지 않기 때문입니다. (분명히 그럴 만한 이유가 있을 것 같은데, 연구해 본 적은 없습니다.)setuid
/bin/sh
bash
마지막으로 프로그램을 다음과 같이 변경하여 권한 포기를 피할 수 있었습니다.
int main(int argc, char **argv)
{
// circumvent busybox ash dropping privileges
uid_t uid = geteuid();
setreuid(uid, uid);
printf("Current time: ");
fflush(stdout);
system("date");
return 0;
}
답변2
일부 보안 정책(SELinux, AppArmor 등)이 적용되어 목록에 없는 실행 파일에 대한 SUID를 허용하지 않는 것일까요? 아니면 (순수한 정신을 위해) /tmp
nosuid를 설치했습니까?