操作無許可權的MSMQ隊列
本文地址:http://www.cnblogs.com/AndersLiu/archive/2009/06/25/manipulate-msmq-without-permission.html
作者:Anders Liu
摘要:在操作MSMQ隊列的許可權時一定要小心,如果意外地刪除了自己的存取權限,即便自己是管理員,也無法對隊列進行操作,尤其是無法刪除該隊列。本文將介紹一種方法,可以繞過MSMQ的許可權控制,只要自己是管理員,能夠操作C:\Windows\System32中的檔案,即可獲得對任意隊列的操作權。
首先,我們重現一個這樣的“死”隊列。在訊息佇列的管理器中建立一個隊列(私人或公有均可),命名為test。按右鍵該隊列,選擇Properties,然後進入Security選項卡,在視窗上部選擇Everyone,並在視窗下部的許可權列表中,勾選第一行Full Control對應的Deny複選框,最後單擊OK按鈕。
這樣,我們就對所有人禁用了對該隊列的一切操作。現在,包括系統管理員在內的任何使用者都無法操作該隊列,如查看屬性或刪除隊列等操作均無法進行。
註解
為了方便通過搜尋引擎找到本文,這裡列出查看屬性和刪除隊列時的提示資訊。
查看屬性:
The properties of PUBLIC=e808d736-9552-4e78-8f8e-fbb7710d3005 cannot be obtained.
Error: The queue does not exist or you do not have sufficient permissions to perform the operation.
刪除隊列:
\test cannot be deleted.
Error: The queue does not exist or you do not have sufficient permissions to perform the operation.
解決的方法如下:
開啟該目錄:C:\Windows\System32\msmq\storage\lqs,對於Vista及以上版本的作業系統,UAC會彈出提示,需要提升許可權。因此,該方法要求操作者必須具有管理員權限。
在該目錄下可以看到一些以16進位數字命名的檔案,其中每個檔案都對應著一個訊息佇列的配置。這些檔案都是純文字檔案,可以使用記事本等類似程式開啟。其內容類別似於:
[Properties]Type=00000000-0000-0000-0000-000000000000Instance=e808d736-9552-4e78-8f8e-fbb7710d3005BasePriority=0Journal=00Quota=4294967295JournalQuota=4294967295CreateTime=1245907917ModifyTime=1245907918QueueName=\testLabel=testAuthenticate=00PrivLevel=1Transaction=00Security=01000480e8280000042...Signature=MSMQStorageTimeStamp=cd0b434a
其中的QueueName欄位指明了對應隊列的路徑(名字)。通過遍曆每個檔案,即可找到我們剛剛建立的test隊列。其中的Security欄位就是隊列的許可權配置,其值是一長串16進位數字,這裡限於篇幅只截取了前面若干個字元。
因此,不管當前操作者是否真的具有修改隊列許可權的許可權,只需要修改Security欄位的值就能修改隊列的許可權。
我們並不知道這個欄位值的實際格式是什麼,但可以使用一種取巧地方法——建立一個隊列(此時往往具備對該隊列進行操作的所有許可權),並將新隊列的Security欄位值複製給當前隊列即可。
下面建立一個隊列test2,不要修改其屬性。再到C:\Windows\System32\msmq\storage\lqs下找到對應於test2隊列的檔案,將Security欄位的值複製下來,並用該值覆蓋test隊列檔案中的欄位值即可。
(完)