在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安全
策略管理單元下更改"用戶權力指派"下的策略。
結束語
空連接創建是爲了便利內部平臺通訊,特別是在服務級上,然而,使用空連接也對可能
危及系統安全的匿名用戶暴露了信息。如果可能的話,從你的系統上完全消除空連接,
如果因爲其它原因不可能實現,採取所有可能的預防措施確保只暴露你想暴露的信息。
如果沒有的話,空連接能提供一個便利的入口進出你的系統,它可能導致安全危險。