
PhoneInfoga 深度解析电话号码 OSINT 信息收集框架的设计与实战【免费下载链接】phoneinfogaInformation gathering framework for phone numbers项目地址: https://gitcode.com/GitHub_Trending/ph/phoneinfogaPhoneInfoga 是一个面向国际电话号码的信息收集OSINT框架其核心工作流分为两个阶段先离线解析号码的静态信息国家、运营商、线路类型等再通过一组可配置的扫描器scanners在互联网上搜索号码的足迹用于识别 VoIP 提供商或辅助定位号码所有者。阅读本文后你将理解它的两阶段扫描架构、并行扫描器调度机制、Google Dork 生成策略、Go 插件扩展体系以及 CLI 与 REST API Web 客户端的三种使用方式能够基于源码将其正确部署到本地调查流程中。一、PhoneInfoga 是什么定位与核心能力官方文档首页docs/index.md对项目的定位非常明确PhoneInfoga 用于扫描国际电话号码你可以先收集任何国际号码的标准信息——国家country、地区area、运营商carrier和线路类型line type然后利用搜索引擎查找号码在网上的足迹尝试找出 VoIP 提供商或识别号码所有者。结合 README.md 的说明可以进一步确认它的工作方式它通过一个扫描器集合collection of scanners来工作这些扫描器需要事先配置通常是 API Key才能发挥全部作用。PhoneInfoga 不追求自动化一切而是作为一个辅助电话号码调查的工具存在。功能清单文档首页给出的功能列表完整继承如下每一条都能在源码中找到对应实现功能源码佐证校验电话号码是否存在lib/number/number.go 中Number.Valid字段由phonenumbers.IsValidNumber计算收集国家、线路类型、运营商等基础信息lib/remote/local_scanner.go 离线解析 lib/remote/numverify_scanner.go 调用外部 API通过外部 API、电话簿与搜索引擎进行 OSINT 足迹收集lib/remote/googlesearch_scanner.go、lib/remote/googlecse_scanner.go查询信誉报告reputation reports、社交媒体、一次性号码等Google Dork 按 Social media / Reputation / Disposable providers 等类别分组生成提供图形界面可在浏览器中发起扫描web/client 下的 Vue.js 前端支持 REST API 与 Go 模块的编程式调用web/v2/api/server/server.go、docs/getting-started/go-module-usage.mdAnti-features它明确不做的事文档首页专门用一节 Anti-features 划定了能力边界这对外部使用者评估该工具非常关键不声称提供可靠或经过验证的数据——它只是一个工具its just a tool不支持实时追踪某部手机或其机主无法获取手机的精确地理位置不能用于入侵hack某部手机。理解这些边界有助于正确预期结果例如 Googlesearch 扫描器只是生成搜索链接工具本身不会抓取搜索结果可能生成查无结果的链接这是有意的设计避免对搜索引擎的抓取限制。二、两阶段扫描架构从号码解析到 OSINT 扫描从源码结构看PhoneInfoga 的扫描流程是先解析、再并发扫描的两阶段流水线。整个流程的入口是 CLI 的scan命令cmd/scan.go。2.1 第一阶段号码解析local 扫描器cmd/scan.go#L54-L89 中runScan的执行顺序是先用number.IsValid校验输入是否合法然后调用number.NewNumber构造Number对象之后才初始化扫描器库并执行Scan。Number结构体定义在 lib/number/number.go#L8-L17包含九个字段type Number struct { Valid bool // 号码是否有效 RawLocal string // 本地格式原始 Local string // 本地格式带空格分组 E164 string // E164 国际标准格式 International string // 国际格式 CountryCode int32 // 国家区号 Country string // 国家代码ISO Carrier string // 运营商 }NewNumber依赖nyaruka/phonenumbers库见 go.mod完成解析与格式转换。这一步完全离线对应文档中 gather standard information such as country, area, carrier and line type 的第一阶段。local扫描器lib/remote/local_scanner.go本身不做任何网络请求它的Run方法只是把Number中解析好的字段打包成LocalScannerResponse返回给用户。文档 docs/getting-started/scanners.md 中给出的典型输出如下$ phoneinfoga scan -n 4176418xxxx Results for local Raw local: 076418xxxx Local: 076 418 xx xx E164: 4176418xxxx International: 4176418xxxx Country: CH需要注意的一点是CLI 入口在 cmd/scan.go#L57 会先做number.IsValid校验不合法的号码会直接退出——这就是 Check if phone number exists 功能的落点。另外输入时特殊字符( ) - 等会被自动转义因此phoneinfoga scan -n 1 555-444-3333这样的写法可以直接使用见 docs/getting-started/usage.md但国家区号是必需的。2.2 第二阶段扫描器库与并行调度所有扫描器统一实现Scanner接口定义在 lib/remote/scanner.go#L24-L29type Scanner interface { Name() string Description() string DryRun(number.Number, ScannerOptions) error Run(number.Number, ScannerOptions) (interface{}, error) }这个四方法接口是整个框架的扩展点Name()扫描器唯一标识用于过滤、结果聚合与 API 路由Description()人类可读的功能描述会出现在GET /v2/scanners的返回中DryRun()一次预检返回 error 表示该扫描器在当前条件下不该运行例如缺少 API Key、或号码国家区号不受支持。ScannerOptions.GetStringEnvlib/remote/scanner.go#L13-L18允许选项优先取请求内传值否则回退到环境变量这正是REST API 可逐请求覆盖环境变量配置的实现基础Run()真正的扫描逻辑在独立 goroutine 中执行。内置扫描器在 lib/remote/init.go#L7-L18 中集中注册func InitScanners(remote *Library) { numverifySupplier : suppliers.NewNumverifySupplier() ovhSupplier : suppliers.NewOVHSupplier() remote.AddScanner(NewLocalScanner()) remote.AddScanner(NewNumverifyScanner(numverifySupplier)) remote.AddScanner(NewGoogleSearchScanner()) remote.AddScanner(NewOVHScanner(ovhSupplier)) remote.AddScanner(NewGoogleCSEScanner(nil)) remote.LoadPlugins() }即内置五个扫描器local、numverify、googlesearch、ovh、googlecse最后调用LoadPlugins()加载用户通过 Go 插件注册的自定义扫描器见第四节。Library是扫描器集合的容器核心方法是Scanlib/remote/remote.go#L58-L94。它的调度策略值得细读并发执行每个扫描器一个 goroutine用sync.WaitGroup等待全部完成结果写入带sync.RWMutex保护的results/errorsmapDryRun 门控DryRun返回 error 时该扫描器被静默跳过仅记 Debug 日志这实现了文档中未配置的扫描器默认不运行unconfigured scanners wont run的承诺panic 兜底每个 goroutine 内有recover()lib/remote/remote.go#L66-L70单个扫描器崩溃不会拖垮整个扫描错误被记入errors并提示 see debug logs过滤器AddScanner在注册阶段就通过filter.Match(s.Name())判断是否被过滤规则排除lib/remote/remote.go#L38-L44对应 CLI 的--disable参数。2.3 各扫描器的分工结合 docs/getting-started/scanners.md 的说明五个内置扫描器各司其职local离线解析无需任何配置输出格式/国家/运营商等基础信息供所有后续分析复用numverify调用 Number Verification API 获取国家代码、位置、线路类型、运营商等标准信息需要NUMVERIFY_API_KEY注意文档特别强调这是 apilayer 的 key 而非 numverify 官网的 key免费版有每月配额限制googlesearch不发起网络请求纯本地生成多组 Google Dork 搜索链接供人工在浏览器中打开ovh利用 OVH Telecom 免 API Key 的 REST API 判断号码是否属于 OVH 的 VoIP 号段在欧洲常见可返回号码段与城市例如Found: true / Number range: 036517xxxx / City: Abbevillegooglecse基于 Google Programmable Search Engine 的编程化搜索可自动取回结果需要GOOGLECSE_CX与GOOGLE_API_KEY免费额度为每天 100 次查询约 50 次扫描超出后按 $5/1000 次计费。2.4 GooglesearchDork 生成策略的实现Check for reputation reports, social media, disposable numbers 这一功能的具体实现就在 lib/remote/googlesearch_scanner.go。它的Run方法把结果按五类组织进GoogleSearchResponseres : GoogleSearchResponse{ SocialMedia: getSocialMediaDorks(n), DisposableProviders: getDisposableProvidersDorks(n), Reputation: getReputationDorks(n), Individuals: getIndividualsDorks(n), General: getGeneralDorks(n), }每一类通过sundowndev/dorkgen库的链式 APISite(...).InText(...).Or()...构造值得注意的实现细节是每条 Dork 都会同时尝试号码的多种格式——International如4176418xxxx、E164如4176418xxxx、RawLocal如076418xxxx用Or()连接。这是因为同一号码在网页上可能以任意格式出现多格式并查能显著提高命中率。例如社交媒体的 Dork 覆盖 facebook、twitter、linkedin、instagram、vk 五个站点一次性号码站点则枚举了 hs3x、receive-sms-now 等二十来个站点。General类除了全文检索外还额外构造了一条按文档扩展名ext:doc OR ext:pdf ...过滤的检索用于在泄露文档中查找号码。每条结果是一个GoogleSearchDork含Number、Dork原始查询串、URL可直接打开的 Google 搜索 URL。由于这是设计上的只生成链接不抓取所以 docs/getting-started/scanners.md 明确提示如需自动取回结果请改用 googlecse 扫描器。三、CLI 实战scan 命令的参数体系scan命令的完整参数定义在 cmd/scan.go#L30-L33cmd.PersistentFlags().StringVarP(opts.Number, number, n, , The phone number to scan (E164 or international format)) cmd.PersistentFlags().StringArrayVarP(opts.DisabledScanners, disable, D, []string{}, Scanner to skip for this scan) cmd.PersistentFlags().StringArrayVar(opts.PluginPaths, plugin, []string{}, Extra scanner plugin to use for the scan) cmd.PersistentFlags().StringSliceVar(opts.EnvFiles, env-file, []string{}, Env files to parse environment variables from (looks for .env by default))即四个可用参数参数说明-n / --number要扫描的号码E164 或国际格式国家区号必填-D / --disable本次扫描跳过的扫描器名可多次指定经 lib/filter 引擎过滤--plugin加载额外的 Go 插件扫描器.so文件路径--env-file指定环境变量文件默认自动寻找当前目录.env由godotenv解析见 cmd/scan.go#L44环境变量配置的典型写法继承自 docs/getting-started/scanners.md# .env.local NUMVERIFY_API_KEYvalue GOOGLECSE_CXvalue GOOGLE_API_KEYvaluephoneinfoga scan -n 4176418xxxx --env-file.env.local基础用法示例phoneinfoga scan -n 1 (555) 444-1212 phoneinfoga scan -n 33 06 79368229 phoneinfoga scan -n 33679368229安装方式有三种直接下载 release 二进制推荐、Homebrewbrew install phoneinfoga、Dockerdocker pull sundowndev/phoneinfoga:latest详见 docs/getting-started/install.md。支持 Linux、macOS 与 Windows当前版本为 v2模块路径github.com/sundowndev/phoneinfoga/v2要求 Go 1.20见 go.mod项目按 GPL-3.0 授权。四、可扩展性用 Go 插件编写自定义扫描器PhoneInfoga 的插件机制基于 Go 语言原生的plugin包。扩展步骤在源码中只有三处关键点实现Scanner接口的四个方法Name/Description/DryRun/Run在init()中调用remote.RegisterPlugin把扫描器注册进全局插件列表——lib/remote/remote.go#L111-L115 中RegisterPlugin用全局mu锁保护追加操作编译为.so运行时用--plugin传入。CLI 在真正扫描前会先调用OpenPlugin验证文件存在且可被plugin.Open加载cmd/scan.go#L70-L75、lib/remote/scanner.go#L31-L42加载失败会直接报错退出。仓库自带一个完整可参考的示例插件 examples/plugin/customscanner.go其结构如下func init() { remote.RegisterPlugin(customScanner{}) }它的Run返回一个带json/console双标签的响应结构体——这揭示了输出层的约定json标签控制 REST API 的 JSON 序列化字段console标签控制终端输出的展示名标签为-的字段如示例中的Hidden不会出现在任何输出中。示例的运行方式$ phoneinfoga scan -n 4176418xxxx --plugin ./custom_scanner.so插件运行后由InitScanners末尾的LoadPlugins()统一并入扫描器库随后与内置扫描器一样参与并发调度、享受同样的 panic 兜底与结果聚合。五、服务化部署REST API Vue Web 客户端PhoneInfoga 的 Web 端是无状态stateless的API 用 Go 编写Gin 框架前端是 Vue.jsweb/client不需要任何持久化存储。5.1 启动命令phoneinfoga serve # 默认端口 5000 phoneinfoga serve -p 8080 # 指定端口 8080 phoneinfoga serve --no-client # 只启动 REST API不挂载 Web 客户端等价的 Docker 命令与 compose 部署方式见 docs/getting-started/usage.md 和 support/docker/docker-compose.yml。启动后浏览器访问http://localhost:port即可使用 Web 客户端即文首截图所示界面。5.2 API 路由与逐请求配置v2 API 的路由注册在 web/v2/api/server/server.go#L25-L31s.router.Group(/v2). POST(/numbers, api.WrapHandler(handlers.AddNumber)). POST(/scanners/:scanner/dryrun, api.WrapHandler(handlers.DryRunScanner)). POST(/scanners/:scanner/run, api.WrapHandler(handlers.RunScanner)). GET(/scanners, api.WrapHandler(handlers.GetAllScanners))对应四个能力添加号码、执行扫描器预检dryrun、执行指定扫描器run、列出全部扫描器。Swagger 规范文件在 web/docs/swagger.yaml。与 CLI 不同REST API 支持在单个请求中逐请求传入扫描器选项option 名与环境变量同名如NUMVERIFY_API_KEY、GOOGLECSE_CX、GOOGLECSE_MAX_RESULTS且请求级选项会覆盖环境变量——这正是 lib/remote/scanner.go#L13-L18 中GetStringEnv的先查 options、再查 env逻辑。其中GOOGLECSE_MAX_RESULTS默认 10上限 100每增加 10 条结果需多一次 API 请求配额。5.3 Go 模块方式嵌入自有程序除 HTTP API 外lib/目录本身就是可导入的 Go 模块lib/number负责号码解析lib/remote提供扫描器库lib/output负责结果渲染。编程式使用方式见 docs/getting-started/go-module-usage.mdmocks/目录如 mocks/Scanner.go、mocks/Plugin.go) 则提供了针对Scanner/Plugin接口的测试替身方便在下游项目里写单元测试。六、注意事项与适用前提数据质量不作保证如 Anti-features 所述工具不承诺数据的可靠性或经过验证调查结论应交叉核实外部依赖与配额numverify 需要 apilayer 免费/付费 key有月度配额googlecse 需要 GCP 的 Custom Search API 凭证免费 100 次查询/天未配置凭据的扫描器会被DryRun自动跳过不会报错无官方演示环境README 说明公共 demo 实例已于 2023 年 12 月 21 日下线官方建议携带自己的 API Key 在本地运行平台支持二进制发布目前覆盖 Linux / macOS / Windows其余平台可从源码自行构建法律与合规作为 OSINT 工具使用者应自行确保对目标号码的调查符合当地法律法规与平台条款。小结PhoneInfoga 的设计可以概括为三点接口化Scanner四方法接口统一了内置与插件扫描器、门控化DryRun 环境变量/请求级选项决定哪些扫描器可运行、并发化Library.Scan以 goroutine 并发执行并做 panic 隔离。文档首页列出的基础信息收集 搜索引擎足迹两阶段能力分别落在lib/number的离线解析与lib/remote的五个内置扫描器上而 Googlesearch 的多格式、多类别 Dork 生成策略与 OVH/Numverify 等外部数据源的接入共同构成了它对电话号码做 OSINT 调查的完整工具箱。阅读顺序建议先看 docs/getting-started/usage.md 与 docs/getting-started/scanners.md 掌握操作再对照 lib/remote 源码理解调度与扩展机制最后用 examples/plugin 编写自己的扫描器。【免费下载链接】phoneinfogaInformation gathering framework for phone numbers项目地址: https://gitcode.com/GitHub_Trending/ph/phoneinfoga创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考