С 3 по 4 марта проходили открытые международные соревнования по информационной безопасности iCTF 2017. Ниже представлен небольшой рассказ о прошедших соревнованиях, разбор части заданий, а также основную информацию по необходимому ПО/методам анализа. Начнём?

iCTF проходил в онлайне, зарегистрировалось в нём 317 команд со всего мира. Формат у мероприятия — attack-defence. Интересное нововведение сделали организаторы — в 2017 году вам не нужно было загружать уязвимые образы к себе, вся «битва хакеров» происходила на облачной платформе AWS. Командам выдавались лишь только SSH-ключи для доступа к удалённой машине.
Плюсы такой платформы очевидны: вам нет необходимости выкачивать образ размером несколько гигабайт, искать мощный ноутбук/ПК чтобы развернуть виртуальную машину, которая будет атакована тремя стами командами, грамотно настроить сеть (обычно это самое проблематичное для новичков). Вы просто заходите на виртуальную машину, вводя всего лишь одну команду, и вот — вы готовы к игре.
Есть и минусы: сеть была перегружена, всё очень сильно лагало, машины не вывозили потребляемые ресурсы. Но это ещё не всё — спустя 10 часов игры все машины отвалились, всем выдали новый доступ. Все файлы на удалённой машине стёрлись, в частности я записывал весь сетевой трафик — всё пропало. Второй «обрыв» случился за 1 час 40 минут до окончания турнира, сеть так и не поднялась, и все наработки и дампы трафика также ушли в небытие.
Было представлено 12 сервисов:
- buster — ELF
- cybercrime64k — ELF
- flasking_unicorns — Python (Flask)
- javaisnotfun — Java
- no-rsa — Python
- pokemon — ELF
- ponypoem — Python
- rasf — ELF
- rocketscience — ELF
- time_machine — ELF
- turing_award — ELF
- yacs — ELF
Всех их предстояло рассмотреть, найти уязвимости и проэксплуатировать. Команда организаторов намекала, что патчить сервисы и закрывать дырки — не основная цель (почти всё было в бинарном виде). Защита была не обязательным условием для начисления очков.
Предварительная подготовка
Для участия в CTF-соревнованиях формата attack-defence вам необходимо понимать, что вы будете делать. Существует 3(4) основные ветки работы:
- атакующие — ребята, которые умеют качественно и быстро писать высокопроизводительный код для кражи флагов с серверов других команд. Должны хорошо понимать работу сети, особенности передачи по протоколу TCP, HTTP и т.д. Зачастую все эксплойты пишутся на Python, но никто не запрещает использовать и другие скриптовые языки типа PHP, серверный Javascript, LUA…
- защитники — эти личности должны хорошо разбираться в коде, независимо от языка. Читать код, искать уязвимости и своевременно их устранять, объяснять напарникам как грамотно написать эксплойты.
- реверсеры — эти парни должны отвечать за поиск уязвимостей в бинарных файлах (это уже отдельная религия), патчить их (при случае) и также сообщать о пути эксплуатации атакующим.
- системные администраторы (опционально) — следят за доступностью сети, состоянием сервисов, администрированием сервисов (например своевременные бэкапы) и дампами трафика. Почему опционально? На iCTF сервисы не уходили в оффлайн, от настройки сети ничего не зависело, дампы трафика делаются в одну строчку — готово.
ictf модуль
Данный модуль поставляется через python-pip, позволяет быстро и удобно (поначалу не очень) подключаться к системе проверки (чекеру).

Доступный список команд после авторизации
Отправка флагов, получение списка сервисов с информацией о флагах, список команд, получение SSH-конфигурации. Удобно, на самом деле. Обычно написание эксплойта затягивается из-за дополнительного кода в виде получения списка команд, или же полуавтоматического ввода. Здесь же это время минимизируется и решается одной командой.
игра началась
Для начала нам необходимо получить ключи через команду t.get_ssh_keys(). Вам приходит JSON-объект с ip-адресом, портом и приватные RSA-ключи для авторизации под root и под пользователем ctf. Ключи сохраняем в файлы, через команду ssh-add keyfile.txt добавляем эти ключи в наше хранилище, для упрощения дальнейшей авторизации на удалённой машине. Для подключения по ssh нам необходимо ввести команду ssh root@ip –p PORT (если вы решили не добавлять файлы с ключами в кэш, то вам необходимо также указать параметр –i «путь_до_файла» для возможности авторизации).
Отлично! Мы на сервере, который где-то в Америке. Нужно посмотреть, какие сервисы запущены и где они находятся. На самом деле, при авторизации в консоли выводится путь до папки с сервисами — /opt/ctf/. Не всегда очевидно местоположение сервисов. Это могут быть docker-контейнеры (docker ps –a), lxc-контейнеры (lxc-ls), в данном случае сервисы лежали просто в папках (можно было искать их find / -name=»ctf«). Посмотреть порты, которые слушает каждый сервис, можно было через netstat –tulpn. Также описание всех сервисов было доступно через функцию в python: t.get_service_list().
Отмечу, что все серверы находились в одной большой виртуальной локальной сети 172.31.128.0/17, недоступной из внешней сети.
Доступ был по ssh. Для анализа кода сервисов их было бы неплохо скачать к себе на локальную машину, чтобы открывать в любимом редакторе / дизассемблере. Скачать файлы можно было несколькими способами:
- scp -P port -r root@ip:/opt/ctf/ . — скачивает все файлы с удалённого сервера из папки /opt/ctf/ в текущую (.) папку на локальном компьютере. –r скачивает все вложенные папки. –P указывает порт, по которому подключаться на удалённую машину
- Воспользоваться «псевдо-прокси», программой sshuttle. Прокидывает определённый трафик с вашей машины на удалённую машину. Для доступа ко всей локальной сети игры и другим командам можно было ввести команду sshuttle -r root@IP:PORT 172.31.128.0/17 -vv –dns (подробнее). Теперь можно открывать папки вашей удалённой машины прямо в проводнике Linux!
- Самый хороший вариант — использовать текстовый редактор с функцией удалённого подключения по SFTP. Я использовал связку Atom + Remote-FTP. Вы можете сразу редактировать код сервиса, писать эскплойты, всё это будет синхронизироваться при сохранении.

Внешний вид папок через плагин Remote-FTP для Atom
Также было бы неплохо создать git-репозиторий для защиты от случайных действий других команд, и в особенности ваших напарников по команде. Вы можете случайно удалить/изменить файл с сервисом или какой-то другой критической информацией. Лучше сохранить всё это в системе контроля версий (VCS), создав контрольную точку.
В папке /opt/ctf/ пишем:
- git init — инициализирует репозиторий
- git add . — добавляет все файлы и папки в коммит — для сохранения начального состояния
- git commit –m «First commit» — фиксирует изменения. Всё готово, и теперь, если кто-то случайно удалит файл сервиса, вы можете легко восстановить его командой git checkout /path/to/file.py.
Теперь вы полностью готовы к игре, к просмотре содержимого уязвимых сервисов, а значит, пора бы их посмотреть! Ждите вторую и последующие части уже совсем скоро на ctfnews.ru!
Автор — Aлексей Родионов, Университет Иннополис