SQLRecon 是一个 Microsoft SQL Server 工具包,专为进攻性侦察和后渗透而设计。有关如何使用每种技术的详细信息,请参阅 wiki。
你可以从 releases 页面下载 SQLRecon 的副本。或者,你也可以自行编译解决方案。这应该很简单:克隆仓库、双击解决方案文件并构建即可。
预防、检测和缓解指南也已为各位防御者提供。
查看我在 IBM Security Intelligence 网站上发表的博客文章。如果你更喜欢视频,可以观看我在 Black Hat 上的演讲。
枚举模块无需提供身份验证提供程序。这些模块必须传入枚举模块标志(/e:, /enum:)。wiki 中有关于使用枚举模块的详细信息。```
Info - Show information about the SQL server.
/h:, /host -> SQL server hostname or IP. Multiple hosts supported.
/port: -> (OPTIONAL) Defaults to 1434 (UDP).
/t:, timeout: -> (OPTIONAL) Defaults to 3s.
SqlSpns - Use the current user token to enumerate the AD domain for MSSQL SPNs. /d:, /domain: -> (OPTIONAL) NETBIOS name or FQDN of domain.
# Authentication Providers
SQLRecon 支持多种身份验证提供程序(`/a:, /auth:`),以便与 Microsoft SQL Server 进行交互。```
WinToken - Use the current users token to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP
WinDomain - Use AD credentials to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/d:, /domain: -> NETBIOS name or FQDN of domain.
/u:, /username: -> Username for domain user.
/p:, /password: -> Password for domain user.
Local - Use local SQL credentials to authenticate against the SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/u:, /username: -> Username for local SQL user.
/p:, /password: -> Password for local SQL user.
EntraID - Use Azure EntraID credentials to authenticate against the Azure SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/d:, /domain: -> FQDN of domain (DOMAIN.COM).
/u:, /username: -> Username for domain user.
/p:, /password: -> Password for domain user.
AzureLocal - Use local SQL credentials to authenticate against the Azure SQL database
/h:, /host: -> SQL server hostname or IP. Multiple hosts supported.
/u:, /username: -> Username for local SQL user.
/p:, /password: -> Password for local SQL user.
/h:, host:)为必填项,允许指定一个或多个 SQL 服务器。如果要对多个 SQL 服务器执行模块,请用逗号分隔主机,例如 /h:SQL01,10.10.10.2,SQL03。master 数据库,但也可以通过数据库(/database:)标志提供自定义数据库名称来更改。/debug 标志是可选的,用于显示模块将要执行的所有 SQL 查询,但不会在远程主机上实际执行它们。相关示例可在wiki中找到。1433 连接数据库,但也可以通过 /port: 标志更改。3 秒,但也可以通过提供超时值(/t:, /timeout:)来更改,该值表示终止连接尝试前的秒数。/v, /verbose 标志是可选的,用于在远程主机上执行模块之前显示所有将要执行的 SQL 查询。相关示例可在wiki中找到。请注意,EntraID 身份验证提供程序要求在运行 SQLRecon 的系统上存在 Azure Active Directory 身份验证库(ADAL)或 Microsoft 身份验证库(MSAL)。这是用于 Azure EntraID 身份验证和授权功能。
SQL 模块针对一个或多个 Microsoft SQL Server 实例执行。这些模块必须通过模块标志(/m:, /module:)传入。
主机标志(/h:, host:)为必填项,允许指定一个或多个 SQL 服务器。如果要对多个 SQL 服务器执行模块,请用逗号分隔主机,例如 /h:SQL01,10.10.10.2,SQL03。
wiki 提供了关于每个支持在一个或多个 SQL Server 实例上执行的模块的使用详情。
模拟模块在模拟 SQL 用户的上下文下,对 Microsoft SQL Server 的一个或多个实例执行。所有模拟模块都有以下最低要求:
/i:, /iuser:)。/m:, /module:)。wiki 提供了关于每个支持使用 Impersonation 执行的模块的使用详情。
链接模块在一个或多个链接的 Microsoft SQL Server 实例上执行。所有链接模块都有以下最低要求:
/l:, /link:)。链接标志允许指定一个或多个链接的 SQL 服务器。例如,如果 SQL01 链接到 SQL02,且 SQL01 链接到 DB04,可以用逗号分隔链接的主机,模块将在每个链接的 SQL 服务器上执行,例如 /l:SQL02,DB04。/m:, /module:)。wiki 提供了关于每个支持在一个或多个 Linked SQL Server 实例上执行的模块的使用详情。
链接链模块在链接服务器链中的最终 Microsoft SQL Server 上执行。所有链接链模块都有以下最低要求:
/l:, /link: 标志中指定链接的 SQL 服务器链。如果 SQL01 链接到 SQL02,SQL02 链接到 PAYMENTS01,并且你想在 PAYMENTS01 上执行模块,则参数应为 /l:SQL02,PAYMENTS01。/chain 标志,以对所提供的链接链中的最终 SQL 服务器执行模块。/m:, /module:)。wiki 提供了关于每个支持在 Linked SQL Server Chain 中提供的最终 SQL 服务器上执行的模块的使用详情。
SQLRecon 提供了多个模块,可帮助枚举和攻击 Microsoft System Center Configuration Manager (SCCM) 和 Microsoft Endpoint Configuration Manager (ECM)。SCCM 或 ECM 服务器需要在本机或远程暴露 Microsoft SQL 数据库。
SCCM 模块必须通过 SCCM 模块标志(/s:, /sccm:)传入。
大多数 SCCM 模块可以在模拟 SQL 用户(/i:, /iuser:)的上下文下执行。
wiki 提供了关于针对 SCCM/ECM database 使用每个模块的详细信息。
Users 模块列出 RBAC_Admins 表中的所有用户。这些用户都被配置为对 SCCM 具有一定级别的访问权限。Sites 模块列出存储在 SCCM 数据库 DPInfo 表中的其他所有站点。由于不同站点可能以不同(不安全)方式配置,这可以提供额外的攻击途径。Logons 模块查询 Computer_System_DATA 表,以检索所有关联的 SCCM 客户端以及最后登录的用户。注意:默认情况下,此信息每周只更新一次,不会 100% 保持最新。可使用 /option: 作为可选(非必需)参数来筛选 SCCM 客户端。TaskList 模块提供存储在 SCCM 数据库中的所有任务序列的列表,但不访问实际的任务数据内容。TaskData 模块恢复存储在 SCCM 数据库中的所有任务序列并将其解密为明文。任务序列可能包含将系统加入域、映射共享、运行命令等的凭据。Credentials 模块列出由 SCCM 保管用于各种功能的凭据。由于密钥存储在 SCCM 服务器上,这些凭据无法远程解密。不过,该模块提供情报,帮助判断尝试获取该密钥是否有意义。DecryptCredentials 模块尝试解密恢复的 SCCM 凭据 Blob。该模块必须在 SCCM 服务器上的高完整性或 SYSTEM 进程中运行。AddAdmin 模块将指定帐户提升为 SCCM 中的 'Full Administrator'。如果目标用户已经是 SCCM 用户,该模块将添加必要的权限以进行提升。提供两个参数:如果要添加当前正在执行 SQLRecon 进程的用户为 SCCM 中的 'Full Administrator',则使用 。如果要添加其他用户为 SCCM 中的 'Full Administrator',请指定其域用户名和完整 SID 。该模块需要 sysadmin 或类似权限,因为需要写入 SCCM 数据库表。如果你有兴趣扩展 SQLRecon,请参阅 wiki 中的贡献与扩展部分。
如果你有任何建议或想法,欢迎提出 issue。
目标是持续改进 SQLRecon。以下是一些计划中的研究领域:
以下人员直接或间接地为 SQLRecon 的各个方面做出了贡献。
whoami 模块中增加了用户有权访问的数据库(JBalanza)。adsi 模块中的一个问题:LDAP 服务器不需要添加到 msdb 数据库中,同时现在会正确删除所创建的函数。SQL01 链接到 SQL02,SQL02 链接到 SQL03,且 SQL03 链接到 PAYMENTS01,现在可以使用链接服务器链(/link:SQL02,SQL03,PAYMENTS01 /chain)从 SQL01 在 PAYMENTS01 上执行命令。感谢 Azaël Martin (n3rada)。l' 和 'i' 模块,并引入了上下文逻辑,使模块名称在标准、模拟、链接和链式执行中保持一致。/debug)的支持,将显示各种调试信息以及模块将要执行的所有 SQL 查询,但不会实际执行它们。/verbose, /v),将显示模块执行期间将要执行的所有 SQL 查询。/host 或 /h 标志中提供的多个 SQL 服务器执行。/link 或 /l 标志中提供的多个链接 SQL 服务器执行。/lhost 更改为 /link。s' 模块,并为 SCCM 模块创建了 /s、/sccm 开关。DecryptCredentials 除外。info 的新枚举(/enum)模块,能够使用未认证上下文通过 UDP 协议获取 SQL Server 信息,包括实例名称和 TCP 端口。ModuleHandler.cs 中的各个方法中,以促进简化和可扩展性。Queries.cs。adsi 执行未删除 LDAP 服务器的 bug。adsi 中移除了代理作业执行,改用 openquery/rpc。adsi 模块中将 /lhost 更改为 /adsi。smb 模块中将 /rhost 更改为 /unc。CaptureHash.cs 并简化了逻辑。SetEnumerationType.cs 并简化了逻辑。Impersonation.cs 重命名为 Impersonate.cs。OleCmdExec.cs 重命名为 OleAutomation.cs。smb 模块增加了模拟支持。info 模块增加了模拟支持。info 模块增加了链接支持。rows、iRows 和 lRows 模块。sLogons,增加了可选筛选器。xp_cmdshell 模块未将命令输出打印到控制台的 bug。SetEnumerationType.cs。domain 更改为 SqlSpns。ExecuteImpersonationQuery 和 ExecuteImpersonationCustomQuery。Impersonate.cs。checkRpc 模块。iCheckRpc 模块。lCheckRpc 模块。EnableDisable.cs 重命名为 ConfigureOptions.cs。ExecuteLinkedCustomQueryRpcExec 的地方实现了 RPC 错误检查。 PrintUtils.cs,其中实现了一个用于标准化输出的打印类。TablePrinter 从 Help.cs 移动到 PrintUtils.cs。PrintUtils 类标准化了所有控制台输出的打印格式。querysearchtableslColumnslQuerylSearchlTablesiColumnsiQueryAzure 身份验证更改为 AzureAD。AzureLocal 身份验证。disableRpc 模块。enableRpc 模块。iEnableRpc 模块。iDisableRpc 模块。lEnableRpc 模块。lDisbleRpc 模块。lAgentCmd 的错误。SqlCommand.ExecuteNonQuery,修复了 clr、iClr 和 lClr 的稳定性问题。lClr 未删除已创建程序集或存储过程的错误。columns 模块。iColumns 模块。iDatabases 模块。iSearch 模块。iTables 模块。lColumns 模块。lSearch 模块。ExecuteLinkedCustomQueryRpcExec 提供的输出。x。Random.cs 移动到 utilities 目录中。Windows 身份验证更改为 WinToken。WinDomain 身份验证,它通过模拟使用 AD 域用户名和密码进行身份验证。请参阅 Impersonation.cs。ArgumentLogic.cs, SQLAuthentication.cs 和 ModuleHandler.cs 中的参数解析和处理。ModuleHandler.cs 不再使用庞大的 if/else if/else 语句来执行模块,而是改用反射来调用与命令模块名称匹配的方法。commands 目录,其中包含在整个程序中使用的全局变量。SQLAuthentication.cs 中。Program.cs 移至 ArgumentLogic.cs。authentication 目录。sccm 命令执行的 SCCM 模块。roles、iRoles 和 lRoles 模块中查询的角色。users、iUsers 和 lUsers 模块。clr 和 iClr 模块中哈希未从 sp_drop_trusted_assembly 中移除的问题。lAgentCmd 模块。lClr 模块。info 模块。Local 和 Azure 身份验证的强制参数问题。-e domain)。Windows 和 Local 身份验证模式中添加了 -r 标志,以便可以提供非标准 TCP 端口。TestAuthentication.cs 中移除了 Environment.Exit。AgentJobs.cs。agentStatus。iAgentStatus。lAgentStatus。agentCmd。iAgentCmd。clr。iEnableClr。iDisbleClr。iClr。iWhoami。iMapped。iRoles。lEnableRpc。lDisableRpc。lWhoai。lEnableXp。lDisableXp。lEnableOle。lDisableOle。lSmb 模块。lWhoami 模块。lRoles 模块。oldCmd 模块。iOleCmd 模块。lDatabases 模块。lTables 模块。| 模块名称 | 描述 | 模拟 | 链接执行 | 链接链执行 | 需要特权上下文 |
|---|
CheckRpc | 获取链接服务器列表及其 RPC 状态。 | ✅ | ✅ | ✅ | ❎ |
Databases | 显示所有数据库。 | ✅ | ✅ | ✅ | ❎ |
Impersonate | 枚举可以被模拟的用户帐户。 | ✅ | ✅ | ✅ | ❎ |
Info | 显示有关 SQL 服务器的信息。 | ✅ | ✅ | ✅ | ❎ |
Links | 枚举链接的 SQL 服务器。 | ✅ | ✅ | ✅ | ❎ |
Users | 显示哪些用户帐户和组可以针对数据库进行身份验证。 | ✅ | ✅ | ✅ | ❎ |
Whoami | 显示你的权限。 | ✅ | ✅ | ✅ | ❎ |
Query /c:QUERY | 执行 SQL 查询。 | ✅ | ✅ | ✅ | ❎ |
Smb /unc:UNC_PATH | 捕获 NetNTLMv2 哈希。 | ✅ | ✅ | ✅ | ❎ |
Columns /db:DATABASE /table:TABLE | 显示所提供数据库和表中的所有列。 | ✅ | ✅ | ✅ | ❎ |
Rows /db:DATABASE /table:TABLE | 显示所提供数据库表中的行数。 | ✅ | ✅ | ✅ | ❎ |
Search /keyword:KEYWORD | 在你所连接的数据库的指定表中搜索列名。 | ✅ | ✅ | ✅ | ❎ |
Tables /db:DATABASE | 显示所提供数据库中的所有表。 | ✅ | ✅ | ✅ | ❎ |
EnableRpc /rhost:LINKED_HOST | 在链接服务器上启用 RPC 和 RPC Out。 | ✅ | ❌ | ❌ | ✔️ |
EnableClr | 启用 CLR 集成。 | ✅ | ✅ | ✅ | ✔️ |
EnableOle | 启用 OLE 自动化过程。 | ✅ | ✅ | ✅ | ✔️ |
EnableXp | 启用 xp_cmdshell。 | ✅ | ✅ | ✅ | ✔️ |
DisableRpc /rhost:LINKED_HOST | 在链接服务器上禁用 RPC 和 RPC Out。 | ✅ | ❌ | ❌ | ✔️ |
DisableClr | 禁用 CLR 集成。 | ✅ | ✅ | ✅ | ✔️ |
DisableOle | 禁用 OLE 自动化过程。 | ✅ | ✅ | ✅ | ✔️ |
DisableXp | 禁用 xp_cmdshell。 | ✅ | ✅ | ✅ | ✔️ |
AgentStatus | 显示 SQL 代理是否正在运行并获取代理作业。 | ✅ | ✅ | ✅ | ✔️ |
AgentCmd /c:COMMAND | 使用代理作业执行系统命令。 | ✅ | ✅ | ✅ | ✔️ |
Adsi /adsi:SERVER_NAME /lport:LOCAL_PORT | 从链接的 ADSI 服务器获取明文 ADSI 凭据。 | ✅ | ✅ | ✅ | ✔️ |
Clr /dll:DLL /function:FUNCTION | 在自定义存储过程中加载并执行 .NET 程序集。 | ✅ | ✅ | ✅ | ✔️ |
OleCmd /c:COMMAND /subsystem:(OPTIONAL) | 使用 OLE 自动化过程执行系统命令。 | ✅ | ✅ | ✅ | ✔️ |
XpCmd /c:COMMAND | 使用 xp_cmdshell 执行系统命令。 | ✅ | ✅ | ✅ | ✔️ |
| 模块名称 | 描述 | 模拟 | 需要特权上下文 |
|---|
Users | 显示所有 SCCM 用户。 | ✅ | ❎ |
Sites | 显示存储了数据的其他所有站点。 | ✅ | ❎ |
Logons | 显示所有关联的 SCCM 客户端以及最后登录的用户。 | ✅ | ❎ |
Credentials | 显示由 SCCM 保管的加密凭据。 | ✅ | ❎ |
TaskList | 显示所有任务序列,但不访问任务数据内容。 | ✅ | ❎ |
TaskData | 将所有任务序列解密为明文。 | ✅ | ❎ |
DecryptCredentials | 解密 SCCM 凭据 Blob。必须在 SCCM 服务器上的高完整性或 SYSTEM 进程中执行。 | ❌ | ✔️ |
AddAdmin /user:DOMAIN\USERNAME /sid:SID | 将提供的帐户提升为 SCCM 中的 'Full Administrator'。 | ✅ | ✔️ |
RemoveAdmin /user:ADMIN_ID /remove:STRING | 移除用户的权限,或将用户从 SCCM 数据库中完全删除。 | ✅ | ✔️ |
/user:current /sid:current/user:DOMAIN\USERNAME /sid:S-1-5-...RemoveAdmin 模块通过从 SCCM 数据库中彻底删除新添加的用户来移除该用户的权限。如果该用户已以某种身份存在,此模块只会移除通过写入权限表添加到该帐户的三个角色。使用 sAddAdmin 命令输出提供的参数来运行此命令。该模块需要 sysadmin 或类似权限,因为需要写入 SCCM 数据库表。/timeout, /tlinks 模块,使其包含详细信息。感谢 Azaël Martin (n3rada)。whoami 模块,使其包含 Windows 主体和数据库用户。感谢 Azaël Martin (n3rada)。impersonation 模块,使其包含 Windows 主体和数据库用户。感谢 Azaël Martin (n3rada)。sqlspns 枚举模块中增加了 IP 地址检索功能。感谢 Azaël Martin (n3rada)。/enum:info 模块增加了 DNS 支持。olecmdexec 模块增加了可选的 /subsystem 参数,支持使用 CmdExec 或 PowerShell OLE 自动化子系统执行。AzureAD 身份验证更改为 EntraID。EnumerationModules.cs。FormatQuery.cs。SccmModules.cs。ModuleHandler.cs 重命名为 SqlModules.cs。PrintUtils.cs 重命名为 Print.cs。SQLServerInfo.cs 重命名为 Info.cs。iSearchHelp.cs 从方法改为构造函数。CaptureHash.cs 从方法改为构造函数。Impersonate.cs 从方法改为构造函数。lEnableClr。lDisableClr。lXpCmd。lXpOle。Random.cs。EnableDisable.cs。clr 实现了随机生成的程序集名称。ole 实现了随机生成的变量和方法名称。mapped 和 roles 模块整合到 whoami 中。lMapped 和 lRoles 模块整合到 lWhoami 中。iMapped 和 iRoles 模块整合到 iWhoami 中。