本篇文章记录一下关于AD凭据获取和信息收集的方法,学习一下tryhackme的靶场的相关知识。有5种方法获取AD凭据,分别是NTLM 认证服务、LDAP 绑定凭证、认证中继、Microsoft Deployment Toolkit、配置文件。
第一种,NTLM认证。
NTLM认证服务是AD 中验证用户身份重要方式,NetNTLM网络上使用NTLM协议进行认证,NetNTLM,通常也称为 Windows 身份验证或简称为 NTLM 身份验证,目前很多服务都使用此认证,比如Outlook Web App,开放RDP服务的远程登录,与VPN集成的端点、一些使用NetNTLM的web服务。它允许应用程序在客户端和 AD 之间扮演中间人的角色。所有身份验证材料都以质询的形式转发给域控制器,如果成功完成,应用程序将对用户进行身份验证。这意味着应用程序代表用户进行身份验证,而不是直接在应用程序本身上对用户进行身份验证。这会阻止应用程序存储 AD 凭据,AD 凭据应该只存储在域控制器上。这个过程如下图所示:
1.用户请求接入
2.服务发送challenge给用户
3.服务发送response返回
4.服务向DC发送用户给的challenge
5.DC对比challenge和response看看能不能通过严重,把结果告诉服务
6.服务返回结果给用户
下面是tryhackme设计的一个理想环境,要我们对 http://ntlmauth.za.tryhackme.com 的NTLM进行暴力破解获取第一个合法凭据:
目前有很多工具支持暴力破解,速度也非常可靠。然而大多数 AD 环境都配置了帐户锁定,我们需要执行密码喷洒,这里环境提供了员工的初始密码为Changeme123,利用已经正准备好的字典和脚本来破解。需要注意,认证失败是可以被监测到的,实战尽可能挑选一个合适的时间和频率。如下所示,我们成功获取了合法用户:
你可能会问,现实生活NTLM认证的情况有多常见?我们用空间搜索引擎看看结果:
这里我用的是quack的,结果显示在中国,大约1w多个独立的ip,看起来并不常见?实际上一个公司用NTLM认证基本上,看网站图标除了微软自带的,还有很多web应用程序也用了NetNTLM认证,甚至出现了OA的系统(我不清楚quack是怎么获取到401后的图标的,我个人猜测是认证后的web应用程序),师傅们有兴趣可以仔细探索一下。实战中其实我个人而言碰到过不少次这种401未授权带NTLM认证的网站,也许拿到了好的字典后也能成为攻防演练后打点的关键。
第二种,LDAP认证
应用程序可以使用的另一种 AD 身份验证方法是轻量级目录访问协议 (LDAP) 身份验证。 LDAP 身份验证类似于 NTLM 身份验证。但是,使用 LDAP 身份验证时,应用程序会直接验证用户的凭据。该应用程序自己本身有一对 AD 凭据,它可以首先使用它们来查询 LDAP,然后验证 AD 用户的凭据。LDAP 身份验证是与 AD 集成的第三方(非 Microsoft)应用程序的流行机制,比方说Gitlab、Jenkins、打印机、VPN等等。下面是打印机的认证流程,流程图如下:
1.用户发送打印请求,请求种携带者用户名和密码
2.打印机用它自己的AD凭据创建LDAP绑定请求
3.DC提供绑定好了的回应
4.打印机用LDAP搜索,查看用户提供是不是存在的用户
5.DC返回用户搜索的相关信息
6.打印机发送携带用户密码发送绑定请求
7.DC判断成功,发送绑定回应
8.打印机返回信息告诉用户,打印任务已经接受
如果我们打下了处于和DC认证的服务,比方说打印机和gitlab都存在很多历史能RCE的漏洞,获取明文密码将会非常容易。这里值得提一句,gitlab的ldap的凭据是明文保存在配置文件的,默认路径在/etc/gitlab/gitlab.rb,如果是源安装的则是在/home/git/gitlab/config/gitlab.yml,配置文件如下:
我们要关注的字段是password和username,我们一般可以通过gitlab登录界面看得出来有没有开启,如果开启web界面会多一个ldap的登录框,当然也有可能开发者禁用了此登录页面,但是ldap认证还是能用的,如果师傅感兴趣可以进一步阅读官方文档学习配置文件的内容,里面可能还有其他非常有用的信息。官方文档链接:https://docs.gitlab.cn/jh/administration/auth/ldap/#%E9%85%8D%E7%BD%AE%E6%A1%88%E4%BE%8B
回到靶场,靶场利用的是LDAP密码回传攻击,设想这样一个场景,我们已经拿到了一台服务器的权限,在内网扫描的时候发现一台网络打印机的 Web 界面,如果如果提供弱口令或者其他方法进入打印机的管理页面,我们就可以修改打印机的配置,将此打印机的认证IP修改为我们的控制的IP,认证以明文的方式发送,我们就能直接获取域内的凭据了。以下为实际利用的情况:访问打印机服务:http://printer.za.tryhackme.com/settings 看上去我们知道了用户名,本次的密码被脱敏了,不过也许其他环境下查看一下HTML的源代码可能有惊喜。
修改DC的ip,让ip指向我们自己的机器,开启nc监听,看看是否有请求:
很顺利,我们收到了打印机的请求,不过事情没这么简单,打印机会和DC进行LDAP的协商,所以我们没办法直接用nc就拿到账户密码,我们需要托管一个恶意的ldap服务器,并对其进行不安全的配置,以确保凭据以明文形式发送。
apt-get update && sudo apt-get -y install slapd ldap-utils && sudo systemctl enable slapd
执行完成后将会有如下选项,要我们设计ldap的管理员密码:
完成安装,结果如下:
使用dpkg-reconfigure -p low slapd重新配置ldap服务器:
1.选中否
2.域名填我们要攻击的域名,我这里就算是靶场的za.tryhackme.com
3.对组织填刚刚的域名,也是za.tryhackme.com
4.选中否,不会删除数据库
5.在创建新数据库文件之前移动旧数据库文件,选中是
6.设置完成
7.我们需要新建一个文件,olcSaslSecProps.ldif写入以下内容。需要进一步解释一下,olcSaslSecProps字段指定SASL 安全属性,noanonymous的情况表示禁用匿名登录,minssf是指最小安全保护,如果等于0的,就是不保护。
8.我们启动服务ldapmodify -Y EXTERNAL -H ldapi:// -f ./olcSaslSecProps.ldif && sudo service slapd restart
9.确保我们的ldap只支持明文,也就是如下supportedSASLMechanisms: PLAIN
supportedSASLMechanisms: LOGIN,输入如下命令ldapsearch -H ldap:// -x -LLL -s base -b “” supportedSASLMechanisms
10.开启tcpdump抓取389的流量,另外关注域名字段附近的数据包,就能看到密码了。
第三种,NTLM Relay攻击
在使用 Microsoft AD 的网络中,SMB 管理着从网络间文件共享到远程管理的一切事务,有两种不同的利用SMB进行NetNTLM身份验证利用的方法,第一种:由于NTLM Challenges可以被拦截,我们可以使用离线破解技术来恢复与NTLM Challenge相关的密码。然而,这个破解过程比直接破解 NTLM 哈希要慢得多。第二种:我们可以使用我们的控制的设备进行中间人攻击,在客户端和服务器之间中继 SMB 身份验证,这将为我们提供一个活动的身份验证会话和对目标服务器的访问。
Responder 允许我们通过在 NetNTLM 身份验证期间使响应中毒来执行中间人攻击,诱使客户端与我们服务器交谈,而不是他们想要连接的实际服务器。在真实的LAN上,Responder 将尝试毒化任何检测到的本地链路多播名称解析 (LLMNR)、NetBIOS 名称服务器 (NBT-NS) 和 Web 代理自动发现 (WPAD) 请求。在大型 Windows 网络上,这些协议允许主机为同一本地网络上的所有主机执行自己的本地 DNS 解析。主机可以首先尝试通过发送 LLMNR 请求并查看是否有任何主机响应来确定他们正在寻找的主机是否在同一本地网络上,而不是使 DNS 服务器等网络资源负担过重。我的Kali机器已经连接到vpn上了,直接执行responder -I breached就可以开始投毒了:
稍等15分钟,成功拿到NTLM
拿到NTLMv2-SSP Hash的值去hashcat破解,如下图:
成破解出密码,如下图所示:
第四种方法,利用Microsoft Deployment Toolkit
大型企业的管理员不可能拿着USB一个一个为每台电脑装软件,微软提供了Microsoft Deployment Toolkit(MDT)服务来管理企业资产。大型组织使用Preboot Execution Environment,即PXE (预引导执行环境)引导来允许连接到网络的新设备直接通过网络连接加载和安装操作系统,MDT 可用于创建、管理和托管 PXE 启动映像,下图是通信流程:
(1)用户发送DHCP发现(请求ip地址和pxe服务信息)
(2)DHCP服务返回用户需要的ip和pex服务信息
(3)用户发送DHCP请求,要分配ip地址给用户
(4)服务返回DHCP承认
(5)客户端执行启动服务发现
(6)MDT服务返回承认消息,并发送PXR信息
(7)客户端发送PXE boot请求
(8)服务端通过TFTP返回PXE boot请求
你可能会问拿到PXE的引导镜像有什么用?第一,可以注入提权向量,在PXE启动完成后获取管理员访问权限。第二可以抓取密码,获取AD内的账户密码。理论上我们按照通信流程就执行这种攻击,不过要让自己的设备加入进对方企业的域实在是太过苛刻(除了社工我想不出其他办法加入对面网络),我们就跳过前面的ip获取,假设我们已经拿到了一台服务器的权限,通过某种方法找到了MDT 服务器的 IP(也许是扫描,也许是历史文件等等),就像是如下靶场利用一般:
这里是我们在靶场预先给好的ip地址,10.200.26.202和bcd文件名称,一般来说,我们需要把每个 BCD 文件都拿下来,检查配置情况,不过这里就只检查特定的bcd节约时间:
使用tftp -i 10.200.26.202 GET “Tmpx64{8193F713-2552-4A20-9ABE-13A9443BAC58}.bcd” conf.bcd 获取
拿到.bcd文件之后我们需要确定系统镜像的位置,这里用到了一个powershell脚本PowerPXE.ps1 (https://github.com/wavestone-cdt/powerpxe)
依次执行即可获取系统路径
powershell -executionpolicy bypass
Import-Module .PowerPXE.ps1
Get-WimFile -bcdFile $BCDFile
拿到系统路径后我们就可以下载系统了,局域网网速一般都很快。
tftp -i 10.200.26.202 GET “Bootx64ImagesLiteTouchPE_x64.wim” pxeboot.wim 下载文件
也是刚刚用的脚本,使用Get-FindCredentials -WimFile pxeboot.wim成功恢复密码:
第六种,配置文件泄露出AD用户的账户密码。
集中部署的应用程序的配置文件、注册表、应用服务、web服务的配置文件都值得我们关注,常用的工具有Seatbelt和winPEAS,可以自动化帮我们寻找敏感密码。本靶场已经提供了ma.db的数据库文件,它是McAfee Enterprise Endpoint Security的文件,McAfee 将安装期间使用的凭据嵌入到名为 ma.db 的文件中以连接回 orchestrator,靶场已经告诉我们文件位置:
使用scp命令下载到本地来解密:
查看数据库也非常简单,直接kali下用sqlitebrowser ma.db直接打开:
翻找密码,成功找到域的账户auth_user和auth_password,需要解密auth_password
解密成功:
拿到了合法的账户通常我们就可以登录我们的目标主机了。但是上面拿到的账号,并不一定每个账号都能直接登录,这里要提一下runas.exe,Runas将凭据注入内存中,使得当前的cmd执行命令的使用用的是特定账号的权限。下面是常用的命令(需要管理员运行):runas.exe /netonly /user:<domain><username> cmd.exe 之后会启动一个新的cmd.exe,为了确保账号正常工作,需要执行一下dir <dc ip=””>SYSVOL命令来保证账号的有效性。</dc></username></domain>
通常使用三种方式对AD进行信息收集:cmd、powershell、bloodhound,通常来说这三种都差不多,但就个人而言bloodhound是图形化的,非常方便,powershell的命令远比cmd的命令好记忆,看个人习惯去使用即可。需要注意,信息收集和漏洞利用密切相关,漏洞利用后又需要信息收集,渗透本身就是一个信息收集的过程,在复杂域下更是如此,这里就浅解释一下载体,具体信息在渗透中有什么作用将放到下篇仔细说明。
在cmd下执行命令通常使用net命令,一般来说此类命令不太会被蓝队和EDR监控,不过这类命令执行必须要在域内的主机才可以执行,同时如果命令返回的数量太多,net就不会返回全部信息。常见的命令如下:
net user /domain 列出域下的全部用户
net user zoe.marshall /domain 检查zoe.marshall用户的详细信息
net group /domain 检查域下的组
net group "Tier 1 Admins" /domain 检查特定组的详细信息
net accounts /domain列出账户策略信息
在powershell中进行信息收集无需我们控制的机器加入到域环境内,仅仅只需要指定域服务器即可,以下是常用命令:
Get-ADUser -Identity gordon.stevens -Server za.tryhackme.com -Properties *
-Identity代表我们要查询的用户名
-Properties 代表与帐户关联的属性,* 将显示所有属性
-Server 指定域名
在大型复杂域环境下采用bloodhound图形化分析是非常常见的手法,这里个人强烈推荐kali安装bloodhound,如果用windows安装会浪费你大量的时间,出现各种兼容性的问题,具体安装可以参考https://www.freebuf.com/articles/web/288370.html, 这里不再赘述。bloodhound可能会产生大量日志引起安全设备告警,算是各有优缺点了。我们需要去github内找到collectors目录,信息收集器有exe和ps1的,如果你喜欢无文件渗透,可以使用powershell远程加载或者使用C#版本的内存加载运行,完全取决于你。
这里用exe用法举例,有非常多的选项,我们一般要收集全部信息命令如下:
Sharphound.exe –CollectionMethods All –Domain za.tryhackme.com –ExcludeDCs
–CollectionMethods,确定 Sharphound 将收集的数据类型,我们可以手动修改,类型非常多,如下图给出。
–Domain 指定要枚举的域名,如果域非常复杂,可以可能想要枚举与现有域信任的父域或其他域,用此参数即可控制。
–ExcludeDCs:这将指示 Sharphound 不要接触域控制器,这会降低 Sharphound 运行引发警报的可能性。
工具非常复杂,师傅们有兴趣可以进一步查阅文档了解相关用法,调整参数降低被蓝队发现的概率:
运行完成后会在当前生成一个zip文件,用鼠标直接拖到bloodhound里面就行了,需要注意我们的bloodhound必须用最新版本的,才能和github的兼容,不然没办法导入成功。
Bloodhound揭示了域内账户直接的关系,这些关系到底有什么用下面靶场举了一个简单的图片:
上图所示,我们在右上角搜寻开始节点MARCUS.GARNER和目的节点Tier 1 ADMINS,Tier 1 ADMINS属于管理员组,我们最开始拿到的账户是MARCUS.GARNER账户,途中展示了我们怎么才能到Tier 1 ADMINS。首先MARCUS根据图片DOMAIN [email protected], [email protected]可以RDP进入THMJMP1.ZA.TRYHACKME.COM,THMJMP1.ZA.TRYHACKME.COM内部含有[email protected]的会话,如果我们能权限提升成管理员就能偷走它的hash,就能获取Tier 1 ADMINS的管理员权限,实战中可能路径有更多,而且不一定都能走通,需要根据情况选择最佳路径,实战可以一个CVE就打下来了,也可能横向非常复杂,甚至压根走不通。
总结,本篇围绕AD凭据的获取介绍了几种常用的获取初始立足点的方法,这种方法在国内都是利用漏洞打点实际可能作用不是特别大,仅仅做了解,算是扩充一下师傅们的思路,后半部分补充了一下常用的信息收集的工具,其实也是老生常谈的东西了,真要展开也不是几千字能搞完的了,后续看情况在聊一下AD的利用和权限维持吧,最后,感谢大家看到这里。
文章来源于:https://xz.aliyun.com/t/12048
若有侵权请联系删除
加下方wx,拉你一起进群学习
往期推荐
原文始发于微信公众号(红队蓝军):AD学习记录(上)