PowerShell Policy Bypass Yöntemleri

Herkese selamlar, yoğun iş günlerinden sonra kendime boş bir vakit yaratıp kısa ama öz bir yazı yazmak istedim.

Bu yazımda Powershell Policy’leri dilim döndükçe anlatıp, bunları nasıl bypasslayabiliriz ona değineceğim.

PowerShell execution policy’leri, PowerShell scriptlerinin nasıl ve ne zaman çalıştırılabileceğini belirleyen güvenlik ayarlarıdır. Bu policy’ler, sistem yöneticilerinin PowerShell scriptlerinin çalıştırılmasını kontrol etmelerine ve kötü niyetli veya yetkisiz scriptlerin çalışmasını engellemelerine yardımcı olmaktadır. Bu policyler nelerdir onlara bakalım:

Restricted
Varsayılan olarak ayarlanmış olan bu policy, hiçbir PowerShell scriptinin çalıştırılmasına izin vermez. Yalnızca etkileşimli PowerShell komutlarını çalıştırabilirsiniz. En yüksek güvenlik seviyesini sağlar. Script çalıştırılmasını tamamen engeller.

AllSigned
Sadece dijital olarak imzalanmış scriptlerin çalıştırılmasına izin verir. Her çalıştırma öncesi scriptin kaynağı doğrulanır. Tüm scriptlerin güvenilir bir kaynaktan olduğunu ve değiştirilmediğini garanti eder. Yüksek güvenlik gereksinimi olan ortamlarda kullanılır.

RemoteSigned
Yerel olarak oluşturulmuş scriptler imza gerektirmez, ancak internetten veya ağ üzerinden indirilen scriptlerin dijital olarak imzalanmış olması gerekir.Hem güvenlik hem de kullanım kolaylığı sağlar. Yerel geliştirme ve güvenli kaynaklardan indirme işlemleri için uygundur.

Unrestricted
Tüm scriptlerin çalıştırılmasına izin verir, ancak internetten indirilen scriptler çalıştırılmadan önce kullanıcıya uyarı verir. Kullanım kolaylığı sağlar ancak güvenlik riskleri taşır. Eğitim ve geliştirme ortamları için uygundur.

Bypass
Tüm execution policy kontrollerini devre dışı bırakır. Hiçbir uyarı veya kısıtlama olmadan tüm scriptler çalıştırılabilir.Otomasyon ve script test etme gibi durumlar için uygundur. Ancak, güvenlik açısından en riskli policy’dir.

Default
PowerShell 7 ve sonrasında kullanılan bu policy, Windows PowerShell’de “Restricted”, diğer platformlarda ise “RemoteSigned” olarak ayarlanmıştır. Varsayılan güvenlik ayarı olarak kullanılır.

Aktif olarak çalıştığınız PowerShell’de hangi Policy’e sahipsiniz öğrenmek isterseniz aşağıdaki PowerShell komutunu kullanabilirsiniz.

Get-ExecutionPolicy -List

Şimdi bu çıktıdaki kavramlara hızlıca bir değinelim.

MachinePolicy: Undefined
Grup politikaları (Group Policy) aracılığıyla ayarlanmış bir execution policy yok. Sistem yöneticisi tarafından merkezi olarak belirlenen bir execution policy olmadığı anlamına gelir.

UserPolicy: Undefined
Kullanıcı bazında grup politikaları (Group Policy) aracılığıyla ayarlanmış bir execution policy yok. Belirli bir kullanıcı için merkezi olarak belirlenmiş bir execution policy olmadığı anlamına gelir.

Process: Undefined
Geçerli PowerShell oturumu için belirlenmiş bir execution policy yok. Mevcut oturum kapatıldığında geçerli olan herhangi bir policy ayarı yoktur. Bu oturumda policy’yi geçici olarak değiştirmediğiniz sürece diğer kapsamlar geçerli olacaktır.

CurrentUser: Undefined
Geçerli kullanıcı için belirlenmiş bir execution policy yok. Kullanıcı özelinde belirlenmiş bir policy yoktur, dolayısıyla bu kullanıcının LocalMachine seviyesindeki policy’ye tabi olduğunu gösterir.

LocalMachine: AllSigned
Tüm kullanıcılar için geçerli olan execution policy, AllSigned olarak ayarlanmış. Bu policy, tüm PowerShell scriptlerinin dijital olarak imzalanmış olmasını gerektirir. İmzalanmamış scriptler çalıştırılamaz ve bu policy, sistem güvenliğini artırmak için kullanılır.

Şimdi asıl konumuza gelelim. Bunları neden anlattım derseniz bir PenTest veya bir Red Team çalışmasında bu Policy’lere takılma durumunuz olabilir. Şimdi şöyle bir senaryo düşünün. Sızdınız makineye fakat bir PowerShell betiği çalıştırmak istediğinizde aşağıdaki ekran görüntüsünde gördüğünüz gibi bir hata ile karşılaşırsınız.

Örneğin bu script PowerShell ile yazılmış meterpreter oturum elde etmemizi salayan bir scripttir. Script’i incelemek isterseniz linki bırakıyorum. Burada herkesin aklına aşağıdaki komut gelecektir.

powershell.exe -ExecutionPolicy bypass

Evet bu komut aktif olan PowerShell oturumunuzu bypass Policy’e çevirir fakat senaryo her zaman öyle ilerlemeyebiliyor. Sistem yöneticileri tarafından buna izin verilmeyebilir. İşte asıl konumuz olan bu policy’i bypasslama kısmımız devreye giriyor.

Eğer script’inizi bir değişkene atayıp, sonrasında Invoke-Expression cmdlet’ine string olarak verdiğinizde bu string’in yürültüğünü yani scriptin çalıştığını görürsünüz.

$scriptContent = Get-Content -Path "C:\path\path\Desktop\ShadowInjector.ps1" -Raw
Invoke-Expression $scriptContent

Daha demin bizi engelleyen Policy bu sefer bizi engellemedi.

Bir başka yöntemle ise IEX WebClient kullanarak script içeriğini çalıştırmayı deneyeceğiz.

IEX (New-Object Net.WebClient).DownloadString('file:///C:/path/path/Desktop/ShadowInjector.ps1')

Bir başka yöntem ise PowerShell komutlarını başka bir dil içerisinden tetiklemek. Mesela python. Powershell üzerinden python’ı çalıştırıyoruz.

import subprocess
subprocess.run(["powershell", "-Command", "Invoke-Expression -Command (Get-Content -Path 'C:\\path\\path\\Desktop\\ShadowInjector.ps1' -Raw)"])

Bu ve benzeri yöntemlerle karşılaşmış olduğunuz Policy’leri bypasslayabilirsiniz. Kafanıza takılan bir yer olur ise sorabilirsiniz.

Bir sonraki yazımda görüşmek üzere, güvenli günler dilerim.

Leave a Reply

Your email address will not be published. Required fields are marked *