iCTF 2017 review: часть первая

С 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. Для анализа кода сервисов их было бы неплохо скачать к себе на локальную машину, чтобы открывать в любимом редакторе / дизассемблере. Скачать файлы можно было несколькими способами:

  1. scp -P port -r root@ip:/opt/ctf/ . — скачивает все файлы с удалённого сервера из папки /opt/ctf/ в текущую (.) папку на локальном компьютере. –r скачивает все вложенные папки. –P указывает порт, по которому подключаться на удалённую машину
  2. Воспользоваться «псевдо-прокси», программой sshuttle. Прокидывает определённый трафик с вашей машины на удалённую машину. Для доступа ко всей локальной сети игры и другим командам можно было ввести команду sshuttle -r root@IP:PORT 172.31.128.0/17 -vv –dns (подробнее). Теперь можно открывать папки вашей удалённой машины прямо в проводнике Linux!
  3. Самый хороший вариант — использовать текстовый редактор с функцией удалённого подключения по 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лексей Родионов, Университет Иннополис