joshuaruppe/Get-AccessFootprint

GitHub: joshuaruppe/Get-AccessFootprint

Get-AccessFootprint 是一个被动优先的 PowerShell 红队态势感知工具,用于在拿下主机后快速梳理当前 token 可达和可访问的内网主机清单。

Stars: 0 | Forks: 0

# Get-AccessFootprint **专为授权的红队 / 渗透测试工作设计的态势感知收集器。** 它旨在解决你拿下主机后最耗时的疑问:*作为当前用户,这台主机还与哪些机器存在关联或访问权限?* 默认情况下,它在执行过程中不会发送任何新的数据包。 单一且独立的 `.ps1` 脚本。兼容 Windows PowerShell 5.1。无需外部模块,且其本身不会触发任何 AMSI 签名。 ## 为什么需要 在实际攻防演练或实验室环境中,最耗时的往往不是获取 shell,而是弄清楚接下来还能打哪里。目标主机本身其实已经“知道”了很多信息:它在与谁通信、向谁完成了身份验证、用户之前 RDP 连接过哪些机器。该工具会优先以被动方式提取这些情报,随后允许你在需要时,将发现的列表转化为主动的连通性与访问权限映射图。 有两点需要时刻牢记,因为它们很容易被混淆: - **连通性 (Reachability) 不等于访问权限 (Access)**。一台主机虽然可达,但可能对你毫无用处。而你的 token 却可能对跨越三跳之外的某台主机拥有权限。 - **一切均限定于当前 token**。整个映射图会随着 `make_token` / `steal_token` 的执行而彻底改变,因此报告会在最顶部明确指出你正在查看的是*哪个用户*的访问权限。 ## 安装 无需安装。它仅仅是一个单一的文件。按照你习惯的方式将其传到目标主机上即可。 ``` # 本地 . .\Get-AccessFootprint.ps1 # dot-source: loads the function, runs nothing Get-AccessFootprint # passive footprint # 或者直接运行文件 .\Get-AccessFootprint.ps1 # passive .\Get-AccessFootprint.ps1 -Help # usage screen # Cobalt Strike Beacon beacon> powershell-import C:\path\Get-AccessFootprint.ps1 beacon> powershell Get-AccessFootprint -Sweep -TestAccess ``` `-Help` 会打印完整的用法摘要,因此你无需打开文件即可回忆起各个参数的功能。 ## 阶段 | 阶段 | 参数 | 流量 | 功能描述 | |------|------|---------|--------------| | **1. 被动阶段** | *(默认)* | 无 | 仅读取本地状态信息,并将其汇总为去重后的候选主机列表 | | **2. 扫描阶段** | `-Sweep` | 主动 | 对已发现的内部主机执行 TCP 连接扫描 | | **3. 访问阶段** | `-TestAccess` | 主动 + 认证 | 测试 `C$` 管理共享 (及可选的 WinRM):查明当前究竟在哪些主机上是管理员 | **阶段 1** 绝不会发送任何数据包。它会收集 token 上下文、网络接口与子网、路由表、ARP 缓存、已建立的 TCP 会话 (及其关联进程)、DNS 客户端缓存、SMB 映射与会话、WinRM `TrustedHosts`、RDP 与 PuTTY 历史记录、Kerberos 票据,以及 `hosts` 文件。随后,它将所有信息进行去重处理,生成**候选主机**列表,并为每台主机标记其来源。 **阶段 2 和 3** 为可选执行项。它们会打印警告横幅,并带有抖动 (Jitter) 机制按顺序执行,且设有超时限制,因此遇到不可达的主机绝不会挂起整个运行过程。 ## 选项 | 选项 | 默认值 | 备注 | |--------|---------|-------| | `-Sweep` | 关闭 | 启用阶段 2 的 TCP 连接扫描 | | `-TestAccess` | 关闭 | 启用阶段 3 的访问权限检查 | | `-FullSubnet` | 关闭 | 搭配 `-Sweep` 使用时,扫描整个本地**内部** `/24` 子网,而非仅扫描已知主机 (噪声会明显变大) | | `-IncludeExternal` | 关闭 | 在主动阶段中同时针对公共 / 非 RFC1918 主机 (默认:仅针对内部主机) | | `-IncludeWinRM` | 关闭 | 搭配 `-TestAccess` 使用时,通过 `Test-WSMan` 探测 WinRM (5985) | | `-Ports ` | `445,135,139,3389,5985,5986,22,80,443,1433,88` | `-Sweep` 扫描的端口列表 | | `-TimeoutMs ` | `300` | 主动检查中每次连接的超时时间 | | `-JitterMs ` | `150` | 探测之间的最大随机延迟。调大该值可提高隐蔽性 | | `-OutFile ` | 无 | 将完整的结果对象保存为 JSON 文件 | | `-Help` | 无 | 打印用法说明并退出 | ## 解读输出结果 **候选主机**被划分为两个类别: - **内部 / RFC1918**。这些是对横向移动至关重要的主机。这也是主动阶段默认针对的目标。 - **外部 / 公共**。源自你本地浏览器和应用流量的 CDN 及 SaaS 端点。它们会被保留在返回的对象中,但除非你指定了 `-IncludeExternal`,否则不会作为主动探测目标。 每个候选主机都会标记其**来源** (`ARP`、`TCP:445`、`RDP-History`、`SMB-Mapping`、`Kerberos` 等),以便你能够明确区分哪些是*已通过身份验证*的主机,哪些仅仅是 *ARP 发现*到的主机。 **阶段 3 的访问权限列说明:** | `AdminViaSMB` | 含义 | |---------------|---------| | `True` | 当前 token 在此主机上是本地管理员 (`C$` 可读)。属于可进行 Pivot 的候选目标。 | | `False` | 445 端口可达,但无管理员权限。 | | *(空白)* | 445 端口关闭或被过滤。未进行测试。 | 每次运行还会返回一个结构化对象。你可以通过 dot-source 方式执行 (`$r = Get-AccessFootprint`) 来捕获它,从而获取 `.Candidates`、`.Established`、`.SweepResults`、`.AccessResults` 等属性,或者使用 `-OutFile loot.json` 将完整结果直接导出到文件中。 ## OPSEC 考量 该工具默认保持静默,并在可能违背这一点时向你发出明确提示。 - 被动阶段不会产生任何流量。这是纯粹的免费情报获取,同时也为你的主动探测划定了范围,从而减少不必要的探测行为。 - 主动阶段在执行前会发出警告,并明确指出其将产生的日志记录类型。SMB/WinRM 认证会在目标主机上留下 Event ID 4624/4625 日志,并在 DC 上留下 4776 日志。在子网内大面积尝试访问 `C$` 正是 Defender for Identity 和 ATA 重点标记的行为模式,这就是为什么访问权限检查默认仅针对已知的候选主机集,而非范围内的所有主机。 - 探测请求会带抖动机制按顺序发送,而不是以 runspace 方式并发涌出。你可以调大 `-JitterMs` 以减缓速度。该工具绝不会发出那种会被识别为扫描器的大量并发连接。 - `-Sweep` 在开始前会打印最坏情况下的预计剩余时间 (ETA),并显示每个主机的扫描进度。每次探测都受 `-TimeoutMs` 限制,因此不会发生挂起现象。 - 不依赖 PowerSploit,也不匹配任何特征签名。这里使用的全都是原生 cmdlet,因此其自身不会触发 AMSI。不过,如果通过 Beacon 加载,仍需按常规方式处理 AMSI。 ## 局限性 - 仅支持 TCP 连接扫描。没有 SYN/半开扫描,没有服务或版本检测,也没有 OS 指纹识别。如需深度扫描,建议通过 SOCKS 代理进行流量转发,并运行真正的 nmap。 - 仅针对当前 token。在执行 `make_token`、`runas /netonly` 或 Beacon 的 `steal_token` 之后,需重新运行脚本以枚举其他用户的权限。 - `Get-SmbConnection` 需要管理员权限。在非提权状态下会被静默跳过;但 `Get-SmbMapping` 在无提权时依然有效。 ## 法律声明 本工具仅供**已获授权**的安全测试、实验室环境及考试使用。你需自行确保拥有针对该工具所触及的每一台主机的操作权限。请勿对任何超出授权范围的资产使用主动扫描阶段。
标签:AI合规, HTTP, HTTP/HTTPS抓包, IPv6, Libemu, OpenCanary, PowerShell, 态势感知