Сдать OSCE: вызов принят
Что бы вы ответили на такое предложение? Есть тема, которую большинство ИБ-шников обходят стороной, называется «бинарная эксплуатация». Для начала нужно решить тестовое задание: всего-то отреверсить ассемблерный код и сгенерировать ключ. Потом надо выполнить 8 модулей лабораторных работ на стенде 2000-ыx годов за 60 дней. Дальше готовиться можно по книге, но она поможет разобраться в теме лишь процентов на 20. Потом будет истощающий силы экзамен из четырёх задач на 48 часов, и сразу после него дадут 24 часа на подготовку отчёта на английском языке. И всё это удовольствие стоит 1800$.
Я сказал: «Дайте два!»
Итак, дальше я расскажу, как готовился и сдавал увлекательный экзамен на международный сертификат в области тестирования на проникновение Offensive Security Certified Expert, или сокращённо OSCE, от Offensive Security.
У этой организации есть ещё несколько сертификаций, но Expert предполагает подтверждение экспертных знаний сразу в нескольких областях: атаки на веб-приложения, атаки на сетевом уровне, фаззинг и разработка эксплойтов под Windows x86. Несмотря на то, что курс часто критикуют за устаревший подход, азы эксплуатации не изменились, и в итоге можно многому научиться:
- находить и эксплуатировать веб-уязвимости, например, XSS или Path Traversal, с развитием до полной компрометации операционной системы;
- проводить сетевые атаки GRE Sniffing, SNMP, обходить Access Lists, используя Spoofed SNMP Requests;
- находить с помощью фаззинга места переполнения (buffer overflow) и использовать их для входа в программу, обходить механизмы защиты (stack overflow, bypassing ASLR, egghunter, bad characters и т. п.), а также обходить статические механизмы защиты антивируса.
Что за зверь OSCE: разбираем на примере
Чтобы не перегружать статью техническими терминами и аббревиатурами, приведу типовой пример. Представьте, что у вас есть программное обеспечение (ПО), принимающее данные по TCP, и вам нужно провести эксплуатацию на удалённом сервере, где развернуто это ПО, чтобы получить возможность выполнять команды на уровне операционной системы.
Решение
- Сначала разбираем протокол на сетевом уровне: необходимо проанализировать его составляющие и выделить все места, которые имеет смысл модифицировать. Потом пишем фаззер, который будет подставлять различные значения во все эти места и пытаться выслать их серверу.
- Спустя время определённый строковый буфер с определёнными символом и (или) длиной вызовет stack overflow, а это нарушит работу программы и приведёт к её критическому завершению.
- Дальше с помощью этого буфера следует разместить payload (полезную нагрузку) в виде ассемблерных команд в бинарном виде, но не просто разместить команды в стеке, а перехватить управление регистром EIP. Для этого можно либо просто найти корректное смешение в буфере, либо попытаться вызвать исключение SEH.
- После перехвата управление EIP необходимо передать на последовательность своих команд. Сложность тут в том, что данные в памяти располагаются каждый раз по новому адресу. Поэтому следует найти в оперативной памяти такой участок статичного адреса, который будет ссылаться на регистр, а тот в свою очередь — на адрес в памяти (с возможностью записи и выполнения), где можно будет также расположить свои данные.
Кажется, что осталось только разметить шелл-код, и всё очень просто. Но бывает так, что сначала нужно обойти механизм ASLR, если в памяти не удаётся найти статичный адрес, либо оказывается, что буфер в памяти ограничен алфавитом (разрешёнными символами), тогда необходимо собрать все допустимые символы и из них выстроить цепочку альтернативных команд. А если буфер ограничен длиной, то надо найти другое место в памяти программы, где дополнительно можно разместить данные, найти их в памяти и сделать переход на них (техника egghunter) или вообще написать свой шелл-код, который выполнит то, что вы хотите, в представленных ограничениях.
Также бывает, что эти дополнительно размещённые данные частично повреждаются, поэтому следует оценить повреждения и придумать, как обойти это ограничение. Например, убрать badchars, разбить свой шелл-код на цепочку и сделать цепочку вызовов. Всё это усложняется тем, что отладчик (ваш основной инструмент) может некорректно работать с выделением памяти и неправильно отображать данные в памяти во время отладки — Bingo!
По сути, бинарная эксплуатация, да и пентест в целом — это игра с обходом кучи ограничений, использование различных методик и применение смекалки. Решение подобной задачи может занять от 6 часов до бесконечности, поэтому 48 часов на 4 задачи не кажутся мне избыточными.
Как я сдавал экзамен
Мне удалось сдать OSCE со второй попытки. В первый раз — это было в июне — у меня не получилось нормально подготовиться к экзамену из-за загруженности на проектах, но как «настоящий пентестер» я решил сделать всё «на лету». В итоге за 48 часов, 10 из которых ушло на сон, решил только 1,5 задачки.
В сентябре я принял волевое решение качественно со всем разобраться: изучить побольше тем, в том числе связанных с эксплуатацией (а это оказалась бесконечная дыра), проделать все лабораторные, пообщаться с другими экспертами, обдумать задачи с первой попытки сдать экзамен, подготовить различные скрипты для автоматизации.
В итоге вторая попытка была в ноябре: за 12 часов экзамена я выпил 7 стаканов чая, пару таблеток от головной боли, вкусно поужинал, прогулялся во дворе — и все 4 задания были решены. Благо, они были похожи на те, что мне попались при первой попытке. После приятного сна ещё часов 5 ушло на формирование отчёта, а спустя сутки мне сказали, что экзамен успешно сдан и можно просить повышение зарплаты у руководства.
Обновление правил сертификации
В октябре 2020 года Offensive Security заявила, что планирует обновить курс OSCE. Уже сейчас эту сертификацию нельзя оплатить, а статус OSCE по новым правилам можно будет получить только по результатам сдачи трёх экзаменов:
- Advanced Web Attacks and Exploitation (AWAE)
- Evasion Techniques and Breaching Defenses (PEN-300)
- Windows User Mode Exploit Development (WUMED) — будет анонсирован в 2021
Выходит, что я зря старался и теперь имею устаревший сертификат? А вот и нет, компания придерживается позиции «Anyone who has earned an OSCE will always retain it», что означает «Любой, кто получил OSCE, сохранит его навсегда». Наверное, многие за это и выбирают Offensive Security. Да, дорого, да, методички слабые, да, экзамен изматывает и содержит много подводных камней, но хоть раз что-то сдав, ты несёшь этот титул до конца своих дней! В отличие от кучи других сертификаций, где каждые 2–3 года придётся и дальше платить деньги за продление и новые экзамены.
FAQ
Что в итоге мне дала сертификация?
- Самое главное — я вышел из зоны комфорта и глубже познакомился с базой по бинарной эксплуатации. Даже мой опыт вирусного аналитика и сдача OSCP не дали такого толчка, позволяющего чувствовать себя комфортно при изучении очередного эксплойта.
- Теперь не боюсь термина «шелл-код» и понимаю множество нюансов.
- Научился самостоятельно эксплойтить, конечно, на уровне обхода средств защиты 2010-ых годов, но это только первый шаг.
- «Я эксперт, а чего добился ты?»
Что дальше?
- Вместе с командой буду использовать полученные знания на проектах по тестированию на проникновение: модификация эксплойтов, обход средств защиты.
- Продолжу изучать уже актуальные техники.
- Углублюсь в архитектуру операционных систем.
- Буду получать новые полезные и красивые «бумажки».
Стал бы я сдавать экзамен за свой счёт?
Наша компания уделяет большое внимание развитию hard и soft скиллов команды, поэтому мне удалось пройти сертификацию за счёт работодателя. В противном случае, пожалуй, я бы решился на такой челлендж только ради самого сертификата. Для получения только знаний (и экономии личных финансов) разумнее было бы изучить утёкшие материалы и блоги других пентестеров на medium.com, воссоздать и пройти стенд, а также обратить внимание на другие курсы, например, SLAE.
Буду ли я дальше сдавать экзамены Offensive Security?
Конечно, меня в целом устраивает подход «try harder», и интересны их новые курсы, а всё остальное можно пережить.
P.S. Спасибо коллегам и моей девушке, которые поддерживали меня!