文章说明
该篇文章首发于先知社区,原文在这里
当然原作者就是我,文章已经投到先知上面了,所以说明一下
faker靶机复现
靶机提示
1 | 提示:初始凭证db-user:whoami |
因为这台靶机有段时间了 而且是windows的
所以靶机的账号密码要提前修改一下
提示里面刚好有aksk

登录一下然后修改密码

提示过期了 所以需要修改一下

更改成功
现在aksk是
1 | db-user:abc!@#123 |
端口扫描
先简单扫一下端口
1 | nmap -sn 192.168.20.0/24 |

得到目标靶机ip为192.168.20.137
1 | nmap -T4 -A -v 192.168.20.137 |

发现存mssql服务 端口为1433
还得到了靶机名与域名等信息
我们现在就用提示给的aksk去授权登录mssql服务
测试mssql
使用imapacket工具中的mssqlclient进行连接
1 | impacket-mssqlclient db-user@192.168.20.137 -windows-auth |
记得一定要跟上-windows-auth
因为提示给的aksk是window账号 不是mssql服务的数据库账号
所以需要通过window账号授权登录

成功登上mssql服务
这里的密码是我们自己修改后的密码
如果没修改的话是登不上去的
查看当前数据库并查看是否开启了trustworthy
1 | select name,suser_name(owner_sid),is_trustworthy_on from sys.databases |

可以发现有2个数据库开启了trustworthy
什么是trustworthy

这是一个sqlserver的一个属性
如果开启了这个 就可以访问到外部资源 简单来说就可以使用某些函数或者模块来命令执行访问计算机中的资源 不仅仅是数据库中的资源
当然前提是我们操作的用户得是sysadmin用户
user思路
那么getshell的思路就来了 我们需要一个有sysadmin权限的用户来开启 xp_cmdshell模块
然后使用 xp_cmdshell进行getshell
那么我们要怎么获得有sysadmin权限的用户呢
在mssql中 sysadmin角色登录到数据库中映射的用户默认都是dbo用户
这个dbo的数据库用户可能拥有sysadmin权限
我们先看看faker数据库中的用户
1 | use faker |
切换到faker数据库

查看该数据库中的各类权限是否有对应的用户拥有
1 | SELECT DP1.name AS DatabaseRoleName, isnull(DP2.name, 'No members') AS DatabaseUserName FROM sys.database_role_members AS DRM RIGHT OUTER JOIN sys.database_principals AS DP1 ON DRM.role_principal_id = DP1.principal_id LEFT OUTER JOIN sys.database_principals AS DP2 ON DRM.member_principal_id = DP2.principal_id WHERE DP1.type = 'R' ORDER BY DP1.name |

不难看出 我们的db-user用户有db_owner权限
还有一个dbo用户
因为我们有db_owner权限 所以我们可以切换当前上下文用户
我们使用execute as user语句进行上下文切换 也就是切换当前数据库用户
我们将当前数据库用户切换为dbo 查看这个用户是否拥有sysadmin权限
1 | execute as user='dbo' |

切换成功并且有sysadmin权限
那么我们就可以开启xp_cmdshell来提权了
1 | enable_xp_cmdshell |
开启监听



成功拿到shell
根据提示得到flag

root
在user的flag里面有一个提示
1 | agent is runing |
问问ai

提示我们是sqlserver agent 是sqlserver的代理服务
我们先查看得到的shell的用户有什么权限
再看之前 我们先把这个shell弹到别处优化一下
我这里直接弹到vshell上面了

开启vshell并生成一个马子
在靶机中下载木马并执行

成功上线

我们继续之前的操作

这个系统用户没什么权限
那么我们只能去看看那个agent
回到mssql中 看看有没有这个服务
切换到master这个系统级的数据库并查询
1 | use master; select servicename, service_account, status, status_desc FROM sys.dm_server_services; |

确实存在这个代理服务
那么我们现在通过设定定时任务去弹shell
因为我们有dbo这个sysadmin这个角色 所有可以直接设定任务
1 | msdb数据库是sqlserver的"任务调度中心" 我们切换到msdb数据库 |


成功得到shell
是另一个服务级用户
一样是传马然后弹到vshell上面

有一个SeImpersonatePrivilege权限那么我们可以直接使用土豆提权
什么是土豆提权
简单来说就是捕获ntml认证数据包 并篡改数据包的内容 获得system的token 从而以高权限用户那弹shell回来 最终效果就是得到system的shell
上传exp PrintSpoofer64.exe
只需要有SeImpersonatePrivilege权限就可以使用土豆提权


提权成功
说些什么吧!