저는 Linux 시스템을 강화 중이며 명령 실행(예: 등)을 지원하는 일반 바이너리를 사용하여 setuid
쉘 이스케이프를 테스트하고 싶습니다.awk
vim
그러나 내가 테스트한 모든 바이너리는 sh
해당 비트를 bash
존중하지 않습니다 setuid
.
특히 awk
일반 사용자로 계속 실행하십시오.
$ ls -lL /usr/bin/awk
-rwsr-xr-x 1 root root 121976 Mar 23 2012 /usr/bin/awk
$ id
uid=1000(bob) gid=1000(bob) groups=1000(bob)
$ awk 'BEGIN{system("id")}'
uid=1000(bob) gid=1000(bob) groups=1000(bob)
대신 옵션이 제공되면 bash
다음을 실행하세요.root
-p
$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1168776 Apr 18 2019 /bin/bash
$ /bin/bash -p
# id
uid=1000(bob) gid=1000(bob) euid=0(root) groups=1000(bob)
awk
, vim
, less
등이 해당 setuid
비트를 존중하고 다음과 같이 명령을 실행하도록 하는 방법이 있습니까 root
?
운영 체제:
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
고쳐 쓰다:
parallels@debian-gnu-linux-vm:~$ ls -la /proc/self/fd/0 /dev/fd/0 /dev/stdin
lrwx------ 1 parallels parallels 64 Mar 26 08:15 /dev/fd/0 -> /dev/pts/1
lrwxrwxrwx 1 root root 15 Mar 20 19:56 /dev/stdin -> /proc/self/fd/0
lrwx------ 1 parallels parallels 64 Mar 26 08:15 /proc/self/fd/0 -> /dev/pts/1
답변1
$ ls -lL /usr/bin/awk
-rwsr-xr-x 1 root root 121976 Mar 23 2012 /usr/bin/awk
$ awk 'BEGIN{system("id")}'
uid=1000(bob) gid=1000(bob) groups=1000(bob)
귀하의 예에서는 권한을 제거하거나 "setuid 비트를 존중"하지 않는 것이 아니라 awk가 기능을 달성하기 위해 사용하는 명령 awk
에 관한 것입니다 ./bin/sh
system()
C와 마찬가지로 awk는 system()
명령을 직접 구문 분석하고 실행하지 않지만 bash(또는 데비안 버전의 dash 또는 bash에서 이 버그 기능을 복사하는 여러 다른 셸)의 /bin/sh -c
경우 명령을 인수로 전달합니다. /bin/sh
유효 uid를 실제 uid로 재설정합니다.
print | "cmd"
awk 또는 "cmd" | getline
awk 에도 동일한 내용이 적용됩니다 . 즉, popen(3)
어떤 호출을 통해 수행됩니다 /bin/sh -c
. 사용자의 로그인 셸이나 환경 변수의 셸 이 아니라 항상 /bin/sh
시스템의 셸(또는 Android와 같은 시스템의 셸 )이라는 점에 유의하세요./system/bin/sh
$SHELL
[1]
이것은 perl에서는 다릅니다: perl의 system
, exec
, open "|-"
, 등 open2
. open3
여러 인수로 호출되거나 명령에 셸 메타 문자가 포함되어 있지 않으면 명령이 직접 실행됩니다.
$ id -nu
ahq
$ ls -l /tmp/perl
-rwsr-xr-x 1 dummy_user dummy_user 3197768 Mar 24 18:13 /tmp/perl
$ env - /tmp/perl -e 'system("id -nu")'
dummy_user
$ env - /tmp/perl -e 'system("{ id -nu; }")'
ahq
이 예제는 Debian 10에 있습니다. FreeBSD 또는 이전 버전의 Debian과 같은 다른 시스템에서는 이 두 명령이 /bin/sh
권한을 제거하지 않기 때문에 동일한 내용을 인쇄합니다 .[2]
노트:
[1]vim
와 같은 다른 프로그램은 환경 변수를 less
사용하므로 $SHELL
일부 래퍼를 지정하여 쉽게 "고칠" 수 있습니다. 유사한 명령에 대해 셸 에 옵션을 전달하는 데 사용할 vim
수도 있습니다 .:set shcf=-pc
-p
:!
[2]Perl 예제는 env - /tmp/perl 'script'
.echo 'script' | /tmp/perl /dev/fd/0
OpenBSD의 Perl은 이 인수를 거부하고 setuid 모드에서 실행될 때 stdin에서 스크립트 읽기를 거부합니다 -e
(참조이것종결여기-- OpenBSD에는 보안 setuid 스크립트가 있다고 합니다.
하지만 이것은 /dev/fd/N
Perl에서는 작동하지 않습니다.너 자신을 다루라스크립트 이름으로 제공되는 경우( 형식만 /dev/fd/N
, /dev/stdin
또는 아님 /proc/self/fd/N
).
obsd66$ ls -l /tmp/perl
-rwsr-xr-x 1 dummy_user dummy_user 10728 Mar 25 18:34 /tmp/perl
obsd66$ env - /tmp/perl -e 'system("{ id -nu; }")'
No -e allowed while running setuid.
obsd66$ echo 'system("{ id -nu; }")' | env - /tmp/perl
No program input from stdin allowed while running setuid.
obsd66$ echo 'system("{ id -nu; }")' | env - /tmp/perl /dev/stdin
Can't open perl script "/dev/stdin": Operation not permitted
obsd66$ echo 'system("{ id -nu; }")' | env - /tmp/perl /dev/fd/0
dummy_user
debian10$ su - other_user -c 'perl /dev/fd/7' 7<<<'print "OK\n"'
OK
debian10$ su - other_user -c 'perl /proc/self/fd/7' 7<<<'print "OK\n"'
Can't open perl script "/proc/self/fd/7": Permission denied