本文将向大家展示一种黑客入侵数据库的方法,希望能引起大家的警惕。想知道黑客入侵数据库的方法首先要深究黑客入侵数据库的目的。经过调查发现黑客入侵者入侵数据库的最终目标要么是获取数据库敏感数据、要么是获取数据库控制权限、要么是获取数据库所在操作系统控制权限、要么是获取数据库所在网络环境的部分控制权限。其中获得任意的访问权限是达成上述目的的第一步(无论是数据库控制权还是数据库所在操作系统控制权)。
对于没有用户名和密码的黑客来说,绕过身份验证的过程成了整个过程的第一步。绕过身份验证的方法有很多,其中最常规的是利用数据字典离线或在线暴力破解用户名密码。本文给大家揭示的是高级黑客采用的绕过身份验证的办法——利用oracle组件XDB存在的缓冲区漏洞,直接绕过身份验证获取ORACLE所在系统控制权限和oracle控制权限。
身份验证和Oracle的XDB组件
在这里首先给大家解释两个关键名词。
1.身份验证。通俗的说就是数据库客户端在登录数据库的时候,客户端输入的账号和密码通过数据库校验的过程。一般黑客攻破身份验证有2种方式:方式一,研究身份验证原理,通过破解的方式破解身份验证。方式二,想办法不通过身份验证登录数据库,也就是说绕过身份验证。本文给大家揭示的利用XDB缓冲区溢出漏洞就是绕过身份验证的方法之一。
2.Oracle的XDB组件。XDB组件是oracle上提供XML服务能力的组件,从Oracle9i之后,会作为缺省安装项。安装完XDB后,在启动Oracle时,有两个服务:HTTP(默认端口为8080)和FTP(默认端口2100)会缺省启动。这里的FTP服务是Oracle自身的FTP服务,不是标准的FTP服务,在这个FTP服务中进行的身份验证,将会使用Oracle数据库的用户名/密码。在Oracle提供的这个版本的FTP服务中存在一个巨大的缓冲区漏洞,通过这个漏洞我们即可以攻占Oracle所在的操作系统。
漏洞验证
查询TNS会看到该服务是否启动
上图中红色标记的部分就显示出XDB组件中的FTP服知道该用户名对应的密码。
通过一定的手段确定数据库IP地址后用FTP访问数据库。FTP访问的方式是ftp://databasehost:端口号 用户名/密码的书写格式。虽然oracle对用户输入的每一个参数都进行的长度验证,但XDB身份验证操作中的PASS命令缺乏对由用户名密码等信息组合成的字符串的长度进行合理限制。导致当向PASS命令的执行函数中传入过长字符串会造成函数缓冲区溢出,然后利用溢出的字符串去改变栈(栈缓冲区溢出可以参考《windows缓冲区溢出原理(栈)》一文)的返回地址为shellcode的初始地址。通过shellcode黑客控制住了数据库所在的操作系统。
如下图所示:
上图采用的漏洞验证工具是安华金和的DBHaker工具。至此我们已经模拟黑客完成了通过XDB中缓冲区溢出漏洞来绕过身份验证的过程。为了让大家更加直观务的状态和端口号。我们要利用的这个漏洞只需要知道目标数据库的ip地址和目标数据库确实存在的用户名(oracle有大量默认用户,所以真实的用户名很好获取。本例模拟黑客行为采用的是低权限用户scott),但并不必的感受该漏洞的危害,请大家点击右下角查看操作系统资源
这个shellcode会直接拉起目标数据库所在服务器的控制台。我们通过这个控制台就可以模拟黑客对目标数据库所在操作系统进行控制。上图中我们执行了net start 命令查询目标数据库所在操作系统的所有服务。此时我们可以直接对服务状态进行修改,来造成服务器宕机。如下图所示:
通过net stop OracleOraHome92TNSListener 来停止目标数据库上的TNS监听。模拟合法客户端去访问该数据库,直接报错无法连上该服务器。因为这种方式我们可以控制管理员权限的系统账号,所以可以整个操作系统做任何变化。
下面我们用获得的操作系统权限来通过数据库身份验证。Oracle数据库支持2种身份验证方式。其中一种是通过本地操作系统权限来验证。如下图所示:
用本地操作系统账号进行oracle登录身份验证。由于我们已经控制了操作系统所以用这种方式可以直接用数据库sysdba权限的sys账号登录。直接查询只有sysdba可见的存储数据库全部用户名和密码视图
图中读取的就是目标机器上数据库中的所有用户名和密码。密码可以通过离线破解。当然黑客都用SYS登上了数据库,完全可以通过执行“alter user scott identified by 新密码” 直接修改任意用户的密码。
如果黑客无法通过sqlplus \"/ as sysdba\" 直接本地登录。报错如下图:
这是由于目标机器上的sqlnet 中缺少 “SQLNET.AUTHENTICATION_SERVICES= (NTS)”。这句话导oracle不允许采用这种本地登录的方式。黑客只需要执行:
type C:/oacle地址/network/admin/sqlnet.ora 就可以查询目标数据库是否允许采用通过本地操作系统权限验证的方法。如下图:
删除原来的sqlnet del/f/s/q C:/oacle地址/network/admin/sqlnet.ora 重新写一个sqlnet 允许用本地操作系统登录:
echo SQLNET.AUTHENTICATION_SERVICES= (NTS)> C:/oacle地址/network/admin/sqlnet.ora
一个小小的漏洞,黑客可以利用其一步一步控制整台机器,整个数据库甚至整个网络。这个漏洞虽然是oracle上的,但却最终直接获取了操作系统权限。同理,一些软件或硬件的漏洞也可能最终危害到数据库。所以我们需要警惕所有漏洞,或许这些漏洞和我们的核心业务关系不大,但这些漏洞如果没有及时被修复,很可能是成为整个数据库、服务器、乃至网络的定时炸弹,随时可能爆发。
对抗XDB漏洞的建议
在对抗XDB漏洞的时候,安华金和数据库攻防实验室建议您:
1.若不需要Oracle的XML数据库功能,建议不进行安装,若是已经安装了,但没有用处,建议关闭XDB,关闭方法如下:
编辑$ORACLE_HOME/dbs/initSID.ora文件,去除如下行: dispatchers=\'(PROTOCOL=TCP) (SERVICE=XDB);然后重启数据库。也可以在Oracle下,以system身份登录,运行:drop user xdb cascade;
2.如果您需要XDB提供的服务,那么请去oracle官网下载相关补丁来修复XDB可能存在的缓冲区溢出漏洞。
3.如果由于应用等各种原因,无法对数据库进行补丁提升且还需要使用XDB提供的服务,那么请您在您的数据库和网络之间加入带有VPATCH功能的数据库防火墙,来保护您的数据库免受XDB漏洞攻击。