May 8, 2024

First Blxxd: PowerShell over Detection

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

PowerShell Bandaging [exc3pti0n]

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

  • Журналы событий Windows, включая журналирование модулей
  • Журналы транскрипций
  • Файл истории команд PowerShell

Важными журналами событий Windows в контексте PowerShell являются Windows PowerShell/Operational и Windows PowerShell. В этих журналах отслеживается чуть ли не каждый ваш неаккуратный шаг, в особенности они реагируют на наиболее интересные строки, список которых можно посмотреть здесь: List of suspicious strings. Начиная с версии PowerShell v5, системой обеспечивается более внимательное журналирование, включая отслеживание загрузки и использования модулей PowerShell.

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

Файл истории команд по своей сути является подобием .bash_history в Linux-системах и содержит в себе историю введеных злоумышленником команд, что может быть крайне интересно для криминалиста. Работайте в интерактивной сессии пользователя, и все ваши команды отпечатаются здесь, так стоит следить за этим. Вдобавок полезно помнить, что он ведется, начиная с PowerShell v5, что может быть важным в контексте техники downgrade.


Tease: PowerShell Anti-forensics [exc3pti0n]

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

Maim: PowerShell Downgrade

Начиная с PowerShell v5, Windows усилили отслеживание взаимодействий с этим инструментом. И даже, несмотря на отключенную функцию отслеживания скрипт-блоков, пройтись незамеченным не удастся - так и так журналы Windows фиксируют подозрительные скрипты. Однако наиболее ценное журналирование не распространяется на PowerShell v2. Если он не отключен и/или не удален с системы, вы можете воспользоваться этим преимуществом.

Проверьте, возможно ли на системе жертвы взаимодействовать с PowerShell v2.
Для корпоративной версии, если Installed True:

Get-WindowsFeature -Name PowerShell-V2

Для домашней версии, если команда возвращает информацию о ключе:

Get-ItemProperty -Path 'HKLM:\Software\Microsoft\PowerShell\1'

Включите PowerShell v2, если это нужно, и вы имеете права администратора:

Enable-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2Root

Если PowerShell v2 доступен на системе, используйте технику Downgrading, чтобы минимизировать логирование ваших действий:

powershell -version 2 <command>

Однако атакующий не застрахован от обнаружения использования данной техники. Журналы Windows Powershell фиксируют используемую версию, и примеры данных записей приведены ниже:

HostVersion=5.1.22621.2506
HostId=6fa26269-[REDACTED]c411
HostApplication=C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe version 2

HostName=ConsoleHost
HostVersion=2.0
HostId=8dba9628[REDACTED]b31c
EngineVersion=2.0

Mutilation: PowerShell Transcription

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

Если вы имеете права администратора, отключите ведение журналов транскрипций:

Set-ItemProperty -Path 'HKLM:\Software\Policies\Microsoft\Windows\PowerShell\Transcription' -Name 'EnableTranscripting' -Value 0

