Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-28326-check — 针对 SolarWinds ARM CVE-2026-28326 的非破坏性补丁状态检查工具,通过探测 TCP 55555 端口上的 gRPC 监听器来报告 VULNERABLE、PATCHED 或 INCONCLUSIVE 状态。 | Kitploit
工具/GitHubGitHub/bishopfox/cve-2026-28326-check
防御工具漏洞扫描器漏洞分析信息收集网络安全渗透测试远程访问工具
GitHubbishopfox/cve-2026-28326-check

CVE-2026-28326-check

针对 SolarWinds ARM CVE-2026-28326 的非破坏性补丁状态检查工具,通过探测 TCP 55555 端口上的 gRPC 监听器来报告 VULNERABLE、PATCHED 或 INCONCLUSIVE 状态。

查看仓库
4天前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

SolarWinds Access Rights Manager 未认证 RCE — 漏洞检测脚本

针对 CVE-2026-28326 的未认证补丁状态检查,该漏洞是 SolarWinds Access Rights Manager (ARM) 中的未认证远程代码执行漏洞,已于 2026-09-17 在 ARM 2026.2.1 中修复。CWE-798,CVSS 8.8 高危 (CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)。由 Armadin 的 Kai Huang 报告给 SolarWinds。 该向量中的 AV:A 假设 TCP 55555 仅可从相邻网络访问,这正是 ARM 自带防火墙工具所针对的部署态势;在端口被更广泛开放的环境中,该评分低估了该环境的暴露程度。

ARM 在 TCP 55555 上的 gRPC 远程调用监听器使用客户端证书对等端进行身份验证。未打补丁的版本还会接受一个回退凭据,该凭据派生自一个在所有安装中完全相同的硬编码密钥,从而绕过该身份验证并暴露一条不安全的反序列化路径。其结果是代码以 ARM 服务账户身份执行,该账户默认以 LocalSystem 运行。

该脚本报告每个目标上是否存在修复。它读取身份验证拦截器返回的状态码,不使用该密钥、不进行身份验证,也不向反序列化路径发送数据。除 VULNERABLE 之外的结果本身并不表示目标已打补丁;请参阅解读非易受攻击结果。

用法

root@kitploit:~
# single target (port defaults to 55555)
./cve_2026_28326_check.py arm.example.com

# explicit port
./cve_2026_28326_check.py arm.example.com:55555

# several targets
./cve_2026_28326_check.py arm-a.example.com arm-b.example.com

# scan a list, one target per line ('#' comments allowed), compact output
./cve_2026_28326_check.py -f targets.txt --brief

# machine-readable output for pipelines
./cve_2026_28326_check.py -f targets.txt --json > results.json

Python 3.8+,仅使用标准库 — 无第三方包。

请针对 ARM 服务器而非收集器运行该工具。两种角色都监听 55555,但收集器在修复前后都会以相同方式拒绝外部请求,因此该工具会将其报告为 INCONCLUSIVE。

选项

示例

易受攻击的服务器(默认输出;在 TTY 上 [!] 标记和 VULNERABLE 以红色显示):

root@kitploit:~
$ ./cve_2026_28326_check.py arm.example.com
[!] arm.example.com:55555: VULNERABLE  [unavailable-on-server-role]
      Remoting/Send returned 14 UNAVAILABLE on a listener answering as the server role, the pre-patch rejection path (<= 2026.2.0.42)

已打补丁的服务器。修复后的版本会返回 grpc-message,该工具会将其与判定结果一并打印:

root@kitploit:~
$ ./cve_2026_28326_check.py arm-dr.example.com
[+] arm-dr.example.com:55555: PATCHED  [unauthenticated-gate]
      Remoting/Send returned 16 UNAUTHENTICATED, the localhost and per-process-token gate introduced by the fix (>= 2026.2.1.7)
      grpc-message: Client certificate not found. Please register your application first.

无法分类的监听器。收集器,或拒绝外部请求的服务器,在任一版本上对两次探测的响应都相同:

root@kitploit:~
$ ./cve_2026_28326_check.py collector.example.com
[?] collector.example.com:55555: INCONCLUSIVE  [external-requests-refused]
      the listener refuses external requests, which a collector role and a restricted server both do identically on either build; scan the ARM server itself

使用 --brief 的多个目标:

