![남자가 execve를 반환합니다: chroot 감옥에 해당 파일이나 디렉터리가 없습니다](https://linux55.com/image/198223/%EB%82%A8%EC%9E%90%EA%B0%80%20execve%EB%A5%BC%20%EB%B0%98%ED%99%98%ED%95%A9%EB%8B%88%EB%8B%A4%3A%20chroot%20%EA%B0%90%EC%98%A5%EC%97%90%20%ED%95%B4%EB%8B%B9%20%ED%8C%8C%EC%9D%BC%EC%9D%B4%EB%82%98%20%EB%94%94%EB%A0%89%ED%84%B0%EB%A6%AC%EA%B0%80%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4.png)
나는chroot 감옥그리고 여러 바이너리와 해당 라이브러리를 관련 하위 디렉터리에 복사하세요. 예:
cp -v /usr/bin/edit /home/jail/usr/bin
ldd /usr/bin/edit
linux-vdso.so.1 (0x00007fff565ae000)
libm.so.6 => /lib64/libm.so.6 (0x00007f7749145000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f7748f11000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007f7748d08000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f7748b04000)
libperl.so => /usr/lib/perl5/5.18.2/x86_64-linux-thread-multi/CORE/libperl.so (0x00007f7748771000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7748554000)
libc.so.6 => /lib64/libc.so.6 (0x00007f77481ad000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f7747fa8000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7749446000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f7747d6d000)
cp -v /lib64/{libm.so.6,libtinfo.so.5,libacl.so.1,libdl.so.2,libpthread.so.0,libc.so.6,libattr.so.1,ld-linux-x86-64.so.2,libcrypt.so.1} /home/jail/lib64/
명령을 사용하여 동일한 작업을 수행 man
하고 모든 파일을 수동으로 복사했지만 cp -rv /usr/share/man/ /home/jail/usr/share/
실행하면 다음 오류가 반환됩니다.
-bash-4.2$ man gzip
execve: No such file or directory
무엇이 누락되었을 수 있나요?
자세한 내용은:
-bash-4.2$ ls /usr/share/man
ca da el es fr.ISO8859-1 hu it man0p man1p man3 man4 man6 man8 mann pl pt_BR sk sv zh zh_TW
cs de eo fr fr.UTF-8 id ja man1 man2 man3p man5 man7 man9 nl pt ru sr uk zh_CN
고쳐 쓰다:
-bash-4.2$ strace -f /usr/bin/mandb ls 2>ls.log
-bash-4.2$ cat ls.log
execve("/usr/bin/mandb", ["/usr/bin/mandb", "ls"], [/* 45 vars */]) = 0
brk(0) = 0x138b000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd43a9ac000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib64/tls/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/lib64/tls/x86_64", 0x7ffde87d2510) = -1 ENOENT (No such file or directory)
open("/lib64/tls/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/lib64/tls", 0x7ffde87d2510) = -1 ENOENT (No such file or directory)
open("/lib64/x86_64/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
stat("/lib64/x86_64", 0x7ffde87d2510) = -1 ENOENT (No such file or directory)
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1974416, ...}) = 0
mmap(NULL, 3828256, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fd43a3e6000
mprotect(0x7fd43a584000, 2093056, PROT_NONE) = 0
mmap(0x7fd43a783000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19d000) = 0x7fd43a783000
mmap(0x7fd43a789000, 14880, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fd43a789000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd43a9ab000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd43a9aa000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd43a9a9000
arch_prctl(ARCH_SET_FS, 0x7fd43a9aa700) = 0
mprotect(0x7fd43a783000, 16384, PROT_READ) = 0
mprotect(0x601000, 4096, PROT_READ) = 0
mprotect(0x7fd43a9ad000, 4096, PROT_READ) = 0
brk(0) = 0x138b000
brk(0x13ac000) = 0x13ac000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/de_DE.UTF-8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/de_DE.utf8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/de_DE/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/de.UTF-8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/de.utf8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/de/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
getuid() = 1000
geteuid() = 1000
getgid() = 100
execve("/usr/lib/man-db/mandb", ["/usr/bin/mandb", "ls"], [/* 45 vars */]) = -1 ENOENT (No such file or directory)
dup(2) = 3
fcntl(3, F_GETFL) = 0x8001 (flags O_WRONLY|O_LARGEFILE)
close(3) = 0
write(2, "execve: No such file or director"..., 34execve: No such file or directory
) = 34
exit_group(-22) = ?
+++ exited with 234 +++
업데이트 2: 좋습니다. 이 부분이 누락되었습니다.
cp -rv /usr/lib/man-db/ usr/lib/
이제 다음 오류가 발생합니다.
man: error while loading shared libraries: libmandb-2.6.6.so: cannot open shared object file: No such file or directory
ldd
이상하게도 이는 반환의 일부가 아닙니다 .
# which mandb
/usr/bin/mandb
# ldd /usr/bin/mandb
linux-vdso.so.1 (0x00007fffd64d0000)
libc.so.6 => /lib64/libc.so.6 (0x00007f1885120000)
/lib64/ld-linux-x86-64.so.2 (0x00007f18854c7000)
마지막으로 다음 라이브러리가 필요합니다.
cp /usr/lib64/libmandb-2.6.6.so usr/lib64/libmandb-2.6.6.so
cp /usr/lib64/libgdbm.so.4 usr/lib64/libgdbm.so.4
로드 후 man
텍스트가 표시되지 않습니다.
# man ls
Man: find all matching manual pages (set MAN_POSIXLY_CORRECT to avoid this)
* ls (1)
ls (1p)
Man: What manual page do you want?
Man: 1
Jail과 Root에 대한 추적 결과를 비교했는데 이제 이 부분만 다릅니다(Jail은 그대로 유지됩니다).
바인드 마운트를 추가하면 /var/run/nscd
감옥 사용자가 소켓을 사용할 수 있습니다 .
-bash-4.2$ if [[ -S /var/run/nscd/socket ]]; then echo "socket is available"; fi
socket is available
그럼 문제는 뭔가 다른 것 같나요? !
업데이트3: @nobody 예, 비밀번호와 그룹이 모두 존재합니다.
-bash-4.2$ ls -la /etc
total 124
drwxr-xr-x 4 root root 216 Nov 11 14:15 .
drwxr-xr-x 13 root root 183 Nov 4 08:49 ..
-rw-r--r-- 1 root root 779 Nov 3 12:43 group
-rw-r--r-- 1 root root 67659 Nov 11 13:55 ld.so.cache
-rw-r--r-- 1 root root 2335 Nov 4 09:02 localtime
-rw-r--r-- 1 root root 12061 Nov 11 13:16 manpath.config
-rw-r--r-- 1 root root 1304 Nov 11 14:15 nsswitch.conf
-rw-r--r-- 1 root root 3961 Nov 3 12:43 passwd
drwxr-xr-x 2 root root 4096 Nov 3 14:13 postfix
-rw-r--r-- 1 root root 9168 Nov 4 09:02 profile
drwxr-xr-x 2 root root 4096 Nov 4 09:02 profile.d
-rw-r--r-- 1 root root 8006 Nov 4 09:17 vimrc
업데이트 4:
이 -Tascii
플래그는 누락된 바이너리를 더 많이 반환합니다.
-bash-4.2$ man -Tascii ls
man: can't execute tbl: No such file or directory
man: can't execute groff: No such file or directory
man: command exited with status 255: /usr/bin/zsoelim | /usr/lib/man-db/manconv -f UTF-8:ISO-8859-1 -t ANSI_X3.4-1968//IGNORE | tbl | groff -mandoc -Tascii
그래서 나는 전체 디렉토리 /usr/share/groff를 복사 tbl
했습니다 . 이제 두 개의 추가 바이너리가 누락되었습니다.groff
zsoelim
-bash-4.2$ man -Tascii ls
groff: couldn't exec troff: No such file or directory
groff: couldn't exec grotty: No such file or directory
man: command exited with status 4: /usr/bin/zsoelim | /usr/lib/man-db/manconv -f UTF-8:ISO-8859-1 -t ANSI_X3.4-1968//IGNORE | tbl | groff -mandoc -Tascii
복사한 후 매뉴얼을 보여주세요.
그러나 -Tascii
플래그가 없으면 여전히 검은색/비어 있습니다. :|
업데이트 5:
기본 호출기는 다음과 같습니다.less
-bash-4.2$ env | grep MANPATH
MANPATH=/usr/share/man
-bash-4.2$ env | grep PAGER
PAGER=less
답변1
명령을 입력 strace -f man ls 2>ls.log
하고 ls.log 파일에 execve 줄이 몇 개 있는지 확인해야 합니다. /usr/bin/pager, nroff, groff, tbl이 있을 것입니다. groff
제대로 작동하려면 확실히 많은 파일이 필요합니다. openat
로그 파일을 확인하여 몇 개가 성공했는지 확인하세요.
답변2
strace 스크린샷에 따르면 proc 파일 시스템 누락 + chroot 감옥의 제한된 소켓 액세스가 원인일 수 있습니다. 별칭 관련 솔루션으로서 이는 훌륭한 작업을 수행합니다.
alias_man() { man -Tascii "$@" | pager; }
alias man='alias_man'