CVE-2019-2444漏洞利用及相关攻击链介绍
sinye56 2024-10-06 01:01 8 浏览 0 评论
Oracle 12c及Oracle 18c组件jssu程序存在漏洞,易受符号链接攻击影响,攻击者可利用此漏洞获得服务器root权限,此漏洞由安华金和公司安全实验室发现,CVE编号为CVE-2019-2444。本文将详细说明漏洞涉及的技术细节,并介绍与此漏洞相关的攻击手段。
漏洞点
程序jssu是为Oracle Scheduler提供服务的组件,保存于Oracle主安装目录的bin文件夹下。在使用了credential的情况下,Scheduler会使用jssu程序来登录系统进行操作。不过,jssu程序之所以会受到符号攻击影响,原因与其功能关系不大,而是以下几个方面:
首先是jssu程序本身的属主及权限。默认情况下,程序所属用户是root,而用户组是oinstall,与oralce用户的用户组相同。程序权限为4750,即所属用户组可读可执行,且设置了suid位。
其次是jssu程序运行时会在工作目录下生成一个日志文件,并向其中写入内容。该文件由程序的进程ID命名,具有固定的格式,即已知进程ID,就可推测出日志文件的文件名。生成的日志文件,其所属用户和用户组与jssu程序相同,且其权限可被实际登录用户当前设置的umask控制。
总结这两点,我们现在拥有一个以oracle用户即可执行,所属用户为root,设置了suid位,且可向当前工作目录输出文件的程序。由此,产生了一个符号链接攻击思路。
作为攻击者,我们以oracle用户登录,并启动jssu。如果能在jssu写入日志前,将输出文件定义成一个指向我们所需位置的符号链接,由于jssu程序运行时具有root用户权限,这样我们就得了向任意位置写入文件的能力。且此文件所属用户为root,用户组为oinstall,读写权限可控。也就是说,得到的文件可以被oracle用户修改。由此延伸,将符号链接指向/etc/ld.so.preload,文件产生后,我们就可以用oracle用户修改这个文件。/etc/ld.so.preload文件可以控制系统中所有进程启动时预先加载的动态链接库,正常情况下只有root用户可以修改。而攻击成功后,oracle用户就可以修改这个文件,指定一个由我们控制的动态链接库文件,我们就可以通过这个动态链接库拿一个root用户的shell,更详细的说明请见下一节。
攻击流程
1.作为准备,复制一个shell程序(/bin/bash)作为备份,在后面步骤中将会修改这个备份的权限,使执行者可以拿一个root用户权限的shell。
2.构建一个动态链接库,即“攻击思路”中提到的将要通过/etc/ld.so.preload加载到所有进程中的动态链接库。使用我们定义的函数”覆盖“默认的geteuid函数,新函数的逻辑非常简单,判断当前进程的有效用户是否为root,如果是则修改之前准备好的shell程序备份的权限为04777(所有用户可读写,suid位已设置),修改所属用户和用户组为root。
3.构建一个可执行程序,完成调用jssu和制作符号链接的工作。程序主体首先设置umask为0000,然后使用fork创建一个子进程。子进程启动jssu程序;父进程则通过子进程ID,构造出jssu将要写入的日志文件名,提前使用这个文件名生成一个指向/etc/ld.so.preload的符号链接。父进程等待一段时间(保证jssu有输出),杀掉子进程。如一切顺利,此时/etc/ld.so.preload已经被创建,所属用户root,所属用户组oinstall,权限0666,内容为jssu的输出日志。
4.修改/etc/ld.so.preload,将已准备好的动态链接库路径写入,覆盖所有jssu的输出。
5.等待一个root权限进程调用geteuid函数,触发我们准备的动态链接库中的代码。这一步我们可以直接在命令行运行“sudo 2>/dev/null >/dev/null”,这个程序满足我们的需求,结束后动态链接库中的代码已经被执行,我们准备的shell程序备份的运行权限和所属用户已经按我们的需求做了修改。此时,任意用户都可以通过在命令行运行这个shell备份获得一个root权限的shell。
6.运行已经修改好的shell程序备份,拿到root权限shell。
完整的攻击链
总结CVE-2019-2444漏洞技术细节,其实现的是在本地将oracle用户权限提升为root用户权限。在现实环境中,运行Oracle数据库的服务器上,oracle用户也是一个很高权限用户,并不会轻易泄露,那这个漏洞利用是不是就没有价值了呢?
并非如此,CVE-2019-2444漏洞的利用只是完成了一个攻击链的最后一步,即拿到root权限,达到完全控制。实际上,在相同版本的Oracle数据库中还存在着的其他的漏洞,可以与CVE-2019-2444配合,组成一个完整的攻击链。例如:cve-2018-3004,此漏洞利用可通过Java反序列化向量绕过Oracle JVM内置的安全机制,达到提升用户权限的目的。在漏洞细节已在互联网公布,本文只梳理其关键技术点,具体细节可参考以下链接:
http://obtruse.syfrtext.com/2018/07/oracle-privilege-escalation-via.html
关于CVE-2018-3004
Oracle内置了Java虚拟机,用户可以使用Java语言来构建存储过程,但出于安全原因,Oracle JVM会严格限制低权限用户对于文件系统的使用,例如使用java执行本地程序,访问本地文件等。而CVE-2018-3004漏洞,借助Java的XML反序列化方法,绕过了Oracle JVM的限制,从而可以直接访问数据库本地文件系统 。
Java的序列化和反序列化的作用是将JVM运行时存在于内存中的Object转化成能够长期保存的字节流,在将来所需时,可以将字节流重新组装得到原先的Object。序列化和反序列化可以将Java的Object“持久”化,摆脱JVM生存周期的限制 ,也可以用来在主机间进行传输。XML反序列化就是一种以XML格式来保存Java Object的标准,相关描述可见如下链接:
https://www.oracle.com/technetwork/java/persistence3-139471.html
XML反序列化,可以描述一个Java Object,以及用来构建Object时所需要调用的方法和相关参数。在Oracle中,使用XMLDecoder类重新组装XML序列化后的对象,而在组装过程中所调用的对象方法,没有被Oracle JVM限制权限。因此,可以使用XML反序列化构建一个FileWriter对象,并调用其write方法,就可以实现文件写入操作。
文件写入就是CVE-2018-3004的核心,利用此漏洞,低权限用户可以任意写入、追加或者覆盖oracle用户拥有写入权限的文件。在ssh服务已经开启的服务器上,如果向oracle用户ssh配置中authorized_key文件中写入一个由攻击者构造的公钥,此时,攻击者就可以直接ssh登录服务器的oracle用户。
总结
CVE-2019-2444是一个使用符号链接攻击手段,达到本地提权效果的漏洞,攻击者可由oracle用户权限提升至root用户权限 ;CVE-2018-3004是一个使用Java反序列化攻击手段达到远程提权登录效果的漏洞,拥有数据库普通用户权限且可远程登录的攻击者可借由此漏洞ssh远程连接数据库服务器,并以oracle用户登录。两个漏洞结合起来,就可以让一个普通的数据库使用者获得数据库所在服务器的root权限。
相关推荐
- linux 查看当前应用内存状况,以及内存参数含义
-
1、查看进程号ps-ef|greptomcat2、查看当前内存分配,200ms打印一次jstat-gc进程号2001jstat-gc344802001S0CS1C...
- 如何显示 Linux 系统上的可用内存?这几个命令很好用!
-
在Linux系统中,了解可用内存是优化系统性能、故障排查以及资源管理的重要一环。本文将详细介绍如何在Linux系统上显示可用内存,包括多种方法和工具的使用。在讨论可用内存之前,我们需要了解一些...
- Linux 下查看内存使用情况方法总结
-
Q:我想监视Linux系统的内存使用情况,在Linux下有哪些视图或者命令行工具可用呢?在做Linux系统优化的时候,物理内存是其中最重要的一方面。自然的,Linux也提供了非常多的方法来监控宝贵的内...
- 2、linux命令-用户管理
-
linux命令-用户管理用户切换[root@eric~]#sueric#切换到用户eric[eric@ericroot]$[eric@ericroot]$su#切换到rootPas...
- Centos 7 进入单用户模式详解
-
1、开机在启动菜单按e进入编辑模式找到linux16行,在最后添加init=/bin/sh编辑完后,按ctrl+x退出2、进单用户模式后,使用passwd修改密码,提示以下错误:passwd:Aut...
- 每日一个Linux命令解析——newusers
-
newusers:在Linux系统中,newusers是一个用于批量创建用户的命令。它从一个文件中读取多行用户信息,每行描述一个用户的详细信息,并根据这些信息创建多个用户或对现有用户进行批量修改。一...
- openEuler操作系统管理员指南:管理用户与用户组
-
在Linux中,每个普通用户都有一个账户,包括用户名、密码和主目录等信息。除此之外,还有一些系统本身创建的特殊用户,它们具有特殊的意义,其中最重要的是管理员账户,默认用户名是root。同时Linux也...
- Linux用户管理
-
1、用户信息文件/etc/passwdroot:x:0:0:root:/root:/bin/bash第一列:用户名第二列:密码位第三列:用户ID0超级用户UID。如果用户UID...
- centos7基础-用户、组、权限管理
-
用户和组(1)用户、组、家目录的概念linux系统支持多用户,除了管理员,其他用户一般不应该使用root,而是应该向管理员申请一个账号。组类似于角色,系统可以通过组对有共性的用户进行统一管理。每个用户...
- LINUX基础 ----------组及用户的概念
-
在Linux中,用户和组都是非常重要的概念,可以控制文件访问权限和资源的管理。用户是标识一个进程、应用程序或系统管理员的账号,Linux中每个用户用一个用户ID(UID)来标识。对于一个...
- 从零入门Linux(四)用户与权限管理
-
在Linux系统中,用户和权限管理是系统安全的重要组成部分。通过合理配置用户和权限,可以确保系统的安全性和资源的合理分配。以下是一些与用户和权限管理相关的常用命令和概念。1.用户管理1.1添加...
- 如何在 Linux 中管理用户?
-
在Linux系统中,用户是系统资源的主要使用者,每个用户都有一个唯一的标识符(用户ID)。为了更好地组织和管理用户,Linux还引入了用户组的概念。用户组是用户的集合,有助于更有效地分配权限和资...
- 在 Linux 中将用户添加到特定组的四种方法
-
在Linux多用户操作系统中,用户组管理是系统安全架构的基石。通过合理的组权限分配,管理员可以实现:精确控制文件访问权限(chmod775project/)简化批量用户权限管理(setfacl-...
- 我不是网管 - 如何在Ubuntu Linux下创建sudo用户
-
Sudo用户是Linux系统的普通用户,具有一定的管理权限,可以对系统执行管理任务。在Linux中,root是超级用户,拥有完全的管理权限,但不建议将root凭证授予其他用户或作为r...
- Linux创建普通用户,为密钥方式登录做准备
-
Hi,我是聪慧苹果8,就是江湖上人见人爱、花见花开,土到掉榨的Linux爱好者,一起学习吧!上一篇关于SSH安全加固的文字,有网友点评通过密钥登录更加安全,先创建一个普通用户,拒绝直接使用密码登录,这...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle忘记用户名密码 (59)
- oracle11gr2安装教程 (55)
- mybatis调用oracle存储过程 (67)
- oracle spool的用法 (57)
- oracle asm 磁盘管理 (67)
- 前端 设计模式 (64)
- 前端面试vue (56)
- linux格式化 (55)
- linux图形界面 (62)
- linux文件压缩 (75)
- Linux设置权限 (53)
- linux服务器配置 (62)
- mysql安装linux (71)
- linux启动命令 (59)
- 查看linux磁盘 (72)
- linux用户组 (74)
- linux多线程 (70)
- linux设备驱动 (53)
- linux自启动 (59)
- linux网络命令 (55)
- linux传文件 (60)
- linux打包文件 (58)
- linux查看数据库 (61)
- linux获取ip (64)
- linux进程通信 (63)