/etc/의 하위 디렉터리에 복사하고 싶은 파일이 있는데 일반 사용자로 해당 파일을 실행할 수 있지만 실행하면
cp /etc/subdir/desired_file .
허가가 거부되었습니다. 하지만 슈퍼유저 권한 없이도 파일을 실행할 수 있습니다. 이 파일을 다른 디렉토리에 복사할 수 있는 방법이 있습니까?
편집: 파일 권한을 변경하지 마십시오
답변1
cp src dst
파일의 내용을 읽고 생성된 새 파일 src
에 씁니다 .dst
따라서 파일에 대한 읽기 권한이 필요합니다.
최소한 Linux btrfs
및 read()
일부 write()
파일 시스템(예:ioctl (dest_fd, FICLONE, src_fd)
링크의 전달 사본src_fd
데이터가 처음에 디스크 에 복사되지 않은 경우에도 .
파일을 복사하는 것만으로도 읽기 제한을 우회할 수 있으면 권한 시스템이 심각하게 손상됩니다.
이제 파일을 복사하는 대신 다른 이름으로 파일에 대한 새 링크를 만들 수 있습니다.
뒤쪽에:
ln from/src to/dst
이렇게 하려면 from
디렉토리에 대한 검색 액세스 권한과 디렉토리에 대한 검색+쓰기 액세스 권한 만 필요합니다. to
및 dst
로 src
끝나지만 두 개의 다른 디렉토리(또는 다른 이름을 가진 동일한 디렉토리)에 대한 링크입니다 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
여기에는 두 가지 가능한 상황이 있습니다.
읽기 권한이 부족하거나필요한 파일. 파일에 대한 실행 권한이 있을 수 있지만 파일을 보거나 복사하려면 읽기 권한이 필요합니다.
또는 대상 디렉터리에 대한 쓰기 권한이 부족합니다.
통과해주세요https://www.tutorialspoint.com/unix/unix-file-permission.htm. 유닉스 권한을 이해하는 데 도움이 될 것입니다.
소유자는 다음을 사용하여 권한을 부여할 수 있습니다.chmod주문하다.