Hash Cracking
Hash cracking คือการกู้ข้อความต้นฉบับ (มักเป็นรหัสผ่าน) จากค่า hash โดยลองเดาแล้ว hash เทียบ — ไม่ใช่การ 'ถอด' hash (hash เป็น one-way) บทนี้ครอบคลุมการระบุชนิด hash, เลือก attack mode, และ workflow ของ hashcat/john สำหรับ CTF
1. หลักการ — hash ถอดไม่ได้ แต่เดาได้
hash เป็นฟังก์ชันทางเดียว (one-way): จาก input ออก digest ขนาดคงที่ แต่ย้อนกลับไม่ได้ การ 'crack' จึงไม่ใช่การถอด แต่เป็นการ เดา candidate แล้ว hash เทียบ ว่าตรงกับเป้าหมายไหม ดังนั้นรหัสที่อ่อน/สั้น/อยู่ใน wordlist ถึงจะ crack ได้ ส่วนรหัสสุ่มยาวๆ แทบเป็นไปไม่ได้
2. ระบุชนิด hash ก่อนเสมอ
เลือก attack ผิดถ้าระบุชนิดผิด ดูจากความยาวและรูปแบบ: MD5 = 32 hex, SHA-1 = 40 hex, SHA-256 = 64 hex, bcrypt ขึ้นต้น $2a$/$2b$, sha512crypt ขึ้นต้น $6$, NTLM = 32 hex (แต่ context ต่าง)
hashid '5f4dcc3b5aa765d61d8327deb882cf99'
hash-identifier # โต้ตอบ
# หรือใช้ hashcat ช่วยเดา mode:
hashcat --identify hash.txt3. Attack modes
| โหมด | ใช้เมื่อ | ตัวอย่าง |
|---|---|---|
| Dictionary | รหัสน่าจะเป็นคำ/รหัสที่รู้จัก | ลอง wordlist เช่น rockyou.txt |
| Rule-based | wordlist + แปลงรูป (l33t, เติมเลข) | รหัสที่ดัดแปลงเล็กน้อย |
| Mask / Brute | รู้รูปแบบ (เช่น 8 ตัวพิมพ์เล็ก+เลข) | ?l?l?l?l?d?d?d?d |
| Hybrid | wordlist + mask ต่อท้าย | password ตามด้วย 4 หลัก |
4. Hashcat workflow
# -m = mode (0=MD5, 100=SHA1, 1400=SHA256, 1800=sha512crypt, 3200=bcrypt)
# -a 0 = dictionary attack
hashcat -m 0 -a 0 hash.txt rockyou.txt
# ดูผลที่ crack ได้
hashcat -m 0 hash.txt --show# wordlist + rules (เพิ่มโอกาสเจอ)
hashcat -m 0 -a 0 hash.txt rockyou.txt -r rules/best64.rule
# mask: 8 ตัว = ตัวพิมพ์เล็ก 4 + เลข 4
hashcat -m 0 -a 3 hash.txt ?l?l?l?l?d?d?d?d5. John the Ripper workflow
# crack ตรงๆ ด้วย wordlist
john --wordlist=rockyou.txt hash.txt
john --show hash.txt
# John มี *2john ช่วยดึง hash จากไฟล์
zip2john secret.zip > zip.hash
ssh2john id_rsa > rsa.hash
john --wordlist=rockyou.txt zip.hash6. การติดตั้ง
sudo apt install hashcat john hashid
# wordlist rockyou (มากับ Kali ที่ /usr/share/wordlists/)
# ถ้าไม่มี: ดาวน์โหลดจาก repo SecLists7. Quick Reference
- hash = one-way; crack = เดาแล้ว hash เทียบ
- ระบุชนิดก่อนเสมอ: hashid / hashcat --identify
- MD5=32, SHA1=40, SHA256=64 hex; bcrypt=$2…, sha512crypt=$6…
- เริ่มด้วย dictionary (rockyou) → rules → mask
- hashcat -m <mode> -a 0 hash.txt rockyou.txt
- ไฟล์ล็อกรหัส → *2john (zip2john/ssh2john) แล้ว crack
- bcrypt/argon2 ช้ามาก — อย่าคาด brute ยาวๆ
🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ
สมมติเจอค่าประหลาดๆ ในโจทย์ที่ดูเหมือน hash (เช่น สาย hex ยาวๆ) มีแค่เครื่อง Kali เปล่าๆ ทำตามนี้ทีละขั้น
- 1คัดลอก hash ให้เป๊ะ (ระวังช่องว่าง/newline ติดมา) แล้วเช็คความยาว: `echo -n "hash" | wc -c` — 32=MD5, 40=SHA1, 64=SHA256
- 2รัน `hashid 'hash_value'` หรือ `hash-identifier` เพื่อเดาชนิด hash ให้แน่ใจก่อนเสมอ
- 3ทางลัดที่เร็วสุด: วาง hash ที่ https://crackstation.net หรือ https://hashes.com/en/decrypt/hash — ถ้ามีคน crack ไว้แล้วในฐานข้อมูลจะเจอทันทีไม่ต้องรอ
- 4ยังไม่เจอ → ยืนยันชนิด hash อีกครั้ง (prefix เช่น `$2a$`=bcrypt, `$6$`=sha512crypt) แล้วหา hashcat mode (-m) ที่ตรง ด้วย `hashcat --identify hash.txt`
- 5รัน dictionary attack ด้วย rockyou.txt ก่อนเสมอ (มีมากับ Kali ที่ `/usr/share/wordlists/rockyou.txt.gz` ต้อง `gunzip` ก่อนใช้): `hashcat -m
-a 0 hash.txt rockyou.txt` - 6ไม่เจอ → เพิ่ม rules เผื่อรหัสถูกดัดแปลงเล็กน้อย: `hashcat -m
-a 0 hash.txt rockyou.txt -r /usr/share/hashcat/rules/best64.rule` - 7ยังไม่เจอ แต่รู้ pattern คร่าวๆ (เช่น 8 ตัว ตัวพิมพ์เล็ก+เลข) → mask attack: `hashcat -m
-a 3 hash.txt ?l?l?l?l?d?d?d?d` - 8hash มาจากไฟล์ที่ล็อกรหัส (zip/rar/pdf/ssh key) ไม่ใช่ hash ตรงๆ → แปลงก่อนด้วย *2john: `zip2john file.zip > hash.txt` แล้วค่อย `john --wordlist=rockyou.txt hash.txt`
- 9เจอว่าเป็น bcrypt/argon2/scrypt (ช้ามาก) → อย่าคาด brute ยาว ลองจำกัด wordlist ให้แคบลง หรือหา hint อื่นในโจทย์ (ความยาว/pattern ของรหัสที่คาดไว้)
- 10crack ได้ plaintext แล้ว → เอาไปใช้ต่อ (login, ถอดไฟล์อื่น) หรือใส่เป็น flag ตรงๆ ตาม format ที่โจทย์ต้องการ
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| ระบุชนิด hash | hashid, hash-identifier | - | - |
| ค้นหา plaintext ที่มีคน crack ไว้แล้ว | - | - | crackstation.net, hashes.com |
| dictionary attack | hashcat, john | - | - |
| rule-based attack | hashcat -r | - | - |
| mask/brute attack | hashcat -a 3 | - | - |
| แปลงไฟล์ล็อกรหัสเป็น hash ก่อน crack | zip2john, ssh2john, pdf2john (john suite) | sudo apt install john | - |
| wordlist เฉพาะทางเพิ่มเติม | - | git clone SecLists | - |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้