https://product.kyobobook.co.kr/detail/S000001810356
컨테이너 보안 책을 참고해서 작성한 글입니다.
"Ping을 사용하기 위해서는 네트워크 소켓을 열어야 한다."
네트워크 소켓을 여는건 User에게는 없는 권한입니다.
$ which ping
/usr/bin/ping
$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep
$ ls -al /usr/bin/ping
-rwxr-xr-x 1 root root 72776 Jan 30 2020 /usr/bin/ping
$ ping google.com
PING google.com (142.250.157.113) 56(84) bytes of data.
64 bytes from ta-in-f113.1e100.net (142.250.157.113): icmp_seq=1 ttl=105 time=57.9 ms
64 bytes from ta-in-f113.1e100.net (142.250.157.113): icmp_seq=2 ttl=105 time=57.4 ms
getcap으로 특정 파일의 capability를 확인할 수 있습니다.
-> ping은 cap_net_raw라는 capability를 사용하는 걸 알 수 있습니다.
$ cp -a /usr/bin/ping ./myping
$ ls -al ./myping
-rwxr-xr-x 1 abcd abcd 72776 Jan 30 2020 ./myping
$ getcap ./myping
$ ./myping google.com
PING google.com (142.250.157.139) 56(84) bytes of data.
64 bytes from ta-in-f139.1e100.net (142.250.157.139): icmp_seq=1 ttl=101 time=69.0 ms
64 bytes from ta-in-f139.1e100.net (142.250.157.139): icmp_seq=2 ttl=101 time=68.5 ms
ping을 복사한 다음, getcap으로 확인했을 때 net_cap_raw capability가 없습니다.
하지만 실제로 myping은 동작합니다.
그럼 책에서 얘기했던, "ping은 네트워크 소켓을 열어야 하는데 이는 사용자에게 없는 권한으로 실행할 수 없다"라는 말은 틀린 얘기가 됩니다.
$ sudo sysctl -a | grep net.ipv4.ping_group
net.ipv4.ping_group_range = 0 2147483647
$ sudo sysctl -a | grep net.ipv4.ping_group_range
net.ipv4.ping_group_range = 0 0
$ ./myping google.com
./myping: socket: Operation not permitted
$ ping google.com
PING google.com (142.250.157.139) 56(84) bytes of data.
64 bytes from ta-in-f139.1e100.net (142.250.157.139): icmp_seq=1 ttl=101 time=69.0 ms
64 bytes from ta-in-f139.1e100.net (142.250.157.139): icmp_seq=2 ttl=101 time=68.6 ms
64 bytes from ta-in-f139.1e100.net (142.250.157.139): icmp_seq=3 ttl=101 time=68.5 ms
찾아보니, 현재는 net.ipv4.ping_group_range 를 설정하거나, cap_net_raw를 사용해서 user에서 ping을 사용할 수 있게 한다고 합니다.
ping_group_range를 0 0으로 변경해보니,
cap_net_raw capa가 없는 myping에서는 ping이 동작하지 않고,
cap_net_raw capa가 있는 ping에서는 ping이 동작하는 걸 확인했습니다.
$ sudo ./myping google.com
PING google.com (142.250.157.102) 56(84) bytes of data.
64 bytes from ta-in-f102.1e100.net (142.250.157.102): icmp_seq=1 ttl=52 time=54.7 ms
64 bytes from ta-in-f102.1e100.net (142.250.157.102): icmp_seq=2 ttl=52 time=54.3 ms
그럼 myping은 ping을 사용할 수 없나?라고 생각할 수 있지만,
sudo를 사용하면 ping을 사용할 수 있습니다.
$ ps ajf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
4053836 4053837 4053837 4053837 pts/1 4053896 Ss 1000 0:00 -bash
4053837 4053896 4053896 4053837 pts/1 4053896 R+ 1000 0:00 \_ ps ajf
4046769 4046770 4046770 4046770 pts/0 4053848 Ss 1000 0:00 -bash
4046770 4053848 4053848 4046770 pts/0 4053848 S+ 0 0:00 \_ sudo ./myping google.com
4053848 4053849 4053848 4046770 pts/0 4053848 S+ 0 0:00 \_ ./myping google.com
1 812 812 812 tty1 812 Ss+ 0 0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
왜냐면 myping을 root(UID = 0)가 실행하고 있기 때문입니다.
$ sudo chown root ./myping
$ sudo chmod +s myping
$ ls -al myping
-rwsr-sr-x 1 root abcd 72776 Jan 30 2020 myping
$ ./myping google.com
PING google.com (142.250.157.100) 56(84) bytes of data.
64 bytes from ta-in-f100.1e100.net (142.250.157.100): icmp_seq=1 ttl=101 time=57.6 ms
64 bytes from ta-in-f100.1e100.net (142.250.157.100): icmp_seq=2 ttl=101 time=57.0 ms
64 bytes from ta-in-f100.1e100.net (142.250.157.100): icmp_seq=3 ttl=101 time=56.9 m
$ ps ajf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
4053836 4053837 4053837 4053837 pts/1 4059913 Ss 1000 0:00 -bash
4053837 4059913 4059913 4053837 pts/1 4059913 R+ 1000 0:00 \_ ps ajf
4046769 4046770 4046770 4046770 pts/0 4059844 Ss 1000 0:00 -bash
4046770 4059844 4059844 4046770 pts/0 4059844 S+ 1000 0:00 \_ ./myping google.com
또 다른 방법으로는, setuid를 지정하는 방법이 있습니다.
setuid를 지정하면 파일의 소유자의 권한(root)로 실행할 수 있습니다.
"실행하는 순간"에만 권한을 빌려오기 때문에, 실제 실행하는 사용자는 User(UID = 1000)가 됩니다.
$ sudo chown abcd ./myping
$ ls -al myping
-rwxr-xr-x 1 abcd abcd 72776 Jan 30 2020 myping
소유자가 바뀌면 setuid 비트가 지워집니다.
$ sudo setcap 'cap_net_raw+p' ./myping
$ ./myping google.com
PING google.com (142.250.157.101) 56(84) bytes of data.
64 bytes from ta-in-f101.1e100.net (142.250.157.101): icmp_seq=1 ttl=102 time=54.9 ms
64 bytes from ta-in-f101.1e100.net (142.250.157.101): icmp_seq=2 ttl=102 time=54.4 ms
setcap 으로 cap_net_raw 권한을 부여해 사용할 수도 있습니다. :)
buildozer root permission (0) | 2020.11.03 |
---|---|
ubuntu18.04 kivy buildozer 설치 (3) | 2020.11.03 |
Android ssl pinning bypass(2) (0) | 2020.08.15 |
Android ssl pinning bypass(1) (0) | 2020.07.30 |
Transport Layer (0) | 2020.03.07 |