คลัง
crypto

Hash Cracking

Hash cracking คือการกู้ข้อความต้นฉบับ (มักเป็นรหัสผ่าน) จากค่า hash โดยลองเดาแล้ว hash เทียบ — ไม่ใช่การ 'ถอด' hash (hash เป็น one-way) บทนี้ครอบคลุมการระบุชนิด hash, เลือก attack mode, และ workflow ของ hashcat/john สำหรับ CTF

BeginnerIntermediateAdvanced#hash#cracking#hashcat#john#wordlist#rainbow#crypto#ctf

1. หลักการ — hash ถอดไม่ได้ แต่เดาได้

hash เป็นฟังก์ชันทางเดียว (one-way): จาก input ออก digest ขนาดคงที่ แต่ย้อนกลับไม่ได้ การ 'crack' จึงไม่ใช่การถอด แต่เป็นการ เดา candidate แล้ว hash เทียบ ว่าตรงกับเป้าหมายไหม ดังนั้นรหัสที่อ่อน/สั้น/อยู่ใน wordlist ถึงจะ crack ได้ ส่วนรหัสสุ่มยาวๆ แทบเป็นไปไม่ได้

เร็ว/ช้าขึ้นกับ algorithm: MD5/SHA1 เร็วมาก (พันล้าน/วินาทีบน GPU) แต่ bcrypt/scrypt/argon2 ออกแบบมาให้ช้า (หลักพัน/วินาที) จงตั้งความคาดหวังตามชนิด hash

2. ระบุชนิด hash ก่อนเสมอ

เลือก attack ผิดถ้าระบุชนิดผิด ดูจากความยาวและรูปแบบ: MD5 = 32 hex, SHA-1 = 40 hex, SHA-256 = 64 hex, bcrypt ขึ้นต้น $2a$/$2b$, sha512crypt ขึ้นต้น $6$, NTLM = 32 hex (แต่ context ต่าง)

ระบุชนิด hashLinux
hashid '5f4dcc3b5aa765d61d8327deb882cf99'
hash-identifier   # โต้ตอบ
# หรือใช้ hashcat ช่วยเดา mode:
hashcat --identify hash.txt
ได้ชนิดแล้วเอาไปหา hashcat mode (-m) ที่ตรง

3. Attack modes

โหมดใช้เมื่อตัวอย่าง
Dictionaryรหัสน่าจะเป็นคำ/รหัสที่รู้จักลอง wordlist เช่น rockyou.txt
Rule-basedwordlist + แปลงรูป (l33t, เติมเลข)รหัสที่ดัดแปลงเล็กน้อย
Mask / Bruteรู้รูปแบบ (เช่น 8 ตัวพิมพ์เล็ก+เลข)?l?l?l?l?d?d?d?d
Hybridwordlist + mask ต่อท้ายpassword ตามด้วย 4 หลัก

4. Hashcat workflow

Dictionary attack (พบบ่อยสุดใน CTF)
# -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
Rule-based และ mask
# 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?d
?l=a-z ?u=A-Z ?d=0-9 ?s=สัญลักษณ์ ?a=ทั้งหมด

5. John the Ripper workflow

John — เหมาะกับไฟล์ที่ต้อง 'แปลงเป็น hash' ก่อน
# 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.hash
*2john (zip2john, rar2john, ssh2john, pdf2john) มีประโยชน์มากกับโจทย์ที่ flag อยู่ในไฟล์ล็อกรหัส

6. การติดตั้ง

ติดตั้งเครื่องมือLinux
sudo apt install hashcat john hashid
# wordlist rockyou (มากับ Kali ที่ /usr/share/wordlists/)
# ถ้าไม่มี: ดาวน์โหลดจาก repo SecLists

