최소한의 Busybox 기반 시스템에서 기능이 제한된 프로세스를 시작합니다.

최소한의 Busybox 기반 시스템에서 기능이 제한된 프로세스를 시작합니다.

Busybox 기반의 Linux 시스템에서 루트 사용자로 접근이 가능한 경우, 사용방법특정한 제한된 Linux 세트능력(7)비지박스 외에 다른 도구는 필요하지 않나요?

답변1

따라서 우선 이 작업에는 몇 가지가 필요합니다.libcap기본이 아닌 방식으로 소스에서 구축된 도구 - 따라서 이것이 여러분이 바라던 답변이 아니라는 점을 인정합니다(비지박스만 해당)... 그러나 바이너리는 작으므로 다음 방법을 살펴보세요.

libcap배포판에는 busybox를 사용하여 소스에서 빌드된 커널을 테스트하는 하위 디렉터리가 있습니다. libcap나는 몇 년 동안 커널 버그와 수정/기능을 분류하기 위해 이 도구를 사용해 왔습니다. 여기서 탐색할 수 있습니다:

https://git.kernel.org/pub/scm/libs/libcap/libcap.git/tree/kdebug

그것이하는 일 중 하나는 실행입니다quicktest.sh libcapbusybox 대상 내에서 실행될 때 호환성 테스트 모음입니다. kdebug/../../linux/테스트하려는 시스템을 구축하기 위해 이 상대 위치에 일부 커널 소스 코드가 있다고 가정합니다 . 기본 아이디어는 libcap소스 코드를 압축 해제/git 복제하고 다음을 수행하는 것입니다.

$ git clone git://git.kernel.org/pub/scm/libs/libcap/libcap.git
$ cd libcap/kdebug
$ make

이 작업을 처음 시도하면 qemu이 비지박스 대상을 시작하는 데 필요한 많은 종속성 등이 있기 때문에 빌드에 실패할 수 있습니다(이를 열거하는 방법은 실제로 Readme에서 설명해야 합니다). 그러나 설치 후에는 바이너리가 거의 없습니다 busybox.

qemu위 작업을 수행할 수 있으면 테스트가 완료된 후 이 명령줄을 사용하여 관리 시스템과 상호 작용할 수도 있습니다.

$ make shell

[종료 및 Ctrl-d 모두 qemu를 종료].

미묘한 작업을 수행하려는 경우 quicktest.sh사용자 정의 빌드 ./capsh와 같은 바이너리를 사용하여 ./setcap버스박스 기반 시스템 내에서 권한을 사용하여 작업을 실행하는 방법을 보여주는 많은 예가 있습니다. 호스트 시스템에 glibc연결할 정적 파일이 있고 모두 완전히 정적 바이너리인 경우 소스에서 빌드하세요 capsh.setcap

하지만 이 시스템에서는 다음을 수행할 수 있습니다.

# ./capsh --iab="^cap_net_raw" --secbits=15 == --print
Current: cap_net_raw=eip
Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,cap_audit_read,cap_perfmon,cap_bpf,cap_checkpoint_restore
Ambient set =cap_net_raw
Current IAB: ^cap_net_raw
Securebits: 017/0xf/4'b1111 (no-new-privs=0)
 secure-noroot: yes (locked)
 secure-no-suid-fixup: yes (locked)
 secure-keep-caps: no (unlocked)
 secure-no-ambient-raise: no (unlocked)
uid=0(root) euid=0(root)
gid=0(root)
groups=0(root)
Guessed mode: UNCERTAIN (0)

이는 권한을 root단일 기능으로 제한하는 방법을 보여줍니다 . cap_net_raw실행하려는 작업에는 두 가지 옵션이 있습니다.

  • 바이너리에 일부 파일 기능을 추가하고 이를 실행하도록 사용자(루트에서)를 변경합니다.
# ./setcap cap_net_raw=ep ./yourbinary
# ./capsh --user=nobody -- -c "./yourbinary"
  • 또는 위의 capsh메커니즘을 사용하여 권한을 제거 하고 환경 기능을 사용하여 프로그램 실행 시 root권한이 있는 사용자를 제한합니다 .nobody
# ./capsh --user=nobody --iab="^cap_net_raw" -- -c "./yourbinary"

관련 정보