0x01 前言
朋友发来的是一个支持外链的MSSQL,未做站库分离处理,且可以直接通过xp_cmdshell执行命令,但是由于目标系统为Windows 2019,自带的有微软的Windows Defender防病毒,他在执行PowerShell攻击命令时被拦截后不知道要怎么绕过,所以让我帮着给看下。
目标系统:Windows Server 2019(10.0.17763 暂缺 Build 17763)
数据库版本:Microsoft SQL Server 2014 - 12.0.2000.8 (X64)
当前权限:nt service\mssqlserver
开放端口:80、135、445、1433、2383(ssas)、3389......
进程名称:Ssms.exe、sqlwriter.exe、sqlservr.exe、MsMpEng.exe、chrome.exe......
有实战经验的老哥在看到“此脚本包含恶意内容,已被你的防病毒软件阻止。”提示时就知道是Windows Defender拦截的,我们拿目标机器上的进程列表到“Windows杀软在线对比辅助”上对比了一下发现确实存在。
现在已经确定存在Windows Defender,那么我们就先来绕过它获取一个MSF会话,经过测试发现MSF的web_delivery模块直接就可以绕过了,但是不能在SSMS和Navicat Premium中执行这个Payload,会出现“开头的 标识符 太长。最大长度为 128”的报错。
因为这是一个
支持外链的MSSQL,所以我们还可以换其他的MSSQL连接工具试一下,这里我直接用的MSF中的mssql_exec模块执行的Payload,可以看到已经成功获取到目标机器会话。
这里我们先尝试了利用MS16-075模块来进行权限提升,但是由于目标机器上的
Windows
Defender防病毒软件
原因利用失败了,而且会话还掉了几次,如果有免杀EXP可以试一下。
MS16-075模块利用失败了,但是
我们在前期的信息搜集中有发现目标机器上还运行着一个
Ssms.exe进程,这个进程是MSSQL客户端连接工具,全称为
SQL Server Management Studio。
我们在
《站库分离常规渗透思路总结》
这篇文章中也有提到过这个提权方法,当目标机器有
在使用
Windows身份验证连接
MSSQL
数据库时就会保留当前登录用户的令牌,所以可以直接利用MSF中的
Incognito扩展来进行权限提升,
可以看到已经成功提升至Administrator权限。
注:
为什么拿到Administrator后不直接进入cmdshell添加管理员用户呢?因为动静太大了,在进行远程桌面连接时会产生大量日志,这样容易被管理员发现,所以个人建议不到万不得已时不要直接去添加管理员用户和连接远程桌面,尽可能的都在命令行下执行相关操作。
虽然已经得到目标机器的Administrator权限,但是
Windows
Defender还拦截了一些命令的执行,如:
执行
getsystem会一直卡着不动,
所以目前无法得到SYSTEM以及HASH和明文。
经过测试发现可以使用migrate命令将当前会话进程迁移至其他SYSTEM权限运行的进程中去,这里我迁移的是PID为7008的GoogleCrashHandler.exe进程,但还是不能使用hashdump命令抓取hash,kiwi也抓取不到明文密码,以前没有测试过Windows 2019,不知道能不能通过修改WDigest注册表的方式来抓取明文密码。
因为我们现在已经是SYSTEM最高权限了,
它
具备SAM注册表的完全控制权限,
所以现在是可以直接利用
post/windows/gather/hashdump模块抓取HASH,
但是解密不了。
1. 利用mssql_exec模块执行powershell payload绕过Windows Defender获取MSF会话;
2. 利用kiwi扩展“通过MSSQL客户端连接工具的Ssms.exe进程”模拟Administrator令牌;
3. 利用migrate进程迁移命令绕过Windows Defender得到SYSTEM以及HASH和明文密码;
当目标机器存在Windows Defender防病毒软件时,即使已经拿到了Administrator会话后仍然无法执行getsystem、hashdump、list_tokens等命令和一些后渗透模块,除了上边已测试的migrate进程迁移方法外还可以尝试以下三个思路。尽可能的拿到目标机器的SYSTEM以及HASH和明文密码,在内网环境中可能会有其他用途,这里仅为大家扩展几个绕过思路,就不截图了!
(1) 直接添加管理员用户
使用shell命令进入cmdshell后直接利用net命令来添加一个管理员用户,然后远程桌面连接进去关闭Windows Defender防病毒软件的实时保护,最后尝试抓取目标机器HASH和明文密码。
net user test xxxasec!@
net localgroup administrators test /add
(2) 修改SAM注册表权限
使用regini命令修改SAM注册表权限,然后利用post/windows/gather/hashdump模块抓取目标机器HASH,最后再利用135/445等支持哈希传递的工具来执行命令。
echo HKLM\SAM\SAM [1 17]>C:\ProgramData\sam.ini
regini C:\ProgramData\sam.ini
(3) 关闭杀毒软件实时保护
使用
Windows
Defender
防病毒软件中自带
的
MpCmdRun.exe
程序来
关闭它的实时
保护
,然后再利用hashdump命令或模块抓取目标机器HASH。MSF中的
rollback_defender_signatures模块也可以用来关闭
实时
保护
,但是需要SYSTEM权限才能执行。
C:\PROGRA~1\WINDOW~1>MpCmdRun.exe -RemoveDefinitions -all
MpCmdRun.exe -RemoveDefinitions -all
Service Version: 4.18.1812.3
Engine Version: 1.1.17600.5
AntiSpyware Signature Version: 1.327.2026.0
AntiVirus Signature Version: 1.327.2026.0
NRI Engine Version: 1.1.17600.5
NRI Signature Version: 1.327.2026.0
Starting engine and signature rollback to none...
Done!
记得前几年在测试Windows Defender时好像几乎所有获取MSF会话的方式都是会被拦截的,但是不知道为什么在这个案例中就没有拦截web_delivery模块中的Powershell,hta_server模块是会被拦截的,MSF或Windows Defender版本原因吗?这里我也没有再去深究这个问题,所以大家在实战测试中还是得自己多去尝试,说不定哪种方法就成功了呢!!!
只需在公众号回复“9527”即可领取一套HTB靶场学习文档和视频,“1120”领取安全参考等安全杂志PDF电子版,“1208”领取一份常用高效爆破字典,还在等什么?