MSSQL绕过微软杀毒提权案例

0x01 前言

朋友发来的是一个支持外链的MSSQL,未做站库分离处理,且可以直接通过xp_cmdshell执行命令,但是由于目标系统为Windows 2019,自带的有微软的Windows Defender防病毒,他在执行PowerShell攻击命令时被拦截后不知道要怎么绕过,所以让我帮着给看下。

0x02 信息搜集

目标机器基本信息:

目标系统:Windows Server 2019(10.0.17763 暂缺 Build 17763)数据库版本:Microsoft SQL Server 2014 - 12.0.2000.8 (X64) 当前权限:nt servicemssqlserver开放端口:80、135、445、1433、2383(ssas)、3389......进程名称:Ssms.exesqlwriter.exesqlservr.exeMsMpEng.exechrome.exe......

有实战经验的老哥在看到“此脚本包含恶意内容,已被你的防病毒软件阻止。”提示时就知道是 Windows   Defender拦截的,我们拿 目标机器上的进程列表到 “Windows杀软在线对比辅助”上对比了一下发现确实存在

0x03 实战提权过程

现在已经确定存在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和明文密码;

0x04 其他绕过思路

当目标机器存在Windows Defender防病毒软件时,即使已经拿到了Administrator会话后仍然无法执行getsystem、hashdump、list_tokens等命令和一些后渗透模块,除了上边已测试的migrate进程迁移方法外还可以尝试以下三个思路。尽可能的拿到目标机器的SYSTEM以及HASH和明文密码,在内网环境中可能会有其他用途,这里仅为大家扩展几个绕过思路,就不截图了

(1) 直接添加管理员用户

使用shell命令进入cmdshell后直接利用net命令来添加一个管理员用户,然后远程桌面连接进去关闭 Windows   Defender 防病毒软件的实时保护,最后尝试抓取 目标机器 HASH和明文密码

net user test xxxasec!@#!23 /addnet localgroup administrators test /add

(2) 修改SAM注册表权限

使用 regini 命令修改SAM注册表权限,然后利用post/windows/gather/hashdump模块抓取目标机器HASH,最后再利用135/445等 支持哈希传递 的工具来执行命令。

echo HKLMSAMSAM [1 17]>C:ProgramDatasam.iniregini C:ProgramDatasam.ini

(3) 关闭杀毒软件实时保护

使用 Windows   Defender 防病毒软件中自带 MpCmdRun.exe 程序来 关闭它的实时 保护 ,然后再利用hashdump命令或模块抓取目标机器HASH。MSF中的 rollback_defender_signatures模块也可以用来关闭 实时 保护 ,但是需要SYSTEM权限才能执行。

C:PROGRA~1WINDOW~1>MpCmdRun.exe -RemoveDefinitions -allMpCmdRun.exe -RemoveDefinitions -all Service Version: 4.18.1812.3Engine Version: 1.1.17600.5AntiSpyware Signature Version: 1.327.2026.0AntiVirus Signature Version: 1.327.2026.0NRI Engine Version: 1.1.17600.5NRI Signature Version: 1.327.2026.0 Starting engine and signature rollback to none...Done!

0x05 注意事项

记得前几年在测试Windows Defender时好像几乎所有获取MSF会话的方式都是会被拦截的,但是不知道为什么在这个案例中就没有拦截web_delivery模块中的Powershellhta_server模块是会被拦截的,MSF或Windows Defender版本原因吗?这里我也没有再去深究这个问题,所以大家在实战测试中还是得自己多去尝试,说不定哪种方法就成功了呢!!!