Экзамен для будущих «русских хакеров» в Московском Политехе

Оригинал поста на хабре

И снова здравствуйте. Обычно я пишу статьи в качестве разработчика, но сегодня хочется поделиться опытом проведения экзамена по информационной безопасности в Московском Политехе. По-моему получилось довольно интересно. Задание даже может быть полезным начинающим тестировщикам и пентестерам. Но вначале я немного расскажу про то, как проходили занятия в течении семестра - чтобы было понятно, как мы дошли до жизни такой.

Подготовка

Лекции

В течении семестра у меня было по две пары занятий в неделю для каждой группы, и в это время я постарался впихнуть максимум информации для расширения кругозора. На лекциях рассказывал разное:
  • Про опасности интернета вещей;
  • Историю борьбы Niantic с любителями покемонов;
  • Суть bug bounty программ;
  • Примеры уязвимостей, найденных на PornHub;
  • Почему так сложно защититься от атак с мобильных приложений;
  • Чем так хорош Тор, и почему он может не спасти;
  • Истории про фрод в банковской сфере;
И ещё многое другое. На самом деле, я отлично понимаю, что студенты забывают три четверти полученной информации, а оставшаяся четверть к моменту выпуска становится неактуальной.

Поэтому самым важным для меня было донести до студентов, что:

  • Сейчас почти любой чайник может быть атакован хакером;
  • Нельзя доверять никому, ничему и никогда. Ни пользователям, ни железу, ни софту.
  • Хороший разработчик, хороший хакер и специалист по безопасности - три качества, которые не могут не сосуществовать;
  • Текущие вычислительные мощности позволяют совершать жуткие вещи;
  • Ломать - не строить. Это и интересно и уметь нужно;
  • Тёмная сторона может быть привлекательной. Но там печенек гораздо меньше, чем на светлой - а вот отхватить от джедаев можно по полной.

Семинары

С учётом того, что времени на семинарах было заметно меньше, чем хотелось бы (да, этот предмет я готов вести хоть несколько лет - тема очень глубокая), пришлось выбирать какую-то конкретику, которой студенты будут заниматься в максимально прикладном характере, чтобы их представление о хакинге несколько отличалось от фильмов с красивыми бегущими зелёными строчками. При этом мне хотелось максимально рассмотреть именно способы атаки, а не варианты защиты. Наиболее интересно мне показалось рассмотреть атаки на веб приложения. Они наглядны, эффектны, и многие из используемых там принципов можно так же применить на мобильные и даже десктопные приложения. Поскольку студенты в прошлом семестре изучали PHP, то рассматривали эти уязвимости в PHP - с оговоркой на то, что практически всё то же самое справедливо для других языков разработки.

В целом лабораторные были такие:

  • SQL injections. Возможно, кто-то назовёт меня старпёром, и расскажет, что все современные языки уже не дают так себе выстрелить в ногу… Но практика показывает, что это не так. Легаси код и кривые ленивые руки творят чудеса.
  • XSS;
  • Загрузка вредоносных файлов;
  • Clickjacking;
  • Генерация HTTP запроса. Эту лабораторную я добавил, когда увидел, что студенты не очень хорошо понимают, как работает HTTP. В следующий раз эта лабораторная будет первой;
  • Автоматизированное тестирование;
  • Шифрование. Криптографию я постарался свести к полному минимуму (безумно важная наука и предмет, на которую можно было бы отвести отдельный семестр, но время, время). Но нужно хотя бы знать, чем хэширование отличается от шифрования и ЭЦП, а так же где можно и где нельзя использовать md5.
  • Тестирование DVWA (Damn Vulnerable Web Application) при помощи инструментов Kali Linux. Из забавного - в процессе тестирования мы нашли несовместимость с PHP 7. После чего мгновенно исправили это в студенческом дистрибутиве и отправили пулл реквест в основной репозиторий. Пулл реквест был сразу принят.
Полные задания лабораторных можно посмотреть тут - выкладка на github pages быстра, удобна, и позволяет быстро исправлять какие-то найденные в задании косяки. Студент нажал F5 - и вот у него уже новая версия задания! Для особо вредных читателей - сразу признаюсь, что местами там идёт копирование википедии. Можно было бы давать ссылки - но там часто попадаются прекрасные вещи вроде этой. Так что приходится переписывать материалы руками. И то периодически студенты находили в интернете всякие нетривиальные решения...

