Stored Procedure Malevole: SQL Stored Procedures (T1505.001)

La tecnica T1505.001 descrive l'abuso di stored procedure SQL come meccanismo di persistenza all'interno di database server. Una stored procedure è un blocco di codice T-SQL o PL/SQL salvato lato server e richiamabile per nome, sia manualmente sia in risposta a eventi come l'avvio del servizio database. Un attaccante che ottiene privilegi sufficienti può creare o modificare procedure che eseguono codice arbitrario, mantenendo l'accesso attraverso reboot e cambi di credenziali.

La collocazione nella tattica TA0003 (Persistence) riflette proprio questa capacità di sopravvivere alle interruzioni. Su Microsoft SQL Server l'esecuzione di comandi OS avviene tipicamente tramite l'extended stored procedure xp_cmdshell, che va abilitata esplicitamente, oppure attraverso l'integrazione CLR (Common Language Runtime) che consente di caricare assembly .NET scritti in C# o VB.NET e collegarli a procedure eseguibili via SQL.

L'impatto operativo è significativo: la persistenza vive dentro il database, spesso fuori dallo scope dei tool EDR tradizionali, e sopravvive a reinstallazioni del sistema operativo se il database viene ripristinato da backup. I dati MITRE riportano 1 software documentato (Stuxnet, che ha utilizzato xp_cmdshell per eseguire codice SQL) e 1 campagna rilevante, il 2016 Ukraine Electric Power Attack condotto da Sandworm Team contro la rete elettrica ucraina, dove varie stored procedure MS-SQL sono state utilizzate come componente dell'operazione con Industroyer.

Un red team che voglia simulare T1505.001 in laboratorio deve partire da un presupposto: servono credenziali con ruolo sysadmin o quantomeno db_owner sul database target. L'accesso può derivare da SQL injection, credenziali riutilizzate estratte da file di configurazione, o account di servizio compromessi.

Su MSSQL Server, il primo passo tipico è verificare lo stato di xp_cmdshell interrogando sp_configure e, se disabilitato, riabilitarlo (richiede sysadmin). La sequenza operativa classica prevede prima EXEC sp_configure 'show advanced options', 1; RECONFIGURE; seguito dall'abilitazione della funzione e infine dall'esecuzione di comandi tramite EXEC xp_cmdshell 'whoami';. Per rendere l'accesso persistente si crea una stored procedure che incapsuli il comando e la si lega a un trigger di startup con sp_procoption, in modo che venga eseguita a ogni avvio del servizio SQL.

La via CLR è più stealth. Si compila un assembly .NET (ad esempio con csc.exe) che espone un metodo statico, si abilita clr enabled e, per assembly non firmati, clr strict security va aggirato marcando il database come TRUSTWORTHY o firmando l'assembly. L'assembly viene caricato con CREATE ASSEMBLY da un file o da un blob esadecimale inline, poi collegato a una stored procedure con CREATE PROCEDURE ... AS EXTERNAL NAME.

Sul fronte tooling, PowerUpSQL (open source, repository NetSPI su GitHub) è il framework di riferimento per l'enumerazione e l'exploitation MSSQL: espone cmdlet come Get-SQLServerInfo, Invoke-SQLOSCmd e Get-SQLStoredProcedureAutoExec. mssqlclient.py dello Impacket suite (open source) permette interazione da Linux con supporto a xp_cmdshell e autenticazione integrata Kerberos. Per la parte CLR, SharpSQLTools e SQLRecon (open source) automatizzano la generazione, il caricamento e l'esecuzione di assembly custom.

Su PostgreSQL un pattern analogo passa per CREATE FUNCTION ... LANGUAGE plpythonu o plperlu se le lingue untrusted sono installate, oppure tramite UDF caricate da libreria condivisa. Su MySQL/MariaDB l'equivalente è l'abuso di UDF caricate da .so o .dll copiate in plugin_dir.

In laboratorio, isolare sempre l'ambiente in una VM segregata, documentare ogni assembly caricato e prevedere script di cleanup che rimuovano procedure, assembly e riportino le opzioni server allo stato iniziale. Evitare di lasciare TRUSTWORTHY ON sui database di test connessi a domini reali.

Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?

Accedi alle lezioni gratuite e segui il percorso corretto fin dal primo passo

TEST GRATUITO
2 minuti · 7 domande Che professionista cyber sei? Scopri il profilo più vicino al tuo modo di pensare e inizia dal percorso giusto.