capsh를 사용하는 방법 : 최소한의 기능으로 권한없는 핑을 실행하려고합니다.
On 2월 13, 2021 by adminDebian Gnu / Linux에서 기능을 실험하고 있습니다.
/ bin / ping을 현재 작업 디렉토리에 복사했습니다. 예상대로 작동하지 않지만 원래는 setuid 루트였습니다.
그런 다음 sudo /sbin/setcap cap_net_raw=ep ./ping
를 수행하여 최소 기능 (루트 아님)을 핑에 부여하고 핑을 수행합니다. 예상대로 작동합니다.
그런 다음 sudo /sbin/setcap -r ./ping
해당 기능을 취소합니다. 이제 예상대로 작동하지 않습니다.
이제 capsh
를 사용하여 ping을 작동 시키려고합니다.
capsh
에는 권한이 없으므로 루트로 실행하고 루트를 삭제하고 다른 모든 권한.
secure-keep-caps
도 필요하다고 생각합니다. 이것은 capsh
에 문서화되어 있지 않지만 기능에 있습니다. 설명서. /usr/include/linux/securebits.h
에서 비트 번호를 받았습니다. --print
의 출력이이 비트가 정확하다는 것을 보여주기 때문에 정확 해 보입니다.
저는 몇 시간 동안 손을 댔습니다. 지금까지 이것을 가지고 있습니다.
sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"
그러나 ping: icmp open socket: Operation not permitted
의 ping
오류 , 이것은 기능이 없을 때 발생합니다. 또한 --print
는 Current: =p cap_net_raw+i
를 보여줍니다. 이것만으로는 충분하지 않습니다. e
가 필요합니다.
sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"
는 기능을 Current: = cap_net_raw+eip
로 설정합니다. 이는 정확하지만 root
.
Edit-1
이제 sudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"
다음을 생성합니다.
touch: cannot touch `zz": Permission denied ping: icmp open socket: Operation not permitted
첫 번째 오류는 secure-noroot: yes
로 예상되지만 두 번째 오류는 Current: = cap_net_raw+eip
Edit-2
==
를 --print
앞에 넣으면 이제 Current: = cap_net_raw+i
를 표시하므로 이전 오류를 설명하지만 루트에서 전환 할 때 기능이 손실되는 이유는 아닙니다. secure-keep-caps
는 수정하십시오.
Edit-3
내가 볼 수 있듯이 exec가 호출 될 때 유효 (e)와 허용 (p)을 잃어 버리고 있습니다. 이것은 예상되는 일이지만 보안 유지 대문자가 분실되는 것을 막아야한다고 생각했습니다. 뭔가 빠졌 나봐요.
Edit-4
저는 더 많은 조사를하고 있으며 매뉴얼을 다시 읽었습니다. 일반적으로 e
및 p
기능은 다음과 같은 경우에 손실되는 것 같습니다. root
사용자에서 전환 (또는 secure-noroot
를 적용하여 루트를 일반 사용자로 만듭니다.) secure-keep-caps
로 재정의 할 수 있습니다. exec
를 호출하면 이것이 불변이라고 말할 수 있습니다.
내가 말할 수있는 한 설명서에 따라 작동합니다. 내가 말할 수있는 한 capsh
로 유용한 작업을 할 수있는 방법이 없습니다. 내가 말할 수있는 한, 기능을 사용하려면 다음을 수행해야합니다. 파일 기능을 사용하거나 exec
를 사용하지 않는 기능 인식 프로그램이 있어야합니다. 따라서 권한있는 래퍼가 없습니다.
이제 내 질문은 내가 무엇을 놓치고 있는지, capsh
가 무엇인지입니다.
Edit-5
주변 기능에 대한 답변을 추가했습니다. 상속 된 기능과 함께 capsh
를 사용할 수도 있지만 유용하게 사용하려면 실행 파일에 설정해야합니다. capsh가 앰비언트 기능없이 유용한 기능을 수행하거나 상속 된 기능을 허용하는 방법을 알 수 없습니다.
버전 :
-
capsh
패키지libcap2-bin
버전1:2.22-1.2
- 수정 전 -3 최�
git://git.debian.org/collab-maint/libcap2.git
에서 사용을 시작했습니다. -
uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
사용자 영역은 32 비트입니다.
댓글
답변
기능은 프로세스의 속성입니다. 전통적으로 세 가지 집합이 있습니다.
- 허용 된 기능 ( p ) : 현재 프로세스에서 “활성화 됨”.
- 유효 기능 ( e ) : 현재 사용할 수있는 기능 현재 프로세스에서.
- 상속 가능한 기능 ( i ) : 상속 될 수있는 파일 기능입니다.
루트로 실행되는 프로그램은 항상 전체 허용 및 유효 기능을 갖기 때문에 더 많은 기능을 “추가”해도 눈에 띄는 효과가 없습니다. (상속 가능한 기능 세트는 일반적으로 비어 있습니다.) setcap cap_net_raw+ep ping
를 사용하면이 프로그램을 실행하는 모든 사용자에 대해 기본적으로 이러한 기능을 활성화 할 수 있습니다.
안타깝게도 이러한 기능은 실행 된 파일이며 새 자식 프로세스를 실행 한 후 유지되지 않습니다. Linux 4.3에는 하위 프로세스에서 기능을 상속 할 수있는 대기 기능 이 도입되었습니다. ( capabilities (7) 의 execve () 동안 기능 변환 도 참조하십시오.)
다음과 같은 함정에주의하십시오.
- 사용자를 루트에서 루트가 아닌 것으로 변경하면 유효하고 허용되는 기능이 지워집니다 ( 기능에 대한 사용자 ID 변경의 영향 참조). 기능 (7) ).
capsh
의--keep=1
옵션을 사용하여 세트를 지우지 않도록 할 수 있습니다. - 다음과 같은 경우 앰비언트 기능 세트가 지워집니다. 사용자 또는 그룹 ID 변경. 해결 방법 : 사용자 ID를 변경 한 후 하위 프로세스를 실행하기 전 에 주변 기능을 추가합니다.
- 기능은 주변 기능에만 추가 할 수 있습니다. 이미 허용 된 기능과 상속 가능한 기능 세트에 모두있는 경우 설정합니다.
libcap 2.26 이후로 capsh
프로그램은 주변 기능을 수정할 수있는 기능을 얻었습니다. --addamb
( 커밋 )과 같은 옵션을 통해. 옵션 순서는 중요합니다. 사용 예 :
sudo capsh --caps="cap_net_raw+eip cap_setpcap,cap_setuid,cap_setgid+ep" \ --keep=1 --user=nobody --addamb=cap_net_raw -- \ -c "./ping -c1 127.0.0.1"
팁 : iv id = “2713a2e3e5의 모든 위치에 --print
옵션을 추가 할 수 있습니다. “>
명령 줄에서 현재 기능 상태를 확인합니다.
참고 : --addamb
div에는 cap_setpcap
가 필요합니다. > cap_setuid,cap_setgid
는 --user
옵션에 필요합니다.
댓글
- capsh –addamb를 사용한 이후 libcap의 특정 버전 번호는 무엇입니까? 2.32 릴리스 노트에 새로운 capsh 기능이 언급되었지만 단어가 모호했습니다.
- @ 把 友情 留 在 无 盐 답변이 처음 작성되었을 때 git master 만 지원했습니다. 그 이후로 libcap 2.26은
--addamb
옵션을 지원하여 출시되었습니다. 그에 따라 답변을 업데이트했습니다. - 안타깝게도 이러한 기능은 실행 된 파일에 바인딩되어 있으며 새 하위 프로세스를 실행 한 후에도 유지되지 않습니다. – 하위 프로세스 b> 저는 일반적으로 기능을 상속하는
fork(2)
를 생각합니다.execve(2)
만 기능을 상속하지 ‘하지만 하위를 만들지 ‘ 방법. 내가 틀렸나 요? -
man capabiltiies
인용 :fork(2)
를 통해 생성 된 하위는 상위의 사본을 상속합니다. ‘의 기능 집합
답변
Lekensteyn의 대답은 정확하고 완전 해 보이지만 주변 기능 세트가 해결하는 문제를 강조하기 위해 다른 각도에서 또 다른 설명을 제공하려고합니다.
기능이 다시 계산되고 잠재적으로 삭제되는 두 가지 관심 시스템 호출이 있습니다.
-
setuid
:man capabilities
:
SECBIT_KEEP_CAPS이 플래그를 설정하면 하나 이상의 0 UID가있는 스레드가 허용됩니다. 모든 UID를 0이 아닌 값으로 전환 할 때 기능을 유지합니다.이 플래그가 설정되지 않은 경우 이러한 UIDswitch로 인해 스레드가 모든 기능을 잃게됩니다.
즉, 위의 capsh
명령에서 setuid
시스템 호출. 그렇지 않으면 모든 기능이 손실됩니다. 이것이 --keep=1
가하는 일입니다. 이제 명령은 sudo capsh --user=<some_user> --keep=1 --
-
execve
가됩니다.--keep=1
옵션을 사용하면 모든 기능 집합 (유효, 허용, 상속 가능)이
보존됩니다.execve
시스템 호출을 사용하지만execve
는 기능이 다시 계산되도록합니다 (루트가 아닌 사용자의 경우). 그렇게 분명하지 않은 방법입니다.간단히 말해서 주변 기능 세트를 추가하기 전에 스레드의 “허용 된”기능에 있습니다.execve
호출 후 다음 중 하나를 설정합니다.
- 파일의 “허용 된”집합에 해당 기능이 있어야합니다 .
setcap cap_net_raw+p /bin/bash
를 사용하여 수행 할 수 있습니다. 이렇게하면 스레드의 능력 집합 (경계 집합 제외)이 더 이상 효과가 없기 때문에 전체 연습이 쓸모 없게됩니다. - 파일과 스레드 모두 “상속 가능한”집합에 해당 기능이 있어야합니다 .
setcap cap_net_raw+i
가 트릭을 수행한다고 생각할 수 있지만execve
로 인해 스레드가 호출 할 때 스레드의 저장 불가능한 권한이 삭제되는 것으로 나타났습니다. 권한이없는 사용자 (현재는setuid
덕분입니다). 따라서 권한이없는 사용자는이 조건을 충족 할 방법이 없습니다.
Linux 4.3에 도입 된 앰비언트 기능을 사용하면 권한이없는 사용자에게 setuid
다음에 , 파일 기능에 의존하지 않아도됩니다.
답변
커널에 버그 / 기능이있을 수 있습니다. 몇 가지 논의가있었습니다.
- https://bugzilla.altlinux.org/show_bug.cgi?id=16694
- http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-03/5224.html
D가 있는지 모르겠습니다. 하나, 고칠 수 있습니다.
오해하지 마십시오. 현재 동작은 안전합니다. 하지만 작동하는 것처럼 보이는 작업을 방해 할 정도로 안전합니다.
편집 : http://man7.org/linux/man-pages/man7/capabilities.7.html 새로운 기능 세트 Ambient가 있습니다 (Linux 4.3 이후). 이것이 필요한 것을 허용 할 것 같습니다.
Answer
Lekensteyn의 답변을 약간 조정하면 최근 커널에 대한 호출이 더 짧아집니다.
sudo /usr/sbin/capsh --keep=1 --user=$USER \ --inh=cap_net_raw --addamb=cap_net_raw -- \ -c "./ping -c1 localhost"
참고 : sudoers 파일에 따라 환경이 엉망이 될 수 있습니다 (예 : HOME 변경). capsh는 uid를 변경하지만 “sudo”의 환경 변경을 되 돌리는 데 아무런 조치도 취하지 않습니다.
여기서 무슨 일이 일어나고 있습니까? 한 번 살펴 보겠습니다.
-
sudo /usr/sbin/capsh
: 루트로 시작합니다. 루트로 시작하여 모든 기능이 유효 (이를 수행 할 수 있음) 및 허용 (이를 유효에 추가 할 수 있음) 세트에 있지만 다른 세트에는 없습니다. . 다른 세트는 잠시 후에 다룰 것입니다. -
--keep=1
: 보안 (읽기 : 레거시) 이유로 일반적으로 기능은 루트-> 비 루트 ID 스위치입니다.이 플래그는SECBIT_KEEP_CAPS
라는 기능을 활성화하여이를 허용합니다. exec에서 자동으로 지워진다는 점에 유의할 가치가 있습니다. , 이것은 좋은 생각입니다. -
--user=$USER
: 이제 UID 변경에 대한 모든 기능을 잃지 않을 것이므로 루트에서 탈락합니다.SECBIT_KEEP_CAPS
덕분에 우리는 루트와 같은 권한을 유지하여 우리의 능력을 더욱 엉망으로 만들 수 있습니다. -
--inh=cap_net_raw
: 상속 할 수없는 경우 능력을 주변 (다음 항목 참조) 할 수 없기 때문에 상속 가능한 집합에 대상 기능을 추가합니다. -
--addamb=cap_net_raw
:SECBIT_KEEP_CAPS
를 요청했지만 권한이없는 (setuid / setgid / setcap 없음) 바이너리의execve
는 여전히 능력을 지우면 권한이 없습니다. Linux 4.3은 앰비언트 세트를 추가하여 권한이없는 바이너리를 실행할 때 유효 및 허용 세트에 다시 추가됩니다. 완벽합니다! -
-- -c ...
: 모든 것을 설정했으면이 인수로 bash를 실행합니다. 기능 세트가 지워지고 (bash가 권한이 없기 때문에) 앰비언트 세트가 다시 추가되고 짜잔! 우리는 원시를 여는 데 필요한 권한이 있습니다. 소켓.
특별한 capsh에 대한 인수로 인해 나머지 명령 줄과 함께 실행됩니다.
sudo /usr/sbin/capsh --keep=1 --user=$USER \ --inh=cap_net_raw --addamb=cap_net_raw == --print Current: = cap_net_raw+eip
cap_net_raw가 유효 (할 수 있음), 상속 가능 (하위 프로세스에 전달할 수 있음) 및 허용됨 (얻을 수 있음). 다른 어떤 기능도 없습니다.
기능 및 작동 방식에 대한 자세한 내용은 capabilities (7) 매뉴얼 페이지 . 특히 Transformation of capabilities during execve()
제목입니다.
댓글
- 완료되었습니다. 작업이 완료 될 때까지 ‘ 삭제할 수없는 ‘ 많은 추가 기능이 필요하기 때문입니다.귀하의 경우에는 ” root “로 실행 중이므로
--user
도 마찬가지입니다. ‘ 변경되지 않았습니다. ‘ 나중에 필요한 기능을 계속 사용할 수 있습니까? - 알려 주셔서 감사합니다. 이 명령 줄의 이전 버전은 명시 적으로 priv를 삭제 했으므로 그 전에 setuid가 필요했습니다. privs가 exec의 일부로 암시 적으로 삭제되었으므로 ‘ 필요하지 않습니다.
capsh
를 가져와도 “최신”capsh
가 주어지지 않았을 것입니다. Debian 패키지는 여전히 지원하지 않습니다. 주변 기능. 업스트림 2.27은 그렇습니다.capsh
사용이 무엇인지입니다. 나는 무엇을 놓치고있다. 반드시 사용해야합니다.