Автор: Райтис Дата: 20190427 Блог: www.zzfly.net Я не очень хорошо учусь. Я надеюсь, что вы сможете дать мне несколько советов
фон
По приглашению школьного учителя я провел совместное совещание для своих учеников, чтобы познакомить их с опытом, связанным с AWD. Я использовал PHP для мозгового штурма Swool Расширяйте и создавайте среду для соревнований, а также превращайте совместное собрание в дружеское соревнование.
Тема ход мыслей
Эта тема взята из моей практики аутсорсинговых проектов. В проекте есть общее требование: после входа клиента в систему внешнее устройство запускает операцию отправки websocket (например, “открытый доступ”, “карта сброса”, “нажмите переключатель” и т. Д.), Которая часто встречается во встроенной системе. Получателем запроса является пользователь, который вошел в систему (обычно связанный идентификатором пользователя или именем пользователя). Когда я впервые разработал такого рода приложение, я использовал идентификатор пользователя уникальной личности пользователя в качестве имени этого канала websocket, поэтому следствием является то, что независимо от того, на каком компьютере пользователь входит в систему, независимо от того , сколько раз пользователь входит в систему (без повторного входа для небольших проектов + автономное решение о сжатии), пока пользователь успешно входит в систему и открывает соответствующую веб-страницу, он получит запрос websocket, что приведет к некоторому неожиданному раскрытию информации. В реальном проекте есть много решений, таких как решение о повторном входе в систему и создание “анонимного канала” websocket. На этот раз мы начнем с этого
Принцип работы AWD
Ctf-awd-это распространенный тип оффлайн-соревнований, который обычно популярен среди игроков из-за его атаки и защиты. Здесь я в основном реализую две ключевые функции AWD: система поворота, обнаружение выживания и динамический флаг. Что касается внешнего контента, такого как отправка флагов, то он будет обрабатываться платформой go ctf нашей школы.
- Система раундов: игра занимает 10 минут как раунд. Для центрального сервера сценарий используется заранее, чтобы сгенерировать и сохранить флаг в виде файла в соответствии с количеством открытых целей и IP-адресом, а также записать время начала в начале игры. Каждый раз, когда центральный сервер получает запрос от целевой машины, он вычисляет текущие раунды в соответствии с IP-адресом целевой машины и временем с момента начала игры и возвращает соответствующее значение в массиве флагов. В pusher (стороннем инструменте websocket, который может предоставить язык сценариев CLI с возможностью отправки websocket, эта проблема зависит от pusher), также требуется 10 минут в качестве раунда, чтобы активно отправлять игрокам сообщения, содержащие ключевое содержание игры
- Обнаружение выживания: настройка мониторинга инвентаризации платформы относительно проста, в основном для мониторинга веб-служб (целевой порт 80). Отправляйте HTTP – запрос на целевую машину каждые два периода времени, загружайте файл JS на целевую машину, на которой находится ключ толкателя. Если размер файла соответствует ожиданиям, целевая машина выживет. В процессе соревнования игрокам необходимо украсть ключ противника, чтобы подслушать содержимое веб-сайта другого, и изменить свой ключ-толкатель, чтобы устранить утечку
- Динамический флаг: эта часть также выполняется центральным сервером и толкателем. Центральный сервер вернет игрокам разные флаги в разное время (разные раунды). Толкатель активно перемещает разные флаги на страницу игрока в разное время (разные раунды).
Сводка дефектов AWD
После завершения этого соревнования мы обнаружили, что все еще остается несколько проблем, которые необходимо преодолеть, если эта платформа будет использоваться для ежедневных тренировок игроков
- Поскольку школьная платформа goctf по-прежнему не поддерживает функцию динамического флага по состоянию на конец соревнований, функция активного уведомления платформы ctff об изменении флага в соответствии с центральным сервером в каждом раунде не может быть реализована, поэтому участники могут только временно записать свой собственный флаг 233333 .TAT
Часы трудно унифицировать. Поскольку pusher и центральный сервер AWD не обязательно работают на одном сервере, а центральный сервер получает данные динамическим способом, pusher является активным push, и время запуска разное, трудно достичь полного единства в каждом раунде. В будущем, если потребуется снова создать платформу для соревнований AWD, можно будет добавить пакет синхронизированного сердцебиения, чтобы обеспечить равномерное время
Запись
После представления основной идеи работы соревновательной платформы я кратко объясню практику этой темы AWD.
атака
Получите доступ к порту 80 и зарегистрируйте нескольких пользователей. После входа в систему обнаруживается, что пользователь с идентификатором пользователя 1 зарегистрирован, и система запрашивает, чтобы пользователь с идентификатором пользователя 2 вошел в систему После входа в систему пользователя с идентификатором пользователя 2 на странице обнаружения запускается websocket с именем туннеля user.2. После переключения на других пользователей обнаруживается, что имя туннеля-пользователь ( Ссылка на веб-сайт для текущего идентификатора входа пользователя) В каждом раунде обнаруживается, что “игровое сообщение” активно напоминается в виде всплывающего окна, а “игровое сообщение” содержит флаг1. Однако в течение 2 секунд после появления всплывающего окна он вынужден перейти на страницу выхода пользователя (указывающую, что XSS включен) Войдите в фоновый режим сервера, измените файл представления (home. Лезвие. PHP) и измените пользователя вывода. {{auth:: user() – > ID}} текущего идентификатора пользователя в нижней части раздела JS пользователю.1 (имеется в виду принудительное получение сообщения пользователя. 1 туннель) В следующем раунде push принимается сообщение user.1, и получается Флаг2, и Флаг2 заканчивается на=, как кодирование Base64, после декодирования получается значение rot13 пароля (секретной) учетной записи, и правильный пароль получается после повторного поворота rot13 После входа в систему в качестве (конфиденциального) администратора обнаруживается, что существует модуль для загрузки изображения головы, и выполняется только проверка внешнего интерфейса. Burp suite может загрузить PHP “кухонный нож”, изменив имя файла в запросе, чтобы получить системную оболочку, и пользователь является root После понимания всего процесса выясняется, что pusher.js содержит ключ учетной записи pusher, и этот файл можно легко загрузить на порт 80, поэтому у каждой целевой машины есть проблемы с утечкой. После получения ключа-толкателя противника вы можете изменить его на свой собственный сервер, чтобы получать сообщение от пользователя противника.1 туннель, получить пароль учетной записи администратора противника (секретный), а затем использовать оболочку get уязвимости для загрузки файлов.
Должен
В дополнение к регулярному резервному копированию, мониторингу, аудиту источников существуют следующие решения.
Нить
/Readme.txt существует в корневом каталоге, запрашивающем поиск точки входа из записи команды истории Были найдены две подозрительные команды: curl 172.17.0.1 и PHP artican tinker Используют команду “IP addr”, чтобы обнаружить, что она находится в том же сегменте сети, что и предыдущая команда. Предполагаю, что это для отправки запроса на центральный сервер В тесте curl, оказывается, что такой команды нет, а apt, yum и другие инструменты недействительны. Используйте cat/etc/issue, чтобы проверить, является ли текущая система alpine Linux, поэтому используйте команду APK add curl для установки инструмента curl и получите flag3 после обычного запроса В соответствии с правилами игры, flag3-это динамический флаг, который меняется один раз в каждом раунде и не может быть отправлен на собственную целевую машину. Поэтому мы можем сотрудничать с товарищами по команде, отвечающими за наступательную часть, чтобы завершить проникновение в целевую машину.Команда PHP artican Tinker инкапсулирует оболочку psy с фреймворком laravel, используемым для игры. Вы можете напрямую войти в оболочку psy, чтобы изменить пароль учетной записи администратора в обычном режиме, чтобы получить права администратора вашей целевой машины. Это похоже на эффект изменения идентификатора пользователя для подслушивания websocket, как упоминалось выше, но это сложнее и не соответствует ожидаемой точке тестирования websocket
Вторичная линия
После получения всплывающего окна в каждом раунде он будет вынужден перейти на страницу “выход”. Предполагается, что уязвимость XSS существует. После аудита исходного кода измените $(“”). HTML (данные. Сообщение) в разделе ресурсы/просмотры/home.blade. php – файл в $(“”). Текст (данные. Сообщение) для анализа переданного контента, чтобы выпустить XSS для отравления (смеяться до небес ~) Аудит исходного кода обнаружил, что метод upload () используется для обработки операции загрузки файлов по URL/upload и не определяет расширение, тип шахты и т.д., Которые могут быть использованы для принудительной загрузки файлов сервером противника. Однако платформа laravel по умолчанию включает перехват CSRF. Вам необходимо зарегистрировать учетную запись на сервере противника, чтобы получить токен CSRF
Адрес проекта на GitHub
Адрес проекта на GitHub
Рабочая среда
Часть платформы AWD: PHP 7 + swool 4 Целевая часть: докер любой версии
Введение в проектную документацию
Сервер: Центральный сервер AWD, работающий на главном докере, отвечает за предоставление флага: флаг 3 каждого раунда в соответствии с
- Файл Get flag – это исполняемый файл PHP, который основан на команде
docker psдля создания различных флагов для контейнера и сохранения их какflags.json - Файл сервера-это исполняемый файл PHP, прослушивающий
80Порт, возврат в соответствии с различными раундамиflags.jsonСоответствующее значение в файле - Флаги.json сохраните сгенерированный флаг
- Файл Get flag – это исполняемый файл PHP, который основан на команде
толкатель:
Pusher.jsНа стороне сервераdockerКурица или любой компьютер. Введение толкателя можно перенести на официальный сайт: www.pusher.com- Файл администратора Pusher – это исполняемый файл PHP, который используется для отправки сообщений (для подслушивания игроками) пользователям-администраторам в вопросах конкурса
websocket, включая флаг: Flag2) - Файл пользователя Pusher-это исполняемый файл PHP, который используется для отправки сообщений (включая флаг: флаг 1) для обычных зарегистрированных пользователей в заголовке (идентификатор 2).
- Файл монитора представляет собой исполняемый файл PHP, который используется для мониторинга работоспособности целевой машины (веб-служба мониторинга/
pusher.jsРазмер файла) - Файл сервера Pusher – это исполняемый файл PHP, который отправляет сообщения и обнаружение выживаемости в соответствии с циклом (временем)
- Файл флага Get-это исполняемый файл PHP, который используется для создания сообщения администратора (Флаг 2).
- Pusher-ключ.json сохраняет ключ
pusherи значение Flag2 (значение flag1 является фиксированным значением, одинаковым для каждого игрока)
- Файл администратора Pusher – это исполняемый файл PHP, который используется для отправки сообщений (для подслушивания игроками) пользователям-администраторам в вопросах конкурса
Веб: часть веб-сайта предприятия в теме конкурса предназначена для
laravel 5.8Фрейм, использующийsqliteбазу данных- Бизнес-логика в основном заключается в
/приложение/Http/Контроллеры/ - /приложение/Http/Контроллеры/
Просмотр файлов в/ресурсы/представления
- Бизнес-логика в основном заключается в
- Каталог
Больше
Для получения дополнительной информации об этом проекте, пожалуйста, перейдите по ссылке http://www.zzfly.net/build-a –