史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > Hacker/Cracker 及加解密技術文件
忘記密碼?
註冊帳號 論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2006-02-21, 01:24 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 密碼與Crack工具研究

密碼與Crack工具研究

由於Unix是Internet最流行的伺服器操作系統,因此它的安全性倍受關注。這種安全主要靠密碼實現。Unix的密碼僅僅儲存於在一個加密後的文本文件中,文件一般儲存在/etc目錄下,名稱為passwd。歷史上,Unix密碼加密算法曾經歷過幾次修正,現在普遍採用DES算法。用DES算法對密碼文件進行25次加密。而對每次DES加密產生的結果,都要用2的56次方次搜尋與匹配才能進行一次遍歷,所以理論上要破解這樣的密碼,其工作量是很大的。

  本文先介紹Unix 密碼文件的格式以及密碼加密的原理;接著講述如何構造一個密碼Crack程序;最後以John the Ripper做密碼攻擊的測試,分析實驗結果,並指出密碼安全的建議。

1.1 Unix 密碼文件的格式及安全機制
  /etc/passwd文件是Unix安全的關鍵文件之一,在不同的Unix系統中,它的儲存於路徑略有不同,參見表5.1。該檔案用於用戶登入時校驗用戶的密碼,僅對root權限可寫。

表1.1 不同Unix系統中密碼文件的儲存於路徑

Unix系統 路徑

UNICOS /etc/udb
Ultrix4 /etc/auth
SystemV Release 4.2 /etc/security
SystemV Release 4.0 /etc/shadow
SunOS 5.0 /etc/shadow
SCOUnix /tcb/auth/files/
OSF/1 /etc/passwd
Linux1.1 /etc/shadow
HP-UX /.secure/etc/passwd
BSD4.3 /etc/master.passwd
AIX3 /etc/security/passwd
IRIX5 /etc/shadow


  密碼文件中每行代表一個用戶 列項,格式為:
LOGNAME : PASSWORD : UID : GID : USERINFO : HOME : SHELL

  每行的頭兩項是登入名和加密後的密碼,後面的兩個數是UID和GID,接著的一項是系統管理員想寫入的有關該用戶的任何訊息,最後兩項是兩個路徑名:一個是分配給用戶的Home目錄,第二個是用戶登入後將執行的shell(若為空格則預設為/bin/sh)。例如,在密碼文件中,它的Root用戶的 列項為:
root : xyDfccTrt180x,M.y8 : 0 : 0 : admin : / : /bin/sh
則,它的含義如表1.2所顯示。

表1.2 /etc/passwd文件中各個域的含義
域 含義

Root 瞼峇嶆W
XyDfccTrt180x,M.y8 加密的密碼
0 用戶ID(UID)
0 用戶的組ID(GID)
Admin 用戶的全名
/ 用戶的主目錄
/bin/sh 用戶的Shell


  在目前的多數Unix系統中,密碼文件都做了Shadow變換,即把/etc/passwd文件中的密碼域分離出來,單獨存在/etc/shadow文件中,並加強對shadow的保護,以增強密碼安全。因而,在破解時,需要做UnShadow變換,將/etc/passwd與/etc/shadow文件合二為一。

1.1.1 密碼加密的機理
  Unix系統使用一個單向函數crypt(),來加密用戶的密碼。單向函數crypt()從數學原理上保證了從加密的密文得到加密前的明文是不可能的或是非常困難的。當用戶登入時,系統並不是去解密已加密的密碼,而是將輸入的密碼明文字元串傳給加密函數,將加密函數的輸出與/etc/passwd文件中該用戶 列項的PASSWORD域進行比較,若匹配成功,則允許用戶登入系統。

  Crypt()的加密算法關於資料加密標準DES,它將用戶輸入的密碼作為密鑰,加密一個64bit的0/1串,加密的結果又使用用戶的密碼再次加密;重複該程序,一共進行25次。最後的輸出為一個11byte的字元串,存放在/etc/passwd的PASSWORD域。

  Morris和Thompson修改了crypt()函數的實現。現在Unix系統中使用的加密函數原型如下:
