作者:tombkeeper pgn 來源:www.loveling.net/駭客基地
本文的內容是如何利用IIS本身的一些特性建立後門。當然,這主要是一份供網路系統管理員和網路安全工作人員參考的“Know Your Enemy”類文檔,作者希望這篇文章能夠對檢查和清除後門有所協助,而並不鼓勵或贊同利用本文的技巧進行違法活動。
首先簡單介紹一下IIS的設定檔MetaBase.bin。這個檔案位於%SystemRoot%system32inetsrvMetaBase.bin,包含了幾乎所有IIS的配置資訊,是非常重要的系統檔案。簡單的說,我們在“intenet服務管理員”中所作的一切設定最終都會被儲存在MetaBase.bin中。在日常的系統管理中除了通過“intenet服務管理員”來對MetaBase.bin進行操作外,Windows還提供了一個指令碼adsutil.vbs可以對MetaBase.bin進行操作。
MetaBase的結構類似於註冊表,也是樹形結構,有類似鍵、值、項的概念。事實上在IIS3和PWS中,MetaBase的內容就是儲存在註冊表中的。MetaBase有兩個主鍵:LM和Schema。其中,Schema儲存了系統預設的一些配置,通常不需要修改,一旦改錯也非常危險,所以無論是“intenet服務管理員”還是adsutil.vbs都沒有提供修改Schema的機制。LM中包含了IIS的HTTP服務,FTP服務,SMTP服務等的配置資訊。其中,LM/W3SVC/下是我們要用到的HTTP服務的配置資訊。
幾個下面會提到的值:
LM/W3SVC/InProcessIsapiApps,進程內啟動ISAPI。這是一個數組,裡麵包含的是一組指向一些ISAPI的路徑。在這個數組裡面的ISAPI啟動並執行時候都是由inetinfo.exe直接啟動的,繼承inetinfo.exe的local system許可權;而不在其中的ISAPI則是由svchost.exe派生的dllhost.exe進程啟動的,啟動並執行身份是IWAM_NAME,當然,這是IIS預設的安全層級“中”的情況下,如果設為低,那麼所有ISAPI都會由inetinfo.exe直接派生。另外,如果設定的時候不指定路徑,而是僅指定一個副檔名,那麼任何路徑下的同名ISAPI在被調用的時候都會以system許可權執行。
ScriptMaps,指令碼映射。在某個目錄下設定該值後,則向該目錄請求的特定副檔名的檔案會交給指定的ISAPI執行。需要強調的是,設定ScriptMaps的目錄並不一定要真實存在的,只要在MetaBase中某個HTTP執行個體的root鍵下建了一個子鍵,對該字鍵同名目錄的HTTP請求IIS會認為是合法的,並會交由映射的ISAPI處理。這也算是IIS的一個問題吧。
CreateProcessAsUser,在某個目錄下指定改值為0,則該目錄下的應用程式會繼承inetinfo.exe的local system許可權。
AccessWrite,決定某個目錄是否允許寫入,也就是WEBDAV的PUT方法。
AccessExecute,決定某個目錄是否允許執行應用程式。
後門思路:
建立一個特定副檔名的指令碼映射,指向我們的ISAPI,並把該ISAPI添加到InProcessIsapiApps列表中。那麼我們向伺服器請求該副檔名類型檔案時就會在伺服器上以local system許可權執行該ISAPI,且所請求的檔案並不需要是真實存在的。
技巧:
1、既然並不需要真的建一個目錄來設定ScriptMaps,那麼就可以唯寫一個鍵,並給這個鍵加上ScriptMaps。這樣,從“intenet服務管理員”裡是看不出這個目錄的,更看不到這個ScriptMaps。
2、雖然“intenet服務管理員”裡面看不出來,但是有經驗的管理員可能習慣於偶爾用adsutil.vbs enum /p來看一下:
# adsutil.vbs enum /p /w3svc/1/root
Microsoft (R) Windows Script Host Version 5.6
著作權(C) Microsoft Corporation 1996-2001。著作權所有,並保留一切權利。
[/w3svc/1/root/_vti_bin]
[/w3svc/1/root/evildir]
這樣就暴露了。因為我們設的那個鍵並不是真實存在的虛擬目錄,只是設定檔中的一個字串,所以可以使用0x08這樣的字元來做索引值。0x08是Backspace鍵對應的16進位值,控制台上顯示的效果是向左邊刪除一個字元,其實就是把“/”給刪了:
# adsutil.vbs enum /p /w3svc/1/root
Microsoft (R) Windows Script Host Version 5.6
著作權(C) Microsoft Corporation 1996-2001。著作權所有,並保留一切權利。
[/w3svc/1/root/_vti_bin]
[/w3svc/1/root]
面對這種輸出,一般人是不會留意的。
當然也可以設為類似_vti_script,_vti_bin這樣的名字,只要不設KeyType,在“intenet服務管理員”中是看不見的。
因為系統中本身InProcessIsapiApps中有一個WINNTSystem32msw3prt.dll,是.printer的映射,一般用不上。我們可以刪掉D:WINNTSystem32msw3prt.dll的值,換上WINNTSystem32inetsrvmsw3prt.dll。
美中不足的是HTTP請求會留下痕迹,但是HTTP也有好處,那就是可以隨便用一個Proxy 伺服器做跳板。另外,也可以用插入0x0D 0x0A來偽造日誌的方法,(詳見《Apache,IIS等多種http伺服器允許通過發送斷行符號符偽造日誌》一文)這就是構造目錄的技巧了。
具體實現:
當然可以用adsutil.vbs手工來加。不過需要注意,adsutil.vbs只能設,不能改,所以用adsutil.vbs的時候一定要把原先的也加上,否則原先的就會丟失。不同條目之間用空格分開。
先用下面命令取得當前的InProcessIsapiApps列表: adsutil.vbs get /W3SVC/InProcessIsapiApps
取到之後把自己的ISAPI路徑也加進去。 adsutil.vbs set /W3SVC/InProcessIsapiApps "C:WINNTSystem32idq.dll" "C:WINNTSystem32inetsrvhttpext.dll" ………………
ScriptMaps的設定同InProcessIsapiApps。
當然這樣比較麻煩,也無法寫入0x08這樣的索引值,所以我乾脆自己寫個VBS一次性搞定。至於那個做後門的ISAPI,能實現的功能就完全取決於想象力了。這裡是一個簡單例子的螢幕拷貝:
# nc 10.11.0.26 80
POST /%08/anything.tom
Microsoft Windows 2000 [Version 5.00.2195]
(C) 著作權 1985-1998 Microsoft Corp.
C:WINNTsystem32>whoami
NT AUTHORITYSYSTEM
C:WINNTsystem32>exit
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Wed, 08 Jan 2003 06:49:37 GMT
更隱形方法是寫一個特殊的ISAPI,並註冊為解析asp的。通常情況下,該程式把收到的請求轉給系統原來的asp.dll,並把結果返回,當收到一個特殊POST請求時就啟動自己的後門代碼,這樣日誌裡面也不會有什麼顯示。審核時也很難發現。
除了上面所述利用指令碼映射的方法外,還可以賦予某個虛擬目錄AccessWrite和AccessExecute許可權。需要運行後門的時候利用WEBDAV上傳ISAPI,然後運行,使用完了再刪除。(是否能刪除?還是需要restart W3SVC ?我沒有實驗。)如果上傳的不是DLL而是EXE檔案,那麼把該目錄下的CreateProcessAsUser設為0也可以獲得local system許可權,這個方法早有人撰文論述。但AccessWrite和AccessExecute的改變都可以在“intenet服務管理員”中看出來,隱蔽性就差了。