Наша компания в конце апреля этого года объявила об открытой стажировке в трех самых технических отделах: исследований, анализа защищенности и безопасности бизнес-систем. Этот опыт был для нас новым, и хочется поделиться им.
Вопрос образования в области информационной безопасности стоит, на наш взгляд, очень остро. Поэтому мы в рамках стажировки хотели не только научить ребят и показать им что-то новое и актуальное с технической точки зрения, но и даже привить наш технический взгляд на исследования в области ИБ.
Краткая информация
Мы – отдел исследований (Исследовательский центр) компании Digital Security. В первую очередь, мы занимаемся задачами reverse engineering, поиском уязвимостей в бинарных приложениях и написанием эксплоитов. Если вы любите сидеть в дизассемблере или отладчике, если хотите автоматизировать различные задачи для поиска уязвимостей, если вам нравится писать fuzzers, то вы близки нам по духу.
Введение
К нам в отдел поступали заявки на стажировку как от студентов, так и от тех, кто твердо стоит на ногах, но хочет «прокачать» свои навыки или попробовать силы в сфере ИБ. Ведь после каждого шумного «взлома» наша сфера становится всё популярней :)
Само собой, мы предоставили возможность участвовать в процессе удалённо тем, кто не мог посещать наш офис, но наибольшую пользу извлекли те, кто смог приходить к нам лично. И такие ребята бывали у нас довольно часто (надеемся, что это никак не связанно с довольно частыми дождями в Питере этим летом, которые мешали посещать пляжи и другие места отдыха на каникулах).
С теми, кто выбрал стажировку в нашем офисе, мы проводили небольшие собеседования, и уже по результатам принимали окончательное решение. Общение в удаленном режиме проходило, в основном, через электронную почту и там, честно признаться, критерии были более мягкими, поскольку оценивали по резюме и нескольким вопросам, связанным с запланированными темами.
На темах остановимся подробнее. Перед запуском программы стажировки мы внутри своего отдела провели мозговой штурм и сгенерировали темы, соответствующие следующим критериям:
- по окончанию стажировки ребята могли опубликовать результаты своих исследований (github, gitlab и другие репозитории для проектов с открытым исходным кодом) и/или выступить перед публикой на конференции
- связаны с реальными практическими задачами
По результатам ответов на вопросы мы предлагали стажёру тему (или несколько), наиболее подходящую под его навыки и интересы из постоянно обновляемого перечня. В случае, если задача не устраивала или кто-то просил «огласить весь список», мы шли навстречу.
Если честно, большинство стажёров ожидало от нас заданий по поиску «крутых» уязвимостей по типу Heartbleed, Ghost и т.п. Однако, чтобы найти такие ошибки, недостаточно запустить какую-нибудь готовую программу, надо ещё разобраться в механике её работы. Ведь со временем у каждого уважаемого исследователя появляется свой набор ПО, как из готовых, но «доведенных до ума» под свои задачи инструментов, так и написанных лично. Также важно, напомним, чтобы исследование можно было делать сразу публичным (это уже решали сами стажеры).
В рамках программы было проведено несколько митапов. Часть из них была основана на старых выступлениях, но обновлена под текущие реалии или дополнена демонстрацией непубличных уязвимостей ;):
- «No Symbols =(» (Дмитрий Евдокимов и Георгий Носенко)
- «Light and Dark side of Code Instrumentation» (Дмитрий Евдокимов)
- «Testing CAN network with help of CANToolz» (Алексей Синцов)
- «The boot process in x86-compatible PC» (Александр Ермолов)
- Митапы от коллег из отдела аудита
А в середине лета уже сами стажёры провели для нас подобный митап, представив свои результаты. По окончанию каждого выступления мы с коллегами и другими стажёрами задавали вопросы, благодаря этому появлялись другие пути решения поставленной задачи и новые темы для будущих исследований.
Часть ребят ещё не до конца реализовала намеченные планы, но это не означает, что они не справились. Просто некоторые темы оказались шире, и они захотели реализовать дополнительные задачи в них. Мы довольны результатами и будем работать над качеством процесса стажировки. Некоторым стажёрам предложили начать работать в нашей компании уже сейчас.
Руководили стажёрами:
- Дмитрий Евдокимов d1g1
- Георгий Носенко
- Егор Литвинов Xarlan
- Борис Рютин dukebarman
Вопросы для мини-интервью
- Почему решили стажироваться именно в DSec? Чем привлекла вас компания?
- Понравилась ли стажировка? Что особенно запомнилось? Насколько реальность совпала с вашими ожиданиями?
- Расскажите о своей задаче/задачах.
- Показались ли интересными задачи, над которыми вы работали в процессе стажировки? Было ли что-то, чем вы хотели заняться, но не удалось?
- Готовы ли вернуться в компанию на стажировку или на работу?
Ниже представлены ответы некоторых стажёров.
Localhost стажёры
Игорь Кириллов (Студент 4 курса Санкт-Петербургского Политехнического Университета)
Тема: «Изучить возможности плагина hexrays-tools для дизассемблера IDA Pro, портировать его для новых версий IDA Pro. Рассмотреть возможность переноса плагина с C++ на IDAPython.»
Интервью:
- Мне нравится разбираться в устройстве сложных систем. И хотя программировать тоже интересно, но меня больше привлекают внутренние процессы, происходящие в ОС, устройство ОС. Мне кажется, лучшее место для развития и применения моих интересов – это исследовательский отдел DSec. К тому же, DSec – компания международного уровня, а в сфере информационной безопасности в России этим званием разве что Лаборатория Касперского может похвастаться.
- Понравилось. Больше всего запомнилось собеседование. Я готовился к тому, что будут проверять мои знания, но я получил их посредством самообразования, поэтому мне было сложно оценить стартовые требования. Однако, после рассказа о том, как я обходил защиту у игрушки, которая шифрует трафик и не дает модифицировать код, мы сразу перешли к обсуждению возможных тем для стажировки и того, что стоит изучать для дальнейшего развития. Здорово, что есть возможность показать себя в деле, а не в неких абстрактных условиях. Настроен был, что будет трудно, и действительно, сначала, когда приступил к заданию, «утопал» в цепочках функций и структур. Смотрел на код и пытался понять, что он делает. Залезал в функции и определения участвующих структур, понимал, что и они из чего-то состоят. И так далее по рекурсии…
У IDA еще есть особенность в виде не слишком качественной документации, а также в структурах, название которых мало о чём говорит. Тем не менее, прошло несколько дней и все эти tinfo_t, vdui_t, cvar.idati и т.д. стали моими лучшими друзьями.
- Нужно было портировать плагин-победитель соревнования, устраиваемого разработчиками IDA. Ну и задуматься о переносе его на Python. Плагин был заточен под версию 6.3 (Hex-Rays 1.8) и при попытке скомпилироваться под 6.6 выдавал около 500 ошибок. Еще штук 50 набегало при переносе с 6.6 на 6.8. В общем, починить его удалось за 2 недели, но поскольку код был практически нечитабельным (одни hardcoded вызовы функций чего стоили) и плохо расширяемым, то я взялся за написание своей версии на Python, добавив несколько существенных изменений. На данный момент, плагин уже обладает следующими возможностями:
- Позволяет интерактивно реконструировать структуры и классы, а также помогает разбираться в назначении полей.
- Создает список классов, позволяющий держать перед глазами виртуальные функции, а также централизовано редактировать их имена и сигнатуры.
- При смещениях, указывающих за пределы структуры, составляет список из подходящих расширенных структур и заменяет код на CONTAINING_RECORD макро (Список можно составить в том используя любую Type Library).
- Строит симпатичный граф из взаимосвязанных структур и позволяет перемещаться по нему.
- Множество прочих вспомогательных возможностей.
Сам плагин будет представлен на конференции ZeroNights 2016.
- Позволяет интерактивно реконструировать структуры и классы, а также помогает разбираться в назначении полей.
- Поскольку IDA — основная программа для reverse engineering, и хочется хорошо знать её возможности, я выбрал задание по починке полезного C++ плагина для свежих версий IDA. И в дальнейшем перенес его на Python, изрядно усовершенствовав. Задание сильно увлекло и приходилось сдерживать себя, чтобы не заниматься этим с утра до вечера. Хотелось бы поискать уязвимости в реальных программах (особенно в драйверах и ООП коде, где можно заодно всесторонне протестировать мой плагин), но пока нужно «переварить» некоторое количество литературы и прочей информации.
- Однозначно – да.
Михаил Колесов (Студент 6 курса в СПбГЭТУ «ЛЭТИ»)
Тема: «Разработка семантического движка поиска ROP-гаджетов на основе Фреймворка Triton.»
Интервью:
- Почитал описание того, чем занимается отдел исследований. И понял, что как раз тем, что мне интересно.
- Стажировка очень понравилась. Интересные задачи, радушный и отзывчивый коллектив, уютный офис, новые знакомства, 27 встреча Defcon Russia, крейсер «Аврора» за окном. Супер!
- В качестве задания на стажировку мне был предложен ряд тем, из которых наиболее интересной мне показалась разработка движка для семантического поиска ROP-гаджетов на основе Фреймворка Triton. Чтобы лучше разобраться в вопросах, касающихся ROP-эксплуатации, я приступил к изучению теоретических материалов и соответствующих практических заданий. Невероятно полезными оказались материалы, которые нам постоянно подкидывали сотрудники компании. Далее, приступил к анализу и изучению исходных кодов программ, предназначенных для сбора гаджетов в исполняемых файлах. Самыми интересными из них оказались ROPGadget и Ropper, реализованные на Python. Однако, из-за того, что они не предоставляли детальной (необходимой нам) информации о гаджетах, было принято решение написать свою утилиту (GadgetFinder).
Для этого мне понадобилось подтянуть свои знания по форматам исполняемых файлов, познакомиться с Фреймворком Сapstone, продумать формат входных\выходных данных и написать несколько сотен строк кода. Одновременно с этим, совместно с руководителем, мы изучали материалы, посвященные Фреймворку Triton, реализовывали небольшие скрипты, дабы лучше ознакомиться с его возможностями.
Также разбирались с применением SMT решателей в области ИБ и продумывали архитектуру будущего приложения (RopFinder). На данный момент ведется работа над RopFinder, а именно:
- реализация простых семантических запросов
(eax == ebx, [esi] == 0xdeadbeef)
- обдумывание технологии, с помощью которой можно объединять гаджеты в ROP-цепочки, исходя из требуемых ограничений.
Работа с Фреймворком Triton через IDA Pro
- реализация простых семантических запросов
- Решение каждой из предложенных задач — инструмент, который облегчит жизнь исследователю и повысит производительность. Так что задачи не только интересны, но и актуальны. Достигать цели самостоятельно — здорово, но вдвойне круто – осуществить комплексное, всестороннее исследование какого-нибудь объемного ПО в составе команды профессионалов. Поэтому хотелось бы поучаствовать в реальном проекте, которым занимаются в отделе исследований. Но, будучи стажером, такое вряд ли возможно.
- Конечно!
Евгений Рассказов (Студент 4 курса в СПбГЭУ)
Тема: «Реализация программно-аппаратной части для MITM-атак и fuzzing knx-tp»
Интервью:
- О компании знаю давно, поскольку знакомые из вуза стажировались у вас, некоторые остались работать. Положительные отзывы со стороны знакомых, которые полностью оправдали себя.
- Стажировка однозначно понравилась. Собеседование запомнится надолго, с хорошей стороны, очень классная, дружеская атмосфера. Ожиданий как таковых не было, все прошло так, как прошло, и я этим очень доволен.
- Моей задачей на стажировке была реализация программно-аппаратной части для проведения MITM-атак и fuzzing KNX-TP. Ее выполнение я начал с изучения KNX. Что это? Как работает? Какова структура пакетов, бегающих по сети? Как можно со всем этим взаимодействовать?
трансивер KNX-TP для RaspberryPi
Изучив работу ETS5, я собрал KNX-сеть и настроил её работу. Вооружившись осциллографом и логическим анализатором, я наблюдал работу KNX-TP сети на более низком уровне. Следующей моей целью было сделать проект печатной платы KNX-трансивера на основе чипа NCN5120 для Raspberry PI. В качестве САПР был выбран Altium Designer. Разобравшись с AD и изучив работу NCN5120, я принялся за проектирование платы. В процессе возникали разные трудности в работе с AD, но плата была завершена и отправлена в производство. В итоге, мы получили плату с двумя NCN5120, что позволяло вклиниваться в разрыв линии связи в KNX-TP. Благодаря этому, возникла возможность реализации MITM-атаки. Плата подключается к Raspberry PI с помощью SPI. В процессе углубленного изучения Raspberry PI выяснилось, что инструмент не поддерживает работу SPI в режиме slave (скорее даже не он, а сам Linux не поддерживает SPI slave, хотя можно так же заметить, что и процессор на Raspberry PI может сделать slave только на 1 из 2 SPI, что нас тоже не особо устраивает), а NCN5120 работает только в режиме master. Было решено написать программную реализацию SPI slave. После попыток работы с Python было решено реализовать все на чистом C. К сожалению, поставки комплектующих задержали, и собрать до конца работающую плату не удалось. Как следствие, протестировать работу программного SPI slave вместе с платой так же не получилось.
- Да, задачи были интересные, периодически менялись и корректировались. Думаю, всегда можно найти то, чем хотелось бы еще позаниматься. В моем случае получилось так, что я шел с мыслью о реверсе программ, а в итоге изучал мануалы на чипы и занимался разработкой печатной платы. Хотя мне это понравилось куда больше.
- Как стажер — скорее нет, чем да. А как сотрудник — с удовольствием.
Евгений Минибаев (Студент 4 курса в Университете Иннополис, l4l)
Тема: «Разобраться с утилитами Joern / Bjoern и составить запросы по их правилам для поиска уязвимостей различного типа. Для начала на примере уже найденных ранее»
Интервью:
- DSec — одна из немногих известных мне компаний, которая занимается интересной для меня областью; помимо этого, достаточно часто видел качественные публикации от компании на Хабрахабре. Отчасти плюсом стало и то, что офис находится в СПб, а я безумно люблю этот город.
- Да, очень-очень понравилось стажировка :) Мало того, что я получил много новых знаний (порой из совершенно неожиданных областей), так еще все это проходило в дружеской атмосфере. Больше всего, наверное, запомнились презентации стажерских успехов, когда у меня чудом заработало то, что я даже не тестировал. Небольшая рекомендация на будущее: стоит объединять презентации смежных отделов, дабы все смогли лишний раз познакомиться и пообщаться.
- В рамках летней стажировки мне было поручено изучить возможности статических анализаторов joern и bjoern по поиску уязвимостей в приложениях. В процессе работы ознакомился с внутренним устройством данных инструментов, а также на практике изучил особенности языка поисковых запросов. Был произведен анализ и верификация существующих запросов для поиска уязвимостей следующих классов: Integer Overflow, Buffer Overflow. Вдобавок, я разработал и протестировал собственные запросы.
Графовое представление уязвимой функции в Linux 3.1
В процессе стажировки была создана документация по установке, настройке и эксплуатации данных инструментов. По итогам, было получено представление о современных методологиях поиска уязвимостей в программных продуктах, а также опыт применения инструментов статического анализа. Вдобавок, удалось освоить научный базис перечисленных статических анализаторов (основы работы компиляторов, промежуточное представление исходного кода, графовые модели и т.п.).
Поиск уязвимости CVE-2013-4512
Помимо основной темы практики, были внимательно прослушаны доклады, непосредственно касающиеся деятельности аналитика информационной безопасности (инструментация бинарного кода, приемы эффективной работы с исполняемыми файлами без символьной информации, анализ защищенности шины CAN в автомобилях).
- Задачи были крутыми и необычными, причем в хорошем смысле. Очень понравилось, что на нас [стажеров] не свалили какой-нибудь монструозный энтерпрайз-продукт в сотни мегабайт и не поручили разбираться с ним, а дали интересные и вполне актуальные проекты из опенсорса, до анализа которых мы бы вряд ли дошли без этих задач. С другой же стороны, лично мне не хватало побольше реверса, ибо очень хотелось поковыряться в каких-нибудь экзотичных прошивках и все в таком роде.
- Конечно, готов вернуться! Я даже пропуск себе оставил :D
Remote-стажёры
Следующие ребята занимались, по сути, одной темой. Им надо было разобраться в архитектуре TMS 320LF2407 и реализовать её поддержку в популярных средствах для Reverse Engineering. Один стажёр был сконцентрирован на уже упомянутом не раз выше диззасемблере IDA Pro, а второй выбрал Фреймворк с открытым исходным кодом Radare2.
Источник: www.ti.com/product/TMS320LF2407
Антон Бояркин
Тема: «Добавить поддержку архитектуры микроконтроллера TMS 320LF2407 в IDA Pro (процессорный модуль на языке Python)»
Интервью:
- На форуме reverse4you.org промелькнула тема стажировки, решил попробовать свои силы. Компания проводит классную конференцию ZeroNights.
- Из стажировки запомнился микроконтроллер TMS320LS2407 и тонны технической документации. Поскольку темы можно было выбрать, ожидания совпали.
- TMS320LF2407 — это цифровой сигнальный процессор от компании Texas Instruments, используется очень часто. Задача — добавить поддержку архитектуры микроконтроллера в IDA Pro и radare2 с целью дизассемблирования прошивки для электросчётчика, оснащённого PLC модемами и предназначенного для организации сетей сбора данных. Микроконтроллер также осуществляет сетевой поиск электросчётчиков, маршрутизацию информационных пакетов, хранение и передачу данных через выбранный канал связи в центральный диспетчерский пункт. Написав процессорный модуль, сможем понять логику микроконтроллера, попробовать выявить слабые места.
- Задача интересная, но на данный момент пока еще не решена.
- Готов
Александр Пыхов
Тема: «Добавить поддержку архитектуры микроконтроллера TMS 320LF2407 в Фреймворк Radare2»
Интервью:
- Лучшая компания по ИТ-безопасности в России. Всегда приятно работать с профессионалами.
- Стажировка очень понравилась. Было приятно личное знакомство. Совпало полностью.
- Задача состояла в изучении и анализе прошивки под МК TMS 320LF2407. В качестве первого шага было решено интегрировать данный МК в Radare 2. Для этого была изучена документация по процессору, пытались найти native компилятор и\или toolchain для работы с данным процессором. По документации были восстановлены ассемблерные инструкции и проводилось тестирование на полученной прошивке. На данный момент, идет отладка и тестирование модуля.
- Задача оказалась интересной, но трудно реализуемой. Хотелось бы больше заняться непосредственно реверсом и анализом :)
- Да, с удовольствием.
Вывод
Для нашего отдела это была первая столь масштабная стажировка. Многое мы совершенствовали по ходу процесса. Но очень рады, как все в итоге прошло, что ребята сами довольны. Планируем и в дальнейшем продолжать такую практику.