在NT/2000下的空連接

 

 

在NT/2000下的空連接

 

 

謎語:"什麼時候是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安全

策略管理單元下更改"用戶權力指派"下的策略。

 

結束語

 

空連接創建是爲了便利內部平臺通訊,特別是在服務級上,然而,使用空連接也對可能

危及系統安全的匿名用戶暴露了信息。如果可能的話,從你的系統上完全消除空連接,

如果因爲其它原因不可能實現,採取所有可能的預防措施確保只暴露你想暴露的信息。

如果沒有的話,空連接能提供一個便利的入口進出你的系統,它可能導致安全危險。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章