И все же, если вы не имеете прав администратора, можно пойти другим путем: есть доля вероятности, что файлы транскрипции хранятся у пользователя, на системе которого вы орудуете. Если администратор не установил в групповых политиках папку для сохранения этих журналов и никак не защитил их, то он многое потерял. Воспользуйтесь этим. По умолчанию журналы сохраняются в `C:\Users\User\Documents и никак не защищены, так что вы можете подчистить их. Также, если они не лежат в папке по умолчанию, вы можете проверить их наличие на системе, используя следующую команду:

cd C:\ && dir "*transcript*.txt" /s /b

Putrefaction: PowerShell Command History

Если вы взаимодействуете с системой жертвы в интерактивной сессии, будьте готовы к тому, что ваши действия фиксируются историей команд. По умолчанию история комманд PowerShell ведется в файле C:\Users\User\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt, и содержит полезнейшую информацию для того, кто хочет понять, что вы делали, и хранения последних 4096 записей может оказаться достаточно. Хорошая новость для атакующего и плохая для криминалиста - файл никак не защищен, так что вы можете внести в него изменения или удалить вовсе, используя что-то наподобие cipher /w:C. Впрочем, существуют более безобидные методы, например, отключить его на время, и они описаны ниже.

Установка в параметр антисохранения введеных команд в текущем сеансе PowerShell:

Set-PSReadlineOption –HistorySaveStyle SaveNothing

Удаление модуля PsReadline из текущего сеанса PowerShell:

Remove-Module –Name PsReadline

Mockery: PowerShell Activity under Bypass [CyberRavenMan]

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


Chopping: LOLBAS

В первую очередь нужно позаботится об как можно более максимальном методе вызова самой оболочки PowerShell, так как почти все СЗИ очень пристально наблюдают за каждым вызовом PowerShell, в особенности за вызовом cmd.exe. Никогда не следует напрямую вызывать PowerShell, так как такой вызов будет пресечён либо в самом начале, либо сильно ускорит в дальнейшем расследование команды DFIR (стоит отметить, что как бы ни вызывался PowerShell, криминалист по итогу найдёт его вызов методом пристального анализа дампа ОЗУ, данная техника в первую очередь направлена на сокрытие вызова от автоматизированных решений, в которых работает бездушный алгоритм).

Ряд энтузиастов начали поддерживать проект LOLBAS. Данный проект - сборник всевозможного ПО, которое по умолчанию имеется в ОС класса Windows NT или же, с большей долей вероятности, будет присутствовать в операционной системе. Ни для кого не секрет, что системные программы обладают обширной функциональностью, которое, само собой, в рамках штатного функционирования системы работает исключительно в рамках легитимных целей. Однако функционал такого ПО злоумышленники используют себе во благо для скачивания полезной нагрузки на скомпрометированную систему, запуска вредоносного процесса от лица легитимного родительского процесса и так далее. Примеров можно найти множество. В данном подходе для СЗИ существуют уже "заезженные" техники вызова нужного нам вредоносного процесса, однако энтузиасты находят новые способы, которые дают возможность выполнять нужные действия злоумышленнику.

Так, в качестве примера, можем вызвать calc.exe через PowerShell, который, в свою очередь, будет вызываться одним из ПО, относящимся к LOLBAS, а именно rundll32.exe. Согласно следующей информации мы можем вызывать что угодно через advpack.dll - динамическую библиотека, которая является модулем установщика пакетов Advance INF. Так, мы можем вызвать PowerShell следующим способом:

rundll32.exe advpack.dll,RegisterOCX "powershell -ep -c calc.exe"

По наблюдениям и личным исследованиям, метод работает потому, что в функционале экспортируемой функции RegisterOCX, опираясь на содержимое advpack.dll, происходит разрешение функции RegisterOCXW, которая добавляет в адресное пространство powershell.exe и непосредственное выполнение самой команды. Однако можно вызвать RegisterOCX и по её порядковому номеру, передав в качестве экспортируемой функции её номер - в данном случае, это #12. Эквивалентный вид команды примет следующий вид:

rundll32.exe advpack.dll,#12 "powershell -ep -c calc.exe"

Это частый подход вызова экспортируемых функций через rundll32.exe, однако стоит отметить, что данный номер может быть как положительным, так и отрицательным, и приводится из строкового типа данных в число с помощью API функции Windows - wtoi(). Так можно поиграться с особенностями представления знаковых чисел в памяти, и тем самым стать ещё более незаметным. Таким образом, происходит запуск переданной вредоносной нагрузки, и мы бы точно обошли AppLock, если бы был запрет на запуск PowerShell напрямую. Если поискать на системе интересные файлы, то можно самостоятельно найти множество интересных возможностей для выполнения нужных действий.

Skirr: Obfuscation

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

  • Запись командлет буквами разного регистра: Get-Help -> gEt-HeLP
  • Раздедение слов на конкатенированные между собой буквы или фразы: Get-Help -> &("Get-"+"Help")
  • Разделение слов с помощью апострофа: Get-Help -> G`et-`H`e`l`p
  • Использование слов, минимально указывающих на выполнение вредоносного кода, включая присваивание переменным более рандомизированных названий, например, $owirghiwrehg
  • Запутывание сути выполнения команды, например:
    Get-Help -> ls > $nULl;$ejfhwei="Get-";$lfknvrkg="HeLp";&($ejfhwei+$lfknvrkg))
  • Использование различных кодировок. При этом важно заметить, что в данном случае придётся иметь дело с вызовом статических методов из .NET, в котором формат вызова из-под PowerShell являет собой [Namespace.Class]::Method(). Так, если под Namespace подразумевается System, то можно, и даже нужно его не указывать, так как данное пространство имён предусматривается по умолчанию. Так, примером выполнения данной техники будет Get-Help, который превратится в следующее:
&("{1}{0}"-f"x","Ie")([tEXt.EnCoDiNg]::uNICoDE.GetString([cOnVeRt]::("{0}{3}{1}{2}"-f"","aSe64StRiNg","","fRoMb")('RwBFAFQALQBIAGUATABwAA==')))

Wipe off the blxxd

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

Создано @exc3pt10n совместно с @CyberRavenMan.