나는 그것으로부터 배웠다여기setuid
권한 있는 활동을 제어하는 방법에는 두 가지 가 있습니다 capability
.
하지만 내 컴퓨터에서 플레이할 때 ping
두 메커니즘을 모두 우회하는 것 같습니다.
먼저 내 컴퓨터 /usr/bin/ping
가 cap_net_raw
가능하고 다음을 사용하는지 확인합니다 SOCK_RAW
.
$ ll /usr/bin/ping
-rwxr-xr-x 1 root root 72K Jan 31 2020 /usr/bin/ping
$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
$ strace -e socket ping <some-ip>
socket(AF_NETLINK, SOCK_RAW|SOCK_CLOEXEC, NETLINK_ROUTE) = 5
바이너리를 복사하면 해당 기능이 제거되지만 여전히 작동합니다.
$ cp /usr/bin/ping ~
$ ll ~/ping
-rwxr-xr-x 1 user user 72K Nov 4 16:54 /home/user/ping
$ getcap ~/ping
[empty result]
$ ~/ping <some-ip>
[it works]
나는 Ubuntu 20.04
및 을 사용하고 있습니다 5.4.0-52-generic
.
답변1
최근 Linux 시스템에서는ping의 가장 기본적인 작업에는 권한이 필요하지 않습니다.즉, ICMP 에코 요청 메시지를 보내고 응답 에코 응답 메시지를 받는 것입니다.
Ubuntu 20.04에는 두 가지 ping 구현이 있습니다. 기본값, 시작iputils-ping, setcap이 설치되었지만 CAP_NET_RAW
ICMP 에코와 함께 작동하며 권한이 필요하지 않습니다. 그것은에서 오는inetutils-pingsetuid 루트를 설치했지만 권한 없이 ICMP 에코와도 작동합니다. 둘 다 ICMP 소켓을 사용하며 다음을 사용하는 데 권한이 필요하지 않습니다.
socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP) = 3
권한 유무에 관계없이 이러한 구현에서 netlink 소켓을 사용하여 기본 핑을 재현할 수 없었습니다.