Documentation
¶
Overview ¶
Package hosttools:宿主工具体检 + 安装配方。
二进制部署形态下,ARTEX 直接跑在操作系统里——宿主装了什么渗透工具, worker 就能通过 Bash 工具直接调用什么。这里用 exec.LookPath 探测一份 常用工具清单(可用/缺失+安装提示),注入 graph_overview 让模型派意图时 知道家底,并通过 /api/tools/inventory 暴露给前端展示。
同一份清单同时驱动「一键安装」:每条工具带一个 Kind + 配方(apt 包名 / GitHub Release 资产模板 / pip 包 / 仅手工),由特权助手 artex-hostd 按 配方执行。**体检清单和安装器共用这一个 catalog**,不存在"页面上列了、 安装器却不会装"的漂移。
LookPath 只扫 PATH,单次微秒级,无需缓存。
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ArchAlt ¶ added in v0.3.46
func ArchAlt() string
ArchAlt 返回另一种架构命名:amd64→x86_64、arm64→aarch64。
GitHub 上各项目的资产命名不统一:ProjectDiscovery 系用 amd64/arm64, gitleaks/amass 用 x86_64/aarch64,chisel 的部分资产用 x86/arm。 模板里用 {arch}/{arch2}/{arch3} 分别对应这三套。
func ArchX64 ¶ added in v0.3.46
func ArchX64() string
ArchX64 返回 gitleaks 用的命名:amd64→x64、arm64→arm64。
这是第四套命名——实测 gitleaks 的资产是 gitleaks_8.30.1_linux_x64.tar.gz 与 ..._linux_arm64.tar.gz,即 amd64 叫 x64、arm64 叫 arm64。
func CategoryLabel ¶ added in v0.3.52
CategoryLabel 分类的中文标签(页面展示)。
func Summary ¶
Summary 注入 graph_overview / API 的紧凑形态: available 是可直接调用的二进制名清单;missing 带安装提示; hint 给模型一句话用法约定。
available 里每项都带**用途**("name: 用途"),不只给名字。 理由很实际:目录里现在有 30+ 个工具,模型只看到名字(chisel / dalfox / feroxbuster…)根本判断不出该在什么场景调哪一个,只能瞎试或者干脆不用。 带上用途后"派意图选手段以家底为准"才真正成立。
func SummaryText ¶
func SummaryText() string
SummaryText 纯文本形态(提示词注入用):一行一个可用工具,带用途。
只列【可用】的:缺失的工具模型既不能调,也不该在提示里占位置(一次 worker 运行的 system prompt 里放几十条「未安装」纯属浪费上下文)。 用途必须带上——只给名字的话模型判断不出该在什么场景调哪个 (chisel / dalfox / feroxbuster 这类尤其明显)。
曾经这个函数定义了却没有调用方:工具清单只进了 planner 的唤醒提示, 而真正动手的 worker 看不到它——于是新装的一批工具一次都没被用起来。
Types ¶
type Category ¶ added in v0.3.52
type Category string
Category 攻击面分类。Kind 说「怎么装」,Category 说「干什么用在哪」—— 目录里有 39 个工具,平铺成一张表没法看:用户要回答的是「Web 侧我有哪些家伙」, 而不是「一共有 39 行」。页面上按 Category 分组,模型侧的清单不受影响。
const ( CatNetwork Category = "network" // 端口扫描/连通性/基础网络 CatWeb Category = "web" // Web 侧的探测、爆破、扫描 CatDNS Category = "dns" // 资产测绘与域名枚举 CatCred Category = "cred" // 在线爆破、离线破解、横向移动 CatCode Category = "code" // 源码/密钥泄露、代码审计 CatPivot Category = "pivot" // 内网穿透、代理转发 CatOOB Category = "oob" // 带外通道、通知 CatExploit Category = "exploit" // 框架与二进制利用 CatMaterial Category = "material" // 字典、语料 CatRuntime Category = "runtime" // 脚本、证书、HTTP 等基础能力 // CatMiddleware 是中间件协议专项工具。 // // 为什么单列一类(2026-10-22 调研):近 30 天 NVD 上 CVSS≥9.0 的高危 // 漏洞,中间件占了很大一块——apache/http_server、apache/cxf(SOAP)、 // mariadb、rabbitmq_server、moquette(MQTT)、gitlab、splunk、f5/big-ip、 // fortinet/fortimail…而通用扫描器(nmap/nuclei)对这类**协议型**中间件 // 要么不认、要么只做通用探测。 // // 这里的工具是**协议客户端库**——不是「一键打洞」的漏洞利用器,而是让 // Agent 能直接跟中间件说话:枚举配置、读队列、订阅主题、调管理 API。 // 「怎么打」仍由 Agent 结合漏洞情报决定。 CatMiddleware Category = "middleware" // 中间件协议专项(MQTT/AMQP/DB/SOAP/设备等) )
type Tool ¶
type Tool struct {
ID string `json:"id"` // 稳定标识(与 Bin 相同)
Name string `json:"name"` // 工具名(展示用)
Bin string `json:"bin"` // PATH 里探测的二进制名
Available bool `json:"available"`
Installable bool `json:"installable"` // 能否一键安装
Purpose string `json:"purpose"` // 干什么用(给模型看)
Install string `json:"install,omitempty"` // 缺失时展示的安装提示
Kind Kind `json:"kind"`
Category Category `json:"category"` // 攻击面分类(页面分组用)
// kind=apt: 各包管理器下的包名
Apt string `json:"-"`
Dnf string `json:"-"`
// kind=github: owner/repo + 资产名模板({ver} 不带 v,{arch} = amd64|arm64)
// + 压缩包内二进制名(空 = 与 Bin 同名)
Repo string `json:"-"`
AssetTmpl string `json:"-"`
BinInZip string `json:"-"`
// kind=pip
Pip string `json:"-"`
// PipLibrary 标记这个 pip 包是**纯库**(没有命令行入口)。
//
// 为什么需要这个区分(2026-10-22 实测):pipx 只能装「带 CLI 入口的应用」,
// 装纯库会直接失败并报:
//
// No apps associated with package gmqtt or its dependencies. If you are
// attempting to install a library, pipx should not be used.
//
// 中间件协议工具(gmqtt/pika/pymongo/zeep…)全是纯库——它们是给 Agent
// 在脚本里 import 的,不是命令行工具。装它们必须走 pip。
//
// 现有那些有 CLI 的(wafw00f/netexec/semgrep/pwntools)继续走 pipx:
// 隔离环境不会污染系统 Python,正是我们想要的。
PipLibrary bool `json:"-"`
}
Tool 一条体检结果 + 安装配方。
func Lookup ¶ added in v0.3.20
Lookup 按 id 取配方;ok=false 表示不在白名单内——这是特权助手唯一的 输入校验依据:凡是这里查不到的 id 一律拒绝执行。
func (Tool) AvailableInPath ¶ added in v0.3.20
AvailableInPath 该工具当前是否已在 PATH 内。