상세 컨텐츠

본문 제목

Linux Capability - ping 분석

엔지니어일기/이것저것

by jaws99 2022. 10. 10. 17:59

본문

반응형

https://product.kyobobook.co.kr/detail/S000001810356

 

컨테이너 보안 | 리즈 라이스 - 교보문고

컨테이너 보안 | 공격과 사고에 대비하는 컨테이너 보안의 기술컨테이너 환경에 특화된 보안 문제를 다루는 실무 지침서다. 컨테이너를 배치하고 실행하는 단계마다 어떤 일이 일어나며, 발생

product.kyobobook.co.kr

컨테이너 보안 책을 참고해서 작성한 글입니다.

 

"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

관련글 더보기