Экзамен

Для экзамена было заготовлено специальное уязвимое веб приложение (ссылка есть в конце поста). Изначально у меня было желание заготовить дополнительных уязвимостей в самой машине (устаревшее ПО, открытые порты сервисов с простыми паролями и так далее), но решил, что на это не хватит времени - поэтому ломали только непосредственно само приложение. Перечислять лишний раз уязвимости не буду, поскольку там было ровно то, что мы проходили на лабораторных работах. Заранее предупреждаю - там некачественный код! Тонны его! В этом и был смысл.

Забавный алгоритм мы придумали для оценки студентов. Для экзамена использовался формат bug bounty, и поэтому каждая уязвимость стоила там некоторую сумму вознаграждения. Всё как во взрослом настоящем мире. И экзамен нужно было купить… Отличная оценка стоила 20.000 долларов, удовлетворительная 12.000. Можно наличными.

Если кому интересно, то сама виртуалка была поднята на vagrant+virtualbox, в качестве ОС там был CentOS 7, из ПО стоял nginx+mariadb+php-fpm плюс несколько расширений. Так же на экзамене можно было пользоваться заготовленным стандартным образом Kali Linux 2016.2 - аналогичный тому, который мы использовали на лабораторных работах.

Экзамен длился пять часов (мы практикуем формат WorldSkills). Он прошёл без всяких неожиданностей - всё работало, всё (что нужно) ломалось, все студенты, которые ходили на пары, сдали. Кто не ходили - увы. По-моему, так и должно быть.

Работа над ошибками

После экзамена я запилил вот такой анонимный опросник - гугл формы просто божественны для быстрого сбора фидбека. Если интересно, можете прокликать - я специально экспортировал себе результаты опроса студентов и оставил форму открытой (на текущий момент их заполнило уже 160 человек с хабра). Приятно было получить 13 ответов - при общем количестве студентов в 30 человек и отсутствию обязаловки по заполнению это просто отличный результат. Так же очень обрадовало, что ребятам понравился курс, и отзывы по большей части позитивные. Хвалить себя здесь я смысла не вижу, так что остановимся на критике (авторская орфография сохранена):
Крайне мало информативности по лабам на лекциях.
Да, есть такое дело. Мне хотелось максимум всего интересного рассказать на лекциях, а лабораторками заниматься на семинарах. Но, видимо, надо им тоже уделять время лекций.
Мало времени выделено в течении семестра на лекции.
Да, у нас было по паре лекций в неделю. Приятно, что ребята увидели, что можно было рассказать ещё очень много всего. Ну что же - может быть, мы ещё встретимся в магистратуре.
Отсутствие проектора на первых лекциях.
Да, аудиторию с проектором я получил не сразу. С ним выходит гораздо нагляднее.
Kali и LInux в целом надо бы показать людям более подробно.
Да, тут проблема в том, что курса по Linux до этого не было. Надо будет скорректировать последовательность курсов.
Было трудно приходить на лекции так рано.
Мне тоже :)
В качестве улучшения, я бы предложил(а) добавить в курс интеректива. Например блиц опросы, тесты на лекциях (гуглить kahoot). Это бы увеличило вовлечённость студентов и дало бы понимание кто и где плавает.
Отличная идея. В следующий раз сделаем.
Видео с ютуба
Да, проблема с наглядными материалами была. Причём с видео на русском вообще проблема серьёзная. Его нет, а то, что есть, настолько чудовищно… И дикция куда хуже моей, и часто возникают ситуации, когда автор совершает ошибку, после чего в течении 10 минут её ищет и откатывается обратно... А на заднем фоне в это время играет "Владимирский централ" и фишки домино стучат. В общем, нужны очень крепкие нервы, чтобы это смотреть. А писать своё видео с нуля это весьма трудозатратно. Так что в результате я или использовал видео материалы Positive Technologies (очень люблю этих ребят!), или ставил английское видео и озвучивал его. В следующий раз нужно будет или записать самостоятельно, или хотя бы наложить свою озвучку. Но надо будет искать человека на это, поскольку моя дикция хромает. В общем, задача есть, сложная, но подъёмная.
Трудно слушать речи с недочетами в дикции, а также стоило бы говорить погромче, дальше 2-й парты часто просто было неслышно.
Да, есть такое. Рад, что это заметил только один студент (ну или просто остальные избыточно вежливы). Буду стараться исправляться и использовать микрофон для усиления звука. Громко говорить две-три пары подряд просто горла не хватает - и так на работу потом приходил без голоса.
Неприменимая теория, которую я забуду через пару месяцев.
Увы, так со всей теорией. Но я надеюсь, что ребята запомнили основные мысли (см. выше). Ну и такие вещи умеют всплывать в памяти, если вы продолжаете ими заниматься.
Письменный материал, который в курсе не особо был полезен.
Тут, видимо, имелось в виду, что не особо полезен для экзамена. Увы, теорию в экзамен положить не удалось. Буду думать, как лучше связать курс.
Люди боятся подходить и спрашивать(проблема глобальная и видимо не лечится с годами и курсами), надо как-то придумать подход к ним, чтобы студенты сами приходили и интересовались как что делать, если совсем не понимают. Ничего предлагать не стану, просто это надо как-то обдумать.
Да, проблема есть, и она очень серьёзная. У первого курса, который курирую по проектам микроэлектроники, всё ещё хуже. Ребята просто не умеют спрашивать (хотя тут есть интересное разделение по половому признаку - девушки охотнее задают вопросы). Постараюсь исправить большим количеством обратной связи - в том числе тестами, опросами и так далее. Убедить ребят задавать вопросы безумно сложно.