Char *crypt(char *salt, char *passwd)

  Salt是一個12位長的數位,取值範圍為0到4095。它略改變了DES的輸出,4096個不同的salt值使同一個密碼產生不同的輸出。當改變密碼時,系統選項當天的一個時間,得到一個salt數值。該salt被存放在加密密碼的最前面。因此,passwd文件存放的密文密碼是13位。一些Unix系統,例如:HP-UX,Ultrix和BSD4.4,使用了16位或更長的salt值,這種算法稱為bigcrypt()或crypt16()。
1.1.2 密碼時效
  /etc/passwd文件的格式使系統管理員能要求用戶定期地改變他們的密碼。在密碼文件中可以看到,有些加密後的密碼有逗號,逗號後有幾個字元和一個冒號。如:root : xyDfccTrt180x,M.y8 : 0 : 0 : admin : / : /bin/sh
ruan : pomJk109Jky41,.1 : 0 : 0 : admin : / : /bin/sh dcs : xmotTVoyumjls : 0: 0 : admin : / : /bin/sh

  可以看到,yjb的密碼逗號後有4個字元,ruan有2個,dcs沒有逗號。逗號後第一個字元是密碼有效期的最大周數,第二個字元決定了用戶再次修改密碼之前,原密碼應使用的最小周數(防止用戶修改新密碼後立刻又改回成老密碼)。其餘字元表明密碼最新修改時間。要能讀懂密碼中逗號後的訊息,必須首先知道如何用passwd_esc計數,計數的方法是: . = 0,/ = 1,0-9 = 2-11,A-Z = 12-37,a-z= 38-63。

  系統管理員必須將前兩個字元放進 /etc/passwd文件,以要求用戶定期的修改密碼,另外兩個字元當用戶修改密碼時,由passwd指令填入。若想讓用戶修改密碼,可在最後一次密碼被修改時,放兩個".",則下一次用戶登入時將被要求修改自己的密碼。

有兩種特殊情況:

1. 最大周數(第一個字元)小於最小周數(第二個字元),則不允許用戶修改密碼,僅超級用戶可以修改用戶的密碼。
2. 第一個字元和第二個字元都是".",這時用戶下次登入時被要求修改密碼,修改密碼後,passwd指令將"."移除,此後再不會要求用戶修改密碼。

1.1.3 UID和GID
  /etc/passwd中UID訊息很重要,系統使用UID而不是登入名區別用戶。一般來說,用戶的UID應當是獨一無二的,其它用戶不應當有相同的UID數值。根據慣例,從0到99的UID保留用作系統用戶的UID(root,bin,uucp等)。如果在/etc/passwd文件中有兩個不同的入口項有相同的UID,則這兩個用戶對相互的文件具有相同的存取權限。

  /etc/group文件含有關於用戶組的訊息,/etc/passwd中的每個GID在本文件中應當有相應的入口項,入口項中列出了組名和組中的用戶。這樣可方便地瞭解每個組的用戶,否則必鬚根據GID在/etc/passwd文件中從頭至尾地尋找同組用戶。

  /etc/group文件對組的許可權限的控制並不是必要的,因為系統用UID,GID(取自/etc/passwd)決定文件存取權限,即使/etc/group文件不存在於系統中,具有相同的GID用戶也可以組的存取許可權限共享文件。

  用戶組與登入用戶一樣可以擁有密碼。如果/etc/group文件入口項的第二個域為非空,則將被認為是加密密碼,newgrp指令將要求用戶指出密碼,然後將密碼加密,再與該域的加密密碼比較。

  給組建立密碼一般不是個好作法。第一,如果組內共享文件,若有某人猜著組密碼,則該群組的所有用戶的文件就可能洩漏;其次,管理組密碼很費事,因為對於組沒有類似的passwd指令。可用/usr/lib/makekey產生一個密碼寫入/etc/group。

以下情況必須建立新組:

