
Strumento di post-exploitation in C# per Microsoft SQL Server (MS SQL / MSSQL) che attraversa catene di server collegati di qualsiasi profondità con impersonificazione di login a cascata a ogni salto.
Atterra con eleganza nel tuo database Microsoft SQL Server (MS SQL) di destinazione, come se arrivassi su un volo business class con un calice di champagne in mano. 🥂

MSSQLand è uno strumento di post-sfruttamento per Microsoft SQL Server (MSSQL / MS SQL) scritto in C#, progettato per operatori red team. Progettato per essere eseguito direttamente nell'ambiente target tramite i tuoi beacon (ad esempio, usando execute-assembly in Cobalt Strike o Havoc o qualsiasi comando dotnet), ti consente di attraversare catene di server collegati, impersonare qualsiasi login incontrato lungo il percorso e uscire dall'ultimo hop con qualsiasi azione desiderata. Il tutto con un'impronta OPSEC minima e senza dipendenze esterne.
OPENQUERY / EXEC AT attraverso catene arbitrariamente profondeEXECUTE AS LOGIN ad ogni hop con impersonificazione a cascata multi-utentecm-* per ricognizione e sfruttamento dei database di Microsoft Configuration Manager[!TIP] MSSQLand è realizzato con
.NET Framework 4.8, pensato per l'esecuzione di assembly, utilizzando il contesto corrente. Se devi connetterti utilizzando hash NT/LM o un ticket Kerberos, vedi Pass-the-Hash.
[!NOTE] Non dimenticare le basi. Durante un assessment di sicurezza, a volte è più facile usare SQL Server Management Studio (SSMS).
MSSQLand.exe [options] <host> [options] <action> [action-options]
MSSQLand.exe <host> --probe
I flag globali (-c, -l, --debug, ecc.) sono accettati in qualsiasi posizione, anche dopo il nome dell'azione; i token non riconosciuti dopo l'azione vengono passati così come sono all'azione.
[!NOTE] Omettere
<action>esegue solo un test di connessione. Si autentica ed esce senza eseguire query. Ideale per la validazione delle credenziali con un'impronta OPSEC minima.
[!TIP] Evita di scrivere manualmente tutte le chiamate RPC Out o OPENQUERY. Lascia che lo strumento gestisca qualsiasi catena di server collegati con l'argomento
-l, così puoi concentrarti sul quadro generale.
Formato: server:port/user@database o qualsiasi combinazione server/user@database:port.
server (obbligatorio) - Il nome host o l'IP del SQL Server:port (opzionale) - Numero di porta (predefinito: 1433, anche comuni: 1434, 14333, 2433)/user (opzionale) - Utente da impersonare su questo server ("execute as login")
/user1/user2/user3 esegue EXECUTE AS LOGIN = 'user1'; EXECUTE AS LOGIN = 'user2'; EXECUTE AS LOGIN = 'user3';/user inserisce un nuovo contesto di impersonificazione nello stack di sicurezza@database (opzionale) - Contesto del database# Connectivity probe: checks if server is alive without authenticating
MSSQLand.exe localhost --probe
# Connection test only (no action executed, authenticates and exits)
MSSQLand.exe localhost -c token
# Execute specific action
MSSQLand.exe localhost -c token info
MSSQLand.exe localhost:1434@db03 -c token info
MSSQLand.exe LAB-SQL01@AdventureWorks -c token tables -n Customer
Collega più server SQL utilizzando il flag -l con punto e virgola (;) come separatore:
-l SQL01;SQL02/user;SQL03@database
Sintassi:
;) - Separa i server nella catena/) - Specifica l'utente da impersonare ("execute as login")
/user1/user2 esegue impersonificazioni sequenziali@) - Specifica il contesto del database[...]) - Usate per proteggere il nome del server dall'essere diviso dai nostri delimitatoriEsempi:
# Simple chain
-l SQL01;SQL02;SQL03
# With impersonation and databases
-l SQL01/admin;SQL02;SQL03/manager@clients
# Cascading impersonation (impersonate user1, then user2 on SQL01)
-l SQL01/user1/user2;SQL02;SQL03
# Mixed cascading (SQL01: user1→user2, SQL03: user3→user4→user5)
-l SQL01/user1/user2;SQL02;SQL03/user3/user4/user5@database
# Server names can contain hyphens, dots (no brackets needed)
-l SQL-01;SERVER.001;HOST.DOMAIN.COM
# Brackets only needed if server name contains delimiter characters
-l [SERVER;PROD];SQL02;[SQL03@clients]@clientdb
[!NOTE] La specifica della porta (
:port) si applica solo alla connessione host iniziale. Le catene di server collegati (-l) usano i nomi dei server collegati come configurati insys.servers, non combinazionihostname:port.
Queste modalità non richiedono autenticazione e funzionano prima di avere le credenziali.
Il servizio SQL Server Browser ascolta su UDP 1434 e risponde alle richieste di scoperta con l'elenco delle istanze di SQL Server in esecuzione su un host, inclusi nomi, versioni e porte TCP. È utile quando il target esegue istanze con nome su porte dinamiche, non è necessario indovinare o scansionare.
# Query the SQL Browser service on a specific host (UDP 1434)
MSSQLand.exe LAB-SQL03 --browse
Active Directory espone le registrazioni di SQL Server tramite Nomi Principal di Servizio (SPN) memorizzati su account computer e servizio. MSSQLand interroga AD tramite LDAP per gli SPN MSSQLSvc/* per enumerare le istanze di SQL Server nel dominio, o nell'intera foresta tramite il Catalogo Globale.
# Find SQL Servers in Active Directory via LDAP (current domain)
MSSQLand.exe --findsql
# Target a specific domain
MSSQLand.exe --findsql pgd.lab
# Forest-wide search via Global Catalog (port 3268)
MSSQLand.exe --findsql pgd.lab --gc
La scoperta è multilivello. Vedi FindSqlServers.cs per maggiori dettagli.
SQL Server Browser risponde anche a pacchetti broadcast UDP su UDP 1434, consentendo la scoperta di tutte le istanze di SQL Server che si pubblicizzano sulla sottorete locale.
# Broadcast discovery on the local network (UDP 1434)
MSSQLand.exe --broadcast
MSSQLand.exe --broadcast --timeout 5
[!TIP] Questo è particolarmente utile quando un SQL Server è in esecuzione su una macchina che non è unita al dominio e quindi non apparirà in nessuna query LDAP o SPN. Pensa a server standalone, macchine di sviluppo o istanze canaglia attivate su una VLAN interna.