十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

HarvestView 产品上下文:theHarvester 的本地运行与证据分析 Web 应用

HarvestView 产品上下文:theHarvester 的本地运行与证据分析 Web 应用 HarvestView 产品上下文theHarvester 的本地运行与证据分析 Web 应用【免费下载链接】theHarvesterE-mails, subdomains and names Harvester - OSINT项目地址: https://gitcode.com/GitHub_Trending/th/theHarvesterHarvestView 是 theHarvester 项目内建的本地 Web 应用用于运行一次性有限枚举并分析其结果把已授权的枚举与导入的结果文件沉淀为持久、可检索的证据而不把 theHarvester 改造成监控服务。本文基于仓库根目录的 PRODUCT.md结合 REST API 文档、运维工作流、结果与本地数据 以及两份 ADR 决策记录逐条还原 HarvestView 的产品定位、目标操作者、核心任务与产品原则并给出对应源码路径作为实现佐证。产品定位本地优先的 Web 应用而非监控服务PRODUCT.md 对 HarvestView 的定义只有一句话却划定了清晰的边界HarvestView is the local web application for running theHarvester and analyzing its results. It turns finite enumeration runs and imported result files into durable, searchable evidence without turning theHarvester into a monitoring service.拆开来看包含三层含义本地 Web 应用应用由仓库内已有的本地 FastAPI 应用承载默认只监听本机回环地址。启动入口见 theHarvester/harvestview.py通过 uvicorn 运行theHarvester.lib.api.api:app默认绑定127.0.0.1:5000并提供-H/--host、-p/--port、-l/--log-level、-r/--reload开发期热重载四个启动参数。两种输入来源一是finite enumeration runs——通过 API 或调度提交的一次性有限枚举二是imported result files——把 CLI 生成的report.jsonl或存量 SQLite 数据库导入无需重新执行侦察对应POST /api/v1/runs/import与POST /api/v1/runs/import-database。产出证据而非持续监控核心输出是durable, searchable evidence即带生产者归属sources/actions数组、可检索、可导出的规范化结果HarvestView 刻意不承担常驻监控职责这也解释了产品原则中的一次只跑一个有限运行。目标操作者时间压力下的桌面安全从业者产品文档给出的操作者画像是The operator is a technically capable security practitioner working at a desk, often under time pressure.这是一个关键的产品约束HarvestView 面向坐在桌前、技术上胜任、常处时间压力下的单个安全从业者而不是面向团队或多租户平台的运营体系。操作者需要确切看到四件事缺一不可What was authorized本次枚举被授权了什么目标与 P0/P1/P2 边界What ran实际运行了哪些来源与动作What failed哪些来源/动作失败、被限流或中止以及具体 stop reasonWhat evidence remains失败或取消之后仍保留了哪些已持久化的证据。这一画像直接决定了架构取舍单本地工作进程串行执行见 ADR 0003、状态与证据分开记录、调度走私有本地控制平面见 ADR 0006都是围绕单操作者、确定性、可问责展开的。核心任务产品必须支持的操作闭环PRODUCT.md 列出了操作者的八项核心任务Core jobs。下面逐项结合 API 路由与源码展开。1. 启动一次明确授权的枚举执行前可见 P0/P1/P2 边界Launch one explicitly authorized enumeration with P0/P1/P2 boundaries visible before execution.运行请求统一提交到POST /api/v1/runs。来源名与能力选择器共用sources数组主动动作作为同一次请求上的独立字段P0被动来源与显式routeviews动作REST API 文档明确称 RouteViews 为 the explicit P0routeviewsactionP1DNSdns_resolve、dns_brute、dns_recursive等面向解析器的查询P2直接screenshot、takeover、api_scan、vhost等直接面向目标的请求。REST API 文档指出 P1 DNS and P2 direct options are fields on the same run request其默认值、限制与描述以运行期 OpenAPI 文档为准服务器使用操作者选择的目标不替操作者施加仅公网出口策略。这意味着边界在提交前就通过请求字段可见、可审。2. 从可复用模板创建运行计划保留相同边界Create a run schedule from one reusable, explicitly authorized run template across one or many targets while preserving the same P0/P1/P2 boundaries.对应GET/POST /api/v1/schedules及调度详情路由。调度持久化四类信息授权目标清单、一个校验过的运行模板、重复周期与重叠策略。每个发生点occurrence通过既有队列为每个目标提交一个普通有限运行overlap_policy为skip时若同计划的前一批仍在保留/排队/运行则跳过本次为queue则排队追加。模板中的 P0/P1/P2 行为被原样保留——REST API 文档明确A due occurrence performs only the provider, DNS, or direct activity explicitly stored in its run template. P1 and P2 activity still requires explicit operator authorization for every listed target.3. 取消工作并确知取消处于哪个阶段Cancel work and know whether cancellation is requested, in progress, or complete.对应POST /api/v1/runs/{run_id}/cancel。取消是一个有状态的过程而非一删了之queued 取消原子转换queued - cancelled直接阻止工作进程认领running 取消先请求协作式终止等待短暂宽限期必要时强制终止running - cancelling - cancelled。详见 ADR 0003。运行记录的生命周期状态机为queued - running - completed|failed、queued - cancelled、running - cancelling - cancelled因此操作者随时能区分取消已请求、取消进行中、取消已完成。4. 重开历史运行比较路由特定证据无需重新侦察Reopen prior runs and compare route-specific evidence without rerunning reconnaissance.对应GET /api/v1/runs/{run_id}一次返回生命周期状态、运行选项、规范化结果、来源执行结果、来源产出统计与产物元数据。跨运行比较依赖 SQLite 持久化默认~/.local/share/theHarvester/stash.sqlite与逐来源产出统计observed_result_count该来源上报的独立主机名数unique_result_count仅该来源上报的主机名数边际覆盖与来源顺序无关shared_result_count至少另一个来源也上报的主机名数resolved_hostname_count运行内dns-resolve动作保留 A/AAAA/CNAME 答案的主机名数unique_resolved_hostname_count仅该来源且具备现时 DNS 证据的主机名数。REST API 文档强调读取这些计数时必须结合来源的执行状态与 stop reason——被限流、失败或被跳过的来源不能与完成但零结果的来源直接比较。跨运行对比的正确姿势见 Results-and-Local-Data.md 的产量对比章节。5. 导入既有 theHarvester JSONL 证据Import existing theHarvester JSONL evidence.对应POST /api/v1/runs/import?filenamereport.jsonl发送 CLI-f NAME生成的同构 JSONL 即可无需联系任何提供方或目标。JSONL 首行是summary记录保留证据状态、来源与动作结果、截图产物元数据其后每行是一个带sources/actions归属的规范化发现。导入时以每条发现的归属数组重建来源归属因此终端报告性质的 JSONL 导入后直接记为已完成。批量场景使用POST /api/v1/runs/import-database导入整个 SQLite服务端会校验文件头、完整性、schema 与每条已完成运行原始运行 ID 保留重复 ID 跳过复用 ID 但证据不同则拒绝。6. 导出规范化 JSONL 结果并检查受管截图Export normalized JSONL results and inspect managed screenshots.GET /api/v1/runs/{run_id}/export导出单次运行的规范化结果首行为summary记录后续每行为type/value/sources/actions结构可直接用jq -c流式处理或再导入GET /api/v1/runs/{run_id}/screenshots/{name}按名取回某次运行管理的一张截图GET /api/v1/runs/export-database把全部已完成运行导出为可移植 SQLite仅含已定稿证据与截图元数据排除队列、取消、工作租约状态截图文件需另行拷贝。7. 从主机名结果直接启动截图或 DNS 爆破不改变父证据Start a screenshot or DNS brute-force action from a hostname result without changing the parent evidence.这是 HarvestView 前端与 API 衔接最紧密的一环提交一个sources为空的运行请求并只启用一个动作例如{target: replace-with-an-authorized-hostname, sources: [], screenshot: true}或把dns_brute置为true可附带dns_resolvers。REST API 文档明确记载HarvestViews subdomain action buttons call this route and create a separate run without changing the completed parent run——即界面上的子域操作按钮会调用该路由创建一条独立运行父运行及其证据保持不变。这是被动默认、主动显式原则在交互层的最小化落地从一条结果出发即可发起针对它的显式主动动作且动作证据与来源证据天然分离。8. 隐含本地集成与自动化边界八项核心任务之外REST API 路由表还暴露了GET /api/v1/sources来源清单与能力/活动类别/凭据名和调度全套路由GET/PUT/DELETE /api/v1/schedules/{schedule_id}、pause、resume、run-now、dispatches它们共同支撑本地集成这一操作者诉求。产品原则约束设计的六条底线PRODUCT.md 用六条原则约束了 HarvestView 的全部行为每一条都能在源码或文档中找到对应实现。本地优先失败即关闭Local-first and fail-closed默认只绑定127.0.0.1。在页面渲染层theHarvester/lib/api/harvestview.py 的_require_local_request会校验客户端地址必须是回环地址、请求主机名必须是localhost或回环 IP否则直接返回 403 theHarvester is available only on localhost只有显式设置THEHARVESTER_HARVESTVIEW_LOCAL_PROXYenabled时才额外信任 Docker 网关。代理模式同理显式启用-p/--proxies后受支持的 HTTP(S) 请求在没有可用代理时以proxy-unavailable失败关闭绝不静默回退到直连见 Configuration-and-API-Keys.md。证据先于装饰Evidence before decoration一切 UI 与导出都以证据为核心JSONL 首行的 summary 记录证据状态与来源/动作结果每条发现保留生产者归属截图作为artifacts关联到产生它的动作与被摄主体失败或取消后已持久化的证据依然附着在运行记录上。产品刻意不在 SQLite 中为每条 URL 存提供方专属的类型而统一存url结果类型正是为了保持证据模型的归一化。被动默认主动显式Passive by default; active work is explicit默认枚举只接触被动来源DNS、爆破、接管检测、API 路径扫描、虚拟主机发现、截图等全部需要显式开关。RouteViews 尤其特殊它从不被-b all启用见 Operator-Workflows.md只能作为显式 P0 动作触发。一次一个有限运行One finite run at a timeADR 0003 记录了单本地工作进程的决策一个本地 worker 一次认领一个排队运行在隔离的子进程中执行有限的 theHarvester 核心避免并发输出与凭据竞争只有在实测需求证明后才考虑加宽。有限性还体现在运行级截止时间默认 1800 秒DNS 相关运行默认不设上限与每次运行独立的limit上。诚实的双状态Honest statePRODUCT.md 明确lifecycle status and evidence completeness are different facts。实现上拆成两个字段statusqueued/running/cancelling/cancelled/completed/failed描述编排生命周期evidence_statuscomplete/partial/failed描述终端证据质量。一个运行可以已完成而证据partial某个来源被提供方或安全边界中止但保留了已捕获结果也可以失败/取消而保留完整证据。操作者必须分别阅读这两个事实。密度与克制Dense enough for an expert, calm enough for long sessions桌面优先的布局、调度卡片上直接展示未来五次upcoming_occurrences、子域操作按钮直达动作运行都是为长时间工作的专家提供足够信息密度的体现而平板与移动端完全可操作保证了长会话之外的可用性下限。平台web由本地 FastAPI 承载PRODUCT.md 的 Platform 一节只有两个字加一段说明web应用由既有本地 FastAPI 应用提供桌面优先平板与移动保持完全可用。技术落地为启动入口 theHarvester/harvestview.py 以 uvicorn 运行theHarvester.lib.api.api:app页面路由见 theHarvester/lib/api/harvestview.py——GET /渲染 HarvestView 主界面GET /schedules渲染调度界面。两个页面均执行_require_local_request校验并把运行版本号、DNS 解析器列表、来源并发数{{VERSION}}、{{DNS_RESOLVERS}}、{{SOURCE_WORKERS}}等模板占位符注入 HTML。静态资产位于 theHarvester/lib/api/static/harvestview/包括app.css、app.js与调度页专用的schedules.css、schedules.js。安全模型上THEHARVESTER_API_KEY是所有/api/v1/*路由的服务端密钥浏览器打开 HarvestView 时收到一个派生的 HttpOnly、SameSitestrict、限定在/api/v1路径的会话 Cookie因此浏览器永不存储或展示配置的 API 密钥Cookie 认证下的变更操作还要求同源请求匹配见 Configuration-and-API-Keys.md 与 Rest-API.md。在仓库中继续深入产品上下文原文PRODUCT.mdAPI 全量路由与请求/响应语义docs/wiki/Rest-API.md生命周期与单 worker 决策记录docs/adr/0003-run-worker-lifecycle.md调度控制平面决策记录docs/adr/0006-schedule-finite-runs-through-a-private-control-plane.md各动作的 CLI 工作流与证据示例docs/wiki/Operator-Workflows.md本地存储、产量对比与截图规范docs/wiki/Results-and-Local-Data.md页面渲染与 localhost 强制校验实现theHarvester/lib/api/harvestview.py启动参数与默认监听地址theHarvester/harvestview.py【免费下载链接】theHarvesterE-mails, subdomains and names Harvester - OSINT项目地址: https://gitcode.com/GitHub_Trending/th/theHarvester创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表