root@kitploit:~
$ ./cve_2026_28326_check.py -f targets.txt --brief; echo "exit: $?"
VULNERABLE    arm.example.com:55555            unavailable-on-server-role
PATCHED       arm-dr.example.com:55555         unauthenticated-gate
INCONCLUSIVE  collector.example.com:55555      external-requests-refused
UNAFFECTED    db.example.com:55555             not-arm
ERROR         offline.example.com:55555        unreachable
exit: 1

使用 --json 的 JSON 输出。包含两次探测结果,以便对照原始响应检查判定:

root@kitploit:~
$ ./cve_2026_28326_check.py arm.example.com --json
[
  {
    "target": "arm.example.com:55555",
    "verdict": "VULNERABLE",
    "reason": "unavailable-on-server-role",
    "detail": "Remoting/Send returned 14 UNAVAILABLE on a listener answering as the server role, the pre-patch rejection path (<= 2026.2.0.42)",
    "grpc_message": "",
    "probes": [
      {
        "path": "/SolarWinds_ARM_GRPC_ConnectionAuthrization.ConnectionAuthorization/GetCertificate",
        "status": 0,
        "message": "",
        "alpn": "h2",
        "note": ""
      },
      {
        "path": "/SolarWinds_ARM_Remoting.Remoting/Send",
        "status": 14,
        "message": "",
        "alpn": "h2",
        "note": ""
      }
    ]
  }
]

运行是否安全?

该检查旨在用于生产系统:

  • 它不使用硬编码密钥,也不出示任何凭据。它观察服务器如何拒绝匿名对等端,这取决于已安装的版本。
  • 它不向反序列化路径发送数据。该漏洞由 Remoting/Send 消息体中的序列化对象触发。两次探测都发送正文长度为零的 gRPC 消息,拦截器会在任何消息体被分发之前拒绝该调用。
  • 它不改变服务器状态。不出示任何客户端证书、凭据或会话。GetCertificate 探测发送空的注册码,服务器在查找或删除任何待处理注册码之前就会拒绝,因此该探测不会消耗正处于注册过程中的客户端的注册码。
  • 每个目标打开两个 TCP 连接,每次探测一个,并在读取状态后关闭每个连接。

请求和日志痕迹

#调用目的
1ConnectionAuthorization/GetCertificate确认该端点是 ARM 且处于服务器角色
2Remoting/Send补丁状态探测

在未打补丁的服务器上,被拒绝的匿名请求会以调试级别记录日志 (Unable to validate remote request token),并记录一行指明对等端的信息性日志。已打补丁的版本会记录一条拒绝日志,指明对等端以及上面 grpc-message 中引用的注册提示。两个版本都不会记录会话。

若要查找利用行为而非暴露情况,请检查 ARM 的 NetworkConnectionEntry 记录。一条 IsAuthenticated=false 且 ClientCertThumbPrint 有值的记录与身份验证绕过一致,且不会出现在正常流量中。

工作原理

该修复改变了身份验证拦截器对未出示客户端证书的对等端返回的状态。打补丁前,客户端证书检查中的每条拒绝路径都设置 Unavailable。打补丁后,localhost 加令牌检查会设置 Unauthenticated 并附带一条独特消息,该路径上没有任何其他情况返回 16。两次匿名调用即可区分版本:

判定从 Remoting/Send 读取,因为只有双工流式处理和一元处理器会传播拦截器的状态;服务器流式和客户端流式处理器在两个版本上都会覆盖它。

它报告的是补丁状态,而非版本

该检查观察已打补丁代码路径的行为,不依赖版本字符串。它不会报告已打补丁的服务器运行的是哪个版本。

需要 ALPN

ARM 监听器会重置未协商 ALPN h2 的 TLS 连接,因此该工具显式设置它。未使用 ALPN 通过 TLS 连接的扫描器不会从该端口收到任何数据。

解读非易受攻击结果

VULNERABLE 和 PATCHED 各自基于观察到的服务器响应。INCONCLUSIVE 和 ERROR 表示探测未能对目标进行分类,因此其补丁状态未知。因此 INCONCLUSIVE 与 PATCHED 分开报告。

判定

每个判定都带有一个简短的 reason 标签。--brief 将其作为第三列打印,--json 将其作为 reason 携带。

对于所有三种 INCONCLUSIVE 原因,补丁状态未知。原因标签指示在再次运行检查之前需要解决什么。

