สวัสดีครับ วันนี้เราจะมาพูดกันถึงเรื่อง “Cracking Password” กันนน ซึ่งโดยปกติแล้วรหัสผ่านที่เราใช้เพื่อเข้าสู่ระบบใด ๆ จะเป็นตัวอักษรหรือข้อความที่สามารถอ่านเข้าใจได้ชัดเจน และถ้าระบบยังคงเก็บข้อมูลรหัสผ่านด้วยรูปแบบเดิมซึ่งอ่านและเข้าใจได้ง่าย ย่อมจะขาดความปลอดภัยอย่างแน่นอน ดังนั้นระบบจึงต้องมีการเข้ารหัสข้อมูลเพื่อเพิ่มความปลอดภัยให้มากขึ้น
ในโลกความเป็นจริง ไม่ได้มีเพียงแค่รหัสผ่าน (Password) เท่านั้นที่ถูกเข้ารหัส แต่ยังมีข้อมูลชนิดอื่น ๆ อีกหลายชนิดและหลายรูปแบบที่ถูกนำมาเข้ารหัสเพื่อเพิ่มความปลอดภัย แต่ในบทความนี้ขอนำเสนอและเน้นไปที่ “รหัสผ่าน” นะครับ
มาเริ่มต้นกันด้วยรูปแบบการเข้ารหัสข้อมูล
Encrypt vs Hashing
การทำ Encrypt หรือ Hashing นั้น มีจุดประสงค์ที่เหมือนกัน นั่นคือ เป็นการเข้ารหัสข้อมูลแต่จะมีความต่างกันบางส่วน ดังนี้
Encrypt: เป็นการเข้ารหัสโดยที่ข้อมูลต้นฉบับจะเรียกว่า “Plaintext” และเมื่อถูกเข้ารหัสจะเรียกว่า “Ciphertext” และข้อมูลที่ถูกการ “Encrypt” จะสามารถกระทำการย้อนกลับเพื่อให้ได้ข้อมูลเดิม หรือ “Decrypt” ได้
มี 2 รูปแบบคือ
1. Symmetric Encryption
2. Asymmetric Encryption
Hashing: เป็นการเข้ารหัสเหมือนกันแต่จะต่างตรงที่ “เป็นการแปลงข้อมูลทางเดียว (One-way Process)” หรือคือไม่สามารถดำเนินการย้อนกลับเพื่อให้ได้ข้อมูลแบบเดิม (Plaintext)ได้ การทำ Hashing มีหลายรูปแบบ เช่น MD5, SHA-512, Blowfish, NTLM เป็นต้น ซึ่งกระบวนการทำ Hashing จะถูกนำมาใช้ในการเข้ารหัสข้อมูลประเภท “รหัสผ่าน” และแม้จะไม่สามารถดำเนินการย้อนกลับ แต่ข้อมูลที่ถูกเข้ารหัสด้วยวิธีการ “Hashing” ด้วยอัลกอริทึ่มเดิม จะมีลักษณะข้อมูลเหมือนเดิมเสมอไม่ว่าจะดำเนินการกี่ครั้งก็ตาม เช่น ข้อมูลที่มีเนื้อหาเป็น “password” ถูกเข้ารหัสด้วย MD5 จะได้ผลลัพธ์เป็ “5f4dcc3b5aa765d61d8327deb882cf99” เสมอ
Identifying Hash
ก่อนที่เราจะเริ่มทำการถอดรหัส Hash นั้นควรจำที่จะต้องรู้อัลกอริทึ่มที่ทำ Hashing นั้นก่อน ซึ่งมีหลายรูปแบบ และมีความเฉพาะ เช่น Hash ที่มีความยาว 32 ตัว มักจะเป็นประเภท MD5 หรือ NTLM และการที่เราระบุประเภทของรูปแบบ Hash ก่อนดำเนินการโจมตีจะช่วยให้มีโอกาสที่จะแคร๊ก Hash ได้สำเร็จมากกว่านั่นเอง
ตัวอย่างเครื่องมือที่จะช่วยให้เราระบุประเภทของ Hash ได้แก่
Hashid
“hashid” เป็นเครื่องมือที่ช่วยในการระบุประเภทของ Hash สามารถใช้ใน “Kali Linux” ได้เลย
หรือสามารถดาวน์โหลดได้จาก https://github.com/psypanda/hashID
Hash-Identifier
“hash-identifier” เป็นอีกหนึ่งเครื่องมือที่ช่วยให้สามารถระบุประเภทของ Hash และใช้ใน “Kali Linux” ได้
หรือสามารถดาวน์โหลดได้จาก https://github.com/blackploit/hash-identifier
และยังมีเครื่องมือที่ช่วยในการระบุประเภท Hash ที่สะดวกในการใช้งานอีกมากมาย เช่น ตรวจสอบจากเว็บไซต์ https://www.tunnelsup.com/hash-analyzer/ หรือ https://hashes.com/en/tools/hash_identifier
ซึ่งจากผลลัพธ์ที่ได้ อาจจะไม่สามารถระบุอย่างแม่นยำว่าใช้กระบวนการชนิดใด แต่จะช่วยในการจำกัดขอบเขตประเภทของ “Hash” ได้
Password Cracking Tools
และก็มาถึงส่วนสำคัญ นั่นคือ การ “Cracking Password” ซึ่งมีเครื่องมือหลายชนิด ที่จะมาช่วยในการโจมตี เช่น John the Ripper, Hashcat เป็นต้น ซึ่งในบทความนี้ขอเน้นไปที่การใช้ “Hashcat”
Hashcat เป็นเครื่องมือที่ใช้ในการ “Cracking Hash” ที่ได้รับความนิยมและถูกติดตั้งมาใน “Kali Linux” อยู่แล้ว หรือสามารถดาวน์โหลดได้จาก https://github.com/hashcat/hashcat
Hashcat Attack Type
Hashcat มีรูปแบในการโจมตีทั้งหมด 6 โหมด ซึ่งการใช้งานก็ขึ้นอยู่กับประเภทของ Hash และความซับซ้อนของรหัสผ่าน
1. Dictionary Attack หรือ Straight Mode
คือการโจมตีในรูปแบบเรียบง่ายและตรงไปตรงมา โดยใช้เทคนิคการเดารหัสผ่าน(Password) จากคลังคำศัพท์(Wordlist) ซึ่งแหล่งคำศัพท์ที่ได้รับความนิยมคือ “Seclist” สามารถดาวน์โหลดได้จาก https://github.com/danielmiessler/SecLists/tree/master และ “rockyou” สามารถดาวน์โหลดได้จาก https://github.com/praetorian-inc/Hob0Rules/blob/master/wordlists/rockyou.txt.gz
Syntax
kali $ hashcat -a 0 -m <hash type> <hash file> <wordlist>
-a คือ เลือกโหมดในการโจมตี (Straight คือ 0)
-m คือ เลือกประเภทของ Hash
example
จากรูป: ทำการเข้ารหัส “P@ssw0rd” ด้วยรูปแบบ md5 ได้ผลลัพธ์เป็น “161ebd7d45089b3446ee4e0d86dbcf92”
และทำการแคร๊กด้วยเครื่องมือ “Hashcat” ในโหมด Straight (-a 0) และรูปแบบ md5 (-m 0) จะได้ผลลัพธ์กลับมาเป็น “P@ssw0rd” ดังเดิม
2. Combination Attack หรือ Combination mode
เป็นการโจมตีที่มีรูปแบบคล้ายกับ Dictionary Attack แต่จะเป็นการรวมคลังคำศัพท์จาก 2 แหล่งมาสร้างเป็นคำศัพท์ชุดใหม่
Syntax
kali $ hashcat -a 1 -m <hash type> <hash file> <wordlist1> <wordlist2>
example
มีคลังคำศัพท์ 2 ชุดคือ
list1.txt
sun
moon
silver
golden
P@ssw0rd
list2.txt
hello
hi
secret
123456789
จากรูป: ทำการเข้ารหัส “P@ssw0rd123456789” ด้วยรูปแบบ md5 ได้ผลลัพท์เป็น “ac0ab808011156da556615370a68a0d7”
ดำเนินการถอดรหัสด้วยเครื่องมือ “Hashcat” ในโหมด Combination (-a 1) รูปแบบ md5 (-m 0) และใช้คลังคำศัพท์จาก list1.txt กับ list2.txt จะได้ผลลัพท์กลับมาเป็น “P@ssw0rd123456789” ดังเดิม
3. Brute-force หรือ Mask Attack
เป็นการโจมตีที่คล้ายกับการทำ Brute-force ที่จะทำการสุ่มรหัสไปเรื่อย ๆ แต่ต่างกันตรงที่ สามารถระบุประเภทของตัวหนังสือ (Character) ที่จะทำการ Brute-forceในแต่ละตำแหน่งได้ เช่น หากทราบว่ารหัสผ่านเป็น password123
เราสามารถกำหนดให้ทำการ Brute-force ตำแหน่งที่ 1–8 เป็นเฉพาะตัวหนังสือ a-z เท่านั้นและตำแหน่งที่ 9–11 เป็นตัวเลข ซึ่งการระบุประเภทของตัวหนังสือจะช่วยประหยัดเวลากว่าวิธีการโจมตีที่สุ่มทุกตำแหน่งโดยไม่กำหนดลักษณะของตัวหนังสือ
ซึ่งการโจมตีในโหมดนี้ควรจำเป็นที่จะต้องรู้รูปแบบของข้อมูลก่อนว่าตำแหน่งใดเป็นตัวหนังสือ ตัวพิเศษ หรือตัวเลข เพราะหากกำหนดไม่ถูกต้อง ก็จะไม่สามรถถอดรหัสได้เช่นกัน
วิธีการกำหนดรูปแบบ
?l = a — z
?u = A — Z
?d = 0–9
?h = 0–9abcdef
?H = 0–9ABCDEF
?s = อักขระพิเศษ
?a = ?l?u?d?s
?b = 0x00–0xff
Syntax
kali $ hashcat -a 3 -m <hash type> <hash file> ‘<word><charsets>’
example
จากรูป: ทำการเข้ารหัส “password@TEST123” ด้วยรูปแบบ md5 ได้ผลลัพธ์เป็น “d84d4360eaf415419d4db7ba0e46208d”
ดำเนินการถอดรหัสด้วยเครื่องมือ “Hashcat” ในโหมด Mask (-a 3) รูปแบบ md5 (-m 0) และใช้คำสั่ง
kali $ hashcat -a 3 -m 0 d84d4360eaf415419d4db7ba0e46208d ‘password?s?u?u?u?u?d?d?d’
จะได้ผลลัพธ์กลับมาเป็น “password@TEST123” ดังเดิม
4. Hybrid Mode
เป็นการรวมรูปแบบในการโจมตี เช่น ใช้ Straight Mode ร่วมกับ Mask Mode ในการโจมตี
Syntax
kali $ hashcat -a 6,7 -m <hash type> <hash file> <mode1> <mode2>
example
มีคลังคำศัพท์ list1.txt คือ
password
P@ssw0rd
p@ssword
P@ssword
จากรูป: ทำการเข้ารหัส “P@ssword123” ด้วยรูปแบบ md5 ได้ผลลัพท์เป็น “82080600934821faf0bc59cba79964bc”
ดำเนินการถอดรหัสด้วยเครื่องมือ “Hashcat” ในโหมด Mask (-a 6) รูปแบบ md5 (-m 0) และใช้คำสั่ง
hashcat -a 6 -m 0 82080600934821faf0bc59cba79964bc list1.txt ‘?d?d?d’
จะได้ผลลัพท์กลับมาเป็น “P@ssword123” ดังเดิม
และในส่วนของ mode 7 ก็มีวิธีการที่คล้ายกันดังนี้
จากรูป: ทำการเข้ารหัส “123P@ssword” ด้วยรูปแบบ md5 ได้ผลลัพธ์เป็น “4a311e712dad8244288ce67bd786e557”
ดำเนินการถอดรหัสด้วยเครื่องมือ “Hashcat” ในโหมด Mask (-a 7) รูปแบบ md5 (-m 0) และใช้คำสั่ง
hashcat -a 6 -m 0 4a311e712dad8244288ce67bd786e557 ‘?d?d?d’ list1.txt
จะได้ผลลัพท์กลับมาเป็น “123P@ssword” ดังเดิม
ซึ่ง “Hashcat” ไม่เพียงแค่ใช้กับรหัสผ่านที่ใช้ในสำหรับการเข้าสู่ระบบเท่านั้น ยังสามารถใช้ได้กับไฟล์อีกหลาย ๆ ประเภทที่ถูกตั้งรหัสผ่านหรือมีการเข้ารหัสไว้ เช่น ไฟล์ประเภท MS Office Document, Zip File, Keepass
ผู้เขียนขอยกตัวอย่างไฟล์ประเภท “Zip” ที่ถูกตั้งรหัสผ่านไว้ ทำให้ไม่สามารถ Extract ไฟล์เพื่อดูข้อมูลได้
จากรูป จะเห็นว่า เราไม่สามารถ Extract ไฟล์ “hashcat.7z” ได้เพราะถูกตั้งรหัสผ่านไว้
เทคนิคนี้ต้องใช้ร่วมกันระหว่างเครื่องมือ “Hashcat” กับ “JohnTheRipper”
ขั้นที่ 1 : เนื่องจากไฟล์ถูก Zip ด้วย 7z จึงใช้เครื่องมือ “7z2john” ในการเข้ารหัสไฟล์ “hashcat.7z” ซึ่งถูกตั้งรหัสผ่านไว้ ได้ผลลัพท์เป็น Hash “$7z$0$19$0$$8$9c7684c204c437fa0000000000000000$1098215690$112$106$7395978cad9ad8b18aef51ba2f9dcf909a1bff70d240b1c8e98dffabd352d69a1f37978e5df0179860d0fe4754721ae3cbbee1b558d93cd27e0b2959efe44a00305f982527d19584d62bcf8c23cf89e24fd19db844108e452a26d4a8343d504fc3063744d081db1492ea1cdef7a9b983” ดังภาพ
ขั้นที่ 2 : ดำเนินการถอดรหัสโดยใช้เครื่องมือ “Hashcat” ด้วยคำสั่ง
hashcat -m 11600 hash.txt /usr/share/wordlists/rockyou.txt — show
จากรูป ได้ผลลัพธ์เป็น “123456789a”
ขั้นที่ 3 : ทำการ Extract ไฟล์ด้วยรหัสผ่าน “123456789a”
สามารถเปิดไฟล์ได้สำเร็จ!!!
ซึ่งถ้าต้องการโจมตีไฟล์ประเภท
MS Office ต้องใช้ร่วมกับเครื่องมือ “Office2john”
Keepass ต้องใช้ร่วมกับเครื่องมือ “keepass2john”
PDF ต้องใช้ร่วมกับเครื่องมือ “pdf2john”
เป็นอย่างไรกันบ้างครับสำหรับบทความนี้ ซึ่งนี่ก็เป็นเพียงเนื้อหาเบื้องต้นสำหรับการโจมตีประเภท “Cracking Password” ผู้เขียนขอแอบแทรกเพิ่มเติม เนื่องจากในข้อสอบ OSCP มีการใช้เทคนิคนี้ในการ “Crack” ไฟล์ที่ถูกตั้งรหัสผ่านไว้ เพราะฉะนั้น อย่าลืมไปทดลองฝึกหรือลองเล่นกันนะครับบบ สุดท้ายก็ขอลาไปกันก่อน สวัสดีครับ ขอบคุณครับ
อ้างอิง
- https://www.geeksforgeeks.org/encryption-encoding-hashing/
- https://tbhaxor.com/cracking-passwords-using-hashcat/
- https://securityboulevard.com/2021/09/everything-about-secure-hashing-algorithm-sha/
- https://www.freecodecamp.org/news/hacking-with-hashcat-a-practical-guide/
- https://hashcat.net/wiki/
- https://github.com/hashcat/hashcat
- https://github.com/psypanda/hashID
- https://github.com/danielmiessler/SecLists/tree/master
- https://github.com/praetorian-inc/Hob0Rules/blob/master/wordlists/rockyou.txt.gz
- https://github.com/openwall/john/tree/bleeding-jumbo/src