파일에 대한 실행 권한이 있음에도 불구하고 파일을 실행할 수 없습니다.

파일에 대한 실행 권한이 있음에도 불구하고 파일을 실행할 수 없습니다.

나는 파일 권한의 일부 측면을 분명히 오해했습니다.

Drupal 설치에서 Linux 시스템의 파일 g++로 컴파일된 바이너리를 실행하려고 합니다./var/www/html/modules

uname -a
Linux <redacted> 3.10.0-1160.6.1.el7.x86_64 #1 SMP Tue Nov 17 13:59:11 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

디렉토리 ls -al에서 실행 하면 파일에 대한 모든 권한이 있음을 알 수 있습니다( user ).modulesapache

whoami
apache

pwd
/var/www/html/modules

ls -al
total 108
drwxrwxrwx. 42 apache apache  4096 May  8 17:03 .
drwxrwxrwx.  9 apache apache  4096 May  8 16:49 ..
. . .
-rwxrwxrwx.  1 apache apache 46016 May  8 16:38 my_binary

cd ../..
ls -al
total 8
drwxr-xr-x.  4 root   root     33 Dec  3 10:31 .
drwxr-xr-x. 21 root   root   4096 Dec 11 18:49 ..
drwxr-xr-x.  2 root   root      6 Nov 16 16:19 cgi-bin
drwxrwxrwx.  9 apache apache 4096 May  8 16:49 html

출시 정보는 다음과 같습니다.

cat /proc/version
Linux version 3.10.0-1160.6.1.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Tue Nov 17 13:59:11 UTC 2020

완전성을 위해 다음은 file파일을 실행합니다.

file my_binary
my_binary: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), BuildID[sha1]=e7fb75e11b7234dc1129e9502304fcc7440fd788, for GNU/Linux 3.2.0, not stripped

그리고 확인하면 mount | grep noexec현재 디렉터리가 결과에 표시되지 않는 것 같습니다.

mount | grep noexec
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,memory)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuacct,cpu)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,net_prio,net_cls)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,blkio)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,freezer)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuset)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,devices)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)

그리고 댓글에서 제안한 대로 결과는 다음과 같습니다 cat /proc/mounts | grep noexec.

cat /proc/mounts | grep noexec
devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
sysfs /sys sysfs rw,seclabel,nosuid,nodev,noexec,relatime 0 0
securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0
tmpfs /sys/fs/cgroup tmpfs ro,seclabel,nosuid,nodev,noexec,mode=755 0 0
cgroup /sys/fs/cgroup/systemd cgroup rw,seclabel,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,seclabel,nosuid,nodev,noexec,relatime,perf_event 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,seclabel,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,blkio 0 0
cgroup /sys/fs/cgroup/hugetlb cgroup rw,seclabel,nosuid,nodev,noexec,relatime,hugetlb 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,seclabel,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,seclabel,nosuid,nodev,noexec,relatime,freezer 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuset 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,seclabel,nosuid,nodev,noexec,relatime,devices 0 0
pstore /sys/fs/pstore pstore rw,nosuid,nodev,noexec,relatime 0 0

그래도 파일을 실행하려고 하면 권한 오류가 발생합니다.

./my_binary
bash: line 84: ./my_binary: Permission denied

여기서 문제는 무엇입니까? 아니면 권한 문제의 원인을 추가로 진단하려면 어떻게 해야 합니까?


나는 (간단한) Hack the Box 챌린지를 수행하는 동안 이 문제에 직면했다고 말해야 할 의무감을 느낍니다. 하지만 나는 도전을 통해 배우고 있고 이것이 내가 정말로 배우고 싶은 장애물이다.

답변1

팁을 주신 @Stéphane Chazelas에게 감사드립니다. 답을 찾은 것 같습니다.

을 실행하면 sestatus다음을 얻습니다.

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          error (Permission denied)
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

따라서 추가적인 보호 장치가 있습니다. 그런 다음 ls -alZ파일에 적용된 selinux 정책을 표시하기 위해 실행하면 다음이 표시됩니다.

ls -alZ
drwxrwxrwx. apache apache system_u:object_r:httpd_sys_rw_content_t:s0 .
drwxr-xr-x. root   root   system_u:object_r:httpd_sys_content_t:s0 ..
. . .
drwxrwxrwx. apache apache unconfined_u:object_r:httpd_sys_rw_content_t:s0 modules

나는 이것이 httpd_sys_rw_content_t파일을 읽고 쓰는 것만 허용된다는 것을 의미한다고 생각합니다. 파일 권한과는 아무런 관련이 없습니다. 따라서 이 제한을 해결할 수 있는 방법을 찾아야 합니다(또는 완전히 잘못된 방향으로 가고 있습니다).

관련 정보