退出码

代码含义
0

退出码 0 涵盖 PATCHED、UNAFFECTED 以及所有三种 INCONCLUSIVE 原因。要区分已打补丁的目标与无法分类的目标,请读取判定(--brief 的第一列或 --json 的 verdict 字段),而非退出码。

局限性

  • 收集器角色:收集器在任一版本上对两次探测都返回 14,并被报告为 INCONCLUSIVE。此情况是针对复现该响应的模拟环境测试的,而非针对已部署的收集器。
  • 头部解析:该工具将 grpc-status 作为字面 HPACK 字段进行扫描,未实现 Huffman 或动态表解码。ARM 使用的 gRPC C 核心会以未压缩方式发送这些尾部字段。如果未来版本对它们进行 Huffman 编码,该工具会报告 INCONCLUSIVE 并附带 partial-response。
  • 范围:PATCHED 仅适用于此 CVE,不表示其他 ARM 漏洞的状态。
  • 利用与失陷:VULNERABLE 表示探测所到达的路径上不存在修复。该工具不会在目标上执行代码,也不会检测先前的失陷;请参阅上面的 NetworkConnectionEntry 指标。
  • 可达性:结果反映服务器向该工具运行所在网络位置暴露的内容。在默认安装中,TCP 55555 监听所有接口,包括 IPv6。

修复

根据 ARM 2026.2.1 发行说明,升级到 ARM 2026.2.1.7 或更高版本。版本 2026.2.0.42 及更早版本受影响。

附加说明:

  • 将 TCP 55555 限制为仅 ARM 自身的收集器和客户端可访问。这限制了无法立即打补丁的系统的暴露。
  • 该修复移除了回退身份验证路径;它不会轮换密钥。由于该密钥在所有安装中都相同,请将打补丁之前的任何时间段视为监听器的身份验证可被任何能访问它的人绕过的时间段。
  • 版本清单显示应安装什么;此检查显示监听器上修复是否生效。

许可证

此代码在 MIT 许可证 下分发。

法律免责声明

未经事先相互同意,使用此工具攻击目标是非法的。最终用户有责任遵守所有适用的地方、州和联邦法律。开发者不承担任何责任,也不对由此程序造成的任何误用或损害负责。

另请参阅

  • SolarWinds ARM 2026.2.1 发行说明
  • NVD — CVE-2026-28326
下载工具
标志描述
TARGET一个或多个 HOST[:PORT] 目标;端口默认为 55555
-f, --targets-file FILE从文件读取目标(每行一个;# 为注释)
-p, --port PORT目标未指定端口时的默认端口(默认:55555)
--timeout SECS每次探测的超时时间(默认:12)
--workers N并发目标数(默认:16);输出保持输入顺序
-b, --brief每个目标一行对齐输出,适用于扫描大量主机
--json输出结构化 JSON,包含每个目标的两次探测结果
--no-color禁用彩色输出(同时遵循 NO_COLOR 和非 TTY 环境)
Remoting/SendGetCertificate版本判定
14 UNAVAILABLE0 OK<= 2026.2.0.42VULNERABLE
16 UNAUTHENTICATED任意>= 2026.2.1.7PATCHED
14 UNAVAILABLE14 UNAVAILABLE任一INCONCLUSIVE
判定原因标签含义
VULNERABLEunavailable-on-server-roleRemoting/Send 在作为服务器角色应答 GetCertificate 的监听器上返回 14。修复不存在。
PATCHEDunauthenticated-gateRemoting/Send 返回 16,即修复引入的状态。仅适用于此 CVE。
INCONCLUSIVEexternal-requests-refused两次探测都返回 14。收集器角色和受限服务器在两个版本上此处行为相同。请扫描 ARM 服务器本身。
INCONCLUSIVEpartial-response只有一次探测返回了状态,因此无法比较这一对。请重试。
INCONCLUSIVEunrecognized-status端点应答的状态组合不在已识别集合内。
UNAFFECTEDnot-arm此处没有 ARM gRPC 服务应答。
ERRORunreachableTCP 连接、TLS 握手或 HTTP/2 交换失败。
没有目标为 VULNERABLE
1至少一个目标为 VULNERABLE
2用法错误(参数错误、目标无效或目标文件不可读)
130被中断(Ctrl-C)