Docker escape — различия между версиями
Drakylar (обсуждение | вклад) м (→CVE) |
Drakylar (обсуждение | вклад) м (→CAP_SYS_PTRACE) |
||
Строка 57: | Строка 57: | ||
==== CAP_SYS_PTRACE ==== | ==== CAP_SYS_PTRACE ==== | ||
+ | Тестовая инфраструктура: | ||
+ | sudo docker run --cap-add CAP_SYS_PTRACE -it ubuntu /bin/bash | ||
+ | apt update | ||
+ | apt-get install libcap2-bin gdb | ||
+ | capsh --print | grep ptrace | ||
==== CAP_SYS_MODULE ==== | ==== CAP_SYS_MODULE ==== |
Версия 12:41, 11 марта 2022
Статья посвящена повышению привилегий из докер-контейнера в зависимости от предоставленного доступа.
Содержание
Начальный доступ
SSRF
Доступ, когда можно только делать запросы по различным протоколам.
Суть в том, что в случае с SSRF можно делать запросы кроме файлов еще и на сторонние сервисы. Эти сервисы как правило запущены не в том же контейнере, а на соседнем с виртуальной сетью (это быстро настраивается с docker-compose).
Это повышение привелегий горизонтальное, но позволяет перейти на другой контейнер
Local file reading
Доступ, когда можно только читать локальные файлы.
Remote code execution
Capabilities
Получить список возможных capabilities:
capsh --print
Или сложнее:
cat /proc/self/status | grep Cap
Пример вывода:
CapInh: 0000000000000000
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
Чтобы декодировать:
capsh --decode=0000003fffffffff
0x0000003fffffffff=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,37
CAP_SYS_ADMIN
Эта capability позволяет получить максимальные права. В своем роде alias на другие.
Позволяет зарегистрировать usermode-приложение которое запустится в контексте ядра.
CAP_SYS_PTRACE
Тестовая инфраструктура: sudo docker run --cap-add CAP_SYS_PTRACE -it ubuntu /bin/bash apt update apt-get install libcap2-bin gdb capsh --print | grep ptrace
CAP_SYS_MODULE
DAC_READ_SEARCH
DAC_OVERRIDE
CAP_SYS_RAWIO
CAP_SYSLOG
CAP_NET_RAW
CAP_NET_ADMIN
CVE
Runc exploit (CVE-2019-5736)
Sockets
Docker Sockets
Суть в том, что при некорректной настройке docker socket может быть доступен из контейнера.
Это позволяет выполнять стандартные docker команды на хостовой системе.
find / -name docker.sock 2>/dev/null
# Как правило будет /run/docker.sock
Если docker.sock будет лежать по адресу /run/docker.sock то можно использовать стандартную команду docker.
Иначе потребуется использовать команду
docker -H unix:///path/to/docker.sock ...
rktlet socket
unix:///var/run/rktlet.sock
frakti socket
unix:///var/run/frakti.sock
cri-o socket
unix:///var/run/crio/crio.sock
containerd socket
unix:///run/containerd/containerd.sock
dockershim socket
unix:///var/run/dockershim.sock