用GetHashes軟件獲取Windows系統Hash密碼值

一、Hash基本知識

1.Hash定義

Hash,一般翻譯爲“散列”,也有直接音譯爲“哈希”的,就是把任意長度的輸入(又叫做預映射,pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。

2.Hash的應用

HASH主要用於信息安全領域中加密算法,它把一些不同長度的信息轉化成雜亂的128位的編碼裏,叫做HASH值。也可以說,Hash就是找到一種數據內容和數據存放地址之間的映射關係。

3.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密碼值

1. Windows系統下的hash密碼格式

Windows系統下的hash密碼格式爲:用戶名稱:RID:LM-HASH值:NT-HASH值,例如:

Administrator:500:C8825DB10F2590EAAAD3B435B51404EE:683020925C5D8569C23AA724774CE6CC:::表示
用戶名稱爲:Administrator
RID爲:500
LM-HASH值爲:C8825DB10F2590EAAAD3B435B51404EE
NT-HASH值爲:683020925C5D8569C23AA724774CE6CC

2.Windows下LM Hash值生成原理

假設明文口令是“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

3. Windows下NTLM Hash生成原理

從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獲取Windows系統的Hash密碼值

GetHashes目前最高版本是v1.4,它是InsidePro公司早期的一款Hash密碼獲取軟件,其公司地址爲:http://www.InsidePro.com,該公司還有“SAMInside”、“PasswordsPro”以及“Extreme GPU Bruteforcer”三款密碼破解軟件。

1.GetHashes命令使用格式

GetHashes [System key file] Or  GetHashes $Local

一般使用“GetHashes $Local”來獲取系統的Hash密碼值,該命令僅在system權限下才能執行成功。一般根據個人愛好,可以將“GetHashes.exe”工具軟件命名爲其它名稱,例如在後面案例中,就將其命名爲“getpw”。

2.使用GetHashes獲取系統Hash值實例

將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密碼值在線查詢

在網站http://hash.insidepro.com/中還可以在線查詢Hash密碼值的原始明文口令,如圖4所示,將獲取的MD5加密後的Hash值輸入後,單擊“Search”按鈕,如果數據庫中存在則會在下面給出查詢結果。

 
圖4在線破解Hash密碼值

2.使用GetHashes獲取系統Hash值技巧

使用GetHashes來獲取系統的Hash值一般是在獲得了系統的部分或者全部控制權限,通常是在新漏洞利用工具出來後,例如Ms08067漏洞利用工具,當存在Ms0867漏洞時,通過使用Ms08067漏洞利用工具獲得存在漏洞計算機的一個反彈Shell,然後再將“GetHashes”軟件上傳到系統中來執行“GetHashes $Local”命令。對GetHashes工具的使用,筆者將一些經驗技巧進行總結。

(一)在獲得反彈Shell的情況下,首先查看系統是否存在殺毒軟件;如果存在,則嘗試是否可以關閉,如果不能關閉,則放棄使用GetHashes來獲取Hash密碼值,轉向第二步。

(二)查看系統是什麼系統,是否開啓3389遠程終端,如果未開啓3389終端,可否直接開啓3389終端。如果可以利用3389終端,則直接添加一個具有管理員權限的用戶,然後使用用戶登錄到系統。

(三)關閉殺毒軟件,再次通過shell或者其他控制軟件的telnet來執行“GetHashes $Local”命令來獲取Hash密碼值,然後刪除新添加到用戶。

安天365團隊(http://www.antian365.com)歡迎社會各界朋友提供安全事件線索,將免費爲提供線索的朋友進行安全檢測。

附錄1 str_to_key()函數

str_to_key()函數,的C語言描述程序:
#include
#include
#include
/*
* 讀取形如"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 );
}
return;
}  /* end of str_to_key */

int main ( int argc, char * argv[] )
{
unsigned int  i;
unsigned char buf_0[21];
unsigned char buf_1[24];

if ( argc != 2 )
{
fprintf( stderr, "Usage: %s \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] );
}
fprintf( stderr, "\n" );
return( EXIT_SUCCESS );
}  /* end of main */

附錄2 相關免費資源

(1)在線Hash密碼值破解:http://hash.insidepro.com/
(2)在線生成Hash密碼值:http://www.insidepro.com/hashes.php?lang=eng
(3)免費字典下載:http://www.insidepro.com/eng/download.shtml
(4)SAMInside  http://www.insidepro.com/download/saminside.zip
(5)PasswordsPro  http://www.insidepro.com/download/passwordspro.zip
(6)Extreme GPU Bruteforcer  http://www.insidepro.com/download/egb.zip
(7)Gethashes工具 
http://www.antian365.com/bbs/attachment.php?aid=464&k=2f319ed67b141d944d8b0c9514df17b7&t=1228015436

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