chroot
나는 솔라리스의 베어본 감옥에서 몇 가지 단위 테스트를 실행 하고 싶습니다 .아니오 su
또는sudo
su
, (with )의 복사본은 libpam.so.1
단순히 종료 코드 1을 반환하고 인수 유무에 관계없이 출력을 반환하지 않습니다. 간단한 방법 없을까요루트가 아닌 사용자로 Bash 스크립트 실행그런 시스템에서? 어쩌면 setuid 또는 래퍼 스크립트일까요?
답변1
내가 올바르게 이해했다면 su
루트에서 다른 사용자로 전환하면 됩니다. 바이너리 복사를 시도했지만 su
(setuid 루트는 필요하지 않음) 이것이 Solaris에서 작동할지 모르겠습니다. 또는 작은 C 프로그램을 컴파일하고 권한을 제거하고 명령을 실행하십시오.
이것은 작은 "다운 전용" 수입니다. 최소한의 테스트를 거쳤습니다. Solaris 및 *BSD에서 있는 그대로 컴파일하려면 Linux -D_BDS_SOURCE
에서 실행 해야 하며 #include <grp.h>
, 다른 플랫폼에서는 일반적이지만 비표준 setgroups
.examples를 주석 처리해야 할 수도 있습니다 sugexec UID GID bash /path/to/script
(chroot에 대한 종속성을 피하기 위해 숫자 사용자 및 그룹 ID를 전달해야 함). 가능 어떤 종류의 사용자 데이터베이스도 사용할 수 없습니다.)
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
void die(char *argv0, char *obj, char *msg) {
if (msg == NULL) msg = strerror(errno);
fprintf(stderr, "%s: %s: %s\n", argv0, obj, msg);
exit(127);
}
int main(int argc, char *argv[]) {
uid_t uid;
gid_t gid;
char *endp;
/* Command line parsing */
if (argc <= 3) {
fprintf(stderr, "Usage: %s UID GID COMMAND [ARG...]\n",
argv[0]==NULL ? "sugexec" : argv[0]);
exit(127);
}
uid = strtoul(argv[1], &endp, 0);
if (*endp) die(argv[0], argv[1], "Bad uid");
gid = strtoul(argv[2], &endp, 0);
if (*endp) die(argv[0], argv[2], "Bad gid");
/* Drop to specified user and group */
if (setgid(gid)) die(argv[0], "setgid", NULL);
if (setgroups(0, NULL)) die(argv[0], "setgroups", NULL);
if (setuid(uid)) die(argv[0], "setuid", NULL);
/* Execute the command */
execvp(argv[3], argv + 3);
die(argv[0], argv[3], NULL);
}
답변2
사용자로 폴더에 chroot할 수 있는 schroot를 확인하세요. 맨 페이지는 다음과 같습니다.http://manpages.ubuntu.com/manpages/hardy/man1/schroot.1.html