首页 > 技术文章 > Oracle漏洞分析(tns_auth_sesskey)

justforfun12 2016-03-08 21:21 原文

 p216 Oracle漏洞分析:

在服务中开启跟oracle相关的所有服务。

开启oracle:

C:\oracle\product\10.2.0\db_1\BIN\sqlplus.exe /nolog
conn sys/mima1234 as sysdba
startup

 

用IDA Pro打开c:\oracle\product\10.2.0\db_1\BIN\oracle.exe,通过shift+f12打开string subview,查找字符串"AUTH_SESSKEY":

 

用OllyDbg附到oracle.exe进程上,按照书上说的搜索"AUTH_SESSKEY",都是显示 Item Not Found..

原来我漏了一点,要先选择可执行模块oracle.exe。

回到代码中可以看到,这三段代码在引用"AUTH_SESSKEY"后,都调用了模块oracommon10.dll的kpzgkvl函数。

 查找kpzgkvl函数的地址:右键->search for->name in all modules,找到这几个kpzgkvl

按我的理解,应该选择在oracommon10模块中靠前的那个地址,即0x60FD99AC。

在函数kpzgkvl的起始地址处0x60FD99AC下断点,运行起来

但是总是停在这一处上,多次按f9或ctrl+f9也没用。

 

将Ollydbg v1换成Ollydbg v2后则成功断到kpzgkvl处:

ctrl+f9跳出kpzgkvl后,会调用__intel_fast_memcpy函数,栈中如下

 

 在栈中查看fs:[0]处的SEH结构体,如下:

向0x07FEDA96处复制0x1A7字节的数据,最终覆盖到0x07FEDC3D处,而没有覆盖到SEH所在的0x07FEDC40处。

在源地址0x080099A4开始的内存中找到我们构造的返回地址0x011B0528:

 

为了将这个地址覆盖到0x07FEDC44处SE handler的位置上,就要使SE handler地址到目的地址的距离 (0x07FEDC44 - 0x07FEDA96 = 0x1AE) 与返回地址所在地址到源地址处的距离 (0x08009B42 - 0x080099A4 = 0x19E) 相等。

而目前这两个距离相差0x10,所以我们要在返回地址前补充0x10字节的数据。

打开/opt/metasploit/msf3/modules/exploits/windows/oracle/tns_auth_sesskey.rb,修改了2处如图所示:

 

 重启OracleServiceORCL服务后重新攻击,成功:

 

总结一下漏洞利用过程,实施攻击后,局部变量被覆盖导致内存访问异常,程序进入SE Handler,即我们改写的覆盖地址,跳转到POP/POP/RET段,然后回到Next SEH处,这里已被改写为jmp 06,跳转到后面执行向前长跳转指令jmp $-,再跳到所构造字符串的前端执行payload。

推荐阅读