1. 可能要增加新用戶,該用戶不屬於任何一個現有的組。
2. 有的用戶可能時常需要獨自為一個組。
3. 有的用戶可能有一個SGID程序,需要獨自為一個組。
4. 有時可能要安裝執行SGID的軟體系統,該軟體系統需要建立一個新組。

  要增加一個新組,必須編輯該檔案,為新組加一個入口項。 由於用戶登入時,系統從/etc/passwd文件中取GID,而不是從/etc/group中取GID,所以group文件和密碼文件應當具有一致性。對於一個用戶的組,UID和GID應當是相同的。多用戶組的GID應當不同於任何用戶的UID,一般為5位數,這樣在檢視/etc/passwd文件時,就可根據5位資料的GID識別多用戶組,這將減少增加新組、新用戶時可能產生的混淆。

1.2 構造一個Crack程序
  在密碼的設定程序中,有許多個人因素在起作用,可以利用這些因素來說明 解密。由於密碼安全性的考慮,禁止把密碼寫在紙上,因此很多人都設法使自己的密碼容易記憶,這就給黑客提供了可乘之機。

  貝爾實驗室的電腦安全專家R.Morris和K.Thompson提出了這樣一種攻擊的可能性:可以根據用戶的訊息建立一個他可能使用的密碼的字典,比如:個人的姓名、生日或姓名,街道的號碼等。然後,每次取出一個 列項經過crypt()函數變換,並與密碼文件的密文密碼匹配,若一致,密碼就被破解了。一般說來,這種攻擊原則是很有效的。

1.2.1 蠻力攻擊與字典攻擊
  構造一個Crack程序,有兩種方法可選項,一種是使用蠻力攻擊,另一種是字典攻擊。下面,分別估算一下它們的效率。
  Unix一共是 [0x00∼0xff] 共128個字元,小於0x20 的都是控制符,不能輸入為 密碼, 0x7f 為轉義符, 不能輸入。 那麼總共128- 32 - 1 = 95 個字元可作為密碼的字元。 即10(數位)+33(標點符號)+26*2(大小寫字母) = 95個。

  首先估算蠻力攻擊的嘗試次數。很顯然,該值為m的n次冪。其中,基數m為可能使用的字元集的大小;冪次n為密碼的長度。分下面幾種情形討論:

僅使用字母的組合序列,則m = 26*2 = 52。
使用字母數位的組合序列,則m = 52 + 10 = 62。
使用字母數位以及特殊字元的組合序列,則m = 95

表1.3列舉幾個例子,計算所需的嘗試次數K,對其數值大小得到一個較確切的印象。

表1.3 不同字元集與長度的密碼嘗試次數
M N K 52
5 38,0204,032

52 6 19,770,609,664

52 7 1,028,071,702,528

62 5 916,132,832

62 6 56,800,235,584

62 7 3,521,614,606,208

95 5 7,737,809,375

95 6 735,091,890,625

95 7 69,833,729,609,375

  從該表中可以看出,隨著字元集的擴大與密碼長度的增大,所需的嘗試次數明顯增加。選項盡量大的字元集和較長的密碼,能獲得較高的密碼安全。

  但如果灌水限制母是一個常用漢字的拼音或英文單詞,估算一下設常用詞10000條, 從10000個常用詞中取一個詞與任意一個數位字元組合成密碼,即:10000* 10 = 100000 (10萬種可能性)。因此,借助於資料字典的說明 ,可以使Crack的效率大大提高。

1.2.2 資料字典
  目前,在英特網上,有一些資料字典可以下載,包含的 列項從1萬到幾十萬條。資料字典一般囊括了常用的單詞。

  也許有人認為:我的密碼毫無規律可言,字典中不會有,因此,電腦是破譯不了的,那就大錯特錯了。有很多專門產生字典的程序,比如:Dictmake、txt2dict等等。以dictmake為例:啟動程序後,電腦會要求輸入最小密碼長度、最大密碼長度、密碼包含的小寫字元、大寫字元、數位、有沒有空格、含不含標點符號和特殊字元等一系列的問題。當回答完了電腦提出的問題後,電腦就會按照給定的條件自動將所有的組合方式列出來並存到文件中,而這個文件就是資料字典。

