1. 项目概述为什么我们需要Recon-ng如果你在网络安全领域摸爬滚打过一段时间尤其是做过渗透测试或者红队评估那你一定对“信息收集”这四个字的份量深有体会。它远不止是打开搜索引擎输入一个公司名那么简单。一个成功的渗透其基石往往是在攻击链最前端的侦察阶段就奠定的。你需要知道目标暴露在互联网上的所有资产域名、子域名、IP地址、开放的端口、运行的服务、甚至是从业人员的邮箱、社交账号和无意中泄露的敏感文档。传统的手工收集效率低下而自动化工具又往往功能单一。这时候一个强大、模块化且可扩展的侦察框架就显得至关重要——这就是Recon-ng的价值所在。Recon-ng并非一个简单的“扫描器”它是一个用Python编写的、完全模块化的开源情报OSINT收集框架。它的设计哲学模仿了著名的Metasploit框架拥有统一的工作区Workspace管理、模块化的功能Modules以及内建的数据库支持。这意味着你可以像在Metasploit里使用exploit模块一样在Recon-ng里按需加载“侦察模块”。这些模块各司其职有的负责从证书透明度日志中挖掘子域名有的负责在各大社交网络和代码仓库中搜索邮箱有的则能对发现的Web服务进行截图和基础指纹识别。它的强大之处在于它将散落在互联网各个角落的OSINT源和查询技巧封装成了一个个可即插即用的工具并且通过工作区将收集到的数据主机、联系人、凭证等有机地关联起来形成一幅不断丰富的目标情报图谱。我最初接触Recon-ng是因为一次内部红队演练。面对一个资产庞杂的集团目标手动收集让我精疲力尽。直到我系统性地使用了Recon-ng通过几个模块的链式调用在几个小时内就梳理出了目标上百个子域名和关联的数十个员工邮箱其中一些邮箱还在历史数据泄露中被找到直接为后续的钓鱼攻击和密码爆破提供了精准的入口。从那以后Recon-ng就成了我信息收集阶段的“瑞士军刀”。本教程的目的就是带你从零开始彻底掌握这把利器不仅仅是会敲几个命令更要理解其设计思想、每个核心参数的含义以及如何组合模块进行高效、深入的网络侦察。2. 环境准备与框架初探2.1 Kali Linux下的安装与启动对于绝大多数安全从业者来说Kali Linux是进行渗透测试和网络安全学习的首选平台。好消息是从Kali 2020.x版本开始Recon-ng已经被预装在系统中。你不需要进行复杂的编译安装过程。打开你的Kali Linux终端直接输入recon-ng即可启动框架。你会看到一个简洁的、带有版本号例如v5.1.1的启动界面并进入recon-ng 的命令行提示符。这里就是你的主战场。如果你在更新的Kali版本中发现没有预装或者你想在其他Debian/Ubuntu系统上安装也只需一条命令sudo apt update sudo apt install recon-ng。第一次启动时Recon-ng会提示你运行keys add命令来添加各种API密钥。这是Recon-ng发挥威力的关键一步。许多强大的侦察模块需要调用第三方服务如Shodan, Censys, Hunter.io, GitHub等的API来获取数据。没有这些密钥对应的模块就无法工作或者功能受限。你可以先输入keys list查看当前需要哪些密钥然后根据提示使用keys add 服务名 你的API密钥来逐一添加。例如添加Shodan的密钥keys add shodan_api YOUR_SHODAN_API_KEY。获取这些API密钥通常需要到对应服务的官网注册免费或付费账户。注意妥善保管你的API密钥并了解每个服务的免费额度和使用条款。在自动化脚本中频繁、大量地调用API可能导致额度迅速耗尽或被临时封禁。2.2 核心概念解析工作区、模块与数据库在深入参数之前必须理解Recon-ng的三个核心概念这决定了你如何使用它。工作区Workspace这是Recon-ng组织数据的核心单元。想象它是一个独立的项目文件夹。所有针对某个特定目标比如“acme_corp”的侦察数据——发现的域名、IP、联系人、凭证等——都存储在一个独立的工作区内。这样做的好处是数据隔离清晰你可以同时开展多个目标的侦察而互不干扰。使用workspaces命令可以列出所有工作区使用workspaces create acme_corp可以创建名为“acme_corp”的新工作区使用workspaces load acme_corp则可以切换进去。模块Modules模块是Recon-ng的功能载体。它们分为几大类侦察Recon模块核心的收集模块用于主动发现信息。例如recon/domains-hosts/brute_hosts用于子域名爆破。报告Reporting模块用于将数据库中的信息导出为特定格式的报告如HTML、CSV。例如reporting/html。导入Import模块用于从外部文件如Nmap扫描结果、域名列表将数据导入到当前工作区数据库。发现Discovery模块用于对已存入数据库的资源如主机进行进一步的探索和丰富。利用Exploitation模块数量较少用于对发现的漏洞进行简单验证。使用modules search命令可以搜索模块例如modules search shodan。使用modules load命令加载模块例如modules load recon/domains-hosts/certificate_transparency。数据库每个工作区背后都有一个SQLite数据库文件默认位于~/.recon-ng/workspaces/workspace_name/data.db。所有模块收集到的结构化数据都存储在这里。你甚至可以直接用SQL命令查询例如在Recon-ng提示符下输入query select * from hosts来查看所有主机记录。这种设计使得数据可以被不同模块反复利用和关联。3. 核心模块参数详解与实战配置仅仅加载模块是不够的你必须学会如何“喂养”它目标和配置参数。这是从“会用”到“精通”的关键跨越。我们以几个最常用、最强大的模块为例深入剖析每个参数。3.1 域名与子域名发现模块子域名枚举是外围侦察的第一步。Recon-ng提供了多种途径。模块recon/domains-hosts/certificate_transparency这个模块通过查询证书透明度CT日志来发现为目标域名签发的SSL/TLS证书从而找到关联的子域名。这是一种被动、高效且覆盖面广的方法。SOURCE 这是最重要的参数。它指定从哪个“源”获取要查询的域名。它不是一个让你直接输入域名的地方。通常你需要先使用add domains命令将主域名例如acme.com添加到数据库的domains表中。然后将SOURCE参数设置为default模块会自动从domains表中读取域名进行查询。你也可以设置为一个包含域名的文本文件路径每行一个域名。LIMIT 限制每个域名查询返回的结果数量。对于CT日志通常返回结果很多设置一个合理的限制如100可以避免初期数据过载。端口与协议参数 此模块不涉及。实操流程recon-ng workspaces create acme_test recon-ng [acme_test] add domains acme.com recon-ng [acme_test] modules load recon/domains-hosts/certificate_transparency recon-ng [acme_test][certificate_transparency] options set SOURCE default recon-ng [acme_test][certificate_transparency] options set LIMIT 50 recon-ng [acme_test][certificate_transparency] run运行后发现的子域名如dev.acme.com,mail.acme.com会自动存入hosts表。模块recon/domains-hosts/brute_hosts当被动收集不够时就需要字典爆破。这个模块使用内置或自定义的字典进行子域名枚举。SOURCE 同上设置为default从domains表读取主域名。WORDLIST 指定用于爆破的字典文件路径。Recon-ng内置了一个字典/usr/share/recon-ng/data/hostnames.txt你可以通过options set WORDLIST /path/to/your/wordlist.txt来使用更强大、更新的自定义字典这在实战中几乎是必须的。线程数参数 此模块没有直接的线程控制其速度主要受字典大小和网络延迟影响。实操心得永远不要只依赖一种方法。最佳实践是先用certificate_transparency进行被动收集再用brute_hosts配合一个高质量的字典如subdomains-top1million-5000.txt进行补充爆破。之后还可以使用recon/domains-hosts/google_site_web等模块利用搜索引擎语法进行发现。将多种方法的结果汇总才能最大限度地覆盖目标资产。3.2 主机信息丰富与端口扫描模块发现主机名后下一步是解析IP并探测开放端口和服务。模块recon/hosts-hosts/resolve这个模块很简单但必不可少。它将hosts表中的主机名解析为IP地址结果存入hosts表对应的ip_address字段。SOURCE 设置为default自动处理hosts表中所有未解析的主机。无其他关键参数。运行run即可。模块recon/hosts-ports/shodan_ip这是体现Recon-ng集成能力的一个亮点。它利用Shodan的API查询目标IP地址的开放端口、运行服务、Banner信息甚至是一些漏洞信息。这比你自己进行全端口扫描要快得多并且利用了Shodan庞大的历史扫描数据库。SOURCE 设置为default从hosts表中读取已解析出IP的主机。LIMIT Shodan API的查询限制。免费API通常有查询次数限制谨慎设置。端口与协议参数 此模块的参数由Shodan API控制你无法指定扫描哪些端口Shodan会返回它已知的所有信息。配置与运行示例假设已添加Shodan API Keyrecon-ng [acme_test] modules load recon/hosts-ports/shodan_ip recon-ng [acme_test][shodan_ip] options set SOURCE default recon-ng [acme_test][shodan_ip] run运行后端口、服务等信息会存入ports表并与对应的主机关联。注意事项Shodan模块非常强大但严重依赖API密钥的质量和额度。在大型项目中优先对重要的、核心的IP地址使用此模块。对于大量IP可以结合使用import模块导入Nmap的XML结果或者使用Recon-ng内更基础的端口扫描模块如使用Masscan或自定义脚本但这通常需要更多配置。3.3 联系人与邮箱收集模块人员是安全链条中最薄弱的一环。收集目标组织员工的邮箱和社交信息对于社会工程学攻击和密码喷洒攻击至关重要。模块recon/domains-contacts/whois_pocs这个模块通过查询域名的WHOIS信息来获取注册时留下的管理员、技术联系人等邮箱地址POC - Point of Contact。SOURCE 设置为default从domains表读取域名。无其他关键参数。但WHOIS信息的质量和隐私保护程度因注册商而异可能收获有限。模块recon/contacts-contacts/mailtester这是一个非常实用的模块用于验证从各处收集到的邮箱地址是否有效。它会连接目标邮件服务器模拟发送邮件的过程但不真的发送从而判断邮箱是否存在。SOURCE 设置为default从contacts表中读取所有邮箱地址进行验证。无其他关键参数。运行后有效的邮箱会在数据库中被标记。高级模块示例recon/contacts-credentials/hibp_breach这个模块需要HIBP_API_KEYHave I Been Pwned服务的API密钥。它用于检查收集到的邮箱是否出现在已知的公开数据泄露事件中。如果发现泄露可能会关联到该邮箱使用的密码哈希值这对于后续的凭证填充攻击极具价值。SOURCE 设置为default从contacts表读取邮箱。LIMIT 控制API请求频率。组合使用流程先通过whois_pocs、recon/contacts-contacts/hunterio需API等模块收集一批邮箱到contacts表。使用mailtester验证这些邮箱剔除无效的。对验证有效的邮箱使用hibp_breach检查其是否已泄露。 这个工作流能帮你快速筛选出高价值的攻击目标。4. 工作流设计与自动化脚本单独运行模块是基础但Recon-ng真正的威力在于将多个模块串联起来形成自动化侦察流水线。这可以通过两种方式实现交互式命令序列和资源文件。4.1 交互式命令序列你可以在Recon-ng提示符下按顺序执行一系列命令。例如一个针对新目标的快速侦察流程可能如下workspaces create new_target add domains target-company.com modules load recon/domains-hosts/certificate_transparency options set SOURCE default run modules load recon/domains-hosts/brute_hosts options set SOURCE default options set WORDLIST /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt run modules load recon/hosts-hosts/resolve options set SOURCE default run modules load recon/hosts-ports/shodan_ip options set SOURCE default run modules load reporting/html options set CREATOR “Your Name” options set CUSTOMER “Target Company” run这个序列完成了从创建空间、发现子域、解析IP、Shodan查询到生成HTML报告的全过程。你可以把这一系列命令保存到一个文本文件中。4.2 使用资源文件实现自动化这是更优雅和可重复使用的方法。Recon-ng支持执行扩展名为.rc的资源文件。在这个文件里你可以写入所有要执行的命令就像在上面交互环境里输入的一样。创建一个文件例如full_recon.rc内容如下workspaces create auto_target add domains example.org modules load recon/domains-hosts/certificate_transparency options set SOURCE default run modules load recon/domains-hosts/brute_hosts options set SOURCE default options set WORDLIST /path/to/wordlist.txt run modules load recon/hosts-hosts/resolve options set SOURCE default run # 暂停一下检查结果或者有条件地执行下一步 # modules load recon/hosts-ports/shodan_ip # options set SOURCE default # run modules load reporting/csv options set FILENAME /tmp/results.csv run然后在启动Recon-ng时直接指定这个资源文件recon-ng -r full_recon.rc。或者在Recon-ng内部使用resource full_recon.rc命令来执行。实操心得在编写复杂的资源文件时善用query命令和条件判断。例如你可以先查询hosts表中有多少条未解析的记录如果大于0才执行解析模块。虽然Recon-ng本身没有像编程语言那样的if/else语法但你可以通过编写外部Shell脚本来调用Recon-ng并实现更复杂的逻辑。对于大型项目我通常会分阶段执行第一阶段被动收集 - 人工审核去重 - 第二阶段主动爆破与验证 - 第三阶段深度信息丰富与漏洞筛查。5. 数据管理与报告输出收集了大量数据后如何管理和呈现它们同样重要。5.1 数据库查询与数据维护所有数据都在SQLite数据库里因此SQL技能能让你如虎添翼。在Recon-ng提示符下使用query命令query select host, ip_address from hosts where ip_address is not null;查看所有已解析IP的主机。query select email, module from contacts where module like ‘%hunter%’;查看由Hunter.io模块发现的邮箱。query delete from hosts where host like ‘%.png’;删除一些误报的、以.png结尾的“主机”通常是CT日志中的误报。你还可以使用.headers on和.mode column在查询前让输出更美观。对于复杂分析甚至可以将数据库文件data.db用SQLite图形化工具如DB Browser for SQLite打开进行可视化操作。5.2 报告生成模块侦察的最终产出是报告。Recon-ng内置了多种报告模块。reporting/csv: 生成CSV文件。非常灵活可以导入到Excel或其他数据分析工具中。你需要设置FILENAME参数来指定输出路径。reporting/html: 生成一个美观的HTML报告包含表格和图表适合直接交付。需要设置CREATOR报告作者和CUSTOMER客户名称等参数。reporting/json: 生成JSON格式的报告便于被其他自动化程序或平台解析。HTML报告配置示例modules load reporting/html options set CREATOR “Security Team” options set CUSTOMER “Acme Corp” options set FILENAME /home/kali/Desktop/acme_recon_report.html run生成的报告会汇总工作区中的所有发现按类别域名、主机、联系人、凭证等呈现一目了然。6. 常见问题排查与性能优化即使对老手来说使用Recon-ng也会遇到各种“坑”。这里记录一些典型问题和解决思路。6.1 模块执行失败与API限制问题运行某个模块特别是需要API的如Shodan, Hunter时提示“Request failed”或“Limit exceeded”。排查首先用keys list确认对应的API密钥是否已正确添加且未过期。其次查看该服务的API控制台确认免费额度是否用尽。许多免费API有每分钟/每日的请求次数限制。解决对于需要大量查询的目标考虑购买付费API套餐。或者在资源文件中使用sleep命令注意原生Recon-ng可能不支持需在外部脚本实现在模块执行间加入延时避免触发速率限制。也可以将目标列表拆分成多个小批次分多次执行。6.2 数据重复与误报问题hosts表中存在大量重复条目或明显误报如*.cloudfront.net这类CDN域名。排查重复通常是因为多个模块发现了同一个资产。误报常见于CT日志模块它会抓取证书中所有域名包括一些泛域名或第三方服务域名。解决去重使用SQL命令清理。例如保留唯一主机名query delete from hosts where rowid not in (select min(rowid) from hosts group by host);。操作前建议先备份或导出数据。过滤在导入或运行模块后编写SQL语句删除包含特定关键词的误报。例如query delete from hosts where host like ‘%.cloudfront.net’ or host like ‘%.amazonaws.com’;。更高级的做法是在运行模块前如果模块支持通过修改模块代码或使用管道过滤输入源但这需要一定的Python功底。6.3 性能优化建议字典选择子域名爆破的效率和效果直接取决于字典质量。不要只用内置的小字典。推荐使用Seclists项目中的大型子域名字典并根据目标行业特性进行增补。目标聚焦在启动大规模侦察前先手动收集一波如公司官网、招聘信息、新闻稿将明确属于目标的根域名、子公司域名先添加到domains表这能引导后续自动化侦察的方向减少噪音。分阶段执行不要试图在一个资源文件里运行所有模块。将被动收集CT日志、DNS查询和主动爆破分开。先运行被动模块评估结果对发现的核心资产再运行耗时的主动扫描或API查询模块。数据库维护定期清理旧工作区或无用的数据。大的数据库文件可能会稍微影响查询速度。可以使用query VACUUM;命令来压缩数据库文件释放空间。6.4 网络连接与代理配置在某些工作环境下你可能需要通过代理服务器访问互联网。Recon-ng底层使用Python的requests库可以通过设置系统环境变量如HTTP_PROXY,HTTPS_PROXY来让所有模块的请求都经过代理。在启动Recon-ng之前在终端中执行export HTTP_PROXYhttp://your-proxy-ip:port export HTTPS_PROXYhttp://your-proxy-ip:port recon-ng请注意这会影响所有网络请求包括API调用和模块自身的连接。如果代理需要认证格式为http://username:passwordproxy-ip:port。确保代理稳定避免因网络问题导致模块超时失败。