Экзамен для будущих «русских хакеров» в Московском Политехе
Подготовка
Лекции
В течении семестра у меня было по две пары занятий в неделю для каждой группы, и в это время я постарался впихнуть максимум информации для расширения кругозора. На лекциях рассказывал разное:
- Про опасности интернета вещей;
- Историю борьбы 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). Он прошёл без всяких неожиданностей — всё работало, всё (что нужно) ломалось, все студенты, которые ходили на пары, сдали. Кто не ходили — увы. По-моему, так и должно быть.
Работа над ошибкамиПосле экзамена я запилил вот такой анонимный опросник — гугл формы просто божественны для быстрого сбора фидбека. Если интересно, можете прокликать — я специально экспортировал себе результаты опроса студентов и оставил форму открытой. Приятно было получить 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»;