使用GetHashes軟體擷取Windows系統Hash密碼值
陳小兵
摘要 對入侵者來說,擷取Windows的密碼是整個攻擊過程至關重要的一環,擁有系統原來使用者的密碼,将使得内網滲透和守控更加容易。Windows系統中的Hash密碼值主要有LM-HASH以及NTLM-HASH值兩部分構成,一旦入侵者擷取了系統的Hash值,通過LC5以及彩虹表等破解工具可以很快的擷取系統的密碼。為此安天365團隊([url]www.antian365.com[/url])特别針對系統密碼攻擊與防範展開專題進行研究,本文主要作為其中的一個子課題,探讨如何使用Gethashes工具來擷取系統的Hash值,并對Hash值的生成原理等知識進行了介紹,最後還介紹了一些有關Hash破解方面的技巧。
Hash,一般翻譯為“散列”,也有直接音譯為“哈希”的,就是把任意長度的輸入(又叫做預映射,pre-image),通過雜湊演算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的确定輸入值。簡單的說就是一種将任意長度的消息壓縮到某一固定長度的消息摘要的函數。
HASH主要用于資訊安全領域中加密算法,它把一些不同長度的資訊轉化成雜亂的128位的編碼裡,叫做HASH值。也可以說,Hash就是找到一種資料内容和資料存放位址之間的映射關系。
MD5 和 SHA1 可以說是目前應用最廣泛的Hash算法,而它們都是以 MD4 為基礎設計的。那麼他們都是什麼意思呢?這裡簡單說一下:
(1)MD4
MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年設計的,MD是 Message Digest 的縮寫。它适用在32位字長的處理器上用高速軟體實作,它是基于 32 位操作數的位操作來實作的。
(2) MD5
MD5(RFC 1321)是 Rivest于1991年對MD4的改進版本。它仍以512位分組來輸入,其輸出是4個32位字的級聯,與MD4 相同。MD5比MD4來得複雜,并且速度較之要慢一點,但更安全,在抗分析和抗差分方面表現更好
(3)SHA1 及其他
SHA1是由NIST NSA設計為同DSA一起使用的,它對長度小于264的輸入,産生長度為160bit的散列值,是以抗窮舉(brute-force)性更好。SHA-1 設計時基于和MD4相同原理,并且模仿了該算法。
Hash算法在資訊安全方面的應用主要展現在以下的3個方面:
(1) 檔案校驗
我們比較熟悉的校驗算法有奇偶校驗和CRC校驗,這2種校驗并沒有抗資料篡改的能力,它們一定程度上能檢測并糾正資料傳輸中的信道誤碼,但卻不能防止對資料的惡意破壞。 MD5 Hash算法的“數字指紋”特性,使它成為目前應用最廣泛的一種檔案完整性校驗和(Checksum)算法,不少Unix系統有提供計算md5 checksum的指令。
(2)數字簽名
Hash 算法也是現代密碼體系中的一個重要組成部分。由于非對稱算法的運算速度較慢,是以在數字簽名協定中,單向散列函數扮演了一個重要的角色。對Hash值,又稱“數字摘要”進行數字簽名,在統計上可以認為與對檔案本身進行數字簽名是等效的。而且這樣的協定還有其他的優點。
(3)鑒權協定
鑒權協定又被稱作挑戰--認證模式:在傳輸信道是可被偵聽,但不可被篡改的情況下,這是一種簡單而安全的方法。
Windows系統下的hash密碼格式為:使用者名稱:RID:LM-HASH值:NT-HASH值,例如:
Administrator:500:C8825DB10F2590EAAAD3B435B51404EE:683020925C5D8569C23AA724774CE6CC:::表示
使用者名稱為:Administrator
RID為:500
LM-HASH值為:C8825DB10F2590EAAAD3B435B51404EE
NT-HASH值為:683020925C5D8569C23AA724774CE6CC
假設明文密碼是“Welcome”,首先全部轉換成大寫“WELCOME”,再做将密碼字元串大寫轉後後的字元串變換成二進制串:
“WELCOME” -> 57454C434F4D4500000000000000
技巧:可以将明文密碼複制到UltraEdit編輯器中使用二進制方式檢視即可擷取密碼的二進制串。
說明:如果明文密碼經過大寫變換後的二進制字元串不足14位元組,則需要在其後添加0x00補足14位元組。然後切割成兩組7位元組的資料,分别經str_to_key()函數處理得到兩組8位元組資料:
57454C434F4D45 -str_to_key()-> 56A25288347A348A
00000000000000 -str_to_key()-> 0000000000000000
這兩組8位元組資料将做為DESKEY對魔術字元串“KGS!@#$%”進行标準DES加密
"KGS!@#$%" -> 4B47532140232425
56A25288347A348A -對4B47532140232425進行标準DES加密-> C23413A8A1E7665F
0000000000000000 -對4B47532140232425進行标準DES加密-> AAD3B435B51404EE
将加密後的這兩組資料簡單拼接,就得到了最後的LM Hash
LM Hash: C23413A8A1E7665FAAD3B435B51404EE
關于str_to_key()函數見最後附錄1
從IBM設計的LM Hash算法存在幾個弱點,微軟在保持向後相容性的同時提出了自己的挑戰響應機制,NTLM Hash應運而生。假設明文密碼是“123456”,首先轉換成Unicode字元串,與LM Hash算法不同,這次不需要添加0x00補足14位元組
"123456" -> 310032003300340035003600
從ASCII串轉換成Unicode串時,使用little-endian序,微軟在設計整個SMB協定時就沒考慮過big-endian序,ntoh*()、hton*()函數不宜用在SMB封包解碼中。0x80之前的标準ASCII碼轉換成Unicode碼,就是簡單地從0x??變成0x00??。此類标準ASCII串按little-endian序轉換成Unicode串,就是簡單地在原有每個位元組之後添加0x00。對所擷取的Unicode串進行标準MD4單向哈希,無論資料源有多少位元組,MD4固定産生128-bit的哈希值,
16位元組310032003300340035003600 -進行标準MD4單向哈希-> 32ED87BDB5FDC5E9CBA88547376818D4
就得到了最後的NTLM Hash
NTLM Hash: 32ED87BDB5FDC5E9CBA88547376818D4
與LM Hash算法相比,明文密碼大小寫敏感,無法根據NTLM Hash判斷原始明文密碼是否小于8位元組,擺脫了魔術字元串"KGS!@#$%"。MD4是真正的單向哈希函數,窮舉作為資料源出現的明文,難度較大。
GetHashes <SAM registry file> [System key file] Or GetHashes $Local
一般使用 “GetHashes $Local”來擷取系統的Hash密碼值,該指令僅在system權限下才能執行成功。一般根據個人愛好,可以将“GetHashes.exe”工具軟體命名為其它名稱,例如在後面案例中,就将其命名為“getpw”。
将GetHashes重命名為getpw,然後将其複制到欲擷取hash密碼值的系統盤中,然後執行“getpw $local”,如圖1所示,順利擷取其密碼Hash值,在本案例中使用的是Radmin的Telnet,單擊“文本”-“儲存為”将結果儲存為一個新檔案,然後使用UltraEdit編輯器進行編輯,僅僅儲存Hash密碼值部分,後面可使用LC5導入Hash密碼值即可破解系統的密碼值。
圖1 擷取系統Hash值
注意:
(1)使用“GetHashes”來擷取系統的Hash密碼值,必須要在System權限下,也就是在反彈shell或者telnet下。
(2)如果系統中安裝有防毒軟體或者防火牆,有可能由于防毒軟體和防火牆的保護而導緻密碼擷取失敗。通過研究發現,由于Gethashes軟體威力巨大,主要用在入侵過程中擷取系統的Hash密碼值,是以絕大多少防毒軟體已經将GetHashes軟體加入到病毒庫中,如圖2所示,是Castlecops網站提供的關于各大防毒軟體針對GetHashes所做的病毒庫版本以及更新結果。
圖2 防毒軟體已經将Gethashes作為病毒處理
(3)InsidePro公司在其網站上還提供了一個Hash産生器,通過輸入一些參數值能夠生成經過某種加密算法處理的密碼密碼值,如圖3所示,有興趣的朋友可以去嘗試,該功能在研究系統的Hash密碼值生成中可以進行互相驗證。
圖3 Hash生成器
(4)Hash密碼值線上查詢
圖4線上破解Hash密碼值
使用GetHashes來擷取系統的Hash值一般是在獲得了系統的部分或者全部控制權限,通常是在新漏洞利用工具出來後,例如Ms08067漏洞利用工具,當存在Ms0867漏洞時,通過使用Ms08067漏洞利用工具獲得存在漏洞計算機的一個反彈Shell,然後再将“GetHashes”軟體上傳到系統中來執行“GetHashes $Local”指令。對GetHashes工具的使用,筆者将一些經驗技巧進行總結。
(一)在獲得反彈Shell的情況下,首先檢視系統是否存在防毒軟體;如果存在,則嘗試是否可以關閉,如果不能關閉,則放棄使用GetHashes來擷取Hash密碼值,轉向第二步。
(二)檢視系統是什麼系統,是否開啟3389遠端終端,如果未開啟3389終端,可否直接開啟3389終端。如果可以利用3389終端,則直接添加一個具有管理者權限的使用者,然後使用使用者登入到系統。
(三)關閉防毒軟體,再次通過shell或者其他控制軟體的telnet來執行“GetHashes $Local”指令來擷取Hash密碼值,然後删除新添加到使用者。
str_to_key()函數,的C語言描述程式:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* 讀取形如"AABBCCDDEEFF"這樣的16進制數字串,主調者自己進行形參的邊界檢查
*/
static void readhexstring ( const unsigned char *src, unsigned char *dst, unsigned int len )
{
unsigned int i;
unsigned char str[3];
str[2] = '\0';
for ( i = 0; i < len; i++ )
{
str[0] = src[ i * 2 ];
str[1] = src[ i * 2 + 1 ];
dst[i] = ( unsigned char )strtoul( str, NULL, 16 );
}
return;
} /* end of readhexstring */
* from The Samba Team's source/libsmb/smbdes.c
static void str_to_key ( const unsigned char *str, unsigned char *key )
unsigned int i;
key[0] = str[0] >> 1;
key[1] = ( ( str[0] & 0x01 ) << 6 ) | ( str[1] >> 2 );
key[2] = ( ( str[1] & 0x03 ) << 5 ) | ( str[2] >> 3 );
key[3] = ( ( str[2] & 0x07 ) << 4 ) | ( str[3] >> 4 );
key[4] = ( ( str[3] & 0x0F ) << 3 ) | ( str[4] >> 5 );
key[5] = ( ( str[4] & 0x1F ) << 2 ) | ( str[5] >> 6 );
key[6] = ( ( str[5] & 0x3F ) << 1 ) | ( str[6] >> 7 );
key[7] = str[6] & 0x7F;
for ( i = 0; i < 8; i++ )
key[i] = ( key[i] << 1 );
} /* end of str_to_key */
int main ( int argc, char * argv[] )
unsigned char buf_0[21];
unsigned char buf_1[24];
if ( argc != 2 )
fprintf( stderr, "Usage: %s <hexadecimal string>\n", argv[0] );
return( EXIT_FAILURE );
memset( buf_0, 0, sizeof( buf_0 ) );
memset( buf_1, 0, sizeof( buf_1 ) );
i = strlen( argv[1] ) / 2;
readhexstring( argv[1], buf_0, i );
for ( i = 0; i < sizeof( buf_0 ); i++ )
fprintf( stderr, "%02X", buf_0[i] );
fprintf( stderr, "\n" );
str_to_key( buf_0, buf_1 );
str_to_key( buf_0 + 7, buf_1 + 8 );
str_to_key( buf_0 + 14, buf_1 + 16 );
for ( i = 0; i < sizeof( buf_1 ); i++ )
fprintf( stderr, "%02X", buf_1[i] );
return( EXIT_SUCCESS );
} /* end of main */
(7)Gethashes工具
[url]http://www.antian365.com/bbs/attachment.php?aid=464&k=[/url]2f319ed67b141d944d8b0c9514df17b7&t=1228015436
1.[url]http://baike.baidu.com/view/604021.htm[/url]
2.[url]http://www.insidepro.com[/url]
本文轉自 simeon2005 51CTO部落格,原文連結:http://blog.51cto.com/simeon/116471