Windows NT/2000下的空串連
發布日期:2002-03-28
文摘內容:
日期:2002-03-11
作者:Joe Finamore
概述
謎語:"什麼時候是NULL而不是null?"
答案:"當它是一個空串連時。"
空串連是在沒有信任的情況下與伺服器建立的會話,此文將討論在NT4.0及Windows
2000下的空串連問題,將研究串連的使用及弱點,同時將顯示如何控制和消除這些弱
點。
在NT 4.0下的LANMAN會話
在我們開始討論空串連之前,我們需要知道串連是什麼,有一個非常好的關於NTLM驗證
的討論在URL:
http://www.[M$].com/msj/defaultframe.asp?
page=/msj/0299/security/security0299.htm
&nav=/msj/0299/newnav.htm
security/security0299.htm&nav=/msj/0299/newnav.htm
Windows NT 4.0使用挑戰響應協議與遠程機器建議一個會話,這個會話是一個安全隧
道,通過它參與隧道的機器之間可以互連資訊,這個事件的順序如下:
1) 會話要求者(客戶)對會話接收者(伺服器)傳送一個資料包,請求安全隧道的建
立。
2) 伺服器產生一個隨機的64位元(挑戰)傳送回客戶。
3) 客戶取得這個由伺服器產生的64位元,用試圖建立串連的帳號的口令打亂它,將結
果返回到伺服器(響應)。
4) 伺服器接受響應發送到本地安全驗證(LSA),LSA確認要求者身份通過使用使用者正
確的口令核實響應。如果要求者的帳號是伺服器的本地帳號,核實本地發生;如果請求
的帳號是一個域的帳號,響應傳送到網域控制站去核實。當對挑戰的響應核實為正確,一
個存取權杖產生,然後傳送給客戶。客戶使用這個存取權杖串連到伺服器上的資源直到
建議的會話被終止。
在Windows 2000下 LANMAN 會話 - Kerberos 驗證
Windows 2000使用Kerberos 建立一個會話"入場券",對Kerberos v5的RFC文檔可在下
面地址找到:
http://www.ietf.org/rfc/rfc1510.txt
事件發生的順序如下:
1) 客戶為一個TGT(票據授權票據)傳送一個請求到KDC(密鑰分發中心),這個請求
包含了用使用者口令散列演算法加密的預驗證資料,這個預驗證資料也在最後包含了一個保
證TGT不被截獲的時間戳記。KDC運行在承認入場券的網域控制站上。
2) KDC 從它的資料庫中提取使用者標識的散列,用它解密預驗證資料,如果解密進行有
一個非常近的時間戳記,進程繼續。
3) 伺服器產生一個TGT,它包含其它一些事項,如一個用使用者散列口令加密的會話
key,它也包含了標識使用者和所屬組的安全性識別碼(SID)。
4) 使用者使用使用者口令的散列解密會話key。
5) 客戶使用入場券訪問伺服器上的資源,客戶現在被驗證,一個會話建立。
用這種方式產生的入場券包含下面未加密的資訊:
發布入場券的Windows 2000 域的網域名稱
入場券標識的名字
入場券也包含了下面加密的資訊:
入場券"標記"
會話加密key
包含被發布入場券的使用者帳號的網域名稱
入場券被發布的使用者的主要的名字
會話開始時間
會話結束時間:當入場券到期,入場券有一個有限的使用到期日。
客戶機器的地址
包含客戶允許訪問資訊的驗證資訊
什麼是空串連?
現在我們理解了一個串連是什麼,串連包含的訪問到資源的驗證資訊,我們可以掀開空
串連的神秘面紗了。一個空串連是與一個伺服器的串連的建立,沒有使用者驗證執行。換
句話說,它是一個到伺服器的匿名訪問。在建立串連時沒有提供可信任的使用者名稱和口
令。存取權杖(在Windows 2000上的"驗證資料")包含對使用者的"S-1-5-7"的SID,一個
"ANONYMOUS LOGON"的使用者名稱,這個存取權杖包含下面偽裝的組:
Everyone
NETWORK
在安全性原則的限制下,這將授權訪問到上面兩個組有權訪問的一切資訊。
如何建立空串連
從一個使用者點來看,一個與伺服器的串連建立或在登陸時,或在其它任何需要訪問到服
務器資源時。例如,一個名為"BOB"的使用者希望訪問到名為"DATASTORE"的伺服器上共用
名為"DATA"的某些檔案,先前他並沒有驗證,他將發布下面的命令:
net use * //DATASTORE/DATA * /user:BOB
他將提示輸入他的口令,相關的驗證方法將去掉,假定他被驗證,他將產生一個"訪問
令牌"或"入場券",使用這些,他將能串連到希望的共用。
另一方面,如果空串連允許,"DATA"共用作為一個"空共用",他只需要簡單輸入:
net use * //DATASTORE/DATA "" /user:""
這將串連Bob作為一個匿名使用者到"DATA"共用,不需要提供使用者名稱或口令…一個駭客的
夢想!
空串連也能通過語言如C++建立在API對話上,一個使用WIN32 API調用建立空串連的如
下:
http://www.securityfocus.com/cgi-bin/vulns-item.pl
?section=exploit&id=494
空串連能使用來建立串連到"空串連具名管道",如果伺服器是如此配置的話。一個"管
道"是一個便利,它允許在一個系統上的進程與其它不同系統上的進程通訊。空串連也
通常對共用建立串連,包括系統共用如//servername/IPC$,IPC$是一個特殊的隱藏共
享它允許在同一個系統上的兩個進程間通訊(內部進程傳達),IPC$共用是在機器上對
伺服器處理序的一個分介面,它也關聯一個管道所以它能被遠端存取。
為什麼建立空串連?
這個問題邏輯上說是:"為什麼[M$]提供對空串連的支援?"在[M$]吹捧NT和Windows
2000的安全時,空串連不是或多或少繞過了驗證安全嗎?
在一般的感覺上,"是",空串連趨向於破壞作業系統的下層的安全結構。然而,有強制
性的原因合并它們進入[M$]的網路,空串連最初的目的是允許未驗證的機器從伺服器獲
得瀏覽列表。應該記得NT和Windows 2000在機器在組裡是作為"域",域是共用同樣安全
邊界的機器的集合,也就是說,它們共用著同樣的使用者和機器帳號資料庫,也包括串連
到彼此的口令。一個使用者口令通常在域中驗證一個使用者,一個機器口令通常去維護機器
之間和網域控制站之間的安全通道。在這兩樣上,口令通常在機器/使用者和網域服務器之間
建立一個信任尺寸。
如果所有的通訊是在域內部,空串連將是不需要的,這不是問題,然而,經常需要域之
間串連去執行下面的任務:
從一個不同域中的伺服器上得到瀏覽列表
驗證不同域中的使用者
這個問題通過域之間信任關係的概念來部分完成,信任關係是兩個不同域之間的一種協
作關係,通過一個域同意去信任其它域的安全完整性,因此在兩個域的控制器間允許信
息流。在建立信任關係時口令是被商議的,基本上,信任關係是兩個域間的一種驗證關
系。
問題是信任關係並不能解決在一個網站上內部串連的所有問題。例如,首先,建立信任
關係的進程,如果"DOMAIN1"希望與"DOMAIN2"建立信任關係,它需要聯絡那個域的PDC
為安全隧道協商一個口令,為實現此,它需要列舉域中的機器,決定"DOMAIN2"的PDC的
名字,有許多發現名字(隨後,地址)的方法,包括WINS、DNS、LMHOSTS、AD (活動
目錄)等。空串連使這個進程更容易實現,因為它允許從一個非驗證的機器上帶有極少
優先的知識直接列舉域中機器和資源。
有其它情節受益於空串連,例如,考慮到在多個域網站上的管理員,因某種原因,在所
有的域之間並沒有建立信任關係。在一個管理員的工作過程中,經常需要串連在所有域
中的資源,空串連使使用者、機器和資源的列舉更容易。
另一種情形,也需要空串連,就是LMHOSTS.SAM檔案使用"INCLUDE "標籤的環境下,包
含included檔案的共用點必須安裝為空白串連共用,關於這點的文章可以在以下網站找到
:
http://support.[M$].com/default.aspx?
scid=kb;EN-US;q121281
有一些更早一些的文章,最初是在1994年發布,但在8/8/2001更新,它應該被注釋掉
了,在NT 4.0 和Windows 2000 的模板LMHOSTS.SAM 檔案中,許多LANMAN 方面的在
Windows 2000中保留了下來。
在這也應該被提到的是,有許多賣主鼓吹在他們的軟體中空串連的使用,關於這些方面
一些有意思的文章在:
http://www.dcs.ed.ac.uk/home/archives/bugtraq/msg00784.html
這篇文章引用了一個賣主的一個安裝進程,它在伺服器上建立空串連去執行它的任務,
可以想象對伺服器而言是多危險,而管理員卻又沒意識到。
在最後一個空串連有用的例子下,一個服務,運行在本地"SYSTEM"帳號下,需要訪問到
網路某些資源,這僅僅可能如果資源通過一個空串連可訪問,在[M$]有關於此方面的文
章:
http://support.[M$].com/default.aspx?
scid=kb;EN-US;q124184
關於這個問題,[M$]並不推薦開啟空串連,然而,他們推薦使用使用者特定的帳號去運行
服務。
什麼是空串連的弱點?
現在我們對會話和空串連有了一個更好的理解,通常情況下,特別是空串連,表現出哪
些弱點呢?有幾個可能引起安全關注的原因,就如同我們無庸置疑地意識到,存取控制
列表(ACL),即一系列ACE(存取控制條目)的列表,控制著在NT或Windows 2000 域
中資源的訪問。一個ACE通過SID指定一個使用者/組,列舉使用者/組被允許或否認的許可權。
位於ACE的問題是授權對內嵌的組"Everyone",用NT的說法,"Everyone"意味著字面上
的每個人,如果"Everyone"組通過ACE有權訪問到一個資源,就意味著可以訪問那個資
源,如管道或共用,也對"Everyone"開放的,然後資源對任何人是匿名可訪問的。
那,包含哪些種類的事情呢?如果你執行一個NT4.0的out-of-the-box安裝,你將注意
到許多事情對"Everyone"都是可訪問的,特別是系統硬碟的根(通常C:/),一個顯著的
對"Everyone"開放的是包含修複資訊的檔案夾:
%SystemRoot%/Repair (通常:"C:/Winnt/Repair")
一對更敏感的檔案,如"sam._",有更限制性的安全要求,但檔案的大多數是位於可讀
的位置,為某種原因,如果一個共用點的父資料夾可用,共用是一個空串連,這個檔案
對任何匿名入侵者都是容易利用的。你也將注意到註冊的許多地區對"Everyone"是可訪
問的,這使串連到一個伺服器的IPC$共用成為一種可能,運行登錄編輯程式
(REGEDT32.EXE)去查看,甚至改變某些註冊表值…來自於匿名的便利。
另外通過空串連暴露的弱點是在域中使用者帳號的列舉,為什麼這是一個問題?因為它移
走了侵佔一個域帳號的一半的屏障,為偽裝成其他人,你需要兩部分資訊:
使用者名稱
密碼
一旦你知道了使用者名稱,它就僅僅只是一個猜測或破壞口令的問題了。如果你將域中已重
命名的管理員的帳戶(你肯定已重新命名了系統管理員帳戶,不是嗎?)暴露的話,那麼這種
弱點也就達到了它的頂點。入侵者只需串連一個空會話,然後枚舉使用者尋找SID為500的
使用者即可。可以在一下網站找到可完成此任務的例子代碼:
http://www.securityfocus.com/cgi-bin/vulns-item.pl
?section=exploit&id=494
這個弱點對著名的"紅色代碼攻擊"是一個非常重要的部分,它在NT4.0的SP3中得到解
決。
在一個域中機器或資源的枚舉也使得某人的闖入更容易,如果一個可以匿名得到域中所
有機器的名字,然後列出這些機器上的資源共用,這就變成一件很簡單的事情,儘力去
試所有的資源直到找到一個對"Everyone"是開放的。預設情況下系統硬碟的根對
"Everyone"是開放,預設共用級安全應用到一個新建立的共用授權"完全訪問"對
"Everyone",這個問題是顯然的。
如何保護以防範攻擊?
最好的阻止辦法是對所有範圍的可能不允許空串連,為做到這一點,攻擊的評估是一個
好的開始,"DumpSec"工具列舉系統上的共用,同時也對每個提供安全約束,它也關注
註冊表許可權執行其它有用的安全性稽核任務,DumpSec可以從以下得到:
http://www.systemtools.com/somarsoft/
有一對相關的註冊表鍵:
HKLM/System/CurrentControlSet/Control/Lsa
/RestrictAnonymous
"HKLM"參考登錄區"HKEY_LOCAL_MACHINE",如果設定為"1",匿名串連被限制,一個
匿名使用者仍然可以串連到IPC$ 共用,但限制通過這種串連得到資訊,"1"值限制了匿名
使用者列舉SAM帳號和共用;在Windows 2000 中增加了"2",限制所有匿名訪問除非特別
授權。
其它應該檢查的鍵為:
HKLM/SYSTEM/CurrentControlSet/Services/
LanmanServer/Parameters/NullSessionShares
和:
HKLM/SYSTEM/CurrentControlSet/Services/
LanmanServer/Parameters/NullSessionPipes
這些是MULTI_SZ (多線程的)註冊參數,它分別地列舉共用和管道,開啟空串連。如
果你不想開啟的話,確認沒有共用和管道開啟。也放置安全在這些鍵上確認不容易更
改,確認僅"SYSTEM"和"Administrators"有權訪問到這些鍵。
在Windows 2000,安全性原則中安全保護的地方,原則設定通過相關嵌入式MMC([M$]管
理控制台)。在一個網域控制站(DC)上,從"管理工具"中下拉式功能表"域安全性原則"MMC面
板,在非DC上,下拉式功能表"本地安全性原則"MMC面板,你將發現一個條目:
"對匿名串連的額外限制"
在3個可能設定的值:
"無。依賴於預設許可許可權"
"不允許枚舉SAM帳號和共用"
"沒有顯式匿名許可權就無法訪問"
最後的值是最安全的,它相當於"2"在註冊表值:
HKLM/System/CurrentControlSet/Control/
Lsa/RestrictAnonymous
上面討論的,確信檢驗"有效設定",在其它水平上的原則設定能影響"有效設定"。
其它明智的步驟是限制註冊表的訪問,在Windows 2000 和以後版本中預設只有僅管理
員和備份操作員有權網路訪問到註冊表,它是一個好的主意,在你的伺服器上檢查遠程
註冊表訪問設定,可以通過確認安全許可權在以下註冊鍵中來完成:
HKLM/System/CurrentControlSet/Control/
SecurePipeServers/winreg
當一個使用者企圖串連到遠端電腦的註冊表時,在目標機器上的"server"服務檢查上述
(winreg)鍵的存在,如果這個鍵不存在,使用者允許串連到目標機器的註冊表,如果鍵
存在,在鍵上的ACL被檢查,如果ACL給使用者讀或寫的訪問,使用者可以串連到註冊表。一
旦使用者允許遠端連線到註冊表,在單獨鍵上的ACL開始生效。例如,如果在一個給定鍵
上安全設定為對"Everyone"允許"讀"訪問,通過空串連匿名"讀"訪問到註冊表是可能
的,不是一個好的想法!它將使人擔心和危險的,從所有註冊鍵中移走對"Everyone"的
遠程安全,所以最好的想法是不允許訪問除非特定的帳號和組。有幾個值在"winreg"鍵
也應用,這些值在NT4.0是:
HKLM/.../winreg/AllowedPaths/Machine
HKLM/.../winreg/AllowedPaths/Users
這兩個值是MULTI_SZ類型的,在Windows 2000下,預設沒有"Users"值,這些鍵分別枚
舉哪些註冊鍵對機器和使用者的遠端存取是開放的。它們能覆蓋在"winreg"鍵上的安全,
機器可能需要訪問對某些服務如目錄複寫和假離線列印,有兩篇關於此方面的文章也包
括了遠端登錄訪問的細節:
http://support.[M$].com/directory/
article.asp?ID=KB;EN-US;Q186433
http://support.[M$].com/directory/
article.asp?ID=kb;en-us;Q153183
這是一個好的想法,在伺服器上安裝完軟體後,確認安裝進程沒有開啟任何空串連共用
和管道,事實上,在一個"真實"伺服器上安裝前先在一台實驗機上測試總是一個好的主
意,特別是如果這台伺服器是放在DMZ區或外部LAN。匿名訪問到一台公網或半公網的機
器將是損失慘重的。
也需要記住的是對一個空串連安全性權杖包含兩個預設組"Everyone"和"NETWORK",你可
以定位在卷上檔案的具體位置,通過更改許可權來進行保護。當然這些卷必須是NTFS。除
非你確實需要一個空串連來訪問資源,否則用內建群組"Authenticated Users"替代
"Everyone"組。XCACLS或一個第三方的存取控制管理軟體可完成此任務。然而,進行這
樣的操作一定要小心,尤其是用於子檔案夾時。當用XCACLS時一定要開啟"/E"選項,以
確認是在編輯ACL而不是替代它們。在所有發現"Everyone"組的地方,將其刪除,同時
把相同的許可權添加給"Authenticated Users"組。另外,每建立一個共用時,一定要將
"Everyone"組從ACL中刪除,代以"Authenticated Users"或合適的使用者或組。
最後一步能採用的是設定策略對:
"從網路上訪問電腦"
如果"Everyone"組享有這種特權的話,從組中移走,在從"Everyone"組撤走前確保添加
這個特權給相應的使用者和組。在NT4.0下,如果為一個非DC的機器上通過"使用者管理員
",在一個網域控制站上通過"域使用者管理員"實現。在Windows 2000下通過在相應MMC安全
策略嵌入式管理單元下更改"使用者權力指派"下的策略。
結束語
空串連建立是為了便利內部平台通訊,特別是在服務級上,然而,使用空串連也對可能
危及系統安全的匿名使用者暴露了資訊。如果可能的話,從你的系統上完全消除空串連,
如果因為其它原因不可能實現,採取所有可能的預防措施確保只暴露你想暴露的資訊。
如果沒有的話,空串連能提供一個便利的入口進出你的系統,它可能導致安全危險。