Так же многие студенты указали на то, что хотелось бы иметь больше времени на экзамен. Надо думать. ИМХО, 6-8 часов работать головой почти нереально - возможно, надо сокращать программу экзамена, чтобы лучше уложиться в 4-5 часов. Или действительно делать перерыв.

Ещё ребята писали, что была несовершенная система оценки уязвимостей - были небольшие награды за небольшие уязвимости, а за большие можно было получить сразу треть нужной награды. С одной стороны, большие уязвимости мной так и задумывались - их мало кто найдёт, но если уж найдёт - это вознаградится по полной. С другой стороны, явно было нужно больше маленьких уязвимостей. Есть над чем поработать.

Итоги

В целом я доволен, хотя предстоит ещё много работы по доработке курса. Радует то, что теперь есть костяк, на который уже легче наращивать больше вкусного “мяса”. И хорошо, что первый блин - не комом. А дальше будет больше, интереснее и вкуснее!

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

P.S. Ищу сейчас хорошего QA-инженера в свою команду. Принимаю резюме с отчётами по данному приложению ;)

P.S.2. Вы можете позвать меня читать какой-то курс у вас. Но должно быть социально-полезно, интересно, или за деньги (лучше, конечно, все три). А то постоянно приходят предложения от всяких милых компаний - придумайте и прочитайте нам курс за несколько рублей, с вас все материалы, видео, методички, и курс остаётся в нашей собственности… Мне страшно думать, кто для них пишет материалы, и чему такие курсы обучают студентов.

Благодарности

Без этих людей такого экзамена не было бы. Так что благодарности:
  • Руководителю образовательной программы «WEB-технологии» Ивану Чикунову и декану факультета информатики и систем управления Андрею Филипповичу - за то, что позволили мне устроить такой беспредел;
  • Денису Васильеву, ведущему курс по мобильной разработке - за то, что смог круто проинтегрировать свой экзамен по мобильной разработке с моим;
  • Заведующей Фаблаба Московского Политеха Ольге Прудковской - за то, что позвала меня в Московский Политех, и за вдохновляющий пример (она очень крута!);
  • Владимиру Канину, моему директору в компании PayMe - за то, что выделяет мне время на то, чтобы делать мир немного лучше;
  • Дмитрию Леонову, автору BugTraq.Ru и замечательному преподавателю моей родной кафедры АСУ в РГУ нефти и газа имени Ивана Михайловича Губкина. Без него я бы ни за что не стал ни хорошим специалистом, ни преподавателем. Отдельное спасибо за разрешение использовать его методические материалы на своих занятиях. Спасибо ему за глубокие и современные знания, которые он даёт. Уже семь лет с момента моего выпуска ему икается, когда я в очередной раз вспоминаю с благодарностью его занятия. Могу только надеяться, что мне когда-нибудь будет икаться так же.
  • Моей жене и детям. Жене - за то, что терпит мои ночные посиделки с подготовкой. Детям - за то что стимулируют меня к тому, чтобы ко времени их поступления в ВУЗ там были хорошие образовательные программы.

Ссылки