1.2.3 讀寫密碼文件的一組子程序
  為了對/etc/passwd文件進行方便的存取,我編寫了一組訪問/etc/passwd文件的子程序。可讀取文件的用戶 列項入口項或寫入新的用戶 列項等。這組子程序可用於編寫Crack程序。


  Getpwuid()函數即可從/etc/passwd文件中獲取指定的UID的用戶 列項。Getpwnam()函數則對於指定的登入名,在/etc/passwd文件檢索用戶 列項。getpwent(),setpwent(),endpwent()等函數則可對密碼文件作後續處理。

  Getpwuid()與Getpwnam()返回一指向passwd結構的游標,該結構定義如下:

struct passwd {
char * pcr_name; /* 登入名 */
char * pcr_passwd; /* 加密後的密碼 */
uid_t pcr_uid; /* UID */
gid_t pcr_gid; /* GID */
char * pcr_age; /* 代理訊息 */
char * pcr_comment; /* 註釋 */
char * pcr_gecos;
char * pcr_dir; /* 主目錄 */
char * pcr_shell; /* 使用的shell */
char * pcr_shell; /* 使用的shell */

首次使用getpwent(),可開啟/etc/passwd文件並返回指向文件中第一個用戶 列項的游標,並保持使用之間文件的開啟狀態,再使用getpwent()便可順序地返回密碼文件中的各用戶 列項。而使用setpwent() 又可把密碼文件的游標重新置為文件的開始處,最後使用完密碼文件後使用endpwent() 可關閉密碼文件。

1.2.4 構造Crack程序
  綜上所述,構造一個Crack工具只需以下步驟:

1.4 密碼安全的建議
  每個人都應該重視保護自己帳戶的密碼,降低被他人截取的可能性,從而保護個人的資料資料以及系統的安全。保護密碼安全的要點如下:

不要將密碼寫下來。
不要將密碼存於電腦文件中。
密碼要容易記住。
不要用字典中有的詞作為自己的密碼。
不要用諸如自己的生日、電話號碼、尋呼機號碼、純數位或純字母做密碼。
密碼應包含特殊字元。
密碼應該在允許的範圍內盡可能取長一點。
不要在不同系統上使用同一密碼。
為防止眼明手快的人竊取密碼,在輸入密碼時應驗證沒有人偷窺。
定期改變密碼,至少6個月要改變一次。

  最後這點是十分重要的,永遠不要對自己的密碼過於自信,也許就在無意當中洩露了密碼。定期地改變密碼,會使自己遭受hacker攻擊的風險降到一定限度之內。一旦發現自己的密碼不能進入電腦系統,應立即向系統管理員報告,由管理員來檢查原因。

  以上分析的是傳統的保障密碼安全的方法。當前,也出現了一些新型的密碼安全機制,例如:動態密碼和利用使用者的生物唯一識別資料作為密碼驗證。

  動態密碼是週期性的改變密碼,以減少密碼被破解的機會、增強密碼安全的機制,動態密碼卡是一種最一般的套用。在密碼卡和伺服器中都儲存於同一密碼種子(Seed)。驗證密碼時,密碼卡取出當前時間與密碼種子,經過單向函數的變換,計算出一個密碼,伺服器也採用同樣的方法得到一個密碼,比較這兩個密碼,得到驗證。動態密碼卡與伺服器之間的時間同步是確保準確驗證的前提。目前,一些安全方面的著名公司,如:RSA、HP等推出了動態密碼卡產品。本實驗室也研製成功了動態密碼卡(DID卡),並廣泛運用於銀行、軍隊和政府部門。

  利用使用者的生物唯一識別資料作為密碼驗證,這一先進的安全認證機制正在積極的研究與完善中,將逐漸套用於多種場合。可以利用的識別資料包括指紋、視網膜等,這些特徵訊息是個人唯一的,抽取這些特徵,可以用於個人的身份驗證。抽取的識別資料資料量過多,存在儲存於預先配置大、傳輸效率低等缺陷;資料量過少,又可能出現誤判。因而如何準確的抽取識別資料,是現用的一個研究熱點。
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1625 篇, 收花: 3196 次
 


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 05:55 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2019, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1