7. 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. 1คัดลอก hash ให้เป๊ะ (ระวังช่องว่าง/newline ติดมา) แล้วเช็คความยาว: `echo -n "hash" | wc -c` — 32=MD5, 40=SHA1, 64=SHA256
  2. 2รัน `hashid 'hash_value'` หรือ `hash-identifier` เพื่อเดาชนิด hash ให้แน่ใจก่อนเสมอ
  3. 3ทางลัดที่เร็วสุด: วาง hash ที่ https://crackstation.net หรือ https://hashes.com/en/decrypt/hash — ถ้ามีคน crack ไว้แล้วในฐานข้อมูลจะเจอทันทีไม่ต้องรอ
  4. 4ยังไม่เจอ → ยืนยันชนิด hash อีกครั้ง (prefix เช่น `$2a$`=bcrypt, `$6$`=sha512crypt) แล้วหา hashcat mode (-m) ที่ตรง ด้วย `hashcat --identify hash.txt`
  5. 5รัน dictionary attack ด้วย rockyou.txt ก่อนเสมอ (มีมากับ Kali ที่ `/usr/share/wordlists/rockyou.txt.gz` ต้อง `gunzip` ก่อนใช้): `hashcat -m -a 0 hash.txt rockyou.txt`
  6. 6ไม่เจอ → เพิ่ม rules เผื่อรหัสถูกดัดแปลงเล็กน้อย: `hashcat -m -a 0 hash.txt rockyou.txt -r /usr/share/hashcat/rules/best64.rule`
  7. 7ยังไม่เจอ แต่รู้ pattern คร่าวๆ (เช่น 8 ตัว ตัวพิมพ์เล็ก+เลข) → mask attack: `hashcat -m -a 3 hash.txt ?l?l?l?l?d?d?d?d`
  8. 8hash มาจากไฟล์ที่ล็อกรหัส (zip/rar/pdf/ssh key) ไม่ใช่ hash ตรงๆ → แปลงก่อนด้วย *2john: `zip2john file.zip > hash.txt` แล้วค่อย `john --wordlist=rockyou.txt hash.txt`
  9. 9เจอว่าเป็น bcrypt/argon2/scrypt (ช้ามาก) → อย่าคาด brute ยาว ลองจำกัด wordlist ให้แคบลง หรือหา hint อื่นในโจทย์ (ความยาว/pattern ของรหัสที่คาดไว้)
  10. 10crack ได้ plaintext แล้ว → เอาไปใช้ต่อ (login, ถอดไฟล์อื่น) หรือใส่เป็น flag ตรงๆ ตาม format ที่โจทย์ต้องการ
เจอ hash ประหลาด มีแค่ Kali — ไล่ตามนี้
hashid / hash-identifier ระบุชนิด hash
ลอง crackstation.net / hashes.com ก่อน (มี DB สำเร็จรูป)
✅ เจอ plaintext ทันที→ จบ
❌ ไม่เจอ (custom/ยากเกิน)→ crack เองด้วย hashcat/john
หา hashcat mode (-m) ที่ตรงกับชนิด hash
รัน dictionary attack ด้วย rockyou.txt
✅ crack ได้→ จบ
❌ ไม่เจอ→ เพิ่ม rules
เพิ่ม rules (-r best64.rule)
✅ crack ได้→ จบ
❌ ไม่เจอ→ ลอง mask attack
รู้ pattern คร่าวๆ ไหม (ความยาว/ชนิดตัวอักษร)?
✅ รู้→ mask attack (-a 3)
❌ ไม่รู้เลย→ เช็คว่าเป็น hash ของไฟล์ล็อกรหัสไหม
hash มาจากไฟล์ล็อกรหัส (zip/rar/pdf/ssh) ไหม?
✅ ใช่→ ใช้ *2john แปลงก่อน แล้ว crack ต่อ
❌ ไม่ใช่→ เช็คว่าเป็น bcrypt/argon2 (ช้ามาก) ไหม
เป็น bcrypt/scrypt/argon2 ไหม (ช้ามาก)?
✅ ใช่→ จำกัด wordlist แคบ / หา hint อื่นในโจทย์
❌ ไม่ใช่ (แค่ยังไม่เจอใน wordlist)→ ลอง wordlist เฉพาะทางเพิ่ม (SecLists)
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
ระบุชนิด hashhashid, hash-identifier--
ค้นหา plaintext ที่มีคน crack ไว้แล้ว--crackstation.net, hashes.com
dictionary attackhashcat, john--
rule-based attackhashcat -r--
mask/brute attackhashcat -a 3--
แปลงไฟล์ล็อกรหัสเป็น hash ก่อน crackzip2john, ssh2john, pdf2john (john suite)sudo apt install john-
wordlist เฉพาะทางเพิ่มเติม-git clone SecLists-
🚑 ถ้าตันสนิท ลองท่าถัดไป: ECB — ถ้าจริงๆ hash นี้เป็น MAC ที่ปกป้อง token เข้ารหัส ECB อยู่ (ลอง crack MAC แทนแยก key) · XOR — ถ้า hash ถูกใช้ derive keystream ต่อ (เช่น SHA256(secret) เป็น XOR key) · RSA — ถ้าโจทย์จริงๆ เน้นเรื่อง signature forgery ไม่ใช่แค่ crack hash เดี่ยวๆ · AES — ถ้า hash ที่ crack ได้ถูกเอาไป derive เป็น AES key เพื่อถอด flag ต่อ

โน้ตของฉัน

ยังไม่มีโน้ตสำหรับหัวข้อนี้