Oracle漏洞分析(tns_auth_sesskey)
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。