실행 권한은 있지만 복사 권한은 없는 파일을 어떻게 복사합니까?

실행 권한은 있지만 복사 권한은 없는 파일을 어떻게 복사합니까?

/etc/의 하위 디렉터리에 복사하고 싶은 파일이 있는데 일반 사용자로 해당 파일을 실행할 수 있지만 실행하면

cp /etc/subdir/desired_file .

허가가 거부되었습니다. 하지만 슈퍼유저 권한 없이도 파일을 실행할 수 있습니다. 이 파일을 다른 디렉토리에 복사할 수 있는 방법이 있습니까?

편집: 파일 권한을 변경하지 마십시오

답변1

cp src dst파일의 내용을 읽고 생성된 새 파일 src 에 씁니다 .dst

따라서 파일에 대한 읽기 권한이 필요합니다.

최소한 Linux btrfsread()일부 write()파일 시스템(예:ioctl (dest_fd, FICLONE, src_fd)링크의 전달 사본src_fd데이터가 처음에 디스크 에 복사되지 않은 경우에도 .

파일을 복사하는 것만으로도 읽기 제한을 우회할 수 있으면 권한 시스템이 심각하게 손상됩니다.

이제 파일을 복사하는 대신 다른 이름으로 파일에 대한 새 링크를 만들 수 있습니다.

뒤쪽에:

ln from/src to/dst

이렇게 하려면 from디렉토리에 대한 검색 액세스 권한과 디렉토리에 대한 검색+쓰기 액세스 권한 만 필요합니다. todstsrc끝나지만 두 개의 다른 디렉토리(또는 다른 이름을 가진 동일한 디렉토리)에 대한 링크입니다 src. dst같은 파일의.

이제 src그렇다면실행 가능 파일이며 기본 실행 가능 형식입니다(예를 들어 스크립트와는 대조적으로, 인터프리터가 읽을 수 있어야 하기 때문에 읽기 권한 없이 스크립트를 실행할 수는 없지만). 즉, 시스템이 사물을 매핑할 수 있음을 의미합니다. 실행 파일은 다음 중 하나의 메모리에 저장됩니다.당신의이는 귀하를 대신하여 읽는 것과 같습니다.

시스템은 읽기 제한 우회를 허용하지 않도록 주의합니다. 예를 들어, 적어도 Linux에서는 프로세스가 SIGQUIT( Ctrl+에서 전송 \ )와 같은 신호를 수신할 때 코어 덤프를 생성하지 않습니다. 프로세스를 읽 /proc/<pid>/maps거나 실행할 수 없습니다 ./proc/<pid>/mem

$ cp /usr/bin/sleep .
$ chmod 111 sleep
$ ./sleep inf &
[1] 86474
$ cat /proc/$!/maps
cat: /proc/86474/maps: Permission denied
$ cat /proc/$!/mem
cat: /proc/86474/mem: Permission denied

또한 kernel.yama.ptrace_scope = 0.

그러나 프로세스 자체는 분명히 자신의 메모리를 읽을 수 있으므로 프로세스가 어딘가에 메모리를 버리도록 설득할 수 있다면 복구할 수 있습니다.일부파일의 데이터.

파일이 동적으로 링크된 ELF 실행 파일이고 setuid/setgid가 아닌 경우...(안전 실행 모드가 활성화되지 않음) 적어도 GNU/Linux 시스템에서는 동적 링커가 실행 파일에 임의의 코드를 삽입하도록 설득할 수 있습니다. $LD_PRELOAD또는 변경 사항을 전달하기 위해 하이재킹된 공유 라이브러리의 수정된 버전을 사용하도록 지시합니다 $LD_LIBRARY_PATH.

예를 들어:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

static void init(void) __attribute__((constructor));
static void init(void)
{
  FILE *maps, *dst;
  char exe[4096], path[4096];
  char *start, *end;
  off_t offset;
  int n;

  n = readlink("/proc/self/exe", exe, sizeof(exe));
  exe[n] = '\0';
  dst = fopen(getenv("DST"), "w");
  maps = fopen("/proc/self/maps", "r");

  while((n = fscanf(maps, "%p-%p%*s%lx%*s%*s%*[ ]%[^\n ]\n", &start, &end, &offset, path)) != EOF) {
    if (n == 4 && !strcmp(path, exe)) {
      printf("Dumping [%p - %p] from %s at offset %#lx\n", start, end, path, offset);
      fseek(dst, offset, SEEK_SET);
      fwrite(start, end - start, 1, dst);
    }
  }
  exit(0);
}

(오류 처리는 독자의 연습 문제로 남겨 둡니다.)

다음으로 컴파일:

gcc -fPIC -shared -o hack.so that-file.c

다음으로 실행 src:

DST=./dst LD_PRELOAD=./hack.so ./src
truncate -r src dst

파일의 메모리 매핑된 부분이 ./dst파일에 덤프됩니다.

다음의 읽을 수 있는 사본이 있고 다음 src을 사용하는 경우:

cmp -l src-copy dst | perl -pe 's/\d+/sprintf"%#x",$&-1/e'

objdump -h src-copy출력을 오프셋의 출력과 일치시키면 일부 부분이 누락되었거나 동적 링커에 의해 수정되었기 때문에 동일하지 않다는 것을 알 수 있습니다 . 내 테스트에서는 다음과 같습니다.

 20 .init_array   00000008  0000000000009bb0  0000000000009bb0  00008bb0  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 21 .fini_array   00000008  0000000000009bb8  0000000000009bb8  00008bb8  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 22 .data.rel.ro  000000b8  0000000000009bc0  0000000000009bc0  00008bc0  2**5
                  CONTENTS, ALLOC, LOAD, DATA
 23 .dynamic      000001f0  0000000000009c78  0000000000009c78  00008c78  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 24 .got          00000190  0000000000009e68  0000000000009e68  00008e68  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 26 .bss          000001b8  000000000000a080  000000000000a080  00009080  2**5
                  ALLOC

그러나 .text.rodata부분은 적어도 완전하며, 이는 읽을 수 없는 동적으로 연결된 ELF 실행 파일에 비밀을 숨기려는 시도가 무익함을 보여줍니다.

답변2

여기에는 두 가지 가능한 상황이 있습니다.

  1. 읽기 권한이 부족하거나필요한 파일. 파일에 대한 실행 권한이 있을 수 있지만 파일을 보거나 복사하려면 읽기 권한이 필요합니다.

  2. 또는 대상 디렉터리에 대한 쓰기 권한이 부족합니다.

통과해주세요https://www.tutorialspoint.com/unix/unix-file-permission.htm. 유닉스 권한을 이해하는 데 도움이 될 것입니다.

소유자는 다음을 사용하여 권한을 부여할 수 있습니다.chmod주문하다.

관련 정보