И снова здравствуйте. Обычно я пишу статьи в качестве разработчика, но сегодня хочется поделиться опытом проведения экзамена по информационной безопасности в Московском Политехе. По-моему получилось довольно интересно. Задание даже может быть полезным начинающим тестировщикам и пентестерам. Но вначале я немного расскажу про то, как проходили занятия в течении семестра — чтобы было понятно, как мы дошли до жизни такой.
В течении семестра у меня было по две пары занятий в неделю для каждой группы, и в это время я постарался впихнуть максимум информации для расширения кругозора. На лекциях рассказывал разное:
И ещё многое другое. На самом деле, я отлично понимаю, что студенты забывают три четверти полученной информации, а оставшаяся четверть к моменту выпуска становится неактуальной.
Поэтому самым важным для меня было донести до студентов, что:
С учётом того, что времени на семинарах было заметно меньше, чем хотелось бы (да, этот предмет я готов вести хоть несколько лет — тема очень глубокая), пришлось выбирать какую-то конкретику, которой студенты будут заниматься в максимально прикладном характере, чтобы их представление о хакинге несколько отличалось от фильмов с красивыми бегущими зелёными строчками. При этом мне хотелось максимально рассмотреть именно способы атаки, а не варианты защиты. Наиболее интересно мне показалось рассмотреть атаки на веб приложения. Они наглядны, эффектны, и многие из используемых там принципов можно так же применить на мобильные и даже десктопные приложения. Поскольку студенты в прошлом семестре изучали PHP, то рассматривали эти уязвимости в PHP — с оговоркой на то, что практически всё то же самое справедливо для других языков разработки.
В целом лабораторные были такие:
Полные задания лабораторных можно посмотреть тут — выкладка на 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 человек и отсутствию обязаловки по заполнению это просто отличный результат. Так же очень обрадовало, что ребятам понравился курс, и отзывы по большей части позитивные. Хвалить себя здесь я смысла не вижу, так что остановимся на критике (авторская орфография сохранена):
Да, есть такое дело. Мне хотелось максимум всего интересного рассказать на лекциях, а лабораторками заниматься на семинарах. Но, видимо, надо им тоже уделять время лекций.
Да, у нас было по паре лекций в неделю. Приятно, что ребята увидели, что можно было рассказать ещё очень много всего. Ну что же — может быть, мы ещё встретимся в магистратуре.
Да, аудиторию с проектором я получил не сразу. С ним выходит гораздо нагляднее.
Да, тут проблема в том, что курса по Linux до этого не было. Надо будет скорректировать последовательность курсов.
Мне тоже :)
Отличная идея. В следующий раз сделаем.
Да, проблема с наглядными материалами была. Причём с видео на русском вообще проблема серьёзная. Его нет, а то, что есть, настолько чудовищно… И дикция куда хуже моей, и часто возникают ситуации, когда автор совершает ошибку, после чего в течении 10 минут её ищет и откатывается обратно… А на заднем фоне в это время играет «Владимирский централ» и фишки домино стучат. В общем, нужны очень крепкие нервы, чтобы это смотреть. А писать своё видео с нуля это весьма трудозатратно. Так что в результате я или использовал видео материалы Positive Technologies (очень люблю этих ребят!), или ставил английское видео и озвучивал его. В следующий раз нужно будет или записать самостоятельно, или хотя бы наложить свою озвучку. Но надо будет искать человека на это, поскольку моя дикция хромает. В общем, задача есть, сложная, но подъёмная.
Да, есть такое. Рад, что это заметил только один студент (ну или просто остальные избыточно вежливы). Буду стараться исправляться и использовать микрофон для усиления звука. Громко говорить две-три пары подряд просто горла не хватает — и так на работу потом приходил без голоса.
Увы, так со всей теорией. Но я надеюсь, что ребята запомнили основные мысли (см. выше). Ну и такие вещи умеют всплывать в памяти, если вы продолжаете ими заниматься.
Тут, видимо, имелось в виду, что не особо полезен для экзамена. Увы, теорию в экзамен положить не удалось. Буду думать, как лучше связать курс.
Да, проблема есть, и она очень серьёзная. У первого курса, который курирую по проектам микроэлектроники, всё ещё хуже. Ребята просто не умеют спрашивать (хотя тут есть интересное разделение по половому признаку — девушки охотнее задают вопросы). Постараюсь исправить большим количеством обратной связи — в том числе тестами, опросами и так далее. Убедить ребят задавать вопросы безумно сложно.
Так же многие студенты указали на то, что хотелось бы иметь больше времени на экзамен. Надо думать. ИМХО, 6-8 часов работать головой почти нереально — возможно, надо сокращать программу экзамена, чтобы лучше уложиться в 4-5 часов. Или действительно делать перерыв.
Ещё ребята писали, что была несовершенная система оценки уязвимостей — были небольшие награды за небольшие уязвимости, а за большие можно было получить сразу треть нужной награды. С одной стороны, большие уязвимости мной так и задумывались — их мало кто найдёт, но если уж найдёт — это вознаградится по полной. С другой стороны, явно было нужно больше маленьких уязвимостей. Есть над чем поработать.
В целом я доволен, хотя предстоит ещё много работы по доработке курса. Радует то, что теперь есть костяк, на который уже легче наращивать больше вкусного “мяса”. И хорошо, что первый блин — не комом. А дальше будет больше, интереснее и вкуснее!
Буду рад фидбеку от аудитории хабра. Прямо сейчас вы можете повлиять на будущее российского образования и на то, какие соискатели придут к вам через несколько лет.
P.S. Ищу сейчас хорошего QA-инженера в свою команду. Принимаю резюме с отчётами по данному приложению ;)
P.S.2. Вы можете позвать меня читать какой-то курс у вас. Но должно быть социально-полезно, интересно, или за деньги (лучше, конечно, все три). А то постоянно приходят предложения от всяких милых компаний — придумайте и прочитайте нам курс за несколько рублей, с вас все материалы, видео, методички, и курс остаётся в нашей собственности… Мне страшно думать, кто для них пишет материалы, и чему такие курсы обучают студентов.
Без этих людей такого экзамена не было бы. Так что благодарности:
Подготовка
Лекции
В течении семестра у меня было по две пары занятий в неделю для каждой группы, и в это время я постарался впихнуть максимум информации для расширения кругозора. На лекциях рассказывал разное:
- Про опасности интернета вещей;
- Историю борьбы 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 и замечательному преподавателю моей родной кафедры АСУ в РГУ нефти и газа имени Ивана Михайловича Губкина. Без него я бы ни за что не стал ни хорошим специалистом, ни преподавателем. Отдельное спасибо за разрешение использовать его методические материалы на своих занятиях. Спасибо ему за глубокие и современные знания, которые он даёт. Уже семь лет с момента моего выпуска ему икается, когда я в очередной раз вспоминаю с благодарностью его занятия. Могу только надеяться, что мне когда-нибудь будет икаться так же.
- Моей жене и детям. Жене — за то, что терпит мои ночные посиделки с подготовкой. Детям — за то что стимулируют меня к тому, чтобы ко времени их поступления в ВУЗ там были хорошие образовательные программы.
Ссылки
- Исходник приложения;
- Образ машины, готовой для тестирования. Развернуть крайне просто — стартуете машину и идёте на 80 порт. Логин и пароль для тестирования — «ivanov», «1». Прошу некоторое время оставаться на раздаче — раздаёт только мой сервер на Google Compute Engine, и поэтому выходит не слишком быстро. Приятно, что уже 11 человек скачали образ;
- Мои контактные данные на случай, если у нас нашлось что-то общее.